viking

webkit based web browser for Enlightenment
Log | Files | Refs | LICENSE

viking_state.c (26442B)


      1 /* This file has been automatically generated by geneet.py */
      2 /*                      DO NOT MODIFY                      */
      3 
      4 #include <limits.h>
      5 #include <stdio.h>
      6 #include <sys/stat.h>
      7 #include <sys/types.h>
      8 #include <unistd.h>
      9 
     10 #include "viking_state.h"
     11 
     12 struct _Config {
     13     unsigned char allow_popup;
     14     unsigned char enable_auto_load_images;
     15     unsigned char enable_auto_shrink_images;
     16     unsigned char enable_javascript;
     17     unsigned char enable_touch_interface;
     18     unsigned char enable_history;
     19     const char * home_page;
     20     const char * proxy;
     21     unsigned char restore_state;
     22     const char * user_agent;
     23     unsigned char frame_flattening;
     24     int text_zoom;
     25     int minimum_font_size;
     26     int cookie_policy;
     27     const char *__eet_filename;
     28 };
     29 
     30 struct _Hist_Item {
     31     unsigned char enabled;
     32     const char * title;
     33     const char * url;
     34     const char * proto;
     35     unsigned int visit_count;
     36     double last_visit;
     37 };
     38 
     39 struct _Hist {
     40     Eina_Hash * items;
     41     const char *__eet_filename;
     42 };
     43 
     44 struct _Session_Item {
     45     const char * url;
     46     unsigned char focused;
     47     int scroll_x;
     48     int scroll_y;
     49 };
     50 
     51 struct _Session_Window {
     52     Eina_List * tabs;
     53     unsigned char focused;
     54 };
     55 
     56 struct _Session {
     57     Eina_List * windows;
     58     const char *__eet_filename;
     59 };
     60 
     61 static const char CONFIG_ENTRY[] = "config";
     62 static const char HIST_ITEM_ENTRY[] = "hist_item";
     63 static const char HIST_ENTRY[] = "hist";
     64 static const char SESSION_ITEM_ENTRY[] = "session_item";
     65 static const char SESSION_WINDOW_ENTRY[] = "session_window";
     66 static const char SESSION_ENTRY[] = "session";
     67 
     68 static Eet_Data_Descriptor *_config_descriptor = NULL;
     69 static Eet_Data_Descriptor *_hist_item_descriptor = NULL;
     70 static Eet_Data_Descriptor *_hist_descriptor = NULL;
     71 static Eet_Data_Descriptor *_session_item_descriptor = NULL;
     72 static Eet_Data_Descriptor *_session_window_descriptor = NULL;
     73 static Eet_Data_Descriptor *_session_descriptor = NULL;
     74 
     75 static inline void
     76 _config_init(void)
     77 {
     78     Eet_Data_Descriptor_Class eddc;
     79 
     80     if (_config_descriptor) return;
     81 
     82     EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Config);
     83     _config_descriptor = eet_data_descriptor_stream_new(&eddc);
     84 
     85     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "allow_popup", allow_popup, EET_T_UCHAR);
     86     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "enable_auto_load_images", enable_auto_load_images, EET_T_UCHAR);
     87     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "enable_auto_shrink_images", enable_auto_shrink_images, EET_T_UCHAR);
     88     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "enable_javascript", enable_javascript, EET_T_UCHAR);
     89     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "enable_touch_interface", enable_touch_interface, EET_T_UCHAR);
     90     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "enable_history", enable_history, EET_T_UCHAR);
     91     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "home_page", home_page, EET_T_STRING);
     92     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "proxy", proxy, EET_T_STRING);
     93     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "restore_state", restore_state, EET_T_UCHAR);
     94     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "user_agent", user_agent, EET_T_STRING);
     95     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "frame_flattening", frame_flattening, EET_T_UCHAR);
     96     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "text_zoom", text_zoom, EET_T_INT);
     97     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "minimum_font_size", minimum_font_size, EET_T_INT);
     98     EET_DATA_DESCRIPTOR_ADD_BASIC(_config_descriptor, Config, "cookie_policy", cookie_policy, EET_T_INT);
     99 }
    100 
    101 static inline void
    102 _config_shutdown(void)
    103 {
    104     if (!_config_descriptor) return;
    105     eet_data_descriptor_free(_config_descriptor);
    106     _config_descriptor = NULL;
    107 }
    108 
    109 Config *
    110 config_new(unsigned char allow_popup, unsigned char enable_auto_load_images, unsigned char enable_auto_shrink_images, unsigned char enable_javascript, unsigned char enable_touch_interface, unsigned char enable_history, const char * home_page, const char * proxy, unsigned char restore_state, const char * user_agent, unsigned char frame_flattening, int text_zoom, int minimum_font_size, int cookie_policy)
    111 {
    112     Config *config = calloc(1, sizeof(Config));
    113 
    114     if (!config)
    115        {
    116           fprintf(stderr, "ERROR: could not calloc Config\n");
    117           return NULL;
    118        }
    119 
    120     config->allow_popup = allow_popup;
    121     config->enable_auto_load_images = enable_auto_load_images;
    122     config->enable_auto_shrink_images = enable_auto_shrink_images;
    123     config->enable_javascript = enable_javascript;
    124     config->enable_touch_interface = enable_touch_interface;
    125     config->enable_history = enable_history;
    126     config->home_page = eina_stringshare_add(home_page ? home_page : "http://www.getaddrinfo.net");
    127     config->proxy = eina_stringshare_add(proxy);
    128     config->restore_state = restore_state;
    129     config->user_agent = eina_stringshare_add(user_agent ? user_agent : "chrome");
    130     config->frame_flattening = frame_flattening;
    131     config->text_zoom = text_zoom;
    132     config->minimum_font_size = minimum_font_size;
    133     config->cookie_policy = cookie_policy;
    134 
    135     return config;
    136 }
    137 
    138 void
    139 config_free(Config *config)
    140 {
    141     eina_stringshare_del(config->home_page);
    142     eina_stringshare_del(config->proxy);
    143     eina_stringshare_del(config->user_agent);
    144     free(config);
    145 }
    146 
    147 inline unsigned char
    148 config_allow_popup_get(const Config *config)
    149 {
    150     return config->allow_popup;
    151 }
    152 
    153 inline void
    154 config_allow_popup_set(Config *config, unsigned char allow_popup)
    155 {
    156     EINA_SAFETY_ON_NULL_RETURN(config);
    157     config->allow_popup = allow_popup;
    158 }
    159 
    160 inline unsigned char
    161 config_enable_auto_load_images_get(const Config *config)
    162 {
    163     return config->enable_auto_load_images;
    164 }
    165 
    166 inline void
    167 config_enable_auto_load_images_set(Config *config, unsigned char enable_auto_load_images)
    168 {
    169     EINA_SAFETY_ON_NULL_RETURN(config);
    170     config->enable_auto_load_images = enable_auto_load_images;
    171 }
    172 
    173 inline unsigned char
    174 config_enable_auto_shrink_images_get(const Config *config)
    175 {
    176     return config->enable_auto_shrink_images;
    177 }
    178 
    179 inline void
    180 config_enable_auto_shrink_images_set(Config *config, unsigned char enable_auto_shrink_images)
    181 {
    182     EINA_SAFETY_ON_NULL_RETURN(config);
    183     config->enable_auto_shrink_images = enable_auto_shrink_images;
    184 }
    185 
    186 inline unsigned char
    187 config_enable_javascript_get(const Config *config)
    188 {
    189     return config->enable_javascript;
    190 }
    191 
    192 inline void
    193 config_enable_javascript_set(Config *config, unsigned char enable_javascript)
    194 {
    195     EINA_SAFETY_ON_NULL_RETURN(config);
    196     config->enable_javascript = enable_javascript;
    197 }
    198 
    199 inline unsigned char
    200 config_enable_touch_interface_get(const Config *config)
    201 {
    202     return config->enable_touch_interface;
    203 }
    204 
    205 inline void
    206 config_enable_touch_interface_set(Config *config, unsigned char enable_touch_interface)
    207 {
    208     EINA_SAFETY_ON_NULL_RETURN(config);
    209     config->enable_touch_interface = enable_touch_interface;
    210 }
    211 
    212 inline unsigned char
    213 config_enable_history_get(const Config *config)
    214 {
    215     return config->enable_history;
    216 }
    217 
    218 inline void
    219 config_enable_history_set(Config *config, unsigned char enable_history)
    220 {
    221     EINA_SAFETY_ON_NULL_RETURN(config);
    222     config->enable_history = enable_history;
    223 }
    224 
    225 inline const char *
    226 config_home_page_get(const Config *config)
    227 {
    228     return config->home_page;
    229 }
    230 
    231 inline void
    232 config_home_page_set(Config *config, const char *home_page)
    233 {
    234     EINA_SAFETY_ON_NULL_RETURN(config);
    235     eina_stringshare_replace(&(config->home_page), home_page);
    236 }
    237 
    238 inline const char *
    239 config_proxy_get(const Config *config)
    240 {
    241     return config->proxy;
    242 }
    243 
    244 inline void
    245 config_proxy_set(Config *config, const char *proxy)
    246 {
    247     EINA_SAFETY_ON_NULL_RETURN(config);
    248     eina_stringshare_replace(&(config->proxy), proxy);
    249 }
    250 
    251 inline unsigned char
    252 config_restore_state_get(const Config *config)
    253 {
    254     return config->restore_state;
    255 }
    256 
    257 inline void
    258 config_restore_state_set(Config *config, unsigned char restore_state)
    259 {
    260     EINA_SAFETY_ON_NULL_RETURN(config);
    261     config->restore_state = restore_state;
    262 }
    263 
    264 inline const char *
    265 config_user_agent_get(const Config *config)
    266 {
    267     return config->user_agent;
    268 }
    269 
    270 inline void
    271 config_user_agent_set(Config *config, const char *user_agent)
    272 {
    273     EINA_SAFETY_ON_NULL_RETURN(config);
    274     eina_stringshare_replace(&(config->user_agent), user_agent);
    275 }
    276 
    277 inline unsigned char
    278 config_frame_flattening_get(const Config *config)
    279 {
    280     return config->frame_flattening;
    281 }
    282 
    283 inline void
    284 config_frame_flattening_set(Config *config, unsigned char frame_flattening)
    285 {
    286     EINA_SAFETY_ON_NULL_RETURN(config);
    287     config->frame_flattening = frame_flattening;
    288 }
    289 
    290 inline int
    291 config_text_zoom_get(const Config *config)
    292 {
    293     return config->text_zoom;
    294 }
    295 
    296 inline void
    297 config_text_zoom_set(Config *config, int text_zoom)
    298 {
    299     EINA_SAFETY_ON_NULL_RETURN(config);
    300     config->text_zoom = text_zoom;
    301 }
    302 
    303 inline int
    304 config_minimum_font_size_get(const Config *config)
    305 {
    306     return config->minimum_font_size;
    307 }
    308 
    309 inline void
    310 config_minimum_font_size_set(Config *config, int minimum_font_size)
    311 {
    312     EINA_SAFETY_ON_NULL_RETURN(config);
    313     config->minimum_font_size = minimum_font_size;
    314 }
    315 
    316 inline int
    317 config_cookie_policy_get(const Config *config)
    318 {
    319     return config->cookie_policy;
    320 }
    321 
    322 inline void
    323 config_cookie_policy_set(Config *config, int cookie_policy)
    324 {
    325     EINA_SAFETY_ON_NULL_RETURN(config);
    326     config->cookie_policy = cookie_policy;
    327 }
    328 
    329 Config *
    330 config_load(const char *filename)
    331 {
    332     Config *config = NULL;
    333     Eet_File *ef = eet_open(filename, EET_FILE_MODE_READ);
    334     if (!ef)
    335       {
    336         fprintf(stderr, "ERROR: could not open '%s' for read\n", filename);
    337         return NULL;
    338       }
    339 
    340     config = eet_data_read(ef, _config_descriptor, CONFIG_ENTRY);
    341     if (!config) goto end;
    342     config->__eet_filename = eina_stringshare_add(filename);
    343 
    344 end:
    345     eet_close(ef);
    346     return config;
    347 }
    348 
    349 Eina_Bool
    350 config_save(Config *config, const char *filename)
    351 {
    352     Eet_File *ef;
    353     Eina_Bool ret;
    354 
    355     if (filename) eina_stringshare_replace(&(config->__eet_filename), filename);
    356     else if (config->__eet_filename) filename = config->__eet_filename;
    357     else return EINA_FALSE;
    358 
    359     ef = eet_open(filename, EET_FILE_MODE_READ_WRITE);
    360     if (!ef)
    361        {
    362           fprintf(stderr, "ERROR: could not open '%s' for write\n", filename);
    363           return EINA_FALSE;
    364        }
    365 
    366     ret = !!eet_data_write(ef, _config_descriptor, CONFIG_ENTRY, config, EINA_TRUE);
    367     eet_close(ef);
    368 
    369     return ret;
    370 }
    371 
    372 static inline void
    373 _hist_item_init(void)
    374 {
    375     Eet_Data_Descriptor_Class eddc;
    376 
    377     if (_hist_item_descriptor) return;
    378 
    379     EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Hist_Item);
    380     _hist_item_descriptor = eet_data_descriptor_stream_new(&eddc);
    381 
    382     EET_DATA_DESCRIPTOR_ADD_BASIC(_hist_item_descriptor, Hist_Item, "enabled", enabled, EET_T_UCHAR);
    383     EET_DATA_DESCRIPTOR_ADD_BASIC(_hist_item_descriptor, Hist_Item, "title", title, EET_T_STRING);
    384     EET_DATA_DESCRIPTOR_ADD_BASIC(_hist_item_descriptor, Hist_Item, "url", url, EET_T_STRING);
    385     EET_DATA_DESCRIPTOR_ADD_BASIC(_hist_item_descriptor, Hist_Item, "proto", proto, EET_T_STRING);
    386     EET_DATA_DESCRIPTOR_ADD_BASIC(_hist_item_descriptor, Hist_Item, "visit_count", visit_count, EET_T_UINT);
    387     EET_DATA_DESCRIPTOR_ADD_BASIC(_hist_item_descriptor, Hist_Item, "last_visit", last_visit, EET_T_DOUBLE);
    388 }
    389 
    390 static inline void
    391 _hist_item_shutdown(void)
    392 {
    393     if (!_hist_item_descriptor) return;
    394     eet_data_descriptor_free(_hist_item_descriptor);
    395     _hist_item_descriptor = NULL;
    396 }
    397 
    398 Hist_Item *
    399 hist_item_new(unsigned char enabled, const char * title, const char * url, const char * proto, unsigned int visit_count, double last_visit)
    400 {
    401     Hist_Item *hist_item = calloc(1, sizeof(Hist_Item));
    402 
    403     if (!hist_item)
    404        {
    405           fprintf(stderr, "ERROR: could not calloc Hist_Item\n");
    406           return NULL;
    407        }
    408 
    409     hist_item->enabled = enabled;
    410     hist_item->title = eina_stringshare_add(title ? title : "Untitled");
    411     hist_item->url = eina_stringshare_add(url ? url : "about:blank");
    412     hist_item->proto = eina_stringshare_add(proto ? proto : "http");
    413     hist_item->visit_count = visit_count;
    414     hist_item->last_visit = last_visit;
    415 
    416     return hist_item;
    417 }
    418 
    419 void
    420 hist_item_free(Hist_Item *hist_item)
    421 {
    422     eina_stringshare_del(hist_item->title);
    423     eina_stringshare_del(hist_item->url);
    424     eina_stringshare_del(hist_item->proto);
    425     free(hist_item);
    426 }
    427 
    428 inline unsigned char
    429 hist_item_enabled_get(const Hist_Item *hist_item)
    430 {
    431     return hist_item->enabled;
    432 }
    433 
    434 inline void
    435 hist_item_enabled_set(Hist_Item *hist_item, unsigned char enabled)
    436 {
    437     EINA_SAFETY_ON_NULL_RETURN(hist_item);
    438     hist_item->enabled = enabled;
    439 }
    440 
    441 inline const char *
    442 hist_item_title_get(const Hist_Item *hist_item)
    443 {
    444     return hist_item->title;
    445 }
    446 
    447 inline void
    448 hist_item_title_set(Hist_Item *hist_item, const char *title)
    449 {
    450     EINA_SAFETY_ON_NULL_RETURN(hist_item);
    451     eina_stringshare_replace(&(hist_item->title), title);
    452 }
    453 
    454 inline const char *
    455 hist_item_url_get(const Hist_Item *hist_item)
    456 {
    457     return hist_item->url;
    458 }
    459 
    460 inline void
    461 hist_item_url_set(Hist_Item *hist_item, const char *url)
    462 {
    463     EINA_SAFETY_ON_NULL_RETURN(hist_item);
    464     eina_stringshare_replace(&(hist_item->url), url);
    465 }
    466 
    467 inline const char *
    468 hist_item_proto_get(const Hist_Item *hist_item)
    469 {
    470     return hist_item->proto;
    471 }
    472 
    473 inline void
    474 hist_item_proto_set(Hist_Item *hist_item, const char *proto)
    475 {
    476     EINA_SAFETY_ON_NULL_RETURN(hist_item);
    477     eina_stringshare_replace(&(hist_item->proto), proto);
    478 }
    479 
    480 inline unsigned int
    481 hist_item_visit_count_get(const Hist_Item *hist_item)
    482 {
    483     return hist_item->visit_count;
    484 }
    485 
    486 inline void
    487 hist_item_visit_count_set(Hist_Item *hist_item, unsigned int visit_count)
    488 {
    489     EINA_SAFETY_ON_NULL_RETURN(hist_item);
    490     hist_item->visit_count = visit_count;
    491 }
    492 
    493 inline double
    494 hist_item_last_visit_get(const Hist_Item *hist_item)
    495 {
    496     return hist_item->last_visit;
    497 }
    498 
    499 inline void
    500 hist_item_last_visit_set(Hist_Item *hist_item, double last_visit)
    501 {
    502     EINA_SAFETY_ON_NULL_RETURN(hist_item);
    503     hist_item->last_visit = last_visit;
    504 }
    505 
    506 
    507 static inline void
    508 _hist_init(void)
    509 {
    510     Eet_Data_Descriptor_Class eddc;
    511 
    512     if (_hist_descriptor) return;
    513 
    514     EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Hist);
    515     _hist_descriptor = eet_data_descriptor_stream_new(&eddc);
    516 
    517     EET_DATA_DESCRIPTOR_ADD_HASH(_hist_descriptor, Hist, "items", items, _hist_item_descriptor);
    518 }
    519 
    520 static inline void
    521 _hist_shutdown(void)
    522 {
    523     if (!_hist_descriptor) return;
    524     eet_data_descriptor_free(_hist_descriptor);
    525     _hist_descriptor = NULL;
    526 }
    527 
    528 Hist *
    529 hist_new(void)
    530 {
    531     Hist *hist = calloc(1, sizeof(Hist));
    532 
    533     if (!hist)
    534        {
    535           fprintf(stderr, "ERROR: could not calloc Hist\n");
    536           return NULL;
    537        }
    538 
    539     hist->items = eina_hash_stringshared_new(EINA_FREE_CB(hist_item_free));
    540 
    541     return hist;
    542 }
    543 
    544 void
    545 hist_free(Hist *hist)
    546 {
    547     if (hist->items) eina_hash_free(hist->items);
    548     free(hist);
    549 }
    550 
    551 void
    552 hist_items_add(Hist *hist, const char * url, Hist_Item *hist_item)
    553 {
    554     EINA_SAFETY_ON_NULL_RETURN(hist);
    555     eina_hash_add(hist->items, url, hist_item);
    556 }
    557 
    558 void
    559 hist_items_del(Hist *hist, const char * url)
    560 {
    561     EINA_SAFETY_ON_NULL_RETURN(hist);
    562     eina_hash_del(hist->items, url, NULL);
    563 }
    564 
    565 inline Hist_Item *
    566 hist_items_get(const Hist *hist, const char * url)
    567 {
    568     EINA_SAFETY_ON_NULL_RETURN_VAL(hist, NULL);
    569     return eina_hash_find(hist->items, url);
    570 }
    571 
    572 inline Eina_Hash *
    573 hist_items_hash_get(const Hist *hist)
    574 {
    575     EINA_SAFETY_ON_NULL_RETURN_VAL(hist, NULL);
    576     return hist->items;
    577 }
    578 
    579 void
    580 hist_items_modify(Hist *hist, const char * key, void *value)
    581 {
    582     EINA_SAFETY_ON_NULL_RETURN(hist);
    583     eina_hash_modify(hist->items, key, value);
    584 }
    585 
    586 Hist *
    587 hist_load(const char *filename)
    588 {
    589     Hist *hist = NULL;
    590     Eet_File *ef = eet_open(filename, EET_FILE_MODE_READ);
    591     if (!ef)
    592       {
    593         fprintf(stderr, "ERROR: could not open '%s' for read\n", filename);
    594         return NULL;
    595       }
    596 
    597     hist = eet_data_read(ef, _hist_descriptor, HIST_ENTRY);
    598     if (!hist) goto end;
    599     hist->__eet_filename = eina_stringshare_add(filename);
    600 
    601     if (!hist->items) hist->items = eina_hash_stringshared_new(EINA_FREE_CB(hist_item_free));
    602 
    603 end:
    604     eet_close(ef);
    605     return hist;
    606 }
    607 
    608 Eina_Bool
    609 hist_save(Hist *hist, const char *filename)
    610 {
    611     Eet_File *ef;
    612     Eina_Bool ret;
    613 
    614     if (filename) eina_stringshare_replace(&(hist->__eet_filename), filename);
    615     else if (hist->__eet_filename) filename = hist->__eet_filename;
    616     else return EINA_FALSE;
    617 
    618     ef = eet_open(filename, EET_FILE_MODE_READ_WRITE);
    619     if (!ef)
    620        {
    621           fprintf(stderr, "ERROR: could not open '%s' for write\n", filename);
    622           return EINA_FALSE;
    623        }
    624 
    625     ret = !!eet_data_write(ef, _hist_descriptor, HIST_ENTRY, hist, EINA_TRUE);
    626     eet_close(ef);
    627 
    628     return ret;
    629 }
    630 
    631 static inline void
    632 _session_item_init(void)
    633 {
    634     Eet_Data_Descriptor_Class eddc;
    635 
    636     if (_session_item_descriptor) return;
    637 
    638     EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Session_Item);
    639     _session_item_descriptor = eet_data_descriptor_stream_new(&eddc);
    640 
    641     EET_DATA_DESCRIPTOR_ADD_BASIC(_session_item_descriptor, Session_Item, "url", url, EET_T_STRING);
    642     EET_DATA_DESCRIPTOR_ADD_BASIC(_session_item_descriptor, Session_Item, "focused", focused, EET_T_UCHAR);
    643     EET_DATA_DESCRIPTOR_ADD_BASIC(_session_item_descriptor, Session_Item, "scroll_x", scroll_x, EET_T_INT);
    644     EET_DATA_DESCRIPTOR_ADD_BASIC(_session_item_descriptor, Session_Item, "scroll_y", scroll_y, EET_T_INT);
    645 }
    646 
    647 static inline void
    648 _session_item_shutdown(void)
    649 {
    650     if (!_session_item_descriptor) return;
    651     eet_data_descriptor_free(_session_item_descriptor);
    652     _session_item_descriptor = NULL;
    653 }
    654 
    655 Session_Item *
    656 session_item_new(const char * url, unsigned char focused, int scroll_x, int scroll_y)
    657 {
    658     Session_Item *session_item = calloc(1, sizeof(Session_Item));
    659 
    660     if (!session_item)
    661        {
    662           fprintf(stderr, "ERROR: could not calloc Session_Item\n");
    663           return NULL;
    664        }
    665 
    666     session_item->url = eina_stringshare_add(url);
    667     session_item->focused = focused;
    668     session_item->scroll_x = scroll_x;
    669     session_item->scroll_y = scroll_y;
    670 
    671     return session_item;
    672 }
    673 
    674 void
    675 session_item_free(Session_Item *session_item)
    676 {
    677     eina_stringshare_del(session_item->url);
    678     free(session_item);
    679 }
    680 
    681 inline const char *
    682 session_item_url_get(const Session_Item *session_item)
    683 {
    684     return session_item->url;
    685 }
    686 
    687 inline void
    688 session_item_url_set(Session_Item *session_item, const char *url)
    689 {
    690     EINA_SAFETY_ON_NULL_RETURN(session_item);
    691     eina_stringshare_replace(&(session_item->url), url);
    692 }
    693 
    694 inline unsigned char
    695 session_item_focused_get(const Session_Item *session_item)
    696 {
    697     return session_item->focused;
    698 }
    699 
    700 inline void
    701 session_item_focused_set(Session_Item *session_item, unsigned char focused)
    702 {
    703     EINA_SAFETY_ON_NULL_RETURN(session_item);
    704     session_item->focused = focused;
    705 }
    706 
    707 inline int
    708 session_item_scroll_x_get(const Session_Item *session_item)
    709 {
    710     return session_item->scroll_x;
    711 }
    712 
    713 inline void
    714 session_item_scroll_x_set(Session_Item *session_item, int scroll_x)
    715 {
    716     EINA_SAFETY_ON_NULL_RETURN(session_item);
    717     session_item->scroll_x = scroll_x;
    718 }
    719 
    720 inline int
    721 session_item_scroll_y_get(const Session_Item *session_item)
    722 {
    723     return session_item->scroll_y;
    724 }
    725 
    726 inline void
    727 session_item_scroll_y_set(Session_Item *session_item, int scroll_y)
    728 {
    729     EINA_SAFETY_ON_NULL_RETURN(session_item);
    730     session_item->scroll_y = scroll_y;
    731 }
    732 
    733 
    734 static inline void
    735 _session_window_init(void)
    736 {
    737     Eet_Data_Descriptor_Class eddc;
    738 
    739     if (_session_window_descriptor) return;
    740 
    741     EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Session_Window);
    742     _session_window_descriptor = eet_data_descriptor_stream_new(&eddc);
    743 
    744     EET_DATA_DESCRIPTOR_ADD_LIST(_session_window_descriptor, Session_Window, "tabs", tabs, _session_item_descriptor);
    745     EET_DATA_DESCRIPTOR_ADD_BASIC(_session_window_descriptor, Session_Window, "focused", focused, EET_T_UCHAR);
    746 }
    747 
    748 static inline void
    749 _session_window_shutdown(void)
    750 {
    751     if (!_session_window_descriptor) return;
    752     eet_data_descriptor_free(_session_window_descriptor);
    753     _session_window_descriptor = NULL;
    754 }
    755 
    756 Session_Window *
    757 session_window_new(Eina_List * tabs, unsigned char focused)
    758 {
    759     Session_Window *session_window = calloc(1, sizeof(Session_Window));
    760 
    761     if (!session_window)
    762        {
    763           fprintf(stderr, "ERROR: could not calloc Session_Window\n");
    764           return NULL;
    765        }
    766 
    767     session_window->tabs = tabs;
    768     session_window->focused = focused;
    769 
    770     return session_window;
    771 }
    772 
    773 void
    774 session_window_free(Session_Window *session_window)
    775 {
    776     if (session_window->tabs)
    777        {
    778           Session_Item *tabs_elem;
    779           EINA_LIST_FREE(session_window->tabs, tabs_elem)
    780              session_item_free(tabs_elem);
    781        }
    782     free(session_window);
    783 }
    784 
    785 inline void
    786 session_window_tabs_add(Session_Window *session_window, Session_Item *session_item)
    787 {
    788     EINA_SAFETY_ON_NULL_RETURN(session_window);
    789     session_window->tabs = eina_list_append(session_window->tabs, session_item);
    790 }
    791 
    792 inline void
    793 session_window_tabs_del(Session_Window *session_window, Session_Item *session_item)
    794 {
    795     EINA_SAFETY_ON_NULL_RETURN(session_window);
    796     session_window->tabs = eina_list_remove(session_window->tabs, session_item);
    797 }
    798 
    799 inline Session_Item *
    800 session_window_tabs_get(const Session_Window *session_window, unsigned int nth)
    801 {
    802     EINA_SAFETY_ON_NULL_RETURN_VAL(session_window, NULL);
    803     return eina_list_nth(session_window->tabs, nth);
    804 }
    805 
    806 inline unsigned int
    807 session_window_tabs_count(const Session_Window *session_window)
    808 {
    809     EINA_SAFETY_ON_NULL_RETURN_VAL(session_window, 0);
    810     return eina_list_count(session_window->tabs);
    811 }
    812 
    813 void
    814 session_window_tabs_list_clear(Session_Window *session_window)
    815 {
    816     EINA_SAFETY_ON_NULL_RETURN(session_window);
    817     Session_Item *data;
    818     EINA_LIST_FREE(session_window->tabs, data) session_item_free(data);
    819 }
    820 
    821 inline Eina_List *
    822 session_window_tabs_list_get(const Session_Window *session_window)
    823 {
    824     EINA_SAFETY_ON_NULL_RETURN_VAL(session_window, NULL);
    825     return session_window->tabs;
    826 }
    827 
    828 inline void
    829 session_window_tabs_list_set(Session_Window *session_window, Eina_List *list)
    830 {
    831     EINA_SAFETY_ON_NULL_RETURN(session_window);
    832     session_window->tabs = list;
    833 }
    834 
    835 inline unsigned char
    836 session_window_focused_get(const Session_Window *session_window)
    837 {
    838     return session_window->focused;
    839 }
    840 
    841 inline void
    842 session_window_focused_set(Session_Window *session_window, unsigned char focused)
    843 {
    844     EINA_SAFETY_ON_NULL_RETURN(session_window);
    845     session_window->focused = focused;
    846 }
    847 
    848 
    849 static inline void
    850 _session_init(void)
    851 {
    852     Eet_Data_Descriptor_Class eddc;
    853 
    854     if (_session_descriptor) return;
    855 
    856     EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Session);
    857     _session_descriptor = eet_data_descriptor_stream_new(&eddc);
    858 
    859     EET_DATA_DESCRIPTOR_ADD_LIST(_session_descriptor, Session, "windows", windows, _session_window_descriptor);
    860 }
    861 
    862 static inline void
    863 _session_shutdown(void)
    864 {
    865     if (!_session_descriptor) return;
    866     eet_data_descriptor_free(_session_descriptor);
    867     _session_descriptor = NULL;
    868 }
    869 
    870 Session *
    871 session_new(Eina_List * windows)
    872 {
    873     Session *session = calloc(1, sizeof(Session));
    874 
    875     if (!session)
    876        {
    877           fprintf(stderr, "ERROR: could not calloc Session\n");
    878           return NULL;
    879        }
    880 
    881     session->windows = windows;
    882 
    883     return session;
    884 }
    885 
    886 void
    887 session_free(Session *session)
    888 {
    889     if (session->windows)
    890        {
    891           Session_Window *windows_elem;
    892           EINA_LIST_FREE(session->windows, windows_elem)
    893              session_window_free(windows_elem);
    894        }
    895     free(session);
    896 }
    897 
    898 inline void
    899 session_windows_add(Session *session, Session_Window *session_window)
    900 {
    901     EINA_SAFETY_ON_NULL_RETURN(session);
    902     session->windows = eina_list_append(session->windows, session_window);
    903 }
    904 
    905 inline void
    906 session_windows_del(Session *session, Session_Window *session_window)
    907 {
    908     EINA_SAFETY_ON_NULL_RETURN(session);
    909     session->windows = eina_list_remove(session->windows, session_window);
    910 }
    911 
    912 inline Session_Window *
    913 session_windows_get(const Session *session, unsigned int nth)
    914 {
    915     EINA_SAFETY_ON_NULL_RETURN_VAL(session, NULL);
    916     return eina_list_nth(session->windows, nth);
    917 }
    918 
    919 inline unsigned int
    920 session_windows_count(const Session *session)
    921 {
    922     EINA_SAFETY_ON_NULL_RETURN_VAL(session, 0);
    923     return eina_list_count(session->windows);
    924 }
    925 
    926 void
    927 session_windows_list_clear(Session *session)
    928 {
    929     EINA_SAFETY_ON_NULL_RETURN(session);
    930     Session_Window *data;
    931     EINA_LIST_FREE(session->windows, data) session_window_free(data);
    932 }
    933 
    934 inline Eina_List *
    935 session_windows_list_get(const Session *session)
    936 {
    937     EINA_SAFETY_ON_NULL_RETURN_VAL(session, NULL);
    938     return session->windows;
    939 }
    940 
    941 inline void
    942 session_windows_list_set(Session *session, Eina_List *list)
    943 {
    944     EINA_SAFETY_ON_NULL_RETURN(session);
    945     session->windows = list;
    946 }
    947 
    948 Session *
    949 session_load(const char *filename)
    950 {
    951     Session *session = NULL;
    952     Eet_File *ef = eet_open(filename, EET_FILE_MODE_READ);
    953     if (!ef)
    954       {
    955         fprintf(stderr, "ERROR: could not open '%s' for read\n", filename);
    956         return NULL;
    957       }
    958 
    959     session = eet_data_read(ef, _session_descriptor, SESSION_ENTRY);
    960     if (!session) goto end;
    961     session->__eet_filename = eina_stringshare_add(filename);
    962 
    963 end:
    964     eet_close(ef);
    965     return session;
    966 }
    967 
    968 Eina_Bool
    969 session_save(Session *session, const char *filename)
    970 {
    971     Eet_File *ef;
    972     Eina_Bool ret;
    973 
    974     if (filename) eina_stringshare_replace(&(session->__eet_filename), filename);
    975     else if (session->__eet_filename) filename = session->__eet_filename;
    976     else return EINA_FALSE;
    977 
    978     ef = eet_open(filename, EET_FILE_MODE_READ_WRITE);
    979     if (!ef)
    980        {
    981           fprintf(stderr, "ERROR: could not open '%s' for write\n", filename);
    982           return EINA_FALSE;
    983        }
    984 
    985     ret = !!eet_data_write(ef, _session_descriptor, SESSION_ENTRY, session, EINA_TRUE);
    986     eet_close(ef);
    987 
    988     return ret;
    989 }
    990 
    991 void
    992 viking_state_init(void)
    993 {
    994     _config_init();
    995     _hist_item_init();
    996     _hist_init();
    997     _session_item_init();
    998     _session_window_init();
    999     _session_init();
   1000 }
   1001 
   1002 void
   1003 viking_state_shutdown(void)
   1004 {
   1005     _config_shutdown();
   1006     _hist_item_shutdown();
   1007     _hist_shutdown();
   1008     _session_item_shutdown();
   1009     _session_window_shutdown();
   1010     _session_shutdown();
   1011 }
   1012