Add foreach device in group API 19/185019/1
authorJihoon Jung <jh8801.jung@samsung.com>
Wed, 25 Jul 2018 08:25:49 +0000 (17:25 +0900)
committerJihoon Jung <jh8801.jung@samsung.com>
Wed, 25 Jul 2018 08:26:07 +0000 (17:26 +0900)
Signed-off-by: Jihoon Jung <jh8801.jung@samsung.com>
Change-Id: I322aefb47b95a401b584d34fd44b06c54380d2ad

12 files changed:
src/mdg-manager/include/mdgd_db.h
src/mdg-manager/include/mdgd_group.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_db.c
src/mdg-manager/src/mdgd_gdbus.c
src/mdg-manager/src/mdgd_group.c
src/mdg-manager/src/mdgd_iot_server.cpp
src/mdg-manager/src/mdgd_log.c
src/mdg-manager/src/mdgd_mot_agent.c
src/mdg-manager/src/mdgd_util.c

index c70247a0bfeb824d60d9f35e196503cdb38fda9e..0f791ba708af6b1e7431020b8e7430090230ba7b 100755 (executable)
@@ -24,6 +24,7 @@ extern "C"
 #endif
 
 #include <stdbool.h>
+#include <mdgd_typedef.h>
 
 #define MDGD_DB_FILE "/opt/usr/dbspace/.mdgd.db"
 #define MDGD_DB_GROUP_TABLE "mdgd_group"
@@ -32,14 +33,14 @@ extern "C"
 int mdgd_db_init();
 int mdgd_db_deinit();
 int mdgd_db_group_insert(const char *group_name);
-int mdgd_db_device_insert(const char *group_name, const char *device_id);
+int mdgd_db_device_insert(const char *group_name, mdgd_device_t *device);
 int mdgd_db_group_delete(char *group_name);
 int mdgd_db_device_delete(char *group_name, char *device_id);
 bool mdgd_db_check_device_exist(char *device_id);
 bool mdgd_db_check_device_exist_in_group(char *group_name, char *device_id);
 bool mdgd_db_check_group_exist(const char *group_name);
 void mdgd_db_get_groups(char **groups, int *group_count);
-void mdgd_db_get_devices_in_group(char *group_name, char **devices, int *device_count);
+void mdgd_db_get_devices_in_group(char *group_name, mdgd_device_t **devices, int *device_count);
 int mdgd_db_group_print();
 int mdgd_db_device_print();
 
index d82cb8d8dc4ee49e6d688abc39fddcc72c7b467a..2854dd8107c06f69e3a64e6d0b498e651a72e40c 100755 (executable)
@@ -31,7 +31,8 @@ int mdgd_group_delete(const char* name);
 int mdgd_group_find(char *sender, int timeout);
 
 int mdgd_group_find_device(char *sender, int timeout, bool is_invited);
-int mdgd_group_invite_device(char *sender, const char *group_name, const char *uuid, const char *pin);
+int mdgd_group_invite_device(char *sender, const char *group_name,
+       mdgd_device_t *device, const char *pin);
 int mdgd_group_eject_device(char *sender, const char *group_name, const char *uuid);
 
 int mdgd_group_regist_channel(char *sender, char *channel_id);
@@ -40,7 +41,7 @@ int mdgd_group_send_data(char *sender, char *uuid, char *addr, int port, char *c
                                                 unsigned char *data, int len);
 
 /* Group Request to remote */
-int mdgd_group_request_create_group(char *sender, char *uuid, char *addr, int port, char *group_name);
+int mdgd_group_request_create_group(char *sender, char *uuid, char *addr,int port, char *group_name);
 int mdgd_group_request_invite(char *sender, char *uuid, char *addr, int port, char *group_name, char *target_uuid, char *PIN);
 int mdgd_group_request_eject(char *sender, char *uuid, char *addr, int port, char *group_name, char *target_uuid);
 int mdgd_group_request_channel_list(char *sender, char *uuid, char *addr, int port);
index b9203a8818a0469e64c17a42ee58a5f03f96f3f6..8f3f8c74a95cbbcd45751f2cb46e36c4a0b116ba 100755 (executable)
@@ -53,23 +53,16 @@ typedef enum {
        MDGD_ERROR_OUT_OF_MEMORY = TIZEN_ERROR_OUT_OF_MEMORY, /**< Out of memory */
        MDGD_ERROR_PERMISSION_DENIED = TIZEN_ERROR_PERMISSION_DENIED, /**< Permission denied */
        MDGD_ERROR_NOT_SUPPORTED = TIZEN_ERROR_NOT_SUPPORTED, /**< Not supported */
-       MDGD_ERROR_NO_DATA = TIZEN_ERROR_MDG | 0x01, /**< Data not exists */
-       MDGD_ERROR_OPERATION_FAILED = TIZEN_ERROR_MDG | 0x02, /**< operation failed */
+       MDGD_ERROR_OPERATION_FAILED = TIZEN_ERROR_MDG | 0x01, /**< operation failed */
+       MDGD_ERROR_NO_DATA = TIZEN_ERROR_MDG | 0x02, /**< Data not exists */
        MDGD_ERROR_ALREADY_REGISTERED = TIZEN_ERROR_MDG | 0x03, /**< Request already registered */
        MDGD_ERROR_IN_PROGRESS = TIZEN_ERROR_MDG | 0x04,/**< operation is in progress */
        MDGD_ERROR_COMM_ERROR = TIZEN_ERROR_MDG | 0x05, /**< communication error */
-       MDGD_ERROR_PLUGIN_FAIL = TIZEN_ERROR_MDG | 0x08, /**< Plugin failed */
-       MDGD_ERROR_ALREADY_IN_PROGRESS = TIZEN_ERROR_MDG | 0x09, /**< Already in progress */
-       MDGD_ERROR_DB = TIZEN_ERROR_MDG | 0x0A, /**< DB Error */
-       MDGD_ERROR_IOTIVITY = TIZEN_ERROR_MDG | 0x0B, /**< Iotivity Error */
-       MDGD_ERROR_UNKNOWN = -999
-} mdgd_error_e;
+       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 */
+} mdg_error_e;
 
-/**
- * @brief Resource type.
- *
- * @since_tizen 5.0
- */
 typedef enum {
        MDGD_RESOURCE_TYPE_GROUP = 0, /**< Group resource type  */
        MDGD_RESOURCE_TYPE_DEVICE, /**< Device resource type  */
@@ -77,11 +70,6 @@ typedef enum {
        MDGD_RESOURCE_TYPE_MAX
 } mdgd_resource_type_e;
 
-/**
- * @brief Group type.
- *
- * @since_tizen 5.0
- */
 typedef enum {
        MDGD_GROUP_TYPE_LOCAL = 1, /**< Local group type */
        MDGD_GROUP_TYPE_REMOTE = 2, /**< Remote group type */
@@ -92,19 +80,13 @@ typedef enum {
        MDGD_DEVICE_TYPE_REMOTE = 2, /**< Remote group type */
 } mdgd_device_type_e;
 
-/**
- * @brief The command type for request.
- *
- * @since_tizen 5.0
- */
 typedef enum {
-       MDGD_REQ_UNKNOWN_COMMAND = -1, /**< Unknown Command */
-       MDGD_REQ_SEND_DATA = 0, /**< Send data */
-       MDGD_REQ_CREATE_GROUP, /**< Create Group */
+       MDGD_REQ_CREATE_GROUP = 0, /**< Create Group */
        MDGD_REQ_INVITE_DEVICE, /**< Invite Device */
        MDGD_REQ_EJECT_DEVICE, /**< Eject Device */
        MDGD_REQ_CHANNEL_LIST, /**< Channel List */
-       MDGD_REQ_SEND_FILE,
+       MDGD_REQ_SEND_DATA, /**< Send data */
+       MDGD_REQ_SEND_FILE, /**< Send File */
 } mdgd_request_type_e;
 
 typedef enum {
@@ -118,6 +100,7 @@ typedef enum {
        MDGD_EVENT_SEND_DATA_FINISH,
        MDGD_EVENT_REQ_CHANNEL_LIST_FINISH,
        MDGD_EVENT_RECEIVE_DATA,
+       MDGD_EVENT_RECEIVE_FILE,
 } mdgd_event_type_e;
 
 typedef struct {
@@ -144,7 +127,7 @@ typedef struct {
 } mdgd_device_t;
 
 typedef struct {
-       char *device_id; /**< Device Id */
+       char *device_id;
        char *channel_id;
 } mdgd_channel_t;
 
@@ -172,7 +155,7 @@ typedef struct {
        GDBusConnection *connection;
 } mdgd_conn_destroy_data;
 
-typedef struct _mdgd_command_t {
+typedef struct {
        int tid; /**< Timer ID */
        int resource_type; /**< OCF resource type */
        mdgd_request_type_e command; /**< Comments set for group management */
@@ -191,7 +174,7 @@ typedef struct _mdgd_command_t {
        void *user_data;
 } mdgd_command_t;
 
-typedef struct _mdgd_rd_t {
+typedef struct {
        mdgd_resource_type_e resource_type;
        char *type;
        char *uri_prefix;
index 88d23e15535505c0f26e61c7a1071b75f0101138..ce5d1fb9243e5a50647e6427580c9b73932c6f3f 100755 (executable)
@@ -27,12 +27,6 @@ extern "C"
 #include <pmtypes.h>
 #include <mdgd_log.h>
 
-#define LOCAL_IP 1 /**< Local IP */
-#define REMOTE_IP 2 /**< Remote IP */
-
-void mdgd_remove_ip_info(void);
-int mdgd_make_ip_info(void);
-int mdgd_is_local_ip(char *ipdata);
 char *mdgd_addr2host(char *addr, int port, bool is_secure);
 int mdgd_uuid_to_str(const OicUuid_t* uuid, char** strUuid);
 void mdgd_clean_user_data(void *user_data);
@@ -40,7 +34,9 @@ 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_device_list(char *group_name);
 GVariant *mdgd_create_variant_dummy();
+mdgd_device_t *mdg_get_device_from_variant(GVariant *va);
 
 
 #ifdef __cplusplus
index cf634b5a9f4960035f1d82c938b1548bff719043..f660e7472a52c26276447c7d1b4c44f4fa455d44 100755 (executable)
@@ -32,7 +32,7 @@
                </method>
                <method name="InviteDevice">
                        <arg type="s" name="group_name" direction="in"/>
-                       <arg type="s" name="uuid" direction="in"/>
+                       <arg type="a{sv}" name="device_info" direction="in"/>
                        <arg type="s" name="pin" direction="in" />
                        <arg type="i" name="result" direction="out"/>
                </method>
@@ -44,8 +44,9 @@
                <method name="GetLocalDevice">
                        <arg type="a{sv}" name="device_info" direction="out" />
                </method>
-               <method name="GetMemberDevices">
+               <method name="ForeachDevice">
                        <arg type="s" name="group_name" direction="in"/>
+                       <arg type="i" name="result" direction="out" />
                        <arg type="aa{sv}" name="devices" direction="out" />
                </method>
                <method name="RegistChannel">
index 63daca4ea6a010086086ff182db1483b48b7d67e..3075a36fd9a8f570b9f7ea60b24294973b560045 100755 (executable)
@@ -112,7 +112,7 @@ static int __create_device_table()
                return -1;
        }
 
-       sql = sqlite3_mprintf("CREATE TABLE %s(id INTEGER PRIMARY KEY, group_name TEXT, device_id TEXT);",
+       sql = sqlite3_mprintf("CREATE TABLE %s(id INTEGER PRIMARY KEY, group_name TEXT, device_id TEXT, port INTEGER, addr TEXT, conn_type INTEGER, secure_port INTEGER, model_name TEXT, device_name TEXT, platform_ver TEXT, vendor_id TEXT, profile TEXT, is_invited INTEGER, type INTEGER);",
                MDGD_DB_DEVICE_TABLE);
 
        if (sql != NULL) {
@@ -290,7 +290,7 @@ int mdgd_db_group_insert(const char *group_name)
        return ret;
 }
 
-int mdgd_db_device_insert(const char *group_name, const char *device_id)
+int mdgd_db_device_insert(const char *group_name, mdgd_device_t *device)
 {
        int ret = 0;
        int sql_ret;
@@ -306,10 +306,21 @@ int mdgd_db_device_insert(const char *group_name, const char *device_id)
                return -1;
        }
 
-       sql = sqlite3_mprintf("INSERT INTO %s (device_id, group_name) values(%Q, %Q);",
+       sql = sqlite3_mprintf("INSERT INTO %s (group_name, device_id, port, addr, conn_type, secure_port, model_name, device_name, platform_ver, vendor_id, profile, is_invited, type) values(%Q, %Q, %d, %Q, %d, %d, %Q, %Q, %Q, %Q, %Q, %d, %d);",
                MDGD_DB_DEVICE_TABLE,
-               device_id,
-               group_name);
+               group_name,
+               device->device_id,
+               device->port,
+               device->addr,
+               device->conn_type,
+               device->secure_port,
+               device->model_name,
+               device->device_name,
+               device->platform_ver,
+               device->vendor_id,
+               device->profile,
+               device->is_invited,
+               device->type);
 
        if (sql != NULL) {
                sql_ret = sqlite3_exec(mdgd_ctx->db, sql, NULL, NULL, &error);
@@ -606,7 +617,7 @@ void mdgd_db_get_groups(char **groups, int *group_count)
        LOG_END();
 }
 
-void mdgd_db_get_devices_in_group(char *group_name, char **devices, int *device_count)
+void mdgd_db_get_devices_in_group(char *group_name, mdgd_device_t **devices, int *device_count)
 {
        int ret, i = 0;
        char *sql = NULL;
@@ -623,9 +634,23 @@ void mdgd_db_get_devices_in_group(char *group_name, char **devices, int *device_
 
                ret = sqlite3_prepare_v2(mdgd_ctx->db, sql, strlen(sql), &stmt, NULL);
                if (ret == SQLITE_OK) {
-                       while (sqlite3_step(stmt) == SQLITE_ROW)
-                               devices[i++] = g_strdup(sqlite3_column_text(stmt, 2));
-
+                       while (sqlite3_step(stmt) == SQLITE_ROW) {
+                               devices[i] = g_new0(mdgd_device_t, 1);
+                               devices[i]->device_id = g_strdup(sqlite3_column_text(stmt, 2));
+                               devices[i]->port = sqlite3_column_int(stmt, 3);
+                               devices[i]->addr = g_strdup(sqlite3_column_text(stmt, 4));
+                               devices[i]->conn_type = sqlite3_column_int(stmt, 5);
+                               devices[i]->secure_port = sqlite3_column_int(stmt, 6);
+                               devices[i]->model_name = g_strdup(sqlite3_column_text(stmt, 7));
+                               devices[i]->device_name = g_strdup(sqlite3_column_text(stmt, 8));
+                               devices[i]->platform_ver = g_strdup(sqlite3_column_text(stmt, 9));
+                               devices[i]->vendor_id = g_strdup(sqlite3_column_text(stmt, 10));
+                               devices[i]->profile = g_strdup(sqlite3_column_text(stmt, 11));
+                               devices[i]->is_invited = sqlite3_column_int(stmt,12);
+                               devices[i]->type = sqlite3_column_int(stmt, 13);
+
+                               i++;
+                       }
                        sqlite3_finalize(stmt);
                } else {
                        LOG_ERR("sqlite3_prepare_v2 failed, [%d:%s]", ret, sqlite3_errmsg(mdgd_ctx->db));
index 1081f290af173f515d3f9b901579dddfbdfd4a47..d13cd7b73117b85739d1cd431a53451aa1a338a0 100755 (executable)
@@ -41,7 +41,7 @@ gboolean group_create(Group *group, GDBusMethodInvocation *invocation,
 gboolean group_find(Group *group, GDBusMethodInvocation *invocation, gint timeout,
        gpointer user_data)
 {
-       gint result = MDGD_ERROR_UNKNOWN;
+       gint result = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -57,7 +57,7 @@ gboolean group_find(Group *group, GDBusMethodInvocation *invocation, gint timeou
 gboolean group_delete(Group *group, GDBusMethodInvocation *invocation,
        gchar *group_name, gpointer user_data)
 {
-       gint result = MDGD_ERROR_UNKNOWN;
+       gint result = MDGD_ERROR_NONE;
 
        LOG_BEGIN();
 
@@ -72,7 +72,7 @@ gboolean group_delete(Group *group, GDBusMethodInvocation *invocation,
 gboolean group_find_device(Group *group, GDBusMethodInvocation *invocation,
        gint timeout, gint is_invited, gpointer user_data)
 {
-       int result = MDGD_ERROR_UNKNOWN;
+       int result = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -86,14 +86,17 @@ gboolean group_find_device(Group *group, GDBusMethodInvocation *invocation,
 }
 
 gboolean group_invite_device(Group *group, GDBusMethodInvocation *invocation, gchar *group_name,
-       gchar *uuid, gchar *pin, gpointer user_data)
+       GVariant *va, gchar *pin, gpointer user_data)
 {
-       gint result = MDGD_ERROR_UNKNOWN;
+       gint result = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
 
-       result = mdgd_group_invite_device(sender, group_name, uuid, pin);
+       mdgd_device_t *device = mdgd_get_device_from_variant(va);
+
+       result = mdgd_group_invite_device(sender, group_name, device, pin);
+
        group_complete_invite_device(group, invocation, result);
 
        LOG_END();
@@ -104,7 +107,7 @@ gboolean group_invite_device(Group *group, GDBusMethodInvocation *invocation, gc
 gboolean group_eject_device(Group *group, GDBusMethodInvocation *invocation, gchar *group_name,
        gchar *uuid, gpointer user_data)
 {
-       gint result = MDGD_ERROR_UNKNOWN;
+       gint result = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -149,16 +152,17 @@ gboolean group_get_local_channel_list(Group *group,
        return TRUE;
 }
 
-gboolean group_get_member_device_list(Group *group,
-       GDBusMethodInvocation *invocation, gpointer user_data)
+gboolean group_foreach_device(Group *group, GDBusMethodInvocation *invocation,
+       gchar *group_name, gpointer user_data)
 {
-       GVariant *device_data;
+       int ret = MDGD_ERROR_NONE;
+       GVariant *va;
        mdgd_context_t *mdgd_ctx = mdgd_context_get_context();
 
        LOG_BEGIN();
 
-       device_data = mdgd_create_variant_device(mdgd_ctx->device);
-       group_complete_get_local_device(group, invocation, device_data);
+       va = mdgd_create_variant_device_list(group_name);
+       group_complete_foreach_device(group, invocation, ret, va);
 
        LOG_END();
 
@@ -168,7 +172,7 @@ gboolean group_get_member_device_list(Group *group,
 gboolean group_regist_channel(Group *group, GDBusMethodInvocation *invocation,
        gchar *channel_id, gpointer user_data)
 {
-       int ret = MDGD_ERROR_UNKNOWN;
+       int ret = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -185,7 +189,7 @@ gboolean group_regist_channel(Group *group, GDBusMethodInvocation *invocation,
 gboolean group_unregist_channel(Group *group, GDBusMethodInvocation *invocation,
        gchar *channel_id, gpointer user_data)
 {
-       int ret = MDGD_ERROR_UNKNOWN;
+       int ret = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -203,7 +207,7 @@ gboolean group_send_data(Group *group, GDBusMethodInvocation *invocation,
        gchar *uuid, gchar *addr, int port, gchar *channel_id, GVariant *params,
        gpointer user_data)
 {
-       int ret = MDGD_ERROR_UNKNOWN;
+       int ret = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        int length = 0;
@@ -241,7 +245,7 @@ gboolean group_send_data(Group *group, GDBusMethodInvocation *invocation,
 gboolean group_request_create_group(Group *group, GDBusMethodInvocation
        *invocation, gchar *uuid, gchar *addr, int port, gchar *group_name, gpointer user_data)
 {
-       int ret = MDGD_ERROR_UNKNOWN;
+       int ret = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -257,7 +261,7 @@ gboolean group_request_create_group(Group *group, GDBusMethodInvocation
 gboolean group_request_invite(Group *group, GDBusMethodInvocation *invocation,
        gchar *uuid, gchar *addr, int port, gchar *group_name, gchar *target_uuid, gchar *PIN, gpointer user_data)
 {
-       int ret = MDGD_ERROR_UNKNOWN;
+       int ret = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -273,7 +277,7 @@ gboolean group_request_invite(Group *group, GDBusMethodInvocation *invocation,
 gboolean group_request_eject(Group *group, GDBusMethodInvocation *invocation,
        gchar *uuid, gchar *addr, int port, gchar *group_name, gchar *target_uuid, gpointer user_data)
 {
-       int ret = MDGD_ERROR_UNKNOWN;
+       int ret = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -289,7 +293,7 @@ gboolean group_request_eject(Group *group, GDBusMethodInvocation *invocation,
 gboolean group_request_channel_list(Group *group, GDBusMethodInvocation *invocation,
        gchar *uuid, gchar *addr, int port, gpointer user_data)
 {
-       int ret = MDGD_ERROR_UNKNOWN;
+       int ret = MDGD_ERROR_NONE;
        const gchar *sender = g_dbus_method_invocation_get_sender(invocation);
 
        LOG_BEGIN();
@@ -397,8 +401,8 @@ static bool __group_init(GDBusConnection *connection)
                NULL);
 
        g_signal_connect(group_skeleton,
-               "handle-get-member-device-list",
-               G_CALLBACK(group_get_member_device_list),
+               "handle-foreach-device",
+               G_CALLBACK(group_foreach_device),
                NULL);
 
        g_signal_connect(group_skeleton,
index 186a64a36f1bc56e9d52ecde6f064aa6e96c6888..8695c5dbb33e5e3a375b49c033bc64ee2a5e0dde 100755 (executable)
@@ -43,7 +43,7 @@ int mdgd_group_create(const char* name)
 int mdgd_group_delete(const char *name)
 {
        int ret = MDGD_ERROR_NONE;
-       char *devices[256];
+       mdgd_device_t *devices[256];
        int device_count = 0;
 
        LOG_BEGIN();
@@ -53,10 +53,10 @@ int mdgd_group_delete(const char *name)
        /* Get all device in group */
        mdgd_db_get_devices_in_group(name, devices, &device_count);
        for (int i = 0; i < device_count; i++) {
-               mdgd_db_device_delete(name, devices[i]);
+               mdgd_db_device_delete(name, devices[i]->device_id);
 
                if (mdgd_db_check_device_exist(devices[i]) == false)
-                       agent_unpair("tmp", mdgd_ctx->device_uuid, devices[i]);
+                       agent_unpair("tmp", mdgd_ctx->device_uuid, devices[i]->device_id);
        }
 
        /* delete group */
@@ -136,7 +136,8 @@ int mdgd_group_find_device(char *sender, int timeout, bool is_invited)
 
 #define FULL_PERMISSION 31
 
-int mdgd_group_invite_device(char *sender, const char *group_name, const char *uuid, const char *pin)
+int mdgd_group_invite_device(char *sender, const char *group_name,
+       mdgd_device_t *device, const char *pin)
 {
        int ret = MDGD_ERROR_NONE;
 
@@ -145,18 +146,18 @@ int mdgd_group_invite_device(char *sender, const char *group_name, const char *u
        mdgd_context_t *mdgd_ctx = mdgd_context_get_context();
        mdgd_check_null_ret_error("mdgd_ctx", mdgd_ctx, MDGD_ERROR_INVALID_PARAMETER);
 
-       if (mdgd_db_check_device_exist_in_group(group_name, uuid)) {
+       if (mdgd_db_check_device_exist_in_group(group_name, device->device_id)) {
                ret = MDGD_ERROR_ALREADY_REGISTERED;
        } else {
-               if (mdgd_db_check_device_exist(uuid) == false) {
-                       ret = agent_pair(sender, pin, mdgd_ctx->device_uuid, uuid, "/comp/data",
-                                                "core.comp.data", "oic.if.baseline", FULL_PERMISSION, uuid,
+               if (mdgd_db_check_device_exist(device->device_id) == false) {
+                       ret = agent_pair(sender, pin, mdgd_ctx->device_uuid, device->device_id, "/comp/data",
+                                                "core.comp.data", "oic.if.baseline", FULL_PERMISSION, device->device_id,
                                                 mdgd_ctx->device_uuid, "/comp/data", "core.comp.data",
                                                 "oic.if.baseline", FULL_PERMISSION);
                }
 
                if (MDGD_ERROR_NONE == ret)
-                       mdgd_db_device_insert(group_name, uuid);
+                       mdgd_db_device_insert(group_name, device);
        }
 
        LOG_END();
index 34e136070282e5bff5017d3eb09fe47fa48ea1ed..19fadd4b5c7fafd7c727201081ab55e5c88783f0 100755 (executable)
@@ -342,8 +342,12 @@ OCEntityHandlerResult _request_handler(std::shared_ptr<OCResourceRequest> reques
                                        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");
@@ -387,7 +391,6 @@ OCEntityHandlerResult _request_handler(std::shared_ptr<OCResourceRequest> reques
                        LOG_ERR("Invalid Request Type");
                }
 
-               sleep(2);
                pResponse->setRequestHandle(request->getRequestHandle());
                pResponse->setResourceHandle(request->getResourceHandle());
                pResponse->setErrorCode(200);
index 7ab82d0efd2420906890f1a9c12bf1b870541bb8..92ba2fa907a3ad1ebe9a76d01071a35c5db9d896 100755 (executable)
@@ -32,18 +32,22 @@ const char *mdgd_log_get_error_string(int result)
                return "MDGD_ERROR_PERMISSION_DENIED";
        case MDGD_ERROR_NOT_SUPPORTED:
                return "MDGD_ERROR_NOT_SUPPORTED";
-       case MDGD_ERROR_NO_DATA:
-               return "MDGD_ERROR_NO_DATA";
        case MDGD_ERROR_OPERATION_FAILED:
                return "MDGD_ERROR_OPERATION_FAILED";
+       case MDGD_ERROR_NO_DATA:
+               return "MDGD_ERROR_NO_DATA";
+       case MDGD_ERROR_ALREADY_REGISTERED:
+               return "MDGD_ERROR_ALREADY_REGISTERED";
        case MDGD_ERROR_IN_PROGRESS:
                return "MDGD_ERROR_IN_PROGRESS";
        case MDGD_ERROR_COMM_ERROR:
                return "MDGD_ERROR_COMM_ERROR";
        case MDGD_ERROR_PLUGIN_FAIL:
                return "MDGD_ERROR_PLUGIN_FAIL";
-       case MDGD_ERROR_ALREADY_IN_PROGRESS:
-               return "MDGD_ERROR_ALREADY_IN_PROGRESS";
+       case MDGD_ERROR_NOT_STARTED:
+               return "MDGD_ERROR_NOT_STARTED";
+       case MDGD_ERROR_DB:
+               return "MDGD_ERROR_DB";
        default:
                return "UNKNOWN";
        }
index 273767f32daa6828dd464a824ce86d2cdcfc360e..e5868e0ad09d98819cbab7e3b410f7602fadd80f 100755 (executable)
@@ -48,7 +48,7 @@ static int _check_agent_vaild(void)
 int agent_find_mot_enable_devices(char* sender, int timeout)
 {
        GVariant *variant = NULL;
-       int result = MDGD_ERROR_UNKNOWN;
+       int result = MDGD_ERROR_NONE;
        GError *error = NULL;
 
        result = _check_agent_vaild();
@@ -74,7 +74,7 @@ int agent_find_mot_enable_devices(char* sender, int timeout)
 int agent_find_mowned_devices(char* sender, int timeout)
 {
        GVariant *variant = NULL;
-       int result = MDGD_ERROR_UNKNOWN;
+       int result = MDGD_ERROR_NONE;
        GError *error = NULL;
 
        result = _check_agent_vaild();
@@ -266,7 +266,7 @@ static int _create_gdbus_call()
        GError *error = NULL;
 
        if (agent.dbus_connection != NULL)
-               return MDGD_ERROR_ALREADY_IN_PROGRESS;
+               return MDGD_ERROR_IN_PROGRESS;
 
        agent.dbus_connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
        if (NULL == agent.dbus_connection) {
index 7a730744885c28da9121ab92cf1a24c2544543bd..39848ceb96b05c9ca2f9d17f9348f2ea12dc13e6 100755 (executable)
 
 #include <mdgd_util.h>
 
-#define IPV6_ADDR_GLOBAL 0x0000U
-#define IPV6_ADDR_LOOPBACK 0x0010U
-#define IPV6_ADDR_LINKLOCAL 0x0020U
-#define IPV6_ADDR_SITELOCAL 0x0040U
-#define IPV6_ADDR_COMPATv4 0x0080U
-
-typedef struct _ipv4_info_s {
-       char *ifname; /**< Network interface name */
-       char *mac; /**< MAC address */
-       bool active; /**< interface active or not */
-       int mtu; /**< MTU size */
-       char *ip; /**< IPv4 address */
-       char *broadcast; /**< Broadcast address */
-       char *mask; /**< Net-mask */
-} ipv4_info_s;
-
-typedef struct _ipv6_info_s {
-       char *ifname; /**< Network interface name */
-       char *ip; /**< IPv6 address */
-       int prefix; /**< Prefix length  */
-       char *scope; /**< Scope */
-} ipv6_info_s;
-
-typedef struct _ip_info_s {
-       GList *ipv4_list; /**< IPv4 address list */
-       GList *ipv6_list; /**< IPv6 address list */
-} ip_info_s;
-
-ip_info_s g_ip_info; /**< Local IP address list */
-
-static void __free_ipv4_info(gpointer data)
-{
-       ipv4_info_s *ipv4info = (ipv4_info_s *)data;
-       if (NULL == data)
-               return;
-
-       if (ipv4info->ifname) {
-               free(ipv4info->ifname);
-               ipv4info->ifname = NULL;
-       }
-       if (ipv4info->mac) {
-               free(ipv4info->mac);
-               ipv4info->mac = NULL;
-       }
-       if (ipv4info->ip) {
-               free(ipv4info->ip);
-               ipv4info->ip = NULL;
-       }
-       if (ipv4info->broadcast) {
-               free(ipv4info->broadcast);
-               ipv4info->broadcast = NULL;
-       }
-       if (ipv4info->mask) {
-               free(ipv4info->mask);
-               ipv4info->mask = NULL;
-       }
-       free(ipv4info);
-       ipv4info = NULL;
-}
-
-static void __free_ipv6_info(gpointer data)
-{
-       ipv6_info_s *ipv6info = (ipv6_info_s *)data;
-       if (NULL == data)
-               return;
-
-       if (ipv6info->ifname) {
-               free(ipv6info->ifname);
-               ipv6info->ifname = NULL;
-       }
-       if (ipv6info->ip) {
-               free(ipv6info->ip);
-               ipv6info->ip = NULL;
-       }
-       if (ipv6info->scope) {
-               free(ipv6info->scope);
-               ipv6info->scope = NULL;
-       }
-       free(ipv6info);
-       ipv6info = NULL;
-}
-
-void mdgd_remove_ip_info(void)
-{
-       if (g_ip_info.ipv4_list) {
-               g_list_free_full(g_ip_info.ipv4_list, __free_ipv4_info);
-               g_ip_info.ipv4_list = NULL;
-       }
-       if (g_ip_info.ipv6_list) {
-               g_list_free_full(g_ip_info.ipv6_list, __free_ipv6_info);
-               g_ip_info.ipv6_list = NULL;
-       }
-}
-
-static void _parse_inet6(const char *ifname)
-{
-       FILE *f;
-       int scope, prefix;
-       unsigned char ipv6[16];
-       char dname[IFNAMSIZ];
-       char address[INET6_ADDRSTRLEN];
-       char *scopestr;
-
-       f = fopen("/proc/net/if_inet6", "r");
-       if (f == NULL) {
-               LOG_ERR("Failed to access /proc/net/if_inet6");
-               return;
-       }
-
-       while (19 == fscanf(f, " %2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx" \
-               "%2hhx%2hhx%2hhx%2hhx%2hhx %*x %x %x %*x %s",
-               &ipv6[0], &ipv6[1], &ipv6[2], &ipv6[3], &ipv6[4], &ipv6[5], &ipv6[6], &ipv6[7],
-               &ipv6[8], &ipv6[9], &ipv6[10], &ipv6[11], &ipv6[12], &ipv6[13], &ipv6[14],
-               &ipv6[15], &prefix, &scope, dname)) {
-
-               if (strcmp(ifname, dname) != 0)
-                       continue;
-
-               if (inet_ntop(AF_INET6, ipv6, address, sizeof(address)) == NULL)
-                       continue;
-
-               ipv6_info_s *_ipv6 = calloc(1, sizeof(ipv6_info_s));
-               if (NULL == _ipv6) {
-                       LOG_ERR("Memory allocation failed");
-                       goto FINISH_READING_IPV6;
-               }
-               _ipv6->ifname = g_strdup(ifname);
-
-               switch (scope) {
-               case IPV6_ADDR_GLOBAL:
-                       scopestr = "Global";
-                       break;
-               case IPV6_ADDR_LINKLOCAL:
-                       scopestr = "Link";
-                       break;
-               case IPV6_ADDR_SITELOCAL:
-                       scopestr = "Site";
-                       break;
-               case IPV6_ADDR_COMPATv4:
-                       scopestr = "Compat";
-                       break;
-               case IPV6_ADDR_LOOPBACK:
-                       scopestr = "Host";
-                       break;
-               default:
-                       scopestr = "Unknown";
-               }
-               _ipv6->ip = g_strdup(address); /* ex) fe80::212:34ff:fe5a:ec0e */
-               _ipv6->prefix = prefix; /* ex) 64 */
-               _ipv6->scope = g_strdup(scopestr); /* Link */
-
-               g_ip_info.ipv6_list = g_list_append(g_ip_info.ipv6_list, _ipv6);
-       }
-FINISH_READING_IPV6:
-       fclose(f);
-}
-
-static void _parse_ioctl(const char *ifname)
-{
-       int sock;
-       struct ifreq ifr;
-       struct sockaddr_in *ipaddr;
-       char address[INET_ADDRSTRLEN];
-       size_t ifnamelen;
-
-       /* copy ifname to ifr object */
-       ifnamelen = strlen(ifname);
-       if (ifnamelen >= sizeof(ifr.ifr_name))
-               return;
-
-       memcpy(ifr.ifr_name, ifname, ifnamelen);
-       ifr.ifr_name[ifnamelen] = '\0';
-
-       /* open socket */
-       sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
-       if (sock < 0) {
-               LOG_ERR("socket creation faild");
-               return;
-       }
-
-       ipv4_info_s *_ipv4 = calloc(1, sizeof(ipv4_info_s));
-       if (NULL == _ipv4) {
-               LOG_ERR("Memory allocation failed");
-               goto FINISH_READING_IPV4;
-       }
-       _ipv4->ifname = g_strdup(ifname); /* ex) wlan0 */
-
-       /* process mac */
-       if (ioctl(sock, SIOCGIFHWADDR, &ifr) != -1) {
-               char buf[64] = {0,};
-               snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",
-                       ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1],
-                       ifr.ifr_hwaddr.sa_data[2], ifr.ifr_hwaddr.sa_data[3],
-                       ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]);
-                       _ipv4->mac = g_strdup(buf); /* ex) 00:12:34:5a:ec:0e */
-       }
-
-    /* process mtu */
-       if (ioctl(sock, SIOCGIFMTU, &ifr) != -1)
-               _ipv4->mtu = ifr.ifr_mtu; /* ex) 1492 */
-
-       /* die if cannot get address */
-       if (ioctl(sock, SIOCGIFADDR, &ifr) == -1) {
-               _ipv4->active = false;
-               goto FINISH_READING_IPV4;
-       }
-
-       /* process ip */
-       ipaddr = (struct sockaddr_in *)&ifr.ifr_addr;
-       if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL)
-               _ipv4->ip = g_strdup(address); /* ex) 192.168.86.111 */
-
-       /* try to get broadcast */
-       if (ioctl(sock, SIOCGIFBRDADDR, &ifr) != -1) {
-               ipaddr = (struct sockaddr_in *)&ifr.ifr_broadaddr;
-               if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL)
-                       _ipv4->broadcast = g_strdup(address); /* ex) 192.168.86.255 */
-       }
-
-       /* try to get mask */
-       if (ioctl(sock, SIOCGIFNETMASK, &ifr) != -1) {
-               ipaddr = (struct sockaddr_in *)&ifr.ifr_netmask;
-               if (inet_ntop(AF_INET, &ipaddr->sin_addr, address, sizeof(address)) != NULL)
-                       _ipv4->mask = g_strdup(address); /* ex) 255.255.255.0 */
-       }
-FINISH_READING_IPV4:
-       close(sock);
-       g_ip_info.ipv4_list = g_list_append(g_ip_info.ipv4_list, _ipv4);
-}
-
-
-int mdgd_make_ip_info(void)
-{
-       DIR *d;
-       struct dirent *de;
-
-       d = opendir("/sys/class/net/");
-       if (d == NULL) {
-               LOG_ERR("Failed to access /sys/class/net/");
-               return -1;
-       }
-
-       while (NULL != (de = readdir(d))) {
-               if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0)
-               continue;
-
-               _parse_ioctl(de->d_name);
-               _parse_inet6(de->d_name);
-       }
-       closedir(d);
-
-       return 0;
-}
-
-int mdgd_is_local_ip(char *ipdata)
-{
-       char *ip = NULL;
-       char *ifname = NULL;
-       char *save_str = NULL;
-       char *addr = NULL;
-       GList *iter = NULL;
-       ipv6_info_s *ipv6info = NULL;
-       ipv4_info_s *ipv4info = NULL;
-
-       addr = g_strdup(ipdata);
-
-       ip = strtok_r(addr, "%", &save_str);
-       ifname = strtok_r(NULL, "%", &save_str);
-
-       iter = g_list_first(g_ip_info.ipv6_list);
-       while (NULL != iter) {
-               ipv6info = iter->data;
-               if (ipv6info && ipv6info->ip && !strncmp(ipv6info->ip, ip,
-                                                                                                INET6_ADDRSTRLEN)) {
-                       g_free(addr);
-                       return LOCAL_IP;
-               }
-               iter = g_list_next(iter);
-       }
-
-       iter = g_list_first(g_ip_info.ipv4_list);
-       while (NULL != iter) {
-               ipv4info = iter->data;
-               if (ipv4info && ipv4info->ip && !strncmp(ipv4info->ip, ip,
-                                                                                                INET_ADDRSTRLEN)) {
-                       g_free(addr);
-                       return LOCAL_IP;
-               }
-               iter = g_list_next(iter);
-       }
-
-       g_free(addr);
-       return REMOTE_IP;
-}
-
 char *mdgd_addr2host(char *addr, int port, bool is_secure)
 {
        char ip[50];
@@ -415,7 +120,7 @@ void mdgd_clean_user_data(void *user_data)
 
 GVariant *mdgd_create_variant_group(mdgd_group_t *group)
 {
-       GVariant *data;
+       GVariant *va;
 
        GVariantBuilder *builder;
 
@@ -430,16 +135,16 @@ GVariant *mdgd_create_variant_group(mdgd_group_t *group)
        g_variant_builder_add(builder, "{sv}", "Type",
                                                  g_variant_new_int32(group->type));
 
-       data = g_variant_builder_end(builder);
+       va = g_variant_builder_end(builder);
 
        g_variant_builder_unref(builder);
 
-       return data;
+       return va;
 }
 
 GVariant *mdgd_create_variant_device(mdgd_device_t *device)
 {
-       GVariant *data;
+       GVariant *va;
 
        GVariantBuilder *builder;
 
@@ -470,16 +175,16 @@ GVariant *mdgd_create_variant_device(mdgd_device_t *device)
        g_variant_builder_add(builder, "{sv}", "Type",
                                                  g_variant_new_int32(device->type));
 
-       data = g_variant_builder_end(builder);
+       va = g_variant_builder_end(builder);
 
        g_variant_builder_unref(builder);
 
-       return data;
+       return va;
 }
 
 GVariant *mdgd_create_variant_channel(mdgd_channel_t *channel)
 {
-       GVariant *data;
+       GVariant *va;
 
        GVariantBuilder *builder;
 
@@ -490,15 +195,17 @@ GVariant *mdgd_create_variant_channel(mdgd_channel_t *channel)
        g_variant_builder_add(builder, "{sv}", "ChannelID",
                                                  g_variant_new_string(channel->channel_id));
 
-       data = g_variant_builder_end(builder);
+       va = g_variant_builder_end(builder);
 
        g_variant_builder_unref(builder);
 
-       return data;
+       return va;
 }
 
 GVariant *mdgd_create_variant_data(mdgd_data_t *data)
 {
+       GVariant *va;
+
        GVariantBuilder *builder;
        GVariantBuilder *bytearray_builder = NULL;
        GVariant *params = NULL;
@@ -520,26 +227,152 @@ GVariant *mdgd_create_variant_data(mdgd_data_t *data)
        g_variant_builder_add(builder, "{sv}", "DataLength",
                                                        g_variant_new_int32(data->data_length));
 
-       data = g_variant_builder_end(builder);
+       va = g_variant_builder_end(builder);
 
        g_variant_builder_unref(builder);
        g_variant_builder_unref(bytearray_builder);
 
-       return data;
+       return va;
 }
 
+GVariant *mdgd_create_variant_device_list(char *group_name)
+{
+       GVariant *va;
+       GVariantBuilder *builder;
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}"));
+
+       mdgd_device_t *devices[256];
+       int device_count = 0;
+
+       LOG_BEGIN();
+
+       /* Get all device in group */
+       mdgd_db_get_devices_in_group(group_name, devices, &device_count);
+
+       for (int i = 0; i < device_count; i++)
+       {
+               mdgd_device_t *device = devices[i];
+
+               g_variant_builder_open(builder, G_VARIANT_TYPE_VARDICT);
+
+               g_variant_builder_add(builder, "{sv}", "DeviceID",
+                                                         g_variant_new_string(device->device_id));
+               g_variant_builder_add(builder, "{sv}", "Port",
+                                                         g_variant_new_int32(device->port));
+               g_variant_builder_add(builder, "{sv}", "Addr",
+                                                         g_variant_new_string(device->addr));
+               g_variant_builder_add(builder, "{sv}", "ConnType",
+                                                         g_variant_new_int32(device->conn_type));
+               g_variant_builder_add(builder, "{sv}", "SecurePort",
+                                                         g_variant_new_int32(device->secure_port));
+               g_variant_builder_add(builder, "{sv}", "ModelName",
+                                                         g_variant_new_string(device->model_name));
+               g_variant_builder_add(builder, "{sv}", "DeviceName",
+                                                         g_variant_new_string(device->device_name));
+               g_variant_builder_add(builder, "{sv}", "PlatformVer",
+                                                         g_variant_new_string(device->platform_ver));
+               g_variant_builder_add(builder, "{sv}", "VendorID",
+                                                         g_variant_new_string(device->vendor_id));
+               g_variant_builder_add(builder, "{sv}", "Profile",
+                                                         g_variant_new_string(device->profile));
+               g_variant_builder_add(builder, "{sv}", "IsInvited",
+                                                         g_variant_new_int32(device->is_invited));
+               g_variant_builder_add(builder, "{sv}", "Type",
+                                                         g_variant_new_int32(device->type));
+
+               g_variant_builder_close(builder);
+       }
+
+       va = g_variant_builder_end(builder);
+       g_variant_builder_unref(builder);
+
+       return va;
+}
 
 GVariant *mdgd_create_variant_dummy()
 {
-       GVariant *data;
+       GVariant *va;
 
        GVariantBuilder *builder;
 
        builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
-       data = g_variant_builder_end(builder);
+       va = g_variant_builder_end(builder);
 
        g_variant_builder_unref(builder);
 
-       return data;
+       return va;
+}
+
+mdgd_device_t *mdgd_get_device_from_variant(GVariant *va)
+{
+       char *device_id = NULL;
+       char *addr = NULL;
+       int port;
+       int secure_port;
+       int conn_type;
+       char *model_name = NULL;
+       char *device_name = NULL;
+       char *platform_ver = NULL;
+       char *vendor_id = NULL;
+       char *profile = NULL;
+       bool is_invited;
+       int type = MDGD_DEVICE_TYPE_LOCAL;
+       GVariantIter *iter = NULL;
+       const gchar *key;
+       GVariant *key_value = NULL;
+
+       mdgd_device_t *device = calloc(1, sizeof(mdgd_device_t));
+       if (NULL == device) {
+                       /* LCOV_EXCL_START */
+                       LOG_ERR("Memory allocation failed");
+                       return NULL;
+                       /* LCOV_EXCL_STOP */
+       }
+
+       g_variant_get(va, "a{sv}", &iter);
+       while (g_variant_iter_loop(iter, "{sv}", &key, &key_value)) {
+               if (g_strcmp0(key, "DeviceID") == 0)
+                       device_id = (char *)g_variant_get_string(key_value, NULL);
+               else if (g_strcmp0(key, "Addr") == 0)
+                       addr = (char *)g_variant_get_string(key_value, NULL);
+               else if (g_strcmp0(key, "Port") == 0)
+                       port = g_variant_get_int32(key_value);
+               else if (g_strcmp0(key, "SecurePort") == 0)
+                       secure_port = g_variant_get_int32(key_value);
+               else if (g_strcmp0(key, "ConnType") == 0)
+                       conn_type = g_variant_get_int32(key_value);
+               else if (g_strcmp0(key, "ModelName") == 0)
+                       model_name = (char *)g_variant_get_string(key_value, NULL);
+               else if (g_strcmp0(key, "DeviceName") == 0)
+                       device_name = (char *)g_variant_get_string(key_value, NULL);
+               else if (g_strcmp0(key, "PlatformVer") == 0)
+                       platform_ver = (char *)g_variant_get_string(key_value, NULL);
+               else if (g_strcmp0(key, "VendorID") == 0)
+                       vendor_id = (char *)g_variant_get_string(key_value, NULL);
+               else if (g_strcmp0(key, "Profile") == 0)
+                       profile = (char *)g_variant_get_string(key_value, NULL);
+               else if (g_strcmp0(key, "IsInvited") == 0)
+                       is_invited = g_variant_get_int32(key_value);
+               else if (g_strcmp0(key, "Type") == 0)
+                       type = g_variant_get_int32(key_value);
+       }
+
+       device->device_id = g_strdup(device_id);
+       device->addr = g_strdup(addr);
+       device->port = port;
+       device->secure_port = secure_port;
+       device->conn_type = conn_type;
+       device->model_name = g_strdup(model_name);
+       device->device_name = g_strdup(device_name);
+       device->platform_ver = g_strdup(platform_ver);
+       device->vendor_id = g_strdup(vendor_id);
+       device->profile = g_strdup(profile);
+       device->is_invited = is_invited;
+       device->type = type;
+
+       g_variant_iter_free(iter);
+
+       return device;
 }