2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.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
8 * http://www.tizenopensource.org/license
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.
18 #include <stdlib.h> /* strtod */
20 #include <ctype.h> /* isspace */
25 #include <livebox-service.h>
32 static Eina_List *s_list;
42 unsigned int pd_width;
43 unsigned int pd_height;
63 HAPI double parser_period(struct parser *handle)
65 return handle->period;
68 HAPI int parser_network(struct parser *handle)
70 return handle->network;
73 HAPI int parser_timeout(struct parser *handle)
75 return handle->timeout;
78 HAPI const char *parser_auto_launch(struct parser *handle)
80 return handle->auto_launch;
83 HAPI const char *parser_script(struct parser *handle)
85 return handle->script;
88 HAPI const char *parser_abi(struct parser *handle)
93 HAPI unsigned int parser_size(struct parser *handle)
98 HAPI const char *parser_lb_path(struct parser *handle)
100 return handle->lb_path;
103 HAPI const char *parser_lb_group(struct parser *handle)
105 return handle->lb_group;
108 HAPI const char *parser_pd_path(struct parser *handle)
110 return handle->pd_path;
113 HAPI const char *parser_pd_group(struct parser *handle)
115 return handle->pd_group;
118 HAPI const char *parser_group_str(struct parser *handle)
120 return handle->group;
123 HAPI int parser_secured(struct parser *handle)
125 return handle->secured;
128 HAPI void parser_get_pdsize(struct parser *handle, unsigned int *width, unsigned int *height)
130 *width = handle->pd_width;
131 *height = handle->pd_height;
134 HAPI int parser_pinup(struct parser *handle)
136 return handle->pinup;
139 HAPI int parser_text_lb(struct parser *handle)
141 return handle->text_lb;
144 HAPI int parser_text_pd(struct parser *handle)
146 return handle->text_pd;
149 HAPI int parser_buffer_lb(struct parser *handle)
151 return handle->buffer_lb;
154 HAPI int parser_buffer_pd(struct parser *handle)
156 return handle->buffer_pd;
159 HAPI int parser_find(const char *pkgname)
167 len = strlen(pkgname) * 2 + strlen(CONF_PATH);
169 filename = malloc(len);
173 ret = snprintf(filename, len, CONF_PATH, pkgname, pkgname);
179 DbgPrint("Conf file is %s for package %s\n", filename, pkgname);
181 EINA_LIST_FOREACH(s_list, l, item) {
182 if (!strcmp(item->filename, filename)) {
192 static inline int parse_size(const char *buffer, unsigned int *size)
214 while (state != ERROR && state != END) {
237 w = (w * 10) + (buffer[i] - '0');
267 h = (h * 10) + (buffer[i] - '0');
280 if (w == 1 && h == 1) {
281 *size |= LB_SIZE_TYPE_1x1;
282 } else if (w == 2 && h == 1) {
283 *size |= LB_SIZE_TYPE_2x1;
284 } else if (w == 2 && h == 2) {
285 *size |= LB_SIZE_TYPE_2x2;
286 } else if (w == 4 && h == 1) {
287 *size |= LB_SIZE_TYPE_4x1;
288 } else if (w == 4 && h == 2) {
289 *size |= LB_SIZE_TYPE_4x2;
290 } else if (w == 4 && h == 3) {
291 *size |= LB_SIZE_TYPE_4x3;
292 } else if (w == 4 && h == 4) {
293 *size |= LB_SIZE_TYPE_4x4;
294 } else if (w == 21 && h == 21) {
295 *size |= LB_SIZE_TYPE_EASY_1x1;
296 } else if (w == 23 && h == 21) {
297 *size |= LB_SIZE_TYPE_EASY_3x1;
298 } else if (w == 23 && h == 23) {
299 *size |= LB_SIZE_TYPE_EASY_3x3;
301 ErrPrint("Invalid size type: %dx%d\n", w, h);
304 if (buffer[i] == ';')
306 else if (buffer[i] == '\0')
317 return *size ? 0 : -1;
322 * This will change the value of "buffer"
324 static inline const char *rtrim(char *buffer)
328 len = strlen(buffer);
329 while (len > 0 && isspace(buffer[len - 1]))
342 * This will change the value of "buffer"
344 static inline char *dup_rtrim(char *buffer)
351 ret = strdup(buffer);
353 ErrPrint("Heap: %s\n", strerror(errno));
360 static void period_handler(struct parser *item, char *buffer)
367 item->period = strtod(buffer, &tmp);
370 static void timeout_handler(struct parser *item, char *buffer)
375 item->timeout = atoi(buffer);
378 static void network_handler(struct parser *item, char *buffer)
383 item->network = !!atoi(buffer);
386 static void auto_launch_handler(struct parser *item, char *buffer)
391 item->auto_launch = strdup(buffer);
392 if (!item->auto_launch) {
393 ErrPrint("Heap: %s\n", strerror(errno));
398 static void size_handler(struct parser *item, char *buffer)
400 if (parse_size(buffer, &item->size) == -1) {
401 ErrPrint("Failed to get size\n");
402 item->size = 0x00000001;
406 static void pd_size_handler(struct parser *item, char *buffer)
408 if (sscanf(buffer, "%ux%u", &item->pd_width, &item->pd_height) != 2)
409 ErrPrint("parse pd size\n");
412 static void text_lb_handler(struct parser *item, char *buffer)
417 item->text_lb = !!atoi(buffer);
420 static void abi_handler(struct parser *item, char *buffer)
422 item->abi = dup_rtrim(buffer);
425 static void script_handler(struct parser *item, char *buffer)
427 item->script = dup_rtrim(buffer);
430 static void buffer_pd_handler(struct parser *item, char *buffer)
435 item->buffer_pd = !!atoi(buffer);
438 static void buffer_lb_handler(struct parser *item, char *buffer)
442 item->buffer_lb = !!atoi(buffer);
445 static void text_pd_handler(struct parser *item, char *buffer)
450 item->text_pd = !!atoi(buffer);
453 static void pinup_handler(struct parser *item, char *buffer)
458 item->pinup = !!atoi(buffer);
461 static void lb_path_handler(struct parser *item, char *buffer)
464 DbgFree(item->lb_path);
466 item->lb_path = dup_rtrim(buffer);
468 ErrPrint("Error: %s\n", strerror(errno));
471 static void group_handler(struct parser *item, char *buffer)
474 DbgFree(item->group);
476 item->group = dup_rtrim(buffer);
478 ErrPrint("Error: %s\n", strerror(errno));
481 static void secured_handler(struct parser *item, char *buffer)
486 item->secured = !!atoi(buffer);
489 static void lb_group_handler(struct parser *item, char *buffer)
492 DbgFree(item->lb_group);
494 item->lb_group = dup_rtrim(buffer);
496 ErrPrint("Error: %s\n", strerror(errno));
499 static void pd_path_handler(struct parser *item, char *buffer)
502 DbgFree(item->pd_path);
504 item->pd_path = dup_rtrim(buffer);
506 ErrPrint("Error: %s\n", strerror(errno));
509 static void pd_group_handler(struct parser *item, char *buffer)
512 DbgFree(item->pd_group);
514 item->pd_group = dup_rtrim(buffer);
516 ErrPrint("Error: %s\n", strerror(errno));
519 HAPI struct parser *parser_load(const char *pkgname)
540 static const struct token_parser {
542 void (*handler)(struct parser *, char *buffer);
543 } token_handler[] = {
546 .handler = period_handler,
550 .handler = timeout_handler,
554 .handler = network_handler,
557 .name = "auto_launch",
558 .handler = auto_launch_handler,
562 .handler = size_handler,
566 .handler = group_handler,
570 .handler = secured_handler,
573 .name = "livebox_path",
574 .handler = lb_path_handler,
577 .name = "livebox_group",
578 .handler = lb_group_handler,
582 .handler = pd_path_handler,
586 .handler = pd_group_handler,
590 .handler = pd_size_handler,
594 .handler = pinup_handler,
597 .name = "text_livebox",
598 .handler = text_lb_handler,
602 .handler = text_pd_handler,
605 .name = "buffer_livebox",
606 .handler = buffer_lb_handler,
610 .handler = buffer_pd_handler,
614 .handler = script_handler,
618 .handler = abi_handler,
627 item = calloc(1, sizeof(*item));
632 len = strlen(CONF_PATH) + strlen(pkgname) * 2;
633 item->filename = malloc(len);
634 if (!item->filename) {
635 ErrPrint("Error: %s\n", strerror(errno));
640 ret = snprintf(item->filename, len, CONF_PATH, pkgname, pkgname);
642 ErrPrint("Error: %s\n", strerror(errno));
643 DbgFree(item->filename);
648 item->lb_path = NULL;
649 item->lb_group = NULL;
652 item->auto_launch = NULL;
653 item->size = 0x00000001;
658 fp = fopen(item->filename, "rt");
660 DbgFree(item->filename);
673 if ((c == EOF) && (state == VALUE)) {
674 DbgPrint("[%s:%d] VALUE state EOF\n", __func__, __LINE__);
680 if (c == CR || c == LF || c == EOF) {
681 buffer[buffer_idx] = '\0';
687 linelen = -1; /* Will be ZERO by follwing increment code */
690 buffer[buffer_idx++] = c;
691 if (buffer_idx == (sizeof(buffer) - 1)) {
692 buffer[buffer_idx] = '\0';
698 if (linelen == 0 && c == '#') {
700 } else if (isspace(c)) {
701 /* Ignore empty space */
710 else if (!isspace(c))
716 buffer[buffer_idx] = '\0';
718 } else if (buffer_idx != 0) {
719 buffer[buffer_idx++] = c;
720 if (buffer_idx >= sizeof(buffer))
725 } else if (isspace(c)) {
726 if (buffer_idx == 0) {
728 } else if (quote == 1) {
729 buffer[buffer_idx++] = c;
730 if (buffer_idx >= sizeof(buffer))
733 buffer[buffer_idx] = '\0';
738 buffer[buffer_idx++] = c;
739 if (buffer_idx >= sizeof(buffer))
749 } else if (isspace(c)) {
753 if (token_handler[token_idx].name[ch_idx] != '\0')
759 /* Now start to find a token! */
763 if (token_handler[token_idx].name[ch_idx] == c) {
768 ungetc(token_handler[token_idx].name[ch_idx], fp);
772 if (token_handler[token_idx].name == NULL)
780 if (c == CR || c == LF || c == EOF) {
790 if (c == LF || c == CR || c == EOF) {
795 * Make the string terminator
797 buffer[buffer_idx] = '\0';
799 if (token_idx >= 0 && token_handler[token_idx].handler)
800 token_handler[token_idx].handler(item, buffer);
808 } else if (isspace(c)) {
824 s_list = eina_list_append(s_list, item);
828 HAPI int parser_unload(struct parser *item)
830 s_list = eina_list_remove(s_list, item);
832 DbgFree(item->auto_launch);
834 DbgFree(item->script);
835 DbgFree(item->group);
836 DbgFree(item->pd_group);
837 DbgFree(item->pd_path);
838 DbgFree(item->lb_group);
839 DbgFree(item->lb_path);
840 DbgFree(item->filename);