tizen 2.3.1 release
[framework/api/messages.git] / src / messages_push.c
1 /*\r
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the License);\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  * http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an AS IS BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License. \r
15  */\r
16 \r
17 #include <sys/stat.h>\r
18 #include <unistd.h>\r
19 \r
20 #include <stdio.h>\r
21 #include <stdlib.h>\r
22 #include <memory.h>\r
23 \r
24 #include <glib.h>\r
25 \r
26 #include <dlog.h>\r
27 #include <msg.h>\r
28 #include <msg_transport.h>\r
29 #include <msg_storage.h>\r
30 \r
31 #include <app.h>\r
32 \r
33 #include <messages.h>\r
34 #include <messages_types.h>\r
35 #include <messages_private.h>\r
36 \r
37 #ifdef LOG_TAG\r
38 #undef LOG_TAG\r
39 #endif\r
40 #define LOG_TAG "CAPI_MESSAGING"\r
41 \r
42 \r
43 void _messages_push_incoming_mediator_cb(msg_handle_t handle, const char *push_header, const char *push_body, int push_body_len, void *user_param)\r
44 {\r
45         messages_push_incoming_callback_s *_cb = (messages_push_incoming_callback_s *)user_param;\r
46         \r
47         if (_cb && _cb->callback)\r
48         {\r
49                 ((messages_push_incoming_cb)_cb->callback)(push_header, push_body, push_body_len, _cb->user_data);\r
50         }\r
51 }\r
52 \r
53 \r
54 \r
55 int messages_push_add_incoming_cb(messages_service_h service, const char *app_id, \r
56                                           messages_push_incoming_cb callback, void *user_data)\r
57 {\r
58         CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE);\r
59 \r
60         int ret;\r
61         messages_push_incoming_callback_s *_cb;\r
62         \r
63         messages_service_s *_svc = (messages_service_s *)service;\r
64         \r
65         CHECK_NULL(_svc);\r
66         CHECK_NULL(_svc->service_h);\r
67         CHECK_NULL(app_id);\r
68         CHECK_NULL(callback);\r
69         \r
70         _cb = (messages_push_incoming_callback_s *)malloc(sizeof(messages_push_incoming_callback_s));\r
71         if (NULL == _cb)\r
72         {\r
73                 LOGE("[%s] OUT_OF_MEMORY(0x%08x) fail to create a '_cb'."\r
74                         , __FUNCTION__, MESSAGES_ERROR_OUT_OF_MEMORY);\r
75                 return MESSAGES_ERROR_OUT_OF_MEMORY;    \r
76         }\r
77 \r
78         _cb->app_id = strdup(app_id);\r
79         _cb->callback = callback;\r
80         _cb->user_data = user_data;\r
81         \r
82         ret = msg_reg_push_message_callback(_svc->service_h, _messages_push_incoming_mediator_cb, app_id, (void*)_cb);\r
83         if (MSG_SUCCESS != ret)\r
84         {\r
85                 if (_cb->app_id) {\r
86                         free(_cb->app_id);\r
87                 }\r
88                 free(_cb);\r
89                 return ERROR_CONVERT(ret);\r
90         }\r
91         \r
92         _svc->push_incoming_cb_list = g_slist_append(_svc->push_incoming_cb_list, _cb);\r
93         \r
94         return MESSAGES_ERROR_NONE;\r
95 }\r
96 \r
97 int messages_push_remove_incoming_cb(messages_service_h service, const char *app_id)\r
98 {\r
99         CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE);\r
100 \r
101         int i;\r
102         messages_push_incoming_callback_s *_cb;\r
103 \r
104         messages_service_s *_svc = (messages_service_s *)service;\r
105         \r
106         CHECK_NULL(_svc);\r
107         CHECK_NULL(_svc->service_h);\r
108         CHECK_NULL(app_id);\r
109         \r
110         for (i=0; i < g_slist_length(_svc->push_incoming_cb_list); i++)\r
111         {\r
112                 _cb = (messages_push_incoming_callback_s *)g_slist_nth_data(_svc->push_incoming_cb_list, i);\r
113                 if (NULL != _cb && NULL != _cb->app_id)\r
114                 {\r
115                         if (!strcmp(_cb->app_id, app_id)) {                             \r
116                                 _cb->callback = NULL;\r
117                         }\r
118                 }       \r
119         }\r
120         \r
121         return MESSAGES_ERROR_NONE;\r
122 }\r
123 \r
124 \r
125 int messages_push_register(messages_service_h service, const char *content_type, const char *app_id)\r
126 {\r
127         CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE);\r
128 \r
129         int ret;\r
130         \r
131         msg_struct_t push_info;\r
132         char *pkg_name;\r
133         \r
134         messages_service_s *_svc = (messages_service_s *)service;\r
135 \r
136         CHECK_NULL(_svc);\r
137         CHECK_NULL(_svc->service_h);\r
138         CHECK_NULL(content_type);\r
139         CHECK_NULL(app_id);\r
140         \r
141         ret = app_get_id(&pkg_name);\r
142         if (APP_ERROR_NONE != ret) {\r
143                 LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_id failed.",\r
144                         __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED);\r
145                 return MESSAGES_ERROR_OPERATION_FAILED;                 \r
146         }\r
147         \r
148         push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO);\r
149         msg_set_str_value(push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN);\r
150         msg_set_str_value(push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)app_id, MAX_WAPPUSH_ID_LEN);\r
151         msg_set_str_value(push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX);\r
152         free(pkg_name);\r
153         \r
154         ret = msg_add_push_event(_svc->service_h, push_info);   \r
155         msg_release_struct(&push_info);\r
156         if (MSG_SUCCESS != ret)\r
157         {\r
158                 return ERROR_CONVERT(ret);\r
159         }\r
160         \r
161         return MESSAGES_ERROR_NONE;\r
162 }\r
163 \r
164 int messages_push_deregister(messages_service_h service, const char *content_type, const char *app_id)\r
165 {\r
166         CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE);\r
167 \r
168         int ret;\r
169         \r
170         msg_struct_t push_info;\r
171         char *pkg_name;\r
172         \r
173         messages_service_s *_svc = (messages_service_s *)service;\r
174         \r
175         CHECK_NULL(_svc);\r
176         CHECK_NULL(_svc->service_h);\r
177         CHECK_NULL(content_type);\r
178         CHECK_NULL(app_id);\r
179         \r
180         ret = app_get_id(&pkg_name);\r
181         if (APP_ERROR_NONE != ret) {\r
182                 LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_id failed.",\r
183                         __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED);\r
184                 return MESSAGES_ERROR_OPERATION_FAILED;                 \r
185         }\r
186         \r
187         push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO);\r
188         msg_set_str_value(push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN);\r
189         msg_set_str_value(push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)app_id, MAX_WAPPUSH_ID_LEN);\r
190         msg_set_str_value(push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX);\r
191         free(pkg_name);\r
192         \r
193         ret = msg_delete_push_event(_svc->service_h, push_info);\r
194         msg_release_struct(&push_info);\r
195         if (MSG_SUCCESS != ret)\r
196         {\r
197                 return ERROR_CONVERT(ret);\r
198         }\r
199         \r
200         return MESSAGES_ERROR_NONE;\r
201 }\r
202 \r
203 int messages_push_reregister(messages_service_h service, const char *content_type, const char *app_id,\r
204                                                          const char *dst_content_type, const char *dst_app_id)\r
205 {\r
206         CHECK_MESSAGES_SUPPORTED(MESSAGES_TELEPHONY_FEATURE);\r
207 \r
208         int ret;\r
209         \r
210         msg_struct_t push_info;\r
211         msg_struct_t dst_push_info;\r
212         char *pkg_name;\r
213         \r
214         messages_service_s *_svc = (messages_service_s *)service;\r
215         \r
216         CHECK_NULL(_svc);\r
217         CHECK_NULL(_svc->service_h);\r
218         CHECK_NULL(content_type);\r
219         CHECK_NULL(app_id);\r
220         CHECK_NULL(dst_content_type);\r
221         CHECK_NULL(dst_app_id);\r
222         \r
223         ret = app_get_id(&pkg_name);\r
224         if (APP_ERROR_NONE != ret) {\r
225                 LOGE("[%s:%d] OPERATION_FAILED(0x%08x) : app_get_id failed.",\r
226                         __FUNCTION__, __LINE__, MESSAGES_ERROR_OPERATION_FAILED);\r
227                 return MESSAGES_ERROR_OPERATION_FAILED;                 \r
228         }\r
229         \r
230         push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO);\r
231         msg_set_str_value(push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN);\r
232         msg_set_str_value(push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)app_id, MAX_WAPPUSH_ID_LEN);\r
233         msg_set_str_value(push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX);\r
234         \r
235         dst_push_info = msg_create_struct(MSG_STRUCT_PUSH_CONFIG_INFO);\r
236         msg_set_str_value(dst_push_info, MSG_PUSH_CONFIG_CONTENT_TYPE_STR, (char *)dst_content_type, MAX_WAPPUSH_CONTENT_TYPE_LEN);\r
237         msg_set_str_value(dst_push_info, MSG_PUSH_CONFIG_APPLICATON_ID_STR, (char *)dst_app_id, MAX_WAPPUSH_ID_LEN);\r
238         msg_set_str_value(dst_push_info, MSG_PUSH_CONFIG_PACKAGE_NAME_STR, pkg_name, MSG_FILEPATH_LEN_MAX);\r
239         free(pkg_name);\r
240         \r
241         ret = msg_update_push_event(_svc->service_h, push_info, dst_push_info);\r
242         msg_release_struct(&push_info);\r
243         msg_release_struct(&dst_push_info);\r
244         if (MSG_SUCCESS != ret)\r
245         {\r
246                 return ERROR_CONVERT(ret);\r
247         }\r
248         \r
249         return MESSAGES_ERROR_NONE;\r
250 }\r
251 \r
252 \r
253 \r