Index: webrtc/libjingle/xmpp/iqtask.cc |
diff --git a/webrtc/libjingle/xmpp/iqtask.cc b/webrtc/libjingle/xmpp/iqtask.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a7a41ee51913e73123d400ba490e04bc2e5bc2bc |
--- /dev/null |
+++ b/webrtc/libjingle/xmpp/iqtask.cc |
@@ -0,0 +1,69 @@ |
+/* |
+ * Copyright 2011 The WebRTC Project Authors. All rights reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#include "webrtc/libjingle/xmpp/iqtask.h" |
+ |
+#include "webrtc/libjingle/xmpp/constants.h" |
+#include "webrtc/libjingle/xmpp/xmppclient.h" |
+ |
+namespace buzz { |
+ |
+static const int kDefaultIqTimeoutSecs = 15; |
+ |
+IqTask::IqTask(XmppTaskParentInterface* parent, |
+ const std::string& verb, |
+ const buzz::Jid& to, |
+ buzz::XmlElement* el) |
+ : buzz::XmppTask(parent, buzz::XmppEngine::HL_SINGLE), |
+ to_(to), |
+ stanza_(MakeIq(verb, to_, task_id())) { |
+ stanza_->AddElement(el); |
+ set_timeout_seconds(kDefaultIqTimeoutSecs); |
+} |
+ |
+int IqTask::ProcessStart() { |
+ buzz::XmppReturnStatus ret = SendStanza(stanza_.get()); |
+ // TODO: HandleError(NULL) if SendStanza fails? |
+ return (ret == buzz::XMPP_RETURN_OK) ? STATE_RESPONSE : STATE_ERROR; |
+} |
+ |
+bool IqTask::HandleStanza(const buzz::XmlElement* stanza) { |
+ if (!MatchResponseIq(stanza, to_, task_id())) |
+ return false; |
+ |
+ if (stanza->Attr(buzz::QN_TYPE) != buzz::STR_RESULT && |
+ stanza->Attr(buzz::QN_TYPE) != buzz::STR_ERROR) { |
+ return false; |
+ } |
+ |
+ QueueStanza(stanza); |
+ return true; |
+} |
+ |
+int IqTask::ProcessResponse() { |
+ const buzz::XmlElement* stanza = NextStanza(); |
+ if (stanza == NULL) |
+ return STATE_BLOCKED; |
+ |
+ bool success = (stanza->Attr(buzz::QN_TYPE) == buzz::STR_RESULT); |
+ if (success) { |
+ HandleResult(stanza); |
+ } else { |
+ SignalError(this, stanza->FirstNamed(QN_ERROR)); |
+ } |
+ return STATE_DONE; |
+} |
+ |
+int IqTask::OnTimeout() { |
+ SignalError(this, NULL); |
+ return XmppTask::OnTimeout(); |
+} |
+ |
+} // namespace buzz |