4
* Copyright 2012-2013 Alex <alex@linuxonly.ru>
6
* This program is free software: you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 3 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program. If not, see <http://www.gnu.org/licenses/>.
22
#include <glib/gprintf.h>
27
#include <sys/types.h>
32
#define MMGUI_SMSDB_SMS_MESSAGE_XML "<sms>\n\t<number>%s</number>\n\t<time>%lu</time>\n\t<binary>%u</binary>\n\t<servicenumber>%s</servicenumber>\n\t<text>%s</text>\n\t<read>%u</read>\n\t<folder>%u</folder>\n</sms>\n\n"
34
#define MMGUI_SMSDB_READ_TAG "\n\t<read>"
35
#define MMGUI_SMSDB_TRAILER_TAG "\n</sms>\n\n"
36
#define MMGUI_SMSDB_TRAILER_PARAMS "\n\t<read>%u</read>\n\t<folder>%u</folder>\n</sms>\n\n"
38
#define MMGUI_SMSDB_ACCESS_MASK 0755
40
enum _mmgui_smsdb_xml_elements {
41
MMGUI_SMSDB_XML_PARAM_NUMBER = 0,
42
MMGUI_SMSDB_XML_PARAM_TIME,
43
MMGUI_SMSDB_XML_PARAM_BINARY,
44
MMGUI_SMSDB_XML_PARAM_SERVICENUMBER,
45
MMGUI_SMSDB_XML_PARAM_TEXT,
46
MMGUI_SMSDB_XML_PARAM_READ,
47
MMGUI_SMSDB_XML_PARAM_FOLDER,
48
MMGUI_SMSDB_XML_PARAM_NULL
51
static gint mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_NULL;
53
static gint mmgui_smsdb_sms_message_sort_compare(gconstpointer a, gconstpointer b);
54
static void mmgui_smsdb_free_sms_list_foreach(gpointer data, gpointer user_data);
55
static mmgui_sms_message_t mmgui_smsdb_xml_parse(gchar *xml, gsize size);
56
static void mmgui_smsdb_xml_get_element(GMarkupParseContext *context, const gchar *element, const gchar **attr_names, const gchar **attr_values, gpointer data, GError **error);
57
static void mmgui_smsdb_xml_get_value(GMarkupParseContext *context, const gchar *text, gsize size, gpointer data, GError **error);
58
static void mmgui_smsdb_xml_end_element(GMarkupParseContext *context, const gchar *element, gpointer data, GError **error);
60
smsdb_t mmgui_smsdb_open(const gchar *persistentid, const gchar *internalid)
63
const gchar *newfilepath;
64
const gchar *newfilename;
66
const gchar *oldfilename;
68
if (persistentid == NULL) return NULL;
70
//Form path using XDG standard
71
newfilepath = g_build_path(G_DIR_SEPARATOR_S, g_get_user_data_dir(), "modem-manager-gui", "devices", persistentid, NULL);
73
if (newfilepath == NULL) return NULL;
75
//If directory structure not exists, create it
76
if (!g_file_test(newfilepath, G_FILE_TEST_IS_DIR)) {
77
if (g_mkdir_with_parents(newfilepath, S_IRUSR|S_IWUSR|S_IXUSR|S_IXGRP|S_IXOTH) == -1) {
78
g_warning("Failed to make XDG data directory: %s", newfilepath);
83
newfilename = g_build_filename(newfilepath, "sms.gdbm", NULL);
85
g_free((gchar *)newfilepath);
87
if (newfilename == NULL) return NULL;
89
//If file already exists, just work with it
90
if ((!g_file_test(newfilename, G_FILE_TEST_EXISTS)) && (internalid != NULL)) {
91
//Form old-style file path
92
memset(filename, 0, sizeof(filename));
93
g_snprintf(filename, sizeof(filename), "sms-%s.gdbm", internalid);
95
oldfilename = g_build_filename(g_get_home_dir(), ".config", "modem-manager-gui", filename, NULL);
97
if (oldfilename != NULL) {
98
//If file exists in old location, move it
99
if (g_file_test(oldfilename, G_FILE_TEST_EXISTS)) {
100
if (g_rename(oldfilename, newfilename) == -1) {
101
g_warning("Failed to move file into XDG data directory: %s -> %s", oldfilename, newfilename);
106
g_free((gchar *)oldfilename);
109
smsdb = g_new(struct _smsdb, 1);
111
smsdb->filepath = newfilename;
112
smsdb->unreadmessages = 0;
117
gboolean mmgui_smsdb_close(smsdb_t smsdb)
119
if (smsdb == NULL) return FALSE;
121
if (smsdb->filepath != NULL) {
122
g_free((gchar *)smsdb->filepath);
124
smsdb->unreadmessages = 0;
131
mmgui_sms_message_t mmgui_smsdb_message_create(void)
133
mmgui_sms_message_t message;
135
message = g_new(struct _mmgui_sms_message, 1);
136
message->timestamp = time(NULL);
137
message->read = FALSE;
138
message->binary = FALSE;
139
message->folder = MMGUI_SMSDB_SMS_FOLDER_INCOMING;
140
message->number = NULL;
141
message->svcnumber = NULL;
142
message->idents = NULL;
143
message->text = NULL;
148
void mmgui_smsdb_message_free(mmgui_sms_message_t message)
150
if (message == NULL) return;
152
if (message->number != NULL) {
153
g_free(message->number);
156
if (message->svcnumber != NULL) {
157
g_free(message->svcnumber);
160
if (message->idents != NULL) {
161
g_array_free(message->idents, TRUE);
164
if (message->text != NULL) {
165
g_string_free(message->text, TRUE);
171
static gchar *mmgui_smsdb_message_escape_number(const gchar *number)
173
size_t srclen, numlen;
174
gchar *bcdnumber, *escnumber;
176
if (number == NULL) return NULL;
178
srclen = strlen(number);
180
if (srclen == 0) return NULL;
182
bcdnumber = bcd_to_utf8_ascii_part(number, srclen, &numlen);
184
if (bcdnumber != NULL) {
185
escnumber = encoding_clear_special_symbols(bcdnumber, numlen);
187
escnumber = encoding_clear_special_symbols(g_strdup(number), srclen);
193
gboolean mmgui_smsdb_message_set_number(mmgui_sms_message_t message, const gchar *number)
197
if ((message == NULL) || (number == NULL)) return FALSE;
199
escnumber = mmgui_smsdb_message_escape_number(number);
201
if (escnumber != NULL) {
202
if (message->number != NULL) {
203
g_free(message->number);
205
message->number = escnumber;
212
const gchar *mmgui_smsdb_message_get_number(mmgui_sms_message_t message)
214
if (message == NULL) return NULL;
216
return message->number;
219
gboolean mmgui_smsdb_message_set_service_number(mmgui_sms_message_t message, const gchar *number)
223
if ((message == NULL) || (number == NULL)) return FALSE;
225
escnumber = mmgui_smsdb_message_escape_number(number);
227
if (escnumber != NULL) {
228
if (message->svcnumber != NULL) {
229
g_free(message->svcnumber);
231
message->svcnumber = escnumber;
238
const gchar *mmgui_smsdb_message_get_service_number(mmgui_sms_message_t message)
240
if (message == NULL) return NULL;
242
return message->svcnumber;
245
gboolean mmgui_smsdb_message_set_text(mmgui_sms_message_t message, const gchar *text, gboolean append)
247
if ((message == NULL) || (text == NULL)) return FALSE;
249
if (message->binary) return FALSE;
252
if (message->text != NULL) {
253
g_string_free(message->text, TRUE);
255
message->text = g_string_new(text);
257
if (message->text != NULL) {
258
message->text = g_string_append_c(message->text, ' ');
259
message->text = g_string_append(message->text, text);
261
message->text = g_string_new(text);
268
const gchar *mmgui_smsdb_message_get_text(mmgui_sms_message_t message)
270
if (message == NULL) return NULL;
272
if (message->text != NULL) {
273
return message->text->str;
279
gboolean mmgui_smsdb_message_set_data(mmgui_sms_message_t message, const gchar *data, gsize len, gboolean append)
283
if ((message == NULL) || (data == NULL) || (len == 0)) return FALSE;
285
if (!message->binary) return FALSE;
288
if (message->text != NULL) {
289
g_string_free(message->text, TRUE);
291
message->text = g_string_new_len(NULL, len*2+1);
292
for (index=0; index<len; index++) {
293
if ((guchar)data[index] < 0x10) {
294
g_sprintf(message->text->str+(index*2), "0%1x", (guchar)data[index]);
296
g_sprintf(message->text->str+(index*2), "%2x", (guchar)data[index]);
299
message->text->str[len*2] = '\0';
301
if (message->text != NULL) {
302
message->text = g_string_append(message->text, "00");
303
srclen = message->text->len-1;
304
message->text = g_string_set_size(message->text, srclen+len*2+1);
305
for (index=0; index<len; index++) {
306
if ((guchar)data[index] < 0x10) {
307
g_sprintf(message->text->str+(srclen+index*2), "0%1x", (guchar)data[index]);
309
g_sprintf(message->text->str+(srclen+index*2), "%2x", (guchar)data[index]);
312
message->text->str[srclen+len*2] = '\0';
314
message->text = g_string_new_len(NULL, len*2+1);
315
for (index=0; index<len; index++) {
316
if ((guchar)data[index] < 0x10) {
317
g_sprintf(message->text->str+(index*2), "0%1x", (guchar)data[index]);
319
g_sprintf(message->text->str+(index*2), "%2x", (guchar)data[index]);
322
message->text->str[len*2] = '\0';
329
gboolean mmgui_smsdb_message_set_identifier(mmgui_sms_message_t message, guint ident, gboolean append)
331
if (message == NULL) return FALSE;
334
if (message->idents != NULL) {
335
g_array_free(message->idents, TRUE);
337
message->idents = g_array_new(FALSE, TRUE, sizeof(guint));
338
g_array_append_val(message->idents, ident);
340
if (message->idents != NULL) {
341
g_array_append_val(message->idents, ident);
343
message->idents = g_array_new(FALSE, TRUE, sizeof(guint));
344
g_array_append_val(message->idents, ident);
351
guint mmgui_smsdb_message_get_identifier(mmgui_sms_message_t message)
355
if (message == NULL) return 0;
357
if (message->idents != NULL) {
358
ident = g_array_index(message->idents, guint, 0);
366
gboolean mmgui_smsdb_message_set_timestamp(mmgui_sms_message_t message, time_t timestamp)
368
if (message == NULL) return FALSE;
370
message->timestamp = timestamp;
375
time_t mmgui_smsdb_message_get_timestamp(mmgui_sms_message_t message)
377
if (message == NULL) return 0;
379
return message->timestamp;
382
gboolean mmgui_smsdb_message_set_read(mmgui_sms_message_t message, gboolean read)
384
if (message == NULL) return FALSE;
386
message->read = read;
391
gboolean mmgui_smsdb_message_get_read(mmgui_sms_message_t message)
393
if (message == NULL) return FALSE;
395
return message->read;
398
gboolean mmgui_smsdb_message_set_folder(mmgui_sms_message_t message, enum _mmgui_smsdb_sms_folder folder)
400
if (message == NULL) return FALSE;
403
case MMGUI_SMSDB_SMS_FOLDER_INCOMING:
404
message->folder = MMGUI_SMSDB_SMS_FOLDER_INCOMING;
406
case MMGUI_SMSDB_SMS_FOLDER_SENT:
407
message->folder = MMGUI_SMSDB_SMS_FOLDER_SENT;
409
case MMGUI_SMSDB_SMS_FOLDER_DRAFTS:
410
message->folder = MMGUI_SMSDB_SMS_FOLDER_DRAFTS;
413
message->folder = MMGUI_SMSDB_SMS_FOLDER_INCOMING;
420
enum _mmgui_smsdb_sms_folder mmgui_smsdb_message_get_folder(mmgui_sms_message_t message)
422
if (message == NULL) return MMGUI_SMSDB_SMS_FOLDER_INCOMING;
424
return message->folder;
427
gboolean mmgui_smsdb_message_set_binary(mmgui_sms_message_t message, gboolean binary)
429
if (message == NULL) return FALSE;
431
message->binary = binary;
436
gboolean mmgui_smsdb_message_get_binary(mmgui_sms_message_t message)
438
if (message == NULL) return FALSE;
440
return message->binary;
443
gulong mmgui_smsdb_message_get_db_identifier(mmgui_sms_message_t message)
445
if (message == NULL) return 0;
447
return message->dbid;
450
guint mmgui_smsdb_get_unread_messages(smsdb_t smsdb)
452
if (smsdb == NULL) return 0;
454
return smsdb->unreadmessages;
457
gboolean mmgui_smsdb_add_sms(smsdb_t smsdb, mmgui_sms_message_t message)
468
if ((smsdb == NULL) || (message == NULL)) return FALSE;
469
if (smsdb->filepath == NULL) return FALSE;
470
if ((message->number == NULL) || ((message->text->str == NULL))) return FALSE;
472
db = gdbm_open((gchar *)smsdb->filepath, 0, GDBM_WRCREAT, MMGUI_SMSDB_ACCESS_MASK, 0);
474
if (db == NULL) return FALSE;
477
idvalue = (gulong)random();
478
memset(smsid, 0, sizeof(smsid));
479
idlen = snprintf(smsid, sizeof(smsid), "%lu", idvalue);
480
key.dptr = (gchar *)smsid;
482
} while (gdbm_exists(db, key));
484
message->dbid = idvalue;
486
smsnumber = g_markup_escape_text(message->number, -1);
488
if (smsnumber == NULL) {
489
g_warning("Unable to convert SMS number string");
494
smstext = g_markup_escape_text(message->text->str, -1);
496
if (smstext == NULL) {
497
g_warning("Unable to convert SMS text string");
503
smsxml = g_strdup_printf(MMGUI_SMSDB_SMS_MESSAGE_XML,
513
data.dsize = strlen(smsxml);
515
if (gdbm_store(db, key, data, GDBM_REPLACE) == -1) {
516
g_warning("Unable to write to database");
525
if (!message->read) {
526
smsdb->unreadmessages++;
536
static gint mmgui_smsdb_sms_message_sort_compare(gconstpointer a, gconstpointer b)
538
mmgui_sms_message_t sms1, sms2;
540
sms1 = (mmgui_sms_message_t)a;
541
sms2 = (mmgui_sms_message_t)b;
543
if (sms1->timestamp < sms2->timestamp) {
545
} else if (sms1->timestamp > sms2->timestamp) {
552
GSList *mmgui_smsdb_read_sms_list(smsdb_t smsdb)
556
mmgui_sms_message_t message;
560
if (smsdb == NULL) return NULL;
561
if (smsdb->filepath == NULL) return NULL;
563
db = gdbm_open((gchar *)smsdb->filepath, 0, GDBM_READER, MMGUI_SMSDB_ACCESS_MASK, 0);
565
if (db == NULL) return NULL;
567
smsdb->unreadmessages = 0;
571
key = gdbm_firstkey(db);
573
if (key.dptr != NULL) {
575
data = gdbm_fetch(db, key);
576
if (data.dptr != NULL) {
577
message = mmgui_smsdb_xml_parse(data.dptr, data.dsize);
578
if (message != NULL) {
579
if (!message->read) {
580
smsdb->unreadmessages++;
582
memset(smsid, 0, sizeof(smsid));
583
strncpy(smsid, key.dptr, key.dsize);
584
message->dbid = strtoul(smsid, NULL, 0);
585
list = g_slist_prepend(list, message);
588
key = gdbm_nextkey(db, key);
589
} while (key.dptr != NULL);
595
list = g_slist_sort(list, mmgui_smsdb_sms_message_sort_compare);
601
static void mmgui_smsdb_free_sms_list_foreach(gpointer data, gpointer user_data)
603
mmgui_sms_message_t message;
605
if (data != NULL) return;
607
message = (mmgui_sms_message_t)data;
609
if (message->number != NULL) {
610
g_free(message->number);
613
if (message->svcnumber != NULL) {
614
g_free(message->svcnumber);
617
if (message->idents != NULL) {
618
g_array_free(message->idents, TRUE);
621
if (message->text != NULL) {
622
g_string_free(message->text, TRUE);
626
void mmgui_smsdb_message_free_list(GSList *smslist)
628
if (smslist == NULL) return;
630
g_slist_foreach(smslist, mmgui_smsdb_free_sms_list_foreach, NULL);
631
g_slist_free(smslist);
634
mmgui_sms_message_t mmgui_smsdb_read_sms_message(smsdb_t smsdb, gulong idvalue)
640
mmgui_sms_message_t message;
642
if (smsdb == NULL) return NULL;
643
if (smsdb->filepath == NULL) return NULL;
645
db = gdbm_open((gchar *)smsdb->filepath, 0, GDBM_READER, MMGUI_SMSDB_ACCESS_MASK, 0);
647
if (db == NULL) return NULL;
651
memset(smsid, 0, sizeof(smsid));
652
idlen = snprintf(smsid, sizeof(smsid), "%lu", idvalue);
653
key.dptr = (gchar *)smsid;
656
if (gdbm_exists(db, key)) {
657
data = gdbm_fetch(db, key);
658
if (data.dptr != NULL) {
659
message = mmgui_smsdb_xml_parse(data.dptr, data.dsize);
660
message->dbid = idvalue;
669
gboolean mmgui_smsdb_remove_sms_message(smsdb_t smsdb, gulong idvalue)
673
gint idlen, unreaddelta;
677
if (smsdb == NULL) return FALSE;
678
if (smsdb->filepath == NULL) return FALSE;
680
db = gdbm_open((gchar *)smsdb->filepath, 0, GDBM_WRCREAT, MMGUI_SMSDB_ACCESS_MASK, 0);
682
if (db == NULL) return FALSE;
684
memset(smsid, 0, sizeof(smsid));
685
idlen = g_snprintf(smsid, sizeof(smsid), "%lu", idvalue);
686
key.dptr = (gchar *)smsid;
691
if (gdbm_exists(db, key)) {
692
data = gdbm_fetch(db, key);
693
if (data.dptr != NULL) {
694
node = strstr(data.dptr, MMGUI_SMSDB_READ_TAG);
696
if ((node-data.dptr > 8) && (isdigit(node[8]))) {
697
if (node[8] == '0') {
709
if (gdbm_delete(db, key) == 0) {
710
smsdb->unreadmessages += unreaddelta;
722
gboolean mmgui_smsdb_set_message_read_status(smsdb_t smsdb, gulong idvalue, gboolean readflag)
729
gchar *node, *trailer, *newmsg;
730
gchar newtrailer[64];
734
if (smsdb == NULL) return FALSE;
735
if (smsdb->filepath == NULL) return FALSE;
737
db = gdbm_open((gchar *)smsdb->filepath, 0, GDBM_WRITER, MMGUI_SMSDB_ACCESS_MASK, 0);
739
if (db == NULL) return FALSE;
741
memset(smsid, 0, sizeof(smsid));
742
idlen = snprintf(smsid, sizeof(smsid), "%lu", idvalue);
743
key.dptr = (gchar *)smsid;
750
if (gdbm_exists(db, key)) {
751
data = gdbm_fetch(db, key);
752
if (data.dptr != NULL) {
753
node = strstr(data.dptr, MMGUI_SMSDB_READ_TAG);
755
if ((node-data.dptr > 8) && (isdigit(node[8]))) {
756
if ((readflag) && (node[8] == '0')) {
759
} else if ((!readflag) && (node[8] == '1')) {
764
if (gdbm_store(db, key, data, GDBM_REPLACE) == 0) {
765
smsdb->unreadmessages += unreaddelta;
772
if (strstr(data.dptr, MMGUI_SMSDB_TRAILER_TAG) != NULL) {
773
memset(newtrailer, 0, sizeof(newtrailer));
774
newtrailerlen = g_snprintf(newtrailer, sizeof(newtrailer), MMGUI_SMSDB_TRAILER_PARAMS, readflag, MMGUI_SMSDB_SMS_FOLDER_INCOMING);
776
newmsg = g_malloc0(data.dsize-9+newtrailerlen+1);
777
memcpy(newmsg, data.dptr, data.dsize-9);
778
memcpy(newmsg+data.dsize-9, newtrailer, newtrailerlen);
783
data.dsize = data.dsize-9+newtrailerlen;
791
if (gdbm_store(db, key, data, GDBM_REPLACE) == 0) {
792
smsdb->unreadmessages += unreaddelta;
807
static mmgui_sms_message_t mmgui_smsdb_xml_parse(gchar *xml, gsize size)
809
mmgui_sms_message_t message;
811
GMarkupParseContext *mpc;
812
GError *error = NULL;
814
message = g_new(struct _mmgui_sms_message, 1);
816
message->timestamp = time(NULL);
817
message->read = FALSE;
818
message->folder = MMGUI_SMSDB_SMS_FOLDER_INCOMING;
819
message->binary = FALSE;
820
message->number = NULL;
821
message->svcnumber = NULL;
822
message->idents = NULL;
823
message->text = NULL;
825
mp.start_element = mmgui_smsdb_xml_get_element;
826
mp.end_element = mmgui_smsdb_xml_end_element;
827
mp.text = mmgui_smsdb_xml_get_value;
828
mp.passthrough = NULL;
831
mpc = g_markup_parse_context_new(&mp, 0, (gpointer)message, NULL);
832
g_markup_parse_context_parse(mpc, xml, size, &error);
834
//g_warning(error->message);
836
g_markup_parse_context_free(mpc);
839
g_markup_parse_context_free(mpc);
844
static void mmgui_smsdb_xml_get_element(GMarkupParseContext *context, const gchar *element, const gchar **attr_names, const gchar **attr_values, gpointer data, GError **error)
846
if (g_str_equal(element, "number")) {
847
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_NUMBER;
848
} else if (g_str_equal(element, "time")) {
849
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_TIME;
850
} else if (g_str_equal(element, "binary")) {
851
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_BINARY;
852
} else if (g_str_equal(element, "servicenumber")) {
853
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_SERVICENUMBER;
854
} else if (g_str_equal(element, "text")) {
855
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_TEXT;
856
} else if (g_str_equal(element, "read")) {
857
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_READ;
858
} else if (g_str_equal(element, "folder")) {
859
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_FOLDER;
861
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_NULL;
865
static void mmgui_smsdb_xml_get_value(GMarkupParseContext *context, const gchar *text, gsize size, gpointer data, GError **error)
867
mmgui_sms_message_t message;
868
gchar *numescstr, *textescstr;
871
message = (mmgui_sms_message_t)data;
873
if (mmgui_smsdb_xml_parameter == MMGUI_SMSDB_XML_PARAM_NULL) return;
875
switch (mmgui_smsdb_xml_parameter) {
876
case MMGUI_SMSDB_XML_PARAM_NUMBER:
877
numescstr = encoding_unescape_xml_markup(text, size);
878
if (numescstr != NULL) {
879
message->number = bcd_to_utf8_ascii_part(numescstr, strlen(numescstr), &numlen);
882
message->number = bcd_to_utf8_ascii_part(text, size, &numlen);
884
if (message->number != NULL) {
885
message->number = encoding_clear_special_symbols(message->number, numlen);
887
message->number = encoding_clear_special_symbols(g_strdup(text), size);
890
case MMGUI_SMSDB_XML_PARAM_TIME:
891
message->timestamp = (time_t)atol(text);
893
case MMGUI_SMSDB_XML_PARAM_BINARY:
895
message->binary = TRUE;
897
message->binary = FALSE;
900
case MMGUI_SMSDB_XML_PARAM_SERVICENUMBER:
901
message->svcnumber = g_strdup(text);
903
case MMGUI_SMSDB_XML_PARAM_TEXT:
904
textescstr = encoding_unescape_xml_markup(text, size);
905
if (textescstr != NULL) {
906
message->text = g_string_new(textescstr);
909
message->text = g_string_new(text);
912
case MMGUI_SMSDB_XML_PARAM_READ:
914
message->read = TRUE;
916
message->read = FALSE;
919
case MMGUI_SMSDB_XML_PARAM_FOLDER:
920
message->folder = atoi(text);
927
static void mmgui_smsdb_xml_end_element(GMarkupParseContext *context, const gchar *element, gpointer data, GError **error)
929
if (!g_str_equal(element, "sms")) {
930
mmgui_smsdb_xml_parameter = MMGUI_SMSDB_XML_PARAM_NULL;