Add send response API 42/186242/2
authorJihoon Jung <jh8801.jung@samsung.com>
Wed, 8 Aug 2018 08:23:00 +0000 (17:23 +0900)
committerJihoon Jung <jh8801.jung@samsung.com>
Wed, 8 Aug 2018 10:06:07 +0000 (19:06 +0900)
Change-Id: I17749ba3df0b075258125b2f63f90d4e9c23018d
Signed-off-by: Jihoon Jung <jh8801.jung@samsung.com>
13 files changed:
src/mdg-manager/include/mdgd_group.h
src/mdg-manager/include/mdgd_iot.h
src/mdg-manager/include/mdgd_typedef.h
src/mdg-manager/include/mdgd_util.h
src/mdg-manager/src/mdg_gdbus.xml
src/mdg-manager/src/mdgd_gdbus.c
src/mdg-manager/src/mdgd_group.c
src/mdg-manager/src/mdgd_iot.cpp
src/mdg-manager/src/mdgd_iot_client.cpp
src/mdg-manager/src/mdgd_iot_server.cpp
src/mdg-manager/src/mdgd_manager.c
src/mdg-manager/src/mdgd_util.c
src/mot-agent/ma-subowner.c

index e93ec09..cd1cb79 100755 (executable)
@@ -38,7 +38,9 @@ int mdgd_group_eject_device(char *sender, const char *group_name, const char *uu
 int mdgd_group_regist_channel(char *sender, char *channel_id);
 int mdgd_group_unregist_channel(char *sender, char *channel_id);
 int mdgd_group_send_data(char *sender, char *uuid, char *channel_id,
-                                                unsigned char *data, int len);
+                                                unsigned char *data, int len, int *msg_id);
+int mdgd_group_send_response(char *sender, char *uuid, char *channel_id,
+                                                int msg_id, unsigned char *data, int len);
 
 /* Group Request to remote */
 int mdgd_group_request(mdgd_request_type_e type, char *sender, char *uuid,
index ec356e2..8f7bee7 100755 (executable)
@@ -39,6 +39,8 @@ int mdgd_iot_initialize();
 int mdgd_iot_add_resource(mdgd_resource_type_e resource_type, const char *uri);
 int mdgd_iot_discovery_resource(mdgd_resource_type_e resource_type, void *user_data);
 int mdgd_iot_get_device_description(mdgd_command_t *cmd, char *host_addr, int conn_type);
+int mdgd_iot_send_response(char *sender, char *uuid, char *channel_id,
+                                                int msg_id, unsigned char *data, int len, bool timeout);
 int mdgd_iot_deinitialize();
 
 #ifdef __cplusplus
index 6ddf462..35f9d43 100755 (executable)
@@ -61,6 +61,7 @@ typedef enum {
        MDGD_ERROR_PLUGIN_FAIL = TIZEN_ERROR_MDG | 0x06, /**< Plugin failed */
        MDGD_ERROR_NOT_STARTED = TIZEN_ERROR_MDG | 0x07, /**< Service Not Started */
        MDGD_ERROR_DB = TIZEN_ERROR_MDG | 0x08, /**< Internal DB error */
+       MDGD_ERROR_NETWORK_UNREACHABLE = TIZEN_ERROR_MDG | 0x09,
 } mdg_error_e;
 
 typedef enum {
@@ -87,6 +88,8 @@ typedef enum {
        MDGD_REQ_CHANNEL_LIST, /**< Channel List */
        MDGD_REQ_SEND_DATA, /**< Send data */
        MDGD_REQ_SEND_FILE, /**< Send File */
+       MDGD_REQ_EVENT_INVITED,
+       MDGD_REQ_EVENT_EJECTED,
 } mdgd_request_type_e;
 
 typedef enum {
@@ -103,6 +106,8 @@ typedef enum {
        MDGD_EVENT_RECEIVE_FILE = 10,
        MDGD_EVENT_SEND_FILE_PROGRESS,
        MDGD_EVENT_SEND_FILE_FINISH,
+       MDGD_EVENT_INVITED,
+       MDGD_EVENT_EJECTED,
 } mdgd_event_type_e;
 
 typedef struct {
@@ -135,15 +140,21 @@ typedef struct {
 } mdgd_channel_t;
 
 typedef struct {
+       char *sender;
        char *device_id;
        char *channel_id;
-       unsigned char *data;
-       int data_length;
+       int msg_id;
+       int tid;
+       char *data;
+       int data_len;
+       void *user_data;
 } mdgd_data_t;
 
 typedef struct {
        GMainLoop *main_loop;
        GHashTable *channel;
+       GSList *receive_data;
+       GSList *send_data;
        int ref_count;
        char *device_uuid;
        mdgd_device_t *device;
@@ -173,6 +184,7 @@ typedef struct {
 #endif
        int conn_type;
        void *user_data;
+       int msg_id;
 } mdgd_command_t;
 
 typedef struct {
index 29d87b3..b88311c 100755 (executable)
@@ -26,6 +26,7 @@ extern "C"
 #include <octypes.h>
 #include <pmtypes.h>
 #include <mdgd_log.h>
+#include <base64.h>
 
 char *mdgd_addr2host(char *addr, int port, bool is_secure);
 int mdgd_uuid_to_str(const OicUuid_t* uuid, char** strUuid);
@@ -40,6 +41,13 @@ GVariant *mdgd_create_variant_progress(char *file_path,
                long send_size, long total_size, int percent);
 GVariant *mdgd_create_variant_dummy();
 mdgd_device_t *mdg_get_device_from_variant(GVariant *va);
+int mdgd_util_get_msg_id();
+
+void mdgd_util_data_encode(const char *data, int data_len,
+       char **encoded_data, int *encoded_len);
+
+void mdgd_util_data_decode(const char *data, int data_len,
+       char **decoded_data, int *decoded_len);
 
 
 #ifdef __cplusplus
index a616ed1..696329d 100755 (executable)
                        <arg type="s" name="channel_id" direction="in"/>
                        <arg type="(iay)" name="data" direction="in"/>
                        <arg type="i" name="result" direction="out" />
+                       <arg type="i" name="msg_id" direction="out" />
+               </method>
+               <method name="SendResponse">
+                       <arg type="s" name="uuid" direction="in" />
+                       <arg type="s" name="channel_id" direction="in"/>
+                       <arg type="i" name="msg_id" direction="in"/>
+                       <arg type="(iay)" name="data" direction="in"/>
+                       <arg type="i" name="result" direction="out" />
                </method>
                <method name="SendFile">
                        <arg type="s" name="uuid" direction="in" />
index 1232d9a..33853a3 100755 (executable)
@@ -213,6 +213,7 @@ gboolean group_send_data(Group *group, GDBusMethodInvocation *invocation,
        int len;
        unsigned char *data;
        GVariantIter *iter;
+       int msg_id;
 
        LOG_BEGIN();
 
@@ -220,7 +221,7 @@ gboolean group_send_data(Group *group, GDBusMethodInvocation *invocation,
 
        data = g_try_malloc0(len + 1);
        if (NULL == data) {
-               group_complete_send_data(group, invocation, -1);
+               group_complete_send_data(group, invocation, -1, NULL);
                LOG_ERR("Failed to allocate memory");
                return TRUE;
        }
@@ -230,9 +231,47 @@ gboolean group_send_data(Group *group, GDBusMethodInvocation *invocation,
 
        g_variant_iter_free(iter);
 
-       ret = mdgd_group_send_data(sender, uuid, channel_id, data, len);
+       ret = mdgd_group_send_data(sender, uuid, channel_id, data, len, &msg_id);
 
-       group_complete_send_data(group, invocation, ret);
+       group_complete_send_data(group, invocation, ret, msg_id);
+
+       g_free(data);
+
+       LOG_END();
+
+       return ret;
+}
+
+gboolean group_send_response(Group *group, GDBusMethodInvocation *invocation,
+       gchar *uuid, gchar *channel_id, gint msg_id, GVariant *params, gpointer user_data)
+{
+       int ret = MDGD_ERROR_NONE;
+       const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
+
+       int length = 0;
+       int len;
+       unsigned char *data;
+       GVariantIter *iter;
+
+       LOG_BEGIN();
+
+       g_variant_get(params, "(iay)", &len, &iter);
+
+       data = g_try_malloc0(len + 1);
+       if (NULL == data) {
+               group_complete_send_response(group, invocation, -1);
+               LOG_ERR("Failed to allocate memory");
+               return TRUE;
+       }
+
+       while (g_variant_iter_loop(iter, "y", &data[length]))
+               length += 1;
+
+       g_variant_iter_free(iter);
+
+       ret = mdgd_group_send_response(sender, uuid, channel_id, msg_id, data, len);
+
+       group_complete_send_response(group, invocation, ret);
 
        g_free(data);
 
@@ -416,6 +455,11 @@ static bool __group_init(GDBusConnection *connection)
                NULL);
 
        g_signal_connect(group_skeleton,
+               "handle-send-response",
+               G_CALLBACK(group_send_response),
+               NULL);
+
+       g_signal_connect(group_skeleton,
                "handle-send-file",
                G_CALLBACK(group_send_file),
                NULL);
index 0082af4..90147a5 100755 (executable)
@@ -240,7 +240,7 @@ int mdgd_group_unregist_channel(char *sender, char *channel_id)
 }
 
 int mdgd_group_send_data(char *sender, char *uuid, char *channel_id,
-                                                unsigned char *data, int len)
+                                                unsigned char *data, int len, int *msg_id)
 {
        int ret;
 
@@ -253,12 +253,15 @@ int mdgd_group_send_data(char *sender, char *uuid, char *channel_id,
                return ret;
        }
 
+       *msg_id = mdgd_util_get_msg_id();
+
        cmd->resource_type = MDGD_RESOURCE_TYPE_DATA;
        cmd->type = MDGD_REQ_SEND_DATA;
        cmd->uuid = g_strdup(uuid);
        cmd->sender = g_strdup(sender);
        cmd->arg1 = g_strdup(channel_id);
-#ifdef SUPPORT_BASE64_ENCODING
+       cmd->msg_id = *msg_id;
+
        cmd->data = g_try_malloc0(len + 1);
        if (NULL == cmd->data) {
                ret = MDGD_ERROR_OUT_OF_MEMORY;
@@ -269,18 +272,6 @@ int mdgd_group_send_data(char *sender, char *uuid, char *channel_id,
 
        memcpy(cmd->data, data, len);
        cmd->data_len = len;
-#else
-       cmd->arg2 = g_try_malloc0(len + 1);
-       if (NULL == cmd->arg2) {
-               ret = MDGD_ERROR_OUT_OF_MEMORY;
-               LOG_ERR("Send Data Fail to uuid = %s error=%s",
-                       cmd->uuid, mdgd_log_get_error_string(ret));
-               return ret;
-       }
-
-       memcpy(cmd->arg2, data, len);
-       cmd->arg2[len] = '\0';
-#endif
 
        ret = mdgd_iot_discovery_resource(cmd->resource_type, cmd);
 
@@ -289,6 +280,15 @@ int mdgd_group_send_data(char *sender, char *uuid, char *channel_id,
        return ret;
 }
 
+int mdgd_group_send_response(char *sender, char *uuid, char *channel_id,
+                                                int msg_id, unsigned char *data, int len)
+{
+       int ret;
+
+       ret = mdgd_iot_send_response(sender, uuid, channel_id, msg_id, data, len, false);
+
+       return ret;
+}
 
 int mdgd_group_request(mdgd_request_type_e type, char *sender, char *uuid,
        char *arg1, char *arg2, char *arg3, void *user_data)
@@ -339,13 +339,13 @@ int mdgd_group_notify_event(char *sender, mdgd_event_type_e type, int result, vo
        case MDGD_EVENT_DEVICE_FIND_FINISH:
        case MDGD_EVENT_INVITE_DEVICE_FINISH:
        case MDGD_EVENT_EJECT_DEVICE_FINISH:
-       case MDGD_EVENT_SEND_DATA_FINISH:
                va = mdgd_create_variant_dummy();
                break;
        case MDGD_EVENT_REQ_CHANNEL_LIST_FINISH:
                va = mdgd_create_variant_channel((mdgd_channel_t *)user_data);
                break;
        case MDGD_EVENT_RECEIVE_DATA:
+       case MDGD_EVENT_SEND_DATA_FINISH:
                va = mdgd_create_variant_data((mdgd_data_t *)user_data);
                break;
        case MDGD_EVENT_RECEIVE_FILE:
index 8379e77..63b5402 100755 (executable)
@@ -18,7 +18,6 @@
 #include <tzplatform_config.h>
 
 #include <utlist.h>
-#include <base64.h>
 #include <sys/utsname.h>
 
 #include <octypes.h>
@@ -193,7 +192,7 @@ int mdgd_iot_initialize()
                OC::ServiceType::InProc,
                        OC::ModeType::Both,
                        (OCTransportAdapter)(OCTransportAdapter::OC_ADAPTER_IP),
-                       OC::QualityOfService::HighQos,
+                       OC::QualityOfService::LowQos,
                        &ps
        };
 
index 4be35d9..626862a 100755 (executable)
@@ -18,7 +18,6 @@
 #include <tzplatform_config.h>
 
 #include <utlist.h>
-#include <base64.h>
 #include <sys/utsname.h>
 
 #include <octypes.h>
@@ -224,6 +223,102 @@ static void __get_group_information(const HeaderOptions& headerOptions,
        LOG_END();
 }
 
+static gboolean _send_data_timeout_cb(gpointer data)
+{
+       int ret = MDGD_ERROR_NONE;
+       mdgd_data_t *send_data = (mdgd_data_t *)data;
+
+       LOG_BEGIN();
+
+       mdgd_context_t *mdgd_ctx = mdgd_context_get_context();
+
+       mdgd_context_mutex_lock();
+
+       LOG_DEBUG("Timeout : Network Unreachable");
+
+       GSList *l;
+       for (l = mdgd_ctx->send_data; l != NULL; l = l->next) {
+               mdgd_data_t *tmp_data_t = (mdgd_data_t *)l->data;
+               if (tmp_data_t->msg_id == send_data->msg_id) {
+                       mdgd_group_notify_event(tmp_data_t->sender, MDGD_EVENT_SEND_DATA_FINISH,
+                               MDGD_ERROR_NETWORK_UNREACHABLE, tmp_data_t);
+
+                       mdgd_ctx->send_data = g_slist_remove_link(mdgd_ctx->send_data, l);
+                       break;
+               }
+       }
+
+       mdgd_context_mutex_unlock();
+
+       LOG_END();
+
+       return false;
+}
+
+static void __send_data_finish(const HeaderOptions&,
+                                        const OCRepresentation& rep, const int eCode,
+                                        void *user_data)
+{
+       int ret = MDGD_ERROR_NONE;
+
+       std::string channel_id, data;
+       int msg_id;
+       char* decoded_data;
+       int decoded_len, data_len = 0;
+       bool time_out;
+       mdgd_data_t *send_data = (mdgd_data_t *)user_data;
+
+       LOG_BEGIN();
+
+       mdgd_context_t *mdgd_ctx = mdgd_context_get_context();
+
+       mdgd_context_mutex_lock();
+
+       if (!rep.getValue("ChannelID", channel_id))
+               LOG_ERR("channel id not found");
+
+       if (!rep.getValue("MsgID", msg_id))
+               LOG_ERR("mdg id not found");
+
+       if (!rep.getValue("Timeout", time_out))
+               LOG_ERR("timeout not found");
+
+       GSList *l;
+       for (l = mdgd_ctx->send_data; l != NULL; l = l->next) {
+               mdgd_data_t *tmp_data_t = (mdgd_data_t *)l->data;
+               if (tmp_data_t->msg_id == msg_id) {
+                       if (time_out == false) {
+                               if (!rep.getValue("Data", data))
+                                       LOG_ERR("data not found");
+
+                               if (!rep.getValue("DataLen", data_len))
+                                       LOG_ERR("data_len not found");
+
+                               mdgd_util_data_decode(data.c_str(), data_len, &decoded_data, &decoded_len);
+
+                               tmp_data_t->data = decoded_data;
+                               tmp_data_t->data_len = decoded_len;
+
+                               LOG_DEBUG("Send data callback : data : %s", decoded_data);
+                       } else {
+                               ret = MDGD_ERROR_NONE;
+                               LOG_DEBUG("Send data callback : Timeout occurs");
+                       }
+
+                       g_source_remove(tmp_data_t->tid);
+
+                       mdgd_group_notify_event(tmp_data_t->sender, MDGD_EVENT_SEND_DATA_FINISH, ret, tmp_data_t);
+
+                       mdgd_ctx->send_data = g_slist_remove_link(mdgd_ctx->send_data, l);
+                       break;
+               }
+       }
+
+       mdgd_context_mutex_unlock();
+
+       LOG_END();
+}
+
 static void __request_finish(const HeaderOptions&,
                                         const OCRepresentation& rep, const int eCode,
                                         void *user_data)
@@ -249,8 +344,6 @@ static void __request_finish(const HeaderOptions&,
                                        channel->channel_id = g_strdup(channel_id.c_str());
                                        mdgd_group_notify_event(cmd->sender, MDGD_EVENT_REQ_CHANNEL_LIST_FINISH, ret, (void *)channel);
                                }
-                       } else if (cmd->type == MDGD_REQ_SEND_DATA) {
-                               mdgd_group_notify_event(cmd->sender, MDGD_EVENT_SEND_DATA_FINISH, ret, NULL);
                        } else if (cmd->type == MDGD_REQ_SEND_FILE) {
                                GError *error = NULL;
                                g_thread_try_new("file_send_thread", __file_send_thread_func, cmd, &error);
@@ -274,25 +367,24 @@ static bool _found_resource(std::shared_ptr<OCResource> resource,
        char *resource_type = NULL;
        mdgd_group_type_e group_type;
        std::string resourceURI;
+       OCRepresentation rep;
 
        mdgd_check_null_ret_error("user_data", user_data, TRUE);
        mdgd_command_t *cmd = (mdgd_command_t *)user_data;
+       mdgd_context_t *mdgd_ctx = mdgd_context_get_context();
 
        LOG_BEGIN();
 
        try {
                if (resource) {
-                       mdgd_context_t *mdgd_ctx = mdgd_context_get_context();
-
-                       LOG_DEBUG("URI [%s], Host [%s], Device ID [%s]",
-                               resource->uri().c_str(), resource->host().c_str(), resource->sid().c_str());
-
                        for(auto &resourceTypes : resource->getResourceTypes()) {
-                               LOG_DEBUG("Resource Type [%s]", resourceTypes.c_str());
                                if (resource_type == NULL)
                                        resource_type = g_strdup(resourceTypes.c_str());
                        }
 
+                       LOG_DEBUG("URI [%s], Host [%s], Device ID [%s], Resource [%s]",
+                               resource->uri().c_str(), resource->host().c_str(), resource->sid().c_str(), resource_type);
+
                        if (g_strcmp0(resource_type,
                                        mdgd_resource_get_type(MDGD_RESOURCE_TYPE_GROUP)) == 0) {
                                mdgd_group_t *group = (mdgd_group_t *)g_try_malloc0(sizeof(mdgd_group_t));
@@ -307,77 +399,90 @@ static bool _found_resource(std::shared_ptr<OCResource> resource,
                                resource->get(QueryParamsMap(), std::bind(&__get_group_information,
                                        std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, group));
                        } else if (g_strcmp0(resource_type,
+                                       mdgd_resource_get_type(MDGD_RESOURCE_TYPE_DEVICE)) == 0 &&
+                                       g_strcmp0(cmd->uuid, resource->sid().c_str()) == 0) {
+                               rep.setValue("CMD", cmd->type);
+                               rep.setValue("DeviceID", std::string(mdgd_ctx->device_uuid));
+                               if (cmd->type == MDGD_REQ_EVENT_INVITED) {
+                                       rep.setValue("Event", std::string("Invited"));
+                               } else if (cmd->type == MDGD_REQ_EVENT_EJECTED) {
+                                       rep.setValue("Event", std::string("Ejected"));
+                               }
+
+                               /*
+                               resource->put(rep, QueryParamsMap(), std::bind (&__send_data_finish,
+                                               std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, send_data));
+                               */
+                       } else if (g_strcmp0(resource_type,
                                        mdgd_resource_get_type(MDGD_RESOURCE_TYPE_DATA)) == 0 &&
                                        g_strcmp0(cmd->uuid, resource->sid().c_str()) == 0) {
-                               OCRepresentation rep;
                                rep.setValue("CMD", cmd->type);
+                               rep.setValue("DeviceID", std::string(mdgd_ctx->device_uuid));
 
-                               mdgd_context_t *mdgd_ctx = mdgd_context_get_context();
-                               rep.setValue("device_id", std::string(mdgd_ctx->device_uuid));
-
-                               LOG_DEBUG("request type is %d", cmd->type);
-                               switch (cmd->type) {
-                               case MDGD_REQ_SEND_FILE:
-                                       rep.setValue("file_path", std::string(cmd->arg1));
-                                       cmd->addr = g_strdup(resource->host().c_str());
-                                       cmd->conn_type = resource->connectivityType();
-
-                                       if (cmd->conn_type & CT_IP_USE_V6) {
-                                               rep.setValue("conn_type", std::string("V6"));
-                                               LOG_DEBUG("The connection type is IPv6");
-                                       } else {
-                                               rep.setValue("conn_type", std::string("V4"));
-                                               LOG_DEBUG("The connection type is IPv4");
-                                       }
+                               if (cmd->type == MDGD_REQ_SEND_DATA) {
+                                       char *encoded_data = NULL;
+                                       int encoded_len = 0;
+
+                                       rep.setValue("ChannelID", std::string(cmd->arg1));
+                                       rep.setValue("MsgID", cmd->msg_id);
 
-                                       break;
-                               case MDGD_REQ_SEND_DATA:
-                               {
-                                       rep.setValue("channel_id", std::string(cmd->arg1));
-#ifdef SUPPORT_BASE64_ENCODING
-                                       uint32_t outSize = 0;
-                                       size_t b64BufSize;
-                                       char *b64Buf;
-
-                                       b64BufSize = B64ENCODE_OUT_SAFESIZE((cmd->data_len + 1));
-                                       b64Buf = (char *) g_try_malloc0(b64BufSize + 1);
-                                       if (NULL == b64Buf) {
-                                               mdgd_clean_user_data(cmd);
-                                               return TRUE;
+                                       mdgd_util_data_encode((const char *)cmd->data, cmd->data_len, &encoded_data, &encoded_len);
+
+                                       rep.setValue("Data", std::string(encoded_data));
+                                       rep.setValue("DataLen", encoded_len);
+
+                                       /* create structure for store the msgID, channel ID */
+                                       mdgd_data_t *send_data = g_new0(mdgd_data_t, 1);
+                                       send_data->sender = g_strdup(cmd->sender);
+                                       send_data->device_id = g_strdup(cmd->uuid);
+                                       send_data->channel_id = g_strdup(cmd->arg1);
+                                       send_data->msg_id = cmd->msg_id;
+                                       send_data->tid = g_timeout_add_seconds(7, _send_data_timeout_cb, send_data);
+
+                                       mdgd_context_mutex_lock();
+                                       mdgd_ctx->send_data = g_slist_prepend(mdgd_ctx->send_data, send_data);
+                                       mdgd_context_mutex_unlock();
+
+                                       resource->post(rep, QueryParamsMap(), std::bind (&__send_data_finish,
+                                               std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, send_data));
+                               } else {
+                                       switch (cmd->type) {
+                                       case MDGD_REQ_SEND_FILE:
+                                               rep.setValue("FilePath", std::string(cmd->arg1));
+                                               cmd->addr = g_strdup(resource->host().c_str());
+                                               cmd->conn_type = resource->connectivityType();
+
+                                               if (cmd->conn_type & CT_IP_USE_V6) {
+                                                       rep.setValue("ConnType", std::string("V6"));
+                                                       LOG_DEBUG("The connection type is IPv6");
+                                               } else {
+                                                       rep.setValue("ConnType", std::string("V4"));
+                                                       LOG_DEBUG("The connection type is IPv4");
+                                               }
+
+                                               break;
+                                       case MDGD_REQ_CREATE_GROUP:
+                                               rep.setValue("GroupName", std::string(cmd->arg1));
+                                               break;
+                                       case MDGD_REQ_INVITE_DEVICE:
+                                               rep.setValue("GroupName", std::string(cmd->arg1));
+                                               rep.setValue("ID", std::string(cmd->arg2));
+                                               rep.setValue("PIN", std::string(cmd->arg3));
+                                               break;
+                                       case MDGD_REQ_EJECT_DEVICE:
+                                               rep.setValue("GroupName", std::string(cmd->arg1));
+                                               rep.setValue("ID", std::string(cmd->arg2));
+                                               break;
+                                       case MDGD_REQ_CHANNEL_LIST:
+                                               break;
+                                       default:
+                                               LOG_ERR("Invalid command %d", cmd->type);
+                                               return FALSE;
                                        }
-                                       b64Encode(cmd->data, cmd->data_len,
-                                               b64Buf, b64BufSize, &outSize);
-                                       rep.setValue("data", std::string(b64Buf));
-                                       rep.setValue("data_length", to_string(outSize));
-                                       LOG_DEBUG("b64BufSize = %d outSize = %d b64Buf = %s",
-                                               b64BufSize, outSize, b64Buf);
-                                       g_free(b64Buf);
-#else
-                                       rep.setValue("data", std::string(cmd->arg2));
-#endif
-                                       break;
-                               }
-                               case MDGD_REQ_CREATE_GROUP:
-                                       rep.setValue("name", std::string(cmd->arg1));
-                                       break;
-                               case MDGD_REQ_INVITE_DEVICE:
-                                       rep.setValue("name", std::string(cmd->arg1));
-                                       rep.setValue("id", std::string(cmd->arg2));
-                                       rep.setValue("PIN", std::string(cmd->arg3));
-                                       break;
-                               case MDGD_REQ_EJECT_DEVICE:
-                                       rep.setValue("name", std::string(cmd->arg1));
-                                       rep.setValue("id", std::string(cmd->arg2));
-                                       break;
-                               case MDGD_REQ_CHANNEL_LIST:
-                                       break;
-                               default:
-                                       LOG_ERR("Invalid command %d", cmd->type);
-                                       return FALSE;
-                               }
 
-                               resource->post(rep, QueryParamsMap(), std::bind (&__request_finish,
-                                       std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, cmd));
+                                       resource->post(rep, QueryParamsMap(), std::bind (&__request_finish,
+                                               std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, cmd));
+                               }
                        }
                }
                else {
index c70739c..3cf9983 100755 (executable)
@@ -18,7 +18,6 @@
 #include <tzplatform_config.h>
 
 #include <utlist.h>
-#include <base64.h>
 #include <sys/utsname.h>
 
 #include <octypes.h>
@@ -59,6 +58,10 @@ using namespace std;
 #define PORT 8675
 #define MAXBUF 1024
 
+typedef struct {
+       std::shared_ptr<OC::OCResourceResponse> pResponse;
+} OCResourceResponse_t;
+
 /* FILE Receive in thread */
 static gpointer __file_receive_thread_func(gpointer user_data)
 {
@@ -70,7 +73,7 @@ static gpointer __file_receive_thread_func(gpointer user_data)
        struct sockaddr_in6 serveraddr_v6, clientaddr_v6;
        char client_ipaddr[INET_ADDRSTRLEN];
        char client_ipaddr_v6[INET6_ADDRSTRLEN];
-       int read_len, file_read_len;
+       int file_read_len;
        socklen_t client_len;
        struct linger ling;
        mdgd_receive_file_t *receive_file = (mdgd_receive_file_t *)user_data;
@@ -166,7 +169,7 @@ static gpointer __file_receive_thread_func(gpointer user_data)
                char buf[MAXBUF] = {0,};
                file_read_len = read(client_sockfd, buf, MAXBUF);
                write(fd, buf, file_read_len);
-               if (file_read_len == EOF | file_read_len == 0) {
+               if (file_read_len == EOF || file_read_len == 0) {
                        LOG_DEBUG("Receive file successful");
                        mdgd_group_notify_event(NULL, MDGD_EVENT_RECEIVE_FILE, MDGD_ERROR_NONE, receive_file);
 
@@ -190,6 +193,83 @@ RECEIVE_THREAD_EXIT:
        return NULL;
 }
 
+int mdgd_iot_send_response(char *sender, char *uuid, char *channel_id,
+                                               int msg_id, unsigned char *data, int data_len, bool timeout)
+{
+       int ret = MDGD_ERROR_NO_DATA;
+
+       LOG_BEGIN();
+
+       mdgd_context_t *mdg_ctx = mdgd_context_get_context();
+
+       mdgd_context_mutex_lock();
+
+       GSList *l;
+       for (l = mdg_ctx->receive_data; l != NULL; l = l->next) {
+               mdgd_data_t *tmp_data_t = (mdgd_data_t *)l->data;
+               if ((tmp_data_t->msg_id == msg_id) &&
+                       g_strcmp0(tmp_data_t->sender, sender) == 0 &&
+                       g_strcmp0(tmp_data_t->device_id, uuid) == 0) {
+
+                       OCResourceResponse_t *response = (OCResourceResponse_t *)tmp_data_t->user_data;
+                       std::shared_ptr<OC::OCResourceResponse> pResponse = response->pResponse;
+                       OCRepresentation responseRep;
+
+                       responseRep.setValue("ChannelID", std::string(tmp_data_t->channel_id));
+                       responseRep.setValue("MsgID", tmp_data_t->msg_id);
+
+                       if (timeout == false) {
+                               char *encoded_data;
+                               int encoded_len;
+
+                               LOG_DEBUG("Response to Sender");
+
+                               mdgd_util_data_encode((const char *)data, data_len, &encoded_data, &encoded_len);
+
+                               responseRep.setValue("Data", std::string(encoded_data));
+                               responseRep.setValue("DataLen", encoded_len);
+                               responseRep.setValue("Timeout", false);
+
+                               g_source_remove(tmp_data_t->tid);
+                       } else {
+                               LOG_DEBUG("Timeout occurs");
+                               responseRep.setValue("Timeout", true);
+                       }
+
+                       pResponse->setResourceRepresentation(responseRep, DEFAULT_INTERFACE);
+
+                       OCPlatform::sendResponse(pResponse);
+                       ret = MDGD_ERROR_NONE;
+
+                       mdg_ctx->receive_data = g_slist_remove_link(mdg_ctx->receive_data, l);
+                       break;
+               }
+       }
+
+       mdgd_context_mutex_unlock();
+
+       LOG_END();
+
+       return ret;
+}
+
+static gboolean _receive_data_timeout_cb(gpointer data)
+{
+       int ret = MDGD_ERROR_NONE;
+       mdgd_data_t *receive_data = (mdgd_data_t *)data;
+
+       LOG_BEGIN();
+
+       ret = mdgd_iot_send_response(receive_data->sender, receive_data->device_id, receive_data->channel_id,
+                                                        receive_data->msg_id, NULL, 0, true);
+       if (ret != MDGD_ERROR_NONE)
+               LOG_ERR("There is not message");
+
+       LOG_END();
+
+       return false;
+}
+
 OCEntityHandlerResult _request_handler(std::shared_ptr<OCResourceRequest> request)
 {
        LOG_BEGIN();
@@ -246,188 +326,210 @@ OCEntityHandlerResult _request_handler(std::shared_ptr<OCResourceRequest> reques
                        } else {
                                LOG_ERR("Unknown Resource URI");
                        }
+
+                       pResponse->setRequestHandle(request->getRequestHandle());
+                       pResponse->setResourceHandle(request->getResourceHandle());
+                       pResponse->setErrorCode(200);
+                       pResponse->setResponseResult(OC_EH_OK);
+                       pResponse->setResourceRepresentation(responseRep, DEFAULT_INTERFACE);
+
+                       LOG_DEBUG("Send response : %d", OC_EH_OK);
+                       OCPlatform::sendResponse(pResponse);
                } else if (requestType == "POST") { /* Request Operation */
-                       unsigned char *arg = NULL;
-                       int arg_len = 0;
-                       int result = MDGD_ERROR_NONE;
-                       int cmd;
-                       std::string requester_id, group_name, uuid, data, data_length, channel_id, file_path, conn_type;
-#ifdef SUPPORT_BASE64_ENCODING
-                       int data_len;
-                       size_t outSize;
-                       uint8_t *out;
-                       uint32_t len = 0;
-#endif
                        try {
+                               int result = MDGD_ERROR_NONE;
+                               int cmd;
+                               std::string requester_id;
+
                                if (!requestRep.getValue("CMD", cmd))
                                        LOG_ERR("CMD not found in representation");
-                               else
-                                       LOG_DEBUG("Command received %d", cmd);
 
-                               if (!requestRep.getValue("device_id", requester_id))
+                               if (!requestRep.getValue("DeviceID", requester_id))
                                        LOG_ERR("device_id not found in representation");
-                               else
-                                       LOG_DEBUG("device_id received %s", requester_id.c_str());
-
-                               switch(cmd) {
-                               case MDGD_REQ_SEND_FILE:
-                               {
-                                       LOG_DEBUG("Receive File");
-                                       if (!requestRep.getValue("file_path", file_path))
-                                               LOG_ERR("CMD not found in representation");
 
-                                       if (!requestRep.getValue("conn_type", conn_type))
-                                               LOG_ERR("conn_type not found in representation");
-
-                                       mdgd_receive_file_t *receive_file = g_new0(mdgd_receive_file_t, 1);
-                                       receive_file->file_path = g_strdup(file_path.c_str());
-                                       receive_file->device_id = g_strdup(requester_id.c_str());
-                                       receive_file->conn_type = g_strdup(conn_type.c_str());
-
-                                       g_thread_try_new("file_receive_thread",
-                                               __file_receive_thread_func, receive_file, NULL);
-
-                                       break;
-                               }
-                               case MDGD_REQ_SEND_DATA:
-                               {
+                               if (cmd == MDGD_REQ_SEND_DATA) {
                                        LOG_DEBUG("Receive Data");
-                                       if (!requestRep.getValue("channel_id", channel_id))
-                                               LOG_ERR("channel id not found");
-
-                                       char *sender = (char *)g_hash_table_lookup(mdgd_ctx->channel, channel_id.c_str());
-
-#ifdef SUPPORT_BASE64_ENCODING
-                                       if (!requestRep.getValue("data", data))
-                                               LOG_ERR("data not found");
 
-                                       if (!requestRep.getValue("data_length", data_length))
-                                               LOG_ERR("data length not found");
-
-                                       /*
-                                        * BASE64 encoding/decoding system use '=' as padding byte
-                                        * But, query parameter does not allow use '=' character.Basically,
-                                        * So, in order to use BASE64 as query parameters, we need additioinal length param
-                                        * such as 'len=xx'
-                                        */
-                                       data_len = atoi(data_length.c_str());
-
-                                       outSize = B64DECODE_OUT_SAFESIZE(data_len + 1);
-                                       out = (uint8_t *)g_try_malloc0(outSize);
-                                       if (NULL == out) {
-                                               LOG_ERR("Can't allocate memory for base64 str");
-                                               return OC_EH_OK;
-                                       }
-
-                                       if (B64_OK != b64Decode(data.c_str(), data_len, out,
-                                                                               outSize, &len)) {
-                                               LOG_ERR("Base64 decoding failed.");
-                                               g_free(out);
-                                               return OC_EH_OK;
-                                       }
+                                       int data_len, decoded_len = 0;
+                                       char *decoded_data = NULL;
+                                       std::string channel_id, data;
+                                       int msg_id;
 
-                                       arg = (unsigned char *) g_try_malloc0(len);
-                                       memcpy(arg, out, len);
-                                       arg_len = len;
+                                       if (!requestRep.getValue("ChannelID", channel_id))
+                                               LOG_ERR("channel_id not found");
 
-                                       g_free(out);
+                                       if (!requestRep.getValue("MsgID", msg_id))
+                                               LOG_ERR("msg_id not found");
 
-                                       LOG_DEBUG("Successfully decoded from base64 : %s", arg);
-#else
-                                       if (!requestRep.getValue("data", data))
+                                       if (!requestRep.getValue("Data", data))
                                                LOG_ERR("data not found");
 
-                                       LOG_DEBUG("Receive Data = %s", data.c_str());
-                                       arg = (unsigned char *)g_strdup(data.c_str());
-                                       arg_len = strlen(data.c_str());
-#endif
-                                       mdgd_data_t *data_t = g_new0(mdgd_data_t, 1);
-                                       data_t->device_id = g_strdup(requester_id.c_str());
-                                       data_t->data = arg;
-                                       data_t->data_length = arg_len;
-                                       data_t->channel_id = g_strdup(channel_id.c_str());
+                                       if (!requestRep.getValue("DataLen", data_len))
+                                               LOG_ERR("data_len not found");
 
-                                       mdgd_group_notify_event(sender, MDGD_EVENT_RECEIVE_DATA, result, data_t);
+                                       mdgd_util_data_decode(data.c_str(), data_len, &decoded_data, &decoded_len);
 
-                                       break;
-                               }
-                               case MDGD_REQ_CREATE_GROUP:
-                                       LOG_DEBUG("Request create group");
-
-                                       result = MDGD_ERROR_NONE;
+                                       char *sender = (char *)g_hash_table_lookup(mdgd_ctx->channel, channel_id.c_str());
 
-                                       if (requestRep.getValue("name", group_name)) {
-                                               LOG_DEBUG("group_name : %s", group_name.c_str());
-                                               result = mdgd_group_create(group_name.c_str());
+                                       mdgd_data_t *receive_data = g_new0(mdgd_data_t, 1);
+                                       receive_data->sender = g_strdup(sender);
+                                       receive_data->device_id = g_strdup(requester_id.c_str());
+                                       receive_data->data = decoded_data;
+                                       receive_data->data_len = decoded_len;
+                                       receive_data->channel_id = g_strdup(channel_id.c_str());
+                                       receive_data->msg_id = msg_id;
+                                       receive_data->tid = g_timeout_add_seconds(5, _receive_data_timeout_cb, receive_data);
+
+                                       OCResourceResponse_t *response = g_new0(OCResourceResponse_t, 1);
+                                       pResponse->setRequestHandle(request->getRequestHandle());
+                                       pResponse->setResourceHandle(request->getResourceHandle());
+                                       pResponse->setErrorCode(200);
+                                       pResponse->setResponseResult(OC_EH_OK);
+                                       response->pResponse = pResponse;
+                                       receive_data->user_data = response;
+
+                                       mdgd_context_mutex_lock();
+                                       mdgd_ctx->receive_data = g_slist_prepend(mdgd_ctx->receive_data, receive_data);
+                                       mdgd_context_mutex_unlock();
+
+                                       mdgd_group_notify_event(sender, MDGD_EVENT_RECEIVE_DATA, result, receive_data);
+                               } else {
+                                       std::string group_name, uuid;
+
+                                       switch(cmd) {
+                                       case MDGD_REQ_SEND_FILE:
+                                       {
+                                               std::string file_path, conn_type;
+                                               LOG_DEBUG("Receive File");
+                                               if (!requestRep.getValue("FilePath", file_path))
+                                                       LOG_ERR("CMD not found in representation");
+
+                                               if (!requestRep.getValue("ConnType", conn_type))
+                                                       LOG_ERR("conn_type not found in representation");
+
+                                               mdgd_receive_file_t *receive_file = g_new0(mdgd_receive_file_t, 1);
+                                               receive_file->file_path = g_strdup(file_path.c_str());
+                                               receive_file->device_id = g_strdup(requester_id.c_str());
+                                               receive_file->conn_type = g_strdup(conn_type.c_str());
+
+                                               g_thread_try_new("file_receive_thread",
+                                                       __file_receive_thread_func, receive_file, NULL);
+
+                                               break;
+                                       }
+                                       case MDGD_REQ_CREATE_GROUP:
+                                               LOG_DEBUG("Request create group");
+
+                                               result = MDGD_ERROR_NONE;
+
+                                               if (requestRep.getValue("GroupName", group_name)) {
+                                                       LOG_DEBUG("group_name : %s", group_name.c_str());
+                                                       result = mdgd_group_create(group_name.c_str());
+                                               }
+                                               break;
+                                       case MDGD_REQ_INVITE_DEVICE:
+                                               LOG_DEBUG("Request invite device");
+
+                                               if (!requestRep.getValue("GroupName", group_name))
+                                                       LOG_ERR("Group name not found");
+                                               if (!requestRep.getValue("ID", uuid))
+                                                       LOG_ERR("UUID not found");
+
+                                               LOG_DEBUG("group name : %s, UUID : %s", group_name.c_str(),
+                                                                 uuid.c_str());
+
+                                               /* find device, and invite this device. */
+                                               /*
+                                               result = mdgd_group_invite_device("tmp", group_name.c_str(),
+                                                       uuid.c_str(), "12341234");
+                                               */
+                                               break;
+                                       case MDGD_REQ_EJECT_DEVICE:
+                                               LOG_DEBUG("Request eject device");
+
+                                               if (!requestRep.getValue("GroupName", group_name))
+                                                       LOG_ERR("Group name not found");
+                                               if (!requestRep.getValue("ID", uuid))
+                                                       LOG_ERR("UUID not found");
+
+                                               LOG_DEBUG("group name : %s Self UUID : %s Target UUID : %s",
+                                                       group_name.c_str(),mdgd_ctx->device_uuid, uuid.c_str());
+
+                                               result = mdgd_group_eject_device("tmp", group_name.c_str(),
+                                                       uuid.c_str());
+                                               break;
+                                       case MDGD_REQ_CHANNEL_LIST:
+                                               LOG_DEBUG("Request channel list");
+                                               GHashTableIter iter;
+                                               char *key;
+
+                                               g_hash_table_iter_init(&iter, mdgd_ctx->channel);
+
+                                               while (g_hash_table_iter_next(&iter, (gpointer *)&key, NULL)) {
+                                                       char *channel_id = g_strdup(key);
+                                                       LOG_DEBUG("Channel ID : %s", channel_id);
+                                                       responseRep.setValue(std::string(channel_id), "NONE");
+                                               }
+
+                                               break;
+                                       default:
+                                               LOG_ERR("Unknown request command %d", cmd);
+                                               break;
                                        }
-                                       break;
-                               case MDGD_REQ_INVITE_DEVICE:
-                                       LOG_DEBUG("Request invite device");
-
-                                       if (!requestRep.getValue("name", group_name))
-                                               LOG_ERR("Group name not found");
-                                       if (!requestRep.getValue("id", uuid))
-                                               LOG_ERR("UUID not found");
 
-                                       LOG_DEBUG("group name : %s, UUID : %s", group_name.c_str(),
-                                                         uuid.c_str());
+                                       pResponse->setRequestHandle(request->getRequestHandle());
+                                       pResponse->setResourceHandle(request->getResourceHandle());
+                                       pResponse->setErrorCode(200);
+                                       pResponse->setResponseResult(OC_EH_OK);
+                                       pResponse->setResourceRepresentation(responseRep, DEFAULT_INTERFACE);
 
-                                       /* find device, and invite this device. */
+                                       LOG_DEBUG("Send response : %d", OC_EH_OK);
+                                       OCPlatform::sendResponse(pResponse);
+                               }
+                       } catch (std::exception& e) {
+                               LOG_ERR("Exception occured %s", e.what());
+                       }
+               }
 
 /*
-                                       result = mdgd_group_invite_device("tmp", group_name.c_str(),
-                                               uuid.c_str(), "12341234");
-*/
-                                       break;
-                               case MDGD_REQ_EJECT_DEVICE:
-                                       LOG_DEBUG("Request eject device");
-
-                                       if (!requestRep.getValue("name", group_name))
-                                               LOG_ERR("Group name not found");
-                                       if (!requestRep.getValue("id", uuid))
-                                               LOG_ERR("UUID not found");
+               else if (requestType == "PUT") {
+                       if (strcmp(resourceUri.c_str(),
+                                       mdgd_resource_get_uri_prefix(MDGD_RESOURCE_TYPE_DEVICE)) == 0) {
 
-                                       LOG_DEBUG("group name : %s Self UUID : %s Target UUID : %s",
-                                                         group_name.c_str(),mdgd_ctx->device_uuid,
-                                                         uuid.c_str());
+                               if (!requestRep.getValue("CMD", cmd))
+                                       LOG_ERR("CMD not found in representation");
+                               else
+                                       LOG_DEBUG("Command received %d", cmd);
 
-                                       result = mdgd_group_eject_device("tmp", group_name.c_str(),
-                                               uuid.c_str());
-                                       break;
-                               case MDGD_REQ_CHANNEL_LIST:
-                                       LOG_DEBUG("Request channel list");
-                                       GHashTableIter iter;
-                                       char *key;
+                               if (!requestRep.getValue("device_id", requester_id))
+                                       LOG_ERR("device_id not found in representation");
+                               else
+                                       LOG_DEBUG("device_id received %s", requester_id.c_str());
 
-                                       g_hash_table_iter_init(&iter, mdgd_ctx->channel);
+                               switch(cmd) {
+                               case MDGD_REQ_EVENT_OCCUR:
+                                       LOG_DEBUG("Request event occur");
+                                       if (!requestRep.getValue("event", event))
+                                               LOG_ERR("Group name not found");
 
-                                       while (g_hash_table_iter_next(&iter, (gpointer *)&key, NULL)) {
-                                               char *channel_id = g_strdup(key);
-                                               LOG_DEBUG("Channel ID : %s", channel_id);
-                                               responseRep.setValue(std::string(channel_id), "NONE");
+                                       if (g_strcmp0(event.c_str(), "INVITED") == 0) {
+                                               mdgd_group_notify_event(NULL, MDGD_EVENT_INVITED, MDGD_ERROR_NONE, NULL);
+                                       } else if (g_strcmp0(event.c_str(), "EJECTED") == 0) {
+                                               mdgd_group_notify_event(NULL, MDGD_EVENT_EJECTED, MDGD_ERROR_NONE, NULL);
                                        }
-
                                        break;
                                default:
                                        LOG_ERR("Unknown request command %d", cmd);
                                        break;
                                }
+                       }
 
-                               g_free(arg);
-                       } catch (std::exception& e) {
-                               LOG_ERR("Exception occured %s", e.what());
                        }
-               } else {
+*/
+               else {
                        LOG_ERR("Invalid Request Type");
                }
 
-               pResponse->setRequestHandle(request->getRequestHandle());
-               pResponse->setResourceHandle(request->getResourceHandle());
-               pResponse->setErrorCode(200);
-               pResponse->setResponseResult(OC_EH_OK);
-               pResponse->setResourceRepresentation(responseRep, DEFAULT_INTERFACE);
-               LOG_DEBUG("Send response : %d", OC_EH_OK);
-               OCPlatform::sendResponse(pResponse);
        }
 
        LOG_END();
index f205e32..42d1621 100755 (executable)
@@ -28,12 +28,12 @@ int main(int argc, char *argv[])
        int ret;
 
        LOG_DEBUG("COMP Manager start");
-
+/*
        if (wait_mount_user() != 0) {
                LOG_ERR("The user data space is not mounted");
                goto EXIT;
        }
-
+*/
        //1. create & get context
        ret = mdgd_context_create();
        if (ret != MDGD_ERROR_NONE) {
index 40e3ce2..f1f9362 100755 (executable)
@@ -16,6 +16,7 @@
  */
 
 #include <mdgd_util.h>
+#include <time.h>
 
 char *mdgd_addr2host(char *addr, int port, bool is_secure)
 {
@@ -213,14 +214,8 @@ GVariant *mdgd_create_variant_data(mdgd_data_t *data)
        GVariant *va;
 
        GVariantBuilder *builder;
-       GVariantBuilder *bytearray_builder = NULL;
        GVariant *params = NULL;
 
-       bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
-       for (int i = 0; i < data->data_length; i++)
-               g_variant_builder_add(bytearray_builder, "(y)", data->data[i]);
-
-       params = g_variant_new("a(y)", bytearray_builder);
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
 
@@ -228,15 +223,26 @@ GVariant *mdgd_create_variant_data(mdgd_data_t *data)
                                                        g_variant_new_string(data->device_id));
        g_variant_builder_add(builder, "{sv}", "ChannelID",
                                                        g_variant_new_string(data->channel_id));
-       g_variant_builder_add(builder, "{sv}", "Data",
-                                                       g_variant_new_variant(params));
-       g_variant_builder_add(builder, "{sv}", "DataLength",
-                                                       g_variant_new_int32(data->data_length));
+       g_variant_builder_add(builder, "{sv}", "MsgID",
+                                                       g_variant_new_int32(data->msg_id));
+
+       if (data->data_len > 0) {
+               GVariantBuilder *bytearray_builder = NULL;
+               bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("a(y)"));
+               for (int i = 0; i < data->data_len; i++)
+                       g_variant_builder_add(bytearray_builder, "(y)", data->data[i]);
+
+               params = g_variant_new("a(y)", bytearray_builder);
+               g_variant_builder_add(builder, "{sv}", "Data",
+                                                               g_variant_new_variant(params));
+               g_variant_builder_add(builder, "{sv}", "DataLen",
+                                                               g_variant_new_int32(data->data_len));
+               g_variant_builder_unref(bytearray_builder);
+       }
 
        va = g_variant_builder_end(builder);
 
        g_variant_builder_unref(builder);
-       g_variant_builder_unref(bytearray_builder);
 
        return va;
 }
@@ -390,3 +396,77 @@ mdgd_device_t *mdgd_get_device_from_variant(GVariant *va)
        return device;
 }
 
+int mdgd_util_get_msg_id()
+{
+       struct timespec tv;
+
+       clock_gettime(CLOCK_REALTIME, &tv);
+
+       return (int)tv.tv_nsec;
+}
+
+void mdgd_util_data_encode(const char *data, int data_len,
+       char **encoded_data, int *encoded_len)
+{
+#ifdef SUPPORT_BASE64_ENCODING
+       size_t out_size;
+       uint8_t *out;
+
+       out_size = B64ENCODE_OUT_SAFESIZE(data_len + 1);
+       out = (char *)g_malloc0(out_size);
+       if (NULL == out) {
+               LOG_ERR("Can't allocate memory for base64 str");
+               return;
+       }
+
+       if (B64_OK != b64Encode(data, data_len, out, out_size, encoded_len)) {
+               LOG_ERR("Base64 encoding failed.");
+               g_free(out);
+               return;
+       }
+
+       *encoded_data = (char *)g_try_malloc0(*encoded_len);
+       memcpy(*encoded_data, out, *encoded_len);
+
+       g_free(out);
+#else
+       *encoded_data = (char *)g_strdup(data);
+       *encoded_len = data_len;
+#endif
+
+       LOG_DEBUG("Successfully encoded %s", *encoded_data);
+}
+
+void mdgd_util_data_decode(const char *data, int data_len,
+       char **decoded_data, int *decoded_len)
+{
+#ifdef SUPPORT_BASE64_ENCODING
+       size_t out_size;
+       uint8_t *out;
+
+       out_size = B64DECODE_OUT_SAFESIZE(data_len + 1);
+       out = (uint8_t *)g_try_malloc0(out_size);
+       if (NULL == out) {
+               LOG_ERR("Can't allocate memory for base64 str");
+               return;
+       }
+
+       if (B64_OK != b64Decode(data, data_len, out, out_size, decoded_len)) {
+               LOG_ERR("Base64 decoding failed.");
+               g_free(out);
+               return;
+       }
+
+       *decoded_data = (char *)g_try_malloc0(*decoded_len);
+       memcpy(*decoded_data, out, *decoded_len);
+
+       g_free(out);
+#else
+       *decoded_data = (char *)g_strdup(data);
+       *decoded_len = data_len;
+#endif
+
+       LOG_DEBUG("Successfully decoded %s", *decoded_data);
+}
+
+
index e5af208..e1f6c6b 100755 (executable)
@@ -1181,6 +1181,7 @@ static void _resources_pairwise_cb(void* ctx, int nOfRes, OCProvisionResult_t* a
                pairwise_ret = MA_ERROR_NONE;
        } else {
                MA_LOGD("Provision pairwise FAILED ");
+               pairwise_ret = nOfRes;
                ma_print_result_list((const OCProvisionResult_t*) arr, nOfRes);
        }
        client->g_doneCB = true;