CUserProfile::CUserProfile(UserProfile & userProfile, CWengoPhone & cWengoPhone) : _userProfile(userProfile), _cWengoPhone(cWengoPhone), _cContactList(userProfile.getContactList(), cWengoPhone), _cWenboxPlugin(*userProfile.getWenboxPlugin(), cWengoPhone), _cChatHandler(userProfile.getChatHandler(), *this) { _cHistory = NULL; _cPhoneLine = NULL; _cSms = NULL; _cSoftUpdate = NULL; _cWsCallForward = NULL; _cWsContactProfile = NULL; //VOXOX - JRT - 2009.08.03 _pUserProfile = PFactory::getFactory().createPresentationUserProfile(*this); //JRT-XXX _userProfile.userProfileInitializedEvent += boost::bind(&CUserProfile::userProfileInitializedEventHandler, this, _1); _userProfile.phoneLineCreatedEvent += boost::bind(&CUserProfile::phoneLineCreatedEventHandler, this, _1, _2); _userProfile.wsSmsCreatedEvent += boost::bind(&CUserProfile::wsSmsCreatedEventHandler, this, _1, _2); _userProfile.wsSoftUpdateCreatedEvent += boost::bind(&CUserProfile::wsSoftUpdateCreatedEventHandler, this, _1, _2, _3); //VOXOX - JRT - 2009.10.27 _userProfile.wsCallForwardCreatedEvent += boost::bind(&CUserProfile::wsCallForwardCreatedEventHandler, this, _1, _2); _userProfile.loginStateChangedEvent += boost::bind(&CUserProfile::loginStateChangedEventHandler, this, _1, _2); _userProfile.networkDiscoveryStateChangedEvent += boost::bind(&CUserProfile::networkDiscoveryStateChangedEventHandler, this, _1, _2); _userProfile.getHistory().historyLoadedEvent += boost::bind(&CUserProfile::historyLoadedEventHandler, this, _1); _userProfile.getPresenceHandler().authorizationRequestEvent += boost::bind(&CUserProfile::authorizationRequestEventHandler, this, _1, _2, _3); _userProfile.getPresenceHandler().incomingSubscribeEvent += boost::bind(&CUserProfile::incomingSubscribeEventHandler, this, _1, _2, _3, _4, _5); //Check if a PhoneLine already exist if (_userProfile.getActivePhoneLine()) { phoneLineCreatedEventHandler(_userProfile, *_userProfile.getActivePhoneLine()); } historyLoadedEventHandler(_userProfile.getHistory()); /*if (_userProfile.getWsSms()) { wsSmsCreatedEventHandler(_userProfile, *_userProfile.getWsSms()); }*/ checkForSoftUpdate( false ); //Automatic - //VOXOX - JRT - 2009.10.27 createWsContactProfile(); //Call now in case event already fired. //VOXOXCHANGE CJC //VOXOX - JRT - 2009.05.24 TODO: find supporting files and remove from project. //Don't need call transfer functionality /*if (_userProfile.getWsCallForward()) { wsCallForwardCreatedEventHandler(_userProfile, *_userProfile.getWsCallForward()); }*/ }
void CommandServer::incomingRequestEventHandler(ServerSocket & sender, const std::string & connectionId, const std::string & data) { LOG_DEBUG("incoming request connectionId=" + connectionId + " data=" + data); String query = String(data); if (query == QueryStatus) { //Find the phoneline status and answer UserProfile * userprofile = _wengoPhone.getUserProfileHandler().getCurrentUserProfile(); if (userprofile) { IPhoneLine * phoneLine = userprofile->getActivePhoneLine(); if (phoneLine && phoneLine->isConnected()) { _serverSocket->writeToClient(connectionId, QueryStatus + "|1"); } else { _serverSocket->writeToClient(connectionId, QueryStatus + "|0"); } } } else if (query == QueryBringToFront) { bringMainWindowToFrontEvent(); } else if (query.beginsWith(QueryCall)) { //Extract the number from query & place the call StringList l = query.split("/"); if (l.size() == 2) { LOG_DEBUG("call peer=" + l[1]); UserProfile * userprofile = _wengoPhone.getUserProfileHandler().getCurrentUserProfile(); if (userprofile) { IPhoneLine * phoneLine = userprofile->getActivePhoneLine(); if (phoneLine && phoneLine->isConnected()) { phoneLine->makeCall(l[1]); _serverSocket->writeToClient(connectionId, data + "|1"); return; } } } _serverSocket->writeToClient(connectionId, data + "|0"); } else if (query.beginsWith(QuerySms)) { LOG_WARN("not yet implemented"); } else if (query.contains(QueryChat)) { UserProfile * userProfile = _wengoPhone.getUserProfileHandler().getCurrentUserProfile(); if (userProfile) { IPhoneLine * phoneLine = userProfile->getActivePhoneLine(); if (phoneLine && phoneLine->isConnected()) { // extract the nickname from 1|o|chat/pseudo=value&sip=value StringList l = query.split("/"); std::string nickname; if (l.size() == 2) { int sepPos = l[1].find("&"); nickname = l[1].substr(7, sepPos - 7); } //// // get THE Wengo account IMAccountList imAccountList = userProfile->getIMAccountManager().getIMAccountsOfProtocol(EnumIMProtocol::IMProtocolWengo); //// // create the IMContactSet IMAccount *imAccount = userProfile->getIMAccountManager().getIMAccount( imAccountList.begin()->second ); //VOXOX - JRT - 2009.04.24 IMContact imContact(*imAccount, nickname); IMContactSet imContactSet; imContactSet.insert(imContact); //// // create the chat session std::string temp = ""; ChatHandler & chatHandler = userProfile->getChatHandler(); chatHandler.createSession(imAccount->getKey(), imContactSet, IMChat::Chat, temp ); //VOXOX - JRT - 2009.04.24 //// OWSAFE_DELETE(imAccount); } } // failed _serverSocket->writeToClient(connectionId, QueryChat + "|0"); } else if (query.beginsWith(QueryAddContact)) { UserProfile * userProfile = _wengoPhone.getUserProfileHandler().getCurrentUserProfile(); if (userProfile) { ContactInfo contactInfo; String tmp = query.substr(QueryAddContact.size(), query.size() - 1); StringList args = tmp.split("&"); for (unsigned i = 0; i < args.size(); i++) { String tmp = args[i]; if (!tmp.size()) { continue; } StringList list = tmp.split("="); if ((!(list.size() == 2)) || list[0].empty()) { continue; } // remove the first and the last quote if any String value = list[1]; if (list[0] == NICKNAME_STR) { contactInfo.wengoName = value; } else if (list[0] == SIP_STR) { contactInfo.sip = value; } else if (list[0] == FIRSTNAME_STR) { contactInfo.firstname = value; } else if (list[0] == LASTNAME_STR) { contactInfo.lastname = value; } else if (list[0] == COUNTRY_STR) { contactInfo.country = value; } else if (list[0] == CITY_STR) { contactInfo.city = value; } else if (list[0] == STATE_STR) { contactInfo.state = value; } else if (list[0] == GROUP_STR) { contactInfo.group = value; } else if (list[0] == WDEALSERVICETITLE_STR) { contactInfo.wdealServiceTitle = value; } else if (list[0] == URL_STR) { if (value.beginsWith("\"")) { value = value.substr(1, value.size() - 2); } contactInfo.website = value; } } showAddContactEvent(contactInfo); } } else { Config & config = ConfigManager::getInstance().getCurrentConfig(); //"emulate" a http server. Needed for Flash sockets std::string tmp = "<?xml version=\"1.0\"?>\n" "<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n" "<cross-domain-policy>\n"; StringList domains = config.getCmdServerAuthorizedDomains(); StringList::const_iterator it = domains.begin(), end = domains.end(); for (;it!=end; ++it) { tmp += "<allow-access-from domain=\"" + *it + "\" to-ports=\"*\" />\n"; } tmp += "<allow-access-from domain=\"localhost\" to-ports=\"*\" />\n" "</cross-domain-policy>"; _serverSocket->writeToClient(connectionId, buildHttpForFlash(tmp)); } }