#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
+#include <json-glib/json-glib.h>
+#include "ft.h"
#include "log.h"
#include "sticker_info.h"
#define ACCESSORY_SERVICE_PROFILE_ID "/sample/filetransfersender"
+#define ACCESSORY_SERVICE_CHANNEL_ID 107
+
+#define STICKER_SYNC_START_REQ "sticker-sync-start-req"
+#define STICKER_SYNC_START_RSP "sticker-sync-start-rsp"
+#define STICKER_SEND_START_REQ "sticker-send-start-req"
+#define STICKER_SEND_START_RSP "sticker-send-start-rsp"
+#define STICKER_SEND_FACE_DATA "sticker-send-face-data"
+#define STICKER_SEND_STOP_REQ "sticker-send-stop-req"
+#define STICKER_SEND_STOP_RSP "sticker-send-stop-rsp"
using namespace std;
struct priv {
sap_agent_h agent;
- sap_file_transaction_h socket;
+ sap_socket_h socket;
+ sap_file_transaction_h file_socket;
+};
+
+static void _reset_sticker_data();
+
+struct sticker_info {
+ string file_path;
+ string group;
+ string keyword;
+ string disp_type;
+ string description;
+
+ sticker_info()
+ {
+ _reset_sticker_data();
+ }
};
static struct priv priv_data = { 0 };
+static struct sticker_info sticker_data;
gboolean file_on_progress = 0;
static string incoming_file_name;
-static string recv_filepath;
+static int t_id = 0;
+static int rec_file_cnt = 0;
+
+static gboolean _send_json_data(JsonObject *obj)
+{
+ JsonGenerator *j_generator = NULL;
+ JsonNode *j_node = NULL;
+ gsize size = 0;
+ gchar *data = NULL;
+ int result = 1;
+
+ j_generator = json_generator_new();
+ if (j_generator == NULL) {
+ LOGE("Unable to json_generator_new");
+ goto cleanup;
+ }
+
+ j_node = json_node_new(JSON_NODE_OBJECT);
+ if (j_node == NULL) {
+ LOGE("Unable to json_node_new");
+ goto cleanup;
+ }
+
+ json_node_set_object(j_node, obj);
+ json_generator_set_root(j_generator, j_node);
+
+ data = json_generator_to_data(j_generator, &size);
+ if (data == NULL) {
+ LOGE("Unable to json_generator_to_data");
+ goto cleanup;
+ }
+
+ if (priv_data.socket) {
+ LOGD("Send JSON data : %s", data);
+ result = sap_socket_send_data(priv_data.socket, ACCESSORY_SERVICE_CHANNEL_ID, strlen(data), (void *)data);
+ }
+
+cleanup:
+ if (data)
+ g_free(data);
+
+ if (j_node)
+ json_node_free(j_node);
+
+ if (j_generator)
+ g_object_unref(j_generator);
+
+ return result ? FALSE : TRUE;
+}
static void _on_send_completed(sap_file_transaction_h file_transaction,
sap_ft_transfer_e result,
const char *file_path,
void *user_data)
{
- if (priv_data.socket) {
+ if (priv_data.file_socket) {
sap_file_transfer_destroy(file_transaction);
- priv_data.socket = NULL;
+ priv_data.file_socket = NULL;
}
if (result == SAP_FT_TRANSFER_SUCCESS) {
LOGI("Transfer Completed");
- if (chmod(recv_filepath.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) {
- LOGE("Failed to change permission : %s. error : %s", recv_filepath.c_str(), strerror(errno));
+ if (chmod(sticker_data.file_path.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) {
+ LOGE("Failed to change permission : %s. error : %s", sticker_data.file_path.c_str(), strerror(errno));
}
else {
- LOGI("Succeed to change permission : %s", recv_filepath.c_str());
+ LOGI("Succeed to change permission : %s", sticker_data.file_path.c_str());
if (create_sticker_provider_handle() == STICKER_ERROR_NONE) {
- insert_sticker_data(recv_filepath.c_str(), "keyword", "group", "test icon");
+ insert_sticker_data(sticker_data.file_path.c_str(), sticker_data.keyword.c_str(), sticker_data.group.c_str(), sticker_data.description.c_str());
destroy_sticker_provider_handle();
- if (unlink(recv_filepath.c_str()) == -1)
+ if (unlink(sticker_data.file_path.c_str()) == -1)
LOGE("Failed to remove sticker file");
}
}
+
+ rec_file_cnt++;
} else {
switch (result) {
case (SAP_FT_TRANSFER_FAIL_CHANNEL_IO): {
LOGI("Path : %s", data_path);
sprintf(file_path, "%s/%s", data_path, incoming_file_name.c_str());
LOGI("Receive filepath : %s", file_path);
- recv_filepath = string(file_path);
+ sticker_data.file_path = string(file_path);
free(data_path);
- ret = sap_file_transfer_receive(priv_data.socket, file_path);
+ ret = sap_file_transfer_receive(priv_data.file_socket, file_path);
switch(ret) {
case SAP_RESULT_PERMISSION_DENIED:
LOGW("permission denied");
void sap_file_transfer_get_receive_filepath(char **filepath)
{
- *filepath = strdup(recv_filepath.c_str());
+ *filepath = strdup(sticker_data.file_path.c_str());
+}
+
+void request_sticker_data(const char *mode, const char *category, const char *type)
+{
+ JsonObject *j_object = json_object_new();
+ if (j_object == NULL) {
+ LOGE("json object create error");
+ return;
+ }
+
+ json_object_set_string_member(j_object, "msgId", STICKER_SYNC_START_REQ);
+ json_object_set_int_member(j_object, "tID", ++t_id);
+ json_object_set_string_member(j_object, "mode", mode);
+ json_object_set_string_member(j_object, "category", category);
+ json_object_set_string_member(j_object, "type", type);
+
+ if (_send_json_data(j_object) == FALSE)
+ LOGE("Failed to request sticker data");
+
+ json_object_unref(j_object);
}
void reject_file()
{
- int ret = sap_file_transfer_reject(priv_data.socket);
+ int ret = sap_file_transfer_reject(priv_data.file_socket);
LOGI("ret : %d", ret);
file_on_progress = 0;
void *user_data)
{
file_on_progress = 1;
- priv_data.socket = socket;
+ priv_data.file_socket = socket;
LOGI("# incoming file request.");
- __set_file_transfer_cb(priv_data.socket);
+ __set_file_transfer_cb(priv_data.file_socket);
incoming_file_name = file_path;
std::size_t found = incoming_file_name.find_last_of("/");
service_app_exit();
}
+static void _reset_sticker_data()
+{
+ sticker_data.file_path.clear();
+ sticker_data.group.clear();
+ sticker_data.keyword.clear();
+ sticker_data.disp_type.clear();
+ sticker_data.description.clear();
+}
+
void
on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned int payload_length, void *buffer,
void *user_data) /* message exchange on_receive callback (sap_agent_data_received_cb) */
{
LOGI("received data: %s, len:%d", (char *)buffer, payload_length);
+
+ JsonParser *parser = json_parser_new();
+ GError *err_msg = NULL;
+ JsonNode *root = NULL;
+ JsonObject *root_obj = NULL;
+ string msg_id;
+ const char *json_msgid = NULL;
+
+ json_parser_load_from_data(parser, (char *)buffer, -1, &err_msg);
+ if (err_msg) {
+ LOGE("failed to load json file. error message: %s", err_msg->message);
+ goto cleanup;
+ }
+
+ root = json_parser_get_root(parser);
+ if (root == NULL) {
+ LOGE("failed to get root");
+ goto cleanup;
+ }
+
+ root_obj = json_node_get_object(root);
+ if (root_obj == NULL) {
+ LOGE("failed to get object");
+ goto cleanup;
+ }
+
+ json_msgid = json_object_get_string_member(root_obj, "msgId");
+ msg_id = string(json_msgid ? json_msgid : "");
+ if (msg_id == STICKER_SYNC_START_RSP) {
+ LOGD("msg : %s", msg_id.c_str());
+ const char *json_result = json_object_get_string_member(root_obj, "result");
+ string result = string(json_result ? json_result : "");
+ int result_code = json_object_get_int_member(root_obj, "resultCode");
+ LOGD("result : %s, resultCode : %d", result.c_str(), result_code);
+ } else if (msg_id == STICKER_SEND_START_REQ) {
+ LOGD("msg : %s", msg_id.c_str());
+ rec_file_cnt = 0;
+ t_id = json_object_get_int_member(root_obj, "tID");
+ JsonArray *file_list = json_object_get_array_member(root_obj, "list");
+ if (file_list) {
+ int arr_len = json_array_get_length(file_list);
+ for (int i = 0; i < arr_len; i++) {
+ JsonObject *file_obj = json_array_get_object_element(file_list, i);
+ int file_len = json_object_get_int_member(file_obj, "size");
+ const char *json_filename = json_object_get_string_member(file_obj, "fileName");
+ string file_name = string(json_filename ? json_filename : "");
+
+ if (file_len > 0) {
+ LOGD("fileName : %s, len : %d", file_name.c_str(), file_len);
+ } else {
+ // Delete sticker
+ LOGD("fileName : %s, len : %d", file_name.c_str(), file_len);
+ }
+ }
+ }
+
+ JsonObject *j_object = json_object_new();
+ if (j_object == NULL) {
+ LOGE("Unable to json_object_new");
+ goto cleanup;
+ }
+
+ json_object_set_string_member(j_object, "msgId", STICKER_SEND_START_RSP);
+ json_object_set_int_member(j_object, "tID", t_id);
+ json_object_set_string_member(j_object, "result", "success");
+
+ if (_send_json_data(j_object) == FALSE)
+ LOGE("Failed to send message");
+
+ json_object_unref(j_object);
+ } else if (msg_id == STICKER_SEND_FACE_DATA) {
+ LOGD("msg : %s", msg_id.c_str());
+ _reset_sticker_data();
+
+ const char *type_data = json_object_get_string_member(root_obj, "type");
+ if (type_data)
+ sticker_data.disp_type = string(type_data);
+
+ const char *category = json_object_get_string_member(root_obj, "category");
+ if (category) {
+ sticker_data.group = string(category);
+ sticker_data.keyword = string(category);
+ }
+ } else if (msg_id == STICKER_SEND_STOP_REQ) {
+ LOGD("msg : %s", msg_id.c_str());
+ const char *json_reason = json_object_get_string_member(root_obj, "reason");
+ string reason = string(json_reason ? json_reason : "");
+ int file_len = json_object_get_int_member(root_obj, "count");
+
+ JsonObject *j_object = json_object_new();
+ if (j_object == NULL) {
+ LOGE("Unable to json_object_new");
+ goto cleanup;
+ }
+
+ json_object_set_string_member(j_object, "msgId", STICKER_SEND_STOP_RSP);
+ json_object_set_int_member(j_object, "tID", t_id);
+
+ if (reason == "complete" && rec_file_cnt != file_len)
+ json_object_set_string_member(j_object, "result", "failure");
+ else
+ json_object_set_string_member(j_object, "result", "success");
+
+ if (_send_json_data(j_object) == FALSE)
+ LOGE("Failed to send message");
+
+ json_object_unref(j_object);
+ } else
+ LOGW("unknown msg id : %s", msg_id.c_str());
+
+cleanup:
+ if (err_msg)
+ g_error_free(err_msg);
+
+ if (parser)
+ g_object_unref(parser);
}
static void on_conn_req(sap_peer_agent_h peer_agent,
sap_service_connection_result_e result,
void *user_data)
{
- sap_peer_agent_accept_service_connection(peer_agent);
- sap_peer_agent_set_service_connection_terminated_cb(peer_agent, conn_terminated, NULL);
-
- sap_socket_set_data_received_cb(socket, on_data_received, peer_agent);
+ if (result == SAP_CONNECTION_SUCCESS) {
+ priv_data.socket = socket;
+ sap_peer_agent_accept_service_connection(peer_agent);
+ sap_peer_agent_set_service_connection_terminated_cb(peer_agent, conn_terminated, NULL);
+ sap_socket_set_data_received_cb(socket, on_data_received, peer_agent);
+ }
}
static void on_agent_initialized(sap_agent_h agent,