1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <time.h> 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <sstream> 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/stringencode.h" 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/examples/call/presenceouttask.h" 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmpp/constants.h" 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmpp/xmppclient.h" 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace buzz { 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmppReturnStatus 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPresenceOutTask::Send(const Status & s) { 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (GetState() != STATE_INIT && GetState() != STATE_START) 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return XMPP_RETURN_BADSTATE; 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch QueueStanza(TranslateStatus(s)); 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return XMPP_RETURN_OK; 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmppReturnStatus 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPresenceOutTask::SendDirected(const Jid & j, const Status & s) { 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (GetState() != STATE_INIT && GetState() != STATE_START) 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return XMPP_RETURN_BADSTATE; 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmlElement * presence = TranslateStatus(s); 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch presence->AddAttr(QN_TO, j.Str()); 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch QueueStanza(presence); 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return XMPP_RETURN_OK; 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmppReturnStatus PresenceOutTask::SendProbe(const Jid & jid) { 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (GetState() != STATE_INIT && GetState() != STATE_START) 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return XMPP_RETURN_BADSTATE; 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmlElement * presence = new XmlElement(QN_PRESENCE); 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch presence->AddAttr(QN_TO, jid.Str()); 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch presence->AddAttr(QN_TYPE, "probe"); 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch QueueStanza(presence); 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return XMPP_RETURN_OK; 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochint 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPresenceOutTask::ProcessStart() { 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const XmlElement * stanza = NextStanza(); 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (stanza == NULL) 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return STATE_BLOCKED; 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (SendStanza(stanza) != XMPP_RETURN_OK) 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return STATE_ERROR; 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return STATE_START; 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochXmlElement * 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen MurdochPresenceOutTask::TranslateStatus(const Status & s) { 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch XmlElement * result = new XmlElement(QN_PRESENCE); 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (!s.available()) { 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddAttr(QN_TYPE, STR_UNAVAILABLE); 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch else { 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (s.show() != Status::SHOW_ONLINE && s.show() != Status::SHOW_OFFLINE) { 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddElement(new XmlElement(QN_SHOW)); 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch switch (s.show()) { 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch default: 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddText(STR_SHOW_AWAY, 1); 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case Status::SHOW_XA: 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddText(STR_SHOW_XA, 1); 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case Status::SHOW_DND: 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddText(STR_SHOW_DND, 1); 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch case Status::SHOW_CHAT: 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddText(STR_SHOW_CHAT, 1); 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch break; 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddElement(new XmlElement(QN_STATUS)); 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddText(s.status(), 1); 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string pri; 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::ToString(s.priority(), &pri); 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddElement(new XmlElement(QN_PRIORITY)); 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddText(pri, 1); 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (s.know_capabilities() && s.is_google_client()) { 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddElement(new XmlElement(QN_CAPS_C, true)); 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddAttr(QN_NODE, GOOGLE_CLIENT_NODE, 1); 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddAttr(QN_VER, s.version(), 1); 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string caps; 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch caps.append(s.phone_capability() ? "voice-v1" : ""); 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch caps.append(s.pmuc_capability() ? " pmuc-v1" : ""); 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch caps.append(s.video_capability() ? " video-v1" : ""); 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch caps.append(s.camera_capability() ? " camera-v1" : ""); 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddAttr(QN_EXT, caps, 1); 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Put the delay mark on the presence according to JEP-0091 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch { 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddElement(new XmlElement(kQnDelayX, true)); 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // This here is why we *love* the C runtime 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch time_t current_time_seconds; 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch time(¤t_time_seconds); 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch struct tm* current_time = gmtime(¤t_time_seconds); 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch char output[256]; 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch strftime(output, ARRAY_SIZE(output), "%Y%m%dT%H:%M:%S", current_time); 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch result->AddAttr(kQnStamp, output, 1); 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return result; 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 148