Add sample application[phone]
[staging/soundmanager.git] / sample / phone / telephony-binding / gdbus / ofono_voicecallmanager.c
diff --git a/sample/phone/telephony-binding/gdbus/ofono_voicecallmanager.c b/sample/phone/telephony-binding/gdbus/ofono_voicecallmanager.c
new file mode 100644 (file)
index 0000000..aab4f69
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2017 Konsulko Group
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define _GNU_SOURCE
+
+#include <string.h>
+
+#include <afb/afb-binding.h>
+
+#include "ofono_voicecallmanager_interface.h"
+
+static const struct afb_binding_interface *interface;
+
+static void call_added(OrgOfonoVoiceCallManager *manager,
+                      gchar *op,
+                      GVariant *properties)
+{
+       GVariantIter *iter;
+       gchar *key;
+       GVariant *value;
+       const gchar *state, *cl = NULL;
+
+       g_variant_get(properties, "a{sv}", &iter);
+       while (g_variant_iter_loop(iter, "{sv}", &key, &value)) {
+               if (!strcmp(key, "State")) {
+                       state = g_variant_get_string(value, NULL);
+               } else if (!strcmp(key, "LineIdentification")) {
+                       cl = g_variant_get_string(value, NULL);
+               }
+       }
+
+       if (!strcmp(state, "incoming")) {
+               g_signal_emit_by_name(manager, "incoming-call", op, cl ? cl : "");
+       } else if (!strcmp(state, "dialing")) {
+               g_signal_emit_by_name(manager, "dialing-call", op, cl ? cl : "");
+       }
+}
+
+static void call_removed(OrgOfonoVoiceCallManager *manager,
+                        gchar *op,
+                        GVariant *properties)
+{
+       g_signal_emit_by_name(manager, "terminated-call", op);
+}
+
+
+const OrgOfonoVoiceCallManager
+*ofono_voicecallmanager_init(const struct afb_binding_interface *iface,
+                            const gchar *op,
+                            void (*incoming_call)(OrgOfonoVoiceCallManager *manager,gchar *,gchar *),
+                            void (*dialing_call)(OrgOfonoVoiceCallManager *manager,gchar *,gchar *),
+                            void (*terminated_call)(OrgOfonoVoiceCallManager *manager,gchar *))
+{
+       interface = iface;
+
+       OrgOfonoVoiceCallManager *manager = org_ofono_voice_call_manager_proxy_new_for_bus_sync(
+                       G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
+                       "org.ofono", op, NULL, NULL);
+
+       g_signal_new("incoming-call",
+                    G_TYPE_OBJECT,
+                    G_SIGNAL_RUN_LAST,
+                    0,
+                    NULL,
+                    NULL,
+                    g_cclosure_marshal_generic,
+                    G_TYPE_NONE,
+                    2,
+                    G_TYPE_STRING,
+                    G_TYPE_STRING);
+
+       g_signal_new("dialing-call",
+                    G_TYPE_OBJECT,
+                    G_SIGNAL_RUN_LAST,
+                    0,
+                    NULL,
+                    NULL,
+                    g_cclosure_marshal_generic,
+                    G_TYPE_NONE,
+                    2,
+                    G_TYPE_STRING,
+                    G_TYPE_STRING);
+
+       g_signal_new("terminated-call",
+                    G_TYPE_OBJECT,
+                    G_SIGNAL_RUN_LAST,
+                    0,
+                    NULL,
+                    NULL,
+                    g_cclosure_marshal_generic,
+                    G_TYPE_NONE,
+                    1,
+                    G_TYPE_STRING);
+
+       if (g_signal_connect(G_OBJECT(manager), "incoming-call", G_CALLBACK(incoming_call), NULL) <= 0) {
+               ERROR(interface, "Failed to connect to signal incoming-call\n");
+       }
+
+       if (g_signal_connect(G_OBJECT(manager), "dialing-call", G_CALLBACK(dialing_call), NULL) <= 0) {
+               ERROR(interface, "Failed to connect to signal dialing-call\n");
+       }
+
+       if (g_signal_connect(G_OBJECT(manager), "terminated-call", G_CALLBACK(terminated_call), NULL) <= 0) {
+               ERROR(interface, "Failed to connect to signal terminated-call\n");
+       }
+
+       if (g_signal_connect(manager, "call-added", G_CALLBACK(call_added), NULL) <= 0) {
+               ERROR(interface, "Failed to connect to signal call-added\n");
+       }
+
+       if (g_signal_connect(manager, "call-removed", G_CALLBACK(call_removed), NULL) <= 0) {
+               ERROR(interface, "Failed to connect to signal call-removed\n");
+       }
+
+       return manager;
+}
+
+gchar *ofono_voicecallmanager_dial(OrgOfonoVoiceCallManager *manager,
+                                  const gchar *number,
+                                  const gchar *cid)
+{
+       gchar *out = NULL;
+       GError *error = NULL;
+
+       if (!manager) {
+               ERROR(interface, "Ofono VoiceCallmanager uninitialized\n");
+               return NULL;
+       }
+
+       org_ofono_voice_call_manager_call_dial_sync(manager, number, cid, &out, NULL, &error);
+       if (error != NULL)
+               out = NULL;
+
+       return out;
+}
+
+void ofono_voicecallmanager_hangup_all(OrgOfonoVoiceCallManager *manager)
+{
+       GError *error = NULL;
+
+       if (!manager) {
+               ERROR(interface, "Ofono VoiceCallmanager uninitialized\n");
+               return;
+       }
+
+       org_ofono_voice_call_manager_call_hangup_all_sync(manager, NULL, &error);
+}