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
-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
--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 \
neardal_PRV_HDR = \
neardal_adapter.h \
+ neardal_agent.h \
neardal_device.h \
neardal_manager.h \
neardal_prv.h \
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
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 \
--- /dev/null
+<!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>
*/
#include <stdio.h>
+#include <unistd.h>
#include <string.h>
#include <glib.h>
#include <glib-object.h>
#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
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) {
}
/* 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);
err = NEARDAL_ERROR_DBUS;
}
+exit:
if (ec != NULL)
*ec = err;
+ neardal_tools_prv_free_gerror(&neardalMgr.gerror);
+
NEARDAL_TRACEF("Exit\n");
return;
}
neardal_tools_prv_free_gerror(&neardalMgr.gerror);
neardal_mgr_destroy();
}
+ neardal_agent_stop_owning_dbus_name();
}
/*****************************************************************************
}
/*****************************************************************************
- * 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)
{
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;
+}
**/
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);
+
+
/* @}*/
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
--- /dev/null
+/*
+ * 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;
+
+}
--- /dev/null
+/*
+ * 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 */
#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"
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
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:
#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) {
/* Display prompt */
void ncl_prompt(void);
+void ncl_trace_dump_mem(char *bufToReadP, int size);
#endif /* __NCL_H__ */
* 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
****************************************************************************/
****************************************************************************/
/* 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"},
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,
{ "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))
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__ */
# >> 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
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
%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
--- /dev/null
+# >> 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
--- /dev/null
+<!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>