4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
24 #include <map_bmessage.h>
26 #include <bluetooth_map_agent.h>
30 #define BMSG_TAG "BEGIN:BMSG\r\n"
31 #define VER_TAG "VERSION:"
32 #define STATUS_TAG "STATUS:"
33 #define TYPE_TAG "TYPE:"
34 #define FOLDER_TAG "FOLDER:"
35 #define VCARD_BEGIN_TAG "BEGIN:VCARD\r\n"
36 #define VCARD_END_TAG "END:VCARD\r\n"
37 #define VCARD_N_TAG "N:"
38 #define VCARD_FN_TAG "FN:"
39 #define VCARD_TEL_TAG "TEL:"
40 #define VCARD_EMAIL_TAG "EMAIL:"
41 #define BENV_TAG "BEGIN:BENV\r\n"
42 #define BBODY_TAG "BEGIN:BBODY\r\n"
43 #define MSG_TAG "BEGIN:MSG\r\n"
44 #define PARTID_TAG "PARTID:"
45 #define ENCODING_TAG "ENCODING:"
46 #define CHARSET_TAG "CHARSET:"
47 #define LANGUAGE_TAG "LANGUAGE:"
48 #define LENGTH_TAG "LENGTH:"
51 void print_bmsg(struct bmsg_data *bmsg)
56 struct benv_data *env_data = NULL;
58 DBG("bmsg->version = %s", bmsg->version);
59 DBG("bmsg->status = %s", bmsg->status);
60 DBG("bmsg->type = %s", bmsg->type);
61 DBG("bmsg->folder = %s", bmsg->folder);
62 DBG("bmsg->originator_vcard_data->version = %s",
63 bmsg->originator_vcard_data->version);
64 DBG("bmsg->originator_vcard_data->n = %s",
65 bmsg->originator_vcard_data->n);
68 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
69 while (env_data != NULL) {
71 DBG("env_data = %d", env_data->encapsulation_level);
73 struct bmsg_vcard *rvcard;
75 rvcard = g_slist_nth_data(env_data->recipient_vcard, k);
77 while (rvcard != NULL) {
80 if (rvcard->version != NULL)
81 DBG("vcard->version = %s\n", rvcard->version);
82 if (rvcard->n != NULL)
83 DBG("vcard->n = %s\n", rvcard->n);
84 if (rvcard->fn != NULL)
85 DBG("vcard->fn = %s\n", rvcard->fn);
86 if (rvcard->tel != NULL)
87 DBG("vcard->tel = %s\n", rvcard->tel);
88 if (rvcard->email != NULL)
89 DBG("vcard->email = %s\n", rvcard->email);
91 rvcard = g_slist_nth_data(env_data->recipient_vcard, k);
94 if (env_data->body_content != NULL) {
95 DBG("env_data->body_content->length = %"
96 G_GUINT64_FORMAT "\n",
97 env_data->body_content->length);
98 DBG("env_data->body_content->msg = %s\n",
99 env_data->body_content->msg);
107 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
111 char *bmsg_get_msg_folder(struct bmsg_data *bmsg)
113 return g_strdup(bmsg->folder);
116 char *bmsg_get_msg_body(struct bmsg_data *bmsg)
118 struct benv_data *env_data;
121 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
123 while (env_data != NULL) {
124 if (env_data->body_content != NULL) {
125 DBG("env_data->body_content->msg = %s\n",
126 env_data->body_content->msg);
127 DBG("env_data->body_content->length = %"
128 G_GUINT64_FORMAT "\n",
129 env_data->body_content->length);
130 return g_strndup(env_data->body_content->msg,
131 env_data->body_content->length);
138 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
144 GSList *bmsg_get_msg_recepients(struct bmsg_data *bmsg)
146 struct benv_data *env_data;
147 GSList *receiver = NULL;
150 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
152 while (env_data != NULL) {
154 DBG("env_data = %d", env_data->encapsulation_level);
156 struct bmsg_vcard *rvcard;
158 rvcard = g_slist_nth_data(env_data->recipient_vcard, k);
159 while (rvcard != NULL) {
162 if (rvcard->tel != NULL) {
163 DBG("vcard->tel = %s\n", rvcard->tel);
164 receiver = g_slist_append(receiver, rvcard->tel);
167 rvcard = g_slist_nth_data(env_data->recipient_vcard, k);
174 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
180 void bmsg_free_vcard_data(struct bmsg_vcard *vcard_data)
182 if (vcard_data == NULL)
185 g_free(vcard_data->version);
186 g_free(vcard_data->n);
187 g_free(vcard_data->fn);
188 g_free(vcard_data->tel);
189 g_free(vcard_data->email);
195 void bmsg_free_bmsg(struct bmsg_data *bmsg)
197 struct benv_data *env_data;
203 g_free(bmsg->version);
204 g_free(bmsg->status);
206 g_free(bmsg->folder);
207 bmsg_free_vcard_data(bmsg->originator_vcard_data);
209 if (bmsg->envelope_data == NULL)
212 if (bmsg->envelope_data->env_data == NULL)
215 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
216 while (env_data != NULL) {
218 DBG("env_data = %d", env_data->encapsulation_level);
220 struct bmsg_vcard *rvcard;
222 rvcard = g_slist_nth_data(env_data->recipient_vcard, k);
224 while (rvcard != NULL) {
226 bmsg_free_vcard_data(rvcard);
227 rvcard = g_slist_nth_data(env_data->recipient_vcard, k);
230 if (env_data->body_content != NULL) {
231 g_free(env_data->body_content->encoding);
232 g_free(env_data->body_content->charset);
233 g_free(env_data->body_content->language);
234 g_free(env_data->body_content->msg);
235 g_free(env_data->body_content);
241 env_data = g_slist_nth_data(bmsg->envelope_data->env_data, i);
248 gchar *bmsg_get_parse_sub_block(char **sub_block_data, char *element)
254 gchar *sub_block = NULL;
260 start = g_strdup_printf("BEGIN:%s\r\n", element);
261 end = g_strdup_printf("END:%s\r\n", element);
262 offset = strlen(start);
264 block_start = g_strstr_len(*sub_block_data, offset, start);
265 if (block_start == NULL)
268 if (!g_strcmp0(start, VCARD_BEGIN_TAG))
269 block_end = g_strstr_len(*sub_block_data, -1, end);
271 block_end = g_strrstr(*sub_block_data, end);
273 if (block_end == NULL)
276 len = block_end - block_start - offset;
277 sub_block = g_strndup(block_start + offset, len);
278 *sub_block_data = *sub_block_data + strlen(sub_block) + strlen(start) +
286 gchar *bmsg_get_tag_data(char **block_data, char *element)
297 if (*block_data == NULL || element == NULL)
300 block_start = g_strstr_len(*block_data, -1, element);
301 if (block_start == NULL)
304 offset = strlen(element);
306 block_end = g_strstr_len(block_start+offset, -1, end);
307 if (block_end == NULL)
310 len = block_end - block_start - offset;
311 sub_block = g_strndup(block_start + offset, len);
312 *block_data = *block_data + offset + len + CRLF_LEN;
317 struct bmsg_bbody *bmsg_get_bbody_data(gchar *block_data)
319 gchar *bbody_block_data_start;
321 struct bmsg_bbody *bbody;
324 bbody_block_data_start = block_data;
326 bbody = g_new0(struct bmsg_bbody, 1);
328 temp = bmsg_get_tag_data(&block_data, PARTID_TAG);
330 bbody->part_id = (guint16)g_ascii_strtoull(temp, NULL, 10);
334 bbody->encoding = bmsg_get_tag_data(&block_data, ENCODING_TAG);
335 bbody->charset = bmsg_get_tag_data(&block_data, CHARSET_TAG);
336 bbody->language = bmsg_get_tag_data(&block_data, LANGUAGE_TAG);
338 temp = bmsg_get_tag_data(&block_data, LENGTH_TAG);
341 bbody->length = g_ascii_strtoull(temp, NULL, 10);
345 bbody->msg = bmsg_get_parse_sub_block(&block_data, "MSG");
347 g_free(bbody_block_data_start);
352 struct bmsg_vcard *bmsg_get_vcard_data(gchar *sub_block_data)
354 gchar *vcard_block_data_start;
355 struct bmsg_vcard *vcard;
358 vcard_block_data_start = sub_block_data;
360 vcard = g_new0(struct bmsg_vcard, 1);
362 vcard->version = bmsg_get_tag_data(&sub_block_data, VER_TAG);
363 vcard->n = bmsg_get_tag_data(&sub_block_data, VCARD_N_TAG);
364 vcard->fn = bmsg_get_tag_data(&sub_block_data, VCARD_FN_TAG);
365 vcard->tel = bmsg_get_tag_data(&sub_block_data, VCARD_TEL_TAG);
366 vcard->email = bmsg_get_tag_data(&sub_block_data, VCARD_EMAIL_TAG);
368 g_free(vcard_block_data_start);
373 struct benv_data *bmsg_get_env_encapsulation_data(gchar **sub_block_data)
376 gchar *bbody_data = NULL;
377 static guint8 lvl = 1;
379 is_valid = g_strstr_len(*sub_block_data, strlen(VCARD_BEGIN_TAG),
381 if (is_valid == NULL)
387 struct benv_data *rec_data = g_new0(struct benv_data, 1);
389 rec_data->encapsulation_level = lvl;
392 while (is_valid != NULL) {
393 gchar *vcard_data = NULL;
394 struct bmsg_vcard *vcard;
396 vcard_data = bmsg_get_parse_sub_block(sub_block_data, "VCARD");
397 if (vcard_data == NULL) {
398 DBG("parse error\n");
402 vcard = bmsg_get_vcard_data(vcard_data);
404 rec_data->recipient_vcard = g_slist_append(
405 rec_data->recipient_vcard,
408 is_valid = g_strstr_len(*sub_block_data,
409 strlen(VCARD_BEGIN_TAG),
413 is_valid = g_strstr_len(*sub_block_data, strlen(BBODY_TAG), BBODY_TAG);
418 bbody_data = bmsg_get_parse_sub_block(sub_block_data, "BBODY");
419 if (bbody_data == NULL) {
420 DBG("parse error\n");
424 rec_data->body_content = bmsg_get_bbody_data(bbody_data);
429 struct bmsg_envelope *bmsg_get_envelope_data(gchar **block_data)
431 gchar *env_block_data_start;
432 gchar *sub_block_data;
433 struct bmsg_envelope *envelope_data;
434 struct benv_data *rec_data;
436 env_block_data_start = *block_data;
438 envelope_data = g_new0(struct bmsg_envelope, 1);
440 sub_block_data = bmsg_get_parse_sub_block(block_data, "BENV");
442 while (sub_block_data) {
444 rec_data = bmsg_get_env_encapsulation_data(&sub_block_data);
447 envelope_data->env_data = g_slist_append(
448 envelope_data->env_data,
451 rec_data = bmsg_get_env_encapsulation_data(
454 sub_block_data = bmsg_get_parse_sub_block(&sub_block_data,
457 g_free(sub_block_data);
459 return envelope_data;
462 struct bmsg_data * bmsg_parse(gchar *buf)
465 gchar *sub_block_data;
466 gchar *block_data_start;
467 struct bmsg_data *bmsg;
471 block_data = bmsg_get_parse_sub_block(&buf, "BMSG");
472 if (block_data == NULL)
475 block_data_start = block_data;
477 bmsg = g_new0(struct bmsg_data, 1);
479 bmsg->version = bmsg_get_tag_data(&block_data, VER_TAG);
480 if (bmsg->version == NULL)
483 bmsg->status = bmsg_get_tag_data(&block_data, STATUS_TAG);
484 if (bmsg->status == NULL)
487 bmsg->type = bmsg_get_tag_data(&block_data, TYPE_TAG);
488 if (bmsg->type == NULL)
491 bmsg->folder = bmsg_get_tag_data(&block_data, FOLDER_TAG);
492 if (bmsg->folder == NULL)
495 sub_block_data = bmsg_get_parse_sub_block(&block_data, "VCARD");
496 if (sub_block_data == NULL)
499 bmsg->originator_vcard_data = bmsg_get_vcard_data(sub_block_data);
500 if (bmsg->originator_vcard_data == NULL)
503 bmsg->envelope_data = bmsg_get_envelope_data(&block_data);
504 if (bmsg->envelope_data == NULL)
507 g_free(block_data_start);
516 bmsg_free_bmsg(bmsg);