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, gchar *uuid_dev, gchar *addr, int port,
+int mdgd_group_send_data(char *sender, char *uuid, char *addr, int port, char *channel_id,
unsigned char *data, int len);
/* Group Request to remote */
MDGD_EVENT_REQUEST_FINISH,
MDGD_EVENT_SEND_DATA_FINISH,
MDGD_EVENT_REQ_CHANNEL_LIST_FINISH,
+ MDGD_EVENT_RECEIVE_DATA,
} mdgd_event_type_e;
typedef struct {
char *channel_id;
} mdgd_channel_t;
+typedef struct {
+ char *device_id;
+ char *channel_id;
+ unsigned char *data;
+ int data_length;
+} mdgd_data_t;
+
typedef struct {
GMainLoop *main_loop;
GHashTable *channel;
GVariant *mdgd_create_variant_group(mdgd_group_t *group);
GVariant *mdgd_create_variant_device(mdgd_device_t *device);
GVariant *mdgd_create_variant_channel(mdgd_channel_t *channel);
+GVariant *mdgd_create_variant_data(mdgd_data_t *data);
GVariant *mdgd_create_variant_dummy();
<arg type="s" name="uuid" direction="in" />
<arg type="s" name="addr" direction="in"/>
<arg type="i" name="port" direction="in"/>
+ <arg type="s" name="channel_id" direction="in"/>
<arg type="(iay)" name="data" direction="in"/>
<arg type="i" name="result" direction="out" />
</method>
}
gboolean group_send_data(Group *group, GDBusMethodInvocation *invocation,
- gchar *uuid_dev, gchar *addr, int port, GVariant *params,
+ gchar *uuid, gchar *addr, int port, gchar *channel_id, GVariant *params,
gpointer user_data)
{
int ret = MDGD_ERROR_UNKNOWN;
g_variant_iter_free(iter);
- ret = mdgd_group_send_data(sender, uuid_dev, addr, port, data, len);
+ ret = mdgd_group_send_data(sender, uuid, addr, port, channel_id, data, len);
group_complete_send_data(group, invocation, 0);
return ret;
}
-int mdgd_group_send_data(char *sender, gchar *uuid_dev, gchar *addr, int port,
+int mdgd_group_send_data(char *sender, char *uuid, char *addr, int port, char *channel_id,
unsigned char *data, int len)
{
int ret;
}
cmd->command = MDGD_REQ_SEND_DATA;
- cmd->uuid = g_strdup(uuid_dev);
+ cmd->uuid = g_strdup(uuid);
cmd->sender = g_strdup(sender);
cmd->host = mdgd_addr2host(addr, port, true);
+ cmd->arg1 = g_strdup(channel_id);
#ifdef SUPPORT_BASE64_ENCODING
cmd->data = g_try_malloc0(len + 1);
memcpy(cmd->data, data, len);
cmd->data_len = len;
#else
- cmd->arg1 = g_try_malloc0(len + 1);
+ cmd->arg2 = g_try_malloc0(len + 1);
if (NULL == cmd->arg1) {
ret = MDGD_ERROR_OUT_OF_MEMORY;
LOG_ERR("Send Data Fail to uuid = %s host %s error=%s",
return ret;
}
- memcpy(cmd->arg1, data, len);
- cmd->arg1[len] = '\0';
+ memcpy(cmd->arg2, data, len);
+ cmd->arg2[len] = '\0';
#endif
LOG_DEBUG("UUID %s host %s", cmd->uuid, cmd->host);
case MDGD_EVENT_REQ_CHANNEL_LIST_FINISH:
va = mdgd_create_variant_channel((mdgd_channel_t *)user_data);
break;
+ case MDGD_EVENT_RECEIVE_DATA:
+ va = mdgd_create_variant_data((mdgd_data_t *)user_data);
+ break;
default:
LOG_ERR("Unknown event : %d", type);
break;
#endif
switch (cmd->command) {
case MDGD_REQ_SEND_DATA:
+ rep.setValue("channel_id", std::string(cmd->arg1));
#ifdef SUPPORT_BASE64_ENCODING
b64BufSize = B64ENCODE_OUT_SAFESIZE((cmd->data_len + 1));
b64Buf = (char *) g_try_malloc0(b64BufSize + 1);
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->arg1));
+ rep.setValue("data", std::string(cmd->arg2));
#endif
break;
case MDGD_REQ_CREATE_GROUP:
} else if (requestType == "POST") { /* Request Operation */
unsigned char *arg = NULL;
int arg_len = 0;
- int result;
+ int result = MDGD_ERROR_NONE;
int cmd;
- std::string requester_id, group_name, uuid, data;
+ std::string requester_id, group_name, uuid, data, data_length, channel_id;
#ifdef SUPPORT_BASE64_ENCODING
- int payload_len;
+ int data_len;
size_t outSize;
uint8_t *out;
uint32_t len = 0;
switch(cmd) {
case 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'
*/
- payload_len = strlen(data.c_str()); /* This data may be cliped the last padding 1~2 bytes ('='/'==') */
-
- LOG_DEBUG("data = %s payload_len = %d", data.c_str(),
- payload_len);
+ data_len = atoi(data_length.c_str());
- outSize = B64DECODE_OUT_SAFESIZE(payload_len + 1);
+ 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(), payload_len, out,
+ if (B64_OK != b64Decode(data.c_str(), data_len, out,
outSize, &len)) {
LOG_ERR("Base64 decoding failed.");
g_free(out);
g_free(out);
- LOG_DEBUG("Successfully decoded from base64");
+ LOG_DEBUG("Successfully decoded from base64 : %s", arg);
#else
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 = (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());
+
+ mdgd_group_notify_event(sender, MDGD_EVENT_RECEIVE_DATA, result, data_t);
+
break;
+ }
case MDGD_REQ_CREATE_GROUP:
LOG_DEBUG("Request create group");
if (requestRep.getValue("name", group_name)) {
LOG_DEBUG("group_name : %s", group_name.c_str());
result = mdgd_group_create(group_name.c_str());
- arg = (unsigned char *) g_strdup(group_name.c_str());
- arg_len = strlen(group_name.c_str());
}
break;
case MDGD_REQ_INVITE_DEVICE:
result = mdgd_group_invite_device("tmp", group_name.c_str(),
uuid.c_str(), "12341234");
- arg = (unsigned char *) g_strdup(uuid.c_str());
- arg_len = strlen(uuid.c_str());
break;
case MDGD_REQ_EJECT_DEVICE:
LOG_DEBUG("Request eject device");
result = mdgd_group_eject_device("tmp", group_name.c_str(),
uuid.c_str());
- arg = (unsigned char *) g_strdup(uuid.c_str());
- arg_len = strlen(uuid.c_str());
break;
case MDGD_REQ_CHANNEL_LIST:
LOG_DEBUG("Request channel list");
g_free(arg);
} catch (std::exception& e) {
- LOG_ERR("Exceptioin occured %s", e.what());
+ LOG_ERR("Exception occured %s", e.what());
}
} else {
LOG_ERR("Invalid Request Type");
return data;
}
+GVariant *mdgd_create_variant_data(mdgd_data_t *data)
+{
+ 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}"));
+
+ g_variant_builder_add(builder, "{sv}", "DeviceID",
+ 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));
+
+ data = g_variant_builder_end(builder);
+
+ g_variant_builder_unref(builder);
+ g_variant_builder_unref(bytearray_builder);
+
+ return data;
+}
+
+
GVariant *mdgd_create_variant_dummy()
{
GVariant *data;