#include <memory.h>
#include <dlog.h>
-#include <dbus/dbus.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-lowlevel.h>
-#include <email-api-mail.h>
-#include <email-api-account.h>
-#include <email-api-network.h>
-#include <email-api-mailbox.h>
-#include <email-api-init.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <gio/gio.h>
#include <email-api.h>
-#include<email.h>
-#include<email_private.h>
-#include<email_types.h>
-#include<email_error.h>
+#include <email.h>
+#include <email_private.h>
+#include <email_types.h>
+#include <email_error.h>
#ifdef LOG_TAG
#undef LOG_TAG
#define LOG_TAG "CAPI_EMAIL"
#define EM_SAFE_STRDUP(s) \
- ({\
- char* _s = (char*)s;\
- (_s)? strdup(_s) : NULL;\
- })
+({\
+ char* _s = (char*)s;\
+ (_s)? strdup(_s) : NULL;\
+})
#define EM_SAFE_STRLEN(s) \
- ({\
- char* _s = (char*)s;\
- (_s)? strlen(_s) : 0;\
- })
+({\
+ char* _s = (char*)s;\
+ (_s)? strlen(_s) : 0;\
+})
+
+#define FILE_PATH "/opt/usr/media/.email/capimail.txt"
+#define TMP_PATH "/opt/usr/media/.email"
+
+static guint g_dbus_return_id = 0;
typedef struct {
email_message_sent_cb callback;
GSList *gEmailcbList= NULL;
-DBusConnection* connection=NULL;
+GDBusConnection* connection=NULL;
//------------- Utility Or Miscellaneous
void _email_add_dbus_filter(void);
+void _email_remove_dbus_filter(void);
int _email_error_converter(int err, const char *func, int line);
int _email_copy_handle(email_s **dst_handle, email_s *src_handle);
void _email_free_cb_context(email_cb_context *cbcontext);
free(msg_s);
return EMAILS_ERROR_OUT_OF_MEMORY;
}
-
-
}
else
{
return CONVERT_ERROR(ret);
}
- ret = email_get_account(default_account_id, GET_FULL_DATA, &account);
- if(ret!=EMAIL_ERROR_NONE) {
+ ret = email_get_account(default_account_id, GET_FULL_DATA_WITHOUT_PASSWORD, &account);
+ if (ret!=EMAIL_ERROR_NONE) {
SECURE_SLOGE("[%s] email_get_account failed : [%d]",__FUNCTION__, ret);
if (account) {
email_free_account(&account, 1);
LOGD("START\n");
int len;
- if (msg == NULL)
- {
+ if (msg == NULL) {
SECURE_SLOGE("[%s] INVALID_PARAMETER(0x%08x) : msg is null.", __FUNCTION__, EMAILS_ERROR_INVALID_PARAMETER);
return EMAILS_ERROR_INVALID_PARAMETER;
}
email_s* msg_s = (email_s* )msg;
-
-
FILE* file = NULL;
-
- file = fopen("/tmp/capimail.txt", "w");
+ if (!g_file_test(TMP_PATH, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
+ if (g_mkdir(TMP_PATH, 0775) == -1) {
+ SECURE_SLOGE("[%s] OPERATION_FAILED(0x%08x) : Create directory failed.", __FUNCTION__, EMAILS_ERROR_OPERATION_FAILED);
+ return EMAILS_ERROR_OPERATION_FAILED;
+ }
- if (file != NULL)
- {
+ if (g_chmod(TMP_PATH, 0775) == -1) {
+ SECURE_SLOGE("[%s] OPERATION_FAILED(0x%08x) : Change permission failed.", __FUNCTION__, EMAILS_ERROR_OPERATION_FAILED);
+ return EMAILS_ERROR_OPERATION_FAILED;
+ }
+ }
+
+ file = fopen(FILE_PATH, "w");
+ if (file != NULL) {
fputs(body, file);
fclose(file);
} else {
return EMAILS_ERROR_OPERATION_FAILED;
}
- msg_s->mail->file_path_plain =(char *)calloc(1,sizeof(char)*strlen("/tmp/capimail.txt")+1);
+ len = strlen(FILE_PATH) + 1;
- if(msg_s->mail->file_path_plain == NULL) {
+ msg_s->mail->file_path_plain = (char *)calloc(1, sizeof(char) * len);
+ if (msg_s->mail->file_path_plain == NULL) {
SECURE_SLOGE("[%s] OUT_OF_MEMORY(0x%08x) : fail to allocate body(plain).", __FUNCTION__, EMAILS_ERROR_OUT_OF_MEMORY);
return EMAILS_ERROR_OUT_OF_MEMORY;
}
- len =strlen("/tmp/capimail.txt")+1;
- snprintf(msg_s->mail->file_path_plain,len,"%s","/tmp/capimail.txt");
+ snprintf(msg_s->mail->file_path_plain, len, "%s", FILE_PATH);
LOGD("END\n");
return EMAILS_ERROR_NONE;
}
-
-
int email_add_recipient (email_h msg, email_recipient_type_e type, const char *address)
{
LOGD("START\n");
email_s *msg_s = (email_s *)msg;
- _email_add_dbus_filter();
-
ret=email_send_mail(msg_s->mail->mail_id, &handle);
ret=CONVERT_ERROR(ret);
email_cb_context *cbcontext = (email_cb_context *)calloc(1, sizeof(email_cb_context));
if (cbcontext == NULL) {
SECURE_SLOGE("[%s] calloc failed", __FUNCTION__);
+ if (msg_s) {
+ if (msg_s->mail)
+ email_free_mail_data(&msg_s->mail, 1);
+
+ if (msg_s->mbox)
+ email_free_mailbox(&msg_s->mbox, 1);
+
+ free(msg_s);
+ }
ret = EMAIL_ERROR_OUT_OF_MEMORY;
return ret;
}
gEmailcbList = g_slist_append(gEmailcbList, cbcontext);
+ /* Set the dbus filter */
+ _email_add_dbus_filter();
+
LOGD("END\n");
return EMAILS_ERROR_NONE;
}
}
}
+ /* Remove the dbus filter */
+ _email_remove_dbus_filter();
+
LOGD("END\n");
return EMAILS_ERROR_NONE;
}
SECURE_SLOGE("[%s:%d] IPC_SOCKET_FAILURE(0x%08x) : Error from Email F/W. ret: (0x%08x) ", func, line, EMAILS_ERROR_COMMUNICATION_WITH_SERVER_FAILED,err);
return EMAILS_ERROR_COMMUNICATION_WITH_SERVER_FAILED;
+ case EMAIL_ERROR_NO_SMACK_RULE :
case EMAIL_ERROR_PERMISSION_DENIED :
SECURE_SLOGE("[%s:%d] PERMISSION_DENIED(0x%08x) : Error from Email F/W. ret: (0x%08x) ", func, line, EMAILS_ERROR_PERMISSION_DENIED,err);
return EMAILS_ERROR_PERMISSION_DENIED;
LOGD("END\n");
}
-DBusHandlerResult _monitorSendStatusCb(DBusConnection *connection, DBusMessage *message, void *user_data)
+static void _monitorSendStatusCb(GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer data)
{
LOGD("START\n");
- DBusError error;
+ int status = 0;
+ int account_id = 0;
+ char *file_id = NULL;
+ int mail_id = 0;
+ int error_code = 0;
+
email_cb_context *cbContext = NULL;
- if(dbus_message_is_signal(message, "User.Email.NetworkStatus", "email"))
- {
- dbus_error_init(&error);
-
- int status=0;
- int accountid=0;
- char* fileid=NULL;
- int mailid=0;
- int errorcode=0;
- if(dbus_message_get_args(message, &error,
- DBUS_TYPE_INT32, &status,
- DBUS_TYPE_INT32, &accountid,
- DBUS_TYPE_STRING, &fileid,
- DBUS_TYPE_INT32, &mailid,
- DBUS_TYPE_INT32, &errorcode,
- DBUS_TYPE_INVALID))
- {
- SECURE_LOGD("status:[%d], account_id:[%d], file_id:[%s], mail_id:[%d], error_code:[%d]", status, accountid, fileid, mailid, errorcode);
- cbContext = _email_search_callback_by_emailid(mailid);
- if (cbContext == NULL) {
- SECURE_LOGD("no callback matched!\n");
- }else{
- SECURE_LOGD("Address : [%p]\n", cbContext->callback);
- switch (status) {
- case NOTI_SEND_START:
- break;
-
- case NOTI_SEND_FAIL:
-
- switch(errorcode)
- {
- case EMAIL_ERROR_NO_SIM_INSERTED:
- case EMAIL_ERROR_FLIGHT_MODE:
- case EMAIL_ERROR_SMTP_SEND_FAILURE:
- case EMAIL_ERROR_NO_SUCH_HOST:
- case EMAIL_ERROR_CONNECTION_FAILURE:
- case EMAIL_ERROR_CONNECTION_BROKEN:
- case EMAIL_ERROR_INVALID_SERVER:
- case EMAIL_ERROR_NO_RESPONSE:
-
- break;
-
- default:
- break;
- }
-
- cbContext->callback((email_h)cbContext->handle,(email_sending_e)EMAIL_SENDING_FAILED ,cbContext->user_data);
- break;
-
- case NOTI_SEND_FINISH:
- cbContext->callback((email_h)cbContext->handle,(email_sending_e)EMAIL_SENDING_SUCCEEDED ,cbContext->user_data);
- break;
-
- }
- }
+ if (strncasecmp(interface_name, "USER.EMAIL.NETWORKSTATUS", strlen("USER.EMAIL.NETWORKSTATUS")) &&
+ strncasecmp(sender_name, "EMAIL", strlen("EMAIL"))) {
+ LOGE("Invalid interface : [%s]", interface_name);
+ return;
+ }
+
+ g_variant_get(parameters, "(iisii)",
+ &status,
+ &account_id,
+ &file_id,
+ &mail_id,
+ &error_code);
+
+ SECURE_LOGD("status:[%d], account_id:[%d], file_id:[%s], mail_id:[%d], error_code:[%d]",
+ status,
+ account_id,
+ file_id,
+ mail_id,
+ error_code);
+
+ cbContext = _email_search_callback_by_emailid(mail_id);
+ if (cbContext == NULL) {
+ SECURE_LOGD("no callback matched!\n");
+ } else {
+ SECURE_LOGD("Address : [%p]\n", cbContext->callback);
+ switch (status) {
+ case NOTI_SEND_START:
+ break;
+
+ case NOTI_SEND_FAIL:
+ switch(error_code)
+ {
+ case EMAIL_ERROR_NO_SIM_INSERTED:
+ case EMAIL_ERROR_FLIGHT_MODE:
+ case EMAIL_ERROR_SMTP_SEND_FAILURE:
+ case EMAIL_ERROR_NO_SUCH_HOST:
+ case EMAIL_ERROR_CONNECTION_FAILURE:
+ case EMAIL_ERROR_CONNECTION_BROKEN:
+ case EMAIL_ERROR_INVALID_SERVER:
+ case EMAIL_ERROR_NO_RESPONSE:
+ break;
+
+ default:
+ break;
}
+
+ cbContext->callback((email_h)cbContext->handle,
+ (email_sending_e)EMAIL_SENDING_FAILED,
+ cbContext->user_data);
+ break;
+
+ case NOTI_SEND_FINISH:
+ cbContext->callback((email_h)cbContext->handle,
+ (email_sending_e)EMAIL_SENDING_SUCCEEDED,
+ cbContext->user_data);
+ break;
+ }
}
- LOGD("END\n");
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ LOGE("END\n");
}
void _email_add_dbus_filter(void)
LOGD("START\n");
if (connection != NULL)
- return;
+ return;
- DBusError error;
-
- dbus_error_init(&error);
+ GError *error = NULL;
- connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+ connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
if (NULL == connection) {
- SECURE_SLOGE("dbus_bus_get failed");
+ SECURE_SLOGE("g_bus_get_sync failed : [%s]", error->message);
+ g_error_free(error);
return;
}
LOGD("connection [%p]", connection);
- char *rule = "type='signal',interface='User.Email.NetworkStatus'";
- LOGD("Signal match rule: %s", rule);
- dbus_bus_add_match(connection, rule, &error);
-
- if (dbus_error_is_set(&error)) {
- LOGD("Cannot add D-BUS match rule, cause: %s", error.message);
- dbus_error_free(&error);
- return;
+ g_dbus_return_id = g_dbus_connection_signal_subscribe(connection,
+ NULL,
+ "User.Email.NetworkStatus",
+ "email",
+ "/User/Email/NetworkStatus",
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ _monitorSendStatusCb,
+ NULL,
+ NULL);
+ if (g_dbus_return_id == -1) {
+ LOGE("g_dbus_connection_signal_subscribe failed");
}
- dbus_connection_setup_with_g_main(connection, NULL);
-
- dbus_connection_add_filter(connection, _monitorSendStatusCb, NULL, NULL);
+ LOGE("END\n");
+}
- LOGD("END\n");
+void _email_remove_dbus_filter(void)
+{
+ g_dbus_connection_signal_unsubscribe(connection, g_dbus_return_id);
+ g_object_unref(connection);
+ connection = NULL;
+ g_dbus_return_id = 0;
}
int _email_copy_mail_data(email_mail_data_t **dst_mail_data, email_mail_data_t *src_mail_data)