2 * Copyright (c) 2018 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.
17 #include "cloud/cloud_lap_request.h"
18 #include "cloud/http_request.h"
19 #include "cloud/lap_info_serializer.h"
20 #include "cloud/lap_info.h"
27 #define PATH_API_LAP "/api/lap"
28 #define CONFIG_LAP_API_KEY "lap"
32 cloud_request_lap_list_data_cb cb;
34 } lap_api_get_request_context_t;
38 cloud_request_lap_post_finish_cb cb;
40 } lap_api_post_request_context_t;
45 } lap_api_post_request_response_t;
51 } lap_api_get_request_response_t;
53 static void lap_api_post_task_thread_cb(GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable);
54 static void lap_api_post_task_ready_cb(GObject *source_object, GAsyncResult *res, gpointer user_data);
55 static void lap_api_post_task_context_free(lap_api_post_request_context_t *context);
56 static void lap_api_post_request_response_free(lap_api_post_request_response_t *response);
58 static void lap_api_get_task_context_free(lap_api_get_request_context_t *context);
59 static void lap_api_get_request_response_free(lap_api_get_request_response_t *response);
60 static void lap_api_get_task_thread_cb(GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable);
61 static void lap_api_get_task_ready_cb(GObject *source_object, GAsyncResult *res, gpointer user_data);
63 #define G_ERROR_DOMAIN g_quark_from_static_string("cloud_lap_request")
65 GCancellable *cloud_lap_request_api_racing_get(const char *ap_mac, cloud_request_lap_list_data_cb cb, void *user_data)
67 GCancellable *cancellable = g_cancellable_new();
69 GTask *task = g_task_new(NULL, cancellable, lap_api_get_task_ready_cb, NULL);
70 g_task_set_source_tag(task, cloud_lap_request_api_racing_get);
71 g_task_set_return_on_cancel(task, FALSE);
73 lap_api_get_request_context_t *context = g_new0(lap_api_get_request_context_t, 1);
74 context->ap_mac = strndup(ap_mac, strlen(ap_mac));
76 context->user_data = user_data;
78 g_task_set_task_data(task, context, (GDestroyNotify)lap_api_get_task_context_free);
79 g_task_run_in_thread(task, lap_api_get_task_thread_cb);
86 GCancellable *cloud_lap_request_api_racing_post(const lap_info_t *lap_info, cloud_request_lap_post_finish_cb cb, void *user_data)
88 GCancellable *cancellable = g_cancellable_new();
90 GTask *task = g_task_new(NULL, cancellable, lap_api_post_task_ready_cb, NULL);
91 g_task_set_source_tag(task, cloud_lap_request_api_racing_post);
92 g_task_set_return_on_cancel(task, FALSE);
94 lap_api_post_request_context_t *context = g_new0(lap_api_post_request_context_t, 1);
95 context->lap = lap_info_copy(lap_info);
97 context->user_data = user_data;
99 g_task_set_task_data(task, context, (GDestroyNotify)lap_api_post_task_context_free);
100 g_task_run_in_thread(task, lap_api_post_task_thread_cb);
102 g_object_unref(task);
107 static void lap_api_post_task_context_free(lap_api_post_request_context_t *context)
111 lap_info_destroy(context->lap);
115 static void lap_api_post_request_response_free(lap_api_post_request_response_t *response)
119 g_free(response->response_msg);
123 static void lap_api_post_task_thread_cb(GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable)
125 lap_api_post_request_context_t *context = (lap_api_post_request_context_t *)task_data;
127 if (g_task_return_error_if_cancelled(task)) {
131 lap_api_post_request_response_t *response = g_new0(lap_api_post_request_response_t, 1);
133 char *json = lap_info_serializer_serialize(context->lap);
135 char *url = http_request_get_url(PATH_API_LAP, CONFIG_LAP_API_KEY);
137 int retval = http_request_post(url, json, &(response->response_msg), &(response->response_code));
139 _D("URL FROM CONFIG (LAP POST): %s", url);
144 GError *err = g_error_new(G_ERROR_DOMAIN, retval, "http_request_post failed!");
145 g_task_return_error(task, err);
148 g_task_return_pointer(task, response, (GDestroyNotify)lap_api_post_request_response_free);
151 static void lap_api_post_task_ready_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
153 GTask *task = G_TASK(res);
154 GError *error = NULL;
156 //If no error occurred g_task_propagate_pointer transfers ownership, so later response have to be freed.
157 lap_api_post_request_response_t *response = g_task_propagate_pointer(task, &error);
159 _E("POST async task failed with msg: %s", error->message);
163 lap_api_post_request_context_t *context = g_task_get_task_data(task);
165 bool result = (response->response_code == 200 && (strncmp(response->response_msg, "Success", strlen("Success")) == 0)) ?
170 context->cb(result, context->user_data);
173 lap_api_post_request_response_free(response);
176 static void lap_api_get_task_context_free(lap_api_get_request_context_t *context)
180 g_free(context->ap_mac);
184 static void lap_api_get_request_response_free(lap_api_get_request_response_t *response)
187 ret_if(response->size <= 0);
189 for (int i = 0; i < response->size; i++)
191 lap_info_destroy(response->laps[i]);
193 g_free(response->laps);
197 static void lap_api_get_task_thread_cb(GTask *task, gpointer source_object, gpointer task_data, GCancellable *cancellable)
199 lap_api_get_request_context_t *context = (lap_api_get_request_context_t *)task_data;
201 if (g_task_return_error_if_cancelled(task)) {
205 lap_api_get_request_response_t *response = g_new0(lap_api_get_request_response_t, 1);
206 char *response_json = NULL;
207 char *url_with_api = http_request_get_url(PATH_API_LAP, CONFIG_LAP_API_KEY);
209 GString *url = g_string_new(url_with_api);
210 g_string_append(url, "?apMac=");
211 g_string_append(url, context->ap_mac);
214 _D("URL FROM CONFIG (LAP GET): %s", url);
216 int retval = http_request_get(url->str, &response_json, &(response->response_code));
217 g_string_free(url, TRUE);
220 GError *err = g_error_new(G_ERROR_DOMAIN, retval, "http_request_get failed!");
221 g_task_return_error(task, err);
224 response->laps = lap_info_serializer_deserialize_array(response_json, &(response->size));
227 g_free(response_json);
228 g_task_return_pointer(task, response, (GDestroyNotify)lap_api_get_request_response_free);
231 static void lap_api_get_task_ready_cb(GObject *source_object, GAsyncResult *res, gpointer user_data)
233 GTask *task = G_TASK(res);
234 GError *error = NULL;
236 //If no error occurred g_task_propagate_pointer transfers ownership, so later response have to be freed.
237 lap_api_get_request_response_t *response = g_task_propagate_pointer(task, &error);
239 _E("GET async task failed with msg: %s", error->message);
243 lap_api_get_request_context_t *context = g_task_get_task_data(task);
245 bool result = (response->response_code == 200) ? true : false;
248 context->cb(result, response->laps, response->size, context->user_data);
251 lap_api_get_request_response_free(response);