void *YahooClient::processEvent(Event *e) { if (e->type() == EventContactChanged) { Contact *contact = (Contact*)(e->param()); string grpName; string name; name = contact->getName().utf8(); Group *grp = NULL; if (contact->getGroup()) grp = getContacts()->group(contact->getGroup()); if (grp) grpName = grp->getName().utf8(); ClientDataIterator it(contact->clientData, this); YahooUserData *data; while ((data = (YahooUserData*)(++it)) != NULL) { moveBuddy(data, grpName.c_str()); } } if (e->type() == EventContactDeleted) { Contact *contact = (Contact*)(e->param()); ClientDataIterator it(contact->clientData, this); YahooUserData *data; while ((data = (YahooUserData*)(++it)) != NULL) { removeBuddy(data); } } if (e->type() == EventTemplateExpanded) { TemplateExpand *t = (TemplateExpand*)(e->param()); sendStatus(YAHOO_STATUS_CUSTOM, t->tmpl.local8Bit()); } return NULL; }
void YahooClient::moveBuddy(YahooUserData *data, const char *grp) { if (getState() != Connected) return; if (data->Group.ptr == NULL) { if ((grp == NULL) || (*grp == 0)) return; set_str(&data->Group.ptr, grp); addBuddy(data); return; } if ((grp == NULL) || (*grp == 0)) { removeBuddy(data); return; } if (!strcmp(data->Group.ptr, grp)) return; addParam(1, getLogin().utf8()); addParam(7, data->Login.ptr); addParam(65, grp); sendPacket(YAHOO_SERVICE_ADDBUDDY); addParam(1, getLogin().utf8()); addParam(7, data->Login.ptr); addParam(65, data->Group.ptr ? data->Group.ptr : ""); sendPacket(YAHOO_SERVICE_REMBUDDY); set_str(&data->Group.ptr, grp); }
void SpectrumRosterManager::handleBuddyRemoved(AbstractSpectrumBuddy *s_buddy) { if (s_buddy->getFlags() & SPECTRUM_BUDDY_IGNORE) return; m_subscribeCache.erase(s_buddy->getName()); removeFromLocalRoster(s_buddy->getName()); removeBuddy(s_buddy); }
void RosterManager::handleSubscription(Swift::Presence::ref presence) { std::string legacyName = Buddy::JIDToLegacyName(presence->getTo(), m_user); if (legacyName.empty()) { return; } // For server mode the subscription changes are handler in rosterresponder.cpp // using roster pushes. if (m_component->inServerMode()) { Swift::Presence::ref response = Swift::Presence::create(); response->setTo(presence->getFrom().toBare()); response->setFrom(presence->getTo().toBare()); Buddy *buddy = getBuddy(legacyName); if (buddy) { LOG4CXX_INFO(logger, m_user->getJID().toString() << ": Subscription received and buddy " << legacyName << " is already there => answering"); switch (presence->getType()) { case Swift::Presence::Subscribe: onBuddyAdded(buddy); response->setType(Swift::Presence::Subscribed); break; case Swift::Presence::Unsubscribe: onBuddyRemoved(buddy); removeBuddy(buddy->getName()); buddy = NULL; response->setType(Swift::Presence::Unsubscribed); break; case Swift::Presence::Subscribed: onBuddyAdded(buddy); break; default: return; } m_component->getFrontend()->sendPresence(response); } else { BuddyInfo buddyInfo; switch (presence->getType()) { // buddy is not in roster, so add him case Swift::Presence::Subscribe: buddyInfo.id = -1; buddyInfo.alias = ""; buddyInfo.legacyName = legacyName; buddyInfo.subscription = "both"; buddyInfo.flags = Buddy::buddyFlagsFromJID(presence->getTo()); LOG4CXX_INFO(logger, m_user->getJID().toString() << ": Subscription received for new buddy " << buddyInfo.legacyName << " => adding to legacy network"); buddy = m_component->getFactory()->createBuddy(this, buddyInfo); setBuddy(buddy); onBuddyAdded(buddy); response->setType(Swift::Presence::Subscribed); break; case Swift::Presence::Subscribed: // onBuddyAdded(buddy); return; // buddy is not there, so nothing to do, just answer case Swift::Presence::Unsubscribe: buddyInfo.id = -1; buddyInfo.alias = ""; buddyInfo.legacyName = legacyName; buddyInfo.subscription = "both"; buddyInfo.flags = Buddy::buddyFlagsFromJID(presence->getTo()); buddy = m_component->getFactory()->createBuddy(this, buddyInfo); onBuddyRemoved(buddy); delete buddy; response->setType(Swift::Presence::Unsubscribed); break; default: return; } m_component->getFrontend()->sendPresence(response); } } else { Swift::Presence::ref response = Swift::Presence::create(); Swift::Presence::ref currentPresence; response->setTo(presence->getFrom().toBare()); response->setFrom(presence->getTo().toBare()); Buddy *buddy = getBuddy(legacyName); if (buddy) { std::vector<Swift::Presence::ref> &presences = buddy->generatePresenceStanzas(255); switch (presence->getType()) { // buddy is already there, so nothing to do, just answer case Swift::Presence::Subscribe: onBuddyAdded(buddy); response->setType(Swift::Presence::Subscribed); BOOST_FOREACH(Swift::Presence::ref ¤tPresence, presences) { currentPresence->setTo(presence->getFrom()); m_component->getFrontend()->sendPresence(currentPresence); } if (buddy->getSubscription() != Buddy::Both) { buddy->setSubscription(Buddy::Both); storeBuddy(buddy); } break; // remove buddy case Swift::Presence::Unsubscribe: response->setType(Swift::Presence::Unsubscribed); onBuddyRemoved(buddy); removeBuddy(buddy->getName()); buddy = NULL; break; // just send response case Swift::Presence::Unsubscribed: response->setType(Swift::Presence::Unsubscribe); // We set both here, because this Unsubscribed can be response to // subscribe presence and we don't want that unsubscribe presence // to be send later again if (buddy->getSubscription() != Buddy::Both) { buddy->setSubscription(Buddy::Both); storeBuddy(buddy); } break; case Swift::Presence::Subscribed: if (buddy->getSubscription() != Buddy::Both) { buddy->setSubscription(Buddy::Both); storeBuddy(buddy); } return; default: return; } } else {
/* * Send one IMCommand that has handler set to transport * * errors returned up to OutgoingIMCommandHandler * * * @param imCmd - imCommand that was read out of the DB with handler set to transport { "id" : "ImCommand", "type" : "object", "properties" : { "command" : {"type" : "string", "enum" : ["blockBuddy","deleteBuddy","sendBuddyInvite","receivedBuddyInvite","createChatGroup","inviteToGroup","leaveGroup"], "description" : "The command to be processed"}, "params" : {"type" : "any", "description" : "Parameters associated with the command are stored here."} "handler" : {"type" : "string", "enum" : ["transport","application"], "description" : "Who is responsible for handling the command"}, "targetUsername" : {"type" : "string", "description" : "The buddyname the command will act on"}, "fromUsername" : {"type" : "string", "description" : "The username that originated the command"}, "serviceName" : {"type" : "string", "description" : "Name of originating service (see IMAddress of contacts load library*)."} } * } */ MojErr SendOneCommandHandler::doSend(const MojObject imCmd) { IMServiceHandler::logMojObjectJsonString(_T("send command: %s"),imCmd); MojString command; LibpurpleAdapter::SendResult retVal = LibpurpleAdapter::SENT; bool found = false; MojErr err = imCmd.get(MOJDB_COMMAND, command, found); MojErrCheck(err); // serviceName err = imCmd.get(MOJDB_SERVICE_NAME, m_serviceName, found); MojErrCheck(err); // get the id so we can update the status in the DB after sending err = imCmd.getRequired(MOJDB_ID, m_currentCmdDbId); MojErrCheck(err); // for receiving invite, the user account and remote user are reversed: targetUsername is us and the fromUsername is the remote buddy if (0 == command.compare(_T("receivedBuddyInvite"))) { // username of current account err = imCmd.get(MOJDB_FROM_USER, m_buddyName, found); MojErrCheck(err); // buddy / remote user err = imCmd.get(MOJODB_TARGET_USER, m_username, found); MojErrCheck(err); } else { // username of current account err = imCmd.get(MOJDB_FROM_USER, m_username, found); MojErrCheck(err); // buddy / remote user err = imCmd.get(MOJODB_TARGET_USER, m_buddyName, found); MojErrCheck(err); } // which command? if (0 == command.compare(_T("blockBuddy"))) { retVal = blockBuddy(imCmd); } else if (0 == command.compare(_T("deleteBuddy"))) { retVal = removeBuddy(imCmd); } else if (0 == command.compare(_T("sendBuddyInvite"))) { retVal = inviteBuddy(imCmd); } else if (0 == command.compare(_T("receivedBuddyInvite"))) { retVal = receivedBuddyInvite(imCmd); } else { MojLogError(IMServiceApp::s_log, _T("doSend: unknown command %s"), command.data()); retVal = LibpurpleAdapter::SEND_FAILED; } // we can't just delete the command if the user is not logged on... // need to save command in "waiting" state waiting for user to login if (LibpurpleAdapter::USER_NOT_LOGGED_IN == retVal) { // user not logged in - put in queued state MojLogError(IMServiceApp::s_log, _T("doSend - can't process command - user not logged in. Waiting for connection")); MojObject propObject; propObject.putString(MOJDB_STATUS, IMMessage::statusStrings[WaitingForConnection]); // id to update propObject.putString(MOJDB_ID, m_currentCmdDbId); // save the new fields - call merge err = m_dbClient.merge(this->m_imSaveCommandSlot, propObject); if (err) { MojLogError(IMServiceApp::s_log, _T("doSend - DB merge command failed. err %d, DB id %s: "), err, m_currentCmdDbId.data() ); } } else { // delete command so we don't keep processing it // put id in an array MojObject idsToDelete; // array err = idsToDelete.push(m_currentCmdDbId); // luna://com.palm.db/del '{"ids":[2]}' IMServiceHandler::logMojObjectJsonString(_T("deleting imcommand: %s"), idsToDelete); err = m_dbClient.del(this->m_imDeleteCommandSlot, idsToDelete.arrayBegin(), idsToDelete.arrayEnd()); if (err) { MojLogError(IMServiceApp::s_log, _T("doSend - DB del command failed. err %d, DB id %s: "), err, m_currentCmdDbId.data() ); } } if (LibpurpleAdapter::SENT != retVal) { // something went wrong - nothing more we can do MojLogError(IMServiceApp::s_log, _T("doSend: command failed")); m_outgoingIMHandler->messageFinished(); } return MojErrNone; }