2 * Copyright 2013 Samsung Electronics Co., Ltd
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
8 * http://floralicense.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>
26 #include <livebox-errno.h>
33 static Eina_List *s_list;
37 #define RETURN_TYPE long long
39 #define RETURN_TYPE int
49 unsigned int pd_width;
50 unsigned int pd_height;
70 HAPI double parser_period(struct parser *handle)
72 return handle->period;
75 HAPI int parser_network(struct parser *handle)
77 return handle->network;
80 HAPI int parser_timeout(struct parser *handle)
82 return handle->timeout;
85 HAPI const char *parser_auto_launch(struct parser *handle)
87 return handle->auto_launch;
90 HAPI const char *parser_script(struct parser *handle)
92 return handle->script;
95 HAPI const char *parser_abi(struct parser *handle)
100 HAPI unsigned int parser_size(struct parser *handle)
105 HAPI const char *parser_lb_path(struct parser *handle)
107 return handle->lb_path;
110 HAPI const char *parser_lb_group(struct parser *handle)
112 return handle->lb_group;
115 HAPI const char *parser_pd_path(struct parser *handle)
117 return handle->pd_path;
120 HAPI const char *parser_pd_group(struct parser *handle)
122 return handle->pd_group;
125 HAPI const char *parser_group_str(struct parser *handle)
127 return handle->group;
130 HAPI int parser_secured(struct parser *handle)
132 return handle->secured;
135 HAPI void parser_get_pdsize(struct parser *handle, unsigned int *width, unsigned int *height)
137 *width = handle->pd_width;
138 *height = handle->pd_height;
141 HAPI int parser_pinup(struct parser *handle)
143 return handle->pinup;
146 HAPI int parser_text_lb(struct parser *handle)
148 return handle->text_lb;
151 HAPI int parser_text_pd(struct parser *handle)
153 return handle->text_pd;
156 HAPI int parser_buffer_lb(struct parser *handle)
158 return handle->buffer_lb;
161 HAPI int parser_buffer_pd(struct parser *handle)
163 return handle->buffer_pd;
166 HAPI RETURN_TYPE parser_find(const char *pkgname)
174 len = strlen(pkgname) * 2 + strlen(CONF_PATH);
176 filename = malloc(len);
178 return (RETURN_TYPE)0;
181 ret = snprintf(filename, len, CONF_PATH, pkgname, pkgname);
184 return (RETURN_TYPE)0;
187 DbgPrint("Conf file %s for package %s\n", filename, pkgname);
189 EINA_LIST_FOREACH(s_list, l, item) {
190 if (!strcmp(item->filename, filename)) {
192 return (RETURN_TYPE)item;
197 return (RETURN_TYPE)0;
200 static inline int parse_size(const char *buffer, unsigned int *size)
222 while (state != ERROR && state != END) {
245 w = (w * 10) + (buffer[i] - '0');
275 h = (h * 10) + (buffer[i] - '0');
288 if (w == 1 && h == 1) {
289 *size |= LB_SIZE_TYPE_1x1;
290 } else if (w == 2 && h == 1) {
291 *size |= LB_SIZE_TYPE_2x1;
292 } else if (w == 2 && h == 2) {
293 *size |= LB_SIZE_TYPE_2x2;
294 } else if (w == 4 && h == 1) {
295 *size |= LB_SIZE_TYPE_4x1;
296 } else if (w == 4 && h == 2) {
297 *size |= LB_SIZE_TYPE_4x2;
298 } else if (w == 4 && h == 3) {
299 *size |= LB_SIZE_TYPE_4x3;
300 } else if (w == 4 && h == 4) {
301 *size |= LB_SIZE_TYPE_4x4;
302 } else if (w == 21 && h == 21) {
303 *size |= LB_SIZE_TYPE_EASY_1x1;
304 } else if (w == 23 && h == 21) {
305 *size |= LB_SIZE_TYPE_EASY_3x1;
306 } else if (w == 23 && h == 23) {
307 *size |= LB_SIZE_TYPE_EASY_3x3;
309 ErrPrint("Invalid size type: %dx%d\n", w, h);
312 if (buffer[i] == ';') {
314 } else if (buffer[i] == '\0') {
326 return *size ? 0 : -1;
331 * This will change the value of "buffer"
333 static inline const char *rtrim(char *buffer)
337 len = strlen(buffer);
338 while (len > 0 && isspace(buffer[len - 1])) {
353 * This will change the value of "buffer"
355 static inline char *dup_rtrim(char *buffer)
359 if (!rtrim(buffer)) {
363 ret = strdup(buffer);
365 ErrPrint("Heap: %s\n", strerror(errno));
372 static void period_handler(struct parser *item, char *buffer)
376 if (!rtrim(buffer)) {
380 item->period = strtod(buffer, &tmp);
383 static void timeout_handler(struct parser *item, char *buffer)
385 if (!rtrim(buffer)) {
389 item->timeout = atoi(buffer);
392 static void network_handler(struct parser *item, char *buffer)
394 if (!rtrim(buffer)) {
398 item->network = !!atoi(buffer);
401 static void auto_launch_handler(struct parser *item, char *buffer)
403 if (!rtrim(buffer)) {
407 item->auto_launch = strdup(buffer);
408 if (!item->auto_launch) {
409 ErrPrint("Heap: %s\n", strerror(errno));
414 static void size_handler(struct parser *item, char *buffer)
416 if (parse_size(buffer, &item->size) == -1) {
417 ErrPrint("Failed to get size\n");
418 item->size = 0x00000001;
422 static void pd_size_handler(struct parser *item, char *buffer)
424 if (sscanf(buffer, "%ux%u", &item->pd_width, &item->pd_height) != 2) {
425 ErrPrint("parse pd size\n");
429 static void text_lb_handler(struct parser *item, char *buffer)
431 if (!rtrim(buffer)) {
435 item->text_lb = !!atoi(buffer);
438 static void abi_handler(struct parser *item, char *buffer)
440 item->abi = dup_rtrim(buffer);
443 static void script_handler(struct parser *item, char *buffer)
445 item->script = dup_rtrim(buffer);
448 static void buffer_pd_handler(struct parser *item, char *buffer)
450 if (!rtrim(buffer)) {
454 item->buffer_pd = !!atoi(buffer);
457 static void buffer_lb_handler(struct parser *item, char *buffer)
459 if (!rtrim(buffer)) {
463 item->buffer_lb = !!atoi(buffer);
466 static void text_pd_handler(struct parser *item, char *buffer)
468 if (!rtrim(buffer)) {
472 item->text_pd = !!atoi(buffer);
475 static void pinup_handler(struct parser *item, char *buffer)
477 if (!rtrim(buffer)) {
481 item->pinup = !!atoi(buffer);
484 static void lb_path_handler(struct parser *item, char *buffer)
487 DbgFree(item->lb_path);
490 item->lb_path = dup_rtrim(buffer);
491 if (!item->lb_path) {
492 ErrPrint("Error: %s\n", strerror(errno));
496 static void group_handler(struct parser *item, char *buffer)
499 DbgFree(item->group);
502 item->group = dup_rtrim(buffer);
504 ErrPrint("Error: %s\n", strerror(errno));
508 static void secured_handler(struct parser *item, char *buffer)
510 if (!rtrim(buffer)) {
514 item->secured = !!atoi(buffer);
517 static void lb_group_handler(struct parser *item, char *buffer)
519 if (item->lb_group) {
520 DbgFree(item->lb_group);
523 item->lb_group = dup_rtrim(buffer);
524 if (!item->lb_group) {
525 ErrPrint("Error: %s\n", strerror(errno));
529 static void pd_path_handler(struct parser *item, char *buffer)
532 DbgFree(item->pd_path);
535 item->pd_path = dup_rtrim(buffer);
536 if (!item->pd_path) {
537 ErrPrint("Error: %s\n", strerror(errno));
541 static void pd_group_handler(struct parser *item, char *buffer)
543 if (item->pd_group) {
544 DbgFree(item->pd_group);
547 item->pd_group = dup_rtrim(buffer);
548 if (!item->pd_group) {
549 ErrPrint("Error: %s\n", strerror(errno));
553 HAPI struct parser *parser_load(const char *pkgname)
574 static const struct token_parser {
576 void (*handler)(struct parser *, char *buffer);
577 } token_handler[] = {
580 .handler = period_handler,
584 .handler = timeout_handler,
588 .handler = network_handler,
591 .name = "auto_launch",
592 .handler = auto_launch_handler,
596 .handler = size_handler,
600 .handler = group_handler,
604 .handler = secured_handler,
607 .name = "livebox_path",
608 .handler = lb_path_handler,
611 .name = "livebox_group",
612 .handler = lb_group_handler,
616 .handler = pd_path_handler,
620 .handler = pd_group_handler,
624 .handler = pd_size_handler,
628 .handler = pinup_handler,
631 .name = "text_livebox",
632 .handler = text_lb_handler,
636 .handler = text_pd_handler,
639 .name = "buffer_livebox",
640 .handler = buffer_lb_handler,
644 .handler = buffer_pd_handler,
648 .handler = script_handler,
652 .handler = abi_handler,
661 item = calloc(1, sizeof(*item));
667 len = strlen(CONF_PATH) + strlen(pkgname) * 2;
668 item->filename = malloc(len);
669 if (!item->filename) {
670 ErrPrint("Error: %s\n", strerror(errno));
675 ret = snprintf(item->filename, len, CONF_PATH, pkgname, pkgname);
677 ErrPrint("Error: %s\n", strerror(errno));
678 DbgFree(item->filename);
683 item->lb_path = NULL;
684 item->lb_group = NULL;
687 item->auto_launch = NULL;
688 item->size = 0x00000001;
693 fp = fopen(item->filename, "rt");
695 DbgFree(item->filename);
708 if ((c == EOF) && (state == VALUE)) {
714 if (c == CR || c == LF || c == EOF) {
715 buffer[buffer_idx] = '\0';
721 linelen = -1; /* Will be ZERO by follwing increment code */
724 buffer[buffer_idx++] = c;
725 if (buffer_idx == (sizeof(buffer) - 1)) {
726 buffer[buffer_idx] = '\0';
732 if (linelen == 0 && c == '#') {
734 } else if (isspace(c)) {
735 /* Ignore empty space */
744 } else if (!isspace(c)) {
751 buffer[buffer_idx] = '\0';
753 } else if (buffer_idx != 0) {
754 buffer[buffer_idx++] = c;
755 if (buffer_idx >= sizeof(buffer)) {
761 } else if (isspace(c)) {
762 if (buffer_idx == 0) {
764 } else if (quote == 1) {
765 buffer[buffer_idx++] = c;
766 if (buffer_idx >= sizeof(buffer)) {
770 buffer[buffer_idx] = '\0';
775 buffer[buffer_idx++] = c;
776 if (buffer_idx >= sizeof(buffer)) {
788 } else if (isspace(c)) {
793 if (token_handler[token_idx].name[ch_idx] != '\0') {
800 /* Now start to find a token! */
804 if (token_handler[token_idx].name[ch_idx] == c) {
808 while (ch_idx-- > 0) {
809 ungetc(token_handler[token_idx].name[ch_idx], fp);
814 if (token_handler[token_idx].name == NULL) {
823 if (c == CR || c == LF || c == EOF) {
833 if (c == LF || c == CR || c == EOF) {
838 * Make the string terminator
840 buffer[buffer_idx] = '\0';
842 if (token_idx >= 0 && token_handler[token_idx].handler) {
843 token_handler[token_idx].handler(item, buffer);
852 } else if (isspace(c)) {
866 if (fclose(fp) != 0) {
867 ErrPrint("fclose: %s\n", strerror(errno));
870 s_list = eina_list_append(s_list, item);
874 HAPI int parser_unload(struct parser *item)
876 s_list = eina_list_remove(s_list, item);
878 DbgFree(item->auto_launch);
880 DbgFree(item->script);
881 DbgFree(item->group);
882 DbgFree(item->pd_group);
883 DbgFree(item->pd_path);
884 DbgFree(item->lb_group);
885 DbgFree(item->lb_path);
886 DbgFree(item->filename);
888 return LB_STATUS_SUCCESS;