diff --git a/Makefile b/Makefile index 3956b24..4bc77d9 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CC=cc -CFLAGS=--std=c99 -g `pkg-config --cflags efl ecore elementary libusb-1.0` `sdl2-config --cflags` `curl-config --cflags` -LDFLAGS=`pkg-config --libs efl ecore elementary libusb-1.0` `sdl2-config --libs` `curl-config --libs` -lcjson +CFLAGS=--std=c99 -g `pkg-config --cflags efl ecore elementary libusb-1.0` `sdl2-config --cflags` +LDFLAGS=`pkg-config --libs efl ecore elementary libusb-1.0` `sdl2-config --libs` -lcjson OBJS=main.o replay.o home.o input.o minilauncher4slippi: $(OBJS) diff --git a/home.c b/home.c index bc6c64e..739d08a 100644 --- a/home.c +++ b/home.c @@ -1,5 +1,4 @@ #include -#include #include #include #include "replay.h" @@ -14,36 +13,36 @@ struct memory_chunk { size_t size; }; -size_t -write_callback(char* ptr, size_t size, size_t nmemb, void* userp) +static Eina_Bool +releases_data(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info) { - size_t realsize = size * nmemb; - struct memory_chunk* mem = userp; + Ecore_Con_Event_Url_Data* ev = event_info; + struct memory_chunk* dd = ecore_con_url_data_get(ev->url_con); - char *nptr = realloc(mem->data, mem->size + realsize + 1); - if(!nptr) { - /* out of memory! */ - printf("not enough memory (realloc returned NULL)\n"); - return 0; - } + dd->data = realloc(dd->data, dd->size + ev->size + 1); - mem->data = nptr; - memcpy(&(mem->data[mem->size]), ptr, realsize); - mem->size += realsize; - mem->data[mem->size] = 0; - return realsize; + memcpy(dd->data + dd->size, ev->data, ev->size); + dd->size += ev->size; + dd->data[dd->size] = 0; + return EINA_TRUE; } - -int -releases_result(struct memory_chunk chunk) + +static Eina_Bool +releases_result(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info) { - cJSON* json = cJSON_ParseWithLength(chunk.data, chunk.size); + Evas_Object* parent = data; + Ecore_Con_Event_Url_Complete* ev = event_info; + struct memory_chunk* dd = ecore_con_url_data_get(ev->url_con); + cJSON* json = cJSON_ParseWithLength(dd->data, dd->size); if (!json) { fprintf(stderr, "Something happened.\n"); - return 1; + return EINA_FALSE; } + // Clear out + elm_obj_box_clear(parent); + cJSON* release = NULL; //cJSON_ArrayForEach(release, json) int i = 0; @@ -51,12 +50,12 @@ releases_result(struct memory_chunk chunk) { if (i == 6) { - Evas_Object* notice = elm_label_add(tab_home_content); + Evas_Object* notice = elm_label_add(parent); elm_object_text_set(notice, "Older releases are collapsed, click to expand"); - elm_box_pack_end(tab_home_content, notice); + elm_box_pack_end(parent, notice); evas_object_show(notice); } - Evas_Object* release_fr = elm_frame_add(tab_home_content); + Evas_Object* release_fr = elm_frame_add(parent); // Size evas_object_size_hint_weight_set(release_fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(release_fr, EVAS_HINT_FILL, EVAS_HINT_FILL); @@ -64,7 +63,7 @@ releases_result(struct memory_chunk chunk) elm_frame_autocollapse_set(release_fr, EINA_TRUE); if (i > 5) elm_frame_collapse_set(release_fr, EINA_TRUE); - elm_box_pack_end(tab_home_content, release_fr); + elm_box_pack_end(parent, release_fr); cJSON* title = cJSON_GetObjectItemCaseSensitive(c, "name"); if (!title) // (((Rate limit))) and/or whatever bullshit crops up. return 1; @@ -83,6 +82,8 @@ releases_result(struct memory_chunk chunk) /* Get body_html and manipulate it */ cJSON* body = cJSON_GetObjectItemCaseSensitive(c, "body_html"); + if (!body) + return 1; Eina_Strbuf* body_fmt = eina_strbuf_manage_new(body->valuestring); eina_strbuf_replace_all(body_fmt, "\n", "
"); eina_strbuf_replace_all(body_fmt, "

", ""); @@ -102,61 +103,26 @@ releases_result(struct memory_chunk chunk) //elm_box_pack_end(tab_home_box, fr_box); } - return 0; + return EINA_TRUE; } void -_tab_home_make_da_damn_request() +_tab_home_make_da_damn_request(Evas_Object* parent) { - - char curl_errbuf[CURL_ERROR_SIZE]; - int res; - struct memory_chunk data; - - data.data = malloc(1); - data.size = 0; - - CURL* curl = curl_easy_init(); - curl_easy_setopt(curl, CURLOPT_URL, home_url); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, curl_errbuf); - //curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); - //curl_easy_setopt(curl, CURLOPT_VERBOSE, 0); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); - curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5); - curl_easy_setopt(curl, CURLOPT_USERAGENT, "Minilauncher4slippi/1.0"); - //application/vnd.github.html+json - struct curl_slist *hs=NULL; - hs = curl_slist_append(hs, "Accept: application/vnd.github.html"); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, hs); - - res = curl_easy_perform(curl); - - if(res != CURLE_OK) { - fprintf(stderr, "curl_easy_perform() failed: %s\n", - curl_easy_strerror(res)); - } - else { - printf("%lu bytes retrieved\n", (unsigned long)data.size); - /* cleanup curl stuff */ - - releases_result(data); - free(data.data); - } - - curl_easy_cleanup(curl); - - - /* we are done with libcurl, so clean it up */ - curl_global_cleanup(); - + ecore_con_init(); + ecore_con_url_init(); + Ecore_Con_Url* ec_url = ecore_con_url_custom_new(home_url, "GET"); + ecore_con_url_data_set(ec_url, calloc(1, sizeof(struct memory_chunk))); + ecore_event_handler_add(ECORE_CON_EVENT_URL_DATA, releases_data, NULL); + ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, releases_result, parent); + ecore_con_url_additional_header_add(ec_url, "User-Agent", "blablabla"); + ecore_con_url_additional_header_add(ec_url, "Accept", "application/vnd.github.html"); + ecore_con_url_get(ec_url); } Evas_Object* tab_home_setup(Evas_Object* parent) { - curl_global_init(CURL_GLOBAL_ALL); - tab_home = elm_box_add(parent); // Scroller evas_object_size_hint_weight_set(tab_home, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tab_home, EVAS_HINT_FILL, EVAS_HINT_FILL); @@ -179,6 +145,15 @@ tab_home_setup(Evas_Object* parent) evas_object_show(tab_home_scr); evas_object_show(tab_home); - _tab_home_make_da_damn_request(); + _tab_home_make_da_damn_request(tab_home_content); + + // Add progress bar for noa + Evas_Object* speen = elm_progressbar_add(tab_home_content); + elm_object_style_set(speen, "wheel"); + elm_progressbar_pulse_set(speen, EINA_TRUE); + elm_progressbar_pulse(speen, EINA_TRUE); + elm_box_pack_end(tab_home_content, speen); + evas_object_show(speen); + return tab_home; }