Change accessory service profile ID
[platform/core/uifw/capi-ui-sticker.git] / receiver / src / ft.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <stdio.h>
18 #include <glib.h>
19 #include <dlog.h>
20 #include <app_common.h>
21 #include <sap.h>
22 #include <sap_file_transfer.h>
23 #include <sticker_provider.h>
24 #include <string.h>
25 #include <string>
26 #include <unistd.h>
27 #include <sys/types.h>
28 #include <sys/stat.h>
29 #include <pwd.h>
30
31 #define ACCESSORY_SERVICE_PROFILE_ID "/sample/filetransfersender"
32
33 #include "sticker_info.h"
34
35 using namespace std;
36
37 struct priv {
38         sap_agent_h agent;
39         sap_file_transaction_h socket;
40 };
41
42 static struct priv priv_data = { 0 };
43
44 gboolean file_on_progress = 0;
45 static string incoming_file_name;
46 static string recv_filepath;
47
48 static void _on_send_completed(sap_file_transaction_h file_transaction,
49                                sap_ft_transfer_e result,
50                                const char *file_path,
51                                void *user_data)
52 {
53         char error_message[100];
54
55         dlog_print(DLOG_INFO, TAG, "# transfer completed");
56
57         if (priv_data.socket) {
58                 sap_file_transfer_destroy(file_transaction);
59                 priv_data.socket = NULL;
60         }
61
62         if (result == SAP_FT_TRANSFER_SUCCESS) {
63                 sprintf(error_message, "Transfer Completed");
64                 dlog_print(DLOG_INFO, TAG, "Transfer Completed");
65
66                 if (chmod(recv_filepath.c_str(), S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) {
67                         dlog_print(DLOG_ERROR, TAG, "Failed to change permission : %s. error : %s", recv_filepath.c_str(), strerror(errno));
68                 }
69                 else {
70                         dlog_print(DLOG_INFO, TAG, "Succeed to change permission : %s", recv_filepath.c_str());
71                         create_sticker_provider_handle();
72                         insert_sticker_data(recv_filepath.c_str(), "keyword", "group", "test icon");
73                         destroy_sticker_provider_handle();
74                 }
75         } else {
76                 switch (result) {
77                 case (SAP_FT_TRANSFER_FAIL_CHANNEL_IO): {
78                         sprintf(error_message, "Channel IO Error.");
79                         dlog_print(DLOG_WARN, TAG, "Channel IO Error.");
80                         break;
81                 }
82
83                 case (SAP_FT_TRANSFER_FAIL_FILE_IO): {
84                         sprintf(error_message, "File IO Error.");
85                         dlog_print(DLOG_WARN, TAG, "File IO Error.");
86                         break;
87                 }
88
89                 case (SAP_FT_TRANSFER_FAIL_CMD_DROPPED): {
90                         sprintf(error_message, "Transfer dropped.");
91                         dlog_print(DLOG_WARN, TAG, "Transfer dropped.");
92                         break;
93                 }
94
95                 case (SAP_FT_TRANSFER_FAIL_PEER_UNRESPONSIVE): {
96                         sprintf(error_message, "Peer Un Responsive.");
97                         dlog_print(DLOG_WARN, TAG, "Peer Un Responsive.");
98                         break;
99                 }
100
101                 case (SAP_FT_TRANSFER_FAIL_PEER_CONN_LOST): {
102                         sprintf(error_message, "Connection Lost.");
103                         dlog_print(DLOG_WARN, TAG, "Connection Lost.");
104                         break;
105                 }
106
107                 case (SAP_FT_TRANSFER_FAIL_PEER_CANCELLED): {
108                         sprintf(error_message, "Peer Cancelled.");
109                         dlog_print(DLOG_WARN, TAG, "Peer Cancelled.");
110                         break;
111                 }
112
113                 case (SAP_FT_TRANSFER_FAIL_SPACE_NOT_AVAILABLE): {
114                         sprintf(error_message, "No Space.");
115                         dlog_print(DLOG_WARN, TAG, "No Space.");
116                         break;
117                 }
118
119                 default:
120                         sprintf(error_message, "Unknown Error");
121                         dlog_print(DLOG_WARN, TAG, "Unknown Error");
122                 }
123         }
124
125         file_on_progress = 0;
126 }
127
128 static void _on_sending_file_in_progress(sap_file_transaction_h file_transaction,
129                                          unsigned short int percentage_progress,
130                                          void *user_data)
131 {
132         dlog_print(DLOG_INFO, TAG, "# progress %d", percentage_progress);
133 }
134
135 static void __set_file_transfer_cb(sap_file_transaction_h file_socket)
136 {
137         dlog_print(DLOG_INFO, TAG, "# set callbacks");
138         sap_file_transfer_set_progress_cb(file_socket, _on_sending_file_in_progress, NULL);
139
140         sap_file_transfer_set_done_cb(file_socket, _on_send_completed, NULL);
141 }
142
143 void accept_file()
144 {
145         int ret;
146         char file_path[100];
147         char *data_path = NULL;
148
149         data_path = app_get_shared_data_path();
150         dlog_print(DLOG_INFO, TAG, "Path : %s", data_path);
151         sprintf(file_path, "%s/%s", data_path, incoming_file_name.c_str());
152         dlog_print(DLOG_INFO, TAG, "Receive filepath : %s", file_path);
153         recv_filepath = string(file_path);
154         free(data_path);
155
156         ret = sap_file_transfer_receive(priv_data.socket, file_path);
157         switch(ret) {
158         case SAP_RESULT_PERMISSION_DENIED:
159                 dlog_print(DLOG_WARN, TAG, "permission denied");
160                 break;
161         case SAP_RESULT_FAILURE:
162                 dlog_print(DLOG_WARN, TAG, "Fail");
163                 break;
164         case SAP_RESULT_SUCCESS:
165                 dlog_print(DLOG_INFO, TAG, "Success");
166                 break;
167         }
168
169         file_on_progress = 1;
170 }
171
172 void sap_file_transfer_get_receive_filepath(char **filepath)
173 {
174         *filepath = strdup(recv_filepath.c_str());
175 }
176
177 void reject_file()
178 {
179         int ret = sap_file_transfer_reject(priv_data.socket);
180         dlog_print(DLOG_INFO, TAG, "ret : %d", ret);
181
182         file_on_progress = 0;
183 }
184
185 static void _on_receive_file_cb(sap_peer_agent_h peer_agent_h,
186                           sap_file_transaction_h socket,
187                           const char *file_path,
188                           void *user_data)
189 {
190         file_on_progress = 1;
191         priv_data.socket = socket;
192         dlog_print(DLOG_INFO, TAG, "# incoming file request.");
193         __set_file_transfer_cb(priv_data.socket);
194
195         incoming_file_name = file_path;
196         std::size_t found = incoming_file_name.find_last_of("/");
197         incoming_file_name = incoming_file_name.substr(found+1);
198
199         dlog_print(DLOG_INFO, TAG, "# file path : %s, incoming file name : %s", file_path, incoming_file_name.c_str());
200
201         accept_file();
202 }
203
204 void conn_terminated(sap_peer_agent_h peer_agent,
205                      sap_socket_h socket,
206                      sap_service_connection_terminated_reason_e result,
207                      void *user_data)
208 {
209         dlog_print(DLOG_INFO, TAG, "connection terminated");
210 }
211
212 void
213 on_message_received(sap_peer_agent_h peer_agent, unsigned int payload_length, void *buffer,
214                 void *user_data) /* message exchange on_receive callback (sap_agent_data_received_cb) */
215 {
216         char *peer_app;
217         sap_peer_agent_get_app_name(peer_agent, &peer_app);
218         dlog_print(DLOG_INFO, TAG, "received data: %s, len:%d from %s", (char *)buffer, payload_length, peer_app);
219         g_free(peer_app);
220 }
221
222 void
223 on_data_received(sap_socket_h socket, unsigned short int channel_id, unsigned int payload_length, void *buffer,
224                 void *user_data) /* message exchange on_receive callback (sap_agent_data_received_cb) */
225 {
226         dlog_print(DLOG_INFO, TAG, "received data: %s, len:%d", (char *)buffer, payload_length);
227 }
228
229 static void on_conn_req(sap_peer_agent_h peer_agent,
230                         sap_socket_h socket,
231                         sap_service_connection_result_e result,
232                         void *user_data)
233 {
234         sap_peer_agent_accept_service_connection(peer_agent);
235         sap_peer_agent_set_service_connection_terminated_cb(peer_agent, conn_terminated, NULL);
236
237         sap_socket_set_data_received_cb(socket, on_data_received, peer_agent);
238 }
239
240 static void on_agent_initialized(sap_agent_h agent,
241                                  sap_agent_initialized_result_e result,
242                                  void *user_data)
243 {
244         switch (result) {
245         case SAP_AGENT_INITIALIZED_RESULT_SUCCESS:
246
247                 dlog_print(DLOG_DEBUG, TAG, "agent is initialized");
248
249                 priv_data.agent = agent;
250
251                 sap_file_transfer_set_incoming_file_cb(agent, _on_receive_file_cb, NULL);
252                 sap_agent_set_service_connection_requested_cb(agent, on_conn_req, NULL);
253
254                 break;
255
256         case SAP_AGENT_INITIALIZED_RESULT_DUPLICATED:
257                 dlog_print(DLOG_ERROR, TAG, "duplicate registration");
258
259                 break;
260
261         case SAP_AGENT_INITIALIZED_RESULT_INVALID_ARGUMENTS:
262                 dlog_print(DLOG_ERROR, TAG, "invalid arguments");
263
264                 break;
265
266         case SAP_AGENT_INITIALIZED_RESULT_INTERNAL_ERROR:
267                 dlog_print(DLOG_ERROR, TAG, "internal sap error");
268
269                 break;
270
271         default:
272                 dlog_print(DLOG_ERROR, TAG, "unknown status (%d)", result);
273
274                 break;
275         }
276 }
277
278 static void _on_device_status_changed(sap_device_status_e status,
279                                       sap_transport_type_e transport_type,
280                                       void *user_data)
281 {
282         dlog_print(DLOG_DEBUG, TAG, "%s, status :%d", __func__, status);
283
284         switch (transport_type) {
285         case SAP_TRANSPORT_TYPE_BT:
286                 dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): bt", transport_type);
287                 break;
288
289         case SAP_TRANSPORT_TYPE_BLE:
290                 dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): ble", transport_type);
291                 break;
292
293         case SAP_TRANSPORT_TYPE_TCP:
294                 dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): tcp/ip", transport_type);
295                 break;
296
297         case SAP_TRANSPORT_TYPE_USB:
298                 dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): usb", transport_type);
299                 break;
300
301         case SAP_TRANSPORT_TYPE_MOBILE:
302                 dlog_print(DLOG_DEBUG, TAG, "transport_type (%d): mobile", transport_type);
303                 break;
304
305         default:
306                 dlog_print(DLOG_ERROR, TAG, "unknown transport_type (%d)", transport_type);
307                 break;
308         }
309
310         switch (status) {
311         case SAP_DEVICE_STATUS_DETACHED:
312                 dlog_print(DLOG_DEBUG, TAG, "device is not connected.");
313                 break;
314
315         case SAP_DEVICE_STATUS_ATTACHED:
316                 dlog_print(DLOG_DEBUG, TAG, "Attached calling find peer now");
317                 break;
318
319         default:
320                 dlog_print(DLOG_ERROR, TAG, "unknown status (%d)", status);
321                 break;
322         }
323 }
324
325 gboolean agent_initialize()
326 {
327         int result = 0;
328
329         do {
330                 result = sap_agent_initialize(priv_data.agent, ACCESSORY_SERVICE_PROFILE_ID, SAP_AGENT_ROLE_CONSUMER,
331                                               on_agent_initialized, NULL);
332
333                 dlog_print(DLOG_DEBUG, TAG, "SAP >>> getRegisteredServiceAgent() >>> %d", result);
334         } while (result != SAP_RESULT_SUCCESS);
335
336         return TRUE;
337 }
338
339 gboolean initialize_sap(void)
340 {
341         sap_agent_h agent = NULL;
342
343         sap_agent_create(&agent);
344
345         priv_data.agent = agent;
346
347         agent_initialize();
348
349         sap_set_device_status_changed_cb(_on_device_status_changed, NULL);
350
351         return TRUE;
352 }