Add functions converting between GVariant and ndef message.
[platform/core/connectivity/nfc-manager-neard.git] / client / net_nfc_client_ndef_message.c
1 /*
2  * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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 #include <linux/limits.h>
17
18 #include "net_nfc_debug_internal.h"
19 #include "net_nfc_util_internal.h"
20 #include "net_nfc_util_ndef_message.h"
21 #include "net_nfc_ndef_message.h"
22 #include "net_nfc_data.h"
23
24
25 /* public functions */
26 API net_nfc_error_e net_nfc_create_ndef_message(ndef_message_h *ndef_message)
27 {
28         return net_nfc_util_create_ndef_message((ndef_message_s **)ndef_message);
29 }
30
31 API net_nfc_error_e net_nfc_create_rawdata_from_ndef_message(
32                 ndef_message_h ndef_message, data_h *rawdata)
33 {
34         uint32_t count;
35         net_nfc_error_e result;
36         data_h data;
37
38         if (ndef_message == NULL || rawdata == NULL)
39                 return NET_NFC_NULL_PARAMETER;
40
41         *rawdata = NULL;
42
43         result = net_nfc_get_ndef_message_byte_length(ndef_message, &count);
44         if (result != NET_NFC_OK) {
45                 return result;
46         }
47
48         result = net_nfc_create_data(&data ,NULL, count);
49         if (result != NET_NFC_OK) {
50                 return result;
51         }
52
53         result = net_nfc_util_convert_ndef_message_to_rawdata(
54                         (ndef_message_s *)ndef_message, (data_s *)data);
55         if (result == NET_NFC_OK)
56                 *rawdata = data;
57         else
58                 net_nfc_free_data(data);
59
60         return result;
61 }
62
63 API net_nfc_error_e net_nfc_create_ndef_message_from_rawdata(
64                 ndef_message_h *ndef_message, data_h rawdata)
65 {
66         net_nfc_error_e result;
67         ndef_message_h msg;
68
69         if (ndef_message == NULL || rawdata == NULL)
70                 return NET_NFC_NULL_PARAMETER;
71
72         *ndef_message = NULL;
73
74         result = net_nfc_create_ndef_message(&msg);
75         if (result != NET_NFC_OK)
76                 return result;
77
78         result = net_nfc_util_convert_rawdata_to_ndef_message(
79                         (data_s *)rawdata, (ndef_message_s *)msg);
80         if (result == NET_NFC_OK)
81                 *ndef_message = msg;
82         else
83                 net_nfc_free_ndef_message(msg);
84
85         return result;
86 }
87
88 API net_nfc_error_e net_nfc_get_ndef_message_byte_length(
89                 ndef_message_h ndef_message, uint32_t *length)
90 {
91         net_nfc_error_e result;
92
93         if (ndef_message == NULL || length == NULL)
94                 return NET_NFC_NULL_PARAMETER;
95
96         *length = net_nfc_util_get_ndef_message_length((ndef_message_s *)ndef_message);
97         if (*length > 0)
98                 result = NET_NFC_OK;
99         else
100                 result = NET_NFC_INVALID_PARAM;
101
102         return result;
103 }
104
105 API net_nfc_error_e net_nfc_append_record_to_ndef_message(
106                 ndef_message_h ndef_message, ndef_record_h  record)
107 {
108         if (ndef_message == NULL || record == NULL)
109                 return NET_NFC_NULL_PARAMETER;
110
111         return net_nfc_util_append_record((ndef_message_s*)ndef_message, (ndef_record_s *)record);
112 }
113
114 API net_nfc_error_e net_nfc_free_ndef_message(ndef_message_h ndef_message)
115 {
116         if (ndef_message == NULL)
117                 return NET_NFC_NULL_PARAMETER;
118
119         return net_nfc_util_free_ndef_message((ndef_message_s *)ndef_message);
120 }
121
122 API net_nfc_error_e net_nfc_get_ndef_message_record_count(
123                 ndef_message_h ndef_message, int *count)
124 {
125         ndef_message_s *msg = (ndef_message_s *)ndef_message;
126
127         if (ndef_message == NULL || count == NULL)
128                 return NET_NFC_NULL_PARAMETER;
129
130         *count = msg->recordCount;
131
132         return NET_NFC_OK;
133 }
134
135 API void net_nfc_ndef_print_message (ndef_message_h ndef_message )
136 {
137         net_nfc_util_print_ndef_message((ndef_message_s *)(ndef_message));
138 }
139
140
141 API net_nfc_error_e net_nfc_search_record_by_type (ndef_message_h ndef_message,
142                 net_nfc_record_tnf_e tnf, data_h type, ndef_record_h* record)
143 {
144         return net_nfc_util_search_record_by_type ((ndef_message_s*)ndef_message, tnf, (data_s *)type, (ndef_record_s**)record);
145 }
146
147 API net_nfc_error_e net_nfc_append_record_by_index (ndef_message_h ndef_message,
148                 int index, ndef_record_h record)
149 {
150         return net_nfc_util_append_record_by_index ((ndef_message_s *) ndef_message, index, (ndef_record_s *) record);
151 }
152
153 API net_nfc_error_e net_nfc_get_record_by_index (ndef_message_h ndef_message,
154                 int index, ndef_record_h*  record)
155 {
156         return net_nfc_util_get_record_by_index ((ndef_message_s*) ndef_message, index, (ndef_record_s**) record);
157 }
158
159 API net_nfc_error_e net_nfc_remove_record_by_index (ndef_message_h ndef_message,
160                 int index)
161 {
162         return net_nfc_util_remove_record_by_index ((ndef_message_s*)ndef_message, index);
163 }
164
165 API net_nfc_error_e net_nfc_retrieve_current_ndef_message(
166                 ndef_message_h* ndef_message)
167 {
168         net_nfc_error_e result = NET_NFC_UNKNOWN_ERROR;
169         char file_path[PATH_MAX] = { 0, };
170         FILE *fp = NULL;
171
172         if (ndef_message == NULL)
173                 return NET_NFC_NULL_PARAMETER;
174
175         snprintf(file_path, sizeof(file_path), "%s/%s/%s", NET_NFC_MANAGER_DATA_PATH,
176                         NET_NFC_MANAGER_DATA_PATH_MESSAGE, NET_NFC_MANAGER_NDEF_FILE_NAME);
177
178         if ((fp = fopen(file_path, "r")) != NULL)
179         {
180                 long int size = 0;
181
182                 /* rewind to start of file */
183                 fseek(fp, 0, SEEK_END);
184                 size = ftell(fp);
185                 fseek(fp, 0, SEEK_SET);
186
187                 DEBUG_CLIENT_MSG("message length = [%ld]", size);
188
189                 if (size > 0)
190                 {
191                         data_s data = { NULL, 0 };
192
193                         if (net_nfc_util_alloc_data(&data, size) == true)
194                         {
195                                 int current;
196                                 size_t offset = 0;
197                                 /* read fully */
198                                 do {
199                                         current = fread(data.buffer + offset, 1,
200                                                         data.length - offset, fp);
201                                         if (current > 0)
202                                                 offset += current;
203                                         else
204                                                 break;
205                                 } while (offset < data.length);
206
207                                 if (offset == data.length) {
208                                         result = net_nfc_create_ndef_message_from_rawdata(ndef_message, &data);
209                                 } else {
210                                         DEBUG_ERR_MSG("failed to read ndef message");
211                                 }
212                                 net_nfc_util_free_data(&data);
213                         }
214                         else
215                         {
216                                 result = NET_NFC_ALLOC_FAIL;
217                         }
218                 }
219                 else
220                 {
221                         result = NET_NFC_NO_NDEF_MESSAGE;
222                 }
223
224                 fclose(fp);
225         }
226         else
227         {
228                 result = NET_NFC_NO_NDEF_MESSAGE;
229         }
230
231         return result;
232 }