diff --git a/docs/usb_moded-doc.txt b/docs/usb_moded-doc.txt index f942397..d42163d 100644 --- a/docs/usb_moded-doc.txt +++ b/docs/usb_moded-doc.txt @@ -415,4 +415,4 @@ For example hide=developer_mode,bastard_mode Modes can also be set and removed through dbus (one mode at a time) -See usb_moded_util (-i and -u) +See usb_moded_util (-v, -i and -u) diff --git a/src/com.meego.usb_moded.xml b/src/com.meego.usb_moded.xml index 68a95af..2d66797 100644 --- a/src/com.meego.usb_moded.xml +++ b/src/com.meego.usb_moded.xml @@ -30,6 +30,17 @@ + + + + + + + + + + + @@ -45,5 +56,8 @@ + + + diff --git a/src/usb_moded-config-private.h b/src/usb_moded-config-private.h index b4d3896..bf217bd 100644 --- a/src/usb_moded-config-private.h +++ b/src/usb_moded-config-private.h @@ -28,4 +28,5 @@ char * get_mode_setting(void); set_config_result_t set_mode_setting(const char *mode); set_config_result_t set_hide_mode_setting(const char *mode); set_config_result_t set_unhide_mode_setting(const char *mode); +char * get_hidden_modes(void); set_config_result_t set_network_setting(const char *config, const char *setting); diff --git a/src/usb_moded-config.c b/src/usb_moded-config.c index 5ce2991..622b448 100644 --- a/src/usb_moded-config.c +++ b/src/usb_moded-config.c @@ -434,6 +434,8 @@ static const char * make_hidden_modes_string(const char *hidden, int hide) for(i = 0; hidden_mode_split[i] != NULL; i++) { + if(strlen(hidden_mode_split[i]) == 0) + continue; if(!strcmp(hidden_mode_split[i], hidden)) { /* if hiding a mode that is already hidden do nothing */ @@ -442,13 +444,14 @@ static const char * make_hidden_modes_string(const char *hidden, int hide) if(!hide) continue; } + if(strlen(modelist_str->str) != 0) + modelist_str = g_string_append(modelist_str, ","); modelist_str = g_string_append(modelist_str, hidden_mode_split[i]); - if(hidden_mode_split[i+1] != NULL) - modelist_str = g_string_append(modelist_str, ","); } if(hide) { - modelist_str = g_string_append(modelist_str, ","); + if(strlen(modelist_str->str) != 0) + modelist_str = g_string_append(modelist_str, ","); modelist_str = g_string_append(modelist_str, hidden); } @@ -461,8 +464,10 @@ set_config_result_t set_hide_mode_setting(const char *mode) set_config_result_t ret; ret = set_config_setting(MODE_SETTING_ENTRY, MODE_HIDE_KEY, make_hidden_modes_string(mode, 1)); - if(ret == SET_CONFIG_UPDATED) - send_supported_modes_signal(); + if(ret == SET_CONFIG_UPDATED) { + send_hidden_modes_signal(); + send_supported_modes_signal(); + } return(ret); } @@ -471,8 +476,10 @@ set_config_result_t set_unhide_mode_setting(const char *mode) set_config_result_t ret; ret = set_config_setting(MODE_SETTING_ENTRY, MODE_HIDE_KEY, make_hidden_modes_string(mode, 0)); - if(ret == SET_CONFIG_UPDATED) - send_supported_modes_signal(); + if(ret == SET_CONFIG_UPDATED) { + send_hidden_modes_signal(); + send_supported_modes_signal(); + } return(ret); } diff --git a/src/usb_moded-dbus-private.h b/src/usb_moded-dbus-private.h index 74b74c7..d0b3729 100644 --- a/src/usb_moded-dbus-private.h +++ b/src/usb_moded-dbus-private.h @@ -32,3 +32,6 @@ int usb_moded_send_error_signal(const char *error); /* send supported modes signal system bus */ int usb_moded_send_supported_modes_signal(const char *supported_modes); + +/* send hidden modes signal system bus */ +int usb_moded_send_hidden_modes_signal(const char *hidden_modes); diff --git a/src/usb_moded-dbus.c b/src/usb_moded-dbus.c index f2b0830..4bd845e 100644 --- a/src/usb_moded-dbus.c +++ b/src/usb_moded-dbus.c @@ -244,6 +244,15 @@ static DBusHandlerResult msg_handler(DBusConnection *const connection, DBusMessa } dbus_error_free(&err); } + else if(!strcmp(member, USB_MODE_HIDDEN_GET)) + { + char *config = get_hidden_modes(); + if(!config) + config = strdup(""); + if((reply = dbus_message_new_method_return(msg))) + dbus_message_append_args (reply, DBUS_TYPE_STRING, &config, DBUS_TYPE_INVALID); + free(config); + } else if(!strcmp(member, USB_MODE_NETWORK_SET)) { char *config = 0, *setting = 0; @@ -499,3 +508,15 @@ int usb_moded_send_supported_modes_signal(const char *supported_modes) { return(usb_moded_dbus_signal(USB_MODE_SUPPORTED_MODES_SIGNAL_NAME, supported_modes)); } + +/** + * Send regular usb_moded hidden mode list signal + * + * @return 0 on success, 1 on failure + * @param hidden_modes list of supported modes + * +*/ +int usb_moded_send_hidden_modes_signal(const char *hidden_modes) +{ + return(usb_moded_dbus_signal(USB_MODE_HIDDEN_MODES_SIGNAL_NAME, hidden_modes)); +} diff --git a/src/usb_moded-dbus.h b/src/usb_moded-dbus.h index eaf4279..7046258 100644 --- a/src/usb_moded-dbus.h +++ b/src/usb_moded-dbus.h @@ -37,6 +37,7 @@ #define USB_MODE_CONFIG_SIGNAL_NAME "sig_usb_config_ind" #define USB_MODE_ERROR_SIGNAL_NAME "sig_usb_state_error_ind" #define USB_MODE_SUPPORTED_MODES_SIGNAL_NAME "sig_usb_supported_modes_ind" +#define USB_MODE_HIDDEN_MODES_SIGNAL_NAME "sig_usb_hidden_modes_ind" /* supported methods */ #define USB_MODE_STATE_REQUEST "mode_request" /* returns the current mode */ @@ -45,6 +46,7 @@ #define USB_MODE_LIST "get_modes" /* returns a comma-separated list of supported modes for ui's */ #define USB_MODE_HIDE "hide_mode" /* hide a mode */ #define USB_MODE_UNHIDE "unhide_mode" /* unhide a mode */ +#define USB_MODE_HIDDEN_GET "get_hidden" /* return the hidden modes */ #define USB_MODE_STATE_SET "set_mode" /* set a mode (only works when connected) */ #define USB_MODE_CONFIG_SET "set_config" /* set the mode that needs to be activated in the config file */ #define USB_MODE_NETWORK_SET "net_config" /* set the network config in the config file */ diff --git a/src/usb_moded-modes.h b/src/usb_moded-modes.h index 0c01d4f..b39893a 100644 --- a/src/usb_moded-modes.h +++ b/src/usb_moded-modes.h @@ -46,3 +46,4 @@ #define MODE_CHARGER "dedicated_charger" void send_supported_modes_signal(void); +void send_hidden_modes_signal(void); diff --git a/src/usb_moded-util.c b/src/usb_moded-util.c index cb5f29a..f716fdf 100644 --- a/src/usb_moded-util.c +++ b/src/usb_moded-util.c @@ -240,6 +240,31 @@ static int set_unhide_mode_config (char *mode) return 1; } +static int get_hiddenlist (void) +{ + DBusMessage *req = NULL, *reply = NULL; + char *ret = 0; + + if ((req = dbus_message_new_method_call(USB_MODE_SERVICE, USB_MODE_OBJECT, USB_MODE_INTERFACE, USB_MODE_HIDDEN_GET)) != NULL) + { + if ((reply = dbus_connection_send_with_reply_and_block(conn, req, -1, NULL)) != NULL) + { + dbus_message_get_args(reply, NULL, DBUS_TYPE_STRING, &ret, DBUS_TYPE_INVALID); + dbus_message_unref(reply); + } + dbus_message_unref(req); + } + + if(ret) + { + printf("hidden modes are = %s\n", ret); + return 0; + } + + /* not everything went as planned, return error */ + return 1; +} + static int handle_network(char *network) { char *operation = 0, *setting = 0, *value = 0; @@ -314,7 +339,7 @@ static int handle_network(char *network) int main (int argc, char *argv[]) { int query = 0, network = 0, setmode = 0, config = 0; - int modelist = 0, mode_configured = 0, hide = 0, unhide = 0; + int modelist = 0, mode_configured = 0, hide = 0, unhide = 0, hiddenlist = 0; int res = 1, opt, rescue = 0; char *option = 0; @@ -324,7 +349,7 @@ int main (int argc, char *argv[]) exit(1); } - while ((opt = getopt(argc, argv, "c:dhi:mn:qrs:u:")) != -1) + while ((opt = getopt(argc, argv, "c:dhi:mn:qrs:u:v")) != -1) { switch (opt) { case 'c': @@ -359,6 +384,9 @@ int main (int argc, char *argv[]) unhide = 1; option = optarg; break; + case 'v': + hiddenlist = 1; + break; case 'h': default: fprintf(stderr, "\nUsage: %s -