lib/Makefile
lib/Makefile.in
lib/libneardal.la
-lib/neard_*
neardal.pc
libtool
ltmain.sh
*.lo
*.o
*kdev4*
+lib/neardal_agent.*
+lib/neard_*
# Specific directories and files in a directory.
autom4te.cache/*
neardal_LT_AGE = 0
#Rule to generate the binding headers
+neardal_agent.h: interface/org.neard.Agent.xml
+ gdbus-codegen --generate-c-code neardal_agent \
+ --c-generate-object-manager \
+ --c-namespace neardal \
+ --interface-prefix org.neard. \
+ $<
+
neard_adapter_proxy.h: interface/org.neard.Adapter.xml
- gdbus-codegen --generate-c-code neard_adapter_proxy \
+ gdbus-codegen --generate-c-code neard_adapter_proxy \
--c-namespace orgNeardAdp \
--interface-prefix org.neard.Adapter \
$<
neard_device_proxy.h: interface/org.neard.Device.xml
- gdbus-codegen --generate-c-code neard_device_proxy \
+ gdbus-codegen --generate-c-code neard_device_proxy \
--c-namespace orgNeardDev \
--interface-prefix org.neard.Device \
$<
neard_manager_proxy.h: interface/org.neard.Manager.xml
- gdbus-codegen --generate-c-code neard_manager_proxy \
+ gdbus-codegen --generate-c-code neard_manager_proxy \
--c-namespace orgNeardMgr \
--interface-prefix org.neard.Manager \
$<
neard_tag_proxy.h: interface/org.neard.Tag.xml
- gdbus-codegen --generate-c-code neard_tag_proxy \
+ gdbus-codegen --generate-c-code neard_tag_proxy \
--c-namespace orgNeardTag \
--interface-prefix org.neard.Tag \
$<
neard_record_proxy.h: interface/org.neard.Record.xml
- gdbus-codegen --generate-c-code neard_record_proxy \
+ gdbus-codegen --generate-c-code neard_record_proxy \
--c-namespace orgNeardRcd \
--interface-prefix org.neard.Record \
$<
-neardal_ndef_agent.h: interface/org.neard.NDEFAgent.xml
- gdbus-codegen --generate-c-code neardal_ndef_agent \
- --c-generate-object-manager \
- --c-namespace neardal \
- --interface-prefix org.neard. \
- $<
-
-BUILT_SOURCES = neardal_ndef_agent.h \
- neard_adapter_proxy.h \
+BUILT_SOURCES = neard_adapter_proxy.h \
+ neardal_agent.h \
neard_device_proxy.h \
neard_manager_proxy.h \
- neard_tag_proxy.h \
- neard_record_proxy.h
+ neard_record_proxy.h \
+ neard_tag_proxy.h
neardal_PRV_HDR = \
neardal_adapter.h \
- neardal_agent.h \
+ neardal_agent_mgr.h \
neardal_device.h \
neardal_manager.h \
neardal_prv.h \
neardal_errors.h
CLEANFILES = $(BUILT_SOURCES) \
- neardal_ndef_agent.c \
+ neardal_agent.c \
neard_adapter_proxy.c \
neard_device_proxy.c \
neard_manager_proxy.c \
neard_tag_proxy.c \
neard_record_proxy.c
-EXTRA_DIST = interface/org.neard.Manager.xml interface/org.neard.Adapter.xml \
- interface/org.neard.Tag.xml interface/org.neard.Device.xml \
- interface/org.neard.Record.xml
+EXTRA_DIST = interface/org.neard.Adapter.xml \
+ interface/org.neard.Agent.xml \
+ interface/org.neard.Device.xml \
+ interface/org.neard.Manager.xml \
+ interface/org.neard.Record.xml \
+ interface/org.neard.Tag.xml
lib_LTLIBRARIES = libneardal.la
libneardal_la_SOURCES = neardal.c \
neardal_adapter.c \
neard_adapter_proxy.c \
neardal_agent.c \
- neardal_ndef_agent.c \
+ neardal_agent_mgr.c \
neardal_device.c \
neard_device_proxy.c \
neardal_manager.c \
<interface name="org.neard.NDEFAgent">
<method name="GetNDEF">
<arg name="values" type="a{sv}" direction="in"/>
+ </method>
+ <method name="Release">
+ </method>
+ </interface>
+ <interface name="org.neard.HandoverAgent">
+ <method name="RequestOOB">
+ <arg name="values" type="a{sv}" direction="in"/>
<arg name="result" type="a{sv}" direction="out"/>
</method>
+ <method name="PushOOB">
+ <arg name="values" type="a{sv}" direction="in"/>
+ </method>
<method name="Release">
</method>
</interface>
/*****************************************************************************
* neardal_agent_set_NDEF_cb: register or unregister a callback to handle a
* record macthing a registered tag type. This callback will received the
- * whole NDEF as a raw byte stream
+ * whole NDEF as a raw byte stream and the records object paths.
+ * If the callback is null, the agent is unregistered
****************************************************************************/
-errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent
- , void *user_data)
+errorCode_t neardal_agent_set_NDEF_cb(char *tagType,
+ ndef_agent_cb cb_ndef_agent,
+ void *user_data)
{
errorCode_t err = NEARDAL_ERROR_INVALID_PARAMETER;
neardal_agent_t agent;
+ memset(&agent, 0, sizeof(neardal_agent_t));
if (tagType == NULL)
goto exit;
err = NEARDAL_ERROR_NO_MEMORY;
- agent.cb_agent = cb_agent;
- agent.pid = getpid();
- agent.tagType = g_strdup(tagType);
+ agent.cb_ndef_agent = cb_ndef_agent;
+ agent.pid = getpid();
+ agent.user_data = user_data;
+ agent.tagType = g_strdup(tagType);
{ /* replace ':' with '_' */
int len = strlen(agent.tagType);
while (len > 0) {
len--;
}
}
- agent.user_data = user_data;
- agent.objPath = NULL;
- agent.objPath = g_strdup_printf("%s/%s/%d", AGENT_PREFIX
- , agent.tagType, agent.pid);
-
+ agent.objPath = g_strdup_printf("%s/%s/%d", AGENT_PREFIX,
+ agent.tagType, agent.pid);
if (agent.objPath == NULL)
goto exit;
if (err != NEARDAL_SUCCESS)
goto exit;
- if (cb_agent != NULL)
+ if (cb_ndef_agent != NULL)
/* RegisterNDEFAgent */
- org_neard_mgr__call_register_ndefagent_sync(neardalMgr.proxy
- , agent.objPath
- , tagType, NULL
- , &neardalMgr.gerror);
+ org_neard_mgr__call_register_ndefagent_sync(neardalMgr.proxy,
+ agent.objPath,
+ tagType, NULL,
+ &neardalMgr.gerror);
else
/* UnregisterNDEFAgent */
- org_neard_mgr__call_unregister_ndefagent_sync(neardalMgr.proxy
- , agent.objPath
- , tagType, NULL
- , &neardalMgr.gerror);
+ org_neard_mgr__call_unregister_ndefagent_sync(neardalMgr.proxy,
+ agent.objPath,
+ tagType, NULL,
+ &neardalMgr.gerror);
if (neardalMgr.gerror != NULL) {
return err;
}
+
+/*****************************************************************************
+ * neardal_agent_set_handover_cb: register or unregister two callbacks to
+ * handle handover connection. Two callbacks are used, the first one
+ * (oob_request) is used to get Out Of Band data, the second one (oob_push) is
+ * used to pass remote Out Of Band data.
+ * If one of this callback is null, the agent is unregistered
+ ****************************************************************************/
+errorCode_t neardal_agent_set_handover_cb(oob_push_agent_cb cb_oob_push_agent,
+ oob_req_agent_cb cb_oob_req_agent,
+ void *user_data)
+{
+ errorCode_t err = NEARDAL_ERROR_INVALID_PARAMETER;
+ neardal_agent_t agent;
+
+
+ err = NEARDAL_ERROR_NO_MEMORY;
+
+ memset(&agent, 0, sizeof(neardal_agent_t));
+ agent.cb_oob_push_agent = cb_oob_push_agent;
+ agent.cb_oob_req_agent = cb_oob_req_agent;
+ agent.pid = getpid();
+ agent.user_data = user_data;
+ agent.objPath = g_strdup_printf("%s/handover/%d",
+ AGENT_PREFIX, agent.pid);
+ if (agent.objPath == NULL)
+ goto exit;
+
+ err = neardal_handoveragent_prv_manage(agent);
+ if (err != NEARDAL_SUCCESS)
+ goto exit;
+
+ if (cb_oob_push_agent != NULL && cb_oob_req_agent != NULL)
+ /* RegisterNDEFAgent */
+ org_neard_mgr__call_register_handover_agent_sync(
+ neardalMgr.proxy,
+ agent.objPath,
+ NULL,
+ &neardalMgr.gerror);
+ else
+ /* UnregisterNDEFAgent */
+ org_neard_mgr__call_unregister_handover_agent_sync(
+ neardalMgr.proxy,
+ agent.objPath, NULL,
+ &neardalMgr.gerror);
+
+
+ if (neardalMgr.gerror != NULL) {
+ NEARDAL_TRACE_ERR(
+ "Error with neard dbus method (err:%d:'%s')\n"
+ , neardalMgr.gerror->code
+ , neardalMgr.gerror->message);
+ err = NEARDAL_ERROR_DBUS_INVOKE_METHOD_ERROR;
+ goto exit;
+ }
+
+exit:
+ if (err != NEARDAL_SUCCESS)
+ neardal_tools_prv_free_gerror(&neardalMgr.gerror);
+ g_free(agent.objPath);
+
+ return err;
+}
* @param ndefLen number of bytes in ndefArray
* @param user_data Client user data
**/
-typedef void (*agent_cb) (unsigned char **rcdArray, unsigned int rcdLen
- , unsigned char *ndefArray
- , unsigned int ndefLen
- , void *user_data);
+typedef void (*ndef_agent_cb) (unsigned char **rcdArray, unsigned int rcdLen,
+ unsigned char *ndefArray, unsigned int ndefLen,
+ void *user_data);
+
+/**
+ * @brief TODO
+ **/
+typedef void (*freeFunc) (void *ptr);
+
+/**
+ * @brief Callback prototype to get Out Of Band data from the handover agent
+ *
+ * @param blobEIR EIR blob as described in Bluetooth Core
+ * Specification 4.0 (Vol 3, Part C, chapter 8.1.6). Used by SSP capable
+ * devices
+ *
+ * @param blobSize EIR blob size (in bytes)
+ * @param oobData used to build a Handover Request or Select message
+ * (oobData* will be never null)
+ * @param oobDataSize Number of bytes returned (oobDataSize* will be never null)
+ * @param freeFunc Free function to release oobData
+ * @param user_data Client user data
+ * @return Out Of Band data (as an array of bytes)
+ **/
+typedef void (*oob_req_agent_cb) (unsigned char *blobEIR,
+ unsigned int blobSize,
+ unsigned char **oobData,
+ unsigned int *oobDataSize, freeFunc *freeF,
+ void *user_data);
+
+/**
+ * @brief Callback prototype to to pass remote Out Of Band data to agent to
+ * start handover
+ *
+ * @param blobEIR EIR blob as described in Bluetooth Core
+ * Specification 4.0 (Vol 3, Part C, chapter 8.1.6). Used by SSP capable
+ * devices
+ *
+ * @param blobSize EIR blob size (in bytes)
+ * @param user_data Client user data
+ **/
+typedef void (*oob_push_agent_cb) (unsigned char *blobEIR,
+ unsigned int blobSize, void *user_data);
/* @}*/
* @return errorCode_t error code
**/
errorCode_t neardal_set_adapter_property(const char *adpName,
- int adpPropId, void *value);
+ int adpPropId, void *value);
/*! \fn errorCode_t neardal_set_cb_adapter_added( adapter_cb cb_adp_added,
* void * user_data)
* @return errorCode_t error code
**/
errorCode_t neardal_get_tag_properties(const char *tagName,
- neardal_tag **tag);
+ neardal_tag **tag);
/*! \fn errorCode_t neardal_tag_write(neardal_record *record)
* @brief Write NDEF record to an NFC tag
* @return errorCode_t error code
**/
errorCode_t neardal_set_cb_tag_found(tag_cb cb_tag_found,
- void *user_data);
+ void *user_data);
/*! \fn errorCode_t neardal_set_cb_tag_lost(tag_cb cb_tag_lost,
* void * user_data)
* @return errorCode_t error code
**/
errorCode_t neardal_set_cb_tag_lost(tag_cb cb_tag_lost,
- void *user_data);
+ void *user_data);
/*! \fn errorCode_t neardal_get_dev_properties(const char* devName,
* neardal_dev **dev)
* @return errorCode_t error code
**/
errorCode_t neardal_get_dev_properties(const char *devName,
- neardal_dev **dev);
+ neardal_dev **dev);
/*! \fn errorCode_t neardal_dev_push(neardal_record *record)
* @brief Create and push NDEF record to an NFC device
/*! \fn errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent,
* void *user_data)
* @brief register or unregister a callback to handle a record macthing
- * a registered tag type. This callback will received the whole NDEF as
- * a raw byte stream.
+ * a registered tag type. This callback will received the whole NDEF as a raw
+ * byte stream and the records object paths.
+ * If the callback is null, the agent is unregistered.
* @param tagType tag type to register
* @param cb_agent Client callback for the registered tag type
* @param user_data Client user data
* @return errorCode_t error code
**/
-errorCode_t neardal_agent_set_NDEF_cb(char *tagType, agent_cb cb_agent
+errorCode_t neardal_agent_set_NDEF_cb(char *tagType
+ , ndef_agent_cb cb_ndef_agent
, void *user_data);
+/*! \fn errorCode_t neardal_agent_set_handover_cb(
+ * oob_push_agent_cb cb_oob_push_agent
+ * , oob_req_agent_cb cb_oob_req_agent
+ , void *user_data)
+ * @brief register or unregister two callbacks to handle handover connection.
+ * If one of this callback is null, the agent is unregistered.
+ * @param cb_oob_push_agent used to pass remote Out Of Band data
+ * @param cb_oob_req_agent used to get Out Of Band data
+ * @param user_data Client user data
+ * @return errorCode_t error code
+ **/
+errorCode_t neardal_agent_set_handover_cb(oob_push_agent_cb cb_oob_push_agent
+ , oob_req_agent_cb cb_oob_req_agent
+ , void *user_data);
+
/*! @fn errorCode_t neardal_free_array(char ***array)
*
* @brief free memory used by array of adapters/tags/device or records
err = neardal_adp_prv_get_tag(adpProp,
dbusObjPath,
&tagProp);
+ clientValue = dbusObjPath;
if (err == NEARDAL_ERROR_NO_TAG) {
neardal_adp_prv_cb_tag_found(NULL,
dbusObjPath,
dbusObjPath,
&devProp);
if (err == NEARDAL_ERROR_NO_DEV) {
+ clientValue = dbusObjPath;
neardal_adp_prv_cb_dev_found(NULL,
dbusObjPath,
adpProp);
* neardal_adp_prv_get_tag: Get NFC tag from adapter
****************************************************************************/
errorCode_t neardal_adp_prv_get_tag(AdpProp *adpProp, gchar *tagName,
- TagProp **tagProp)
+ TagProp **tagProp)
{
errorCode_t err = NEARDAL_ERROR_NO_TAG;
guint len = 0;
+++ /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;
-
- (void) ndefAgent; /* Avoid warning */
- (void) invocation; /* Avoid warning */
-
- NEARDAL_TRACEIN();
- NEARDAL_TRACEF("%s\n", g_variant_print(out, TRUE));
-
- if (agent_data != NULL) {
- NEARDAL_TRACEF("ndefAgent pid=%d, obj path is : %s\n"
- , agent_data->pid
- , agent_data->objPath);
- if (agent_data->cb_agent != NULL) {
- GVariant *tmpOut = NULL;
-
- tmpOut = g_variant_lookup_value(out, "Records",
- G_VARIANT_TYPE_ARRAY);
- if (tmpOut != NULL) {
- rcdArray = (gchar**) g_variant_dup_strv(tmpOut
- , &rcdLen);
-
- if (rcdLen == 0) {
- g_strfreev(rcdArray);
- rcdArray = NULL;
- }
- }
- tmpOut = g_variant_lookup_value(out, "NDEF",
- G_VARIANT_TYPE_ARRAY);
- if (tmpOut != NULL) {
- value = g_variant_get_data(tmpOut);
- ndefLen = g_variant_get_size(tmpOut);
-
- if (ndefLen > 0) {
- ndefArray = g_try_malloc0(ndefLen);
- if (ndefArray != NULL)
- memcpy(ndefArray, value
- , ndefLen);
- }
- }
- (agent_data->cb_agent)(
- (unsigned char **) rcdArray
- , rcdLen
- , (unsigned char *) ndefArray
- , ndefLen
- , agent_data->user_data);
- }
- }
-
- return TRUE;
-}
-
-static gboolean on_release( neardalNDEFAgent *ndefAgent
- , GDBusMethodInvocation *invocation
- , gpointer user_data)
-{
- neardal_agent_t *agent_data = user_data;
- NEARDAL_TRACEIN();
-
- if (invocation != NULL)
- neardal_ndefagent_complete_release(ndefAgent, invocation);
- if (agent_data != NULL) {
- NEARDAL_TRACEF("agent '%s' ",agent_data->objPath);
-
- if (neardal_agent_prv_remove(agent_data->objPath) == TRUE)
- NEARDAL_TRACE("removed\n");
- else
- NEARDAL_TRACE("not removed!\n");
- g_free(agent_data->objPath);
- g_free(agent_data->tagType);
- g_free(agent_data);
- }
-
- return TRUE;
-}
-
-static void on_object_removed( GDBusObjectManager *manager
- , GDBusObject *object
- , gpointer user_data)
-{
- NEARDAL_TRACEIN();
- (void) manager; /* avoid warning */
- on_release( NEARDAL_NDEFAGENT(object), NULL, user_data);
-}
-
-static void
-on_name_acquired (GDBusConnection *connection
- , const gchar *name
- , gpointer user_data)
-{
- (void) connection; /* avoid warning */
- (void) name; /* avoid warning */
- (void) user_data; /* avoid warning */
- NEARDAL_TRACEIN();
- NEARDAL_TRACE_LOG(":%s\n", name);
-}
-
-static void
-on_name_lost(GDBusConnection *connection
- , const gchar *name
- , gpointer user_data)
-{
- (void) connection; /* avoid warning */
- (void) name; /* avoid warning */
- (void) user_data; /* avoid warning */
- NEARDAL_TRACEIN();
- NEARDAL_TRACE_LOG(":%s\n", name);
-}
-
-/*****************************************************************************
- * neardal_ndefagent_prv_manage: create or release an agent and register or
- * unregister it with neardal object manager and Neard
- ****************************************************************************/
-errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData)
-{
- errorCode_t err = NEARDAL_SUCCESS;
- neardalObjectSkeleton *objSkel;
- neardalNDEFAgent *ndefAgent;
- neardal_agent_t *data;
-
- NEARDAL_TRACEIN();
-
- if (agentData.cb_agent != NULL) {
- data = g_try_malloc0(sizeof(neardal_agent_t));
- if (data == NULL)
- return NEARDAL_ERROR_NO_MEMORY;
-
- memcpy(data, &agentData, sizeof(neardal_agent_t));
- data->objPath = g_strdup(agentData.objPath);
- data->tagType = g_strdup(agentData.tagType);
-
- NEARDAL_TRACEF("Create agent '%s'\n", data->objPath);
- objSkel = neardal_object_skeleton_new (data->objPath);
-
- ndefAgent = neardal_ndefagent_skeleton_new();
- neardal_object_skeleton_set_ndefagent(objSkel, ndefAgent);
-
- /* Handle GetNDEF D-Bus method invocations */
- g_signal_connect ( ndefAgent, "handle-get-ndef"
- , G_CALLBACK (on_get_ndef)
- , data);
-
- /* Handle Release D-Bus method invocations */
- g_signal_connect ( ndefAgent, "handle-release"
- , G_CALLBACK (on_release), data);
-
- g_signal_connect ( neardalMgr.agentMgr, "object-removed"
- , G_CALLBACK (on_object_removed), data);
- g_object_unref (ndefAgent);
-
- /* Export the object */
- g_dbus_object_manager_server_export (neardalMgr.agentMgr
- , G_DBUS_OBJECT_SKELETON (objSkel));
- g_object_unref (objSkel);
- } else {
- NEARDAL_TRACEF("Release agent '%s'\n", agentData.objPath);
- if (neardal_agent_prv_remove(agentData.objPath) == TRUE)
- err = NEARDAL_SUCCESS;
- else
- err = NEARDAL_ERROR_DBUS;
- }
-
- return err;
-}
-
-/*****************************************************************************
- * neardal_ndefagent_prv_release: unregister an agent from Neard and neardal
- * object manager
- ****************************************************************************/
-errorCode_t neardal_ndefagent_prv_release(gchar *objPath)
-{
- errorCode_t err = NEARDAL_SUCCESS;
-
- if (neardal_agent_prv_remove(objPath) == TRUE)
- NEARDAL_TRACE("removed\n");
- else
- NEARDAL_TRACE("not removed!\n");
-
- return err;
-}
-
-/*****************************************************************************
- * neardal_agent_acquire_dbus_name: acquire dbus name for management of neard
- * agent feature
- ****************************************************************************/
-errorCode_t neardal_agent_acquire_dbus_name(void)
-{
- errorCode_t err = NEARDAL_SUCCESS;
-
- NEARDAL_TRACEIN();
- if (neardalMgr.conn == NULL)
- return NEARDAL_ERROR_DBUS;
-
- neardalMgr.OwnerId = g_bus_own_name_on_connection(neardalMgr.conn
- , NEARDAL_DBUS_WELLKNOWN_NAME
- , G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
- G_BUS_NAME_OWNER_FLAGS_REPLACE
- , on_name_acquired /* on_name_acquired */
- , on_name_lost /* on_name_lost */
- , NULL /* user data */
- , NULL); /* freeing user_data func */
-
- if (neardalMgr.OwnerId == 0) {
- err = NEARDAL_ERROR_DBUS;
- goto exit;
- }
-
- /* Create a new org.neardal.ObjectManager rooted at /neardal */
- neardalMgr.agentMgr = g_dbus_object_manager_server_new(AGENT_PREFIX);
- if (neardalMgr.agentMgr == NULL) {
- err = NEARDAL_ERROR_DBUS;
- goto exit;
- }
-
- /* Export all objects */
- g_dbus_object_manager_server_set_connection (neardalMgr.agentMgr
- , neardalMgr.conn);
-
-
-exit:
- if (err != NEARDAL_SUCCESS)
- NEARDAL_TRACE_ERR("(%d:%s)\n", err
- , neardal_error_get_text(err));
-
- return err;
-}
-
-/*****************************************************************************
- * neardal_agent_stop_owning_dbus_name: Stops owning a dbus name
- ****************************************************************************/
-void neardal_agent_stop_owning_dbus_name(void)
-{
- NEARDAL_TRACEIN();
- if (neardalMgr.OwnerId > 0)
- g_bus_unown_name (neardalMgr.OwnerId);
- neardalMgr.OwnerId = 0;
-
-}
--- /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_agent.h"
+
+static gboolean neardal_agent_prv_remove(gchar *objPath)
+{
+ g_assert(objPath != NULL);
+
+ NEARDAL_TRACEIN();
+ return g_dbus_object_manager_server_unexport(neardalMgr.agentMgr
+ , objPath);
+}
+
+static gboolean on_GetNDEF(neardalNDEFAgent *ndefAgent,
+ GDBusMethodInvocation *invocation
+ , GVariant *values
+ , gpointer user_data)
+{
+ neardal_agent_t *agent_data = user_data;
+ gchar **rcdArray = NULL;
+ gsize rcdLen = 0;
+ gchar *ndefArray = NULL;
+ gsize ndefLen = 0;
+ gconstpointer value;
+
+ (void) ndefAgent; /* Avoid warning */
+ (void) invocation; /* Avoid warning */
+
+ NEARDAL_TRACEIN();
+ NEARDAL_TRACEF("%s\n", g_variant_print(values, TRUE));
+
+ if (agent_data != NULL) {
+ NEARDAL_TRACEF("ndefAgent pid=%d, obj path is : %s\n"
+ , agent_data->pid
+ , agent_data->objPath);
+ if (agent_data->cb_ndef_agent != NULL) {
+ GVariant *tmpOut = NULL;
+
+ tmpOut = g_variant_lookup_value(values, "Records",
+ G_VARIANT_TYPE_ARRAY);
+ if (tmpOut != NULL) {
+ rcdArray = (gchar**) g_variant_dup_strv(tmpOut
+ , &rcdLen);
+
+ if (rcdLen == 0) {
+ g_strfreev(rcdArray);
+ rcdArray = NULL;
+ }
+ }
+ tmpOut = g_variant_lookup_value(values, "NDEF",
+ G_VARIANT_TYPE_ARRAY);
+ if (tmpOut != NULL) {
+ value = g_variant_get_data(tmpOut);
+ ndefLen = g_variant_get_size(tmpOut);
+
+ if (ndefLen > 0) {
+ ndefArray = g_try_malloc0(ndefLen);
+ if (ndefArray != NULL)
+ memcpy(ndefArray, value
+ , ndefLen);
+ }
+ }
+ (agent_data->cb_ndef_agent)(
+ (unsigned char **) rcdArray
+ , rcdLen
+ , (unsigned char *) ndefArray
+ , ndefLen
+ , agent_data->user_data);
+ g_free(ndefArray);
+ g_strfreev(rcdArray);
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean on_RequestOOB(neardalHandoverAgent *handoverAgent
+ , GDBusMethodInvocation *invocation
+ , GVariant *values
+ , gpointer user_data)
+{
+ neardal_agent_t *agent_data = user_data;
+ unsigned char *oobData = NULL;
+ unsigned int oobDataLen = 0;
+ void (*freeFunc)(void * ptr);
+ gchar *blobKey;
+ gchar *blob = NULL;
+ gsize blobLen = 0;
+ gconstpointer value;
+ GVariant *result;
+ errorCode_t err = NEARDAL_ERROR_GENERAL_ERROR;
+
+ (void) handoverAgent; /* Avoid warning */
+ (void) invocation; /* Avoid warning */
+
+ NEARDAL_TRACEIN();
+ NEARDAL_TRACEF("%s\n", g_variant_print(values, TRUE));
+
+ if (agent_data != NULL) {
+ freeFunc = NULL;
+ NEARDAL_TRACEF("handoverAgent pid=%d, obj path is : %s\n"
+ , agent_data->pid
+ , agent_data->objPath);
+ if (agent_data->cb_oob_req_agent != NULL) {
+ GVariant *tmpOut = NULL;
+
+ blobKey = "EIR";
+ tmpOut = g_variant_lookup_value(values, blobKey,
+ G_VARIANT_TYPE_ARRAY);
+ if (tmpOut != NULL) {
+ value = g_variant_get_data(tmpOut);
+ blobLen = g_variant_get_size(tmpOut);
+
+ if (blobLen > 0) {
+ blob = g_try_malloc0(blobLen);
+ if (blob != NULL)
+ memcpy(blob, value
+ , blobLen);
+ }
+ } else {
+ blobKey = "nokia.com:bt";
+ tmpOut = g_variant_lookup_value(values,
+ blobKey,
+ G_VARIANT_TYPE_ARRAY);
+ if (tmpOut != NULL) {
+ value = g_variant_get_data(tmpOut);
+ blobLen = g_variant_get_size(tmpOut);
+
+ if (blobLen > 0) {
+ blob = g_try_malloc0(blobLen);
+ if (blob != NULL)
+ memcpy(blob, value
+ , blobLen);
+ }
+ }
+ }
+ (agent_data->cb_oob_req_agent)(
+ (unsigned char *) blob
+ , blobLen
+ , &oobData
+ , &oobDataLen
+ , &freeFunc
+ , agent_data->user_data);
+ if (oobData != NULL) {
+ GVariantBuilder *dictBuilder = NULL;
+
+ dictBuilder = g_variant_builder_new(
+ G_VARIANT_TYPE_ARRAY);
+ err = neardal_tools_prv_add_dict_entry(
+ dictBuilder,
+ blobKey, oobData, oobDataLen
+ , -1);
+ result = g_variant_builder_end(dictBuilder);
+
+ NEARDAL_TRACE_LOG("Sending:\n%s\n",
+ g_variant_print(result
+ , TRUE));
+
+ neardal_handover_agent_complete_request_oob(
+ handoverAgent
+ , invocation
+ , result);
+ err = NEARDAL_SUCCESS;
+ }
+ }
+ }
+
+ if (freeFunc != NULL && oobData != NULL)
+ (freeFunc)(oobData);
+ if (blob != NULL)
+ g_free(blob);
+
+ if (err != NEARDAL_SUCCESS)
+ g_dbus_method_invocation_return_error(invocation
+ , G_DBUS_ERROR_FAILED
+ , G_DBUS_ERROR_FAILED
+ , neardal_error_get_text(err));
+
+ return TRUE;
+}
+
+static gboolean on_PushOOB(neardalHandoverAgent *handoverAgent
+ , GDBusMethodInvocation *invocation
+ , GVariant *values
+ , gpointer user_data)
+{
+ neardal_agent_t *agent_data = user_data;
+ gconstpointer value;
+ gchar *blobKey;
+ gchar *blob = NULL;
+ gsize blobLen = 0;
+
+ (void) handoverAgent; /* Avoid warning */
+ (void) invocation; /* Avoid warning */
+
+ NEARDAL_TRACEIN();
+ NEARDAL_TRACEF("%s\n", g_variant_print(values, TRUE));
+
+ if (agent_data != NULL) {
+ NEARDAL_TRACEF("handoverAgent pid=%d, obj path is : %s\n"
+ , agent_data->pid
+ , agent_data->objPath);
+ if (agent_data->cb_oob_push_agent != NULL) {
+ GVariant *tmpOut = NULL;
+
+ blobKey = "EIR";
+ tmpOut = g_variant_lookup_value(values, blobKey,
+ G_VARIANT_TYPE_ARRAY);
+ if (tmpOut != NULL) {
+ value = g_variant_get_data(tmpOut);
+ blobLen = g_variant_get_size(tmpOut);
+
+ if (blobLen > 0) {
+ blob = g_try_malloc0(blobLen);
+ if (blob != NULL)
+ memcpy(blob, value
+ , blobLen);
+ }
+ } else {
+ blobKey = "nokia.com:bt";
+ tmpOut = g_variant_lookup_value(values,
+ blobKey,
+ G_VARIANT_TYPE_ARRAY);
+ if (tmpOut != NULL) {
+ value = g_variant_get_data(tmpOut);
+ blobLen = g_variant_get_size(tmpOut);
+
+ if (blobLen > 0) {
+ blob = g_try_malloc0(blobLen);
+ if (blob != NULL)
+ memcpy(blob, value
+ , blobLen);
+ }
+ }
+ }
+ (agent_data->cb_oob_push_agent)(
+ (unsigned char *) blob
+ , blobLen
+ , agent_data->user_data);
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean on_Release( neardalNDEFAgent *agent
+ , GDBusMethodInvocation *invocation
+ , gpointer user_data)
+{
+ neardal_agent_t *agent_data = user_data;
+ NEARDAL_TRACEIN();
+
+ if (invocation != NULL)
+ neardal_ndefagent_complete_release(agent, invocation);
+ if (agent_data != NULL) {
+ NEARDAL_TRACEF("agent '%s' ",agent_data->objPath);
+
+ if (neardal_agent_prv_remove(agent_data->objPath) == TRUE)
+ NEARDAL_TRACE("removed\n");
+ else
+ NEARDAL_TRACE("not removed!\n");
+ g_free(agent_data->objPath);
+ g_free(agent_data->tagType);
+ g_free(agent_data);
+ }
+
+ return TRUE;
+}
+
+static void on_object_removed( GDBusObjectManager *manager
+ , GDBusObject *object
+ , gpointer user_data)
+{
+ NEARDAL_TRACEIN();
+ (void) manager; /* avoid warning */
+ on_Release( NEARDAL_NDEFAGENT(object), NULL, user_data);
+}
+
+static void
+on_name_acquired (GDBusConnection *connection
+ , const gchar *name
+ , gpointer user_data)
+{
+ (void) connection; /* avoid warning */
+ (void) name; /* avoid warning */
+ (void) user_data; /* avoid warning */
+ NEARDAL_TRACEIN();
+ NEARDAL_TRACE_LOG(":%s\n", name);
+}
+
+static void
+on_name_lost(GDBusConnection *connection
+ , const gchar *name
+ , gpointer user_data)
+{
+ (void) connection; /* avoid warning */
+ (void) name; /* avoid warning */
+ (void) user_data; /* avoid warning */
+ NEARDAL_TRACEIN();
+ NEARDAL_TRACE_LOG(":%s\n", name);
+}
+
+/*****************************************************************************
+ * neardal_ndefagent_prv_manage: create or release an agent and register or
+ * unregister it with neardal object manager and Neard
+ ****************************************************************************/
+errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData)
+{
+ errorCode_t err = NEARDAL_SUCCESS;
+ neardalObjectSkeleton *objSkel;
+ neardalNDEFAgent *ndefAgent;
+ neardal_agent_t *data;
+
+ NEARDAL_TRACEIN();
+
+ if (agentData.cb_ndef_agent != NULL) {
+ data = g_try_malloc0(sizeof(neardal_agent_t));
+ if (data == NULL)
+ return NEARDAL_ERROR_NO_MEMORY;
+
+ memcpy(data, &agentData, sizeof(neardal_agent_t));
+ data->objPath = g_strdup(agentData.objPath);
+ data->tagType = g_strdup(agentData.tagType);
+
+ NEARDAL_TRACEF("Create agent '%s'\n", data->objPath);
+ objSkel = neardal_object_skeleton_new (data->objPath);
+
+ ndefAgent = neardal_ndefagent_skeleton_new();
+ neardal_object_skeleton_set_ndefagent(objSkel, ndefAgent);
+
+ /* Handle GetNDEF D-Bus method invocations */
+ g_signal_connect ( ndefAgent, "handle-get-ndef"
+ , G_CALLBACK (on_GetNDEF)
+ , data);
+
+ /* Handle Release D-Bus method invocations */
+ g_signal_connect ( ndefAgent, "handle-release"
+ , G_CALLBACK (on_Release), data);
+
+ g_signal_connect ( neardalMgr.agentMgr, "object-removed"
+ , G_CALLBACK (on_object_removed), data);
+ g_object_unref (ndefAgent);
+
+ /* Export the object */
+ g_dbus_object_manager_server_export (neardalMgr.agentMgr
+ , G_DBUS_OBJECT_SKELETON (objSkel));
+ g_object_unref (objSkel);
+ } else {
+ NEARDAL_TRACEF("Release agent '%s'\n", agentData.objPath);
+ if (neardal_agent_prv_remove(agentData.objPath) == TRUE)
+ err = NEARDAL_SUCCESS;
+ else
+ err = NEARDAL_ERROR_DBUS;
+ g_free(agentData.objPath);
+ g_free(agentData.tagType);
+ }
+
+ return err;
+}
+
+/*****************************************************************************
+ * neardal_ndefagent_prv_release: unregister an agent from Neard and neardal
+ * object manager
+ ****************************************************************************/
+errorCode_t neardal_ndefagent_prv_release(gchar *objPath)
+{
+ errorCode_t err = NEARDAL_SUCCESS;
+
+ if (neardal_agent_prv_remove(objPath) == TRUE)
+ NEARDAL_TRACE("removed\n");
+ else
+ NEARDAL_TRACE("not removed!\n");
+
+ return err;
+}
+
+/*****************************************************************************
+ * neardal_handoveragent_prv_manage: create or release an agent and register
+ * or unregister it with neardal object manager and Neard
+ ****************************************************************************/
+errorCode_t neardal_handoveragent_prv_manage(neardal_agent_t agentData)
+{
+ errorCode_t err = NEARDAL_SUCCESS;
+ neardalObjectSkeleton *objSkel;
+ neardalHandoverAgent *handoverAgent;
+ neardal_agent_t *data;
+
+ NEARDAL_TRACEIN();
+
+ if (agentData.cb_oob_push_agent != NULL &&
+ agentData.cb_oob_req_agent != NULL) {
+ data = g_try_malloc0(sizeof(neardal_agent_t));
+ if (data == NULL)
+ return NEARDAL_ERROR_NO_MEMORY;
+
+ memcpy(data, &agentData, sizeof(neardal_agent_t));
+ data->objPath = g_strdup(agentData.objPath);
+
+ NEARDAL_TRACEF("Create agent '%s'\n", data->objPath);
+ objSkel = neardal_object_skeleton_new (data->objPath);
+
+ handoverAgent = neardal_handover_agent_skeleton_new();
+ neardal_object_skeleton_set_handover_agent(objSkel,
+ handoverAgent);
+
+ /* Handle RequestOOB() D-Bus method invocations */
+ g_signal_connect ( handoverAgent, "handle-request-oob"
+ , G_CALLBACK (on_RequestOOB)
+ , data);
+
+ /* Handle PushOOB() D-Bus method invocations */
+ g_signal_connect ( handoverAgent, "handle-push-oob"
+ , G_CALLBACK (on_PushOOB)
+ , data);
+
+ /* Handle Release D-Bus method invocations */
+ g_signal_connect ( handoverAgent, "handle-release"
+ , G_CALLBACK (on_Release), data);
+
+ g_signal_connect ( neardalMgr.agentMgr, "object-removed"
+ , G_CALLBACK (on_object_removed), data);
+ g_object_unref (handoverAgent);
+
+ /* Export the object */
+ g_dbus_object_manager_server_export (neardalMgr.agentMgr
+ , G_DBUS_OBJECT_SKELETON (objSkel));
+ g_object_unref (objSkel);
+ } else {
+ NEARDAL_TRACEF("Release agent '%s'\n", agentData.objPath);
+ if (neardal_agent_prv_remove(agentData.objPath) == TRUE)
+ err = NEARDAL_SUCCESS;
+ else
+ err = NEARDAL_ERROR_DBUS;
+ }
+
+ return err;
+}
+
+/*****************************************************************************
+ * neardal_handoveragent_prv_release: unregister an agent from Neard and neardal
+ * object manager
+ ****************************************************************************/
+errorCode_t neardal_handoveragent_prv_release(gchar *objPath)
+{
+ errorCode_t err = NEARDAL_SUCCESS;
+
+ if (neardal_agent_prv_remove(objPath) == TRUE)
+ NEARDAL_TRACE("removed\n");
+ else
+ NEARDAL_TRACE("not removed!\n");
+
+ return err;
+}
+
+
+/*****************************************************************************
+ * neardal_agent_acquire_dbus_name: acquire dbus name for management of neard
+ * agent feature
+ ****************************************************************************/
+errorCode_t neardal_agent_acquire_dbus_name(void)
+{
+ errorCode_t err = NEARDAL_SUCCESS;
+
+ NEARDAL_TRACEIN();
+ if (neardalMgr.conn == NULL)
+ return NEARDAL_ERROR_DBUS;
+
+ neardalMgr.OwnerId = g_bus_own_name_on_connection(neardalMgr.conn
+ , NEARDAL_DBUS_WELLKNOWN_NAME
+ , G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT |
+ G_BUS_NAME_OWNER_FLAGS_REPLACE
+ , on_name_acquired /* on_name_acquired */
+ , on_name_lost /* on_name_lost */
+ , NULL /* user data */
+ , NULL); /* freeing user_data func */
+
+ if (neardalMgr.OwnerId == 0) {
+ err = NEARDAL_ERROR_DBUS;
+ goto exit;
+ }
+
+ /* Create a new org.neardal.ObjectManager rooted at /neardal */
+ neardalMgr.agentMgr = g_dbus_object_manager_server_new(AGENT_PREFIX);
+ if (neardalMgr.agentMgr == NULL) {
+ err = NEARDAL_ERROR_DBUS;
+ goto exit;
+ }
+
+ /* Export all objects */
+ g_dbus_object_manager_server_set_connection (neardalMgr.agentMgr
+ , neardalMgr.conn);
+
+
+exit:
+ if (err != NEARDAL_SUCCESS)
+ NEARDAL_TRACE_ERR("(%d:%s)\n", err
+ , neardal_error_get_text(err));
+
+ return err;
+}
+
+/*****************************************************************************
+ * neardal_agent_stop_owning_dbus_name: Stops owning a dbus name
+ ****************************************************************************/
+void neardal_agent_stop_owning_dbus_name(void)
+{
+ NEARDAL_TRACEIN();
+ if (neardalMgr.OwnerId > 0)
+ g_bus_unown_name (neardalMgr.OwnerId);
+ neardalMgr.OwnerId = 0;
+
+}
#ifndef __NEARDAL_AGENT_H
#define __NEARDAL_AGENT_H
-#include "neardal_adapter.h"
+#include "neardal.h"
#ifdef __cplusplus
extern "C" {
typedef struct {
- gchar *objPath; /* agent object path */
- gchar *tagType; /* tag Type to register */
- gint pid;
- agent_cb cb_agent;
- gpointer user_data;
+ gchar *objPath; /* agent object path */
+ gchar *tagType; /* tag Type to register
+ (for NDEF agent only )
+ */
+
+ gint pid; /* process pid */
+
+ ndef_agent_cb cb_ndef_agent; /* client callback to
+ retrieve raw NDEF data
+ and records object path
+ */
+
+ oob_req_agent_cb cb_oob_req_agent; /* client callback to
+ get Out Of Band data
+ from the handover agent
+ */
+
+ oob_push_agent_cb cb_oob_push_agent; /* client callback to
+ pass remote Out Of Band
+ data to agent to start
+ handover */
+ gpointer user_data;
} neardal_agent_t;
/*****************************************************************************
/*****************************************************************************
* neardal_ndefagent_prv_manage: create or release an agent and register or
- * unregister it with neardal object manager
+ * unregister it with neardal object manager and Neard for NDEF data
****************************************************************************/
errorCode_t neardal_ndefagent_prv_manage(neardal_agent_t agentData);
+/*****************************************************************************
+ * neardal_handoveragent_prv_manage: create or release an agent and register
+ * or unregister it with neardal object manager and Neard for handover message
+ * (request / answer)
+ ****************************************************************************/
+errorCode_t neardal_handoveragent_prv_manage(neardal_agent_t agentData);
#ifdef __cplusplus
}
****************************************************************************/
errorCode_t neardal_dev_prv_push(DevProp *devProp, RcdProp *rcd)
{
- GVariantBuilder *builder = NULL;
+ GVariantBuilder *dictBuilder = NULL;
GVariant *in;
errorCode_t err;
GError *gerror = NULL;
NEARDAL_ASSERT_RET(devProp != NULL, NEARDAL_ERROR_INVALID_PARAMETER);
- builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
- if (builder == NULL)
+ dictBuilder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
+ if (dictBuilder == NULL)
return NEARDAL_ERROR_NO_MEMORY;
- g_variant_builder_init(builder, G_VARIANT_TYPE_ARRAY);
- err = neardal_rcd_prv_format(builder, rcd);
+ err = neardal_rcd_prv_format(dictBuilder, rcd);
if (err != NEARDAL_SUCCESS)
goto exit;
- in = g_variant_builder_end(builder);
+ in = g_variant_builder_end(dictBuilder);
NEARDAL_TRACE_LOG("Sending:\n%s\n", g_variant_print(in, TRUE));
org_neard_dev__call_push_sync(devProp->proxy, in, NULL, &gerror);
g_error_free(gerror);
err = NEARDAL_ERROR_DBUS;
}
- if (builder != NULL)
- g_variant_builder_unref(builder);
+ g_variant_builder_unref(dictBuilder);
return err;
}
#include "neard_manager_proxy.h"
-#include "neardal_agent.h"
+#include "neardal_agent_mgr.h"
#include "neardal_manager.h"
#include "neardal_tools.h"
#include "neardal_traces_prv.h"
/* Type */
if (rcd->type != NULL)
- neardal_tools_prv_add_dict_entry(builder, "Type", rcd->type,
- (int) G_TYPE_STRING);
+ neardal_tools_prv_add_dict_entry(builder, "Type", rcd->type
+ , 0, (int) G_TYPE_STRING);
/* Encoding */
if (rcd->encoding != NULL)
neardal_tools_prv_add_dict_entry(builder, "Encoding"
- , rcd->encoding
+ , rcd->encoding, 0
, (int) G_TYPE_STRING);
/* Language */
if (rcd->language != NULL)
neardal_tools_prv_add_dict_entry(builder, "Language"
- , rcd->language
+ , rcd->language, 0
, (int) G_TYPE_STRING);
/* Representation */
if (rcd->representation != NULL)
- neardal_tools_prv_add_dict_entry(builder, "Representation",
- rcd->representation,
- (int) G_TYPE_STRING);
+ neardal_tools_prv_add_dict_entry(builder, "Representation"
+ , rcd->representation, 0
+ , (int) G_TYPE_STRING);
/* URI */
if (rcd->uri != NULL) {
- neardal_tools_prv_add_dict_entry(builder, "URI", rcd->uri,
- (int) G_TYPE_STRING);
- neardal_tools_prv_add_dict_entry(builder, "Size",
- (void *) rcd->uriObjSize,
- (int) G_TYPE_UINT);
-
+ neardal_tools_prv_add_dict_entry(builder, "URI", rcd->uri, 0
+ , (int) G_TYPE_STRING);
+ neardal_tools_prv_add_dict_entry(builder, "Size"
+ , (void *) rcd->uriObjSize, 0
+ , (int) G_TYPE_UINT);
}
/* MIME */
if (rcd->mime != NULL)
- neardal_tools_prv_add_dict_entry(builder, "MIME", rcd->mime,
- (int) G_TYPE_STRING);
+ neardal_tools_prv_add_dict_entry(builder, "MIME", rcd->mime
+ ,0 , (int) G_TYPE_STRING);
/* Action */
if (rcd->action != NULL)
- neardal_tools_prv_add_dict_entry(builder, "Action", rcd->action,
- (int) G_TYPE_STRING);
+ neardal_tools_prv_add_dict_entry(builder, "Action"
+ , rcd->action, 0
+ , (int) G_TYPE_STRING);
return err;
}
****************************************************************************/
errorCode_t neardal_tag_prv_write(TagProp *tagProp, RcdProp *rcd)
{
- GVariantBuilder *builder = NULL;
+ GVariantBuilder *dictBuilder = NULL;
GVariant *in;
errorCode_t err;
GError *gerror = NULL;
NEARDAL_ASSERT_RET(tagProp != NULL, NEARDAL_ERROR_INVALID_PARAMETER);
- builder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
- if (builder == NULL)
+ dictBuilder = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
+ if (dictBuilder == NULL)
return NEARDAL_ERROR_NO_MEMORY;
- g_variant_builder_init(builder, G_VARIANT_TYPE_ARRAY);
- err = neardal_rcd_prv_format(builder, rcd);
+ err = neardal_rcd_prv_format(dictBuilder, rcd);
if (err != NEARDAL_SUCCESS)
goto exit;
- in = g_variant_builder_end(builder);
+ in = g_variant_builder_end(dictBuilder);
NEARDAL_TRACEF("Sending:\n%s\n", g_variant_print(in, TRUE));
org_neard_tag__call_write_sync(tagProp->proxy, in, NULL, &gerror);
g_error_free(gerror);
err = NEARDAL_ERROR_DBUS;
}
- if (builder != NULL)
- g_variant_builder_unref(builder);
+ g_variant_builder_unref(dictBuilder);
return err;
}
****************************************************************************/
errorCode_t neardal_tools_prv_add_dict_entry(GVariantBuilder *builder
, gchar *key, void *value
+ , gsize valueSize
, int gVariantType)
{
- GVariant *tmp = NULL;
+ GVariant *tmp = NULL;
+ GVariantBuilder *bytesArrayBuilder = NULL;
+ unsigned char *bytePtr;
+ gsize count;
+ errorCode_t err = NEARDAL_SUCCESS;
NEARDAL_ASSERT_RET(builder != NULL, NEARDAL_ERROR_INVALID_PARAMETER);
case G_TYPE_UINT:
tmp = g_variant_new_uint32((guint32) value);
break;
- case G_TYPE_VARIANT:
- tmp = (GVariant *) value;
+ default:
+ /* if valueSize > 0, consider value as byte array
+ processing like g_variant_new_bytestring() but based on array
+ size and not a null terminated string (allowing byte = 0
+ in array) */
+ if (valueSize > 0) {
+ err = NEARDAL_ERROR_GENERAL_ERROR;
+ bytePtr = (unsigned char*) value;
+ bytesArrayBuilder = g_variant_builder_new(
+ G_VARIANT_TYPE_BYTESTRING);
+ if (bytesArrayBuilder == NULL)
+ break;
+
+ for (count = 0; count < valueSize; count++)
+ g_variant_builder_add(bytesArrayBuilder, "y"
+ , bytePtr[count]);
+
+ tmp = g_variant_builder_end(bytesArrayBuilder);
+ g_variant_builder_unref(bytesArrayBuilder);
+ err = NEARDAL_SUCCESS;
+ }
+ break;
}
g_variant_builder_add(builder, "{sv}", key, tmp);
- return NEARDAL_SUCCESS;
+ return err;
}
*****************************************************************************/
errorCode_t neardal_tools_prv_add_dict_entry(GVariantBuilder *builder
, gchar *key, void *value
+ , gsize valueSize
, int gVariantType);
#ifdef __cplusplus
if (offset < nbColumn) {
/* 3 space because each byte in binary format as 2 digit and
1 space */
- g_string_append_len(bufDestP, " ", nbColumn - offset);
+ remainingSize = (nbColumn - offset) * 3;
+ offset = 0;
+ while ((offset++) < remainingSize)
+ g_string_append_c(bufDestP, ' ');
}
}
offset++;
}
/* Adding space to finish ascii column */
- if (offset < nbColumn)
- g_string_append_len(bufDestP, " ", nbColumn - offset);
+ if (offset < nbColumn) {
+ remainingSize = nbColumn - offset;
+ offset = 0;
+ while ((offset++) < remainingSize)
+ g_string_append_c(bufDestP, '.');
+ }
}
if (offset < nbColumn) {
/* 3 space because each byte in binary format as 2 digit and
1 space */
- g_string_append_len(bufDestP, " ", nbColumn - offset);
+ remainingSize = (nbColumn - offset) * 3;
+ offset = 0;
+ while ((offset++) < remainingSize)
+ g_string_append_c(bufDestP, ' ');
}
}
offset++;
}
/* Adding space to finish ascii column */
- if (offset < nbColumn)
- g_string_append_len(bufDestP, " ", nbColumn - offset);
+ if (offset < nbColumn) {
+ remainingSize = nbColumn - offset;
+ offset = 0;
+ while ((offset++) < remainingSize)
+ g_string_append_c(bufDestP, '.');
+ }
}
{ NULL, 0, 0, 0, NULL, NULL, NULL} /* End of List */
};
+ memset(&rcd, 0, sizeof(neardal_record));
if (argc > 1) {
/* Parse options */
- memset(&rcd, 0, sizeof(neardal_record));
nclErr = ncl_cmd_prv_parseOptions(&argc, &argv, options);
} else
nclErr = NCLERR_PARSING_PARAMETERS;
* ncl_cmd_(un)register_NDEF_agent : BEGIN
* Handle a record macthing a registered tag type
****************************************************************************/
-void ncl_cmd_agent_cb(unsigned char **rcdArray, unsigned int rcdLen
+void ncl_cmd_ndef_agent_cb(unsigned char **rcdArray, unsigned int rcdLen
, unsigned char *ndefArray, unsigned int ndefLen
, void *user_data)
{
+ unsigned int i;
+
(void) user_data;
- NCL_CMD_PRINTF("Received %d records and %d bytes of NDEF raw data.\n"
- , rcdLen, ndefLen);
+ NCL_CMD_PRINTF("Received %d records :\n"
+ , rcdLen);
+ for (i = 0; i < rcdLen; i++) {
+ NCL_CMD_PRINT("Record : '%s'\n", rcdArray[i]);
+ }
+ NCL_CMD_PRINT("\n");
+ NCL_CMD_PRINTF("%d bytes of NDEF raw data Received :\n"
+ , ndefLen);
NCL_CMD_DUMP(ndefArray, ndefLen);
+ NCL_CMD_PRINT("\n");
- neardal_free_array((char***) &rcdArray);
- g_free(ndefArray);
}
static NCLError ncl_cmd_register_NDEF_agent(int argc, char *argv[])
NCLError nclErr;
static char *tagType;
- if (argc <= 1)
- return NCLERR_PARSING_PARAMETERS;
-
static GOptionEntry options[] = {
{ "tagType", 's', 0, G_OPTION_ARG_STRING , &tagType
, "tag Type to register",
- "'Text', 'URI'..." },
+ "'urn:nfc:wkt:U'..." },
{ NULL, 0, 0, 0, NULL, NULL, NULL} /* End of List */
};
} else
nclErr = NCLERR_PARSING_PARAMETERS;
+ if (nclErr != NCLERR_NOERROR) {
+ ncl_cmd_print(stdout, "Sample (Type 'Text'):");
+ ncl_cmd_print(stdout, "e.g. < %s --tagType urn:nfc:wkt:U >\n"
+ , argv[0]);
+ }
if (nclErr != NCLERR_NOERROR)
goto exit;
if (sNclCmdCtx.cb_initialized == false)
ncl_cmd_install_callback();
- ec = neardal_agent_set_NDEF_cb(tagType, ncl_cmd_agent_cb, NULL);
+ ec = neardal_agent_set_NDEF_cb(tagType, ncl_cmd_ndef_agent_cb, NULL);
if (ec != NEARDAL_SUCCESS) {
NCL_CMD_PRINTF("Set NDEF callback failed! error:%d='%s'.\n",
ec, neardal_error_get_text(ec));
return NCLERR_NOERROR;
}
+
/*****************************************************************************
* ncl_cmd_(un)register_NDEF_agent : END
****************************************************************************/
+/*****************************************************************************
+ * ncl_cmd_(un)register_handover_agent : BEGIN
+ * Handle a record macthing a registered tag type
+ ****************************************************************************/
+void ncl_cmd_handover_req_agent_cb(unsigned char *blobEIR
+ , unsigned int blobSize
+ , unsigned char ** oobData
+ , unsigned int * oobDataSize
+ , freeFunc *freeF
+ , void *user_data)
+{
+ const unsigned char test_data[] = {0x16,0x00,0x01,0x02,0x03,0x04,
+ 0x05,0x06,0x08,0x09,0x41,0x72,
+ 0x72,0x61,0x6b,0x69,0x73,0x04,
+ 0x0d,0x6e,0x01,0x00};
+
+ (void) user_data;
+
+ NCL_CMD_PRINTF("Received blobEIR = \n");
+ NCL_CMD_DUMP(blobEIR, blobSize);
+
+ *oobData = g_try_malloc0(sizeof(test_data));
+ memcpy(*oobData , test_data, sizeof(test_data));
+ *oobDataSize = sizeof(test_data);
+ *freeF = g_free;
+ NCL_CMD_PRINTF("return oobData = \n");
+ NCL_CMD_DUMP(*oobData, *oobDataSize);
+}
+
+void ncl_cmd_handover_push_agent_cb (unsigned char *blobEIR
+ , unsigned int blobSize
+ , void *user_data)
+{
+ NCL_CMD_PRINTF("Received blobEIR = \n");
+ NCL_CMD_DUMP(blobEIR, blobSize);
+ (void) user_data;
+
+ NCL_CMD_PRINTF("\n");
+}
+
+static NCLError ncl_cmd_register_handover_agent(int argc, char *argv[])
+{
+ errorCode_t ec = NEARDAL_SUCCESS;
+
+ (void) argc;
+ (void) argv;
+
+ /* Install Neardal Callback*/
+ if (sNclCmdCtx.cb_initialized == false)
+ ncl_cmd_install_callback();
+
+ ec = neardal_agent_set_handover_cb(ncl_cmd_handover_push_agent_cb
+ , ncl_cmd_handover_req_agent_cb
+ , NULL);
+ if (ec != NEARDAL_SUCCESS) {
+ NCL_CMD_PRINTF("Set handover callback failed! error:%d='%s'.\n",
+ ec, neardal_error_get_text(ec));
+ return NCLERR_LIB_ERROR;
+ }
+ NCL_CMD_PRINT("\nExit with error code %d:%s\n", ec,
+ neardal_error_get_text(ec));
+
+ return NCLERR_NOERROR;
+}
+static NCLError ncl_cmd_unregister_handover_agent(int argc, char *argv[])
+{
+ errorCode_t ec = NEARDAL_SUCCESS;
+
+ (void) argc;
+ (void) argv;
+
+ /* Install Neardal Callback*/
+ if (sNclCmdCtx.cb_initialized == false)
+ ncl_cmd_install_callback();
+
+ ec = neardal_agent_set_handover_cb(NULL, NULL, NULL);
+ if (ec != NEARDAL_SUCCESS) {
+ NCL_CMD_PRINTF("Set handover callback failed! error:%d='%s'.\n",
+ ec, neardal_error_get_text(ec));
+ return NCLERR_LIB_ERROR;
+ }
+ NCL_CMD_PRINT("\nExit with error code %d:%s\n", ec,
+ neardal_error_get_text(ec));
+
+ return NCLERR_NOERROR;
+}
+/*****************************************************************************
+ * ncl_cmd_(un)register_handover_agent : END
+ ****************************************************************************/
+
/*****************************************************************************
* test parameter type (sample code) : BEGIN
ncl_cmd_push,
"Creates and push a NDEF record to a NFC device"},
+ { "registerHandover",
+ ncl_cmd_register_handover_agent,
+ "register a handler for handover connection"},
+
{ "registerNDEFtype",
ncl_cmd_register_NDEF_agent,
"register a handler for a specific NDEF tag type"},
ncl_cmd_test_parameters,
"Simple test to parse input parameters"},
+ { "unregisterHandover",
+ ncl_cmd_unregister_handover_agent,
+ "unregister a handler for handover connection"},
+
{ "unregisterNDEFtype",
ncl_cmd_unregister_NDEF_agent,
"unregister a handler for a specific NDEF tag type"},