service: Allow ready service to be moved before online one
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Wed, 24 Aug 2011 08:36:39 +0000 (11:36 +0300)
committerSamuel Ortiz <sameo@linux.intel.com>
Wed, 24 Aug 2011 09:45:10 +0000 (11:45 +0200)
src/service.c

index b8f1c70..2819d51 100644 (file)
@@ -2912,6 +2912,22 @@ static DBusMessage *remove_service(DBusConnection *conn,
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
+static gboolean check_suitable_state(enum connman_service_state a,
+                                       enum connman_service_state b)
+{
+       /*
+        * Special check so that "ready" service can be moved before
+        * "online" one.
+        */
+       if ((a == CONNMAN_SERVICE_STATE_ONLINE &&
+                       b == CONNMAN_SERVICE_STATE_READY) ||
+               (b == CONNMAN_SERVICE_STATE_ONLINE &&
+                       a == CONNMAN_SERVICE_STATE_READY))
+               return TRUE;
+
+       return a == b;
+}
+
 static DBusMessage *move_service(DBusConnection *conn,
                                        DBusMessage *msg, void *user_data,
                                                                gboolean before)
@@ -2954,28 +2970,32 @@ static DBusMessage *move_service(DBusConnection *conn,
         */
        if (target4 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (service6 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (target->state_ipv6 != service->state_ipv6)
+                       if (check_suitable_state(target->state_ipv6,
+                                               service->state_ipv6) == FALSE)
                                return __connman_error_invalid_service(msg);
                }
        }
 
        if (target6 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (service4 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (target->state_ipv4 != service->state_ipv4)
+                       if (check_suitable_state(target->state_ipv4,
+                                               service->state_ipv4) == FALSE)
                                return __connman_error_invalid_service(msg);
                }
        }
 
        if (service4 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (target6 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (target->state_ipv6 != service->state_ipv6)
+                       if (check_suitable_state(target->state_ipv6,
+                                               service->state_ipv6) == FALSE)
                                return __connman_error_invalid_service(msg);
                }
        }
 
        if (service6 == CONNMAN_IPCONFIG_METHOD_OFF) {
                if (target4 != CONNMAN_IPCONFIG_METHOD_OFF) {
-                       if (target->state_ipv4 != service->state_ipv4)
+                       if (check_suitable_state(target->state_ipv4,
+                                               service->state_ipv4) == FALSE)
                                return __connman_error_invalid_service(msg);
                }
        }