diff options
| author | ꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id> | 2021-06-13 15:41:54 +0800 | 
|---|---|---|
| committer | ꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id> | 2021-06-13 15:41:54 +0800 | 
| commit | 143f5b64f187497af728a6d921c599dcc99ed807 (patch) | |
| tree | ba7264b8748c53c57697f9a1c9bf34db279ed468 /main.c | |
| parent | 4cd6fdb93eca409a76b0af860d9a0599b2f95f53 (diff) | |
Fix the way libcurl has been used
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 58 | 
1 files changed, 49 insertions, 9 deletions
@@ -1,6 +1,8 @@  #include <stdio.h>  #include <stdlib.h>  #include <string.h> +#include <stdbool.h> +#include <json.h>  #include "icclient.h"  #include "icclient/member.h" @@ -22,17 +24,55 @@ static void print_catalog(struct icclient_catalog *catalog)  				product->prod_group  		      );  	} -	icclient_catalog_free(catalog); +	icclient_free_catalog(catalog);  } -static size_t print_user(void *contents, size_t size, size_t nmemb, void *userData) +static void handle_results(icclient_fetch_t *fetch)  { -	size_t realsize = size * nmemb; -	char data[realsize + 1]; -	memcpy(data, contents, realsize); -	data[realsize] = '\0'; -	printf("%s\n", data); -	return realsize; +	json_tokener *tokener = json_tokener_new(); +	json_object *products = json_tokener_parse_ex(tokener, fetch->data, fetch->numBytes); +	json_tokener_free(tokener); +	size_t length = json_object_array_length(products); +	struct icclient_catalog *catalog = malloc(sizeof(struct icclient_catalog) + sizeof(struct icclient_product *[length])); +	catalog->length = length; +	for (size_t i = 0; i < length; i++) { +		catalog->products[i] = malloc(sizeof(struct icclient_product)); +		struct icclient_product *product = catalog->products[i]; +		memset(product, '\0', sizeof(struct icclient_product)); +		json_object *object = json_object_array_get_idx(products, i); +		struct json_object_iterator iterator = json_object_iter_begin(object); +		struct json_object_iterator iterator_end = json_object_iter_end(object); +		while (!json_object_iter_equal(&iterator, &iterator_end)) { +			const char *key = json_object_iter_peek_name(&iterator); +			json_object *val = json_object_iter_peek_value(&iterator); +			if (!strcmp(key, "price")) +				product->price = json_object_get_double(val); +			else { +				int len = json_object_get_string_len(val); +				if (len) { +					char *value = malloc(len + 1); +					strcpy(value, json_object_get_string(val)); +					if (!strcmp(key, "sku")) +						product->sku = value; +					else if (!strcmp(key, "thumb")) +						product->thumb = value; +					else if (!strcmp(key, "image")) +						product->image = value; +					else if (!strcmp(key, "description")) +						product->description = value; +					else if (!strcmp(key, "prod_group")) +						product->prod_group = value; +				} +			} +			json_object_iter_next(&iterator); +		} +	} +	((void (*)(struct icclient_catalog *))fetch->userData)(catalog); +} + +static void print_user(icclient_fetch_t *fetch) +{ +	printf("%s\n", fetch->data);  }  int main(int argc, char *argv[]) @@ -48,7 +88,7 @@ int main(int argc, char *argv[])  	icclient_init(url, NULL);  	free(url); -	icclient_allproducts(print_catalog, NULL); +	icclient_allproducts(print_catalog, handle_results);  	char *name_line = NULL;  	printf("\nName: ");  |