319
322
DBUS_TYPE_INVALID);
322
static DBusMessage *add_profile(DBusConnection *conn,
325
static DBusMessage *create_profile(DBusConnection *conn,
323
326
DBusMessage *msg, void *data)
328
const char *name, *path;
327
331
DBG("conn %p", conn);
329
333
dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name,
330
334
DBUS_TYPE_INVALID);
332
return __connman_error_not_supported(msg);
336
if (__connman_security_check_privilege(msg,
337
CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
338
return __connman_error_permission_denied(msg);
340
err = __connman_profile_create(name, &path);
342
return __connman_error_failed(msg, -err);
344
return g_dbus_create_reply(msg, DBUS_TYPE_OBJECT_PATH, &path,
335
348
static DBusMessage *remove_profile(DBusConnection *conn,
336
349
DBusMessage *msg, void *data)
338
351
const char *path;
340
354
DBG("conn %p", conn);
342
356
dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
343
357
DBUS_TYPE_INVALID);
345
return __connman_error_not_supported(msg);
359
if (__connman_security_check_privilege(msg,
360
CONNMAN_SECURITY_PRIVILEGE_MODIFY) < 0)
361
return __connman_error_permission_denied(msg);
363
err = __connman_profile_remove(path);
365
return __connman_error_failed(msg, -err);
367
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
348
370
static DBusMessage *request_scan(DBusConnection *conn,
349
371
DBusMessage *msg, void *data)
351
enum connman_device_type type;
373
enum connman_service_type type;
379
401
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
404
static DBusConnection *connection = NULL;
406
static enum connman_service_type technology_type;
407
static connman_bool_t technology_enabled;
408
static DBusMessage *technology_pending = NULL;
409
static guint technology_timeout = 0;
411
static void technology_reply(int error)
415
if (technology_timeout > 0) {
416
g_source_remove(technology_timeout);
417
technology_timeout = 0;
420
if (technology_pending != NULL) {
424
reply = __connman_error_failed(technology_pending,
427
g_dbus_send_message(connection, reply);
429
g_dbus_send_reply(connection, technology_pending,
432
dbus_message_unref(technology_pending);
433
technology_pending = NULL;
436
technology_type = CONNMAN_SERVICE_TYPE_UNKNOWN;
439
static gboolean technology_abort(gpointer user_data)
443
technology_timeout = 0;
445
technology_reply(ETIMEDOUT);
450
static void technology_notify(enum connman_service_type type,
451
connman_bool_t enabled)
453
DBG("type %d enabled %d", type, enabled);
455
if (type == technology_type && enabled == technology_enabled)
459
static struct connman_notifier technology_notifier = {
461
.priority = CONNMAN_NOTIFIER_PRIORITY_HIGH,
462
.service_enabled= technology_notify,
382
465
static DBusMessage *enable_technology(DBusConnection *conn,
383
466
DBusMessage *msg, void *data)
385
enum connman_device_type type;
468
enum connman_service_type type;
389
472
DBG("conn %p", conn);
474
if (technology_pending != NULL)
475
return __connman_error_in_progress(msg);
391
477
dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &str,
392
478
DBUS_TYPE_INVALID);
394
480
if (g_strcmp0(str, "ethernet") == 0)
395
type = CONNMAN_DEVICE_TYPE_ETHERNET;
481
type = CONNMAN_SERVICE_TYPE_ETHERNET;
396
482
else if (g_strcmp0(str, "wifi") == 0)
397
type = CONNMAN_DEVICE_TYPE_WIFI;
483
type = CONNMAN_SERVICE_TYPE_WIFI;
398
484
else if (g_strcmp0(str, "wimax") == 0)
399
type = CONNMAN_DEVICE_TYPE_WIMAX;
485
type = CONNMAN_SERVICE_TYPE_WIMAX;
400
486
else if (g_strcmp0(str, "bluetooth") == 0)
401
type = CONNMAN_DEVICE_TYPE_BLUETOOTH;
402
else if (g_strcmp0(str, "gps") == 0)
403
type = CONNMAN_DEVICE_TYPE_GPS;
487
type = CONNMAN_SERVICE_TYPE_BLUETOOTH;
488
else if (g_strcmp0(str, "cellular") == 0)
489
type = CONNMAN_SERVICE_TYPE_CELLULAR;
405
491
return __connman_error_invalid_arguments(msg);
493
if (__connman_notifier_is_enabled(type) == TRUE)
494
return __connman_error_already_enabled(msg);
496
technology_type = type;
497
technology_enabled = TRUE;
498
technology_pending = dbus_message_ref(msg);
407
500
err = __connman_element_enable_technology(type);
409
if (err == -EINPROGRESS) {
410
connman_error("Invalid return code from enable");
414
return __connman_error_failed(msg, -err);
417
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
501
if (err < 0 && err != -EINPROGRESS)
502
technology_reply(-err);
504
technology_timeout = g_timeout_add_seconds(15,
505
technology_abort, NULL);
420
510
static DBusMessage *disable_technology(DBusConnection *conn,
421
511
DBusMessage *msg, void *data)
423
enum connman_device_type type;
513
enum connman_service_type type;
427
517
DBG("conn %p", conn);
519
if (technology_pending != NULL)
520
return __connman_error_in_progress(msg);
429
522
dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &str,
430
523
DBUS_TYPE_INVALID);
432
525
if (g_strcmp0(str, "ethernet") == 0)
433
type = CONNMAN_DEVICE_TYPE_ETHERNET;
526
type = CONNMAN_SERVICE_TYPE_ETHERNET;
434
527
else if (g_strcmp0(str, "wifi") == 0)
435
type = CONNMAN_DEVICE_TYPE_WIFI;
528
type = CONNMAN_SERVICE_TYPE_WIFI;
436
529
else if (g_strcmp0(str, "wimax") == 0)
437
type = CONNMAN_DEVICE_TYPE_WIMAX;
530
type = CONNMAN_SERVICE_TYPE_WIMAX;
438
531
else if (g_strcmp0(str, "bluetooth") == 0)
439
type = CONNMAN_DEVICE_TYPE_BLUETOOTH;
440
else if (g_strcmp0(str, "gps") == 0)
441
type = CONNMAN_DEVICE_TYPE_GPS;
532
type = CONNMAN_SERVICE_TYPE_BLUETOOTH;
533
else if (g_strcmp0(str, "cellular") == 0)
534
type = CONNMAN_SERVICE_TYPE_CELLULAR;
443
536
return __connman_error_invalid_arguments(msg);
538
if (__connman_notifier_is_enabled(type) == FALSE)
539
return __connman_error_already_disabled(msg);
541
technology_type = type;
542
technology_enabled = FALSE;
543
technology_pending = dbus_message_ref(msg);
445
545
err = __connman_element_disable_technology(type);
447
if (err == -EINPROGRESS) {
448
connman_error("Invalid return code from disable");
452
return __connman_error_failed(msg, -err);
455
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
546
if (err < 0 && err != -EINPROGRESS)
547
technology_reply(-err);
549
technology_timeout = g_timeout_add_seconds(10,
550
technology_abort, NULL);
458
555
static DBusMessage *connect_service(DBusConnection *conn,
516
609
dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
517
610
DBUS_TYPE_INVALID);
519
reply = dbus_message_new_method_return(msg);
523
dbus_message_append_args(reply, DBUS_TYPE_INVALID);
525
__connman_agent_unregister(sender, path);
612
err = __connman_agent_unregister(sender, path);
614
return __connman_error_failed(msg, -err);
616
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
530
619
static GDBusMethodTable manager_methods[] = {
531
620
{ "GetProperties", "", "a{sv}", get_properties },
532
621
{ "SetProperty", "sv", "", set_property },
533
622
{ "GetState", "", "s", get_state },
534
{ "AddProfile", "s", "o", add_profile },
623
{ "CreateProfile", "s", "o", create_profile },
535
624
{ "RemoveProfile", "o", "", remove_profile },
536
625
{ "RequestScan", "s", "", request_scan },
537
{ "EnableTechnology", "s", "", enable_technology },
538
{ "DisableTechnology", "s", "", disable_technology },
626
{ "EnableTechnology", "s", "", enable_technology,
627
G_DBUS_METHOD_FLAG_ASYNC },
628
{ "DisableTechnology", "s", "", disable_technology,
629
G_DBUS_METHOD_FLAG_ASYNC },
539
630
{ "ConnectService", "a{sv}", "o", connect_service,
540
631
G_DBUS_METHOD_FLAG_ASYNC },
541
632
{ "RegisterAgent", "o", "", register_agent },