4 * Copyright (c) 2012 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.
30 #include "user_request.h"
33 #define _check_null( name, value, err ) { \
35 dbg("[error] %s : NULL", name ); \
42 enum tcore_ss_ussd_type type;
47 struct private_object_data {
48 struct ussd_session ussd_s;
49 struct tcore_ss_operations *ops;
52 static TReturn _dispatcher(CoreObject *o, UserRequest *ur)
54 enum tcore_request_command command;
57 struct private_object_data *po = NULL;
58 po = tcore_object_ref_object(o);
60 _check_null( "po", po, TCORE_RETURN_FAILURE);
61 _check_null( "po->ops", po->ops, TCORE_RETURN_FAILURE);
62 _check_null( "ur", ur, TCORE_RETURN_FAILURE);
64 command = tcore_user_request_get_command(ur);
66 case TREQ_SS_BARRING_ACTIVATE:
67 if (!po->ops->barring_activate)
68 return TCORE_RETURN_ENOSYS;
70 ret = po->ops->barring_activate(o, ur);
73 case TREQ_SS_BARRING_DEACTIVATE:
74 if (!po->ops->barring_deactivate)
75 return TCORE_RETURN_ENOSYS;
77 ret = po->ops->barring_deactivate(o, ur);
80 case TREQ_SS_BARRING_CHANGE_PASSWORD:
81 if (!po->ops->barring_change_password)
82 return TCORE_RETURN_ENOSYS;
84 ret = po->ops->barring_change_password(o, ur);
87 case TREQ_SS_BARRING_GET_STATUS:
88 if (!po->ops->barring_get_status)
89 return TCORE_RETURN_ENOSYS;
91 ret = po->ops->barring_get_status(o, ur);
94 case TREQ_SS_FORWARDING_ACTIVATE:
95 if (!po->ops->forwarding_activate)
96 return TCORE_RETURN_ENOSYS;
98 ret = po->ops->forwarding_activate(o, ur);
101 case TREQ_SS_FORWARDING_DEACTIVATE:
102 if (!po->ops->forwarding_deactivate)
103 return TCORE_RETURN_ENOSYS;
105 ret = po->ops->forwarding_deactivate(o, ur);
108 case TREQ_SS_FORWARDING_REGISTER:
109 if (!po->ops->forwarding_register)
110 return TCORE_RETURN_ENOSYS;
112 ret = po->ops->forwarding_register(o, ur);
115 case TREQ_SS_FORWARDING_DEREGISTER:
116 if (!po->ops->forwarding_deregister)
117 return TCORE_RETURN_ENOSYS;
119 ret = po->ops->forwarding_deregister(o, ur);
122 case TREQ_SS_FORWARDING_GET_STATUS:
123 if (!po->ops->forwarding_get_status)
124 return TCORE_RETURN_ENOSYS;
126 ret = po->ops->forwarding_get_status(o, ur);
129 case TREQ_SS_WAITING_ACTIVATE:
130 if (!po->ops->waiting_activate)
131 return TCORE_RETURN_ENOSYS;
133 ret = po->ops->waiting_activate(o, ur);
136 case TREQ_SS_WAITING_DEACTIVATE:
137 if (!po->ops->waiting_deactivate)
138 return TCORE_RETURN_ENOSYS;
140 ret = po->ops->waiting_deactivate(o, ur);
143 case TREQ_SS_WAITING_GET_STATUS:
144 if (!po->ops->waiting_get_status)
145 return TCORE_RETURN_ENOSYS;
147 ret = po->ops->waiting_get_status(o, ur);
150 case TREQ_SS_CLI_ACTIVATE:
151 if (!po->ops->cli_activate)
152 return TCORE_RETURN_ENOSYS;
154 ret = po->ops->cli_activate(o, ur);
157 case TREQ_SS_CLI_DEACTIVATE:
158 if (!po->ops->cli_deactivate)
159 return TCORE_RETURN_ENOSYS;
161 ret = po->ops->cli_deactivate(o, ur);
164 case TREQ_SS_CLI_SET_STATUS:
165 if (!po->ops->cli_set_status)
166 return TCORE_RETURN_ENOSYS;
168 ret = po->ops->cli_set_status(o, ur);
171 case TREQ_SS_CLI_GET_STATUS:
172 if (!po->ops->cli_get_status)
173 return TCORE_RETURN_ENOSYS;
175 ret = po->ops->cli_get_status(o, ur);
178 case TREQ_SS_SEND_USSD:
179 if (!po->ops->send_ussd)
180 return TCORE_RETURN_ENOSYS;
182 ret = po->ops->send_ussd(o, ur);
185 case TREQ_SS_SET_AOC:
186 if (!po->ops->set_aoc)
187 return TCORE_RETURN_ENOSYS;
189 ret = po->ops->set_aoc(o, ur);
192 case TREQ_SS_GET_AOC:
193 if (!po->ops->get_aoc)
194 return TCORE_RETURN_ENOSYS;
196 ret = po->ops->get_aoc(o, ur);
206 static void _clone_hook(CoreObject *src, CoreObject *dest)
208 struct private_object_data *src_po = NULL;
209 struct private_object_data *dest_po = NULL;
214 dest_po = calloc(1, sizeof(struct private_object_data));
216 tcore_object_link_object(dest, NULL);
220 src_po = tcore_object_ref_object(src);
221 dest_po->ops = src_po->ops;
223 tcore_object_link_object(dest, dest_po);
226 static void _free_hook(CoreObject *o)
228 struct private_object_data *po = NULL;
230 po = tcore_object_ref_object(o);
235 tcore_object_link_object(o, NULL);
238 static void _ussd_session_init(struct ussd_session *ussd_s)
240 ussd_s->session = FALSE;
243 ussd_s->data_len = 0;
246 struct ussd_session* tcore_ss_ussd_create_session(CoreObject *o,
247 enum tcore_ss_ussd_type type, void *data, int data_len)
249 struct private_object_data *po = NULL;
251 po = tcore_object_ref_object(o);
255 if (type < TCORE_SS_USSD_TYPE_USER_INITIATED
256 || type > TCORE_SS_USSD_TYPE_NETWORK_INITIATED) {
257 dbg("[ error ] wrong ussd type : (0x%x)", type);
261 if (!po->ussd_s.session) {
262 po->ussd_s.session = TRUE;
263 po->ussd_s.type = type;
264 po->ussd_s.data = data;
267 po->ussd_s.data_len = 0;
269 po->ussd_s.data_len = data_len;
275 dbg("[ error ] already exist ussd session, type : (0x%x)", po->ussd_s.type);
280 void tcore_ss_ussd_destroy_session(struct ussd_session *ussd_s)
282 if (!ussd_s || !ussd_s->session) {
287 _ussd_session_init(ussd_s);
291 struct ussd_session* tcore_ss_ussd_get_session(CoreObject *o)
293 struct private_object_data *po = NULL;
295 po = tcore_object_ref_object(o);
299 if (!po->ussd_s.session)
305 enum tcore_ss_ussd_type tcore_ss_ussd_get_session_type(struct ussd_session *ussd_s)
307 if (!ussd_s || !ussd_s->session) {
308 dbg("[ error ] there is no session");
317 void tcore_ss_ussd_set_session_type(struct ussd_session *ussd_s,
318 enum tcore_ss_ussd_type type)
320 if (!ussd_s || !ussd_s->session) {
321 dbg("[ error ] there is no session");
330 int tcore_ss_ussd_get_session_data(struct ussd_session* ussd_s, void **data)
332 if (!ussd_s || !ussd_s->session) {
333 dbg("[ error ] there is no session");
339 *data = ussd_s->data;
340 return ussd_s->data_len;
344 void tcore_ss_ussd_set_session_data(struct ussd_session* ussd_s, void *data, int data_len)
346 if (!ussd_s || !ussd_s->session) {
347 dbg("[ error ] there is no session");
354 ussd_s->data_len = data_len;
359 CoreObject *tcore_ss_new(TcorePlugin *p, const char *name,
360 struct tcore_ss_operations *ops, TcoreHal *hal)
362 CoreObject *o = NULL;
363 struct private_object_data *po = NULL;
368 o = tcore_object_new(p, name, hal);
372 po = calloc(1, sizeof(struct private_object_data));
374 tcore_object_free(o);
380 _ussd_session_init(&po->ussd_s);
382 tcore_object_set_type(o, CORE_OBJECT_TYPE_SS);
383 tcore_object_link_object(o, po);
384 tcore_object_set_free_hook(o, _free_hook);
385 tcore_object_set_clone_hook(o, _clone_hook);
386 tcore_object_set_dispatcher(o, _dispatcher);
391 void tcore_ss_free(CoreObject *o)
393 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SS);
395 tcore_object_free(o);
398 void tcore_ss_set_ops(CoreObject *o, struct tcore_ss_operations *ops)
400 struct private_object_data *po = NULL;
402 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SS);
404 po = (struct private_object_data *)tcore_object_ref_object(o);