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.
21 #include "usb-client.h"
22 #include "core/edbus-handler.h"
24 #define CHANGE_USB_MODE "ChangeUsbMode"
26 #define METHOD_GET_STATE "GetState"
27 #define METHOD_GET_MODE "GetMode"
28 #define SIGNAL_STATE_CHANGED "StateChanged"
29 #define SIGNAL_MODE_CHANGED "ModeChanged"
31 #define USB_STATE_MAX UINT_MAX
32 #define USB_MODE_MAX UINT_MAX
34 enum usbclient_state {
35 USBCLIENT_STATE_DISCONNECTED = 0x00,
36 USBCLIENT_STATE_CONNECTED = 0x01,
37 USBCLIENT_STATE_AVAILABLE = 0x02,
40 static void change_usb_client_mode(void *data, DBusMessage *msg)
45 if (dbus_message_is_signal(msg, DEVICED_INTERFACE_USB, CHANGE_USB_MODE) == 0) {
46 _E("The signal is not for changing usb mode");
50 dbus_error_init(&err);
52 if (dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &mode, DBUS_TYPE_INVALID) == 0) {
53 _E("FAIL: dbus_message_get_args");
60 case SET_USB_RNDIS_DIAG:
61 case SET_USB_DIAG_RMNET:
65 case SET_USB_SDB_DIAG:
66 case SET_USB_RNDIS_SDB:
70 _E("(%d) is unknown usb mode", mode);
74 if (vconf_set_int(VCONFKEY_USB_SEL_MODE, mode) != 0)
75 _E("Failed to set usb mode (%d)", mode);
77 if (vconf_set_bool(VCONFKEY_SETAPPL_USB_DEBUG_MODE_BOOL, debug) != 0)
78 _E("Failed to set usb debug toggle (%d)", debug);
81 dbus_error_free(&err);
86 int register_usb_client_change_request(void)
88 return register_edbus_signal_handler(DEVICED_PATH_USB,
89 DEVICED_INTERFACE_USB,
90 CHANGE_USB_MODE, change_usb_client_mode);
93 static unsigned int get_usb_state(void)
95 unsigned int state = USBCLIENT_STATE_DISCONNECTED;
97 if (get_current_usb_physical_state() == 0) {
98 state |= USBCLIENT_STATE_DISCONNECTED;
102 state |= USBCLIENT_STATE_CONNECTED;
104 if (get_current_usb_logical_state() > 0
105 && get_current_usb_mode() > SET_USB_NONE)
106 state |= USBCLIENT_STATE_AVAILABLE;
112 static unsigned int get_usb_mode(void)
114 return get_current_usb_gadget_info(get_current_usb_mode());
117 void send_msg_usb_state_changed(void)
122 static unsigned int prev_state = USB_STATE_MAX;
124 state = get_usb_state();
125 if (state == prev_state)
129 _I("USB state changed (%u)", state);
131 snprintf(text, sizeof(text), "%u", state);
134 if (broadcast_edbus_signal(
136 DEVICED_INTERFACE_USB,
137 SIGNAL_STATE_CHANGED,
139 _E("Failed to send dbus signal");
142 void send_msg_usb_mode_changed(void)
147 static unsigned int prev_mode = USB_MODE_MAX;
149 mode = get_usb_mode();
150 if (mode == prev_mode)
154 snprintf(text, sizeof(text), "%u", mode);
157 _I("USB mode changed (%u)", mode);
159 if (broadcast_edbus_signal(
161 DEVICED_INTERFACE_USB,
164 _E("Failed to send dbus signal");
167 static DBusMessage *get_usb_client_state(E_DBus_Object *obj, DBusMessage *msg)
169 DBusMessageIter iter;
173 state = get_usb_state();
175 reply = dbus_message_new_method_return(msg);
176 dbus_message_iter_init_append(reply, &iter);
177 dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &state);
181 static DBusMessage *get_usb_client_mode(E_DBus_Object *obj, DBusMessage *msg)
183 DBusMessageIter iter;
187 mode = get_usb_mode();
189 reply = dbus_message_new_method_return(msg);
190 dbus_message_iter_init_append(reply, &iter);
191 dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &mode);
195 static const struct edbus_method edbus_methods[] = {
196 { METHOD_GET_STATE , NULL, "u" , get_usb_client_state },
197 { METHOD_GET_MODE , NULL, "u" , get_usb_client_mode },
200 int register_usbclient_dbus_methods(void)
202 return register_edbus_method(DEVICED_PATH_USB, edbus_methods, ARRAY_SIZE(edbus_methods));