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 ret = po->ops->barring_activate(o, ur);
70 case TREQ_SS_BARRING_DEACTIVATE:
71 ret = po->ops->barring_deactivate(o, ur);
74 case TREQ_SS_BARRING_CHANGE_PASSWORD:
75 ret = po->ops->barring_change_password(o, ur);
78 case TREQ_SS_BARRING_GET_STATUS:
79 ret = po->ops->barring_get_status(o, ur);
82 case TREQ_SS_FORWARDING_ACTIVATE:
83 ret = po->ops->forwarding_activate(o, ur);
86 case TREQ_SS_FORWARDING_DEACTIVATE:
87 ret = po->ops->forwarding_deactivate(o, ur);
90 case TREQ_SS_FORWARDING_REGISTER:
91 ret = po->ops->forwarding_register(o, ur);
94 case TREQ_SS_FORWARDING_DEREGISTER:
95 ret = po->ops->forwarding_deregister(o, ur);
98 case TREQ_SS_FORWARDING_GET_STATUS:
99 ret = po->ops->forwarding_get_status(o, ur);
102 case TREQ_SS_WAITING_ACTIVATE:
103 ret = po->ops->waiting_activate(o, ur);
106 case TREQ_SS_WAITING_DEACTIVATE:
107 ret = po->ops->waiting_deactivate(o, ur);
110 case TREQ_SS_WAITING_GET_STATUS:
111 ret = po->ops->waiting_get_status(o, ur);
114 case TREQ_SS_CLI_ACTIVATE:
115 ret = po->ops->cli_activate(o, ur);
118 case TREQ_SS_CLI_DEACTIVATE:
119 ret = po->ops->cli_deactivate(o, ur);
122 case TREQ_SS_CLI_GET_STATUS:
123 ret = po->ops->cli_get_status(o, ur);
126 case TREQ_SS_SEND_USSD:
127 ret = po->ops->send_ussd(o, ur);
130 case TREQ_SS_SET_AOC:
131 ret = po->ops->set_aoc(o, ur);
134 case TREQ_SS_GET_AOC:
135 ret = po->ops->get_aoc(o, ur);
145 static void _clone_hook(CoreObject *src, CoreObject *dest)
147 struct private_object_data *src_po = NULL;
148 struct private_object_data *dest_po = NULL;
153 dest_po = calloc(sizeof(struct private_object_data), 1);
155 tcore_object_link_object(dest, NULL);
159 src_po = tcore_object_ref_object(src);
160 dest_po->ops = src_po->ops;
162 tcore_object_link_object(dest, dest_po);
165 static void _free_hook(CoreObject *o)
167 struct private_object_data *po = NULL;
169 po = tcore_object_ref_object(o);
174 tcore_object_link_object(o, NULL);
177 static void _ussd_session_init(struct ussd_session *ussd_s)
179 ussd_s->session = FALSE;
182 ussd_s->data_len = 0;
185 struct ussd_session* tcore_ss_ussd_create_session(CoreObject *o,
186 enum tcore_ss_ussd_type type, void *data, int data_len)
188 struct private_object_data *po = NULL;
190 po = tcore_object_ref_object(o);
194 if (type < TCORE_SS_USSD_TYPE_USER_INITIATED
195 || type > TCORE_SS_USSD_TYPE_NETWORK_INITIATED) {
196 dbg("[ error ] wrong ussd type : (0x%x)", type);
200 if (!po->ussd_s.session) {
201 po->ussd_s.session = TRUE;
202 po->ussd_s.type = type;
203 po->ussd_s.data = data;
206 po->ussd_s.data_len = 0;
208 po->ussd_s.data_len = data_len;
214 dbg("[ error ] already exist ussd session, type : (0x%x)", po->ussd_s.type);
219 void tcore_ss_ussd_destroy_session(struct ussd_session *ussd_s)
221 if (!ussd_s || !ussd_s->session) {
226 _ussd_session_init(ussd_s);
230 struct ussd_session* tcore_ss_ussd_get_session(CoreObject *o)
232 struct private_object_data *po = NULL;
234 po = tcore_object_ref_object(o);
238 if (!po->ussd_s.session)
244 enum tcore_ss_ussd_type tcore_ss_ussd_get_session_type(struct ussd_session *ussd_s)
246 if (!ussd_s || !ussd_s->session) {
247 dbg("[ error ] there is no session");
256 void tcore_ss_ussd_set_session_type(struct ussd_session *ussd_s,
257 enum tcore_ss_ussd_type type)
259 if (!ussd_s || !ussd_s->session) {
260 dbg("[ error ] there is no session");
269 int tcore_ss_ussd_get_session_data(struct ussd_session* ussd_s, void **data)
271 if (!ussd_s || !ussd_s->session) {
272 dbg("[ error ] there is no session");
278 *data = ussd_s->data;
279 return ussd_s->data_len;
283 CoreObject *tcore_ss_new(TcorePlugin *p, const char *name,
284 struct tcore_ss_operations *ops, TcoreHal *hal)
286 CoreObject *o = NULL;
287 struct private_object_data *po = NULL;
292 o = tcore_object_new(p, name, hal);
296 po = calloc(sizeof(struct private_object_data), 1);
298 tcore_object_free(o);
304 _ussd_session_init(&po->ussd_s);
306 tcore_object_set_type(o, CORE_OBJECT_TYPE_SS);
307 tcore_object_link_object(o, po);
308 tcore_object_set_free_hook(o, _free_hook);
309 tcore_object_set_clone_hook(o, _clone_hook);
310 tcore_object_set_dispatcher(o, _dispatcher);
315 void tcore_ss_free(CoreObject *o)
317 CORE_OBJECT_CHECK(o, CORE_OBJECT_TYPE_SS);
319 tcore_object_free(o);