technology: return already enabled when tethering is enabled
[framework/connectivity/connman.git] / src / technology.c
index 013ac78..ad555c9 100644 (file)
@@ -244,6 +244,21 @@ void connman_technology_regdom_notify(struct connman_technology *technology,
        technology->regdom = g_strdup(alpha2);
 }
 
+static int set_regdom_by_device(struct connman_technology *technology,
+                                                       const char *alpha2)
+{
+       GSList *list;
+
+       for (list = technology->device_list; list; list = list->next) {
+               struct connman_device *device = list->data;
+
+               if (connman_device_set_regdom(device, alpha2) != 0)
+                       return -ENOTSUP;
+       }
+
+       return 0;
+}
+
 int connman_technology_set_regdom(const char *alpha2)
 {
        GSList *list;
@@ -251,11 +266,14 @@ int connman_technology_set_regdom(const char *alpha2)
        for (list = technology_list; list; list = list->next) {
                struct connman_technology *technology = list->data;
 
-               if (technology->driver == NULL)
-                       continue;
+               if (set_regdom_by_device(technology, alpha2) != 0) {
+                       if (technology->driver == NULL)
+                               continue;
 
-               if (technology->driver->set_regdom)
-                       technology->driver->set_regdom(technology, alpha2);
+                       if (technology->driver->set_regdom != NULL)
+                               technology->driver->set_regdom(technology,
+                                                               alpha2);
+               }
        }
 
        return 0;
@@ -673,7 +691,10 @@ done:
                        technology->pending_timeout = g_timeout_add_seconds(10,
                                        technology_pending_reply, technology);
                } else {
-                       reply = __connman_error_failed(msg, -err);
+                       if (err == -EALREADY)
+                               reply = __connman_error_already_disabled(msg);
+                       else
+                               reply = __connman_error_failed(msg, -err);
                        if (reply != NULL)
                                g_dbus_send_message(connection, reply);
                }
@@ -720,7 +741,7 @@ static DBusMessage *set_property(DBusConnection *conn,
                dbus_message_iter_get_basic(&value, &tethering);
 
                if (technology->tethering == tethering)
-                       return __connman_error_in_progress(msg);
+                       return __connman_error_already_enabled(msg);
 
                err = set_tethering(technology, tethering);
                if (err < 0)
@@ -842,6 +863,31 @@ void __connman_technology_scan_stopped(struct connman_device *device)
                reply_scan_pending(technology, 0);
 }
 
+void __connman_technology_notify_regdom_by_device(struct connman_device *device,
+                                               int result, const char *alpha2)
+{
+       struct connman_technology *technology;
+       enum connman_service_type type;
+
+       type = __connman_device_get_service_type(device);
+       technology = technology_find(type);
+
+       if (technology == NULL)
+               return;
+
+       if (result < 0) {
+               if (technology->driver != NULL &&
+                               technology->driver->set_regdom != NULL) {
+                       technology->driver->set_regdom(technology, alpha2);
+                       return;
+               }
+
+               alpha2 = NULL;
+       }
+
+       connman_technology_regdom_notify(technology, alpha2);
+}
+
 static DBusMessage *scan(DBusConnection *conn, DBusMessage *msg, void *data)
 {
        struct connman_technology *technology = data;