4 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <dbus/dbus-glib.h>
21 #include <dbus/dbus.h>
25 #include "bluetooth-api.h"
26 #include "bt-internal-types.h"
28 #include "bt-service-common.h"
29 #include "bt-service-event.h"
31 static DBusConnection *event_conn;
33 int _bt_send_event(int event_type, int event, int type, ...)
40 retv_if(event_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
43 case BT_ADAPTER_EVENT:
44 path = BT_ADAPTER_PATH;
47 path = BT_DEVICE_PATH;
52 case BT_HEADSET_EVENT:
53 path = BT_HEADSET_PATH;
58 case BT_NETWORK_EVENT:
59 path = BT_NETWORK_PATH;
61 case BT_OPP_CLIENT_EVENT:
62 path = BT_OPP_CLIENT_PATH;
64 case BT_OPP_SERVER_EVENT:
65 path = BT_OPP_SERVER_PATH;
67 case BT_RFCOMM_CLIENT_EVENT:
68 path = BT_RFCOMM_CLIENT_PATH;
70 case BT_RFCOMM_SERVER_EVENT:
71 path = BT_RFCOMM_SERVER_PATH;
74 BT_ERR("Unknown event");
75 return BLUETOOTH_ERROR_INTERNAL;
79 case BLUETOOTH_EVENT_ENABLED:
82 case BLUETOOTH_EVENT_DISABLED:
85 case BLUETOOTH_EVENT_LOCAL_NAME_CHANGED:
86 signal = BT_ADAPTER_NAME_CHANGED;
88 case BLUETOOTH_EVENT_DISCOVERABLE_MODE_CHANGED:
89 signal = BT_DISCOVERABLE_MODE_CHANGED;
91 case BLUETOOTH_EVENT_DISCOVERABLE_TIMEOUT_CHANGED:
92 signal = BT_DISCOVERABLE_TIMEOUT_CHANGED;
94 case BLUETOOTH_EVENT_DISCOVERY_STARTED:
95 signal = BT_DISCOVERY_STARTED;
97 case BLUETOOTH_EVENT_REMOTE_DEVICE_FOUND:
98 signal = BT_DEVICE_FOUND;
100 case BLUETOOTH_EVENT_REMOTE_DEVICE_DISAPPEARED:
101 signal = BT_DEVICE_DISAPPEARED;
103 case BLUETOOTH_EVENT_DISCOVERY_FINISHED:
104 signal = BT_DISCOVERY_FINISHED;
106 case BLUETOOTH_EVENT_BONDING_FINISHED:
107 signal = BT_BOND_CREATED;
109 case BLUETOOTH_EVENT_BONDED_DEVICE_REMOVED:
110 signal = BT_BOND_DESTROYED;
112 case BLUETOOTH_EVENT_SERVICE_SEARCHED:
113 signal = BT_SERVICE_SEARCHED;
115 case BLUETOOTH_HID_CONNECTED:
116 signal = BT_INPUT_CONNECTED;
118 case BLUETOOTH_HID_DISCONNECTED:
119 signal = BT_INPUT_DISCONNECTED;
121 case BLUETOOTH_EVENT_AG_CONNECTED:
122 signal = BT_HEADSET_CONNECTED;
124 case BLUETOOTH_EVENT_AG_DISCONNECTED:
125 signal = BT_HEADSET_DISCONNECTED;
127 case BLUETOOTH_EVENT_AV_CONNECTED:
128 signal = BT_STEREO_HEADSET_CONNECTED;
130 case BLUETOOTH_EVENT_AV_DISCONNECTED:
131 signal = BT_STEREO_HEADSET_DISCONNECTED;
133 case BLUETOOTH_EVENT_AG_AUDIO_CONNECTED:
134 signal = BT_SCO_CONNECTED;
136 case BLUETOOTH_EVENT_AG_AUDIO_DISCONNECTED:
137 signal = BT_SCO_DISCONNECTED;
139 case BLUETOOTH_EVENT_AG_SPEAKER_GAIN:
140 signal = BT_SPEAKER_GAIN;
142 case BLUETOOTH_EVENT_AG_MIC_GAIN:
143 signal = BT_MICROPHONE_GAIN;
145 case BLUETOOTH_EVENT_NETWORK_CONNECTED:
146 signal = BT_NETWORK_CONNECTED;
148 case BLUETOOTH_EVENT_NETWORK_DISCONNECTED:
149 signal = BT_NETWORK_DISCONNECTED;
151 case BLUETOOTH_EVENT_NETWORK_SERVER_CONNECTED:
152 signal = BT_NETWORK_SERVER_CONNECTED;
154 case BLUETOOTH_EVENT_NETWORK_SERVER_DISCONNECTED:
155 signal = BT_NETWORK_SERVER_DISCONNECTED;
157 case BLUETOOTH_EVENT_OPC_CONNECTED:
158 signal = BT_OPP_CONNECTED;
160 case BLUETOOTH_EVENT_OPC_DISCONNECTED:
161 signal = BT_OPP_DISCONNECTED;
163 case BLUETOOTH_EVENT_OPC_TRANSFER_STARTED:
164 case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_STARTED:
165 signal = BT_TRANSFER_STARTED;
167 case BLUETOOTH_EVENT_OPC_TRANSFER_PROGRESS:
168 case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_PROGRESS:
169 signal = BT_TRANSFER_PROGRESS;
171 case BLUETOOTH_EVENT_OPC_TRANSFER_COMPLETE:
172 case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_COMPLETED:
173 signal = BT_TRANSFER_COMPLETED;
175 case BLUETOOTH_EVENT_OBEX_SERVER_TRANSFER_AUTHORIZE:
176 signal = BT_TRANSFER_AUTHORIZED;
178 case BLUETOOTH_EVENT_OBEX_SERVER_CONNECTION_AUTHORIZE:
179 case BLUETOOTH_EVENT_RFCOMM_AUTHORIZE:
180 signal = BT_CONNECTION_AUTHORIZED;
182 case BLUETOOTH_EVENT_RFCOMM_CONNECTED:
183 signal = BT_RFCOMM_CONNECTED;
185 case BLUETOOTH_EVENT_RFCOMM_DISCONNECTED:
186 signal = BT_RFCOMM_DISCONNECTED;
188 case BLUETOOTH_EVENT_RFCOMM_DATA_RECEIVED:
189 signal = BT_RFCOMM_DATA_RECEIVED;
191 case BLUETOOTH_EVENT_RFCOMM_SERVER_REMOVED:
192 signal = BT_RFCOMM_SERVER_REMOVED;
194 case BLUETOOTH_EVENT_DEVICE_CONNECTED:
195 signal = BT_DEVICE_CONNECTED;
197 case BLUETOOTH_EVENT_DEVICE_DISCONNECTED:
198 signal = BT_DEVICE_DISCONNECTED;
200 case BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS:
201 signal = BT_MEDIA_SHUFFLE_STATUS;
203 case BLUETOOTH_EVENT_AVRCP_SETTING_EQUALIZER_STATUS:
204 signal = BT_MEDIA_EQUALIZER_STATUS;
206 case BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS:
207 signal = BT_MEDIA_REPEAT_STATUS;
209 case BLUETOOTH_EVENT_AVRCP_SETTING_SCAN_STATUS:
210 signal = BT_MEDIA_SCAN_STATUS;
213 BT_ERR("Unknown event");
214 return BLUETOOTH_ERROR_INTERNAL;
217 msg = dbus_message_new_signal(path, BT_EVENT_SERVICE,
221 BT_ERR("Message is NULL\n");
222 return BLUETOOTH_ERROR_INTERNAL;
226 /* Set the arguments of the dbus message */
227 va_start(arguments, type);
229 if (!dbus_message_append_args_valist(msg, type, arguments)) {
230 dbus_message_unref(msg);
232 return BLUETOOTH_ERROR_INTERNAL;
238 if (!dbus_connection_send(event_conn, msg, NULL)) {
239 BT_ERR("send failed\n");
240 dbus_message_unref(msg);
241 return BLUETOOTH_ERROR_INTERNAL;
244 dbus_connection_flush(event_conn);
245 dbus_message_unref(msg);
247 return BLUETOOTH_ERROR_NONE;
251 /* To send the event from service daemon to application*/
252 int _bt_init_service_event_sender(void)
254 DBusConnection *conn;
259 BT_ERR("Event handler is already exist");
260 return BLUETOOTH_ERROR_INTERNAL;
263 conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, NULL);
264 retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
266 dbus_error_init(&err);
268 ret = dbus_bus_request_name(conn, BT_EVENT_SERVICE,
269 DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
271 if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
272 if (dbus_error_is_set(&err) == TRUE) {
273 BT_ERR("Event init failed, %s", err.message);
274 dbus_error_free(&err);
276 return BLUETOOTH_ERROR_INTERNAL;
281 return BLUETOOTH_ERROR_NONE;
284 void _bt_deinit_service_event_sender(void)
287 dbus_connection_close(event_conn);