Neard NDEF Agent abstraction
authorFrederic PAUT <frederic.paut@linux.intel.com>
Wed, 5 Dec 2012 13:59:57 +0000 (14:59 +0100)
committerFrederic PAUT <frederic.paut@linux.intel.com>
Wed, 5 Dec 2012 13:59:57 +0000 (14:59 +0100)
17 files changed:
Makefile.am
configure.ac
lib/Makefile.am
lib/interface/org.neard.NDEFAgent.xml [new file with mode: 0644]
lib/neardal.c
lib/neardal.h
lib/neardal_agent.c [new file with mode: 0644]
lib/neardal_agent.h [new file with mode: 0644]
lib/neardal_prv.h
lib/neardal_tag.c
ncl/ncl.c
ncl/ncl.h
ncl/ncl_cmd.c
ncl/ncl_cmd.h
neardal.spec [moved from libneardal-0.1.0.spec with 63% similarity]
neardal_ncl.spec [new file with mode: 0644]
org.neardal.conf [new file with mode: 0644]

index 09ea84e..4a3ce61 100644 (file)
@@ -3,6 +3,9 @@ EXTRA_DIST = neardal.pc.in
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = neardal.pc
 
+confdir = /etc/dbus-1/system.d/
+conf_DATA=org.neardal.conf
+
 SUBDIRS = lib ncl
 
 #Rule to generate doxygen documentation
index 7e5c5ff..0580241 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT([libneardal], [0.1.0])
+AC_INIT([neardal], 0.8.0, Neardal for Neard v0.8)
 AM_INIT_AUTOMAKE([foreign -Wall -Werror])
 
 AC_PROG_LIBTOOL
index f5ca3d3..1a740b9 100644 (file)
@@ -33,7 +33,15 @@ neard_record_proxy.h:  interface/org.neard.Record.xml
                        --interface-prefix org.neard.Record \
                        $<
 
-BUILT_SOURCES =        neard_adapter_proxy.h \
+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 \
                neard_device_proxy.h \
                neard_manager_proxy.h \
                neard_tag_proxy.h \
@@ -41,6 +49,7 @@ BUILT_SOURCES =       neard_adapter_proxy.h \
 
 neardal_PRV_HDR = \
                neardal_adapter.h \
+               neardal_agent.h \
                neardal_device.h \
                neardal_manager.h \
                neardal_prv.h \
@@ -56,7 +65,14 @@ noinst_HEADERS = $(BUILT_SOURCES) $(neardal_PRV_HDR)
 dist_neardalheaders_HEADERS =  neardal.h \
                                neardal_errors.h
 
-CLEANFILES = $(BUILT_SOURCES)
+CLEANFILES =   $(BUILT_SOURCES) \
+               neardal_ndef_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
@@ -65,6 +81,8 @@ lib_LTLIBRARIES =             libneardal.la
 libneardal_la_SOURCES =                neardal.c \
                                neardal_adapter.c \
                                neard_adapter_proxy.c \
+                               neardal_agent.c \
+                               neardal_ndef_agent.c \
                                neardal_device.c \
                                neard_device_proxy.c \
                                neardal_manager.c \
diff --git a/lib/interface/org.neard.NDEFAgent.xml b/lib/interface/org.neard.NDEFAgent.xml
new file mode 100644 (file)
index 0000000..5c9a8e5
--- /dev/null
@@ -0,0 +1,12 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+       <interface name="org.neard.NDEFAgent">
+               <method name="GetNDEF">
+                       <arg name="values" type="a{sv}" direction="in"/>
+                       <arg name="result" type="a{sv}" direction="out"/>
+               </method>
+               <method name="Release">
+               </method>
+       </interface>
+</node>
index fe0a337..7af404f 100644 (file)
@@ -20,6 +20,7 @@
  */
 
 #include <stdio.h>
+#include <unistd.h>
 #include <string.h>
 #include <glib.h>
 #include <glib-object.h>
@@ -43,8 +44,7 @@
 #define        ADP_MODE_TARGET                 "Target"
 #define        ADP_MODE_DUAL                   "Dual"
 
-neardalCtx neardalMgr = {NULL, NULL, {NULL}, NULL, NULL, NULL, NULL, NULL, NULL,
-NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL};
+neardalCtx neardalMgr = {.proxy = NULL};
 
 /*---------------------------------------------------------------------------
  * Context Management
@@ -61,11 +61,16 @@ void neardal_prv_construct(errorCode_t *ec)
                return;
 
        NEARDAL_TRACEIN();
+       memset(&neardalMgr, 0, sizeof(neardalCtx));
        /* Create DBUS connection */
        g_type_init();
-       neardalMgr.conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL,
+       neardalMgr.conn = g_bus_get_sync(NEARDAL_DBUS_TYPE, NULL,
                                           &neardalMgr.gerror);
        if (neardalMgr.conn != NULL) {
+               err = neardal_agent_acquire_dbus_name();
+               if (err != NEARDAL_SUCCESS)
+                       NEARDAL_TRACE_ERR("Agent not managed!\n");
+
                /* We have a DBUS connection, create proxy on Neard Manager */
                err =  neardal_mgr_create();
                if (err != NEARDAL_SUCCESS) {
@@ -75,8 +80,10 @@ void neardal_prv_construct(errorCode_t *ec)
 
                }
                /* No Neard daemon, destroying neardal object... */
-               if (err == NEARDAL_ERROR_DBUS_CANNOT_CREATE_PROXY)
-                       neardal_tools_prv_free_gerror(&neardalMgr.gerror);
+               if (err != NEARDAL_SUCCESS)
+                       goto exit;
+               
+
        } else {
                NEARDAL_TRACE_ERR("Unable to connect to dbus: %s\n",
                                 neardalMgr.gerror->message);
@@ -84,9 +91,12 @@ void neardal_prv_construct(errorCode_t *ec)
                err = NEARDAL_ERROR_DBUS;
        }
 
+exit:
        if (ec != NULL)
                *ec = err;
 
+       neardal_tools_prv_free_gerror(&neardalMgr.gerror);
+       
        NEARDAL_TRACEF("Exit\n");
        return;
 }
@@ -103,6 +113,7 @@ void neardal_destroy(void)
                neardal_tools_prv_free_gerror(&neardalMgr.gerror);
                neardal_mgr_destroy();
        }
+       neardal_agent_stop_owning_dbus_name();
 }
 
 /*****************************************************************************
@@ -992,7 +1003,7 @@ exit:
 }
 
 /*****************************************************************************
- * neardal_tag_write: Write NDEF record to an NFC dev
+ * neardal_dev_push: Push NDEF record to an NFC dev
  ****************************************************************************/
 errorCode_t neardal_dev_push(neardal_record *record)
 {
@@ -1176,4 +1187,78 @@ exit:
        return err;
 }
 
+/*---------------------------------------------------------------------------
+ * NFC Agent Management
+ ---------------------------------------------------------------------------*/
+/*****************************************************************************
+ * 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
+ ****************************************************************************/
+errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent
+                                     , void *user_data)
+{
+       errorCode_t     err     = NEARDAL_ERROR_INVALID_PARAMETER;
+       neardal_agent_t agent;
+
+
+       if (tagType == NULL)
+               goto exit;
+       err = NEARDAL_ERROR_NO_MEMORY;
+       
+       agent.cb_agent  = cb_agent;
+       agent.pid       = getpid();
+       agent.tagType   = g_strdup(tagType);
+       { // replace ':' with '_'
+               int len = strlen(agent.tagType);
+               while (len > 0) {
+                       if (agent.tagType[len] == ':')
+                               agent.tagType[len] = '_';
+                       len--;
+               }
+       }
+       agent.user_data = user_data;
+       agent.objPath   = NULL;
+       agent.objPath = g_strdup_printf("%s/%s/%d", NEARDAL_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_agent != NULL)
+               // RegisterNDEFAgent
+               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);
+                       
+
+       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);
+       g_free(agent.tagType);
+       
+       return err;
+}
 
index c764ca3..d8776ae 100644 (file)
@@ -182,6 +182,21 @@ typedef void (*dev_cb) (const char *devName, void *user_data);
  **/
 typedef void (*record_cb) (const char *rcdName, void *user_data);
 
+/**
+ * @brief Callback prototype for a registered tag type
+ *
+ * @param rcdArray array of records path (as identifier=dbus object path)
+ * @param rcdLen number of records path in rcdArray
+ * @param ndefArray array of raw NDEF 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);
+
+
 /* @}*/
 
 
@@ -495,6 +510,20 @@ void neardal_free_record(neardal_record *record);
 errorCode_t neardal_set_cb_record_found(record_cb cb_rcd_found,
                                         void *user_data);
 
+/*! \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.
+ * @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
+                                     , void *user_data);
+
+
 /*! @fn errorCode_t neardal_free_array(char ***array)
  *
  * @brief free memory used by array of adapters/tags/device or records
diff --git a/lib/neardal_agent.c b/lib/neardal_agent.c
new file mode 100644 (file)
index 0000000..aecd9bf
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ *     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;
+       
+       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);
+               }
+       }
+               
+//     neardal_ndefagent_complete_get_ndef(ndefAgent, invocation, out);
+       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 Poke() D-Bus method invocations on the .Animal interface */
+               g_signal_connect ( ndefAgent, "handle-get-ndef"
+                               , G_CALLBACK (on_get_ndef)
+                               , data);
+
+               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 (@manager takes its own reference to @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.freedesktop.DBus.ObjectManager rooted at /example/Animals */
+       neardalMgr.agentMgr = g_dbus_object_manager_server_new (NEARDAL_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.h b/lib/neardal_agent.h
new file mode 100644 (file)
index 0000000..7f00b3a
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ *     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.
+ *
+ */
+
+#ifndef __NEARDAL_AGENT_H
+#define __NEARDAL_AGENT_H
+
+#include "neardal_adapter.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define NEARDAL_AGENT_PREFIX   "/neardal"
+
+
+typedef struct {
+       gchar           *objPath;       // agent object path
+       gchar           *tagType;       // tag Type to register
+       gint            pid;
+       agent_cb        cb_agent;
+       gpointer        user_data;
+} neardal_agent_t;
+
+/*****************************************************************************
+ * neardal_agent_acquire_dbus_name: acquire dbus name for management of neard
+ *  agent feature
+ ****************************************************************************/
+errorCode_t neardal_agent_acquire_dbus_name(void);
+
+/*****************************************************************************
+ * neardal_agent_stop_owning_dbus_name: Stops owning a dbus name
+ ****************************************************************************/
+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
+ ****************************************************************************/
+errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __NEARDAL_AGENT_H */
index 52d63d5..df0e7aa 100644 (file)
@@ -22,6 +22,8 @@
 #define __NEARDAL_PRV_H
 
 #include "neard_manager_proxy.h"
+
+#include "neardal_agent.h"
 #include "neardal_manager.h"
 #include "neardal_tools.h"
 #include "neardal_traces_prv.h"
@@ -82,12 +84,22 @@ typedef struct neardalCtx {
                                                        client callback
                                                        'tag record found'*/
 
+       guint           OwnerId;                /* dbus Id server side */
+                                               /* (for neard agent Mgnt) */
+       GDBusObjectManagerServer *agentMgr;     /* Object 'agent' Manager */
+
        errorCode_t     ec;             /* Lastest NEARDAL error */
        GError          *gerror;        /* Lastest GError if available */
 } neardalCtx;
 
 extern neardalCtx neardalMgr;
 
+// DBUS TYPE
+#define NEARDAL_DBUS_TYPE                              G_BUS_TYPE_SYSTEM
+
+// The well-known name to own
+#define NEARDAL_DBUS_WELLKNOWN_NAME                    "org.neardal"
+
 /*! \fn neardal_t neardal_prv_construct(errorCode_t *ec)
 *  \brief create NEARDAL object instance, Neard Dbus connection,
 * register Neard's events
index a105b84..87ab667 100644 (file)
@@ -283,7 +283,7 @@ errorCode_t neardal_tag_prv_write(TagProp *tagProp, RcdProp *rcd)
                goto exit;
 
        in = g_variant_builder_end(builder);
-       NEARDAL_TRACE_LOG("Sending:\n%s\n", g_variant_print(in, TRUE));
+       NEARDAL_TRACEF("Sending:\n%s\n", g_variant_print(in, TRUE));
        org_neard_tag__call_write_sync(tagProp->proxy, in, NULL, &gerror);
 
 exit:
index 0734f20..0f37e3d 100644 (file)
--- a/ncl/ncl.c
+++ b/ncl/ncl.c
 #define PROMPT_PREFIX          "NCL> "
 #define NB_MAX_PARAMETERS      20      /* Max number of parameters in a
                                        command */
+#define NB_COLUMN              16
 
 NCLContext     gNclCtx;
 
+static void ncl_trace_prv_dump_data_as_binary_format(char *bufToReadP,
+                                                   int remainingSize,
+                                                   GString *bufDestP,
+                                                   int nbColumn)
+{
+       int offset = 0;
+
+       while (offset < nbColumn && offset < remainingSize) {
+               g_string_append_printf(bufDestP, "%02hX ",
+                                      ((unsigned char) bufToReadP[offset]));
+               offset++;
+       }
+       /* Adding space to align ascii format */
+       if (offset < nbColumn) {
+               /* 3 space because each byte in binary format as 2 digit and
+               1 space */
+               g_string_append_len(bufDestP, "   ", nbColumn - offset);
+       }
+}
+
+static void ncl_trace_prv_dump_data_as_ascii_format(char *bufToReadP,
+                                             int remainingSize,
+                                             GString *bufDestP, int nbColumn)
+{
+       int             offset = 0;
+
+       while (offset < nbColumn && offset < remainingSize) {
+               if (g_ascii_isprint(((unsigned char) bufToReadP[offset])))
+                       g_string_append_c(bufDestP,
+                                         ((unsigned char) bufToReadP[offset]));
+               else
+                       g_string_append_c(bufDestP, '.');
+               offset++;
+       }
+       /* Adding space to finish ascii column */
+       if (offset < nbColumn)
+               g_string_append_len(bufDestP, " ", nbColumn - offset);
+}
+
+
+void ncl_trace_dump_mem(char *bufToReadP, int size)
+{
+       char    *memP = bufToReadP;
+       int             len = size;
+       int             offset = 0;
+       GString *bufTrace;
+
+       if (!memP || size <= 0)
+               return;
+
+       offset  = 0;
+
+       bufTrace = g_string_new(NULL);
+       while (len > 0) {
+               g_string_append_printf(bufTrace, "%08lX : ",
+                                      (unsigned long) (&bufToReadP[offset]));
+               ncl_trace_prv_dump_data_as_binary_format(&bufToReadP[offset],
+                                                       len, bufTrace,
+                                                       NB_COLUMN);
+               ncl_trace_prv_dump_data_as_ascii_format(&bufToReadP[offset],
+                                                      len, bufTrace,
+                                                      NB_COLUMN);
+               NCL_CMD_PRINT("%s\n", bufTrace->str);
+               len             -= NB_COLUMN;
+               offset  += NB_COLUMN;
+               g_string_truncate(bufTrace, 0);
+       }
+       g_string_free(bufTrace, TRUE);
+}
+
+
 char *ncl_error_get_text(NCLError ec)
 {
        switch (ec) {
index f1bf162..c0cc7fb 100644 (file)
--- a/ncl/ncl.h
+++ b/ncl/ncl.h
@@ -53,5 +53,6 @@ NCLContext *ncl_get_ctx(void);
 
 /* Display prompt */
 void ncl_prompt(void);
+void ncl_trace_dump_mem(char *bufToReadP, int size);
 
 #endif /* __NCL_H__ */
index f8191a6..3b8c524 100644 (file)
@@ -1104,6 +1104,122 @@ static NCLError ncl_cmd_stop_poll(int argc, char *argv[])
  * ncl_cmd_stop_poll : END
  ****************************************************************************/
 
+
+/*****************************************************************************
+ * 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
+                     , unsigned char *ndefArray, unsigned int ndefLen
+                     , void *user_data)
+{
+       (void) user_data;
+       
+       NCL_CMD_PRINTF("Received %d records and %d bytes of NDEF raw data.\n"
+                     , rcdLen, ndefLen);
+
+       NCL_CMD_DUMP(ndefArray, ndefLen);
+       
+       neardal_free_array((char***) &rcdArray);
+       g_free(ndefArray);
+       
+}
+
+static NCLError ncl_cmd_register_NDEF_agent(int argc, char *argv[])
+{
+       errorCode_t     ec              = NEARDAL_SUCCESS;
+       NCLError        nclErr;
+       static char     *tagType        = NULL;
+
+       if (argc <= 1)
+               return NCLERR_PARSING_PARAMETERS;
+
+static GOptionEntry options[] = {
+               { "tagType", 's', 0, G_OPTION_ARG_STRING , &tagType
+                               , "tag Type to register",
+                               "'Text', 'URI'..." },
+
+               { NULL, 0, 0, 0, NULL, NULL, NULL} /* End of List */
+       };
+
+       if (argc > 1)
+               /* Parse options */
+               nclErr = ncl_cmd_prv_parseOptions(&argc, &argv, options);
+       else
+               nclErr = NCLERR_PARSING_PARAMETERS;
+
+       if (nclErr != NCLERR_NOERROR)
+               goto exit;
+
+       /* Install Neardal Callback*/
+       if (sNclCmdCtx.cb_initialized == false)
+               ncl_cmd_install_callback();
+
+       ec = neardal_agent_set_NDEF_cb(tagType, ncl_cmd_agent_cb, NULL);
+       if (ec != NEARDAL_SUCCESS) {
+               NCL_CMD_PRINTF("Set NDEF 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));
+
+exit:
+       g_free(tagType);
+       tagType = NULL;
+
+       return NCLERR_NOERROR;
+}
+static NCLError ncl_cmd_unregister_NDEF_agent(int argc, char *argv[])
+{
+       errorCode_t     ec              = NEARDAL_SUCCESS;
+       NCLError        nclErr;
+       static char     *tagType        = NULL;
+
+       if (argc <= 1)
+               return NCLERR_PARSING_PARAMETERS;
+
+static GOptionEntry options[] = {
+               { "tagType", 's', 0, G_OPTION_ARG_STRING , &tagType
+                               , "tag Type to unregister",
+                               "'Text', 'URI'..." },
+
+               { NULL, 0, 0, 0, NULL, NULL, NULL} /* End of List */
+       };
+
+       if (argc > 1)
+               /* Parse options */
+               nclErr = ncl_cmd_prv_parseOptions(&argc, &argv, options);
+       else
+               nclErr = NCLERR_PARSING_PARAMETERS;
+
+       if (nclErr != NCLERR_NOERROR)
+               goto exit;
+
+       /* Install Neardal Callback*/
+       if (sNclCmdCtx.cb_initialized == false)
+               ncl_cmd_install_callback();
+
+       ec = neardal_agent_set_NDEF_cb(tagType, NULL, NULL);
+       if (ec != NEARDAL_SUCCESS) {
+               NCL_CMD_PRINTF("Set NDEF 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));
+
+exit:
+       g_free(tagType);
+       tagType = NULL;
+
+       return NCLERR_NOERROR;
+}
+/*****************************************************************************
+ * ncl_cmd_(un)register_NDEF_agent : END
+ ****************************************************************************/
+
+
 /*****************************************************************************
  * test parameter type (sample code) : BEGIN
  ****************************************************************************/
@@ -1233,6 +1349,10 @@ static NCLError ncl_cmd_exit(int argc, char *argv[])
  ****************************************************************************/
 /* Array of command line functions interpretor (alphabetical order) */
 static NCLCmdInterpretor itFunc[] = {
+       { "exit",
+       ncl_cmd_exit,
+       "Exit from command line interpretor" },
+
        { "get_adapters",
        ncl_cmd_get_adapters,
        "Get adapters list"},
@@ -1277,9 +1397,9 @@ static NCLCmdInterpretor itFunc[] = {
        ncl_cmd_write,
        "Creates and write a NDEF record to a NFC tag"},
 
-       { "exit",
-       ncl_cmd_exit,
-       "Exit from command line interpretor" },
+       { "registerNDEFtype",
+       ncl_cmd_register_NDEF_agent,
+       "register a handler for a specific NDEF tag type"},
 
        { "set_adp_property",
        ncl_cmd_set_adapter_property,
@@ -1295,7 +1415,15 @@ static NCLCmdInterpretor itFunc[] = {
 
        { "test_parameters",
        ncl_cmd_test_parameters,
-       "Simple test to parse input parameters"}
+       "Simple test to parse input parameters"},
+       
+       { "unregisterNDEFtype",
+       ncl_cmd_unregister_NDEF_agent,
+       "unregister a handler for a specific NDEF tag type"},
+
+       { "write",
+       ncl_cmd_write,
+       "Creates and write a NDEF record to a NFC tag"}
 };
 #define NB_CL_FUNC             (sizeof(itFunc) / sizeof(NCLCmdInterpretor))
 
index 76b7f08..cf5413b 100644 (file)
@@ -73,4 +73,7 @@ void                  ncl_cmd_print(FILE *fprintout, char *format, ...);
                        ncl_cmd_print(stderr, "ERR in %s(): " format, \
                        __func__, ## __VA_ARGS__)
 
+#define                NCL_CMD_DUMP(mem, size) \
+                       ncl_trace_dump_mem((char *) mem, size)
+
 #endif /* __NCL_CMD_H__ */
similarity index 63%
rename from libneardal-0.1.0.spec
rename to neardal.spec
index c461c8c..3d98ac4 100644 (file)
@@ -1,19 +1,19 @@
 # >> macros
-%define libneardal_dir %{_libdir}
-%define libneardal_pkg %{_libdir}/pkgconfig
-%define libneardal_inc %{_includedir}/neardal
+%define neardal_dir %{_libdir}
+%define neardal_pkg %{_libdir}/pkgconfig
+%define neardal_inc %{_includedir}/neardal
 
 %define glib2_version                  2.30.0
 # << macros
 
 Name: neardal
-Summary: Neard Abstraction Library
-Version: 0.1.0
+Summary: Neard Abstraction Library (for Neard v0.7)
+Version: 0.7.0
 Release: 1.0
 Group: System/Libraries
 License: LGPLv2
 URL: https://github.com/connectivity/neardal.git
-Source0: lib%{name}-%{version}.tar.bz2
+Source0: %{name}-%{version}.tar.bz2
 
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
@@ -30,14 +30,22 @@ BuildRequires: pkgconfig(dbus-glib-1)
 This package provides simple C APIs to exchange datas with NFC daemon (Neard) present on the system.
 
 %prep
-%setup -q -n lib%{name}-%{version}
+%setup -q -n %{name}-%{version}
 
 %build
 autoreconf --force --install
 
-%configure --prefix=/usr
+%configure --disable-traces --prefix=/usr
 make
   
+%package dev
+Summary:    Headers for neardal
+Group:      Development/Libraries
+
+
+%description dev
+Development headers and libraries for neardal
+
 %install      
 rm -rf %{buildroot}
 %make_install
@@ -59,14 +67,15 @@ rm -rf %{buildroot}
 %doc README AUTHORS NEWS COPYING
 
 # libraries files
-%{libneardal_dir}/libneardal.so
-%{libneardal_dir}/libneardal.so.0
-%{libneardal_dir}/libneardal.so.0.0.1
+%{neardal_dir}/libneardal.so
+%{neardal_dir}/libneardal.so.0
+%{neardal_dir}/libneardal.so.0.0.1
 
+%changelog
+
+%files dev
 # headers files
-%{libneardal_inc}/neardal.h
-%{libneardal_inc}/neardal_errors.h
+%{neardal_inc}/*.h
 # pkg-config files
-%{libneardal_pkg}/*.pc
-%changelog
+%{neardal_pkg}/neardal.pc
 
diff --git a/neardal_ncl.spec b/neardal_ncl.spec
new file mode 100644 (file)
index 0000000..6e04466
--- /dev/null
@@ -0,0 +1,91 @@
+# >> macros
+%define neardal_dir %{_libdir}
+%define neardal_pkg %{_libdir}/pkgconfig
+%define neardal_inc %{_includedir}/neardal
+
+%define glib2_version                  2.0.0
+# << macros
+
+Name: neardal
+Summary: Neard Abstraction Library (for Neard v0.7)
+Version: 0.7.0
+Release: 1.0
+Group: System/Libraries
+License: LGPLv2
+URL: https://github.com/connectivity/neardal.git
+Source0: %{name}-%{version}.tar.bz2
+
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+BuildRequires: python 
+BuildRequires: intltool >= %{intltool_version}
+BuildRequires: libtool
+BuildRequires: automake
+BuildRequires: autoconf
+BuildRequires: gettext
+BuildRequires: pkgconfig(glib-2.0) >= %{glib2_version}
+BuildRequires: pkgconfig(dbus-glib-1)
+
+%description
+This package provides simple C APIs to exchange datas with NFC daemon (Neard) present on the system.
+
+%prep
+%setup -q -n %{name}-%{version}
+
+%build
+autoreconf --force --install
+
+%configure --disable-traces --prefix=/usr
+make
+  
+%package dev
+Summary:    Headers for neardal
+Group:      Development/Libraries
+
+
+%description dev
+Development headers and libraries for neardal
+
+%package ncl
+Summary:    Neardal Command Line: Simple command line interpretor for neardal/Neard
+Group:      Tools
+
+
+%description ncl
+Neardal Command Line: Simple command line interpretor for neardal/Neard
+
+%install      
+rm -rf %{buildroot}
+%make_install
+
+# executed after install
+%post
+/sbin/ldconfig
+
+# executed before uninstall
+%postun
+/sbin/ldconfig
+  
+# No locale
+# %%find_lang %%{name}
+# %%files -f %%{name}.lang
+
+%files
+%defattr(-,root,root,-)
+%doc README AUTHORS NEWS COPYING
+
+# libraries files
+%{neardal_dir}/libneardal.so
+%{neardal_dir}/libneardal.so.0
+%{neardal_dir}/libneardal.so.0.0.1
+
+%changelog
+
+%files dev
+# headers files
+%{neardal_inc}/*.h
+# pkg-config files
+%{neardal_pkg}/neardal.pc
+
+%files ncl
+%{_bindir}/ncl
diff --git a/org.neardal.conf b/org.neardal.conf
new file mode 100644 (file)
index 0000000..280e8cf
--- /dev/null
@@ -0,0 +1,14 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+    <policy user="root">
+        <allow own="org.neardal"/>
+        <allow send_destination="org.neardal"/>
+    </policy>
+    <policy at_console="true">
+        <allow send_destination="org.neardal"/>
+    </policy>
+    <policy context="default">
+        <deny send_destination="org.neardal"/>
+    </policy>
+ </busconfig>