summaryrefslogtreecommitdiffabout
path: root/kmicromail/libetpan/generic/pop3driver_cached.c
Unidiff
Diffstat (limited to 'kmicromail/libetpan/generic/pop3driver_cached.c') (more/less context) (ignore whitespace changes)
-rw-r--r--kmicromail/libetpan/generic/pop3driver_cached.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/kmicromail/libetpan/generic/pop3driver_cached.c b/kmicromail/libetpan/generic/pop3driver_cached.c
index 6f97303..24f624b 100644
--- a/kmicromail/libetpan/generic/pop3driver_cached.c
+++ b/kmicromail/libetpan/generic/pop3driver_cached.c
@@ -89,93 +89,97 @@ static int pop3driver_cached_messages_number(mailsession * session,
89 uint32_t * result); 89 uint32_t * result);
90 90
91static int pop3driver_cached_recent_number(mailsession * session, 91static int pop3driver_cached_recent_number(mailsession * session,
92 char * mb, 92 char * mb,
93 uint32_t * result); 93 uint32_t * result);
94 94
95static int pop3driver_cached_unseen_number(mailsession * session, 95static int pop3driver_cached_unseen_number(mailsession * session,
96 char * mb, 96 char * mb,
97 uint32_t * result); 97 uint32_t * result);
98 98
99static int pop3driver_cached_remove_message(mailsession * session, 99static int pop3driver_cached_remove_message(mailsession * session,
100 uint32_t num); 100 uint32_t num);
101 101
102static int 102static int
103pop3driver_cached_get_messages_list(mailsession * session, 103pop3driver_cached_get_messages_list(mailsession * session,
104 struct mailmessage_list ** result); 104 struct mailmessage_list ** result);
105 105
106static int 106static int
107pop3driver_cached_get_envelopes_list(mailsession * session, 107pop3driver_cached_get_envelopes_list(mailsession * session,
108 struct mailmessage_list * env_list); 108 struct mailmessage_list * env_list);
109 109
110static int pop3driver_cached_get_message(mailsession * session, 110static int pop3driver_cached_get_message(mailsession * session,
111 uint32_t num, mailmessage ** result); 111 uint32_t num, mailmessage ** result);
112 112
113static int pop3driver_cached_get_message_by_uid(mailsession * session,
114 const char * uid, mailmessage ** result);
115
113static mailsession_driver local_pop3_cached_session_driver = { 116static mailsession_driver local_pop3_cached_session_driver = {
114 .sess_name = "pop3-cached", 117 .sess_name = "pop3-cached",
115 118
116 .sess_initialize = pop3driver_cached_initialize, 119 .sess_initialize = pop3driver_cached_initialize,
117 .sess_uninitialize = pop3driver_cached_uninitialize, 120 .sess_uninitialize = pop3driver_cached_uninitialize,
118 121
119 .sess_parameters = pop3driver_cached_parameters, 122 .sess_parameters = pop3driver_cached_parameters,
120 123
121 .sess_connect_stream = pop3driver_cached_connect_stream, 124 .sess_connect_stream = pop3driver_cached_connect_stream,
122 .sess_connect_path = NULL, 125 .sess_connect_path = NULL,
123 .sess_starttls = pop3driver_cached_starttls, 126 .sess_starttls = pop3driver_cached_starttls,
124 .sess_login = pop3driver_cached_login, 127 .sess_login = pop3driver_cached_login,
125 .sess_logout = pop3driver_cached_logout, 128 .sess_logout = pop3driver_cached_logout,
126 .sess_noop = pop3driver_cached_noop, 129 .sess_noop = pop3driver_cached_noop,
127 130
128 .sess_build_folder_name = NULL, 131 .sess_build_folder_name = NULL,
129 .sess_create_folder = NULL, 132 .sess_create_folder = NULL,
130 .sess_delete_folder = NULL, 133 .sess_delete_folder = NULL,
131 .sess_rename_folder = NULL, 134 .sess_rename_folder = NULL,
132 .sess_check_folder = pop3driver_cached_check_folder, 135 .sess_check_folder = pop3driver_cached_check_folder,
133 .sess_examine_folder = NULL, 136 .sess_examine_folder = NULL,
134 .sess_select_folder = NULL, 137 .sess_select_folder = NULL,
135 .sess_expunge_folder = pop3driver_cached_expunge_folder, 138 .sess_expunge_folder = pop3driver_cached_expunge_folder,
136 .sess_status_folder = pop3driver_cached_status_folder, 139 .sess_status_folder = pop3driver_cached_status_folder,
137 .sess_messages_number = pop3driver_cached_messages_number, 140 .sess_messages_number = pop3driver_cached_messages_number,
138 .sess_recent_number = pop3driver_cached_recent_number, 141 .sess_recent_number = pop3driver_cached_recent_number,
139 .sess_unseen_number = pop3driver_cached_unseen_number, 142 .sess_unseen_number = pop3driver_cached_unseen_number,
140 .sess_list_folders = NULL, 143 .sess_list_folders = NULL,
141 .sess_lsub_folders = NULL, 144 .sess_lsub_folders = NULL,
142 .sess_subscribe_folder = NULL, 145 .sess_subscribe_folder = NULL,
143 .sess_unsubscribe_folder = NULL, 146 .sess_unsubscribe_folder = NULL,
144 147
145 .sess_append_message = NULL, 148 .sess_append_message = NULL,
149 .sess_append_message_flags = NULL,
146 .sess_copy_message = NULL, 150 .sess_copy_message = NULL,
147 .sess_move_message = NULL, 151 .sess_move_message = NULL,
148 152
149 .sess_get_messages_list = pop3driver_cached_get_messages_list, 153 .sess_get_messages_list = pop3driver_cached_get_messages_list,
150 .sess_get_envelopes_list = pop3driver_cached_get_envelopes_list, 154 .sess_get_envelopes_list = pop3driver_cached_get_envelopes_list,
151 .sess_remove_message = pop3driver_cached_remove_message, 155 .sess_remove_message = pop3driver_cached_remove_message,
152#if 0 156#if 0
153 .sess_search_messages = maildriver_generic_search_messages, 157 .sess_search_messages = maildriver_generic_search_messages,
154#endif 158#endif
155 159
156 .sess_get_message = pop3driver_cached_get_message, 160 .sess_get_message = pop3driver_cached_get_message,
157 .sess_get_message_by_uid = NULL, 161 .sess_get_message_by_uid = pop3driver_cached_get_message_by_uid,
158}; 162};
159 163
160mailsession_driver * pop3_cached_session_driver = 164mailsession_driver * pop3_cached_session_driver =
161&local_pop3_cached_session_driver; 165&local_pop3_cached_session_driver;
162 166
163#define ENV_NAME "env.db" 167#define ENV_NAME "env.db"
164#define FLAGS_NAME "flags.db" 168#define FLAGS_NAME "flags.db"
165 169
166 170
167static inline struct pop3_cached_session_state_data * 171static inline struct pop3_cached_session_state_data *
168get_cached_data(mailsession * session) 172get_cached_data(mailsession * session)
169{ 173{
170 return session->sess_data; 174 return session->sess_data;
171} 175}
172 176
173static inline mailsession * get_ancestor(mailsession * session) 177static inline mailsession * get_ancestor(mailsession * session)
174{ 178{
175 return get_cached_data(session)->pop3_ancestor; 179 return get_cached_data(session)->pop3_ancestor;
176} 180}
177 181
178static inline struct pop3_session_state_data * 182static inline struct pop3_session_state_data *
179get_ancestor_data(mailsession * session) 183get_ancestor_data(mailsession * session)
180{ 184{
181 return get_ancestor(session)->sess_data; 185 return get_ancestor(session)->sess_data;
@@ -834,24 +838,62 @@ pop3driver_cached_get_envelopes_list(mailsession * session,
834 err: 838 err:
835 return res; 839 return res;
836} 840}
837 841
838static int pop3driver_cached_get_message(mailsession * session, 842static int pop3driver_cached_get_message(mailsession * session,
839 uint32_t num, mailmessage ** result) 843 uint32_t num, mailmessage ** result)
840{ 844{
841 mailmessage * msg_info; 845 mailmessage * msg_info;
842 int r; 846 int r;
843 847
844 msg_info = mailmessage_new(); 848 msg_info = mailmessage_new();
845 if (msg_info == NULL) 849 if (msg_info == NULL)
846 return MAIL_ERROR_MEMORY; 850 return MAIL_ERROR_MEMORY;
847 851
848 r = mailmessage_init(msg_info, session, pop3_cached_message_driver, num, 0); 852 r = mailmessage_init(msg_info, session, pop3_cached_message_driver, num, 0);
849 if (r != MAIL_NO_ERROR) { 853 if (r != MAIL_NO_ERROR) {
850 mailmessage_free(msg_info); 854 mailmessage_free(msg_info);
851 return r; 855 return r;
852 } 856 }
853 857
854 * result = msg_info; 858 * result = msg_info;
855 859
856 return MAIL_NO_ERROR; 860 return MAIL_NO_ERROR;
857} 861}
862
863static int pop3driver_cached_get_message_by_uid(mailsession * session,
864 const char * uid, mailmessage ** result)
865{
866 mailpop3 * pop3;
867 struct mailpop3_msg_info * msg_info;
868 int found;
869 unsigned int i;
870
871 if (uid == NULL)
872 return MAIL_ERROR_INVAL;
873
874 pop3 = get_pop3_session(session);
875
876 found = 0;
877
878 /* iterate all messages and look for uid */
879 for(i = 0 ; i < carray_count(pop3->pop3_msg_tab) ; i++) {
880 msg_info = carray_get(pop3->pop3_msg_tab, i);
881
882 if (msg_info == NULL)
883 continue;
884
885 if (msg_info->msg_deleted)
886 continue;
887
888 /* uid found, stop looking */
889 if (strcmp(msg_info->msg_uidl, uid) == 0) {
890 found = 1;
891 break;
892 }
893 }
894
895 if (!found)
896 return MAIL_ERROR_MSG_NOT_FOUND;
897
898 return pop3driver_cached_get_message(session, msg_info->msg_index, result);
899}