Release 0.8 agent: adding 'Release' callback
authorFrederic PAUT <frederic.paut@linux.intel.com>
Tue, 18 Dec 2012 14:21:56 +0000 (15:21 +0100)
committerFrederic PAUT <frederic.paut@linux.intel.com>
Wed, 27 Feb 2013 08:51:01 +0000 (09:51 +0100)
configure.ac
lib/neardal.c
lib/neardal.h
lib/neardal_agent_mgr.c
lib/neardal_agent_mgr.h
ncl/ncl_cmd.c

index 8f7feb8..6a4a7c5 100644 (file)
@@ -28,10 +28,10 @@ AC_ARG_ENABLE(debug, AC_HELP_STRING([--disable-debug],
 
 if (test "${debug}" = "yes"); then
        CFLAGS="$CFLAGS -g -O0 -DNEARDAL_DEBUG"
-       echo 'NEARDAL will be compiled in debug mode. CFLAGS='${CFLAGS}
+       echo 'NEARDAL will be compiled in debug mode.(NEARDAL_DEBUG will be defined)'
 else
        CFLAGS="$CFLAGS -O2"
-       echo 'NEARDAL will not be compiled in debug mode. CFLAGS='${CFLAGS}
+       echo 'NEARDAL will not be compiled in debug mode. (NEARDAL_DEBUG will not be defined)'
 fi
 
 ## Traces ?
@@ -43,10 +43,11 @@ AC_ARG_ENABLE(traces, AC_HELP_STRING([--enable-traces],
 ])
 if (test "${traces}" = "yes"); then
        CFLAGS="$CFLAGS -DNEARDAL_TRACES"
-       echo 'NEARDAL will be compiled with debugging traces...('NEARDAL_TRACES' will be defined)'
+       echo "NEARDAL will be compiled with debugging traces...(NEARDAL_TRACES will be defined)"
 else
-       echo 'NEARDAL will be compiled without debugging traces... ('NEARDAL_TRACES' will not be defined)'
+       echo "NEARDAL will be compiled without debugging traces... (NEARDAL_TRACES will not be defined)"
 fi
+echo 'NEARDAL will be compiled with CFLAGS='${CFLAGS}
 
 ## Check dependances
 GLIB_REQUIRED=2.30.0
index feb9931..0ab83a5 100644 (file)
@@ -1202,23 +1202,25 @@ exit:
  * 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,
-                                     ndef_agent_cb cb_ndef_agent,
-                                     void *user_data)
+errorCode_t neardal_agent_set_NDEF_cb(char *tagType
+                                    , ndef_agent_cb cb_ndef_agent
+                                    , ndef_agent_free_cb cb_ndef_release_agent
+                                    , void *user_data)
 {
-       errorCode_t     err     = NEARDAL_ERROR_INVALID_PARAMETER;
-       neardal_agent_t agent;
+       errorCode_t             err     = NEARDAL_ERROR_INVALID_PARAMETER;
+       neardal_ndef_agent_t    agent;
 
 
-       memset(&agent, 0, sizeof(neardal_agent_t));
+       memset(&agent, 0, sizeof(neardal_ndef_agent_t));
        if (tagType == NULL)
                goto exit;
        err = NEARDAL_ERROR_NO_MEMORY;
 
-       agent.cb_ndef_agent     = cb_ndef_agent;
-       agent.pid               = getpid();
-       agent.user_data         = user_data;
-       agent.tagType           = g_strdup(tagType);
+       agent.cb_ndef_agent             = cb_ndef_agent;
+       agent.cb_ndef_release_agent     = cb_ndef_release_agent;
+       agent.pid                       = getpid();
+       agent.user_data                 = user_data;
+       agent.tagType                   = g_strdup(tagType);
        { /* replace ':' with '_' */
                int len = strlen(agent.tagType);
                while (len > 0) {
@@ -1227,15 +1229,13 @@ errorCode_t neardal_agent_set_NDEF_cb(char *tagType,
                        len--;
                }
        }
-       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;
 
-       err = neardal_ndefagent_prv_manage(agent);
-       if (err != NEARDAL_SUCCESS)
-               goto exit;
-
        if (cb_ndef_agent != NULL)
                /* RegisterNDEFAgent */
                org_neard_mgr__call_register_ndefagent_sync(neardalMgr.proxy,
@@ -1250,6 +1250,10 @@ errorCode_t neardal_agent_set_NDEF_cb(char *tagType,
                                                         &neardalMgr.gerror);
 
 
+       err = neardal_ndefagent_prv_manage(agent);
+       if (err != NEARDAL_SUCCESS)
+               goto exit;
+
        if (neardalMgr.gerror != NULL) {
                NEARDAL_TRACE_ERR(
                        "Error with neard dbus method (err:%d:'%s')\n"
@@ -1275,23 +1279,26 @@ exit:
  * 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 neardal_agent_set_handover_cb(oob_push_agent_cb cb_oob_push_agent
+                                         , oob_req_agent_cb  cb_oob_req_agent
+                               , oob_agent_free_cb cb_oob_release_agent
+                                         , void *user_data)
 {
-       errorCode_t     err     = NEARDAL_ERROR_INVALID_PARAMETER;
-       neardal_agent_t agent;
+       errorCode_t                     err;
+       neardal_handover_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);
+       memset(&agent, 0, sizeof(neardal_handover_agent_t));
+       agent.cb_oob_push_agent         = cb_oob_push_agent;
+       agent.cb_oob_req_agent          = cb_oob_req_agent;
+       agent.cb_oob_release_agent      = cb_oob_release_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;
 
index 75c9b91..72ef9ce 100644 (file)
@@ -132,7 +132,7 @@ typedef struct {
 /* @}*/
 
 /*! @brief NEARDAL Callbacks
- * @addtogroup NEARDAL_CALLBACK Callbacks
+ * @addtogroup NEARDAL_CALLBACK CALLBACKS
  * @{
 */
 
@@ -198,7 +198,16 @@ typedef void (*ndef_agent_cb) (unsigned char **rcdArray, unsigned int rcdLen,
                               void *user_data);
 
 /**
- * @brief TODO
+ * @brief Callback prototype to cleanup agent user data. Gets called when
+ * Neard unregisters the agent.
+ *
+ * @param user_data Client user data
+ **/
+typedef void (*ndef_agent_free_cb) (void *user_data);
+
+/**
+ * @brief Pointer to function used to release oob data generated by callback
+ * @link oob_req_agent_cb @endlink
  **/
 typedef void (*freeFunc) (void *ptr);
 
@@ -208,14 +217,14 @@ typedef void (*freeFunc) (void *ptr);
  * @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 oobData Out Of Band data returned (as an array of bytes) used to
+ * build a Handover Request or Select message (oobData* will be never null)
+ * @param oobDataSize Out Of Band data size 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,
@@ -226,7 +235,7 @@ typedef void (*oob_req_agent_cb) (unsigned char *blobEIR,
 /**
  * @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
@@ -238,6 +247,14 @@ typedef void (*oob_push_agent_cb) (unsigned char *blobEIR,
                                   unsigned int blobSize, void *user_data);
 
 
+/**
+ * @brief Callback prototype to cleanup agent user data. Gets called when
+ * Neard unregisters the agent.
+ *
+ * @param user_data Client user data
+ **/
+typedef void (*oob_agent_free_cb) (void *user_data);
+
 /* @}*/
 
 
@@ -255,7 +272,7 @@ typedef void (*oob_push_agent_cb) (unsigned char *blobEIR,
 void neardal_destroy();
 
 /*! @brief NEARDAL Properties identifiers
- * @addtogroup NEARDAL_CALLBACK Defines
+ * @addtogroup NEARDAL_POLLING_MODE
  * @{ */
 #define NEARD_ADP_MODE_INITIATOR               0
 #define NEARD_ADP_MODE_TARGET                  1
@@ -268,7 +285,7 @@ void neardal_destroy();
 *  specific mode
 *  \param adpName : DBus interface adapter name (as identifier=dbus object
 *                   path)
-*  \param mode : Polling mode (see NEARD_ADP_MODE_...)
+*  \param mode : Polling mode (see @link NEARDAL_POLLING_MODE @endlink ...)
 *  @return errorCode_t error code
 */
 errorCode_t neardal_start_poll_loop(char *adpName, int mode);
@@ -556,12 +573,14 @@ errorCode_t neardal_set_cb_record_found(record_cb cb_rcd_found,
  * 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 cb_ndef_agent Client callback for the registered tag type
+ * @param cb_ndef_release_agent Client callback to cleanup agent user data
  * @param user_data Client user data
  * @return errorCode_t error code
  **/
 errorCode_t neardal_agent_set_NDEF_cb(char *tagType
                                      , ndef_agent_cb cb_ndef_agent
+                                    , ndef_agent_free_cb cb_ndef_release_agent
                                      , void *user_data);
 
 
@@ -573,11 +592,13 @@ errorCode_t neardal_agent_set_NDEF_cb(char *tagType
  * 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 cb_oob_release_agent used to cleanup agent user 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
+                               , oob_agent_free_cb cb_oob_release_agent
                                          , void *user_data);
 
 /*! @fn errorCode_t neardal_free_array(char ***array)
index 20290ac..ff89ec0 100644 (file)
@@ -40,12 +40,12 @@ static gboolean on_GetNDEF(neardalNDEFAgent             *ndefAgent,
                            , 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;
+       neardal_ndef_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 */
@@ -98,24 +98,62 @@ static gboolean on_GetNDEF(neardalNDEFAgent             *ndefAgent,
        return TRUE;
 }
 
+static gboolean on_NDEF_Release( neardalNDEFAgent              *agent
+                               , GDBusMethodInvocation         *invocation
+                               , gpointer                      user_data)
+{
+       neardal_ndef_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'\n",agent_data->objPath);
+
+               if (agent_data->cb_ndef_release_agent)
+                       (agent_data->cb_ndef_release_agent)(
+                                                       agent_data->user_data);
+
+               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_ndef_object_removed( GDBusObjectManager *manager
+                             , GDBusObject        *object
+                             , gpointer            user_data)
+{
+       NEARDAL_TRACEIN();
+       (void) manager; /* avoid warning */
+       on_NDEF_Release( NEARDAL_NDEFAGENT(object), NULL, user_data);
+}
+
 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;
+       neardal_handover_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;
 
        (void) handoverAgent;       /* Avoid warning */
        (void) invocation;      /* Avoid warning */
+       err = NEARDAL_ERROR_GENERAL_ERROR;
 
        NEARDAL_TRACEIN();
        NEARDAL_TRACEF("%s\n", g_variant_print(values, TRUE));
@@ -167,7 +205,7 @@ static gboolean on_RequestOOB(neardalHandoverAgent  *handoverAgent
                                                , 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(
@@ -175,11 +213,11 @@ static gboolean on_RequestOOB(neardalHandoverAgent        *handoverAgent
                                                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
@@ -199,7 +237,7 @@ static gboolean on_RequestOOB(neardalHandoverAgent  *handoverAgent
                                                      , G_DBUS_ERROR_FAILED
                                                      , G_DBUS_ERROR_FAILED
                                                , neardal_error_get_text(err));
-       
+
        return TRUE;
 }
 
@@ -208,11 +246,11 @@ static gboolean on_PushOOB(neardalHandoverAgent   *handoverAgent
                           , GVariant                   *values
                           , gpointer                   user_data)
 {
-       neardal_agent_t *agent_data = user_data;
-       gconstpointer   value;
-       gchar           *blobKey;
-       gchar           *blob           = NULL;
-       gsize           blobLen         = 0;
+       neardal_handover_agent_t        *agent_data     = user_data;
+       gconstpointer                   value;
+       gchar                           *blobKey;
+       gchar                           *blob           = NULL;
+       gsize                           blobLen         = 0;
 
        (void) handoverAgent;       /* Avoid warning */
        (void) invocation;      /* Avoid warning */
@@ -267,37 +305,40 @@ static gboolean on_PushOOB(neardalHandoverAgent   *handoverAgent
        return TRUE;
 }
 
-static gboolean on_Release( neardalNDEFAgent           *agent
-                          , GDBusMethodInvocation      *invocation
-                          , gpointer                   user_data)
+static gboolean on_Handover_Release( neardalHandoverAgent      *agent
+                               , GDBusMethodInvocation         *invocation
+                               , gpointer                      user_data)
 {
-       neardal_agent_t *agent_data = user_data;
+       neardal_handover_agent_t        *agent_data = user_data;
        NEARDAL_TRACEIN();
 
        if (invocation != NULL)
-               neardal_ndefagent_complete_release(agent, invocation);
+               neardal_handover_agent_complete_release(agent, invocation);
        if (agent_data != NULL) {
-               NEARDAL_TRACEF("agent '%s' ",agent_data->objPath);
+               NEARDAL_TRACEF("agent '%s'\n",agent_data->objPath);
+
+               if (agent_data->cb_oob_release_agent)
+                       (agent_data->cb_oob_release_agent)(
+                                                       agent_data->user_data);
 
                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
+static void on_handover_object_removed( GDBusObjectManager *manager
                              , GDBusObject        *object
                              , gpointer            user_data)
 {
        NEARDAL_TRACEIN();
        (void) manager; /* avoid warning */
-       on_Release( NEARDAL_NDEFAGENT(object), NULL, user_data);
+       on_Handover_Release( NEARDAL_HANDOVER_AGENT(object), NULL, user_data);
 }
 
 static void
@@ -328,21 +369,21 @@ on_name_lost(GDBusConnection *connection
  * 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 neardal_ndefagent_prv_manage(neardal_ndef_agent_t agentData)
 {
        errorCode_t             err = NEARDAL_SUCCESS;
        neardalObjectSkeleton   *objSkel;
        neardalNDEFAgent        *ndefAgent;
-       neardal_agent_t         *data;
+       neardal_ndef_agent_t    *data;
 
        NEARDAL_TRACEIN();
 
        if (agentData.cb_ndef_agent != NULL) {
-               data = g_try_malloc0(sizeof(neardal_agent_t));
+               data = g_try_malloc0(sizeof(neardal_ndef_agent_t));
                if (data == NULL)
                        return NEARDAL_ERROR_NO_MEMORY;
 
-               memcpy(data, &agentData, sizeof(neardal_agent_t));
+               memcpy(data, &agentData, sizeof(neardal_ndef_agent_t));
                data->objPath = g_strdup(agentData.objPath);
                data->tagType = g_strdup(agentData.tagType);
 
@@ -353,20 +394,20 @@ errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData)
                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);
+               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( ndefAgent, "handle-release"
+                               , G_CALLBACK (on_NDEF_Release), data);
 
-               g_signal_connect ( neardalMgr.agentMgr, "object-removed"
-                               , G_CALLBACK (on_object_removed), data);
-               g_object_unref (ndefAgent);
+               g_signal_connect( neardalMgr.agentMgr, "object-removed"
+                               , G_CALLBACK (on_ndef_object_removed), data);
+               g_object_unref(ndefAgent);
 
                /* Export the object */
-               g_dbus_object_manager_server_export (neardalMgr.agentMgr
+               g_dbus_object_manager_server_export(neardalMgr.agentMgr
                                        , G_DBUS_OBJECT_SKELETON (objSkel));
                g_object_unref (objSkel);
        } else {
@@ -375,49 +416,32 @@ errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData)
                        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 neardal_handoveragent_prv_manage(
+                                       neardal_handover_agent_t agentData)
 {
-        errorCode_t            err = NEARDAL_SUCCESS;
-        neardalObjectSkeleton  *objSkel;
-        neardalHandoverAgent   *handoverAgent;
-        neardal_agent_t                *data;
+        errorCode_t                    err = NEARDAL_SUCCESS;
+        neardalObjectSkeleton          *objSkel;
+        neardalHandoverAgent           *handoverAgent;
+        neardal_handover_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));
+                data = g_try_malloc0(sizeof(neardal_handover_agent_t));
                 if (data == NULL)
                         return NEARDAL_ERROR_NO_MEMORY;
 
-                memcpy(data, &agentData, sizeof(neardal_agent_t));
+                memcpy(data, &agentData, sizeof(neardal_handover_agent_t));
                 data->objPath = g_strdup(agentData.objPath);
 
                 NEARDAL_TRACEF("Create agent '%s'\n", data->objPath);
@@ -428,25 +452,26 @@ errorCode_t neardal_handoveragent_prv_manage(neardal_agent_t agentData)
                                                           handoverAgent);
 
                 /* Handle RequestOOB() D-Bus method invocations */
-                g_signal_connect ( handoverAgent, "handle-request-oob"
+                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_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( handoverAgent, "handle-release"
+                                , G_CALLBACK (on_Handover_Release), data);
 
-                g_signal_connect ( neardalMgr.agentMgr, "object-removed"
-                                , G_CALLBACK (on_object_removed), data);
-                g_object_unref (handoverAgent);
+                g_signal_connect( neardalMgr.agentMgr, "object-removed"
+                                , G_CALLBACK (on_handover_object_removed)
+                                , data);
+                g_object_unref(handoverAgent);
 
                 /* Export the object */
-                g_dbus_object_manager_server_export (neardalMgr.agentMgr
+                g_dbus_object_manager_server_export(neardalMgr.agentMgr
                                         , G_DBUS_OBJECT_SKELETON (objSkel));
                 g_object_unref (objSkel);
         } else {
index a6acd7f..a784632 100644 (file)
@@ -35,25 +35,54 @@ typedef struct {
        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
                                                        */
-                                                       
+
+       ndef_agent_free_cb      cb_ndef_release_agent;  /* client callback gets
+                                                       called when Neard
+                                                       unregisters the agent.
+                                                       Can be used to cleanup
+                                                       tasks. There is no need
+                                                       to unregister the agent,
+                                                       because when this
+                                                       callback gets called it
+                                                       has already been
+                                                       unregistered.*/
+       gpointer                user_data;
+} neardal_ndef_agent_t;
+
+typedef struct {
+       gchar                   *objPath;               /* agent object path */
+       gint                    pid;                    /* process pid */
+
        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 */
+
+       oob_agent_free_cb       cb_oob_release_agent;   /* client callback gets
+                                                       called when Neard
+                                                       unregisters the agent.
+                                                       Can be used to cleanup
+                                                       tasks. There is no need
+                                                       to unregister the agent,
+                                                       because when this
+                                                       callback gets called it
+                                                       has already been
+                                                       unregistered.*/
+                                                       
        gpointer                user_data;
-} neardal_agent_t;
+} neardal_handover_agent_t;
 
 /*****************************************************************************
  * neardal_agent_acquire_dbus_name: acquire dbus name for management of neard
@@ -70,14 +99,15 @@ 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 and Neard for NDEF data
  ****************************************************************************/
-errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData);
+errorCode_t neardal_ndefagent_prv_manage(neardal_ndef_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);
+errorCode_t neardal_handoveragent_prv_manage(
+                                       neardal_handover_agent_t agentData);
 
 #ifdef __cplusplus
 }
index 1e3a2ce..001578a 100644 (file)
@@ -1114,7 +1114,7 @@ void ncl_cmd_ndef_agent_cb(unsigned char **rcdArray, unsigned int rcdLen
                      , void *user_data)
 {
        unsigned int i;
-       
+
        (void) user_data;
 
        NCL_CMD_PRINTF("Received %d records :\n"
@@ -1129,6 +1129,14 @@ void ncl_cmd_ndef_agent_cb(unsigned char **rcdArray, unsigned int rcdLen
        NCL_CMD_DUMP(ndefArray, ndefLen);
        NCL_CMD_PRINT("\n");
 
+       NCL_CMD_PRINTF("user_data= %s\n", user_data);
+
+}
+
+void ncl_cmd_ndef_agent_release_cb(void *user_data)
+{
+       NCL_CMD_PRINTF("Release user_data=%s\n", user_data);
+       g_free(user_data);
 }
 
 static NCLError ncl_cmd_register_NDEF_agent(int argc, char *argv[])
@@ -1136,6 +1144,7 @@ static NCLError ncl_cmd_register_NDEF_agent(int argc, char *argv[])
        errorCode_t     ec              = NEARDAL_SUCCESS;
        NCLError        nclErr;
        static char     *tagType;
+       char            *test_user_data;
 
 static GOptionEntry options[] = {
                { "tagType", 's', 0, G_OPTION_ARG_STRING , &tagType
@@ -1153,7 +1162,7 @@ static GOptionEntry options[] = {
                nclErr = NCLERR_PARSING_PARAMETERS;
 
        if (nclErr != NCLERR_NOERROR) {
-               ncl_cmd_print(stdout, "Sample (Type 'Text'):");
+               ncl_cmd_print(stdout, "Sample (Type 'URI'):");
                ncl_cmd_print(stdout, "e.g. < %s --tagType urn:nfc:wkt:U >\n"
                             , argv[0]);
        }
@@ -1164,7 +1173,10 @@ static GOptionEntry options[] = {
        if (sNclCmdCtx.cb_initialized == false)
                ncl_cmd_install_callback();
 
-       ec = neardal_agent_set_NDEF_cb(tagType, ncl_cmd_ndef_agent_cb, NULL);
+       test_user_data = g_strdup("test NDEF user data");
+       ec = neardal_agent_set_NDEF_cb(tagType, ncl_cmd_ndef_agent_cb
+                                      , ncl_cmd_ndef_agent_release_cb
+                                      , test_user_data);
        if (ec != NEARDAL_SUCCESS) {
                NCL_CMD_PRINTF("Set NDEF callback failed! error:%d='%s'.\n",
                               ec, neardal_error_get_text(ec));
@@ -1210,7 +1222,7 @@ static GOptionEntry options[] = {
        if (sNclCmdCtx.cb_initialized == false)
                ncl_cmd_install_callback();
 
-       ec = neardal_agent_set_NDEF_cb(tagType, NULL, NULL);
+       ec = neardal_agent_set_NDEF_cb(tagType, NULL, NULL, NULL);
        if (ec != NEARDAL_SUCCESS) {
                NCL_CMD_PRINTF("Set NDEF callback failed! error:%d='%s'.\n",
                               ec, neardal_error_get_text(ec));
@@ -1251,6 +1263,8 @@ void ncl_cmd_handover_req_agent_cb(unsigned char *blobEIR
        NCL_CMD_PRINTF("Received blobEIR = \n");
        NCL_CMD_DUMP(blobEIR, blobSize);
 
+       NCL_CMD_PRINTF("user_data= %s\n", user_data);
+
        *oobData = g_try_malloc0(sizeof(test_data));
        memcpy(*oobData , test_data, sizeof(test_data));
        *oobDataSize = sizeof(test_data);
@@ -1270,9 +1284,17 @@ void ncl_cmd_handover_push_agent_cb (unsigned char *blobEIR
        NCL_CMD_PRINTF("\n");
 }
 
+void ncl_cmd_handover_release_agent_cb(void *user_data)
+{
+       NCL_CMD_PRINTF("Release user_data= %s\n", user_data);
+       g_free(user_data);
+}
+
+
 static NCLError ncl_cmd_register_handover_agent(int argc, char *argv[])
 {
        errorCode_t     ec              = NEARDAL_SUCCESS;
+       char            *test_user_data;
 
        (void) argc;
        (void) argv;
@@ -1281,9 +1303,12 @@ static NCLError ncl_cmd_register_handover_agent(int argc, char *argv[])
        if (sNclCmdCtx.cb_initialized == false)
                ncl_cmd_install_callback();
 
+       test_user_data = g_strdup("test HANDOVER user data");
+
        ec = neardal_agent_set_handover_cb(ncl_cmd_handover_push_agent_cb
                                           , ncl_cmd_handover_req_agent_cb
-                                          , NULL);
+                                          , ncl_cmd_handover_release_agent_cb
+                                          , test_user_data);
        if (ec != NEARDAL_SUCCESS) {
                NCL_CMD_PRINTF("Set handover callback failed! error:%d='%s'.\n",
                               ec, neardal_error_get_text(ec));
@@ -1300,12 +1325,12 @@ static NCLError ncl_cmd_unregister_handover_agent(int argc, char *argv[])
 
        (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);
+       ec = neardal_agent_set_handover_cb(NULL, NULL, NULL, NULL);
        if (ec != NEARDAL_SUCCESS) {
                NCL_CMD_PRINTF("Set handover callback failed! error:%d='%s'.\n",
                               ec, neardal_error_get_text(ec));