summaryrefslogtreecommitdiff
path: root/handler.h
diff options
context:
space:
mode:
authorꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2021-07-18 19:31:14 +0800
committerꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2021-07-18 19:31:14 +0800
commit1161463fce40f2e5b59ef6dd7406aa0a55f8d936 (patch)
treee22f3a5b71cec0e5229a55cf1b47908c55600d5b /handler.h
parent98b431f3b0b1f45b9f05edc43fff19c586658445 (diff)
parent39190eb032cc6a8c2fe9d07ca85f712a229c0b69 (diff)
Merge branch 'master' into sicepat
Diffstat (limited to 'handler.h')
-rw-r--r--handler.h83
1 files changed, 51 insertions, 32 deletions
diff --git a/handler.h b/handler.h
index 9c46975..a2c031b 100644
--- a/handler.h
+++ b/handler.h
@@ -8,8 +8,10 @@
extern json_tokener *tokener;
void recurse(struct json_object *, const char *[], struct json_object **);
-inline void handle_services(const char *contents, size_t num_bytes, const char *status_trail[],
- const char *trail[], const char *attributes[], struct pikul_services **services)
+enum type { SERVICES, ORDER };
+
+inline void handle(enum type type, const char *contents, size_t num_bytes, const char *status_trail[],
+ const char *trail[], const char *attributes[], void *data)
{
#ifdef DEBUG
((char *)contents)[num_bytes] = '\0';
@@ -30,37 +32,54 @@ inline void handle_services(const char *contents, size_t num_bytes, const char *
recurse(response, status_trail, &status);
if (json_object_get_int(status) != 200)
return;
- struct json_object *array = NULL;
- recurse(response, trail, &array);
- size_t length = json_object_array_length(array);
- *services = malloc(sizeof(struct pikul_services) + sizeof(struct pikul_service *[length]));
- (*services)->length = length;
- enum { CODE, NAME, ETD, COST };
- for (size_t i = 0; i < length; i++) {
- (*services)->list[i] = malloc(sizeof(struct pikul_service));
- struct pikul_service *service = (*services)->list[i];
- json_object *object = json_object_array_get_idx(array, 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 *name = json_object_iter_peek_name(&iterator);
- json_object *value = json_object_iter_peek_value(&iterator);
- if (!strcmp(name, attributes[COST]))
- service->cost = json_object_get_double(value);
- else {
- int len = json_object_get_string_len(value);
- if (len) {
- char *string = malloc(len + 1);
- strcpy(string, json_object_get_string(value));
- if (!strcmp(name, attributes[CODE]))
- service->code = string;
- else if (!strcmp(name, attributes[NAME]))
- service->name = string;
- else if (!strcmp(name, attributes[ETD]))
- service->etd = string;
+ switch (type) {
+ case SERVICES:
+ ;
+ struct json_object *array = NULL;
+ recurse(response, trail, &array);
+ size_t length = json_object_array_length(array);
+ struct pikul_services **services = (struct pikul_services **)data;
+ *services = malloc(sizeof(struct pikul_services)
+ + sizeof(struct pikul_service *[length]));
+ (*services)->length = length;
+ enum { CODE, NAME, ETD, COST };
+ for (size_t i = 0; i < length; i++) {
+ (*services)->list[i] = malloc(sizeof(struct pikul_service));
+ struct pikul_service *service = (*services)->list[i];
+ json_object *object = json_object_array_get_idx(array, 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 *name = json_object_iter_peek_name(&iterator);
+ json_object *value = json_object_iter_peek_value(&iterator);
+ if (!strcmp(name, attributes[COST]))
+ service->cost = json_object_get_double(value);
+ else {
+ int len = json_object_get_string_len(value);
+ if (len) {
+ char *string = malloc(len + 1);
+ strcpy(string, json_object_get_string(value));
+ if (!strcmp(name, attributes[CODE]))
+ service->code = string;
+ else if (!strcmp(name, attributes[NAME]))
+ service->name = string;
+ else if (!strcmp(name, attributes[ETD]))
+ service->etd = string;
+ }
+ }
+ json_object_iter_next(&iterator);
}
}
- json_object_iter_next(&iterator);
- }
+ break;
+ case ORDER:
+ ;
+ struct json_object *string = NULL;
+ recurse(response, trail, &string);
+ char **tracking_number = (char **)data;
+ *tracking_number = malloc(json_object_get_string_len(string) + 1);
+ strcpy(*tracking_number, json_object_get_string(string));
+ break;
+ default:
+ break;
}
}