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
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);
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,
#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);
#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("");
uint32_t adapter_idx;
uint32_t protocols;
enum near_target_type type;
+
uint16_t tag_type;
+ struct near_tag *tag;
};
static DBusConnection *connection = NULL;
{
struct near_target *target = data;
+ if (target->tag != NULL)
+ __near_tag_free(target->tag);
g_free(target->path);
g_free(target);
}
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("");