Chronology of the callbacks client invocation revised
authorFrederic PAUT <frederic.paut@linux.intel.com>
Wed, 22 Feb 2012 14:55:09 +0000 (15:55 +0100)
committerFrederic PAUT <frederic.paut@linux.intel.com>
Wed, 22 Feb 2012 14:55:09 +0000 (15:55 +0100)
lib/neardal_adapter.c
lib/neardal_record.c
lib/neardal_record.h
lib/neardal_target.c
lib/neardal_target.h

index 649715e..fa13868 100644 (file)
@@ -42,6 +42,7 @@ static void  neardal_adp_prv_cb_target_found(orgNeardTgt *proxy,
        AdpProp         *adpProp        = user_data;
        errorCode_t     err;
        neardal_t       neardalMgr;
+       TgtProp         *tgtProp;
 
        NEARDAL_TRACEIN();
        (void) proxy; /* remove warning */
@@ -57,10 +58,9 @@ static void  neardal_adp_prv_cb_target_found(orgNeardTgt *proxy,
         * callback 'Record Found' would be called before ) */
        err = neardal_tgt_add(neardalMgr, adpProp,
                              (char *) arg_unnamed_arg0);
-       if (err != NEARDAL_SUCCESS) {
-               if (neardalMgr->cb_tgt_found != NULL)
-                       (neardalMgr->cb_tgt_found)((char *) arg_unnamed_arg0,
-                                             neardalMgr->cb_tgt_found_ud);
+       if (err == NEARDAL_SUCCESS) {
+               tgtProp = g_list_nth_data(adpProp->tgtList, 0);
+               neardal_tgt_notify_target_found(neardalMgr, tgtProp);
        }
        NEARDAL_TRACEF("NEARDAL LIB targetList contains %d elements\n",
                      g_list_length(adpProp->tgtList));
@@ -148,12 +148,11 @@ static void neardal_adp_prv_cb_property_changed(orgNeardAdp *proxy,
                tgtArray = g_variant_dup_objv (tmp, &tmpLen);
                adpProp->tgtNb = tmpLen;
                if (tmpLen == 0) {
-                       GList *node = NULL;
                        NEARDAL_TRACEF(
                                "Target array empty! Removing all targets\n");
-                       while (g_list_length(adpProp->tgtList)) {
-                               node = g_list_first(adpProp->tgtList);
-                               tgtProp = (TgtProp *) node->data;
+                       while (tmpLen < g_list_length(adpProp->tgtList)) {
+                               tgtProp = g_list_nth_data(adpProp->tgtList,
+                                                         tmpLen++);
                                neardal_adp_prv_cb_target_lost(tgtProp->proxy,
                                                               tgtProp->name,
                                                               tgtProp->parent);
@@ -451,6 +450,8 @@ errorCode_t neardal_adp_add(neardal_t neardalMgr, char *adapterName)
        errorCode_t     errCode = NEARDAL_SUCCESS;
        AdpProp         *adpProp = NULL;
        GList           **adpList;
+       TgtProp         *tgtProp;
+       gsize           len;
 
        g_assert(neardalMgr != NULL);
        NEARDAL_TRACEF("Adding adapter:%s\n", adapterName);
@@ -474,6 +475,13 @@ errorCode_t neardal_adp_add(neardal_t neardalMgr, char *adapterName)
                        (neardalMgr->cb_adp_added)((char *) adapterName,
                                               neardalMgr->cb_adp_added_ud);
 
+       /* Notify 'Target Found' */
+       len = 0;
+       while (len < g_list_length(adpProp->tgtList)) {
+               tgtProp = g_list_nth_data(adpProp->tgtList, len++);
+               neardal_tgt_notify_target_found(neardalMgr, tgtProp);
+               len++;
+       }
        return errCode;
 }
 
index 707acff..126806e 100644 (file)
@@ -340,9 +340,6 @@ errorCode_t neardal_rcd_add(neardal_t neardalMgr, void *parent,
        NEARDAL_TRACEF("NEARDAL LIB recordList contains %d elements\n",
                      g_list_length(tgtProp->rcdList));
        
-       if (neardalMgr->cb_rcd_found != NULL)
-               (neardalMgr->cb_rcd_found)(rcdName,
-                                          neardalMgr->cb_rcd_found_ud);
        errCode = NEARDAL_SUCCESS;
 
 exit:
index 49508c7..dd6bf2a 100644 (file)
@@ -34,6 +34,7 @@ typedef struct {
        orgNeardRcd     *proxy; /* proxy to Neard NFC Record interface */
        char            *name;  /* DBus interface name (as identifier) */
        void            *parent; /* parent (target) */
+       gboolean        notified; /* Already notified to client? */
 
        char            *encoding;
        gboolean        handOver;
index e83bf1a..b015094 100644 (file)
@@ -208,6 +208,36 @@ static void neardal_tgt_prv_free(TgtProp **tgtProp)
 }
 
 /******************************************************************************
+ * neardal_tgt_notify_target_found: Invoke client callback for 'record found'
+ * if present, and 'target found' (if not already nofied)
+ *****************************************************************************/
+void neardal_tgt_notify_target_found(neardal_t neardalMgr, TgtProp *tgtProp)
+{
+       RcdProp *rcdProp;
+       gsize   len;
+       
+       g_assert(neardalMgr != NULL);
+       g_assert(tgtProp != NULL);
+       
+               
+       if (tgtProp->notified == FALSE && neardalMgr->cb_tgt_found != NULL) {
+               (neardalMgr->cb_tgt_found)(tgtProp->name,
+                                          neardalMgr->cb_tgt_found_ud);
+               tgtProp->notified = TRUE;
+       }
+
+       len = 0;
+       if (neardalMgr->cb_rcd_found != NULL)
+               while (len < g_list_length(tgtProp->rcdList)) {
+                       rcdProp = g_list_nth_data(tgtProp->rcdList, len++);
+                       if (rcdProp->notified == FALSE) {
+                               (neardalMgr->cb_rcd_found)(rcdProp->name,
+                                                       neardalMgr->cb_rcd_found_ud);
+                               rcdProp->notified = TRUE;
+                       }
+               }
+}
+/******************************************************************************
  * neardal_get_targets: get an array of NFC targets present
  *****************************************************************************/
 errorCode_t neardal_get_targets(neardal_t neardalMgr, char *adpName,
@@ -281,10 +311,6 @@ errorCode_t neardal_tgt_add(neardal_t neardalMgr, void * parent,
        NEARDAL_TRACEF("NEARDAL LIB targetList contains %d elements\n",
                      g_list_length(adpProp->tgtList));
        
-       if (neardalMgr->cb_tgt_found != NULL)
-               (neardalMgr->cb_tgt_found)(tgtProp->name,
-                                          neardalMgr->cb_tgt_found_ud);
-
        return errCode;
 
 error:
index 3999b0a..670f782 100644 (file)
@@ -34,11 +34,10 @@ extern "C" {
 
 /* NEARDAL Target Properties */
 typedef struct {
-       orgNeardTgt     *proxy;         /* proxy to Neard NEARDAL Target
-                                       interface */
-       char            *name;          /* DBus interface name
-                                       (as identifier) */
-       void            *parent;        /* parent (adapter ) */
+       orgNeardTgt     *proxy;   /* proxy to Neard NEARDAL Target interface */
+       char            *name;    /* DBus interface name (as identifier) */
+       void            *parent;  /* parent (adapter ) */
+       gboolean        notified; /* Already notified to client? */
        
        gchar           *type;
        
@@ -51,6 +50,12 @@ typedef struct {
 } TgtProp;
 
 /******************************************************************************
+ * neardal_tgt_notify_target_found: Invoke client callback for 'record found'
+ * if present, and 'target found' (if not already nofied)
+ *****************************************************************************/
+void neardal_tgt_notify_target_found(neardal_t neardalMgr, TgtProp *tgtProp);
+
+/******************************************************************************
  * neardal_tgt_add: add new NEARDAL target, initialize DBus Proxy connection,
  * register target signal
  *****************************************************************************/