%bcond_without use_glib_event_loop
Name: capi-network-vine
Summary: An service discovery framework
-Version: 1.1.1
+Version: 1.1.2
Release: 0
Group: Network & Connectivity/API
License: Apache-2.0
vine_ble_s *ble_handle = (vine_ble_s *)user_data;
int service_type_len = strlen(ble_handle->service_type);
+
if (manufacturer_len > service_type_len &&
strncmp(manufacturer_data, ble_handle->service_type, service_type_len) == 0) {
char service_name[VINE_MAX_BLE_SERVICE_NAME_LEN + 1];
int service_name_len = manufacturer_len - 1 - service_type_len;
strncpy(service_name, manufacturer_data + service_type_len + 1, service_name_len);
- if (event_callbacks.discovered_cb) {
+ char mac[VINE_MAC_LEN + 1];
+ strncpy(mac, info->remote_address, VINE_MAC_LEN);
+
+ if (event_callbacks.ble_discovered_cb) {
std::map<string, string> empty_map;
- event_callbacks.discovered_cb(ble_handle, true,
- ble_handle->service_type, service_name, NULL, 0, empty_map,
- NULL, 0, ble_handle->disc_handle);
+ event_callbacks.ble_discovered_cb(ble_handle, true,
+ ble_handle->service_type, service_name, mac, ble_handle->disc_handle);
}
}
void ble_register_callbacks(vine_disc_plugin_callbacks callbacks)
{
event_callbacks.published_cb = callbacks.published_cb;
- event_callbacks.discovered_cb = callbacks.discovered_cb;
- event_callbacks.ip_resolved_cb = callbacks.ip_resolved_cb;
- event_callbacks.fd_added_cb = callbacks.fd_added_cb;
- event_callbacks.fd_removed_cb = callbacks.fd_removed_cb;
+ event_callbacks.discovered_cb = NULL;
+ event_callbacks.ip_resolved_cb = NULL;
+ event_callbacks.fd_added_cb = NULL;
+ event_callbacks.fd_removed_cb = NULL;
+ event_callbacks.ble_discovered_cb = callbacks.ble_discovered_cb;
}
void vine_disc_plugin_init(vine_disc_plugin_fn *fn)
// Even though the constraits is met, the operation can be failed.
#define VINE_MAX_BLE_SERVICE_TYPE_LEN 15
#define VINE_MAX_BLE_SERVICE_NAME_LEN 15
+#define VINE_MAC_LEN 17
#endif /* __VINE_SERV__VINE_CONSTANTS_H__ICE_H__ */
const char *ip, sa_family_t address_family, void *disc_handle);
void (*fd_added_cb)(int fd, void *disc_handle);
void (*fd_removed_cb)(int fd, void *disc_handle);
+
+ void (*ble_discovered_cb)(void *plugin_handle, bool available,
+ const char *service_type, const char *service_name, const char *mac,
+ void *disc_handle);
} vine_disc_plugin_callbacks;
typedef struct {
typedef void (*vine_disc_discovered_cb)(vine_disc_h disc, bool available,
const char *service_type, const char *service_name,
const char *host_name, int port, const map<string, string> &attr,
- const char *iface_name, int more_coming, void *user_data);
+ const char *iface_name, int more_coming, const char *mac, void *user_data);
typedef void (*vine_disc_ip_resolved_cb)(vine_disc_h disc, vine_service_h service, bool add,
const char *ip, vine_address_family_e address_family, void *user_data);
int _vine_service_set_iface_name(vine_service_h service, const char *iface_name);
const char *_vine_service_get_iface_name(vine_service_h service);
+int _vine_service_set_mac(vine_service_h service, const char *mac);
+const char *_vine_service_get_mac(vine_service_h service);
+
int _vine_service_get_disc_handle(vine_service_h service,
vine_discovery_method_e disc_method, void **disc_handle);
int _vine_service_set_ip_resolved_cb(vine_service_h service, vine_session_h session,
};
typedef struct {
+ vine_discovery_method_e method;
vine_disc_plugin_fn *plugin_fn;
vine_disc_published_cb published_cb;
map<string, string> attributes;
char iface_name[IF_NAMESIZE + 1];
int more_coming;
+ char mac[VINE_MAC_LEN + 1];
} vine_discovered_event;
typedef struct {
discovered_event->attributes,
discovered_event->iface_name,
discovered_event->more_coming,
+ discovered_event->mac,
disc_handle->discovered_cb_data);
}
user_data);
}
+static void __ble_discovered_cb(void *plugin_handle, bool available,
+ const char *service_type, const char *service_name, const char *mac,
+ void *user_data)
+{
+ VINE_LOGD("Discovered callback from plugin available[%d]", available);
+ VINE_LOGD("service type[%s] service_name[%s] mac[%s] user_data[%p]",
+ service_type, service_name, mac, user_data);
+
+ vine_discovered_event *discovered_event = new vine_discovered_event;
+
+ discovered_event->available = available;
+ strncpy(discovered_event->service_type, service_type, VINE_MAX_SERVICE_TYPE_LEN);
+ strncpy(discovered_event->service_name, service_name, VINE_MAX_SERVICE_NAME_LEN);
+ strncpy(discovered_event->mac, mac, VINE_MAC_LEN);
+
+ VINE_LOGD("Create a discovered_event[%p]", discovered_event);
+
+ vine_disc_s *disc_handle = (vine_disc_s *)user_data;
+ if (disc_handle)
+ vine_event_loop_add_event(disc_handle->event_queue, discovered_event,
+ __invoke_discovered_user_cb, __free_discovered_event,
+ user_data);
+}
+
static void __ip_resolved_cb(void *plugin_handle, bool add,
const char *ip, sa_family_t address_family, void *user_data)
{
__vine_disc_plugins[i].callbacks.ip_resolved_cb = __ip_resolved_cb;
__vine_disc_plugins[i].callbacks.fd_added_cb = __fd_added_cb;
__vine_disc_plugins[i].callbacks.fd_removed_cb = __fd_removed_cb;
+ __vine_disc_plugins[i].callbacks.ble_discovered_cb = __ble_discovered_cb;
__vine_disc_plugins[i].fn.register_callbacks(__vine_disc_plugins[i].callbacks);
}
}
RET_VAL_IF(disc_handle == NULL, VINE_ERROR_OUT_OF_MEMORY, "Out of Memory");
*disc = disc_handle;
+ disc_handle->method = disc_method;
disc_handle->plugin_fn = &__vine_disc_plugins[disc_method].fn;
VINE_LOGD("New Discovery handle[%p] disc_method[%d]", disc_handle, disc_method);
static void _service_discovered_cb(vine_disc_h disc, bool available,
const char *service_type, const char *service_name,
const char *host_name, int port, const map<string, string> &attr,
- const char *iface_name, int more_coming, void *user_data)
+ const char *iface_name, int more_coming, const char *mac, void *user_data)
{
VINE_LOGD("%s is discovered. %s",
service_name, available ? "available" : "not available");
map<string, string> attributes;
char iface_name[IF_NAMESIZE + 1];
vine_service_state_e state;
+ char mac[VINE_MAC_LEN + 1]; // Only for ble discovery
// For IP resolving
void *disc_handle; // Used to resolve IP address
memset(s->service_name, 0, VINE_MAX_SERVICE_NAME_LEN + 1);
memset(s->host_name, 0, VINE_MAX_HOST_NAME_LEN + 1);
memset(s->iface_name, 0, IF_NAMESIZE + 1);
+ memset(s->mac, 0, VINE_MAC_LEN + 1);
s->port = -1;
s->state = VINE_SERVICE_UNAVAILABLE;
s->family = VINE_ADDRESS_FAMILY_DEFAULT;
cloned_service->port = origin_service->port;
cloned_service->attributes = origin_service->attributes;
strncpy(cloned_service->iface_name, origin_service->iface_name, IF_NAMESIZE);
+ strncpy(cloned_service->mac, origin_service->mac, VINE_MAC_LEN);
cloned_service->state = origin_service->state;
cloned_service->disc_handle = NULL;
return s->iface_name;
}
+int _vine_service_set_mac(vine_service_h service, const char *mac)
+{
+ RET_VAL_IF(service == NULL, VINE_ERROR_INVALID_PARAMETER, "service is NULL");
+
+ vine_service_s *s = (vine_service_s *)service;
+ strncpy(s->mac, mac, VINE_MAC_LEN);
+
+ return VINE_ERROR_NONE;
+}
+
+const char *_vine_service_get_mac(vine_service_h service)
+{
+ RET_VAL_IF(service == NULL, NULL, "service is NULL");
+
+ vine_service_s *s = (vine_service_s *)service;
+ return s->mac;
+}
+
int _vine_service_get_disc_handle(vine_service_h service,
vine_discovery_method_e disc_method, void **disc_handle)
{
static int __vine_set_discovered_service(vine_service_h service,
const char *service_type, const char *service_name,
const char *host_name, int port, const map<string, string> &attr,
- const char *iface_name)
+ const char *iface_name, const char *mac)
{
int ret = VINE_ERROR_NONE;
ret = _vine_service_set_type(service, service_type);
ret = _vine_service_set_iface_name(service, iface_name);
RET_VAL_IF(ret != VINE_ERROR_NONE, ret, "Fail to set iface_name");
+ ret = _vine_service_set_mac(service, mac);
+ RET_VAL_IF(ret != VINE_ERROR_NONE, ret, "Fail to set mac");
return VINE_ERROR_NONE;
}
static void __discovered_cb(vine_disc_h disc, bool available,
const char *service_type, const char *service_name,
const char *host_name, int port, const map<string, string> &attr,
- const char *iface_name, int more_coming, void *user_data)
+ const char *iface_name, int more_coming, const char *mac, void *user_data)
{
VINE_LOGD("Service is discovered. Available[%d]", available);
int ret = VINE_ERROR_NONE;
RET_IF(ret != VINE_ERROR_NONE, "Fail to create a service");
ret = __vine_set_discovered_service(discovered_service,
- service_type, service_name, host_name, port, attr, iface_name);
+ service_type, service_name, host_name, port, attr, iface_name, mac);
if (ret != VINE_ERROR_NONE) {
VINE_LOGE("Fail to set a service. error(%d)", ret);
_vine_service_destroy(discovered_service);