summaryrefslogtreecommitdiffstats
path: root/src/manager.c
diff options
context:
space:
mode:
authorDenis Kenzior <denis.kenzior@intel.com>2009-05-05 21:13:14 -0700
committerMarcel Holtmann <marcel.holtmann@intel.com>2009-05-05 21:14:19 -0700
commita78b36290bed783fb636735d66257bf138f68123 (patch)
tree623c253319a84a11ec22317acddb05e3ae7f529f /src/manager.c
parent838583f4988ba132cab57d5c3ddbac80072c5284 (diff)
downloadofono-a78b36290bed783fb636735d66257bf138f68123.tar.bz2
Add implementation of telephony daemon
Diffstat (limited to 'src/manager.c')
-rw-r--r--src/manager.c210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/manager.c b/src/manager.c
new file mode 100644
index 00000000..eb5dc496
--- /dev/null
+++ b/src/manager.c
@@ -0,0 +1,210 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2008-2009 Intel Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <dbus/dbus.h>
+#include <glib.h>
+#include <gdbus.h>
+
+#include "ofono.h"
+
+#include "dbus-gsm.h"
+
+#include "modem.h"
+#include "driver.h"
+
+#define MANAGER_INTERFACE "org.ofono.Manager"
+#define MANAGER_PATH "/"
+
+static GSList *g_modem_list = NULL;
+static int g_next_modem_id = 1;
+
+#if 0
+struct ofono_modem *manager_find_modem_by_id(int id)
+{
+ GSList *l;
+ struct ofono_modem *modem;
+
+ for (l = g_modem_list; l; l = l->next) {
+ modem = l->data;
+
+ if (modem->id == id)
+ return modem;
+ }
+
+ return NULL;
+}
+#endif
+
+/* Clients only need to free *modems */
+static int modem_list(char ***modems)
+{
+ GSList *l;
+ int i;
+ struct ofono_modem *modem;
+
+ *modems = g_new0(char *, g_slist_length(g_modem_list) + 1);
+
+ if (!*modems)
+ return -1;
+
+ for (l = g_modem_list, i = 0; l; l = l->next, i++) {
+ modem = l->data;
+
+ (*modems)[i] = modem->path;
+ }
+
+ return 0;
+}
+
+struct ofono_modem *ofono_modem_register(struct ofono_modem_attribute_ops *ops)
+{
+ struct ofono_modem *modem;
+ DBusConnection *conn = dbus_gsm_connection();
+ char **modems;
+
+ modem = modem_create(g_next_modem_id, ops);
+
+ if (modem == NULL)
+ return 0;
+
+ ++g_next_modem_id;
+
+ g_modem_list = g_slist_prepend(g_modem_list, modem);
+
+ if (modem_list(&modems) == 0) {
+ dbus_gsm_signal_array_property_changed(conn, MANAGER_PATH,
+ MANAGER_INTERFACE, "Modems",
+ DBUS_TYPE_OBJECT_PATH, &modems);
+
+ g_free(modems);
+ }
+
+ return modem;
+}
+
+int ofono_modem_unregister(struct ofono_modem *m)
+{
+ struct ofono_modem *modem = m;
+ DBusConnection *conn = dbus_gsm_connection();
+ char **modems;
+
+ if (modem == NULL)
+ return -1;
+
+ modem_remove(modem);
+
+ g_modem_list = g_slist_remove(g_modem_list, modem);
+
+ if (modem_list(&modems) == 0) {
+ dbus_gsm_signal_array_property_changed(conn, MANAGER_PATH,
+ MANAGER_INTERFACE, "Modems",
+ DBUS_TYPE_OBJECT_PATH, &modems);
+
+ g_free(modems);
+ }
+
+ return 0;
+}
+
+static DBusMessage *manager_get_properties(DBusConnection *conn,
+ DBusMessage *msg, void *data)
+{
+ DBusMessageIter iter;
+ DBusMessageIter dict;
+ DBusMessage *reply;
+ char **modems;
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return NULL;
+
+ if (modem_list(&modems) == -1)
+ return NULL;
+
+ dbus_message_iter_init_append(reply, &iter);
+
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+ PROPERTIES_ARRAY_SIGNATURE,
+ &dict);
+
+ dbus_gsm_dict_append_array(&dict, "Modems", DBUS_TYPE_OBJECT_PATH,
+ &modems);
+
+ g_free(modems);
+
+ dbus_message_iter_close_container(&iter, &dict);
+
+ return reply;
+}
+
+static GDBusMethodTable manager_methods[] = {
+ { "GetProperties", "", "a{sv}", manager_get_properties },
+ { }
+};
+
+static GDBusSignalTable manager_signals[] = {
+ { "PropertyChanged", "sv" },
+ { }
+};
+
+int __ofono_manager_init()
+{
+ DBusConnection *conn = dbus_gsm_connection();
+ gboolean ret;
+
+ ret = g_dbus_register_interface(conn, "/", MANAGER_INTERFACE,
+ manager_methods, manager_signals,
+ NULL, NULL, NULL);
+
+ if (ret == FALSE)
+ return -1;
+
+ return 0;
+}
+
+void __ofono_manager_cleanup()
+{
+ GSList *l;
+ struct ofono_modem *modem;
+ DBusConnection *conn = dbus_gsm_connection();
+
+ /* Clean up in case plugins didn't unregister the modems */
+ for (l = g_modem_list; l; l = l->next) {
+ modem = l->data;
+
+ if (!modem)
+ continue;
+
+ ofono_debug("plugin owning %s forgot to unregister, cleaning up",
+ modem->path);
+ modem_remove(modem);
+ }
+
+ g_slist_free(g_modem_list);
+ g_modem_list = 0;
+
+ g_dbus_unregister_interface(conn, "/", MANAGER_INTERFACE);
+}