4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 /******************************************************************************
25 * File: email-daemon-init.c
26 * Desc: email-daemon Initialization
31 * 2006.08.16 : created
32 *****************************************************************************/
37 #include <glib-object.h>
39 #include <vconf-internal-account-keys.h>
40 #include <dbus/dbus.h>
41 #include <dlfcn.h> /* added for Disabling the Pthread flag log */
43 #include "email-daemon.h"
44 #include "email-storage.h"
45 #include "email-debug-log.h"
46 #include "email-daemon-account.h"
47 #include "email-daemon-auto-poll.h"
48 #include "email-core-utils.h"
49 #include "email-core-mail.h"
50 #include "email-core-event.h"
51 #include "email-core-account.h"
52 #include "email-core-mailbox.h"
53 #include "email-core-api.h"
54 #include "email-core-smtp.h"
55 #include "email-core-global.h"
56 #include "email-storage.h"
57 #include "email-core-sound.h"
58 #include "email-core-task-manager.h"
59 #include "email-daemon-emn.h"
61 extern int g_client_count ;
63 /* static functions */
64 static int _emdaemon_load_email_core()
66 EM_DEBUG_FUNC_BEGIN();
68 int err = EMAIL_ERROR_NONE;
70 /* initialize mail core */
71 if (!emcore_init(&err))
74 if (emcore_start_event_loop(&err) < 0)
77 if (emcore_start_event_loop_for_sending_mails(&err) < 0)
80 emcore_init_task_handler_array();
82 /* Disabled task manager
83 if ((err = emcore_start_task_manager_loop()) != EMAIL_ERROR_NONE) {
84 EM_DEBUG_EXCEPTION("emcore_start_task_manager_loop failed [%d]",err);
89 #ifdef __FEATURE_PARTIAL_BODY_DOWNLOAD__
90 if (emcore_start_thread_for_downloading_partial_body(&err) < 0) {
91 EM_DEBUG_EXCEPTION("emcore_start_thread_for_downloading_partial_body failed [%d]",err);
96 #ifdef __FEATURE_BLOCKING_MODE__
97 emcore_init_blocking_mode_status();
98 #endif /* __FEATURE_BLOCKING_MODE__ */
100 if (emcore_start_thread_for_alerting_new_mails(&err) < 0)
108 static int _emdaemon_unload_email_core()
110 EM_DEBUG_FUNC_BEGIN();
111 int err = EMAIL_ERROR_NONE;
113 /* finish event loop */
114 emcore_stop_event_loop(&err);
115 emcore_stop_task_manager_loop();
117 EM_DEBUG_FUNC_END("err [%d]", err);
121 static void callback_for_SYNC_ALL_STATUS_from_account_svc(keynode_t *input_node, void *input_user_data)
123 EM_DEBUG_FUNC_BEGIN("input_node [%p], input_user_data [%p]", input_node, input_user_data);
126 int err = EMAIL_ERROR_NONE;
127 int account_count = 0;
128 int sync_start_toggle = 0;
129 email_account_t *account_list = NULL;
130 emstorage_mailbox_tbl_t *mailbox_tbl_data = NULL;
132 if (!emdaemon_get_account_list(&account_list, &account_count, &err)) {
133 EM_DEBUG_EXCEPTION("emdaemon_get_account_list failed [%d]", err);
138 sync_start_toggle = vconf_keynode_get_int(input_node);
140 for(i = 0; i < account_count; i++) {
141 if(sync_start_toggle == 1) {
142 if(!emstorage_get_mailbox_by_mailbox_type(account_list[i].account_id, EMAIL_MAILBOX_TYPE_INBOX, &mailbox_tbl_data, true, &err)) {
143 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_mailbox_type for [%d] failed [%d]", account_list[i].account_id, err);
147 if(!emdaemon_sync_header(account_list[i].account_id, mailbox_tbl_data->mailbox_id, &handle, &err)) {
148 EM_DEBUG_EXCEPTION("emdaemon_sync_header for [%d] failed [%d]", account_list[i].account_id, err);
151 emstorage_free_mailbox(&mailbox_tbl_data, 1, NULL); /* prevent 27459: remove unnecesary if clause */
152 mailbox_tbl_data = NULL;
155 emcore_cancel_all_threads_of_an_account(account_list[i].account_id);
161 emdaemon_free_account(&account_list, account_count, NULL);
163 emstorage_free_mailbox(&mailbox_tbl_data, 1, NULL);
168 static void callback_for_AUTO_SYNC_STATUS_from_account_svc(keynode_t *input_node, void *input_user_data)
170 EM_DEBUG_FUNC_BEGIN("input_node [%p], input_user_data [%p]", input_node, input_user_data);
171 int err = EMAIL_ERROR_NONE;
173 int auto_sync_toggle = 0;
174 int account_count = 0;
175 email_account_t *account_list = NULL;
176 email_account_t *account_info = NULL;
178 if (!emdaemon_get_account_list(&account_list, &account_count, &err)) {
179 EM_DEBUG_EXCEPTION("emdaemon_get_account_list failed [%d]", err);
184 auto_sync_toggle = vconf_keynode_get_int(input_node);
186 for(i = 0; i < account_count; i++) {
187 account_info = account_list + i;
189 if(auto_sync_toggle == 1) { /* on */
191 if(account_info->check_interval < 0)
192 account_info->check_interval = ~account_info->check_interval + 1;
196 if(account_info->check_interval > 0)
197 account_info->check_interval = ~account_info->check_interval + 1;
200 if(!emdaemon_update_account(account_info->account_id, account_info, &err)) {
201 EM_DEBUG_EXCEPTION("emdaemon_update_account failed [%d]", err);
208 emdaemon_free_account(&account_list, account_count, NULL);
213 static void callback_for_NETWORK_STATUS(keynode_t *input_node, void *input_user_data)
215 EM_DEBUG_FUNC_BEGIN("input_node [%p], input_user_data [%p]", input_node, input_user_data);
216 int err = EMAIL_ERROR_NONE;
220 int network_status = 0;
221 int account_count = 0;
222 email_account_t *account_list = NULL;
223 email_account_t *account_info = NULL;
224 emstorage_mailbox_tbl_t *local_mailbox = NULL;
227 network_status = vconf_keynode_get_int(input_node);
229 if (network_status == VCONFKEY_NETWORK_OFF) {
230 EM_DEBUG_EXCEPTION("Network is OFF");
234 if (!emdaemon_get_account_list(&account_list, &account_count, &err)) {
235 EM_DEBUG_EXCEPTION("emdaemon_get_account_list failed [%d]", err);
239 for (i = 0; i < account_count ; i++) {
240 account_info = account_list + i;
242 if (!emstorage_get_mailbox_by_mailbox_type(account_info->account_id, EMAIL_MAILBOX_TYPE_OUTBOX, &local_mailbox, false, &err)) {
243 EM_DEBUG_EXCEPTION("emstorage_get_mailbox_by_mailbox_type failed [%d]", err);
247 if (!emstorage_get_mail_count(account_info->account_id, local_mailbox->mailbox_id, &total, &unseen, false, &err)) {
248 EM_DEBUG_EXCEPTION("emstorage_get_mail_count failed [%d]", err);
255 if (!emcore_send_saved_mail(account_info->account_id, local_mailbox->mailbox_name, &err)) {
256 EM_DEBUG_EXCEPTION("emcore_send_saved_mail failed [%d]", err);
260 if (!emstorage_free_mailbox(&local_mailbox, 1, &err)) {
261 EM_DEBUG_EXCEPTION("emstorage_free_mailbox failed [%d]", err);
269 emstorage_free_mailbox(&local_mailbox, 1, NULL);
272 emdaemon_free_account(&account_list, account_count, NULL);
274 EM_DEBUG_FUNC_END("Error : [%d]", err);
277 #ifdef __FEATURE_BLOCKING_MODE__
278 INTERNAL_FUNC void callback_for_BLOCKING_MODE_STATUS(keynode_t *input_node, void *input_user_data)
280 EM_DEBUG_FUNC_BEGIN();
281 int blocking_mode_of_setting = 0;
284 EM_DEBUG_EXCEPTION("Invalid param");
288 blocking_mode_of_setting = vconf_keynode_get_bool(input_node);
290 emcore_set_blocking_mode_of_setting(blocking_mode_of_setting);
294 #endif /* __FEATURE_BLOCKING_MODE__ */
296 INTERNAL_FUNC int emdaemon_initialize(int* err_code)
298 EM_DEBUG_FUNC_BEGIN();
300 /* default variable */
302 int err = EMAIL_ERROR_NONE;
304 if (g_client_count > 0) {
305 EM_DEBUG_LOG("Initialization was already done. increased counter=[%d]", g_client_count);
310 EM_DEBUG_LOG("************* start email service build time [%s %s] ************* ", __DATE__, __TIME__);
312 dbus_threads_init_default();
316 emstorage_shm_file_init(SHM_FILE_FOR_DB_LOCK);
318 #ifdef __FEATURE_USE_SHARED_MUTEX_FOR_GENERATING_MAIL_ID__
319 emstorage_shm_file_init(SHM_FILE_FOR_MAIL_ID_LOCK);
320 #endif /* __FEATURE_USE_SHARED_MUTEX_FOR_GENERATING_MAIL_ID__ */
323 if (!emstorage_open(&err)) {
324 EM_DEBUG_EXCEPTION("emstorage_open failed [%d]", err);
328 if (!emstorage_clean_save_status(EMAIL_MAIL_STATUS_SAVED, &err))
329 EM_DEBUG_EXCEPTION("emstorage_check_mail_status Failed [%d]", err );
333 if (!emdaemon_initialize_account_reference()) {
334 EM_DEBUG_EXCEPTION("emdaemon_initialize_account_reference fail...");
335 err = EMAIL_ERROR_DB_FAILURE;
338 EM_DEBUG_LOG("emdaemon_initialize_account_reference over - g_client_count [%d]", g_client_count);
340 if ((err = _emdaemon_load_email_core()) != EMAIL_ERROR_NONE) {
341 EM_DEBUG_EXCEPTION("_emdaemon_load_email_core failed [%d]", err);
345 #ifdef __FEATURE_OMA_EMN__
346 emdaemon_initialize_emn();
349 /* Subscribe Events */
350 vconf_notify_key_changed(VCONFKEY_ACCOUNT_SYNC_ALL_STATUS_INT, callback_for_SYNC_ALL_STATUS_from_account_svc, NULL);
351 vconf_notify_key_changed(VCONFKEY_ACCOUNT_AUTO_SYNC_STATUS_INT, callback_for_AUTO_SYNC_STATUS_from_account_svc, NULL);
352 vconf_notify_key_changed(VCONFKEY_NETWORK_STATUS, callback_for_NETWORK_STATUS, NULL);
353 #ifdef __FEATURE_BLOCKING_MODE__
354 vconf_notify_key_changed(VCONFKEY_NETWORK_STATUS, callback_for_BLOCKING_MODE_STATUS, NULL);
356 emcore_display_unread_in_badge();
367 EM_DEBUG_FUNC_END("ret [%d], g_client_count [%d]", ret, g_client_count);
371 INTERNAL_FUNC int emdaemon_finalize(int* err_code)
373 EM_DEBUG_FUNC_BEGIN();
375 /* default variable */
377 int err = EMAIL_ERROR_NONE;
379 if (g_client_count > 1) {
380 EM_DEBUG_EXCEPTION("engine is still used by application. decreased counter=[%d]", g_client_count);
382 err = EMAIL_ERROR_CLOSE_FAILURE;
386 if ( (err = _emdaemon_unload_email_core()) != EMAIL_ERROR_NONE) {
387 EM_DEBUG_EXCEPTION("_emdaemon_unload_email_core failed [%d]", err);
391 /* free account reference list */
392 emcore_free_account_reference();
395 if (!emstorage_close(&err)) {
396 EM_DEBUG_EXCEPTION("emstorage_close failed [%d]", err);
411 #ifdef __FEATURE_AUTO_POLLING__
412 INTERNAL_FUNC int emdaemon_start_auto_polling(int* err_code)
414 EM_DEBUG_FUNC_BEGIN();
416 /* default variable */
417 int ret = false, count = 0, i= 0;
418 int err = EMAIL_ERROR_NONE;
419 emstorage_account_tbl_t* account_list = NULL;
421 /* get account list */
422 if (!emstorage_get_account_list(&count, &account_list, false, false, &err)) {
423 EM_DEBUG_EXCEPTION("emstorage_get_account_list failed [%d]", err);
427 for (i = 0; i < count; i++) {
428 /* start auto polling, if check_interval not zero */
429 if(account_list[i].check_interval > 0) {
430 if(!emdaemon_add_polling_alarm( account_list[i].account_id,account_list[i].check_interval))
431 EM_DEBUG_EXCEPTION("emdaemon_add_polling_alarm failed");
438 emstorage_free_account(&account_list, count, NULL);
440 if (err_code != NULL)
445 #endif /* __FEATURE_AUTO_POLLING__ */