Agent: abstraction finished (handover and NDEF)
authorFrederic PAUT <frederic.paut@linux.intel.com>
Mon, 17 Dec 2012 16:01:10 +0000 (17:01 +0100)
committerFrederic PAUT <frederic.paut@linux.intel.com>
Mon, 17 Dec 2012 16:01:10 +0000 (17:01 +0100)
18 files changed:
.gitignore
lib/Makefile.am
lib/interface/org.neard.Agent.xml [moved from lib/interface/org.neard.NDEFAgent.xml with 58% similarity]
lib/neardal.c
lib/neardal.h
lib/neardal_adapter.c
lib/neardal_agent.c [deleted file]
lib/neardal_agent_mgr.c [new file with mode: 0644]
lib/neardal_agent_mgr.h [moved from lib/neardal_agent.h with 64% similarity]
lib/neardal_device.c
lib/neardal_prv.h
lib/neardal_record.c
lib/neardal_tag.c
lib/neardal_tools.c
lib/neardal_tools.h
lib/neardal_traces.c
ncl/ncl.c
ncl/ncl_cmd.c

index 825311a..6d0aa2a 100644 (file)
@@ -10,7 +10,6 @@ Makefile.in
 lib/Makefile
 lib/Makefile.in
 lib/libneardal.la
-lib/neard_*
 neardal.pc
 libtool
 ltmain.sh
@@ -28,6 +27,8 @@ config.*
 *.lo
 *.o
 *kdev4*
+lib/neardal_agent.*
+lib/neard_*
 
 # Specific directories and files in a directory.
 autom4te.cache/*
index 1a740b9..34bc90b 100644 (file)
@@ -3,53 +3,53 @@ neardal_LT_REVISION = 1
 neardal_LT_AGE = 0
 
 #Rule to generate the binding headers
+neardal_agent.h:       interface/org.neard.Agent.xml
+                       gdbus-codegen --generate-c-code neardal_agent \
+                       --c-generate-object-manager \
+                       --c-namespace neardal \
+                       --interface-prefix org.neard. \
+                       $<
+
 neard_adapter_proxy.h:  interface/org.neard.Adapter.xml
-       gdbus-codegen --generate-c-code neard_adapter_proxy \
+                       gdbus-codegen --generate-c-code neard_adapter_proxy \
                        --c-namespace orgNeardAdp \
                        --interface-prefix org.neard.Adapter \
                        $<
 
 neard_device_proxy.h:  interface/org.neard.Device.xml
-       gdbus-codegen --generate-c-code neard_device_proxy \
+                       gdbus-codegen --generate-c-code neard_device_proxy \
                        --c-namespace orgNeardDev \
                        --interface-prefix org.neard.Device \
                        $<
 
 neard_manager_proxy.h:  interface/org.neard.Manager.xml
-       gdbus-codegen --generate-c-code neard_manager_proxy \
+                       gdbus-codegen --generate-c-code neard_manager_proxy \
                        --c-namespace orgNeardMgr \
                        --interface-prefix org.neard.Manager \
                        $<
 
 neard_tag_proxy.h:     interface/org.neard.Tag.xml
-       gdbus-codegen --generate-c-code neard_tag_proxy \
+                       gdbus-codegen --generate-c-code neard_tag_proxy \
                        --c-namespace orgNeardTag \
                        --interface-prefix org.neard.Tag \
                        $<
 
 neard_record_proxy.h:  interface/org.neard.Record.xml
-       gdbus-codegen --generate-c-code neard_record_proxy \
+                       gdbus-codegen --generate-c-code neard_record_proxy \
                        --c-namespace orgNeardRcd \
                        --interface-prefix org.neard.Record \
                        $<
 
-neardal_ndef_agent.h:  interface/org.neard.NDEFAgent.xml
-       gdbus-codegen --generate-c-code neardal_ndef_agent \
-                       --c-generate-object-manager \
-                       --c-namespace neardal \
-                       --interface-prefix org.neard. \
-                       $<
-
-BUILT_SOURCES =        neardal_ndef_agent.h \
-               neard_adapter_proxy.h \
+BUILT_SOURCES =        neard_adapter_proxy.h \
+               neardal_agent.h \
                neard_device_proxy.h \
                neard_manager_proxy.h \
-               neard_tag_proxy.h \
-               neard_record_proxy.h
+               neard_record_proxy.h \
+               neard_tag_proxy.h
 
 neardal_PRV_HDR = \
                neardal_adapter.h \
-               neardal_agent.h \
+               neardal_agent_mgr.h \
                neardal_device.h \
                neardal_manager.h \
                neardal_prv.h \
@@ -66,23 +66,26 @@ dist_neardalheaders_HEADERS =       neardal.h \
                                neardal_errors.h
 
 CLEANFILES =   $(BUILT_SOURCES) \
-               neardal_ndef_agent.c \
+               neardal_agent.c \
                neard_adapter_proxy.c \
                neard_device_proxy.c \
                neard_manager_proxy.c \
                neard_tag_proxy.c \
                neard_record_proxy.c
 
-EXTRA_DIST = interface/org.neard.Manager.xml interface/org.neard.Adapter.xml \
-            interface/org.neard.Tag.xml interface/org.neard.Device.xml \
-            interface/org.neard.Record.xml
+EXTRA_DIST =   interface/org.neard.Adapter.xml \
+               interface/org.neard.Agent.xml \
+               interface/org.neard.Device.xml \
+               interface/org.neard.Manager.xml  \
+               interface/org.neard.Record.xml \
+               interface/org.neard.Tag.xml
 
 lib_LTLIBRARIES =              libneardal.la
 libneardal_la_SOURCES =                neardal.c \
                                neardal_adapter.c \
                                neard_adapter_proxy.c \
                                neardal_agent.c \
-                               neardal_ndef_agent.c \
+                               neardal_agent_mgr.c \
                                neardal_device.c \
                                neard_device_proxy.c \
                                neardal_manager.c \
similarity index 58%
rename from lib/interface/org.neard.NDEFAgent.xml
rename to lib/interface/org.neard.Agent.xml
index 5c9a8e5..e7f9149 100644 (file)
@@ -4,8 +4,18 @@
        <interface name="org.neard.NDEFAgent">
                <method name="GetNDEF">
                        <arg name="values" type="a{sv}" direction="in"/>
+               </method>
+               <method name="Release">
+               </method>
+       </interface>
+       <interface name="org.neard.HandoverAgent">
+               <method name="RequestOOB">
+                       <arg name="values" type="a{sv}" direction="in"/>
                        <arg name="result" type="a{sv}" direction="out"/>
                </method>
+               <method name="PushOOB">
+                       <arg name="values" type="a{sv}" direction="in"/>
+               </method>
                <method name="Release">
                </method>
        </interface>
index 3c3eaa9..feb9931 100644 (file)
@@ -1199,22 +1199,26 @@ exit:
 /*****************************************************************************
  * neardal_agent_set_NDEF_cb: register or unregister a callback to handle a
  * record macthing a registered tag type. This callback will received the
- * whole NDEF as a raw byte stream
+ * whole NDEF as a raw byte stream and the records object paths.
+ * If the callback is null, the agent is unregistered
  ****************************************************************************/
-errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent
-                                     , void *user_data)
+errorCode_t neardal_agent_set_NDEF_cb(char *tagType,
+                                     ndef_agent_cb cb_ndef_agent,
+                                     void *user_data)
 {
        errorCode_t     err     = NEARDAL_ERROR_INVALID_PARAMETER;
        neardal_agent_t agent;
 
 
+       memset(&agent, 0, sizeof(neardal_agent_t));
        if (tagType == NULL)
                goto exit;
        err = NEARDAL_ERROR_NO_MEMORY;
 
-       agent.cb_agent  = cb_agent;
-       agent.pid       = getpid();
-       agent.tagType   = g_strdup(tagType);
+       agent.cb_ndef_agent     = cb_ndef_agent;
+       agent.pid               = getpid();
+       agent.user_data         = user_data;
+       agent.tagType           = g_strdup(tagType);
        { /* replace ':' with '_' */
                int len = strlen(agent.tagType);
                while (len > 0) {
@@ -1223,11 +1227,8 @@ errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent
                        len--;
                }
        }
-       agent.user_data = user_data;
-       agent.objPath   = NULL;
-       agent.objPath = g_strdup_printf("%s/%s/%d", AGENT_PREFIX
-                                       , agent.tagType, agent.pid);
-
+       agent.objPath = g_strdup_printf("%s/%s/%d", AGENT_PREFIX,
+                                       agent.tagType, agent.pid);
        if (agent.objPath == NULL)
                goto exit;
 
@@ -1235,18 +1236,18 @@ errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent
        if (err != NEARDAL_SUCCESS)
                goto exit;
 
-       if (cb_agent != NULL)
+       if (cb_ndef_agent != NULL)
                /* RegisterNDEFAgent */
-               org_neard_mgr__call_register_ndefagent_sync(neardalMgr.proxy
-                                                           , agent.objPath
-                                                           , tagType, NULL
-                                                        , &neardalMgr.gerror);
+               org_neard_mgr__call_register_ndefagent_sync(neardalMgr.proxy,
+                                                            agent.objPath,
+                                                            tagType, NULL,
+                                                       &neardalMgr.gerror);
        else
                /* UnregisterNDEFAgent */
-               org_neard_mgr__call_unregister_ndefagent_sync(neardalMgr.proxy
-                                                           , agent.objPath
-                                                           , tagType, NULL
-                                                        &neardalMgr.gerror);
+               org_neard_mgr__call_unregister_ndefagent_sync(neardalMgr.proxy,
+                                                           agent.objPath,
+                                                           tagType, NULL,
+                                                        &neardalMgr.gerror);
 
 
        if (neardalMgr.gerror != NULL) {
@@ -1266,3 +1267,66 @@ exit:
 
        return err;
 }
+
+/*****************************************************************************
+ * neardal_agent_set_handover_cb: register or unregister two callbacks to
+ * handle handover connection. Two callbacks are used, the first one
+ * (oob_request) is used to get Out Of Band data, the second one (oob_push) is
+ * used to pass remote Out Of Band data.
+ * If one of this callback is null, the agent is unregistered
+ ****************************************************************************/
+errorCode_t neardal_agent_set_handover_cb(oob_push_agent_cb cb_oob_push_agent,
+                                         oob_req_agent_cb  cb_oob_req_agent,
+                                         void *user_data)
+{
+       errorCode_t     err     = NEARDAL_ERROR_INVALID_PARAMETER;
+       neardal_agent_t agent;
+
+
+       err = NEARDAL_ERROR_NO_MEMORY;
+
+       memset(&agent, 0, sizeof(neardal_agent_t));
+       agent.cb_oob_push_agent = cb_oob_push_agent;
+       agent.cb_oob_req_agent  = cb_oob_req_agent;
+       agent.pid               = getpid();
+       agent.user_data         = user_data;
+       agent.objPath           = g_strdup_printf("%s/handover/%d",
+                                                 AGENT_PREFIX, agent.pid);
+       if (agent.objPath == NULL)
+               goto exit;
+
+       err = neardal_handoveragent_prv_manage(agent);
+       if (err != NEARDAL_SUCCESS)
+               goto exit;
+
+       if (cb_oob_push_agent != NULL && cb_oob_req_agent != NULL)
+               /* RegisterNDEFAgent */
+               org_neard_mgr__call_register_handover_agent_sync(
+                                                              neardalMgr.proxy,
+                                                              agent.objPath,
+                                                              NULL,
+                                                          &neardalMgr.gerror);
+       else
+               /* UnregisterNDEFAgent */
+               org_neard_mgr__call_unregister_handover_agent_sync(
+                                                       neardalMgr.proxy,
+                                                       agent.objPath, NULL,
+                                                        &neardalMgr.gerror);
+
+
+       if (neardalMgr.gerror != NULL) {
+               NEARDAL_TRACE_ERR(
+                       "Error with neard dbus method (err:%d:'%s')\n"
+                               , neardalMgr.gerror->code
+                               , neardalMgr.gerror->message);
+               err = NEARDAL_ERROR_DBUS_INVOKE_METHOD_ERROR;
+               goto exit;
+       }
+
+exit:
+       if (err != NEARDAL_SUCCESS)
+               neardal_tools_prv_free_gerror(&neardalMgr.gerror);
+       g_free(agent.objPath);
+
+       return err;
+}
index 5e8d331..75c9b91 100644 (file)
@@ -193,10 +193,49 @@ typedef void (*record_cb) (const char *rcdName, void *user_data);
  * @param ndefLen number of bytes in ndefArray
  * @param user_data Client user data
  **/
-typedef void (*agent_cb) (unsigned char **rcdArray, unsigned int rcdLen
-                         , unsigned char *ndefArray
-                         , unsigned int ndefLen
-                         , void *user_data);
+typedef void (*ndef_agent_cb) (unsigned char **rcdArray, unsigned int rcdLen,
+                              unsigned char *ndefArray, unsigned int ndefLen,
+                              void *user_data);
+
+/**
+ * @brief TODO
+ **/
+typedef void (*freeFunc) (void *ptr);
+
+/**
+ * @brief Callback prototype to get Out Of Band data from the handover agent
+ *
+ * @param blobEIR  EIR blob as described in Bluetooth Core
+ * Specification 4.0 (Vol 3, Part C, chapter 8.1.6). Used by SSP capable
+ * devices
+ * 
+ * @param blobSize EIR blob size (in bytes)
+ * @param oobData used to build a Handover Request or Select message
+ * (oobData* will be never null)
+ * @param oobDataSize Number of bytes returned (oobDataSize* will be never null)
+ * @param freeFunc Free function to release oobData
+ * @param user_data Client user data
+ * @return Out Of Band data (as an array of bytes)
+ **/
+typedef void (*oob_req_agent_cb) (unsigned char *blobEIR,
+                                 unsigned int blobSize,
+                                 unsigned char **oobData,
+                                 unsigned int *oobDataSize, freeFunc *freeF,
+                                 void *user_data);
+
+/**
+ * @brief Callback prototype to to pass remote Out Of Band data to agent to
+ * start handover
+ * 
+ * @param blobEIR  EIR blob as described in Bluetooth Core
+ * Specification 4.0 (Vol 3, Part C, chapter 8.1.6). Used by SSP capable
+ * devices
+ *
+ * @param blobSize EIR blob size (in bytes)
+ * @param user_data Client user data
+ **/
+typedef void (*oob_push_agent_cb) (unsigned char *blobEIR,
+                                  unsigned int blobSize, void *user_data);
 
 
 /* @}*/
@@ -335,7 +374,7 @@ void neardal_free_adapter(neardal_adapter *adapter);
  * @return errorCode_t error code
  **/
 errorCode_t neardal_set_adapter_property(const char *adpName,
-                                          int adpPropId, void *value);
+                                         int adpPropId, void *value);
 
 /*! \fn errorCode_t neardal_set_cb_adapter_added( adapter_cb cb_adp_added,
  *                                          void * user_data)
@@ -384,7 +423,7 @@ errorCode_t neardal_set_cb_adapter_property_changed(
  * @return errorCode_t error code
  **/
 errorCode_t neardal_get_tag_properties(const char *tagName,
-                                          neardal_tag **tag);
+                                      neardal_tag **tag);
 
 /*! \fn errorCode_t neardal_tag_write(neardal_record *record)
  * @brief Write NDEF record to an NFC tag
@@ -412,7 +451,7 @@ void neardal_free_tag(neardal_tag *tag);
  * @return errorCode_t error code
  **/
 errorCode_t neardal_set_cb_tag_found(tag_cb cb_tag_found,
-                                        void *user_data);
+                                    void *user_data);
 
 /*! \fn errorCode_t neardal_set_cb_tag_lost(tag_cb cb_tag_lost,
  * void * user_data)
@@ -424,7 +463,7 @@ errorCode_t neardal_set_cb_tag_found(tag_cb cb_tag_found,
  * @return errorCode_t error code
  **/
 errorCode_t neardal_set_cb_tag_lost(tag_cb cb_tag_lost,
-                                       void *user_data);
+                                   void *user_data);
 
 /*! \fn errorCode_t neardal_get_dev_properties(const char* devName,
  * neardal_dev **dev)
@@ -435,7 +474,7 @@ errorCode_t neardal_set_cb_tag_lost(tag_cb cb_tag_lost,
  * @return errorCode_t error code
  **/
 errorCode_t neardal_get_dev_properties(const char *devName,
-                                          neardal_dev **dev);
+                                      neardal_dev **dev);
 
 /*! \fn errorCode_t neardal_dev_push(neardal_record *record)
  * @brief Create and push NDEF record to an NFC device
@@ -513,17 +552,34 @@ errorCode_t neardal_set_cb_record_found(record_cb cb_rcd_found,
 /*! \fn errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent,
  * void *user_data)
  * @brief register or unregister a callback to handle a record macthing
- * a registered tag type. This callback will received the whole NDEF as
- * a raw byte stream.
+ * a registered tag type. This callback will received the whole NDEF as a raw
+ * byte stream and the records object paths.
+ * If the callback is null, the agent is unregistered.
  * @param tagType tag type to register
  * @param cb_agent Client callback for the registered tag type
  * @param user_data Client user data
  * @return errorCode_t error code
  **/
-errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent
+errorCode_t neardal_agent_set_NDEF_cb(char *tagType
+                                     , ndef_agent_cb cb_ndef_agent
                                      , void *user_data);
 
 
+/*! \fn errorCode_t neardal_agent_set_handover_cb(
+ *                                       oob_push_agent_cb cb_oob_push_agent
+ *                                     , oob_req_agent_cb  cb_oob_req_agent
+                                       , void *user_data)
+ * @brief register or unregister two callbacks to handle handover connection.
+ * If one of this callback is null, the agent is unregistered.
+ * @param cb_oob_push_agent used to pass remote Out Of Band data
+ * @param cb_oob_req_agent used to get Out Of Band data
+ * @param user_data Client user data
+ * @return errorCode_t error code
+ **/
+errorCode_t neardal_agent_set_handover_cb(oob_push_agent_cb cb_oob_push_agent
+                                         , oob_req_agent_cb  cb_oob_req_agent
+                                         , void *user_data);
+
 /*! @fn errorCode_t neardal_free_array(char ***array)
  *
  * @brief free memory used by array of adapters/tags/device or records
index 8d1de76..a0a94bf 100644 (file)
@@ -245,6 +245,7 @@ static void neardal_adp_prv_cb_property_changed(orgNeardAdp *proxy,
                        err = neardal_adp_prv_get_tag(adpProp,
                                                             dbusObjPath,
                                                             &tagProp);
+                       clientValue = dbusObjPath;
                        if (err == NEARDAL_ERROR_NO_TAG) {
                                neardal_adp_prv_cb_tag_found(NULL,
                                                                dbusObjPath,
@@ -292,6 +293,7 @@ static void neardal_adp_prv_cb_property_changed(orgNeardAdp *proxy,
                                                      dbusObjPath,
                                                      &devProp);
                        if (err == NEARDAL_ERROR_NO_DEV) {
+                               clientValue = dbusObjPath;
                                neardal_adp_prv_cb_dev_found(NULL,
                                                             dbusObjPath,
                                                             adpProp);
@@ -422,7 +424,7 @@ exit:
  * neardal_adp_prv_get_tag: Get NFC tag from adapter
  ****************************************************************************/
 errorCode_t neardal_adp_prv_get_tag(AdpProp *adpProp, gchar *tagName,
-                                      TagProp **tagProp)
+                                    TagProp **tagProp)
 {
        errorCode_t     err     = NEARDAL_ERROR_NO_TAG;
        guint           len = 0;
diff --git a/lib/neardal_agent.c b/lib/neardal_agent.c
deleted file mode 100644 (file)
index 51c09ff..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- *     NEARDAL (Neard Abstraction Library)
- *
- *     Copyright 2012 Intel Corporation. All rights reserved.
- *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU Lesser General Public License version 2
- *     as published by the Free Software Foundation.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software Foundation,
- *     Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <glib.h>
-
-#include "neardal.h"
-#include "neardal_prv.h"
-#include "neardal_ndef_agent.h"
-
-static gboolean neardal_agent_prv_remove(gchar *objPath)
-{
-       g_assert(objPath != NULL);
-
-       NEARDAL_TRACEIN();
-       return g_dbus_object_manager_server_unexport(neardalMgr.agentMgr
-                                                    , objPath);
-}
-
-static gboolean on_get_ndef(neardalNDEFAgent           *ndefAgent
-                           , GDBusMethodInvocation     *invocation
-                           , GVariant                  *out
-                           , gpointer                  user_data)
-{
-       neardal_agent_t *agent_data = user_data;
-       gchar           **rcdArray      = NULL;
-       gsize           rcdLen          = 0;
-       gchar           *ndefArray      = NULL;
-       gsize           ndefLen         = 0;
-       gconstpointer  value;
-
-       (void) ndefAgent;       /* Avoid warning */
-       (void) invocation;      /* Avoid warning */
-
-       NEARDAL_TRACEIN();
-       NEARDAL_TRACEF("%s\n", g_variant_print(out, TRUE));
-
-       if (agent_data != NULL) {
-               NEARDAL_TRACEF("ndefAgent pid=%d, obj path is : %s\n"
-                             , agent_data->pid
-                             , agent_data->objPath);
-               if (agent_data->cb_agent != NULL) {
-                       GVariant        *tmpOut         = NULL;
-
-                       tmpOut = g_variant_lookup_value(out, "Records",
-                                                       G_VARIANT_TYPE_ARRAY);
-                       if (tmpOut != NULL) {
-                               rcdArray = (gchar**) g_variant_dup_strv(tmpOut
-                                                               , &rcdLen);
-
-                               if (rcdLen == 0) {
-                                       g_strfreev(rcdArray);
-                                       rcdArray = NULL;
-                               }
-                       }
-                       tmpOut = g_variant_lookup_value(out, "NDEF",
-                                                       G_VARIANT_TYPE_ARRAY);
-                       if (tmpOut != NULL) {
-                               value = g_variant_get_data(tmpOut);
-                               ndefLen = g_variant_get_size(tmpOut);
-
-                               if (ndefLen > 0) {
-                                       ndefArray = g_try_malloc0(ndefLen);
-                                       if (ndefArray != NULL)
-                                               memcpy(ndefArray, value
-                                                     , ndefLen);
-                               }
-                       }
-                       (agent_data->cb_agent)(
-                                       (unsigned char **) rcdArray
-                                       , rcdLen
-                                       , (unsigned char *) ndefArray
-                                       , ndefLen
-                                       , agent_data->user_data);
-               }
-       }
-
-       return TRUE;
-}
-
-static gboolean on_release( neardalNDEFAgent           *ndefAgent
-                          , GDBusMethodInvocation      *invocation
-                          , gpointer                   user_data)
-{
-       neardal_agent_t *agent_data = user_data;
-       NEARDAL_TRACEIN();
-
-       if (invocation != NULL)
-               neardal_ndefagent_complete_release(ndefAgent, invocation);
-       if (agent_data != NULL) {
-               NEARDAL_TRACEF("agent '%s' ",agent_data->objPath);
-
-               if (neardal_agent_prv_remove(agent_data->objPath) == TRUE)
-                       NEARDAL_TRACE("removed\n");
-               else
-                       NEARDAL_TRACE("not removed!\n");
-               g_free(agent_data->objPath);
-               g_free(agent_data->tagType);
-               g_free(agent_data);
-       }
-
-       return TRUE;
-}
-
-static void on_object_removed( GDBusObjectManager *manager
-                             , GDBusObject        *object
-                             , gpointer            user_data)
-{
-       NEARDAL_TRACEIN();
-       (void) manager; /* avoid warning */
-       on_release( NEARDAL_NDEFAGENT(object), NULL, user_data);
-}
-
-static void
-on_name_acquired (GDBusConnection *connection
-                , const gchar     *name
-                , gpointer         user_data)
-{
-       (void) connection;      /* avoid warning */
-       (void) name;            /* avoid warning */
-       (void) user_data;       /* avoid warning */
-       NEARDAL_TRACEIN();
-       NEARDAL_TRACE_LOG(":%s\n", name);
-}
-
-static void
-on_name_lost(GDBusConnection *connection
-            , const gchar     *name
-            , gpointer         user_data)
-{
-       (void) connection;      /* avoid warning */
-       (void) name;            /* avoid warning */
-       (void) user_data;       /* avoid warning */
-       NEARDAL_TRACEIN();
-       NEARDAL_TRACE_LOG(":%s\n", name);
-}
-
-/*****************************************************************************
- * neardal_ndefagent_prv_manage: create or release an agent and register or
- * unregister it with neardal object manager and Neard
- ****************************************************************************/
-errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData)
-{
-       errorCode_t             err = NEARDAL_SUCCESS;
-       neardalObjectSkeleton   *objSkel;
-       neardalNDEFAgent        *ndefAgent;
-       neardal_agent_t         *data;
-
-       NEARDAL_TRACEIN();
-
-       if (agentData.cb_agent != NULL) {
-               data = g_try_malloc0(sizeof(neardal_agent_t));
-               if (data == NULL)
-                       return NEARDAL_ERROR_NO_MEMORY;
-
-               memcpy(data, &agentData, sizeof(neardal_agent_t));
-               data->objPath = g_strdup(agentData.objPath);
-               data->tagType = g_strdup(agentData.tagType);
-
-               NEARDAL_TRACEF("Create agent '%s'\n", data->objPath);
-               objSkel = neardal_object_skeleton_new (data->objPath);
-
-               ndefAgent = neardal_ndefagent_skeleton_new();
-               neardal_object_skeleton_set_ndefagent(objSkel, ndefAgent);
-
-               /* Handle GetNDEF D-Bus method invocations */
-               g_signal_connect ( ndefAgent, "handle-get-ndef"
-                               , G_CALLBACK (on_get_ndef)
-                               , data);
-
-               /* Handle Release D-Bus method invocations */
-               g_signal_connect ( ndefAgent, "handle-release"
-                               , G_CALLBACK (on_release), data);
-
-               g_signal_connect ( neardalMgr.agentMgr, "object-removed"
-                               , G_CALLBACK (on_object_removed), data);
-               g_object_unref (ndefAgent);
-
-               /* Export the object */
-               g_dbus_object_manager_server_export (neardalMgr.agentMgr
-                                       , G_DBUS_OBJECT_SKELETON (objSkel));
-               g_object_unref (objSkel);
-       } else {
-               NEARDAL_TRACEF("Release agent '%s'\n", agentData.objPath);
-               if (neardal_agent_prv_remove(agentData.objPath) == TRUE)
-                       err = NEARDAL_SUCCESS;
-               else
-                       err = NEARDAL_ERROR_DBUS;
-       }
-
-       return err;
-}
-
-/*****************************************************************************
- * neardal_ndefagent_prv_release: unregister an agent from Neard and neardal
- * object manager
- ****************************************************************************/
-errorCode_t neardal_ndefagent_prv_release(gchar *objPath)
-{
-       errorCode_t             err = NEARDAL_SUCCESS;
-
-       if (neardal_agent_prv_remove(objPath) == TRUE)
-               NEARDAL_TRACE("removed\n");
-       else
-               NEARDAL_TRACE("not removed!\n");
-
-       return err;
-}
-
-/*****************************************************************************
- * neardal_agent_acquire_dbus_name: acquire dbus name for management of neard
- *  agent feature
- ****************************************************************************/
-errorCode_t neardal_agent_acquire_dbus_name(void)
-{
-       errorCode_t                     err = NEARDAL_SUCCESS;
-
-       NEARDAL_TRACEIN();
-       if (neardalMgr.conn == NULL)
-               return NEARDAL_ERROR_DBUS;
-
-       neardalMgr.OwnerId = g_bus_own_name_on_connection(neardalMgr.conn
-                               , NEARDAL_DBUS_WELLKNOWN_NAME
-                               , G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
-                                 G_BUS_NAME_OWNER_FLAGS_REPLACE
-                               , on_name_acquired      /* on_name_acquired */
-                               , on_name_lost          /* on_name_lost */
-                               , NULL                  /* user data */
-                               , NULL);        /* freeing user_data func */
-
-       if (neardalMgr.OwnerId == 0) {
-               err = NEARDAL_ERROR_DBUS;
-               goto exit;
-       }
-
-       /* Create a new org.neardal.ObjectManager rooted at /neardal */
-       neardalMgr.agentMgr = g_dbus_object_manager_server_new(AGENT_PREFIX);
-       if (neardalMgr.agentMgr == NULL) {
-               err = NEARDAL_ERROR_DBUS;
-               goto exit;
-       }
-
-       /* Export all objects */
-       g_dbus_object_manager_server_set_connection (neardalMgr.agentMgr
-                                                    , neardalMgr.conn);
-
-
-exit:
-       if (err != NEARDAL_SUCCESS)
-               NEARDAL_TRACE_ERR("(%d:%s)\n", err
-                                 , neardal_error_get_text(err));
-
-       return err;
-}
-
-/*****************************************************************************
- * neardal_agent_stop_owning_dbus_name: Stops owning a dbus name
- ****************************************************************************/
-void neardal_agent_stop_owning_dbus_name(void)
-{
-       NEARDAL_TRACEIN();
-       if (neardalMgr.OwnerId > 0)
-               g_bus_unown_name (neardalMgr.OwnerId);
-       neardalMgr.OwnerId = 0;
-
-}
diff --git a/lib/neardal_agent_mgr.c b/lib/neardal_agent_mgr.c
new file mode 100644 (file)
index 0000000..20290ac
--- /dev/null
@@ -0,0 +1,536 @@
+/*
+ *     NEARDAL (Neard Abstraction Library)
+ *
+ *     Copyright 2012 Intel Corporation. All rights reserved.
+ *
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU Lesser General Public License version 2
+ *     as published by the Free Software Foundation.
+ *
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software Foundation,
+ *     Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <glib.h>
+
+#include "neardal.h"
+#include "neardal_prv.h"
+#include "neardal_agent.h"
+
+static gboolean neardal_agent_prv_remove(gchar *objPath)
+{
+       g_assert(objPath != NULL);
+
+       NEARDAL_TRACEIN();
+       return g_dbus_object_manager_server_unexport(neardalMgr.agentMgr
+                                                    , objPath);
+}
+
+static gboolean on_GetNDEF(neardalNDEFAgent             *ndefAgent,
+                           GDBusMethodInvocation       *invocation
+                           , GVariant                   *values
+                           , gpointer                   user_data)
+{
+       neardal_agent_t *agent_data     = user_data;
+       gchar           **rcdArray      = NULL;
+       gsize           rcdLen          = 0;
+       gchar           *ndefArray      = NULL;
+       gsize           ndefLen         = 0;
+       gconstpointer   value;
+
+       (void) ndefAgent;       /* Avoid warning */
+       (void) invocation;      /* Avoid warning */
+
+       NEARDAL_TRACEIN();
+       NEARDAL_TRACEF("%s\n", g_variant_print(values, TRUE));
+
+       if (agent_data != NULL) {
+               NEARDAL_TRACEF("ndefAgent pid=%d, obj path is : %s\n"
+                             , agent_data->pid
+                             , agent_data->objPath);
+               if (agent_data->cb_ndef_agent != NULL) {
+                       GVariant        *tmpOut  = NULL;
+
+                       tmpOut = g_variant_lookup_value(values, "Records",
+                                                       G_VARIANT_TYPE_ARRAY);
+                       if (tmpOut != NULL) {
+                               rcdArray = (gchar**) g_variant_dup_strv(tmpOut
+                                                               , &rcdLen);
+
+                               if (rcdLen == 0) {
+                                       g_strfreev(rcdArray);
+                                       rcdArray = NULL;
+                               }
+                       }
+                       tmpOut = g_variant_lookup_value(values, "NDEF",
+                                                       G_VARIANT_TYPE_ARRAY);
+                       if (tmpOut != NULL) {
+                               value = g_variant_get_data(tmpOut);
+                               ndefLen = g_variant_get_size(tmpOut);
+
+                               if (ndefLen > 0) {
+                                       ndefArray = g_try_malloc0(ndefLen);
+                                       if (ndefArray != NULL)
+                                               memcpy(ndefArray, value
+                                                     , ndefLen);
+                               }
+                       }
+                       (agent_data->cb_ndef_agent)(
+                                       (unsigned char **) rcdArray
+                                       , rcdLen
+                                       , (unsigned char *) ndefArray
+                                       , ndefLen
+                                       , agent_data->user_data);
+                       g_free(ndefArray);
+                       g_strfreev(rcdArray);
+               }
+       }
+
+       return TRUE;
+}
+
+static gboolean on_RequestOOB(neardalHandoverAgent     *handoverAgent
+                             , GDBusMethodInvocation   *invocation
+                             , GVariant                *values
+                             , gpointer                user_data)
+{
+       neardal_agent_t *agent_data     = user_data;
+       unsigned char   *oobData        = NULL;
+       unsigned int    oobDataLen      = 0;
+       void            (*freeFunc)(void * ptr);
+       gchar           *blobKey;
+       gchar           *blob           = NULL;
+       gsize           blobLen         = 0;
+       gconstpointer   value;
+       GVariant        *result;
+       errorCode_t     err = NEARDAL_ERROR_GENERAL_ERROR;
+
+       (void) handoverAgent;       /* Avoid warning */
+       (void) invocation;      /* Avoid warning */
+
+       NEARDAL_TRACEIN();
+       NEARDAL_TRACEF("%s\n", g_variant_print(values, TRUE));
+
+       if (agent_data != NULL) {
+               freeFunc = NULL;
+               NEARDAL_TRACEF("handoverAgent pid=%d, obj path is : %s\n"
+                             , agent_data->pid
+                             , agent_data->objPath);
+               if (agent_data->cb_oob_req_agent != NULL) {
+                       GVariant        *tmpOut  = NULL;
+
+                       blobKey = "EIR";
+                       tmpOut = g_variant_lookup_value(values, blobKey,
+                                                       G_VARIANT_TYPE_ARRAY);
+                       if (tmpOut != NULL) {
+                               value = g_variant_get_data(tmpOut);
+                               blobLen = g_variant_get_size(tmpOut);
+
+                               if (blobLen > 0) {
+                                       blob = g_try_malloc0(blobLen);
+                                       if (blob != NULL)
+                                               memcpy(blob, value
+                                                     , blobLen);
+                               }
+                       } else  {
+                               blobKey = "nokia.com:bt";
+                               tmpOut = g_variant_lookup_value(values,
+                                                                blobKey,
+                                                       G_VARIANT_TYPE_ARRAY);
+                               if (tmpOut != NULL) {
+                                       value = g_variant_get_data(tmpOut);
+                                       blobLen = g_variant_get_size(tmpOut);
+
+                                       if (blobLen > 0) {
+                                               blob = g_try_malloc0(blobLen);
+                                               if (blob != NULL)
+                                                       memcpy(blob, value
+                                                       , blobLen);
+                                       }
+                               }
+                       }
+                       (agent_data->cb_oob_req_agent)(
+                                                       (unsigned char *) blob
+                                                      , blobLen
+                                                      , &oobData
+                                                      , &oobDataLen
+                                                      , &freeFunc
+                                               , agent_data->user_data);
+                       if (oobData != NULL) {
+                               GVariantBuilder *dictBuilder            = NULL;
+                               
+                               dictBuilder = g_variant_builder_new(
+                                                       G_VARIANT_TYPE_ARRAY);
+                               err = neardal_tools_prv_add_dict_entry(
+                                                               dictBuilder,
+                                               blobKey, oobData, oobDataLen
+                                                                       , -1);
+                               result = g_variant_builder_end(dictBuilder);
+                               
+                               NEARDAL_TRACE_LOG("Sending:\n%s\n",
+                                                 g_variant_print(result
+                                                                 , TRUE));
+                               
+                               neardal_handover_agent_complete_request_oob(
+                                                               handoverAgent
+                                                               , invocation
+                                                               , result);
+                               err = NEARDAL_SUCCESS;
+                       }
+               }
+       }
+
+       if (freeFunc != NULL && oobData != NULL)
+               (freeFunc)(oobData);
+       if (blob != NULL)
+               g_free(blob);
+
+       if (err != NEARDAL_SUCCESS)
+               g_dbus_method_invocation_return_error(invocation
+                                                     , G_DBUS_ERROR_FAILED
+                                                     , G_DBUS_ERROR_FAILED
+                                               , neardal_error_get_text(err));
+       
+       return TRUE;
+}
+
+static gboolean on_PushOOB(neardalHandoverAgent        *handoverAgent
+                          , GDBusMethodInvocation      *invocation
+                          , GVariant                   *values
+                          , gpointer                   user_data)
+{
+       neardal_agent_t *agent_data = user_data;
+       gconstpointer   value;
+       gchar           *blobKey;
+       gchar           *blob           = NULL;
+       gsize           blobLen         = 0;
+
+       (void) handoverAgent;       /* Avoid warning */
+       (void) invocation;      /* Avoid warning */
+
+       NEARDAL_TRACEIN();
+       NEARDAL_TRACEF("%s\n", g_variant_print(values, TRUE));
+
+       if (agent_data != NULL) {
+               NEARDAL_TRACEF("handoverAgent pid=%d, obj path is : %s\n"
+                             , agent_data->pid
+                             , agent_data->objPath);
+               if (agent_data->cb_oob_push_agent != NULL) {
+                       GVariant        *tmpOut  = NULL;
+
+                       blobKey = "EIR";
+                       tmpOut = g_variant_lookup_value(values, blobKey,
+                                                       G_VARIANT_TYPE_ARRAY);
+                       if (tmpOut != NULL) {
+                               value = g_variant_get_data(tmpOut);
+                               blobLen = g_variant_get_size(tmpOut);
+
+                               if (blobLen > 0) {
+                                       blob = g_try_malloc0(blobLen);
+                                       if (blob != NULL)
+                                               memcpy(blob, value
+                                                     , blobLen);
+                               }
+                       } else  {
+                               blobKey = "nokia.com:bt";
+                               tmpOut = g_variant_lookup_value(values,
+                                                                blobKey,
+                                                       G_VARIANT_TYPE_ARRAY);
+                               if (tmpOut != NULL) {
+                                       value = g_variant_get_data(tmpOut);
+                                       blobLen = g_variant_get_size(tmpOut);
+
+                                       if (blobLen > 0) {
+                                               blob = g_try_malloc0(blobLen);
+                                               if (blob != NULL)
+                                                       memcpy(blob, value
+                                                       , blobLen);
+                                       }
+                               }
+                       }
+                       (agent_data->cb_oob_push_agent)(
+                                                       (unsigned char *) blob
+                                                      , blobLen
+                                               , agent_data->user_data);
+               }
+       }
+
+       return TRUE;
+}
+
+static gboolean on_Release( neardalNDEFAgent           *agent
+                          , GDBusMethodInvocation      *invocation
+                          , gpointer                   user_data)
+{
+       neardal_agent_t *agent_data = user_data;
+       NEARDAL_TRACEIN();
+
+       if (invocation != NULL)
+               neardal_ndefagent_complete_release(agent, invocation);
+       if (agent_data != NULL) {
+               NEARDAL_TRACEF("agent '%s' ",agent_data->objPath);
+
+               if (neardal_agent_prv_remove(agent_data->objPath) == TRUE)
+                       NEARDAL_TRACE("removed\n");
+               else
+                       NEARDAL_TRACE("not removed!\n");
+               g_free(agent_data->objPath);
+               g_free(agent_data->tagType);
+               g_free(agent_data);
+       }
+
+       return TRUE;
+}
+
+static void on_object_removed( GDBusObjectManager *manager
+                             , GDBusObject        *object
+                             , gpointer            user_data)
+{
+       NEARDAL_TRACEIN();
+       (void) manager; /* avoid warning */
+       on_Release( NEARDAL_NDEFAGENT(object), NULL, user_data);
+}
+
+static void
+on_name_acquired (GDBusConnection *connection
+                , const gchar     *name
+                , gpointer         user_data)
+{
+       (void) connection;      /* avoid warning */
+       (void) name;            /* avoid warning */
+       (void) user_data;       /* avoid warning */
+       NEARDAL_TRACEIN();
+       NEARDAL_TRACE_LOG(":%s\n", name);
+}
+
+static void
+on_name_lost(GDBusConnection *connection
+            , const gchar     *name
+            , gpointer         user_data)
+{
+       (void) connection;      /* avoid warning */
+       (void) name;            /* avoid warning */
+       (void) user_data;       /* avoid warning */
+       NEARDAL_TRACEIN();
+       NEARDAL_TRACE_LOG(":%s\n", name);
+}
+
+/*****************************************************************************
+ * neardal_ndefagent_prv_manage: create or release an agent and register or
+ * unregister it with neardal object manager and Neard
+ ****************************************************************************/
+errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData)
+{
+       errorCode_t             err = NEARDAL_SUCCESS;
+       neardalObjectSkeleton   *objSkel;
+       neardalNDEFAgent        *ndefAgent;
+       neardal_agent_t         *data;
+
+       NEARDAL_TRACEIN();
+
+       if (agentData.cb_ndef_agent != NULL) {
+               data = g_try_malloc0(sizeof(neardal_agent_t));
+               if (data == NULL)
+                       return NEARDAL_ERROR_NO_MEMORY;
+
+               memcpy(data, &agentData, sizeof(neardal_agent_t));
+               data->objPath = g_strdup(agentData.objPath);
+               data->tagType = g_strdup(agentData.tagType);
+
+               NEARDAL_TRACEF("Create agent '%s'\n", data->objPath);
+               objSkel = neardal_object_skeleton_new (data->objPath);
+
+               ndefAgent = neardal_ndefagent_skeleton_new();
+               neardal_object_skeleton_set_ndefagent(objSkel, ndefAgent);
+
+               /* Handle GetNDEF D-Bus method invocations */
+               g_signal_connect ( ndefAgent, "handle-get-ndef"
+                               , G_CALLBACK (on_GetNDEF)
+                               , data);
+
+               /* Handle Release D-Bus method invocations */
+               g_signal_connect ( ndefAgent, "handle-release"
+                               , G_CALLBACK (on_Release), data);
+
+               g_signal_connect ( neardalMgr.agentMgr, "object-removed"
+                               , G_CALLBACK (on_object_removed), data);
+               g_object_unref (ndefAgent);
+
+               /* Export the object */
+               g_dbus_object_manager_server_export (neardalMgr.agentMgr
+                                       , G_DBUS_OBJECT_SKELETON (objSkel));
+               g_object_unref (objSkel);
+       } else {
+               NEARDAL_TRACEF("Release agent '%s'\n", agentData.objPath);
+               if (neardal_agent_prv_remove(agentData.objPath) == TRUE)
+                       err = NEARDAL_SUCCESS;
+               else
+                       err = NEARDAL_ERROR_DBUS;
+               g_free(agentData.objPath);
+               g_free(agentData.tagType);
+       }
+
+       return err;
+}
+
+/*****************************************************************************
+ * neardal_ndefagent_prv_release: unregister an agent from Neard and neardal
+ * object manager
+ ****************************************************************************/
+errorCode_t neardal_ndefagent_prv_release(gchar *objPath)
+{
+       errorCode_t             err = NEARDAL_SUCCESS;
+
+       if (neardal_agent_prv_remove(objPath) == TRUE)
+               NEARDAL_TRACE("removed\n");
+       else
+               NEARDAL_TRACE("not removed!\n");
+
+       return err;
+}
+
+/*****************************************************************************
+ * neardal_handoveragent_prv_manage: create or release an agent and register
+ * or unregister it with neardal object manager and Neard
+ ****************************************************************************/
+errorCode_t neardal_handoveragent_prv_manage(neardal_agent_t agentData)
+{
+        errorCode_t            err = NEARDAL_SUCCESS;
+        neardalObjectSkeleton  *objSkel;
+        neardalHandoverAgent   *handoverAgent;
+        neardal_agent_t                *data;
+
+        NEARDAL_TRACEIN();
+
+        if (agentData.cb_oob_push_agent != NULL &&
+           agentData.cb_oob_req_agent != NULL) {
+                data = g_try_malloc0(sizeof(neardal_agent_t));
+                if (data == NULL)
+                        return NEARDAL_ERROR_NO_MEMORY;
+
+                memcpy(data, &agentData, sizeof(neardal_agent_t));
+                data->objPath = g_strdup(agentData.objPath);
+
+                NEARDAL_TRACEF("Create agent '%s'\n", data->objPath);
+                objSkel = neardal_object_skeleton_new (data->objPath);
+
+                handoverAgent = neardal_handover_agent_skeleton_new();
+                neardal_object_skeleton_set_handover_agent(objSkel,
+                                                          handoverAgent);
+
+                /* Handle RequestOOB() D-Bus method invocations */
+                g_signal_connect ( handoverAgent, "handle-request-oob"
+                                , G_CALLBACK (on_RequestOOB)
+                                , data);
+
+                /* Handle PushOOB() D-Bus method invocations */
+                g_signal_connect ( handoverAgent, "handle-push-oob"
+                                , G_CALLBACK (on_PushOOB)
+                                , data);
+
+                /* Handle Release D-Bus method invocations */
+                g_signal_connect ( handoverAgent, "handle-release"
+                                , G_CALLBACK (on_Release), data);
+
+                g_signal_connect ( neardalMgr.agentMgr, "object-removed"
+                                , G_CALLBACK (on_object_removed), data);
+                g_object_unref (handoverAgent);
+
+                /* Export the object */
+                g_dbus_object_manager_server_export (neardalMgr.agentMgr
+                                        , G_DBUS_OBJECT_SKELETON (objSkel));
+                g_object_unref (objSkel);
+        } else {
+                NEARDAL_TRACEF("Release agent '%s'\n", agentData.objPath);
+                if (neardal_agent_prv_remove(agentData.objPath) == TRUE)
+                        err = NEARDAL_SUCCESS;
+                else
+                        err = NEARDAL_ERROR_DBUS;
+        }
+
+        return err;
+}
+
+/*****************************************************************************
+ * neardal_handoveragent_prv_release: unregister an agent from Neard and neardal
+ * object manager
+ ****************************************************************************/
+errorCode_t neardal_handoveragent_prv_release(gchar *objPath)
+{
+        errorCode_t             err = NEARDAL_SUCCESS;
+
+        if (neardal_agent_prv_remove(objPath) == TRUE)
+                NEARDAL_TRACE("removed\n");
+        else
+                NEARDAL_TRACE("not removed!\n");
+
+        return err;
+}
+
+
+/*****************************************************************************
+ * neardal_agent_acquire_dbus_name: acquire dbus name for management of neard
+ *  agent feature
+ ****************************************************************************/
+errorCode_t neardal_agent_acquire_dbus_name(void)
+{
+       errorCode_t                     err = NEARDAL_SUCCESS;
+
+       NEARDAL_TRACEIN();
+       if (neardalMgr.conn == NULL)
+               return NEARDAL_ERROR_DBUS;
+
+       neardalMgr.OwnerId = g_bus_own_name_on_connection(neardalMgr.conn
+                               , NEARDAL_DBUS_WELLKNOWN_NAME
+                               , G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+                                 G_BUS_NAME_OWNER_FLAGS_REPLACE
+                               , on_name_acquired      /* on_name_acquired */
+                               , on_name_lost          /* on_name_lost */
+                               , NULL                  /* user data */
+                               , NULL);        /* freeing user_data func */
+
+       if (neardalMgr.OwnerId == 0) {
+               err = NEARDAL_ERROR_DBUS;
+               goto exit;
+       }
+
+       /* Create a new org.neardal.ObjectManager rooted at /neardal */
+       neardalMgr.agentMgr = g_dbus_object_manager_server_new(AGENT_PREFIX);
+       if (neardalMgr.agentMgr == NULL) {
+               err = NEARDAL_ERROR_DBUS;
+               goto exit;
+       }
+
+       /* Export all objects */
+       g_dbus_object_manager_server_set_connection (neardalMgr.agentMgr
+                                                    , neardalMgr.conn);
+
+
+exit:
+       if (err != NEARDAL_SUCCESS)
+               NEARDAL_TRACE_ERR("(%d:%s)\n", err
+                                 , neardal_error_get_text(err));
+
+       return err;
+}
+
+/*****************************************************************************
+ * neardal_agent_stop_owning_dbus_name: Stops owning a dbus name
+ ****************************************************************************/
+void neardal_agent_stop_owning_dbus_name(void)
+{
+       NEARDAL_TRACEIN();
+       if (neardalMgr.OwnerId > 0)
+               g_bus_unown_name (neardalMgr.OwnerId);
+       neardalMgr.OwnerId = 0;
+
+}
similarity index 64%
rename from lib/neardal_agent.h
rename to lib/neardal_agent_mgr.h
index edfba0c..a6acd7f 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef __NEARDAL_AGENT_H
 #define __NEARDAL_AGENT_H
 
-#include "neardal_adapter.h"
+#include "neardal.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -31,11 +31,28 @@ extern "C" {
 
 
 typedef struct {
-       gchar           *objPath;       /* agent object path */
-       gchar           *tagType;       /* tag Type to register */
-       gint            pid;
-       agent_cb        cb_agent;
-       gpointer        user_data;
+       gchar                   *objPath;               /* agent object path */
+       gchar                   *tagType;               /* tag Type to register
+                                                       (for NDEF agent only )
+                                                       */
+                                                       
+       gint                    pid;                    /* process pid */
+       
+       ndef_agent_cb           cb_ndef_agent;          /* client callback to
+                                                       retrieve raw NDEF data
+                                                       and records object path
+                                                       */
+                                                       
+       oob_req_agent_cb        cb_oob_req_agent;       /* client callback to
+                                                       get Out Of Band data
+                                                       from the handover agent
+                                                       */
+                                                       
+       oob_push_agent_cb       cb_oob_push_agent;      /* client callback to
+                                                       pass remote Out Of Band
+                                                       data to agent to start
+                                                       handover */
+       gpointer                user_data;
 } neardal_agent_t;
 
 /*****************************************************************************
@@ -51,10 +68,16 @@ void neardal_agent_stop_owning_dbus_name(void);
 
 /*****************************************************************************
  * neardal_ndefagent_prv_manage: create or release an agent and register or
- * unregister it with neardal object manager
+ * unregister it with neardal object manager and Neard for NDEF data
  ****************************************************************************/
 errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData);
 
+/*****************************************************************************
+ * neardal_handoveragent_prv_manage: create or release an agent and register
+ * or unregister it with neardal object manager and Neard for handover message
+ * (request / answer)
+ ****************************************************************************/
+errorCode_t neardal_handoveragent_prv_manage(neardal_agent_t agentData);
 
 #ifdef __cplusplus
 }
index 54f2ae5..c240578 100644 (file)
@@ -216,23 +216,22 @@ void neardal_dev_notify_dev_found(DevProp *devProp)
  ****************************************************************************/
 errorCode_t neardal_dev_prv_push(DevProp *devProp, RcdProp *rcd)
 {
-       GVariantBuilder *builder = NULL;
+       GVariantBuilder *dictBuilder = NULL;
        GVariant        *in;
        errorCode_t     err;
        GError          *gerror = NULL;
 
        NEARDAL_ASSERT_RET(devProp != NULL, NEARDAL_ERROR_INVALID_PARAMETER);
 
-       builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
-       if (builder == NULL)
+       dictBuilder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
+       if (dictBuilder == NULL)
                return NEARDAL_ERROR_NO_MEMORY;
 
-       g_variant_builder_init(builder,  G_VARIANT_TYPE_ARRAY);
-       err = neardal_rcd_prv_format(builder, rcd);
+       err = neardal_rcd_prv_format(dictBuilder, rcd);
        if (err != NEARDAL_SUCCESS)
                goto exit;
 
-       in = g_variant_builder_end(builder);
+       in = g_variant_builder_end(dictBuilder);
        NEARDAL_TRACE_LOG("Sending:\n%s\n", g_variant_print(in, TRUE));
        org_neard_dev__call_push_sync(devProp->proxy, in, NULL, &gerror);
 
@@ -243,8 +242,7 @@ exit:
                g_error_free(gerror);
                err = NEARDAL_ERROR_DBUS;
        }
-       if (builder != NULL)
-               g_variant_builder_unref(builder);
+       g_variant_builder_unref(dictBuilder);
 
        return err;
 }
index 02d1aaa..36099c8 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "neard_manager_proxy.h"
 
-#include "neardal_agent.h"
+#include "neardal_agent_mgr.h"
 #include "neardal_manager.h"
 #include "neardal_tools.h"
 #include "neardal_traces_prv.h"
index d7b3b23..6696d05 100644 (file)
@@ -157,45 +157,45 @@ errorCode_t neardal_rcd_prv_format(GVariantBuilder *builder, RcdProp *rcd)
 
        /* Type */
        if (rcd->type != NULL)
-               neardal_tools_prv_add_dict_entry(builder, "Type", rcd->type,
-                                           (int) G_TYPE_STRING);
+               neardal_tools_prv_add_dict_entry(builder, "Type", rcd->type
+                                                , 0, (int) G_TYPE_STRING);
 
        /* Encoding */
        if (rcd->encoding != NULL)
                neardal_tools_prv_add_dict_entry(builder, "Encoding"
-                                                , rcd->encoding
+                                                , rcd->encoding, 0
                                                 , (int) G_TYPE_STRING);
 
        /* Language */
        if (rcd->language != NULL)
                neardal_tools_prv_add_dict_entry(builder, "Language"
-                                                , rcd->language
+                                                , rcd->language, 0
                                                 , (int) G_TYPE_STRING);
 
        /* Representation */
        if (rcd->representation != NULL)
-               neardal_tools_prv_add_dict_entry(builder, "Representation",
-                                            rcd->representation,
-                                           (int) G_TYPE_STRING);
+               neardal_tools_prv_add_dict_entry(builder, "Representation"
+                                                , rcd->representation, 0
+                                                , (int) G_TYPE_STRING);
 
        /* URI */
        if (rcd->uri != NULL) {
-               neardal_tools_prv_add_dict_entry(builder, "URI", rcd->uri,
-                                           (int) G_TYPE_STRING);
-               neardal_tools_prv_add_dict_entry(builder, "Size",
-                                           (void *) rcd->uriObjSize,
-                                           (int) G_TYPE_UINT);
-
+               neardal_tools_prv_add_dict_entry(builder, "URI", rcd->uri, 0
+                                                , (int) G_TYPE_STRING);
+               neardal_tools_prv_add_dict_entry(builder, "Size"
+                                                , (void *) rcd->uriObjSize, 0
+                                                , (int) G_TYPE_UINT);
        }
        /* MIME */
        if (rcd->mime != NULL)
-               neardal_tools_prv_add_dict_entry(builder, "MIME", rcd->mime,
-                                               (int) G_TYPE_STRING);
+               neardal_tools_prv_add_dict_entry(builder, "MIME", rcd->mime
+                                                ,0 , (int) G_TYPE_STRING);
 
        /* Action */
        if (rcd->action != NULL)
-               neardal_tools_prv_add_dict_entry(builder, "Action", rcd->action,
-                                           (int) G_TYPE_STRING);
+               neardal_tools_prv_add_dict_entry(builder, "Action"
+                                                , rcd->action, 0
+                                                , (int) G_TYPE_STRING);
 
        return err;
 }
index 95f3273..a567fe2 100644 (file)
@@ -267,23 +267,22 @@ void neardal_tag_notify_tag_found(TagProp *tagProp)
  ****************************************************************************/
 errorCode_t neardal_tag_prv_write(TagProp *tagProp, RcdProp *rcd)
 {
-       GVariantBuilder *builder = NULL;
+       GVariantBuilder *dictBuilder = NULL;
        GVariant        *in;
        errorCode_t     err;
        GError          *gerror = NULL;
 
        NEARDAL_ASSERT_RET(tagProp != NULL, NEARDAL_ERROR_INVALID_PARAMETER);
 
-       builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
-       if (builder == NULL)
+       dictBuilder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
+       if (dictBuilder == NULL)
                return NEARDAL_ERROR_NO_MEMORY;
 
-       g_variant_builder_init(builder,  G_VARIANT_TYPE_ARRAY);
-       err = neardal_rcd_prv_format(builder, rcd);
+       err = neardal_rcd_prv_format(dictBuilder, rcd);
        if (err != NEARDAL_SUCCESS)
                goto exit;
 
-       in = g_variant_builder_end(builder);
+       in = g_variant_builder_end(dictBuilder);
        NEARDAL_TRACEF("Sending:\n%s\n", g_variant_print(in, TRUE));
        org_neard_tag__call_write_sync(tagProp->proxy, in, NULL, &gerror);
 
@@ -294,8 +293,7 @@ exit:
                g_error_free(gerror);
                err = NEARDAL_ERROR_DBUS;
        }
-       if (builder != NULL)
-               g_variant_builder_unref(builder);
+       g_variant_builder_unref(dictBuilder);
 
        return err;
 }
index d477f01..2efc5df 100644 (file)
@@ -90,9 +90,14 @@ GHashTable *neardal_tools_prv_create_dict(void)
  ****************************************************************************/
 errorCode_t neardal_tools_prv_add_dict_entry(GVariantBuilder *builder
                                             , gchar *key, void *value
+                                            , gsize valueSize
                                             , int gVariantType)
 {
-       GVariant *tmp = NULL;
+       GVariant        *tmp                    = NULL;
+       GVariantBuilder *bytesArrayBuilder      = NULL;
+       unsigned char   *bytePtr;
+       gsize           count;
+       errorCode_t     err                     = NEARDAL_SUCCESS;
 
        NEARDAL_ASSERT_RET(builder != NULL, NEARDAL_ERROR_INVALID_PARAMETER);
 
@@ -103,11 +108,31 @@ errorCode_t neardal_tools_prv_add_dict_entry(GVariantBuilder *builder
        case G_TYPE_UINT:
                tmp = g_variant_new_uint32((guint32) value);
                break;
-       case G_TYPE_VARIANT:
-               tmp = (GVariant *) value;
+       default:
+               /* if valueSize > 0, consider value as byte array
+                processing like g_variant_new_bytestring() but based on array
+                size and not a null terminated string  (allowing byte = 0
+                in array) */
+               if (valueSize > 0) {
+                       err = NEARDAL_ERROR_GENERAL_ERROR;
+                       bytePtr = (unsigned char*) value;
+                       bytesArrayBuilder = g_variant_builder_new(
+                                               G_VARIANT_TYPE_BYTESTRING);
+                       if (bytesArrayBuilder == NULL)
+                               break;
+
+                       for (count = 0; count < valueSize; count++)
+                               g_variant_builder_add(bytesArrayBuilder, "y"
+                                                     , bytePtr[count]);
+
+                       tmp = g_variant_builder_end(bytesArrayBuilder);
+                       g_variant_builder_unref(bytesArrayBuilder);
+                       err = NEARDAL_SUCCESS;
+               }
+               break;
        }
        g_variant_builder_add(builder, "{sv}", key, tmp);
 
-       return NEARDAL_SUCCESS;
+       return err;
 }
 
index 9f119ed..45d405b 100644 (file)
@@ -66,6 +66,7 @@ GHashTable *neardal_tools_prv_create_dict(void);
  *****************************************************************************/
 errorCode_t neardal_tools_prv_add_dict_entry(GVariantBuilder *builder
                                             , gchar *key, void *value
+                                            , gsize valueSize
                                             , int gVariantType);
 
 #ifdef __cplusplus
index fa7c806..4d89946 100644 (file)
@@ -67,7 +67,10 @@ static void neardal_prv_dump_data_as_binary_format(char *bufToReadP,
        if (offset < nbColumn) {
                /* 3 space because each byte in binary format as 2 digit and
                1 space */
-               g_string_append_len(bufDestP, "   ", nbColumn - offset);
+               remainingSize = (nbColumn - offset) * 3;
+               offset = 0;
+               while ((offset++) < remainingSize)
+                       g_string_append_c(bufDestP, ' ');
        }
 }
 
@@ -86,8 +89,12 @@ static void neardal_prv_dump_data_as_ascii_format(char *bufToReadP,
                offset++;
        }
        /* Adding space to finish ascii column */
-       if (offset < nbColumn)
-               g_string_append_len(bufDestP, " ", nbColumn - offset);
+       if (offset < nbColumn) {
+               remainingSize = nbColumn - offset;
+               offset = 0;
+               while ((offset++) < remainingSize)
+                       g_string_append_c(bufDestP, '.');
+       }
 }
 
 
index 12d9352..5d6fe40 100644 (file)
--- a/ncl/ncl.c
+++ b/ncl/ncl.c
@@ -54,7 +54,10 @@ static void ncl_trace_prv_dump_data_as_binary_format(char *bufToReadP,
        if (offset < nbColumn) {
                /* 3 space because each byte in binary format as 2 digit and
                1 space */
-               g_string_append_len(bufDestP, "   ", nbColumn - offset);
+               remainingSize = (nbColumn - offset) * 3;
+               offset = 0;
+               while ((offset++) < remainingSize)
+                       g_string_append_c(bufDestP, ' ');
        }
 }
 
@@ -73,8 +76,12 @@ static void ncl_trace_prv_dump_data_as_ascii_format(char *bufToReadP,
                offset++;
        }
        /* Adding space to finish ascii column */
-       if (offset < nbColumn)
-               g_string_append_len(bufDestP, " ", nbColumn - offset);
+       if (offset < nbColumn) {
+               remainingSize = nbColumn - offset;
+               offset = 0;
+               while ((offset++) < remainingSize)
+                       g_string_append_c(bufDestP, '.');
+       }
 }
 
 
index a3f5f03..1e3a2ce 100644 (file)
@@ -894,9 +894,9 @@ static GOptionEntry options[] = {
                { NULL, 0, 0, 0, NULL, NULL, NULL} /* End of List */
        };
 
+       memset(&rcd, 0, sizeof(neardal_record));
        if (argc > 1) {
                /* Parse options */
-               memset(&rcd, 0, sizeof(neardal_record));
                nclErr = ncl_cmd_prv_parseOptions(&argc, &argv, options);
        } else
                nclErr = NCLERR_PARSING_PARAMETERS;
@@ -1109,19 +1109,26 @@ static NCLError ncl_cmd_stop_poll(int argc, char *argv[])
  * ncl_cmd_(un)register_NDEF_agent : BEGIN
  * Handle a record macthing a registered tag type
  ****************************************************************************/
-void ncl_cmd_agent_cb(unsigned char **rcdArray, unsigned int rcdLen
+void ncl_cmd_ndef_agent_cb(unsigned char **rcdArray, unsigned int rcdLen
                      , unsigned char *ndefArray, unsigned int ndefLen
                      , void *user_data)
 {
+       unsigned int i;
+       
        (void) user_data;
 
-       NCL_CMD_PRINTF("Received %d records and %d bytes of NDEF raw data.\n"
-                     , rcdLen, ndefLen);
+       NCL_CMD_PRINTF("Received %d records :\n"
+                     , rcdLen);
+       for (i = 0; i < rcdLen; i++) {
+               NCL_CMD_PRINT("Record : '%s'\n", rcdArray[i]);
+       }
 
+       NCL_CMD_PRINT("\n");
+       NCL_CMD_PRINTF("%d bytes of NDEF raw data Received :\n"
+                     , ndefLen);
        NCL_CMD_DUMP(ndefArray, ndefLen);
+       NCL_CMD_PRINT("\n");
 
-       neardal_free_array((char***) &rcdArray);
-       g_free(ndefArray);
 }
 
 static NCLError ncl_cmd_register_NDEF_agent(int argc, char *argv[])
@@ -1130,13 +1137,10 @@ static NCLError ncl_cmd_register_NDEF_agent(int argc, char *argv[])
        NCLError        nclErr;
        static char     *tagType;
 
-       if (argc <= 1)
-               return NCLERR_PARSING_PARAMETERS;
-
 static GOptionEntry options[] = {
                { "tagType", 's', 0, G_OPTION_ARG_STRING , &tagType
                                , "tag Type to register",
-                               "'Text', 'URI'..." },
+                               "'urn:nfc:wkt:U'..." },
 
                { NULL, 0, 0, 0, NULL, NULL, NULL} /* End of List */
        };
@@ -1148,6 +1152,11 @@ static GOptionEntry options[] = {
        } else
                nclErr = NCLERR_PARSING_PARAMETERS;
 
+       if (nclErr != NCLERR_NOERROR) {
+               ncl_cmd_print(stdout, "Sample (Type 'Text'):");
+               ncl_cmd_print(stdout, "e.g. < %s --tagType urn:nfc:wkt:U >\n"
+                            , argv[0]);
+       }
        if (nclErr != NCLERR_NOERROR)
                goto exit;
 
@@ -1155,7 +1164,7 @@ static GOptionEntry options[] = {
        if (sNclCmdCtx.cb_initialized == false)
                ncl_cmd_install_callback();
 
-       ec = neardal_agent_set_NDEF_cb(tagType, ncl_cmd_agent_cb, NULL);
+       ec = neardal_agent_set_NDEF_cb(tagType, ncl_cmd_ndef_agent_cb, NULL);
        if (ec != NEARDAL_SUCCESS) {
                NCL_CMD_PRINTF("Set NDEF callback failed! error:%d='%s'.\n",
                               ec, neardal_error_get_text(ec));
@@ -1216,10 +1225,101 @@ exit:
 
        return NCLERR_NOERROR;
 }
+
 /*****************************************************************************
  * ncl_cmd_(un)register_NDEF_agent : END
  ****************************************************************************/
 
+/*****************************************************************************
+ * ncl_cmd_(un)register_handover_agent : BEGIN
+ * Handle a record macthing a registered tag type
+ ****************************************************************************/
+void ncl_cmd_handover_req_agent_cb(unsigned char *blobEIR
+                                  , unsigned int blobSize
+                                  , unsigned char ** oobData
+                                  , unsigned int * oobDataSize
+                                  , freeFunc *freeF
+                                  , void *user_data)
+{
+       const unsigned char test_data[] = {0x16,0x00,0x01,0x02,0x03,0x04,
+                                           0x05,0x06,0x08,0x09,0x41,0x72,
+                                           0x72,0x61,0x6b,0x69,0x73,0x04,
+                                           0x0d,0x6e,0x01,0x00};
+
+       (void) user_data;
+
+       NCL_CMD_PRINTF("Received blobEIR = \n");
+       NCL_CMD_DUMP(blobEIR, blobSize);
+
+       *oobData = g_try_malloc0(sizeof(test_data));
+       memcpy(*oobData , test_data, sizeof(test_data));
+       *oobDataSize = sizeof(test_data);
+       *freeF = g_free;
+       NCL_CMD_PRINTF("return oobData = \n");
+       NCL_CMD_DUMP(*oobData, *oobDataSize);
+}
+
+void ncl_cmd_handover_push_agent_cb (unsigned char *blobEIR
+                                    , unsigned int blobSize
+                                    , void *user_data)
+{
+       NCL_CMD_PRINTF("Received blobEIR = \n");
+       NCL_CMD_DUMP(blobEIR, blobSize);
+       (void) user_data;
+
+       NCL_CMD_PRINTF("\n");
+}
+
+static NCLError ncl_cmd_register_handover_agent(int argc, char *argv[])
+{
+       errorCode_t     ec              = NEARDAL_SUCCESS;
+
+       (void) argc;
+       (void) argv;
+
+       /* Install Neardal Callback*/
+       if (sNclCmdCtx.cb_initialized == false)
+               ncl_cmd_install_callback();
+
+       ec = neardal_agent_set_handover_cb(ncl_cmd_handover_push_agent_cb
+                                          , ncl_cmd_handover_req_agent_cb
+                                          , NULL);
+       if (ec != NEARDAL_SUCCESS) {
+               NCL_CMD_PRINTF("Set handover callback failed! error:%d='%s'.\n",
+                              ec, neardal_error_get_text(ec));
+               return NCLERR_LIB_ERROR;
+       }
+       NCL_CMD_PRINT("\nExit with error code %d:%s\n", ec,
+                     neardal_error_get_text(ec));
+
+       return NCLERR_NOERROR;
+}
+static NCLError ncl_cmd_unregister_handover_agent(int argc, char *argv[])
+{
+       errorCode_t     ec              = NEARDAL_SUCCESS;
+
+       (void) argc;
+       (void) argv;
+       
+       /* Install Neardal Callback*/
+       if (sNclCmdCtx.cb_initialized == false)
+               ncl_cmd_install_callback();
+
+       ec = neardal_agent_set_handover_cb(NULL, NULL, NULL);
+       if (ec != NEARDAL_SUCCESS) {
+               NCL_CMD_PRINTF("Set handover callback failed! error:%d='%s'.\n",
+                              ec, neardal_error_get_text(ec));
+               return NCLERR_LIB_ERROR;
+       }
+       NCL_CMD_PRINT("\nExit with error code %d:%s\n", ec,
+                     neardal_error_get_text(ec));
+
+       return NCLERR_NOERROR;
+}
+/*****************************************************************************
+ * ncl_cmd_(un)register_handover_agent : END
+ ****************************************************************************/
+
 
 /*****************************************************************************
  * test parameter type (sample code) : BEGIN
@@ -1394,6 +1494,10 @@ static NCLCmdInterpretor itFunc[] = {
        ncl_cmd_push,
        "Creates and push a NDEF record to a NFC device"},
 
+       { "registerHandover",
+       ncl_cmd_register_handover_agent,
+       "register a handler for handover connection"},
+
        { "registerNDEFtype",
        ncl_cmd_register_NDEF_agent,
        "register a handler for a specific NDEF tag type"},
@@ -1414,6 +1518,10 @@ static NCLCmdInterpretor itFunc[] = {
        ncl_cmd_test_parameters,
        "Simple test to parse input parameters"},
 
+       { "unregisterHandover",
+       ncl_cmd_unregister_handover_agent,
+       "unregister a handler for handover connection"},
+
        { "unregisterNDEFtype",
        ncl_cmd_unregister_NDEF_agent,
        "unregister a handler for a specific NDEF tag type"},