summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/smart-messaging.c53
1 files changed, 52 insertions, 1 deletions
diff --git a/plugins/smart-messaging.c b/plugins/smart-messaging.c
index 2e6a292b..314eb226 100644
--- a/plugins/smart-messaging.c
+++ b/plugins/smart-messaging.c
@@ -36,6 +36,8 @@
#include <ofono/modem.h>
#include <ofono/dbus.h>
#include "smsagent.h"
+#include "smsutil.h"
+#include "common.h"
#define SMART_MESSAGING_INTERFACE "org.ofono.SmartMessaging"
#define AGENT_INTERFACE "org.ofono.SmartMessagingAgent"
@@ -167,10 +169,59 @@ static DBusMessage *smart_messaging_unregister_agent(DBusConnection *conn,
return dbus_message_new_method_return(msg);
}
+static void message_queued(struct ofono_sms *sms,
+ const struct ofono_uuid *uuid, void *data)
+{
+ DBusConnection *conn = ofono_dbus_get_connection();
+ DBusMessage *msg = data;
+ const char *path;
+
+ path = __ofono_sms_message_path_from_uuid(sms, uuid);
+ g_dbus_send_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_INVALID);
+}
+
static DBusMessage *smart_messaging_send_vcard(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return __ofono_error_not_implemented(msg);
+ struct smart_messaging *sm = data;
+ const char *to;
+ unsigned char *bytes;
+ int len;
+ GSList *msg_list;
+ unsigned int flags;
+ gboolean use_16bit_ref = FALSE;
+ int err;
+ struct ofono_uuid uuid;
+ unsigned short ref;
+
+ if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &to,
+ DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE,
+ &bytes, &len, DBUS_TYPE_INVALID))
+ return __ofono_error_invalid_args(msg);
+
+ if (valid_phone_number_format(to) == FALSE)
+ return __ofono_error_invalid_format(msg);
+
+ ref = __ofono_sms_get_next_ref(sm->sms);
+ msg_list = sms_datagram_prepare(to, bytes, len, ref, use_16bit_ref,
+ 0, VCARD_DST_PORT, TRUE, FALSE);
+
+ if (!msg_list)
+ return __ofono_error_invalid_format(msg);
+
+ flags = OFONO_SMS_SUBMIT_FLAG_RETRY | OFONO_SMS_SUBMIT_FLAG_EXPOSE_DBUS;
+
+ err = __ofono_sms_txq_submit(sm->sms, msg_list, flags, &uuid,
+ message_queued, msg);
+
+ g_slist_foreach(msg_list, (GFunc)g_free, NULL);
+ g_slist_free(msg_list);
+
+ if (err < 0)
+ return __ofono_error_failed(msg);
+
+ return NULL;
}
static DBusMessage *smart_messaging_send_vcal(DBusConnection *conn,