return params;
}
+static GVariant *__create_followup_request_param(int client_id, unsigned int peer_id,
+ unsigned char *message, size_t len)
+{
+ return g_variant_new("(iuuay)", client_id, peer_id, len,
+ __pack_byte_array(message, len));
+}
+
int wifi_aware_gdbus_enable(wifi_aware_h wifi_aware,
wifi_aware_enable_request_s *req, GAsyncReadyCallback cb)
{
WIFI_AWARE_DISCOVERY_PATH,
"UpdatePublish", params, cb, publish);
- RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "Publish failed");
+ RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "UpdatePublish failed");
__WIFI_AWARE_FUNC_EXIT__;
return ret;
WIFI_AWARE_DISCOVERY_PATH,
"UpdateSubscribe", params, cb, subscribe);
- RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "Subscribe failed");
+ RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "UpdateSubscribe failed");
__WIFI_AWARE_FUNC_EXIT__;
return ret;
}
+int wifi_aware_gdbus_followup(int client_id, unsigned int peer_id,
+ unsigned char *message, size_t len,
+ GAsyncReadyCallback cb, void *user_data)
+{
+ __WIFI_AWARE_FUNC_ENTER__;
+ GVariant *params = NULL;
+ int ret = WIFI_AWARE_ERROR_NONE;
+
+ params = __create_followup_request_param(client_id, peer_id,
+ message, len);
+ DBUS_DEBUG_VARIANT(params);
+
+ ret = __wifi_aware_dbus_method_call_async(
+ WIFI_AWARE_DISCOVERY_INTERFACE,
+ WIFI_AWARE_DISCOVERY_PATH,
+ "Followup", params, cb, user_data);
+
+ RET_VAL_IF(ret != WIFI_AWARE_ERROR_NONE, ret, "Followup failed");
+
+ __WIFI_AWARE_FUNC_EXIT__;
+ return ret;
+}
typedef struct {
unsigned int id;
+ int client_id;
} wifi_aware_peer_s;
int _wifi_aware_peer_create(wifi_aware_peer_h *peer, unsigned int peer_id)
{
- *peer = (wifi_aware_peer_s *)g_try_malloc0(sizeof(wifi_aware_peer_s));
- RET_VAL_IF(*peer == NULL, WIFI_AWARE_ERROR_OUT_OF_MEMORY, "g_try_malloc0 failed");
+ wifi_aware_peer_s *peer_handle = (wifi_aware_peer_s *)g_try_malloc0(sizeof(wifi_aware_peer_s));
+ RET_VAL_IF(peer_handle == NULL, WIFI_AWARE_ERROR_OUT_OF_MEMORY, "g_try_malloc0 failed");
+ peer_handle->client_id = -1;
+ *peer = peer_handle;
return WIFI_AWARE_ERROR_NONE;
}
wifi_aware_peer_s *peer_handle = (wifi_aware_peer_s *)peer;
RET_VAL_IF(peer_handle == NULL, WIFI_AWARE_ERROR_INVALID_PARAMETER, "peer is NULL");
+ peer_handle->client_id = aware_handle->client_id;
+
WIFI_AWARE_HANDLE_LOCK;
if (g_hash_table_contains(peer_map, GINT_TO_POINTER(peer_handle->id))) {
WIFI_AWARE_LOGE("peer_id %d alread exists", peer_handle->id);
return WIFI_AWARE_ERROR_NONE;
}
-wifi_aware_peer_h _wifi_aware_peer_get_handle(wifi_aware_h wifi_aware, unsigned int peer_id)
+wifi_aware_peer_h _wifi_aware_get_peer(wifi_aware_h wifi_aware, unsigned int peer_id)
{
wifi_aware_s *aware_handle = (wifi_aware_s *)wifi_aware;
GHashTable *peer_map = aware_handle->peer_map;
WIFI_AWARE_HANDLE_UNLOCK;
return peer;
}
+
+int _wifi_aware_peer_get_client_id(wifi_aware_peer_h peer)
+{
+ wifi_aware_peer_s *handle = (wifi_aware_peer_s *)peer;
+ return handle->client_id;
+}
+unsigned int _wifi_aware_peer_get_id(wifi_aware_peer_h peer)
+{
+ wifi_aware_peer_s *handle = (wifi_aware_peer_s *)peer;
+ return handle->id;
+}
guint discovered_signal_id;
} wifi_aware_subscribe_s;
+typedef struct {
+ wifi_aware_send_message_result_cb callback;
+ void *user_data;
+} wifi_aware_message_s;
+
static bool __is_init = false;
static GList *__wifi_aware_handle_list = NULL;
return handle->aware_handle->client_id;
}
-static wifi_aware_error_e __parse_enable_reply(GVariant *reply, wifi_aware_s *aware)
-{
- int error;
- g_variant_get(reply, "(ii)", &aware->client_id, &error);
- return _wifi_aware_convert_nan_manager_error(error);
-}
-
static void __enable_request_reply(GObject *src, GAsyncResult *res, gpointer user_data)
{
GDBusConnection *conn = NULL;
GVariant *reply = NULL;
wifi_aware_s *aware = (wifi_aware_s *)user_data;
wifi_aware_error_e error = WIFI_AWARE_ERROR_NONE;
+ int nan_error = 0;
WIFI_AWARE_LOGI("Reply for Enable Request");
WIFI_AWARE_LOGE("Enable Request failure: %s", dbus_error->message);
error = _wifi_aware_convert_error_string_to_enum(dbus_error->message);
g_error_free(dbus_error);
+ } else {
+ g_variant_get(reply, "(ii)", &aware->client_id, &nan_error);
+ WIFI_AWARE_LOGI("Client ID: %i, error: %d", aware->client_id, nan_error);
+ error = _wifi_aware_convert_nan_manager_error(nan_error);
}
-
- error = __parse_enable_reply(reply, aware);
if (aware->enabled_cb)
aware->enabled_cb(error, aware->enabled_cb_data);
static int __is_published(wifi_aware_publish_h publish)
{
- RET_IF(publish == NULL, "wifi_aware_publish_h is NULL");
+ RET_VAL_IF(publish == NULL, 0, "wifi_aware_publish_h is NULL");
wifi_aware_publish_s *handle = (wifi_aware_publish_s *)publish;
return handle->publish_id > 0;
}
GVariant *reply = NULL;
wifi_aware_publish_h publish = (wifi_aware_publish_h)user_data;
wifi_aware_error_e error = WIFI_AWARE_ERROR_NONE;
+ int nan_error = 0;
unsigned int publish_id = -1;
WIFI_AWARE_LOGI("Reply for Publish Request");
g_error_free(dbus_error);
}
else {
- g_variant_get(reply, "(ui)", &publish_id, &error);
- WIFI_AWARE_LOGI("Publish ID: %u, error: %d", publish_id, error);
+ g_variant_get(reply, "(ui)", &publish_id, &nan_error);
+ WIFI_AWARE_LOGI("Publish ID: %u, error: %d", publish_id, nan_error);
+ error = _wifi_aware_convert_nan_manager_error(nan_error);
}
__wifi_aware_publish_set_id(publish, publish_id);
__wifi_aware_publish_invoke_callback(
- _wifi_aware_convert_nan_manager_error(error),
+ error,
publish);
}
static int __is_subscribed(wifi_aware_subscribe_h subscribe)
{
- RET_IF(subscribe == NULL, "wifi_aware_subscribe_h is NULL");
+ RET_VAL_IF(subscribe == NULL, 0, "wifi_aware_subscribe_h is NULL");
wifi_aware_subscribe_s *handle = (wifi_aware_subscribe_s *)subscribe;
return handle->subscribe_id > 0;
}
GVariant *reply = NULL;
wifi_aware_subscribe_h subscribe = (wifi_aware_subscribe_h)user_data;
wifi_aware_error_e error = WIFI_AWARE_ERROR_NONE;
+ int nan_error = 0;
unsigned int subscribe_id = -1;
WIFI_AWARE_LOGI("Reply for Subscribe Request");
g_error_free(dbus_error);
}
else {
- g_variant_get(reply, "(ui)", &subscribe_id, &error);
- WIFI_AWARE_LOGI("Subscribe ID: %u, error: %d", subscribe_id, error);
+ g_variant_get(reply, "(ui)", &subscribe_id, &nan_error);
+ WIFI_AWARE_LOGI("Subscribe ID: %u, error: %d", subscribe_id, nan_error);
+ error = _wifi_aware_convert_nan_manager_error(nan_error);
}
__wifi_aware_subscribe_set_id(subscribe, subscribe_id);
__wifi_aware_subscribe_invoke_callback(
- _wifi_aware_convert_nan_manager_error(error),
+ error,
subscribe);
}
static int __handle_new_peer(wifi_aware_s *aware_handle, unsigned int peer_id, wifi_aware_peer_h *peer)
{
int ret = WIFI_AWARE_ERROR_NONE;
- if (_wifi_aware_peer_get_handle(aware_handle, peer_id) != NULL) {
+ if (_wifi_aware_get_peer(aware_handle, peer_id) != NULL) {
WIFI_AWARE_LOGI("Peer %u already exists", peer_id);
return WIFI_AWARE_ERROR_NONE;
}
wifi_aware_gdbus_register_signal(SERVICE_DISCOVERED_SIGNAL,
__service_discovered_cb, handle);
}
+
+wifi_aware_message_s *__create_message_data(wifi_aware_send_message_result_cb cb, void *user_data)
+{
+ wifi_aware_message_s *result =
+ (wifi_aware_message_s *)g_try_malloc0(sizeof(wifi_aware_message_s));
+ if (result == NULL)
+ return NULL;
+ result->callback = cb;
+ result->user_data = user_data;
+}
+
+static void __wifi_aware_followup_invoke_callback(wifi_aware_message_s *message, wifi_aware_error_e error)
+{
+ if (message && message->callback)
+ message->callback(error, message->user_data);
+}
+
+static void __send_message_reply(GObject *src, GAsyncResult *res, gpointer user_data)
+{
+ GDBusConnection *conn = NULL;
+ GError *dbus_error = NULL;
+ GVariant *reply = NULL;
+
+ wifi_aware_message_s *message = (wifi_aware_message_s *)user_data;
+ wifi_aware_error_e error = WIFI_AWARE_ERROR_NONE;
+ int nan_error = 0;
+
+ WIFI_AWARE_LOGI("Reply for Followup");
+
+ conn = G_DBUS_CONNECTION(src);
+ reply = g_dbus_connection_call_finish(conn, res, &dbus_error);
+ RET_IF(reply == NULL, "reply is NULL");
+
+ if (dbus_error != NULL) {
+ WIFI_AWARE_LOGE("Followup Request failure: %s", dbus_error->message);
+ error = _wifi_aware_convert_error_string_to_enum(dbus_error->message);
+ g_error_free(dbus_error);
+ }
+ else {
+ g_variant_get(reply, "(i)", &nan_error);
+ WIFI_AWARE_LOGI("error: %d", nan_error);
+ error = _wifi_aware_convert_nan_manager_error(nan_error);
+ }
+
+ __wifi_aware_followup_invoke_callback(message, error);
+}
+
+int _wifi_aware_send_message(wifi_aware_peer_h peer,
+ unsigned char *message, size_t len,
+ wifi_aware_send_message_result_cb callback, void *user_data)
+{
+ __WIFI_AWARE_FUNC_ENTER__;
+
+ wifi_aware_message_s *message_data = __create_message_data(callback, user_data);
+ RET_VAL_IF(message == NULL, WIFI_AWARE_ERROR_OUT_OF_MEMORY, "__create_cb_data fails");
+ return wifi_aware_gdbus_followup(
+ _wifi_aware_peer_get_client_id(peer),
+ _wifi_aware_peer_get_id(peer),
+ message, len,
+ __send_message_reply,
+ message_data);
+}