From 41de1ce748d969a65bbefc6987c98d4e0a5010a3 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Fri, 19 Sep 2014 19:09:07 +0000 Subject: merge #2 git-svn-id: http://svn.miranda-ng.org/main/trunk@10527 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp | 625 ++++++++------------- 1 file changed, 225 insertions(+), 400 deletions(-) (limited to 'protocols/WhatsApp/src/WhatsAPI++') diff --git a/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp b/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp index 9caf489f97..f819ff8737 100644 --- a/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp +++ b/protocols/WhatsApp/src/WhatsAPI++/WAConnection.cpp @@ -251,264 +251,25 @@ const char* WAConnection::dictionary[] = { "WAUTH-1" }; - -//const char* WAConnection::dictionary[] = { -// "", -// "", -// "", -// "", -// "", -// "1", -// "1.0", -// "ack", -// "action", -// "active", -// "add", -// "all", -// "allow", -// "apple", -// "audio", -// "auth", -// "author", -// "available", -// "bad-request", -// "base64", -// "Bell.caf", -// "bind", -// "body", -// "Boing.caf", -// "cancel", -// "category", -// "challenge", -// "chat", -// "clean", -// "code", -// "composing", -// "config", -// "conflict", -// "contacts", -// "create", -// "creation", -// "default", -// "delay", -// "delete", -// "delivered", -// "deny", -// "DIGEST-MD5", -// "DIGEST-MD5-1", -// "dirty", -// "en", -// "enable", -// "encoding", -// "error", -// "expiration", -// "expired", -// "failure", -// "false", -// "favorites", -// "feature", -// "field", -// "free", -// "from", -// "g.us", -// "get", -// "Glass.caf", -// "google", -// "group", -// "groups", -// "g_sound", -// "Harp.caf", -// "http://etherx.jabber.org/streams", -// "http://jabber.org/protocol/chatstates", -// "id", -// "image", -// "img", -// "inactive", -// "internal-server-error", -// "iq", -// "item", -// "item-not-found", -// "jabber:client", -// "jabber:iq:last", -// "jabber:iq:privacy", -// "jabber:x:delay", -// "jabber:x:event", -// "jid", -// "jid-malformed", -// "kind", -// "leave", -// "leave-all", -// "list", -// "location", -// "max_groups", -// "max_participants", -// "max_subject", -// "mechanism", -// "mechanisms", -// "media", -// "message", -// "message_acks", -// "missing", -// "modify", -// "name", -// "not-acceptable", -// "not-allowed", -// "not-authorized", -// "notify", -// "Offline Storage", -// "order", -// "owner", -// "owning", -// "paid", -// "participant", -// "participants", -// "participating", -// "particpants", -// "paused", -// "picture", -// "ping", -// "PLAIN", -// "platform", -// "presence", -// "preview", -// "probe", -// "prop", -// "props", -// "p_o", -// "p_t", -// "query", -// "raw", -// "receipt", -// "receipt_acks", -// "received", -// "relay", -// "remove", -// "Replaced by new connection", -// "request", -// "resource", -// "resource-constraint", -// "response", -// "result", -// "retry", -// "rim", -// "s.whatsapp.net", -// "seconds", -// "server", -// "session", -// "set", -// "show", -// "sid", -// "sound", -// "stamp", -// "starttls", -// "status", -// "stream:error", -// "stream:features", -// "subject", -// "subscribe", -// "success", -// "system-shutdown", -// "s_o", -// "s_t", -// "t", -// "TimePassing.caf", -// "timestamp", -// "to", -// "Tri-tone.caf", -// "type", -// "unavailable", -// "uri", -// "url", -// "urn:ietf:params:xml:ns:xmpp-bind", -// "urn:ietf:params:xml:ns:xmpp-sasl", -// "urn:ietf:params:xml:ns:xmpp-session", -// "urn:ietf:params:xml:ns:xmpp-stanzas", -// "urn:ietf:params:xml:ns:xmpp-streams", -// "urn:xmpp:delay", -// "urn:xmpp:ping", -// "urn:xmpp:receipts", -// "urn:xmpp:whatsapp", -// "urn:xmpp:whatsapp:dirty", -// "urn:xmpp:whatsapp:mms", -// "urn:xmpp:whatsapp:push", -// "value", -// "vcard", -// "version", -// "video", -// "w", -// "w:g", -// "w:p:r", -// "wait", -// "x", -// "xml-not-well-formed", -// "xml:lang", -// "xmlns", -// "xmlns:stream", -// "Xylophone.caf", -// "account", -// "digest", -// "g_notify", -// "method", -// "password", -// "registration", -// "stat", -// "text", -// "user", -// "username", -// "event", -// "latitude", -// "longitude", -// "true", -// "after", -// "before", -// "broadcast", -// "count", -// "features", -// "first", -// "index", -// "invalid-mechanism", -// "l$dict", -// "max", -// "offline", -// "proceed", -// "required", -// "sync", -// "elapsed", -// "ip", -// "microsoft", -// "mute", -// "nokia", -// "off", -// "pin", -// "pop_mean_time", -// "pop_plus_minus", -// "port", -// "reason", -// "server-error", -// "silent", -// "timeout", -// "lc", -// "lg", -// "bad-protocol", -// "none", -// "remote-server-timeout", -// "service-unavailable", -// "w:p", -// "w:profile:picture", -// "notification", -// "", -// "", -// "", -// "", -// "", -// "XXX" -//}; - -WAConnection::WAConnection(IMutex* mutex, WAListener* event_handler, WAGroupListener* group_event_handler) { +WAConnection::WAConnection(IMutex* mutex, WAListener* event_handler, WAGroupListener* group_event_handler) +{ this->init(event_handler, group_event_handler, mutex); } -void WAConnection::init(WAListener* event_handler, WAGroupListener* group_event_handler, IMutex* mutex) { +WAConnection::~WAConnection() +{ + delete this->inputKey; + delete this->outputKey; + delete this->in; + delete this->out; + std::map::iterator it; + for (it = this->pending_server_requests.begin(); it != this->pending_server_requests.end(); it++) { + delete it->second; + } +} + +void WAConnection::init(WAListener* event_handler, WAGroupListener* group_event_handler, IMutex* mutex) +{ this->login = NULL; this->event_handler = event_handler; this->group_event_handler = group_event_handler; @@ -529,7 +290,8 @@ void WAConnection::init(WAListener* event_handler, WAGroupListener* group_event_ this->mutex = mutex; } -void WAConnection::setLogin(WALogin* login) { +void WAConnection::setLogin(WALogin* login) +{ this->login = login; if (login->expire_date != 0L) { @@ -546,11 +308,13 @@ void WAConnection::setLogin(WALogin* login) { this->out = login->getTreeNodeWriter(); } -WALogin* WAConnection::getLogin() { +WALogin* WAConnection::getLogin() +{ return this->login; } -void WAConnection::sendMessageWithMedia(FMessage* message) throw (WAException) { +void WAConnection::sendMessageWithMedia(FMessage* message) throw (WAException) +{ _LOGDATA("Send message with media %s %d", message->media_name.c_str(), message->media_size); _LOGDATA("media-url:%s", message->media_url.c_str()); if (message->media_wa_type == FMessage::WA_TYPE_SYSTEM) @@ -562,12 +326,14 @@ void WAConnection::sendMessageWithMedia(FMessage* message) throw (WAException) if (message->media_wa_type == FMessage::WA_TYPE_LOCATION) { (*attribs)["latitude"] = Utilities::doubleToStr(message->latitude); (*attribs)["longitude"] = Utilities::doubleToStr(message->longitude); - } else { + } + else { if (message->media_wa_type != FMessage::WA_TYPE_CONTACT && !message->media_name.empty() && !message->media_url.empty() && message->media_size > 0L) { (*attribs)["file"] = message->media_name; (*attribs)["size"] = Utilities::intToStr((int)message->media_size); (*attribs)["url"] = message->media_url; - } else { + } + else { (*attribs)["file"] = message->media_name; (*attribs)["size"] = Utilities::intToStr((int)message->media_size); (*attribs)["url"] = message->media_url; @@ -581,7 +347,8 @@ void WAConnection::sendMessageWithMedia(FMessage* message) throw (WAException) (*attribs2)["name"] = message->media_name; ProtocolTreeNode* vcardNode = new ProtocolTreeNode("vcard", attribs2, new std::vector(message->data.begin(), message->data.end())); mediaNode = new ProtocolTreeNode("media", attribs, vcardNode); - } else { + } + else { (*attribs)["encoding"] = "text"; mediaNode = new ProtocolTreeNode("media", attribs, new std::vector(message->data.begin(), message->data.end()), NULL); } @@ -591,14 +358,16 @@ void WAConnection::sendMessageWithMedia(FMessage* message) throw (WAException) delete root; } -void WAConnection::sendMessageWithBody(FMessage* message) throw (WAException) { +void WAConnection::sendMessageWithBody(FMessage* message) throw (WAException) +{ ProtocolTreeNode* bodyNode = new ProtocolTreeNode("body", NULL, new std::vector(message->data.begin(), message->data.end())); ProtocolTreeNode* root = WAConnection::getMessageNode(message, bodyNode); this->out->write(root); delete root; } -ProtocolTreeNode* WAConnection::getMessageNode(FMessage* message, ProtocolTreeNode* child) { +ProtocolTreeNode* WAConnection::getMessageNode(FMessage* message, ProtocolTreeNode* child) +{ ProtocolTreeNode* requestNode = NULL; ProtocolTreeNode* serverNode = new ProtocolTreeNode("server", NULL); std::map* attrib = new std::map(); @@ -606,7 +375,7 @@ ProtocolTreeNode* WAConnection::getMessageNode(FMessage* message, ProtocolTreeNo std::vector* children = new std::vector(1); (*children)[0] = serverNode; ProtocolTreeNode* xNode = new ProtocolTreeNode("x", attrib, NULL, children); - int childCount = (requestNode == NULL? 0 : 1) + 2; + int childCount = (requestNode == NULL ? 0 : 1) + 2; std::vector* messageChildren = new std::vector(childCount); int i = 0; if (requestNode != NULL) { @@ -626,31 +395,21 @@ ProtocolTreeNode* WAConnection::getMessageNode(FMessage* message, ProtocolTreeNo return new ProtocolTreeNode("message", attrib2, NULL, messageChildren); } -void WAConnection::sendMessage(FMessage* message) throw(WAException) { +void WAConnection::sendMessage(FMessage* message) throw(WAException) +{ if (message->media_wa_type != 0) sendMessageWithMedia(message); else sendMessageWithBody(message); } - -WAConnection::~WAConnection() { - delete this->inputKey; - delete this->outputKey; - delete this->in; - delete this->out; - std::map::iterator it; - for (it = this->pending_server_requests.begin(); it != this->pending_server_requests.end(); it++) { - delete it->second; - } -} - - -void WAConnection::setVerboseId(bool b) { +void WAConnection::setVerboseId(bool b) +{ this->verbose = b; } -void WAConnection::sendAvailableForChat() throw(WAException) { +void WAConnection::sendAvailableForChat() throw(WAException) +{ std::map* attribs = new std::map(); (*attribs)["name"] = this->login->push_name; ProtocolTreeNode *presenceNode = new ProtocolTreeNode("presence", attribs); @@ -658,12 +417,14 @@ void WAConnection::sendAvailableForChat() throw(WAException) { delete presenceNode; } -bool WAConnection::read() throw(WAException) { +bool WAConnection::read() throw(WAException) +{ ProtocolTreeNode* node; try { node = this->in->nextTree(); this->lastTreeRead = time(NULL); - } catch (exception& ex) { + } + catch (exception& ex) { throw WAException(ex.what(), WAException::CORRUPT_STREAM_EX, 0); } @@ -673,7 +434,7 @@ bool WAConnection::read() throw(WAException) { if (ProtocolTreeNode::tagEquals(node, "iq")) { std::string* type = node->getAttributeValue("type"); - std::string* id = node->getAttributeValue("id"); + std::string* id = node->getAttributeValue("id"); std::string* from = node->getAttributeValue("from"); std::string f; if (from == NULL) @@ -689,19 +450,22 @@ bool WAConnection::read() throw(WAException) { throw WAException("missing 'id' attribute in iq stanza", WAException::CORRUPT_STREAM_EX, 0); std::map::iterator it = this->pending_server_requests.find(*id); - if (it!= this->pending_server_requests.end()) { + if (it != this->pending_server_requests.end()) { it->second->parse(node, f); delete it->second; this->pending_server_requests.erase(*id); - } else if (id->compare(0, this->login->user.size(), this->login->user) == 0) { + } + else if (id->compare(0, this->login->user.size(), this->login->user) == 0) { ProtocolTreeNode* accountNode = node->getChild(0); ProtocolTreeNode::require(accountNode, "account"); std::string* kind = accountNode->getAttributeValue("kind"); if ((kind != NULL) && (kind->compare("paid") == 0)) { this->account_kind = 1; - } else if ((kind != NULL) && (kind->compare("free") == 0)) { + } + else if ((kind != NULL) && (kind->compare("free") == 0)) { this->account_kind = 0; - } else + } + else this->account_kind = -1; std::string* expiration = accountNode->getAttributeValue("expiration"); if (expiration == NULL) { @@ -713,29 +477,33 @@ bool WAConnection::read() throw(WAException) { if (this->event_handler != NULL) this->event_handler->onAccountChange(this->account_kind, this->expire_date); } - } else if (type->compare("error") == 0) { + } + else if (type->compare("error") == 0) { std::map::iterator it = this->pending_server_requests.find(*id); - if (it!= this->pending_server_requests.end()) { + if (it != this->pending_server_requests.end()) { it->second->error(node); delete it->second; this->pending_server_requests.erase(*id); } - } else if (type->compare("get") == 0) { + } + else if (type->compare("get") == 0) { ProtocolTreeNode* childNode = node->getChild(0); if (ProtocolTreeNode::tagEquals(childNode, "ping")) { if (this->event_handler != NULL) this->event_handler->onPing(*id); - } else if (ProtocolTreeNode::tagEquals(childNode, "query") && (from != NULL)? false : // (childNode->getAttributeValue("xmlns") != NULL) && ((*childNode->getAttributeValue("xmlns")).compare("http://jabber.org/protocol/disco#info") == 0) : - (ProtocolTreeNode::tagEquals(childNode, "relay")) && (from != NULL)) { + } + else if (ProtocolTreeNode::tagEquals(childNode, "query") && (from != NULL) ? false : // (childNode->getAttributeValue("xmlns") != NULL) && ((*childNode->getAttributeValue("xmlns")).compare("http://jabber.org/protocol/disco#info") == 0) : + (ProtocolTreeNode::tagEquals(childNode, "relay")) && (from != NULL)) { std::string* pin = childNode->getAttributeValue("pin"); std::string* timeoutString = childNode->getAttributeValue("timeout"); int timeoutSeconds; - timeoutSeconds = timeoutString == NULL? 0 : atoi(timeoutString->c_str()); + timeoutSeconds = timeoutString == NULL ? 0 : atoi(timeoutString->c_str()); if (pin != NULL) if (this->event_handler != NULL) this->event_handler->onRelayRequest(*pin, timeoutSeconds, *id); } - } else if (type->compare("set") == 0) { + } + else if (type->compare("set") == 0) { ProtocolTreeNode* childNode = node->getChild(0); if (ProtocolTreeNode::tagEquals(childNode, "query")) { std::string* xmlns = childNode->getAttributeValue("xmlns"); @@ -751,9 +519,11 @@ bool WAConnection::read() throw(WAException) { delete itemNodes; } } - } else + } + else throw WAException("unknown iq type attribute: " + *type, WAException::CORRUPT_STREAM_EX, 0); - } else if (ProtocolTreeNode::tagEquals(node, "presence")) { + } + else if (ProtocolTreeNode::tagEquals(node, "presence")) { std::string* xmlns = node->getAttributeValue("xmlns"); std::string* from = node->getAttributeValue("from"); if (((xmlns == NULL) || (xmlns->compare("urn:xmpp") == 0)) && (from != NULL)) { @@ -761,28 +531,33 @@ bool WAConnection::read() throw(WAException) { if ((type != NULL) && (type->compare("unavailable") == 0)) { if (this->event_handler != NULL) this->event_handler->onAvailable(*from, false); - } else if ((type == NULL) || (type->compare("available") == 0)) { + } + else if ((type == NULL) || (type->compare("available") == 0)) { if (this->event_handler != NULL) this->event_handler->onAvailable(*from, true); } - } else if ((xmlns->compare("w") == 0) && (from != NULL)) { + } + else if ((xmlns->compare("w") == 0) && (from != NULL)) { std::string* add = node->getAttributeValue("add"); std::string* remove = node->getAttributeValue("remove"); std::string* status = node->getAttributeValue("status"); if (add != NULL) { if (this->group_event_handler != NULL) this->group_event_handler->onGroupAddUser(*from, *add); - } else if (remove != NULL) { + } + else if (remove != NULL) { if (this->group_event_handler != NULL) this->group_event_handler->onGroupRemoveUser(*from, *remove); - } else if ((status != NULL) && (status->compare("dirty") == 0)) { + } + else if ((status != NULL) && (status->compare("dirty") == 0)) { std::map* categories = parseCategories(node); if (this->event_handler != NULL) this->event_handler->onDirty(*categories); delete categories; } } - } else if (ProtocolTreeNode::tagEquals(node, "message")) { + } + else if (ProtocolTreeNode::tagEquals(node, "message")) { parseMessageInitialTagAlreadyChecked(node); } @@ -790,11 +565,13 @@ bool WAConnection::read() throw(WAException) { return true; } -void WAConnection::sendNop() throw(WAException) { +void WAConnection::sendNop() throw(WAException) +{ this->out->write(NULL); } -void WAConnection::sendPing() throw(WAException) { +void WAConnection::sendPing() throw(WAException) +{ std::string id = makeId("ping_"); this->pending_server_requests[id] = new IqResultPingHandler(this); @@ -811,7 +588,8 @@ void WAConnection::sendPing() throw(WAException) { delete iqNode; } -void WAConnection::sendPong(const std::string& id) throw(WAException) { +void WAConnection::sendPong(const std::string& id) throw(WAException) +{ std::map* attribs = new std::map(); (*attribs)["type"] = "result"; (*attribs)["to"] = this->login->domain; @@ -821,7 +599,8 @@ void WAConnection::sendPong(const std::string& id) throw(WAException) { delete iqNode; } -void WAConnection::sendComposing(const std::string& to) throw(WAException) { +void WAConnection::sendComposing(const std::string& to) throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["xmlns"] = "http://jabber.org/protocol/chatstates"; ProtocolTreeNode* composingNode = new ProtocolTreeNode("composing", attribs1); @@ -837,7 +616,8 @@ void WAConnection::sendComposing(const std::string& to) throw(WAException) { } -void WAConnection::sendActive() throw(WAException) { +void WAConnection::sendActive() throw(WAException) +{ std::map* attribs = new std::map(); (*attribs)["type"] = "active"; ProtocolTreeNode* presenceNode = new ProtocolTreeNode("presence", attribs); @@ -847,7 +627,8 @@ void WAConnection::sendActive() throw(WAException) { delete presenceNode; } -void WAConnection::sendInactive() throw(WAException) { +void WAConnection::sendInactive() throw(WAException) +{ std::map* attribs = new std::map(); (*attribs)["type"] = "inactive"; ProtocolTreeNode* presenceNode = new ProtocolTreeNode("presence", attribs); @@ -857,7 +638,8 @@ void WAConnection::sendInactive() throw(WAException) { delete presenceNode; } -void WAConnection::sendPaused(const std::string& to) throw(WAException) { +void WAConnection::sendPaused(const std::string& to) throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["xmlns"] = "http://jabber.org/protocol/chatstates"; ProtocolTreeNode* pausedNode = new ProtocolTreeNode("paused", attribs1); @@ -872,7 +654,8 @@ void WAConnection::sendPaused(const std::string& to) throw(WAException) { delete messageNode; } -void WAConnection::sendSubjectReceived(const std::string& to, const std::string& id)throw(WAException) { +void WAConnection::sendSubjectReceived(const std::string& to, const std::string& id)throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["xmlns"] = "urn:xmpp:receipts"; ProtocolTreeNode* receivedNode = new ProtocolTreeNode("received", attribs1); @@ -884,7 +667,8 @@ void WAConnection::sendSubjectReceived(const std::string& to, const std::string& delete messageNode; } -ProtocolTreeNode* WAConnection::getSubjectMessage(const std::string& to, const std::string& id, ProtocolTreeNode* child) throw (WAException) { +ProtocolTreeNode* WAConnection::getSubjectMessage(const std::string& to, const std::string& id, ProtocolTreeNode* child) throw (WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["to"] = to; (*attribs1)["type"] = "subject"; @@ -894,7 +678,8 @@ ProtocolTreeNode* WAConnection::getSubjectMessage(const std::string& to, const s return messageNode; } -void WAConnection::sendMessageReceived(FMessage* message) throw(WAException) { +void WAConnection::sendMessageReceived(FMessage* message) throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["xmlns"] = "urn:xmpp:receipts"; ProtocolTreeNode* receivedNode = new ProtocolTreeNode("received", attribs1); @@ -911,19 +696,22 @@ void WAConnection::sendMessageReceived(FMessage* message) throw(WAException) { } void WAConnection::sendDeliveredReceiptAck(const std::string& to, - const std::string& id) throw(WAException) { + const std::string& id) throw(WAException) +{ ProtocolTreeNode *root = getReceiptAck(to, id, "delivered"); this->out->write(root); delete root; } -void WAConnection::sendVisibleReceiptAck(const std::string& to, const std::string& id) throw (WAException) { +void WAConnection::sendVisibleReceiptAck(const std::string& to, const std::string& id) throw (WAException) +{ ProtocolTreeNode *root = getReceiptAck(to, id, "visible"); this->out->write(root); delete root; } -void WAConnection::sendPresenceSubscriptionRequest(const std::string& to) throw(WAException) { +void WAConnection::sendPresenceSubscriptionRequest(const std::string& to) throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["type"] = "subscribe"; (*attribs1)["to"] = to; @@ -932,10 +720,11 @@ void WAConnection::sendPresenceSubscriptionRequest(const std::string& to) throw( delete presenceNode; } -void WAConnection::sendClientConfig(const std::string& sound, const std::string& pushID, bool preview, const std::string& platform) throw(WAException) { +void WAConnection::sendClientConfig(const std::string& sound, const std::string& pushID, bool preview, const std::string& platform) throw(WAException) +{ std::map* attribs1 = new std::map(); - (*attribs1)["xmlns"] ="urn:xmpp:whatsapp:push"; - (*attribs1)["sound"] =sound; + (*attribs1)["xmlns"] = "urn:xmpp:whatsapp:push"; + (*attribs1)["sound"] = sound; (*attribs1)["id"] = pushID; (*attribs1)["preview"] = preview ? "1" : "0"; (*attribs1)["platform"] = platform; @@ -957,17 +746,18 @@ void WAConnection::sendClientConfig(const std::string& sound, const std::string } -void WAConnection::sendClientConfig(const std::string& pushID, bool preview, const std::string& platform, bool defaultSettings, bool groupSettings, const std::vector& groups) throw(WAException) { +void WAConnection::sendClientConfig(const std::string& pushID, bool preview, const std::string& platform, bool defaultSettings, bool groupSettings, const std::vector& groups) throw(WAException) +{ std::map* attribs1 = new std::map(); - (*attribs1)["xmlns"] ="urn:xmpp:whatsapp:push"; + (*attribs1)["xmlns"] = "urn:xmpp:whatsapp:push"; (*attribs1)["id"] = pushID; (*attribs1)["lg"] = "en"; (*attribs1)["lc"] = "US"; (*attribs1)["clear"] = "0"; (*attribs1)["preview"] = preview ? "1" : "0"; (*attribs1)["platform"] = platform; - (*attribs1)["default"] = defaultSettings? "1": "0"; - (*attribs1)["groups"] = groupSettings? "1" : "0"; + (*attribs1)["default"] = defaultSettings ? "1" : "0"; + (*attribs1)["groups"] = groupSettings ? "1" : "0"; ProtocolTreeNode* configNode = new ProtocolTreeNode("config", attribs1, NULL, this->processGroupSettings(groups)); std::string id = makeId("config_"); @@ -981,15 +771,16 @@ void WAConnection::sendClientConfig(const std::string& pushID, bool preview, con delete iqNode; } -std::vector* WAConnection::processGroupSettings(const std::vector& groups) { +std::vector* WAConnection::processGroupSettings(const std::vector& groups) +{ std::vector* result = new std::vector(groups.size()); if (!groups.empty()) { time_t now = time(NULL); for (size_t i = 0; i < groups.size(); i++) { std::map* attribs = new std::map(); (*attribs)["jid"] = groups[i].jid; - (*attribs)["notify"] = (groups[i].enabled? "1": "0"); - (*attribs)["mute"] = Utilities::intToStr( int(groups[i].muteExpiry > now ? (groups[i].muteExpiry - now) : 0)); + (*attribs)["notify"] = (groups[i].enabled ? "1" : "0"); + (*attribs)["mute"] = Utilities::intToStr(int(groups[i].muteExpiry > now ? (groups[i].muteExpiry - now) : 0)); _LOGDATA("mute group %s, %s", (*attribs)["jid"].c_str(), (*attribs)["mute"].c_str()); (*result)[i] = new ProtocolTreeNode("item", attribs); @@ -999,7 +790,8 @@ std::vector* WAConnection::processGroupSettings(const std::ve return result; } -std::string WAConnection::makeId(const std::string& prefix) { +std::string WAConnection::makeId(const std::string& prefix) +{ this->iqid++; std::string id; if (this->verbose) @@ -1010,8 +802,8 @@ std::string WAConnection::makeId(const std::string& prefix) { return id; } - -ProtocolTreeNode* WAConnection::getReceiptAck(const std::string& to, const std::string& id, const std::string& receiptType) throw(WAException) { +ProtocolTreeNode* WAConnection::getReceiptAck(const std::string& to, const std::string& id, const std::string& receiptType) throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["xmlns"] = "urn:xmpp:receipts"; (*attribs1)["type"] = receiptType; @@ -1026,8 +818,9 @@ ProtocolTreeNode* WAConnection::getReceiptAck(const std::string& to, const std:: return messageNode; } -std::map* WAConnection::parseCategories(ProtocolTreeNode* dirtyNode) throw (WAException) { - std::map* categories = new std::map(); +std::map* WAConnection::parseCategories(ProtocolTreeNode* dirtyNode) throw (WAException) +{ + std::map* categories = new std::map(); if (dirtyNode->children != NULL) { for (size_t i = 0; i < dirtyNode->children->size(); i++) { ProtocolTreeNode* childNode = (*dirtyNode->children)[i]; @@ -1042,7 +835,8 @@ std::map* WAConnection::parseCategories(ProtocolTreeNode* dirtyN return categories; } -void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messageNode) throw (WAException){ +void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messageNode) throw (WAException) +{ std::string* id = messageNode->getAttributeValue("id"); std::string* attribute_t = messageNode->getAttributeValue("t"); std::string* from = messageNode->getAttributeValue("from"); @@ -1071,7 +865,8 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag this->event_handler->onMessageError(message, errorCode); delete errorNodes; delete message; - } else if (typeAttribute->compare("subject") == 0) { + } + else if (typeAttribute->compare("subject") == 0) { bool receiptRequested = false; std::vector* requestNodes = messageNode->getAllChildren("request"); for (size_t i = 0; i < requestNodes->size(); i++) { @@ -1082,28 +877,31 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag delete requestNodes; ProtocolTreeNode* bodyNode = messageNode->getChild("body"); - std::string* newSubject = bodyNode == NULL? NULL : bodyNode->getDataAsString(); + std::string* newSubject = bodyNode == NULL ? NULL : bodyNode->getDataAsString(); if ((newSubject != NULL) && (this->group_event_handler != NULL)) this->group_event_handler->onGroupNewSubject(*from, author, *newSubject, atoi(attribute_t->c_str())); if (newSubject != NULL) delete newSubject; if (receiptRequested) sendSubjectReceived(*from, *id); - } else if (typeAttribute->compare("chat") == 0) { + } + else if (typeAttribute->compare("chat") == 0) { FMessage* fmessage = new FMessage(); fmessage->wants_receipt = false; bool duplicate = false; std::vector myVector(0); - std::vector* messageChildren = messageNode->children == NULL? &myVector: messageNode->getAllChildren(); + std::vector* messageChildren = messageNode->children == NULL ? &myVector : messageNode->getAllChildren(); for (size_t i = 0; i < messageChildren->size(); i++) { ProtocolTreeNode* childNode = (*messageChildren)[i]; if (ProtocolTreeNode::tagEquals(childNode, "composing")) { if (this->event_handler != NULL) this->event_handler->onIsTyping(*from, true); - } else if (ProtocolTreeNode::tagEquals(childNode, "paused")) { + } + else if (ProtocolTreeNode::tagEquals(childNode, "paused")) { if (this->event_handler != NULL) this->event_handler->onIsTyping(*from, false); - } else if (ProtocolTreeNode::tagEquals(childNode, "body")) { + } + else if (ProtocolTreeNode::tagEquals(childNode, "body")) { std::string* message = childNode->getDataAsString(); Key* key = new Key(*from, false, *id); fmessage->key = key; @@ -1112,10 +910,11 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag fmessage->status = FMessage::STATUS_UNSENT; if (message != NULL) delete message; - } else if (ProtocolTreeNode::tagEquals(childNode, "media") && (id != NULL)) { + } + else if (ProtocolTreeNode::tagEquals(childNode, "media") && (id != NULL)) { fmessage->media_wa_type = FMessage::getMessage_WA_Type(childNode->getAttributeValue("type")); - fmessage->media_url = (childNode->getAttributeValue("url") == NULL? "": *childNode->getAttributeValue("url")); - fmessage->media_name = (childNode->getAttributeValue("file") == NULL? "": *childNode->getAttributeValue("file")); + fmessage->media_url = (childNode->getAttributeValue("url") == NULL ? "" : *childNode->getAttributeValue("url")); + fmessage->media_name = (childNode->getAttributeValue("file") == NULL ? "" : *childNode->getAttributeValue("file")); if (childNode->getAttributeValue("size") != NULL) fmessage->media_size = Utilities::parseLongLong(*childNode->getAttributeValue("size")); @@ -1142,22 +941,24 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag if (fmessage->media_wa_type == FMessage::WA_TYPE_CONTACT) { ProtocolTreeNode* contactChildNode = childNode->getChild(0); if (contactChildNode != NULL) { - fmessage->media_name = (contactChildNode->getAttributeValue("name") == NULL? "": *contactChildNode->getAttributeValue("name")); + fmessage->media_name = (contactChildNode->getAttributeValue("name") == NULL ? "" : *contactChildNode->getAttributeValue("name")); std::string* data = contactChildNode->getDataAsString(); - fmessage->data = (data == NULL? "": *data); + fmessage->data = (data == NULL ? "" : *data); if (data != NULL) delete data; } - } else { + } + else { std::string* encoding = childNode->getAttributeValue("encoding"); std::string* data; if ((encoding == NULL) || ((encoding != NULL) && (encoding->compare("text") == 0))) { data = childNode->getDataAsString(); - } else { - _LOGDATA("Media data encoding type '%s'", (encoding == NULL? "text":encoding->c_str())); - data = (childNode->data == NULL? NULL : new std::string(base64_encode(childNode->data->data(), childNode->data->size()))); } - fmessage->data = (data == NULL? "": *data); + else { + _LOGDATA("Media data encoding type '%s'", (encoding == NULL ? "text" : encoding->c_str())); + data = (childNode->data == NULL ? NULL : new std::string(base64_encode(childNode->data->data(), childNode->data->size()))); + } + fmessage->data = (data == NULL ? "" : *data); if (data != NULL) delete data; } @@ -1165,12 +966,15 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag Key* key = new Key(*from, false, *id); fmessage->key = key; fmessage->remote_resource = author; - } else if (!ProtocolTreeNode::tagEquals(childNode, "active")) { + } + else if (!ProtocolTreeNode::tagEquals(childNode, "active")) { if (ProtocolTreeNode::tagEquals(childNode, "request")) { fmessage->wants_receipt = true; - } else if (ProtocolTreeNode::tagEquals(childNode, "notify")) { - fmessage->notifyname = (childNode->getAttributeValue("name") == NULL)? "": *childNode->getAttributeValue("name"); - } else if (ProtocolTreeNode::tagEquals(childNode, "x")) { + } + else if (ProtocolTreeNode::tagEquals(childNode, "notify")) { + fmessage->notifyname = (childNode->getAttributeValue("name") == NULL) ? "" : *childNode->getAttributeValue("name"); + } + else if (ProtocolTreeNode::tagEquals(childNode, "x")) { std::string* xmlns = childNode->getAttributeValue("xmlns"); if ((xmlns != NULL) && (xmlns->compare("jabber:x:event") == 0) && (id != NULL)) { Key* key = new Key(*from, true, *id); @@ -1180,17 +984,8 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag this->event_handler->onMessageStatusUpdate(message); delete message; } -// else if ((xmlns != NULL) && xmlns->compare("jabber:x:delay") == 0) { -// std::string* stamp_str = childNode->getAttributeValue("stamp"); -// if (stamp_str != NULL) { -// time_t stamp = Utilities::parseBBDate(*stamp_str); -// if (stamp != 0) { -// fmessage->timestamp = (long long) stamp; -// fmessage->offline = true; -// } -// } -// } - } else if (ProtocolTreeNode::tagEquals(childNode, "received")) { + } + else if (ProtocolTreeNode::tagEquals(childNode, "received")) { Key* key = new Key(*from, true, *id); FMessage* message = new FMessage(key); message->status = FMessage::STATUS_RECEIVED_BY_TARGET; @@ -1204,7 +999,8 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag else if (receipt_type->compare("visible") == 0) sendVisibleReceiptAck(*from, *id); } - } else if (ProtocolTreeNode::tagEquals(childNode, "offline")) { + } + else if (ProtocolTreeNode::tagEquals(childNode, "offline")) { if (attribute_t != NULL) { fmessage->timestamp = atoi(attribute_t->c_str()); } @@ -1222,33 +1018,36 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag this->event_handler->onMessageForMe(fmessage, duplicate); delete fmessage; - } else if (typeAttribute->compare("notification") == 0) { + } + else if (typeAttribute->compare("notification") == 0) { _LOGDATA("Notification node %s", messageNode->toString().c_str()); bool flag = false; std::vector myVector(0); - std::vector* children = messageNode->children == NULL? &myVector: messageNode->getAllChildren(); + std::vector* children = messageNode->children == NULL ? &myVector : messageNode->getAllChildren(); for (size_t i = 0; i < children->size(); i++) { ProtocolTreeNode* child = (*children)[i]; if (ProtocolTreeNode::tagEquals(child, "notification")) { std::string* type = child->getAttributeValue("type"); if ((type != NULL) && (type->compare("picture") == 0) && (this->event_handler != NULL)) { std::vector myVector2(0); - std::vector* children2 = child->children == NULL? &myVector2: child->getAllChildren(); + std::vector* children2 = child->children == NULL ? &myVector2 : child->getAllChildren(); for (unsigned j = 0; j < children2->size(); j++) { ProtocolTreeNode* child2 = (*children2)[j]; if (ProtocolTreeNode::tagEquals(child2, "set")) { std::string* id = child2->getAttributeValue("id"); std::string* author = child2->getAttributeValue("author"); if (id != NULL) { - this->event_handler->onPictureChanged(*from, ((author == NULL)?"":*author), true); + this->event_handler->onPictureChanged(*from, ((author == NULL) ? "" : *author), true); } - } else if (ProtocolTreeNode::tagEquals(child2, "delete")) { + } + else if (ProtocolTreeNode::tagEquals(child2, "delete")) { std::string* author = child2->getAttributeValue("author"); - this->event_handler->onPictureChanged(*from, ((author == NULL)?"":*author), false); + this->event_handler->onPictureChanged(*from, ((author == NULL) ? "" : *author), false); } } } - } else if (ProtocolTreeNode::tagEquals(child, "request")) { + } + else if (ProtocolTreeNode::tagEquals(child, "request")) { flag = true; } } @@ -1259,11 +1058,13 @@ void WAConnection::parseMessageInitialTagAlreadyChecked(ProtocolTreeNode* messag } } -bool WAConnection::supportsReceiptAcks() { +bool WAConnection::supportsReceiptAcks() +{ return (this->login != NULL) && (this->login->supports_receipt_acks); } -void WAConnection::sendNotificationReceived(const std::string& jid, const std::string& id) throw(WAException) { +void WAConnection::sendNotificationReceived(const std::string& jid, const std::string& id) throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["xmlns"] = "urn:xmpp:receipts"; ProtocolTreeNode* child = new ProtocolTreeNode("received", attribs1); @@ -1278,7 +1079,8 @@ void WAConnection::sendNotificationReceived(const std::string& jid, const std::s delete node; } -void WAConnection::sendClose() throw(WAException) { +void WAConnection::sendClose() throw(WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["type"] = "unavailable"; ProtocolTreeNode* presenceNode = new ProtocolTreeNode("presence", attribs1); @@ -1287,7 +1089,8 @@ void WAConnection::sendClose() throw(WAException) { this->out->streamEnd(); } -void WAConnection::sendGetPrivacyList() throw (WAException) { +void WAConnection::sendGetPrivacyList() throw (WAException) +{ std::string id = makeId("privacylist_"); this->pending_server_requests[id] = new IqResultPrivayListHandler(this); @@ -1308,7 +1111,8 @@ void WAConnection::sendGetPrivacyList() throw (WAException) { delete iqNode; } -void WAConnection::sendGetServerProperties() throw (WAException) { +void WAConnection::sendGetServerProperties() throw (WAException) +{ std::string id = makeId("get_server_properties_"); this->pending_server_requests[id] = new IqResultServerPropertiesHandler(this); @@ -1327,7 +1131,8 @@ void WAConnection::sendGetServerProperties() throw (WAException) { delete iqNode; } -void WAConnection::sendGetGroups() throw (WAException) { +void WAConnection::sendGetGroups() throw (WAException) +{ this->mutex->lock(); std::string id = makeId("get_groups_"); this->pending_server_requests[id] = new IqResultGetGroupsHandler(this, "participating"); @@ -1336,7 +1141,8 @@ void WAConnection::sendGetGroups() throw (WAException) { this->mutex->unlock(); } -void WAConnection::sendGetOwningGroups() throw (WAException) { +void WAConnection::sendGetOwningGroups() throw (WAException) +{ this->mutex->lock(); std::string id = makeId("get_owning_groups_"); this->pending_server_requests[id] = new IqResultGetGroupsHandler(this, "owning"); @@ -1345,7 +1151,8 @@ void WAConnection::sendGetOwningGroups() throw (WAException) { this->mutex->unlock(); } -void WAConnection::sendGetGroups(const std::string& id, const std::string& type) throw (WAException) { +void WAConnection::sendGetGroups(const std::string& id, const std::string& type) throw (WAException) +{ std::map* attribs1 = new std::map(); (*attribs1)["xmlns"] = "w:g"; (*attribs1)["type"] = type; @@ -1361,7 +1168,8 @@ void WAConnection::sendGetGroups(const std::string& id, const std::string& type) delete iqNode; } -void WAConnection::readGroupList(ProtocolTreeNode* node, std::vector& groups) throw (WAException) { +void WAConnection::readGroupList(ProtocolTreeNode* node, std::vector& groups) throw (WAException) +{ std::vector* nodes = node->getAllChildren("group"); for (size_t i = 0; i < nodes->size(); i++) { ProtocolTreeNode* groupNode = (*nodes)[i]; @@ -1379,12 +1187,14 @@ void WAConnection::readGroupList(ProtocolTreeNode* node, std::vectorpending_server_requests[id] = new IqResultQueryLastOnlineHandler(this); @@ -1402,7 +1212,8 @@ void WAConnection::sendQueryLastOnline(const std::string& jid) throw (WAExceptio delete iqNode; } -void WAConnection::sendGetGroupInfo(const std::string& gjid) throw (WAException) { +void WAConnection::sendGetGroupInfo(const std::string& gjid) throw (WAException) +{ std::string id = makeId("get_g_info_"); this->pending_server_requests[id] = new IqResultGetGroupInfoHandler(this); @@ -1420,7 +1231,8 @@ void WAConnection::sendGetGroupInfo(const std::string& gjid) throw (WAException) delete iqNode; } -void WAConnection::sendGetParticipants(const std::string& gjid) throw (WAException) { +void WAConnection::sendGetParticipants(const std::string& gjid) throw (WAException) +{ std::string id = makeId("get_participants_"); this->pending_server_requests[id] = new IqResultGetGroupParticipantsHandler(this); @@ -1438,7 +1250,8 @@ void WAConnection::sendGetParticipants(const std::string& gjid) throw (WAExcepti delete iqNode; } -void WAConnection::readAttributeList(ProtocolTreeNode* node, std::vector& vector, const std::string& tag, const std::string& attribute) throw (WAException) { +void WAConnection::readAttributeList(ProtocolTreeNode* node, std::vector& vector, const std::string& tag, const std::string& attribute) throw (WAException) +{ std::vector* nodes = node->getAllChildren(tag); for (size_t i = 0; i < nodes->size(); i++) { ProtocolTreeNode* tagNode = (*nodes)[i]; @@ -1448,7 +1261,8 @@ void WAConnection::readAttributeList(ProtocolTreeNode* node, std::vectorpending_server_requests[id] = new IqResultCreateGroupChatHandler(this); @@ -1469,7 +1283,8 @@ void WAConnection::sendCreateGroupChat(const std::string& subject) throw (WAExce delete iqNode; } -void WAConnection::sendEndGroupChat(const std::string& gjid) throw (WAException){ +void WAConnection::sendEndGroupChat(const std::string& gjid) throw (WAException) +{ std::string id = makeId("remove_group_"); std::map* attribs1 = new std::map(); @@ -1480,14 +1295,15 @@ void WAConnection::sendEndGroupChat(const std::string& gjid) throw (WAException) std::map* attribs2 = new std::map(); (*attribs2)["id"] = id; (*attribs2)["type"] = "set"; - (*attribs2)["to"] = gjid ; + (*attribs2)["to"] = gjid; ProtocolTreeNode* iqNode = new ProtocolTreeNode("iq", attribs2, groupNode); this->out->write(iqNode); delete iqNode; } -void WAConnection::sendClearDirty(const std::string& category) throw (WAException) { +void WAConnection::sendClearDirty(const std::string& category) throw (WAException) +{ std::string id = makeId("clean_dirty_"); this->pending_server_requests[id] = new IqResultClearDirtyHandler(this); @@ -1509,7 +1325,8 @@ void WAConnection::sendClearDirty(const std::string& category) throw (WAExceptio delete iqNode; } -void WAConnection::sendLeaveGroup(const std::string& gjid) throw (WAException) { +void WAConnection::sendLeaveGroup(const std::string& gjid) throw (WAException) +{ std::string id = makeId("leave_group_"); std::map* attribs1 = new std::map(); @@ -1530,17 +1347,20 @@ void WAConnection::sendLeaveGroup(const std::string& gjid) throw (WAException) { delete iqNode; } -void WAConnection::sendAddParticipants(const std::string& gjid, const std::vector& participants) throw (WAException) { +void WAConnection::sendAddParticipants(const std::string& gjid, const std::vector& participants) throw (WAException) +{ std::string id = makeId("add_group_participants_"); this->sendVerbParticipants(gjid, participants, id, "add"); } -void WAConnection::sendRemoveParticipants(const std::string& gjid, const std::vector& participants) throw (WAException) { +void WAConnection::sendRemoveParticipants(const std::string& gjid, const std::vector& participants) throw (WAException) +{ std::string id = makeId("remove_group_participants_"); this->sendVerbParticipants(gjid, participants, id, "remove"); } -void WAConnection::sendVerbParticipants(const std::string& gjid, const std::vector& participants, const std::string& id, const std::string& inner_tag) throw (WAException) { +void WAConnection::sendVerbParticipants(const std::string& gjid, const std::vector& participants, const std::string& id, const std::string& inner_tag) throw (WAException) +{ size_t size = participants.size(); std::vector* children = new std::vector(size); for (size_t i = 0; i < size; i++) { @@ -1563,7 +1383,8 @@ void WAConnection::sendVerbParticipants(const std::string& gjid, const std::vect delete iqNode; } -void WAConnection::sendSetNewSubject(const std::string& gjid, const std::string& subject) throw (WAException) { +void WAConnection::sendSetNewSubject(const std::string& gjid, const std::string& subject) throw (WAException) +{ std::string id = this->makeId("set_group_subject_"); std::map* attribs1 = new std::map(); @@ -1581,7 +1402,8 @@ void WAConnection::sendSetNewSubject(const std::string& gjid, const std::string& delete iqNode; } -std::string WAConnection::removeResourceFromJid(const std::string& jid) { +std::string WAConnection::removeResourceFromJid(const std::string& jid) +{ size_t slashidx = jid.find('/'); if (slashidx == std::string::npos) return jid; @@ -1589,7 +1411,8 @@ std::string WAConnection::removeResourceFromJid(const std::string& jid) { return jid.substr(0, slashidx + 1); } -void WAConnection::sendStatusUpdate(std::string& status) throw (WAException) { +void WAConnection::sendStatusUpdate(std::string& status) throw (WAException) +{ std::string id = this->makeId(Utilities::intToStr((int)time(NULL))); FMessage* message = new FMessage(new Key("s.us", true, id)); ProtocolTreeNode* body = new ProtocolTreeNode("body", NULL, new std::vector(status.begin(), status.end()), NULL); @@ -1599,9 +1422,8 @@ void WAConnection::sendStatusUpdate(std::string& status) throw (WAException) { delete message; } - - -void WAConnection::sendSetPicture(const std::string& jid, std::vector* data) throw (WAException) { +void WAConnection::sendSetPicture(const std::string& jid, std::vector* data) throw (WAException) +{ std::string id = this->makeId("set_photo_"); this->pending_server_requests[id] = new IqResultSetPhotoHandler(this, jid); @@ -1620,7 +1442,8 @@ void WAConnection::sendSetPicture(const std::string& jid, std::vectorpending_server_requests[id] = new IqResultGetPhotoHandler(this, jid, oldId, newId); @@ -1639,7 +1462,8 @@ void WAConnection::sendGetPicture(const std::string& jid, const std::string& typ delete iqNode; } -void WAConnection::sendGetPictureIds(const std::vector& jids) throw (WAException) { +void WAConnection::sendGetPictureIds(const std::vector& jids) throw (WAException) +{ std::string id = makeId("get_picture_ids_"); this->pending_server_requests[id] = new IqResultGetPictureIdsHandler(this); @@ -1664,7 +1488,8 @@ void WAConnection::sendGetPictureIds(const std::vector& jids) throw delete iqNode; } -void WAConnection::sendDeleteAccount() throw (WAException) { +void WAConnection::sendDeleteAccount() throw (WAException) +{ std::string id = makeId("del_acct_"); this->pending_server_requests[id] = new IqResultSendDeleteAccount(this); -- cgit v1.2.3