summaryrefslogtreecommitdiff
path: root/chromium/jingle/notifier/listener/push_notifications_send_update_task.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/jingle/notifier/listener/push_notifications_send_update_task.cc')
-rw-r--r--chromium/jingle/notifier/listener/push_notifications_send_update_task.cc94
1 files changed, 94 insertions, 0 deletions
diff --git a/chromium/jingle/notifier/listener/push_notifications_send_update_task.cc b/chromium/jingle/notifier/listener/push_notifications_send_update_task.cc
new file mode 100644
index 00000000000..4e0c12782ad
--- /dev/null
+++ b/chromium/jingle/notifier/listener/push_notifications_send_update_task.cc
@@ -0,0 +1,94 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "jingle/notifier/listener/push_notifications_send_update_task.h"
+
+#include <string>
+
+#include "base/base64.h"
+#include "base/logging.h"
+#include "base/memory/scoped_ptr.h"
+#include "jingle/notifier/listener/notification_constants.h"
+#include "jingle/notifier/listener/xml_element_util.h"
+#include "talk/xmllite/qname.h"
+#include "talk/xmllite/xmlelement.h"
+#include "talk/xmpp/constants.h"
+#include "talk/xmpp/jid.h"
+#include "talk/xmpp/xmppclient.h"
+
+namespace notifier {
+
+PushNotificationsSendUpdateTask::PushNotificationsSendUpdateTask(
+ buzz::XmppTaskParentInterface* parent, const Notification& notification)
+ : XmppTask(parent), notification_(notification) {}
+
+PushNotificationsSendUpdateTask::~PushNotificationsSendUpdateTask() {}
+
+int PushNotificationsSendUpdateTask::ProcessStart() {
+ scoped_ptr<buzz::XmlElement> stanza(
+ MakeUpdateMessage(notification_,
+ GetClient()->jid().BareJid()));
+ DVLOG(1) << "Sending notification " << notification_.ToString()
+ << " as stanza " << XmlElementToString(*stanza);
+ if (SendStanza(stanza.get()) != buzz::XMPP_RETURN_OK) {
+ DLOG(WARNING) << "Could not send stanza " << XmlElementToString(*stanza);
+ }
+ return STATE_DONE;
+}
+
+buzz::XmlElement* PushNotificationsSendUpdateTask::MakeUpdateMessage(
+ const Notification& notification,
+ const buzz::Jid& to_jid_bare) {
+ DCHECK(to_jid_bare.IsBare());
+ const buzz::QName kQnPush(kPushNotificationsNamespace, "push");
+ const buzz::QName kQnChannel(buzz::STR_EMPTY, "channel");
+ const buzz::QName kQnData(kPushNotificationsNamespace, "data");
+ const buzz::QName kQnRecipient(kPushNotificationsNamespace, "recipient");
+
+ // Create our update stanza. The message is constructed as:
+ // <message from='{full jid}' to='{bare jid}' type='headline'>
+ // <push xmlns='google:push' channel='{channel}'>
+ // [<recipient to='{bare jid}'>{base-64 encoded data}</data>]*
+ // <data>{base-64 encoded data}</data>
+ // </push>
+ // </message>
+
+ buzz::XmlElement* message = new buzz::XmlElement(buzz::QN_MESSAGE);
+ message->AddAttr(buzz::QN_TO, to_jid_bare.Str());
+ message->AddAttr(buzz::QN_TYPE, "headline");
+
+ buzz::XmlElement* push = new buzz::XmlElement(kQnPush, true);
+ push->AddAttr(kQnChannel, notification.channel);
+ message->AddElement(push);
+
+ const RecipientList& recipients = notification.recipients;
+ for (size_t i = 0; i < recipients.size(); ++i) {
+ const Recipient& recipient = recipients[i];
+ buzz::XmlElement* recipient_element =
+ new buzz::XmlElement(kQnRecipient, true);
+ push->AddElement(recipient_element);
+ recipient_element->AddAttr(buzz::QN_TO, recipient.to);
+ if (!recipient.user_specific_data.empty()) {
+ std::string base64_data;
+ if (!base::Base64Encode(recipient.user_specific_data, &base64_data)) {
+ DLOG(WARNING) << "Could not encode data "
+ << recipient.user_specific_data;
+ } else {
+ recipient_element->SetBodyText(base64_data);
+ }
+ }
+ }
+
+ buzz::XmlElement* data = new buzz::XmlElement(kQnData, true);
+ std::string base64_data;
+ if (!base::Base64Encode(notification.data, &base64_data)) {
+ DLOG(WARNING) << "Could not encode data " << notification.data;
+ }
+ data->SetBodyText(base64_data);
+ push->AddElement(data);
+
+ return message;
+}
+
+} // namespace notifier