diff --git a/src/com.meego.usb_moded.xml b/src/com.meego.usb_moded.xml index 9f94112..c25d883 100644 --- a/src/com.meego.usb_moded.xml +++ b/src/com.meego.usb_moded.xml @@ -5,6 +5,9 @@ + + + @@ -56,8 +59,17 @@ + + + + + + + + + diff --git a/src/usb_moded-control.c b/src/usb_moded-control.c index 4e1dfdf..514870d 100644 --- a/src/usb_moded-control.c +++ b/src/usb_moded-control.c @@ -1,7 +1,7 @@ /** * @file usb_moded-control.c * - * Copyright (C) 2013-2018 Jolla. All rights reserved. + * Copyright (C) 2013-2019 Jolla. All rights reserved. * * @author: Philippe De Swert * @author: Simo Piiroinen @@ -44,10 +44,13 @@ const char *control_get_external_mode (void); static void control_set_external_mode (const char *mode); void control_clear_external_mode (void); static void control_update_external_mode (void); +const char *control_get_target_mode (void); +static void control_set_target_mode (const char *mode); +void control_clear_target_mode (void); const char *control_get_usb_mode (void); void control_clear_internal_mode (void); void control_set_usb_mode (const char *mode); -void control_mode_switched (const char *override); +void control_mode_switched (const char *mode); void control_select_usb_mode (void); void control_set_cable_state (cable_state_t cable_state); cable_state_t control_get_cable_state (void); @@ -60,10 +63,16 @@ bool control_get_connection_state (void); /* The external mode; * - * What was the last mode signaled over D-Bus. + * What was the last current mode signaled over D-Bus. */ static char *control_external_mode = NULL; +/* The target mode; + * + * What was the last target mode signaled over D-Bus. + */ +static char *control_target_mode = NULL; + /** The logical mode name * * Full set of valid modes can occur here @@ -136,10 +145,21 @@ static void control_set_external_mode(const char *mode) if( !strcmp(control_external_mode, MODE_ASK) ) { /* send signal, mode will be set when the dialog service calls * the set_mode method call. */ - umdbus_send_state_signal(USB_CONNECTED_DIALOG_SHOW); + umdbus_send_event_signal(USB_CONNECTED_DIALOG_SHOW); } - umdbus_send_state_signal(control_external_mode); + umdbus_send_current_state_signal(control_external_mode); + + if( strcmp(control_external_mode, MODE_BUSY) ) { + /* Stable state reached. Synchronize target state. + * + * Note that normally this ends up being a nop, + * but might be needed if the originally scheduled + * target could not be reached due to errors / user + * disconnecting the cable. + */ + control_set_target_mode(control_external_mode); + } EXIT: return; @@ -159,6 +179,35 @@ static void control_update_external_mode(void) control_set_external_mode(external_mode); } +const char *control_get_target_mode(void) +{ + return control_target_mode ?: MODE_UNDEFINED; +} + +static void control_set_target_mode(const char *mode) +{ + gchar *previous = control_target_mode; + if( !g_strcmp0(previous, mode) ) + goto EXIT; + + log_debug("target_mode: %s -> %s", + previous, mode); + + control_target_mode = g_strdup(mode); + g_free(previous); + + umdbus_send_target_state_signal(control_target_mode); + +EXIT: + return; +} + +void control_clear_target_mode(void) +{ + g_free(control_target_mode), + control_target_mode = 0; +} + /** get the usb mode * * @return the currently set mode @@ -191,6 +240,9 @@ void control_set_usb_mode(const char *mode) control_internal_mode = g_strdup(mode); g_free(previous); + /* Update target mode before declaring busy */ + control_set_target_mode(control_internal_mode); + /* Invalidate current mode for the duration of mode transition */ control_set_external_mode(MODE_BUSY); diff --git a/src/usb_moded-control.h b/src/usb_moded-control.h index 0ad22e3..bc09f44 100644 --- a/src/usb_moded-control.h +++ b/src/usb_moded-control.h @@ -1,7 +1,7 @@ /** * @file usb_moded-control.h * - * Copyright (C) 2013-2018 Jolla. All rights reserved. + * Copyright (C) 2013-2019 Jolla. All rights reserved. * * @author: Philippe De Swert * @author: Simo Piiroinen @@ -32,6 +32,8 @@ void control_rethink_usb_charging_fallback(void); const char *control_get_external_mode (void); void control_clear_external_mode (void); +const char *control_get_target_mode (void); +void control_clear_target_mode (void); const char *control_get_usb_mode (void); void control_clear_internal_mode (void); void control_set_usb_mode (const char *mode); diff --git a/src/usb_moded-dbus-private.h b/src/usb_moded-dbus-private.h index cf55720..dc6da43 100644 --- a/src/usb_moded-dbus-private.h +++ b/src/usb_moded-dbus-private.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2010 Nokia Corporation. All rights reserved. - * Copyright (C) 2013-2018 Jolla Ltd. + * Copyright (C) 2013-2019 Jolla Ltd. * * Author: Philippe De Swert * Author: Philippe De Swert @@ -59,7 +59,9 @@ DBusConnection *umdbus_get_connection (void); gboolean umdbus_init_connection (void); gboolean umdbus_init_service (void); void umdbus_cleanup (void); -int umdbus_send_state_signal (const char *state_ind); +void umdbus_send_current_state_signal (const char *state_ind); +void umdbus_send_target_state_signal (const char *state_ind); +void umdbus_send_event_signal (const char *state_ind); int umdbus_send_error_signal (const char *error); int umdbus_send_supported_modes_signal (const char *supported_modes); int umdbus_send_available_modes_signal (const char *available_modes); diff --git a/src/usb_moded-dbus.c b/src/usb_moded-dbus.c index b7274a0..b7db115 100644 --- a/src/usb_moded-dbus.c +++ b/src/usb_moded-dbus.c @@ -2,7 +2,7 @@ * @file usb_moded-dbus.c * * Copyright (C) 2010 Nokia Corporation. All rights reserved. - * Copyright (C) 2012-2018 Jolla. All rights reserved. + * Copyright (C) 2012-2019 Jolla. All rights reserved. * * @author: Philippe De Swert * @author: Philippe De Swert @@ -65,7 +65,10 @@ gboolean umdbus_init_service (void); static void umdbus_cleanup_service (void); void umdbus_cleanup (void); static int umdbus_send_signal_ex (const char *signal_type, const char *content); -int umdbus_send_state_signal (const char *state_ind); +static void umdbus_send_legacy_signal (const char *state_ind); +void umdbus_send_current_state_signal (const char *state_ind); +void umdbus_send_target_state_signal (const char *state_ind); +void umdbus_send_event_signal (const char *state_ind); int umdbus_send_error_signal (const char *error); int umdbus_send_supported_modes_signal (const char *supported_modes); int umdbus_send_available_modes_signal (const char *available_modes); @@ -119,6 +122,9 @@ static const char umdbus_introspect_usbmoded[] = " \n" " \n" " \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -147,20 +153,40 @@ static const char umdbus_introspect_usbmoded[] = " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" -" " -" " -" " -" " -" " -" " -" " +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" " \n" +" \n" +" \n" +" \n" " \n" " \n" " \n" @@ -168,16 +194,19 @@ static const char umdbus_introspect_usbmoded[] = " \n" " \n" " \n" -" \n" -" \n" -" \n" -" \n" +" \n" " \n" " \n" " \n" " \n" " \n" " \n" +" \n" +" \n" +" \n" +" \n" +" \n" +" \n" " \n" "\n"; @@ -274,6 +303,12 @@ static DBusHandlerResult umdbus_msg_handler(DBusConnection *const connection, DB if((reply = dbus_message_new_method_return(msg))) dbus_message_append_args (reply, DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID); } + else if(!strcmp(member, USB_MODE_TARGET_STATE_GET)) + { + const char *mode = control_get_target_mode(); + if((reply = dbus_message_new_method_return(msg))) + dbus_message_append_args (reply, DBUS_TYPE_STRING, &mode, DBUS_TYPE_INVALID); + } else if(!strcmp(member, USB_MODE_STATE_SET)) { const char *mode = control_get_external_mode(); @@ -801,16 +836,48 @@ static int umdbus_send_signal_ex(const char *signal_type, const char *content) return result; } -/** - * Send regular usb_moded state signal +/** Send legacy usb_moded state_or_event signal * - * @return 0 on success, 1 on failure - * @param state_ind the signal name + * The legacy USB_MODE_SIGNAL_NAME signal is used for + * both mode changes and stateless events. * -*/ -int umdbus_send_state_signal(const char *state_ind) + * @param state_ind mode name or event name + */ +static void umdbus_send_legacy_signal(const char *state_ind) +{ + umdbus_send_signal_ex(USB_MODE_SIGNAL_NAME, state_ind); +} + +/** Send usb_moded current state signal + * + * @param state_ind mode name + */ +void umdbus_send_current_state_signal(const char *state_ind) +{ + umdbus_send_signal_ex(USB_MODE_CURRENT_STATE_SIGNAL_NAME, + state_ind); + umdbus_send_legacy_signal(state_ind); +} + +/** Send usb_moded target state signal + * + * @param state_ind mode name + */ +void umdbus_send_target_state_signal(const char *state_ind) +{ + umdbus_send_signal_ex(USB_MODE_TARGET_STATE_SIGNAL_NAME, + state_ind); +} + +/** Send usb_moded event signal + * + * @param state_ind event name + */ +void umdbus_send_event_signal(const char *state_ind) { - return umdbus_send_signal_ex(USB_MODE_SIGNAL_NAME, state_ind); + umdbus_send_signal_ex(USB_MODE_EVENT_SIGNAL_NAME, + state_ind); + umdbus_send_legacy_signal(state_ind); } /** diff --git a/src/usb_moded-dbus.h b/src/usb_moded-dbus.h index 4a26f68..278f7a6 100644 --- a/src/usb_moded-dbus.h +++ b/src/usb_moded-dbus.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2010 Nokia Corporation. All rights reserved. - * Copyright (C) 2012-2018 Jolla. All rights reserved. + * Copyright (C) 2012-2019 Jolla. All rights reserved. * * Author: Philippe De Swert * Author: Philippe De Swert @@ -47,6 +47,9 @@ * states listed in usb_moded-modes.h. **/ # define USB_MODE_SIGNAL_NAME "sig_usb_state_ind" +# define USB_MODE_CURRENT_STATE_SIGNAL_NAME "sig_usb_current_state_ind" +# define USB_MODE_TARGET_STATE_SIGNAL_NAME "sig_usb_target_state_ind" +# define USB_MODE_EVENT_SIGNAL_NAME "sig_usb_event_ind" # 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" @@ -56,6 +59,7 @@ /* supported methods */ # define USB_MODE_STATE_REQUEST "mode_request" /* returns the current mode */ +# define USB_MODE_TARGET_STATE_GET "get_target_state" /* returns the target mode */ # define USB_MODE_RESCUE_OFF "rescue_off" /* turns rescue mode off so normal mode selection is restored */ # define USB_MODE_CONFIG_GET "get_config" /* returns the mode set in the config */ # define USB_MODE_LIST "get_modes" /* returns a comma-separated list of supported modes for ui's */ diff --git a/src/usb_moded-modesetting.c b/src/usb_moded-modesetting.c index 3c99836..b309ade 100644 --- a/src/usb_moded-modesetting.c +++ b/src/usb_moded-modesetting.c @@ -2,7 +2,7 @@ * @file usb_moded-modesetting.c * * Copyright (C) 2010 Nokia Corporation. All rights reserved. - * Copyright (C) 2013-2018 Jolla Ltd. + * Copyright (C) 2013-2019 Jolla Ltd. * * @author: Philippe De Swert * @author: Philippe De Swert @@ -419,7 +419,7 @@ static bool modesetting_enter_mass_storage_mode(mode_list_elem_t *data) goto EXIT; /* send unmount signal so applications can release their grasp on the fs, do this here so they have time to act */ - umdbus_send_state_signal(USB_PRE_UNMOUNT); + umdbus_send_event_signal(USB_PRE_UNMOUNT); /* Get "No Force Unit Access" from config */ nofua = config_find_sync(); @@ -531,7 +531,7 @@ static bool modesetting_enter_mass_storage_mode(mode_list_elem_t *data) if( ack ) { /* only send data in use signal in case we actually succeed */ - umdbus_send_state_signal(DATA_IN_USE); + umdbus_send_event_signal(DATA_IN_USE); } else { /* Try to undo any unmounts we might have managed to make */ diff --git a/src/usb_moded-udev.c b/src/usb_moded-udev.c index 5142d85..b2aedea 100644 --- a/src/usb_moded-udev.c +++ b/src/usb_moded-udev.c @@ -2,7 +2,7 @@ * @file usb_moded-udev.c * * Copyright (C) 2011 Nokia Corporation. All rights reserved. - * Copyright (C) 2013-2018 Jolla Ltd. + * Copyright (C) 2013-2019 Jolla Ltd. * * @author: Philippe De Swert * @author: Philippe De Swert @@ -182,10 +182,10 @@ static void umudev_cable_state_changed(void) /* dontcare */ break; case CABLE_STATE_CHARGER_CONNECTED: - umdbus_send_state_signal(CHARGER_DISCONNECTED); + umdbus_send_event_signal(CHARGER_DISCONNECTED); break; case CABLE_STATE_PC_CONNECTED: - umdbus_send_state_signal(USB_DISCONNECTED); + umdbus_send_event_signal(USB_DISCONNECTED); break; } @@ -199,10 +199,10 @@ static void umudev_cable_state_changed(void) /* dontcare */ break; case CABLE_STATE_CHARGER_CONNECTED: - umdbus_send_state_signal(CHARGER_CONNECTED); + umdbus_send_event_signal(CHARGER_CONNECTED); break; case CABLE_STATE_PC_CONNECTED: - umdbus_send_state_signal(USB_CONNECTED); + umdbus_send_event_signal(USB_CONNECTED); break; } diff --git a/src/usb_moded.c b/src/usb_moded.c index 87c5080..d42e904 100644 --- a/src/usb_moded.c +++ b/src/usb_moded.c @@ -2,7 +2,7 @@ * @file usb_moded.c * * Copyright (C) 2010 Nokia Corporation. All rights reserved. - * Copyright (C) 2012-2018 Jolla. All rights reserved. + * Copyright (C) 2012-2019 Jolla. All rights reserved. * * @author: Philippe De Swert * @author: Philippe De Swert @@ -659,6 +659,7 @@ static void usbmoded_cleanup(void) control_clear_cable_state(); control_clear_internal_mode(); control_clear_external_mode(); + control_clear_target_mode(); modesetting_quit();