1 /* 2 * libjingle 3 * Copyright 2004--2005, Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 // VoicemailJidRequester wraps the requesting of voicemail jids for a user. 29 // 30 // To request a voicemail jid, we first set off a query to the user's bare jid 31 // that looks like this: 32 // 33 // <iq type='get' 34 // from='foo (at) gmail.com/asdf' 35 // to='bar (at) google.com' 36 // id='1234'> 37 // <query xmlns=' http://jabber.org/protocol/disco#items' 38 // node='voicemail '/> 39 // </iq> 40 // 41 // If foo (at) gmail.com's server supports voicemail, it'll return this, and forward 42 // the jid up to phoneapp. We do not do the second query. 43 // 44 // <iq type='result' 45 // from='foo (at) google.com' 46 // to='bar (at) google.com/asdf' 47 // id='1234'> 48 // <query xmlns=' http://jabber.org/protocol/disco#items ' 49 // node=' voicemail '> 50 // <item jid='bar (at) google.com/voicemail '/> 51 // </query> 52 // </iq> 53 // 54 // If we get an error, we spin off a new request: 55 // 56 // <iq type='get' 57 // from='foo (at) google.com/asdf' 58 // to='foo (at) google.com' 59 // id='1234'> 60 // <query xmlns=' http://jabber.org/protocol/disco#items' 61 // node='outgoingvoicemail '/> 62 // </iq> 63 // 64 // If both of these return errors, we then forward the request to phoneapp. 65 66 #ifndef TALK_EXAMPLES_CALL_VOICEMAILJIDREQUESTER_H_ 67 #define TALK_EXAMPLES_CALL_VOICEMAILJIDREQUESTER_H_ 68 69 #include "talk/xmpp/xmpptask.h" 70 71 namespace buzz { 72 73 class Task; 74 75 class VoicemailJidRequester : public sigslot::has_slots<>, 76 public talk_base::Task { 77 public: 78 VoicemailJidRequester(talk_base::Task* parent, const Jid& their_jid, const Jid& my_jid); 79 80 // Provides the target jid and the voicemail to reach it 81 sigslot::signal2<const Jid&, const Jid&> SignalGotVoicemailJid; 82 sigslot::signal1<const Jid&> SignalVoicemailJidError; 83 84 virtual int ProcessStart(); 85 protected: 86 87 virtual int Process(int state); 88 89 private: 90 // The first query (to node='voicemail' has returned an error) - we now spin 91 // off a request to node='outgoingvoicemail') 92 void OnFirstVoicemailJidError(buzz::Jid jid, const XmlElement* xml_element); 93 94 // The first query (to node='voicemail' has returned a successfully) 95 void OnFirstVoicemailJidSuccess(buzz::Jid jid, const XmlElement* xml_element); 96 97 // The second query (to node='outgoingvoicemail') has returned an error - 98 // nothing we can do now, just fire our error signal 99 void OnSecondVoicemailJidError(buzz::Jid jid, const XmlElement* xml_element); 100 101 // The second query (to node='outgoingvoicemail') has returned a successfully 102 void OnSecondVoicemailJidSuccess(buzz::Jid jid, 103 const XmlElement* xml_element); 104 105 // Parse the xml, fire SignalGotVoicemail jid if it was valid (and had a jid) 106 // and return true if it was a valid xml. 107 bool ProcessVoicemailXml(const XmlElement* xml_element); 108 109 // Send a query to your own jid to get the voicemail jid. This is used after 110 // the first query fails. 111 void StartSecondQuery(); 112 113 talk_base::Task* parent_; 114 115 Jid their_jid_; 116 117 // Your own jid (not the other user's) 118 Jid my_jid_; 119 120 // A flag indicating whether or not we're done with the query so that we can 121 // set the state correctly in Process(int state) 122 bool done_with_query_; 123 }; 124 } 125 126 #endif // TALK_EXAMPLES_CALL_VOICEMAILJIDREQUESTER_H_ 127