tag: Add tag creating/deleting API
authorSamuel Ortiz <sameo@linux.intel.com>
Tue, 31 May 2011 13:00:58 +0000 (15:00 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 21 Oct 2011 06:54:03 +0000 (23:54 -0700)
Makefile.am
include/tag.h
src/near.h
src/tag.c
src/target.c

index db80a0b..95c37e5 100644 (file)
@@ -4,7 +4,8 @@ AM_MAKEFLAGS = --no-print-directory
 includedir = @includedir@/near
 
 include_HEADERS = include/types.h include/log.h include/plugin.h \
-                       include/tag.h include/adapter.h include/ndef.h
+                       include/tag.h include/adapter.h include/ndef.h \
+                       include/target.h
 
 nodist_include_HEADERS = include/version.h
 
index ea7ef89..d508a57 100644 (file)
@@ -43,6 +43,8 @@ struct near_tag_driver {
        int (*read_tag)(uint32_t adapter_idx, uint32_t target_idx);
 };
 
+struct near_tag;
+
 int near_tag_driver_register(struct near_tag_driver *driver);
 void near_tag_driver_unregister(struct near_tag_driver *driver);
 
index 5d8e656..df491a5 100644 (file)
@@ -83,6 +83,8 @@ void __near_adapter_list(DBusMessageIter *iter, void *user_data);
 int __near_adapter_init(void);
 void __near_adapter_cleanup(void);
 
+#include <near/target.h>
+
 enum near_target_type {
        NEAR_TARGET_TYPE_TAG = 0,
        NEAR_TARGET_TYPE_DEVICE = 1,
@@ -102,6 +104,8 @@ void __near_target_cleanup(void);
 
 #include <near/tag.h>
 
+struct near_tag *__near_tag_new(uint32_t adapter_idx, uint32_t target_idx);
+void __near_tag_free(struct near_tag *tag);
 int __near_tag_read(struct near_target *target);
 
 int __near_netlink_get_adapters(void);
index 2b89120..3508999 100644 (file)
--- a/src/tag.c
+++ b/src/tag.c
 
 #include "near.h"
 
+struct near_tag {
+       uint32_t adapter_idx;
+       uint32_t target_idx;
+       uint16_t uid;
+
+       uint16_t data_length;
+       uint8_t *data;
+
+       GList *ndef_list;
+};
+
 static GList *driver_list = NULL;
 
+static void tag_initialize(struct near_tag *tag,
+                       uint32_t adapter_idx, uint32_t target_idx)
+{
+       tag->adapter_idx = adapter_idx;
+       tag->target_idx = target_idx;
+
+       return;
+}
+
+struct near_tag *__near_tag_new(uint32_t adapter_idx, uint32_t target_idx)
+{
+       struct near_tag *tag;
+
+       tag = g_try_malloc0(sizeof(struct near_tag));
+       if (tag == NULL)
+               return NULL;
+
+       tag_initialize(tag, adapter_idx, target_idx);
+
+       return tag;
+}
+
+void __near_tag_free(struct near_tag *tag)
+{
+       g_free(tag->data);
+       g_free(tag);
+}
+
 int near_tag_driver_register(struct near_tag_driver *driver)
 {
        DBG("");
index ed82dd6..7e974aa 100644 (file)
@@ -40,7 +40,9 @@ struct near_target {
        uint32_t adapter_idx;
        uint32_t protocols;
        enum near_target_type type;
+
        uint16_t tag_type;
+       struct near_tag *tag;
 };
 
 static DBusConnection *connection = NULL;
@@ -51,6 +53,8 @@ static void free_target(gpointer data)
 {
        struct near_target *target = data;
 
+       if (target->tag != NULL)
+               __near_tag_free(target->tag);
        g_free(target->path);
        g_free(target);
 }
@@ -344,6 +348,25 @@ void __near_target_remove(uint32_t target_idx)
        g_hash_table_remove(target_hash, GINT_TO_POINTER(target_idx));
 }
 
+struct near_tag *near_target_get_tag(uint32_t target_idx)
+{
+       struct near_target *target;
+
+       target = g_hash_table_lookup(target_hash, GINT_TO_POINTER(target_idx));
+       if (target == NULL)
+               return NULL;
+
+       if (target->tag != NULL)
+               return target->tag;
+
+       target->tag = __near_tag_new(target->adapter_idx, target_idx);
+       if (target->tag == NULL)
+               return NULL;
+
+       /* TODO reference the tag, or add tag reference count API */
+       return target->tag;
+}
+
 int __near_target_init(void)
 {
        DBG("");