4 * Copyright (c) 2014 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Ja-young Gu <jygu@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
25 #include "tapi_common.h"
26 #include "TapiUtility.h"
32 #include "tapi_private.h"
34 #define OEM_DATA_LEN_MAX (10 * 1024)
35 #define OEM_DEFAULT_TIMEOUT (30 * 1000)
37 struct oem_resp_data {
38 struct tapi_handle *handle;
40 tapi_response_cb cb_fn;
44 #define MAKE_OEM_RESP_CB_DATA(data, handle, cb, user_data, oem_id) do { \
46 return TAPI_API_INVALID_INPUT; \
48 data = g_try_malloc0(sizeof(struct oem_resp_data)); \
50 return TAPI_API_SYSTEM_OUT_OF_MEM; \
51 data->handle = handle; \
53 data->user_data = user_data; \
54 data->oem_id = oem_id; \
58 static void on_response_oem_data_async(GObject *source_object,
59 GAsyncResult *res, gpointer user_data)
62 struct oem_resp_data *evt_cb_data = user_data;
64 GVariant *dbus_result;
65 TelOemData_t oem_data = {0};
68 dbus_result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source_object), res, &error);
69 TAPI_RESP_CHECK_ERROR(error, evt_cb_data);
71 g_variant_get(dbus_result, "(is)", &oem_data.oem_id, &data);
73 oem_data.data = g_base64_decode((const gchar *)data, (gsize *)&oem_data.data_len);
75 result = TAPI_API_SUCCESS;
77 dbg("id:[0x%x] len:[%d]", oem_data.oem_id, oem_data.data_len);
79 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, &oem_data);
81 g_free(oem_data.data);
83 TAPI_INVOKE_RESP_CALLBACK(evt_cb_data, result, NULL);
89 g_variant_unref(dbus_result);
92 EXPORT_API int tel_send_oem_data(TapiHandle *handle, int oem_id,
93 void *data, unsigned int data_len)
97 GVariant *inparam = NULL;
99 gchar *encoded_data = NULL;
101 TAPI_RET_ERR_NUM_IF_NOT_SUPPORTED(TELEPHONY_FEATURE);
102 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
103 TAPI_RET_ERR_NUM_IF_FAIL(handle->dbus_connection, TAPI_API_INVALID_PTR);
104 TAPI_RET_ERR_NUM_IF_FAIL(data, TAPI_API_INVALID_PTR);
106 dbg("oem_id(0x%x) data(%p) data len(%d)", oem_id, data, data_len);
108 if (data_len > OEM_DATA_LEN_MAX)
109 return TAPI_API_INVALID_INPUT;
111 encoded_data = g_base64_encode((const guchar *)data, data_len);
112 inparam = g_variant_new("(is)", oem_id, encoded_data);
114 rst = g_dbus_connection_call_sync(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
115 handle->path, DBUS_TELEPHONY_OEM_INTERFACE,
116 "SendOemData", inparam, NULL, G_DBUS_CALL_FLAGS_NONE,
117 TAPI_DEFAULT_TIMEOUT, handle->ca, &error);
118 g_free(encoded_data);
120 dbg("error to data(%s)", error->message);
122 return TAPI_API_OPERATION_FAILED;
125 g_variant_get(rst, "(i)", &result);
127 result = TAPI_API_SUCCESS;
129 dbg("error (%d)", result);
130 result = TAPI_API_OPERATION_FAILED;
132 g_variant_unref(rst);
136 EXPORT_API int tel_send_oem_data_sync(TapiHandle *handle, int oem_id,
137 void *data, unsigned int data_len, TelOemData_t *outparam)
139 GError *error = NULL;
140 GVariant *inparam = NULL;
141 gchar *encoded_data = NULL;
142 GVariant *rst = NULL;
145 TAPI_RET_ERR_NUM_IF_NOT_SUPPORTED(TELEPHONY_FEATURE);
146 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
147 TAPI_RET_ERR_NUM_IF_FAIL(handle->dbus_connection, TAPI_API_INVALID_PTR);
148 TAPI_RET_ERR_NUM_IF_FAIL(data, TAPI_API_INVALID_PTR);
150 dbg("oem_id(0x%x) data(%p) data len(%d)", oem_id, data, data_len);
152 if (data_len > OEM_DATA_LEN_MAX)
153 return TAPI_API_INVALID_INPUT;
155 encoded_data = g_base64_encode((const guchar *)data, data_len);
156 inparam = g_variant_new("(is)", oem_id, encoded_data);
158 rst = g_dbus_connection_call_sync(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
159 handle->path, DBUS_TELEPHONY_OEM_INTERFACE,
160 "SendOemDataWithResponse", inparam, NULL, G_DBUS_CALL_FLAGS_NONE,
161 TAPI_DEFAULT_TIMEOUT, handle->ca, &error);
162 g_free(encoded_data);
165 dbg("error to data(%s)", error->message);
167 return TAPI_API_OPERATION_FAILED;
170 g_variant_get(rst, "(is)", &outparam->oem_id, &pdata);
172 outparam->data = g_base64_decode((const gchar *)pdata, (gsize *)&outparam->data_len);
173 if (outparam->data_len)
174 dbg("id:[0x%x] len:[%d]", outparam->oem_id, outparam->data_len);
177 g_variant_unref(rst);
179 return TAPI_API_SUCCESS;
182 EXPORT_API int tel_send_oem_data_async(TapiHandle *handle, int oem_id,
183 void *data, unsigned int data_len, tapi_response_cb callback, void *user_data)
185 GVariant *inparam = NULL;
186 gchar *encoded_data = NULL;
187 struct oem_resp_data *evt_cb_data = NULL;
189 TAPI_RET_ERR_NUM_IF_NOT_SUPPORTED(TELEPHONY_FEATURE);
190 TAPI_RET_ERR_NUM_IF_FAIL(handle, TAPI_API_INVALID_PTR);
191 TAPI_RET_ERR_NUM_IF_FAIL(handle->dbus_connection, TAPI_API_INVALID_PTR);
192 TAPI_RET_ERR_NUM_IF_FAIL(data, TAPI_API_INVALID_PTR);
194 if (data_len > OEM_DATA_LEN_MAX)
195 return TAPI_API_INVALID_INPUT;
197 dbg("oem_id(0x%x) data(%p) data len(%d)", oem_id, data, data_len);
199 MAKE_OEM_RESP_CB_DATA(evt_cb_data, handle, callback, user_data, oem_id);
201 encoded_data = g_base64_encode((const guchar *)data, data_len);
202 inparam = g_variant_new("(is)", oem_id, encoded_data);
204 g_dbus_connection_call(handle->dbus_connection, DBUS_TELEPHONY_SERVICE,
205 handle->path, DBUS_TELEPHONY_OEM_INTERFACE,
206 "SendOemDataWithResponse", inparam, NULL, G_DBUS_CALL_FLAGS_NONE,
207 OEM_DEFAULT_TIMEOUT, handle->ca, on_response_oem_data_async, evt_cb_data);
209 g_free(encoded_data);
211 return TAPI_API_SUCCESS;