Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // XmppCommCtrl.cpp : Implementation of CXmppCommCtrl
- #include "stdafx.h"
- #include <sstream>
- #include "PAL.h"
- #include "PALcritsec.h"
- #include "PALthread.h"
- #include "Event.h"
- #if defined(WIN32) && !(defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- #include <atlapp.h>
- #include <atldlgs.h>
- #include "EComUtil.h"
- #include "EFileUtil.h"
- #include "registry.h"
- #else
- #ifndef NO_FILE_TRANSFER
- #include "FileUtilities.h"
- using namespace FileUtilities;
- #endif
- #endif
- #if defined(__unix__) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- #include "XmppCommCtrl_unix.h"
- #else
- #ifndef _WIN32_WCE
- #include "XmppComm_win.h"
- #else
- #include "XmppCommCE.h"
- #endif
- #include "XmppCommCtrl.h"
- #endif
- #include "TextUtil.h"
- #if !(defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- #include "PALinet.h"
- #endif
- #include "JabberUtil.h"
- #include "JabberBuddy.h"
- #include "JabberRoster.h"
- #include "JabberPresence.h"
- #include "JabberMessage.h"
- #include "JabberParser.h"
- #ifdef _COMCAST
- #include "JabberPrivacy2.h"
- #else
- #include "JabberPrivacy.h"
- #endif
- #include "JabberIQ.h"
- #include "JabberAuth.h"
- #include "PALsystime.h"
- #include "sha.h"
- #ifdef USE_NSSTREAM_FOR_XMPP
- #include "NSsocket.h"
- #endif
- #include "AnyFirewallEngine_dll.h"
- #include "common.h"
- #include <openssl/bio.h>
- #include <openssl/x509.h>
- #include <openssl/x509_vfy.h>
- #include <openssl/pem.h>
- #include <openssl/x509v3.h>
- using std::string;
- #ifndef __unix__
- using namespace eyeball;
- #endif
- using namespace JabberUtil;
- #define CHECK_POINTER(X) \
- if (NULL == (X))\
- return ThrowError("NULL pointer.");
- #define CHECK_LOGIN() \
- if (m_pJabberStream->m_StreamState != JABBER_STREAM_CONNECTED) \
- return ThrowError("ERROR: Not logged in to XMPP.");
- #define CHECK_NOT_LOGGEDIN() \
- if (m_pJabberStream->m_StreamState != JABBER_STREAM_OFFLINE) \
- return ThrowError("ERROR: Already logged in to XMPP.");
- #define FIRE_EVENT(X, ...) _FIRE_EVENT(this, X, __VA_ARGS__)
- #define KEEP_ALIVE_TIMER 1
- #define LOGIN_TIMER 2
- #define DETECT_CONNECTIVITY_TIMEOUT 10 // 10 seconds
- #define LOGIN_CONNECT_TIMEOUT 10 // 5 seconds
- #define LOGIN_TIMEOUT 30 // 30 seconds
- #define REGISTRATION_TIMER 3
- #define REGISTRATION_TIMEOUT 300 // 30 seconds
- #ifdef _COMCAST
- #define KEEP_ALIVE_TIMEOUT 120 // 120 seconds
- #else
- #define KEEP_ALIVE_TIMEOUT 30 // disabled
- #endif
- #define MAX_KEEP_ALIVES 3
- // file transfer defines
- #define EXTENSION_FILTER \
- _T("All Files (*.*)\0*.*\0\0")
- #define E_INVALID_FILE_ID "Invalid file transfer ID."
- #define E_FILE_ABORTED "File transfer is already aborted."
- #define E_NOT_FILE_RECEIVER "Not a file receiver."
- #define E_NOT_FILE_SENDER "Not a file sender."
- #ifdef _COMCAST
- //#define SUPPORT_MULTICAST_DISPLAYNAME
- #endif
- #ifndef _COMCAST
- #define USE_REMOVE_BUDDY
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // Helper functions
- static string GetStateString(const u_int16_t& uState)
- {
- switch(uState)
- {
- case FTS_UNKNOWN:
- return "unknown";
- case FTS_ERROR:
- return "connection error";
- case FTS_DISCONNECTED:
- return "disconnected";
- case FTS_REQUEST_REJECTED:
- return "request rejected";
- case FTS_ABORTED:
- return "aborted";
- case FTS_SENT_REQUEST:
- return "request sent";
- case FTS_RECEIVE_REQUEST:
- return "request received";
- case FTS_REQUEST_ACCEPTED:
- return "request accepted";
- case FTS_RECEIVE_CONNECTING:
- return "connecting to sender";
- case FTS_SEND_CONNECTING:
- return "connecting to receiver";
- case FTS_RECEIVING:
- return "receiving";
- case FTS_SENDING:
- return "sending";
- case FTS_RECEIVE_COMPLETE:
- return "receive complete";
- case FTS_SEND_COMPLETE:
- return "send complete";
- default:
- PAL_DB_ASSERT(0);
- }
- return "";
- }
- static string TruncateSpace(const string& sInput)
- {
- string sOutput;
- size_t iPos = sInput.find_first_not_of(" ");
- if (iPos == string::npos)
- {
- // all are space
- return sOutput;
- }
- else
- {
- sOutput = sInput.substr(iPos);
- }
- iPos = sOutput.find_last_not_of(" ");
- sOutput = sOutput.substr(0, iPos+1);
- return sOutput;
- }
- /////////////////////////////////////////////////////////////////////////////
- // FtContainerMap
- FtContainerMap::iterator FtContainerMap::FindTransferId(u_int32_t uTransferId)
- {
- iterator iter = begin();
- for (; iter != end(); ++iter)
- {
- /*
- if ((iter->second.m_fti.m_uTransferId == uTransferId) &&
- (FTS_ABORTED != iter->second.m_uState) &&
- (FTS_ERROR != iter->second.m_uState))
- return iter;
- */
- if (iter->second.m_fti.m_uTransferId == uTransferId)
- {
- return iter;
- }
- }
- return end();
- }
- /////////////////////////////////////////////////////////////////////////////
- // CXmppCommCtrl
- #if defined(__unix__) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- CXmppCommCtrl::CXmppCommCtrl(CXmppCommEventHandler_PTR callback_handler):
- CCustomTimer(this),
- m_iLoginDnsChannel(AF_CHANNEL_INVALID),
- m_iGeneralDnsChannel(AF_CHANNEL_INVALID)
- {
- m_CallbackHandler = callback_handler;
- FinalConstruct();
- BOOL bHandled = TRUE;
- OnCreate(0, 0, 0, bHandled);
- }
- #endif
- CXmppCommCtrl *pCXmppCommCtrl = NULL;
- /*
- int X509_cmp(const X509 *cert1, const X509 *cert2) {
- X509_check_purpose((X509 *)cert1, -1, 0);
- X509_check_purpose((X509 *)cert2, -1, 0);
- return memcmp(cert1->sha1_hash, cert2->sha1_hash, SHA_DIGEST_LENGTH);
- }
- */
- static int custom_callback(void *ctx, void *arg)
- {
- OpenSSL_add_all_algorithms();
- X509_STORE_CTX store_ctx = X509_STORE_CTX(*(X509_STORE_CTX*)ctx);
- int rc = X509_verify_cert(&store_ctx); // rc = 1 if validation success otherwise failure
- X509 *cert = X509_STORE_CTX_get_current_cert(&store_ctx);
- if(!cert) {
- pCXmppCommCtrl->m_pJabberStream->Log("Server certificate invalid.");
- return 0;
- }
- pCXmppCommCtrl->m_pJabberStream->Log(cert->name);
- const char *path = "C:\\Users\\eyeball\\Desktop\\cert\\ss.pem";
- FILE* fp = fopen(path, "r");
- if(!fp) {
- pCXmppCommCtrl->m_pJabberStream->Log("Unable to open local certificate.");
- return 0;
- }
- fseek(fp, 0, SEEK_END);
- size_t size = ftell(fp);
- char* data = new char[size];
- rewind(fp);
- fread(data, sizeof(char), size, fp);
- fclose(fp);
- BIO *bio = BIO_new(BIO_s_mem());
- BIO_puts(bio, data);
- delete[] data;
- X509 *cert2 = PEM_read_bio_X509(bio, NULL, NULL, NULL);
- BIO_free(bio);
- if(!cert2) {
- X509_free(cert);
- pCXmppCommCtrl->m_pJabberStream->Log("Local certificate x509 object invalid..");
- return 0;
- }
- EVP_PKEY *pkey=X509_get_pubkey(cert2);
- int result = X509_verify(cert, pkey);
- pCXmppCommCtrl->m_pJabberStream->Log("X509_verify(): " + tostring(result));
- EVP_PKEY_free(pkey);
- // pCXmppCommCtrl->m_pJabberStream->Log("My local certificate:");
- // pCXmppCommCtrl->m_pJabberStream->Log(cert2->name);
- // char *issuer = X509_NAME_oneline(X509_get_issuer_name(cert), NULL, 0);
- // char *issuer2 = X509_NAME_oneline(X509_get_issuer_name(cert2), NULL, 0);
- // pCXmppCommCtrl->m_pJabberStream->Log("Issuers:");
- // pCXmppCommCtrl->m_pJabberStream->Log(std::string(issuer));
- // pCXmppCommCtrl->m_pJabberStream->Log(std::string(issuer2));
- // char *subj = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0);
- // char *subj2 = X509_NAME_oneline(X509_get_subject_name(cert2), NULL, 0);
- // pCXmppCommCtrl->m_pJabberStream->Log("Subjects:");
- // pCXmppCommCtrl->m_pJabberStream->Log(std::string(subj));
- // pCXmppCommCtrl->m_pJabberStream->Log(std::string(subj2));
- // check whether issuer and subject are same
- // return (strcmp(issuer, issuer2) == 0 && strcmp(subj, subj2) == 0);
- /*
- int cmp = X509_cmp(cert, cert2);
- if(cmp == 0) {
- pCXmppCommCtrl->m_pJabberStream->Log("Certificate Verification Success.");
- } else {
- pCXmppCommCtrl->m_pJabberStream->Log("Certificate Verification Failed.");
- }
- */
- X509_free(cert2);
- X509_free(cert);
- // return (cmp == 0);
- return result > 0;
- }
- HRESULT CXmppCommCtrl::FinalConstruct()
- {
- pCXmppCommCtrl = this;
- //m_pWinsockInit = new PAL::Network::SocketInit; // WS2_32.DLL is initiated in AFE, so don't think it's necessary here
- #ifdef USE_NSSTREAM_FOR_XMPP
- m_pNSsocket = new CNSsocket;
- #else
- m_pAFEngine = new CAnyFirewallEngine;
- #if defined(WIN32) && !(defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- CLSID clsid = DEF_CLSID_ANYFIREWALL;
- LPOLESTR wszCLSID = NULL;
- HRESULT hr = StringFromCLSID(clsid, &wszCLSID);
- tstring sClsID = wszCLSID;
- // Free memory.
- CoTaskMemFree(wszCLSID);
- tstring sKey = TEXT("CLSID\\");
- sKey += sClsID;
- sKey += TEXT("\\InprocServer32");
- tstring sData;
- tstring sValue;
- GetRegistryEntry(HKEY_CLASSES_ROOT, sKey, sValue, sData);
- #endif
- #if (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- m_bAFEngineInit = m_pAFEngine->Init(AF_MODE_STANDARD, true);
- #elif defined(WIN32)
- m_bAFEngineInit = m_pAFEngine->InitDll(_Module.GetModuleInstance(),
- #if (AF_DLL_VERSION > 950000 && AF_DLL_VERSION < 9600000)
- AF_MODE_AUTO, true
- #else
- sData.mbs()
- #endif
- );
- #else
- m_bAFEngineInit = m_pAFEngine->Init();
- #endif
- #if (AF_DLL_VERSION > 9600000)
- #if (AF_DLL_VERSION > 10011600)
- if(PAL::IsLogEnabled(PAL::PAL_LOG_AF_MESSAGE)){
- m_pAFEngine->SetLogFilePath(PAL::GetLogPath().c_str());
- }
- #endif
- m_pAFEngine->SetLogFileOptions(5, 2);
- m_iAFEServerStoreID = m_pAFEngine->CreateServerStore(AF_MODE_AUTO, true);
- #if (AF_DLL_VERSION >= 10011619)
- m_pAFEngine->SetNetworkType(m_iAFEServerStoreID, EAfIPv4Only);
- #endif
- #endif
- #endif // USE_NSSTREAM_FOR_XMPP
- // certificate verification
- m_pAFEngine->SetCertificateVerificationCallback(custom_callback);
- srand(rand() ^ (rand() << 16) ^ (int)PAL::getCurrentTimeInMilliSeconds());
- m_nNextFileId = rand();
- m_iKeepAliveTimer = 0;
- m_iKeepAlivePeriod = KEEP_ALIVE_TIMEOUT;
- m_iLoginTimer = 0;
- m_iRegistrationTimer = 0;
- m_nFileTransferPort = 0;
- m_pJabberStream = new CJabberStream(this);
- #ifdef USE_NSSTREAM_FOR_XMPP
- m_pJabberStream->SetNSsocket(m_pNSsocket);
- #else
- m_pJabberStream->SetAFEngine(m_pAFEngine, m_iAFEServerStoreID);
- #endif
- m_iConsecutiveKeepalives = 0;
- #ifndef USE_NSSTREAM_FOR_XMPP
- if (m_bAFEngineInit)
- {
- // m_pAFEngine->SetFirewallDetectionPeriod(0);
- }
- else
- {
- m_pJabberStream->Log("AFEngine failed to load");
- ThrowError("ERROR: AFEngine failed to load");
- }
- #endif
- #ifdef PROXY_DETECTION
- m_ProxyDetection.CoCreateInstance(CLSID_CProxyDetectionCtl, NULL, CLSCTX_INPROC_SERVER);
- #endif
- // m_iStunPassServerPort = 0;
- m_iStunServerPort = 0;
- m_iTurnUdpPort = 0;
- m_iTurnTcpPort = 0;
- m_pLoginMutex = new PAL::Mutex;
- m_pLoginThread = NULL;
- m_pLoginDnsMutex = new PAL::Mutex;
- m_bQuitLogin = false;
- m_pFileTransferMutex = new PAL::Mutex;
- #ifndef USE_NSSTREAM_FOR_XMPP
- m_iLoginDnsChannel = AF_CHANNEL_INVALID;
- m_iGeneralDnsChannel = m_pAFEngine->Create(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- AF_CHANNEL_DNS
- #if (AF_DLL_VERSION > 950000)
- , 0, 0, 0
- #endif
- );
- #endif
- return S_OK;
- }
- #if defined(__unix__) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- CXmppCommCtrl::~CXmppCommCtrl()
- {
- BOOL bHandled = TRUE;
- OnDestroy(0, 0, 0, bHandled);
- FinalRelease();
- }
- #endif
- void CXmppCommCtrl::FinalRelease()
- {
- #ifndef USE_NSSTREAM_FOR_XMPP
- CLOSE_CHANNEL(m_iGeneralDnsChannel);
- #endif
- Logout();
- FtCleanup();
- SAFE_DELETE(m_pJabberStream);
- #ifdef USE_NSSTREAM_FOR_XMPP
- SAFE_DELETE(m_pNSsocket);
- #else
- #if (AF_DLL_VERSION > 9600000)
- m_pAFEngine->CloseServerStore(m_iAFEServerStoreID);
- #endif
- m_pAFEngine->Release();
- SAFE_DELETE(m_pAFEngine);
- #endif
- #ifdef PROXY_DETECTION
- if (m_ProxyDetection)
- {
- m_ProxyDetection.Release();
- }
- #endif
- //SAFE_DELETE(m_pWinsockInit);
- SAFE_DELETE(m_pLoginMutex);
- SAFE_DELETE(m_pLoginDnsMutex);
- SAFE_DELETE(m_pFileTransferMutex);
- }
- LRESULT CXmppCommCtrl::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- #if defined(__unix__) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- m_pJabberStream->SetWindowHandle(this);
- m_pJabberStream->m_pJabberParser->SetWindowHandle(this);
- #else
- m_pJabberStream->SetWindowHandle(m_hWnd);
- m_pJabberStream->m_pJabberParser->SetWindowHandle(m_hWnd);
- #endif
- if (m_iKeepAlivePeriod)
- {
- m_iConsecutiveKeepalives = 0;
- m_iKeepAliveTimer = SetTimer(KEEP_ALIVE_TIMER, m_iKeepAlivePeriod*1000);
- }
- return 0;
- }
- LRESULT CXmppCommCtrl::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- if (m_iKeepAliveTimer != 0)
- KillTimer(m_iKeepAliveTimer);
- m_iKeepAliveTimer = 0;
- m_iConsecutiveKeepalives = 0;
- KillLoginTimer();
- KillRegistrationTimer();
- return 0;
- }
- LRESULT CXmppCommCtrl::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- m_pJabberStream->Log("OnTimer: triggered for " + tostring(wParam));
- if (wParam == m_iKeepAliveTimer
- && m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED )
- {
- m_pJabberStream->jabber_keepalive();
- if (++m_iConsecutiveKeepalives >= MAX_KEEP_ALIVES)
- {
- m_pJabberStream->Log("Did not receive keep-alives. Closing broken connection.");
- #if defined(__unix__) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- m_pJabberStream->m_pXmppComm->PostMessage(WM_NETWORK_DOWN, NULL, NULL);
- #else
- ::PostMessage(m_pJabberStream->m_pXmppComm->m_hWnd, WM_NETWORK_DOWN, NULL, NULL);
- #endif
- }
- }
- if (wParam == m_iLoginTimer)
- {
- PAL::Critical_Section cs(*m_pLoginMutex);
- KillLoginTimer();
- BOOL bLoggedin = m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED;
- if (bLoggedin)
- {
- return 0;
- }
- QuitLogin(false);
- bool bAnyMoreServersToTry = false;
- while (TRUE)
- {
- if (!m_pJabberStream->SetNextServer())
- break;
- bAnyMoreServersToTry = true;
- if (m_pJabberStream->jabber_login())
- {
- KillLoginTimer();
- m_iLoginTimer = SetTimer(LOGIN_TIMER, LOGIN_CONNECT_TIMEOUT*1000);
- return 0;
- }
- m_pJabberStream->jabber_logout();
- }
- KillLoginTimer();
- m_pJabberStream->jabber_full_close();
- if (bAnyMoreServersToTry)
- {
- m_pJabberStream->Log("Login Response: server unreachable");
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_SERVER_UNREACHABLE);
- }
- else
- {
- m_pJabberStream->Log("Login Response: timeout");
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_TIMEOUT);
- }
- }
- else if (wParam == m_iRegistrationTimer)
- {
- KillRegistrationTimer();
- FIRE_EVENT(Fire_OnCreateAccountResponse, JABBER_REGISTRATION_TIMEOUT);
- }
- return 0;
- }
- LRESULT CXmppCommCtrl::OnPacket(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- //Refresh keepalive timer
- m_iConsecutiveKeepalives = 0;
- if (m_iKeepAliveTimer)
- {
- KillTimer(m_iKeepAliveTimer);
- m_iKeepAliveTimer = 0;
- }
- if (m_iKeepAlivePeriod)
- {
- m_iKeepAliveTimer = SetTimer(KEEP_ALIVE_TIMER, m_iKeepAlivePeriod*1000);
- }
- KillLoginTimer();
- KillRegistrationTimer();
- m_pJabberStream->jabber_process_packet();
- return 0;
- }
- LRESULT CXmppCommCtrl::OnConnected(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- KillLoginTimer();
- m_iLoginTimer = SetTimer(LOGIN_TIMER, LOGIN_TIMEOUT*1000);
- m_pJabberStream->jabber_process_connected();
- return 0;
- }
- LRESULT CXmppCommCtrl::OnInitialized(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- m_pJabberStream->jabber_process_initialized();
- return 0;
- }
- LRESULT CXmppCommCtrl::OnNetworkDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- m_pJabberStream->Log("Network Down " + itoa(wParam));
- PAL::Critical_Section cs(*m_pLoginMutex);
- m_bQuitLogin = true;
- bool bTryingLogin = false;
- #ifndef USE_NSSTREAM_FOR_XMPP
- {
- //Close DNS channel
- { PAL::Critical_Section cs(*m_pLoginDnsMutex);
- CLOSE_CHANNEL(m_iLoginDnsChannel);
- } //end of critical section
- }
- #endif
- if (m_pLoginThread)
- {
- bTryingLogin = true;
- m_pJabberStream->Log("Waiting for login thread to exit");
- m_pLoginThread->join();
- SAFE_DELETE(m_pLoginThread);
- }
- // u_int32_t dwCurrTick = GetTickCount();
- // u_int32_t dwDiff = dwCurrTick-dwLastTick;
- //if(dwDiff>2000)
- // {
- // dwLastTick = dwCurrTick;
- // }
- //If disconnect happens quickly, e.g. wrong domain, this will freeze login
- //failover.
- //else
- //{
- // return 0;//ignore
- //}
- KillLoginTimer();
- KillRegistrationTimer();
- if (m_pJabberStream->m_StreamState == JABBER_STREAM_OFFLINE){
- m_pJabberStream->Log("State is offline already. bTryingLogin = " + itoa((int)bTryingLogin));
- #ifdef __unix__
- if(bTryingLogin){
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_UNKNOWN_RESPONSE);
- }
- #endif
- return 0;
- }
- if (m_pJabberStream->m_bIsRegister == true)
- {
- FIRE_EVENT(Fire_OnCreateAccountResponse, JABBER_REGISTRATION_SERVER_UNREACHABLE);
- return 0;
- }
- BOOL bLoggedin = (m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED);
- m_pJabberStream->jabber_logout();
- if (bLoggedin)
- {
- m_pJabberStream->jabber_full_close();
- m_pJabberStream->Log("Connection lost.");
- FIRE_EVENT(Fire_OnConnectionLost);
- }
- else
- {
- bool bEventFired = false;
- if (wParam == JABBER_LOGIN_CONNECTION_TO_SERVER_LOST)
- {
- //FIRE_EVENT(Fire_OnConnectionLost);
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_SERVER_UNREACHABLE);
- bEventFired = true;
- }
- if (wParam == JABBER_LOGIN_BASIC_PROXY_AUTHENTICATION_ERROR)
- {
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_BASIC_PROXY_AUTHENTICATION_ERROR);
- bEventFired = true;
- }
- if (wParam == JABBER_LOGIN_NTLM_PROXY_AUTHENTICATION_ERROR)
- {
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_NTLM_PROXY_AUTHENTICATION_ERROR);
- bEventFired = true;
- }
- if (wParam == JABBER_LOGIN_HTTP_PROXY_CONNECTION_ERROR)
- {
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_HTTP_PROXY_CONNECTION_ERROR);
- bEventFired = true;
- }
- if (wParam == JABBER_LOGIN_NTLM_DOMAIN_EMPTY)
- {
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_NTLM_DOMAIN_EMPTY);
- bEventFired = true;
- }
- while (TRUE)
- {
- if (!m_pJabberStream->SetNextServer())
- break;
- if (m_pJabberStream->jabber_login())
- {
- KillLoginTimer();
- m_iLoginTimer = SetTimer(LOGIN_TIMER, LOGIN_CONNECT_TIMEOUT*1000);
- return 0;
- }
- KillLoginTimer();
- m_pJabberStream->jabber_logout();
- }
- m_pJabberStream->jabber_full_close();
- m_pJabberStream->Log("Login Response: server unreachable");
- if(!bEventFired){
- FIRE_EVENT(Fire_OnLoginResponse, JABBER_LOGIN_SERVER_UNREACHABLE);
- }
- }
- return 0;
- }
- LRESULT CXmppCommCtrl::OnFireLoginResponse(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- FIRE_EVENT(Fire_OnLoginResponse, wParam);
- return 0;
- }
- LRESULT CXmppCommCtrl::OnAutoUpdate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- m_pJabberStream->m_pJabberIQ->jabber_handle_auto_update((CXmlNode*)wParam);
- return 0;
- }
- LRESULT CXmppCommCtrl::OnUpdateFile(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
- {
- #ifndef NO_FILE_TRANSFER
- {
- PAL::Critical_Section cs(*m_pFileTransferMutex);
- FtContainerMap::iterator iter = m_FtContainerMap.FindTransferId(wParam);
- if (iter == m_FtContainerMap.end())
- return 0;
- FtContainer& fts = (iter->second);
- // Query the file transfer objects for the current transfer state.
- if (NULL != fts.m_pFileSender.get())
- {
- fts.m_pFileSender->Log("OnUpdateFile: State = " + itoa(fts.m_uState) + ", IsTransferComplete = " + itoa((int)fts.m_pFileSender->IsTransferComplete()) + ", IsForcedComplete = " + itoa((int)fts.m_pFileSender->IsForcedComplete()));
- if ((fts.m_uState == FTS_ABORTED) ||
- (fts.m_uState == FTS_SEND_COMPLETE) ||
- (fts.m_uState == FTS_REQUEST_REJECTED) )
- {
- // ignored
- CloseFtContainer(fts);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (fts.m_pFileSender->IsTransferComplete())
- {
- fts.m_uState = FTS_SEND_COMPLETE;
- CloseFtContainer(fts);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (!(fts.m_pFileSender->CheckStatus()))
- {
- fts.m_uState = FTS_ERROR;
- CloseFtContainer(fts);
- #ifndef MESSAGE_FILE_TRANSFER
- m_pJabberStream->m_pJabberIQ->FileTransferCancel(fts.m_sUserId, iter->first);
- #else
- m_pJabberStream->m_pJabberMessage->FileTransferCancel(fts.m_sUserId, iter->first);
- #endif
- //m_pChatService->SendFileEnd(fts.m_sUserId, fts.m_fti.m_uTransferId, ECS_FAILURE);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (fts.m_pFileSender->IsTimeout())
- {
- //check the boolean and set fts.m_uState = FTS_SEND_COMPLETE;
- if(fts.m_pFileSender->IsConnected())
- {
- if(fts.m_pFileSender->IsForcedComplete())
- {
- fts.m_uState = FTS_SEND_COMPLETE;
- fts.m_pFileSender->SetForcedComplete(false);
- }
- else
- {
- fts.m_uState = FTS_DISCONNECTED;
- }
- }
- else
- {
- fts.m_uState = FTS_ERROR;
- }
- CloseFtContainer(fts);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (fts.m_pFileSender->IsOpen())
- {
- fts.m_uState = FTS_SENDING;
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- if (fts.m_uState == FTS_REQUEST_ACCEPTED)
- {
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam); // <-- This is pointless... the update will probably not be retrieved before the next update event is sent
- fts.m_uState = FTS_SEND_CONNECTING;
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- }
- else if (NULL != fts.m_pFileReceiver.get())
- {
- if ((fts.m_uState == FTS_ABORTED) ||
- (fts.m_uState == FTS_RECEIVE_COMPLETE) ||
- (fts.m_uState == FTS_REQUEST_REJECTED) )
- {
- // Ignore update
- CloseFtContainer(fts);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (fts.m_pFileReceiver->IsTransferComplete())
- {
- fts.m_uState = FTS_RECEIVE_COMPLETE;
- CloseFtContainer(fts);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (!fts.m_pFileReceiver->CheckStatus())
- {
- fts.m_uState = FTS_ERROR;
- CloseFtContainer(fts);
- #ifndef MESSAGE_FILE_TRANSFER
- m_pJabberStream->m_pJabberIQ->FileTransferCancel(fts.m_sUserId, iter->first);
- #else
- m_pJabberStream->m_pJabberMessage->FileTransferCancel(fts.m_sUserId, iter->first);
- #endif
- //m_pChatService->SendFileEnd(fts.m_sUserId, fts.m_fti.m_uTransferId, ECS_FAILURE);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (fts.m_pFileReceiver->IsTimeout())
- {
- if(fts.m_pFileReceiver->IsConnected())
- {
- if(fts.m_pFileReceiver->IsForcedComplete())
- {
- fts.m_uState = FTS_RECEIVE_COMPLETE;
- fts.m_pFileReceiver->SetForcedComplete(false);
- }
- else
- {
- fts.m_uState = FTS_DISCONNECTED;
- }
- }
- else
- {
- fts.m_uState = FTS_ERROR;
- }
- CloseFtContainer(fts);
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- else if (fts.m_pFileReceiver->IsOpen())
- {
- fts.m_uState = FTS_RECEIVING;
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- }
- }
- #endif
- FIRE_EVENT(Fire_OnFileTransferUpdate, wParam);
- return 0;
- }
- #if defined(__unix__) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- LRESULT CXmppCommCtrl::MessageHandlers(UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- MESSAGE_HANDLER(WM_PACKET, OnPacket)
- MESSAGE_HANDLER(WM_NETWORK_DOWN, OnNetworkDown)
- MESSAGE_HANDLER(WM_CONNECTED, OnConnected)
- MESSAGE_HANDLER(WM_INITIALIZED, OnInitialized)
- MESSAGE_HANDLER(WM_AUTO_UPDATE, OnAutoUpdate)
- MESSAGE_HANDLER(WM_UPDATE_FILE, OnUpdateFile)
- MESSAGE_HANDLER(WM_FIRE_LOGIN_RESPONSE, OnFireLoginResponse)
- MESSAGE_HANDLER(WM_TIMER, OnTimer)
- // Reaching here means no matching handler found.
- return -1;
- }
- #endif
- HRESULT CXmppCommCtrl::ThrowError(const string& sError)
- {
- #if defined(__unix__) || (defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP)
- FIRE_EVENT(Fire_OnError, ToBstr(sError));
- return E_FAIL;
- #else
- return Error(ToBstr(sError), IID_IXmppComm, E_FAIL);
- #endif
- }
- string CXmppCommCtrl::ToBareJid(const string &bstrJid)
- {
- if (bstrJid.empty())
- return bstrJid;
- JabberID* jid = jabber_id_new(bstrJid);
- if (jid->m_sNode.empty() && !jid->m_sDomain.empty())
- {
- // a jabber id must have domain, but may not have node.
- // so the user's input may be wrongly treated
- jid->m_sNode = jid->m_sDomain;
- jid->m_sDomain = "";
- }
- if (jid->m_sDomain.empty())
- jid->m_sDomain = m_pJabberStream->m_sDomain;
- string s = jid->m_sNode + "@" + jid->m_sDomain;
- jabber_id_free(jid);
- return s;
- }
- string CXmppCommCtrl::ToFullJid(const string &bstrJid)
- {
- if (bstrJid.empty())
- return bstrJid;
- JabberID* jid = jabber_id_new(bstrJid);
- if (jid->m_sNode.empty() && !jid->m_sDomain.empty())
- {
- // a jabber id must have domain, but may not have node.
- // so the user's input may be wrongly treated
- jid->m_sNode = jid->m_sDomain;
- jid->m_sDomain = "";
- }
- if (jid->m_sDomain.empty())
- jid->m_sDomain = m_pJabberStream->m_sDomain;
- string s = jid->m_sNode + "@" + jid->m_sDomain;
- if (!jid->m_sResource.empty())
- {
- s += "/";
- s += jid->m_sResource;
- }
- jabber_id_free(jid);
- return s;
- }
- STDMETHODIMP CXmppCommCtrl::SetServer(BSTR bstrServerName, int iServerPort)
- {
- string sServer = ToStringA(bstrServerName);
- //if (sServer.empty())
- // return ThrowError("ERROR: Empty Server Name.");
- if (iServerPort == 0)
- iServerPort = 5222;
- m_pJabberStream->SetServerName(sServer);
- m_pJabberStream->SetServerPort(iServerPort);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::CreateAccount(BSTR bstrUserName, BSTR bstrPassword)
- {
- if (m_pJabberStream->m_StreamState != JABBER_STREAM_OFFLINE)
- return ThrowError("ERROR: Invalid XMPP login state");
- m_pJabberStream->m_sUserName = ToStringA(bstrUserName);
- m_pJabberStream->m_sPassword = ToStringA(bstrPassword);
- if (m_pJabberStream->m_sUserName.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->LookupServer(m_iGeneralDnsChannel, m_pJabberStream->m_sSrvDomain);
- if (m_pJabberStream->m_sDomain.empty()) {
- m_pJabberStream->m_sDomain = m_pJabberStream->m_sSrvDomain;
- }
- bool bServerAvailable = false;
- while (TRUE)
- {
- if (m_pJabberStream->SetNextServer()) {
- bServerAvailable = true;
- }
- else {
- if (!bServerAvailable) {
- return ThrowError("ERROR: No server is available for login.");
- }
- else {
- return ThrowError("ERROR: Unable to login to server.");
- }
- }
- if (m_pJabberStream->jabber_register())
- break;
- }
- KillRegistrationTimer();
- m_iRegistrationTimer = SetTimer(REGISTRATION_TIMER, REGISTRATION_TIMEOUT*1000);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SetTURNUsernamePassword(BSTR bstrUsername, BSTR bstrPassword ) // , BSTR bstrRealm) mainul
- {
- m_sTurnUsername = ToStringA(bstrUsername);
- m_sTurnPassword = ToStringA(bstrPassword);
- // m_sStunRealm = ToStringA(bstrRealm);
- #ifndef USE_NSSTREAM_FOR_XMPP
- m_pAFEngine->SetTURNUsernamePassword(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- m_sTurnUsername, m_sTurnPassword); // , m_sStunRealm);
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::Login(BSTR bstrUserName, BSTR bstrPassword, BSTR bstrResource)
- {
- PAL::Critical_Section cs(*m_pLoginMutex);
- m_pJabberStream->Log("Logging to XMPP as " + ToStringA(bstrUserName) + "/" + ToStringA(bstrResource));
- #ifndef USE_NSSTREAM_FOR_XMPP
- if (!m_bAFEngineInit)
- {
- if (m_pAFEngine->VersionCheckFailed())
- {
- return ThrowError("ERROR: AnyFirewallEngine version mismatch");
- }
- if (!m_pAFEngine->LoadLibraryFailed())
- {
- return ThrowError("ERROR: License expired");
- }
- return ThrowError("ERROR: AnyFirewallEngine failed to load");
- }
- #endif
- if (m_bQuitLogin)
- {
- //Did not call logout yet -- login thread just quit.
- if (m_pLoginThread)
- {
- KillLoginTimer();
- #ifndef USE_NSSTREAM_FOR_XMPP
- {
- //Close DNS Channel
- { PAL::Critical_Section cs(*m_pLoginDnsMutex);
- CLOSE_CHANNEL(m_iLoginDnsChannel);
- } //end of critical section
- }
- #endif
- m_pLoginThread->join();
- SAFE_DELETE(m_pLoginThread);
- }
- }
- if (m_pLoginThread || (m_pJabberStream->m_StreamState != JABBER_STREAM_OFFLINE))
- return ThrowError("ERROR: Invalid XMPP login state.");
- m_pJabberStream->m_sUserName = ToStringA(bstrUserName);
- m_pJabberStream->m_sPassword = ToStringA(bstrPassword);
- if (m_pJabberStream->m_sUserName.empty())
- return ThrowError("ERROR: Please select a User Name.");
- string sResource = ToStringA(bstrResource);
- if (!sResource.empty())
- m_pJabberStream->m_sResource = sResource;
- m_bQuitLogin = false;
- #ifndef USE_NSSTREAM_FOR_XMPP
- // Create DNS Channel
- { PAL::Critical_Section cs(*m_pLoginDnsMutex);
- if (m_iLoginDnsChannel < 0)
- {
- m_iLoginDnsChannel = m_pAFEngine->Create(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- AF_CHANNEL_DNS
- #if (AF_DLL_VERSION > 950000)
- , 0, 0, 0
- #endif
- );
- }
- } //end of critical section
- #endif
- m_pLoginThread = new PAL::Thread(LoginThread, this);
- PAL_ASSERT(m_pLoginThread);
- return S_OK;
- }
- void* CXmppCommCtrl::LoginThread(void* arg)
- {
- SET_CURRENT_THREAD_NAME;
- CXmppCommCtrl* pThis = (CXmppCommCtrl*)arg;
- pThis->LoginThreadImpl();
- return NULL;
- }
- void CXmppCommCtrl::LoginThreadImpl()
- {
- if (m_bQuitLogin)
- return;
- #ifndef USE_NSSTREAM_FOR_XMPP
- //Wait for firewall detection to finish
- m_pJabberStream->Log("Waiting for detect connectivity");
- for (int i = 0; i < 100; i++)
- {
- if (m_pAFEngine->WaitForDetectConnectivity(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- 100) == 0)
- {
- break;
- }
- // Check if the login is to be canceled
- if (m_bQuitLogin){
- m_pJabberStream->Log("Login canceled");
- return;
- }
- }
- m_pJabberStream->Log("Wait for detect connectivity done");
- if (m_bQuitLogin)
- return;
- #endif
- m_pJabberStream->LookupServer(m_iLoginDnsChannel, m_pJabberStream->m_sSrvDomain);
- if (m_bQuitLogin)
- return;
- if (m_pJabberStream->m_sDomain.empty()) {
- m_pJabberStream->m_sDomain = m_pJabberStream->m_sSrvDomain;
- }
- if (m_bQuitLogin)
- return;
- m_pJabberStream->ResetServerIndex();
- bool bServerAvailable = false;
- while (TRUE)
- {
- if (m_bQuitLogin) return;
- if (m_pJabberStream->SetNextServer()) {
- bServerAvailable = true;
- }
- else {
- m_bQuitLogin = true;
- if (!bServerAvailable) {
- m_pJabberStream->Log("Login Response: no server available for login");
- PostMessage(WM_FIRE_LOGIN_RESPONSE, JABBER_LOGIN_SERVER_UNREACHABLE, 0);
- }
- else {
- m_pJabberStream->Log("Login Response: server unreachable");
- PostMessage(WM_FIRE_LOGIN_RESPONSE, JABBER_LOGIN_SERVER_UNREACHABLE, 0);
- }
- return;
- }
- if (m_pJabberStream->jabber_login())
- break;
- m_pJabberStream->jabber_logout();
- }
- KillLoginTimer();
- if (m_bQuitLogin)
- return;
- m_iLoginTimer = SetTimer(LOGIN_TIMER, LOGIN_CONNECT_TIMEOUT*1000);
- }
- STDMETHODIMP CXmppCommCtrl::Logout()
- {
- m_pJabberStream->Log("XMPP logout");
- QuitLogin(true);
- return S_OK;
- }
- void CXmppCommCtrl::QuitLogin(bool bFullClose)
- {
- m_pJabberStream->Log("Quit Login");
- PAL::Critical_Section cs(*m_pLoginMutex);
- m_bQuitLogin = true;
- #ifndef USE_NSSTREAM_FOR_XMPP
- {
- //Close DNS channel
- { PAL::Critical_Section cs(*m_pLoginDnsMutex);
- CLOSE_CHANNEL(m_iLoginDnsChannel);
- } //end of critical section
- }
- #endif
- KillLoginTimer();
- m_pJabberStream->jabber_logout();
- if (bFullClose)
- {
- m_pJabberStream->jabber_full_close();
- }
- else
- {
- m_pJabberStream->jabber_close();
- }
- if (m_pLoginThread)
- {
- m_pLoginThread->join();
- SAFE_DELETE(m_pLoginThread);
- }
- }
- STDMETHODIMP CXmppCommCtrl::SetNATTraversalServer(int iServerType, BSTR bstrAddr, int iPort, VARIANT_BOOL bDone)
- {
- #ifndef USE_NSSTREAM_FOR_XMPP
- string sServerName = TruncateSpace(ToStringA(bstrAddr));
- m_pJabberStream->Log("Setting AFS: iServerType = " + tostring(iServerType) + " " + sServerName + ":" + tostring(iPort) + ", bDone = " + tostring(bDone));
- #if (AF_DLL_VERSION > 950000)
- struct AfConnectionParams connParams;
- connParams.iRTO = 500;
- connParams.iRc = 1;
- connParams.iRm = 16;
- connParams.iTi = 5000;
- #endif
- switch(iServerType)
- {
- case eServerSRV:
- {
- string sSrvDomain = sServerName;
- m_pJabberStream->SetSrvDomain(sSrvDomain);
- }
- break;
- case eServerHttpProxy:
- {
- PAL_DB2("Proxy address: ", sServerName.c_str());
- PAL_DB2("Proxy port: ", iPort);
- if(sServerName.length() > 0 && iPort > 0)
- {
- string sProxyHost = m_pAFEngine->CreateHost(
- AF_HOST_PUBLIC, sServerName, iPort, AF_PROTOCOL_TCP
- #if (AF_DLL_VERSION > 950000)
- , &connParams
- #endif
- );
- #if (AF_DLL_VERSION > 9600000)
- m_pAFEngine->SetHTTPProxy(
- m_iAFEServerStoreID,
- sProxyHost,
- m_pAFEngine->GetHTTPProxyUsername(m_iAFEServerStoreID),
- m_pAFEngine->GetHTTPProxyPassword(m_iAFEServerStoreID),
- m_pAFEngine->GetHTTPProxyDomain(m_iAFEServerStoreID));
- #else
- m_pAFEngine->SetHTTPProxy(
- sProxyHost,
- m_pAFEngine->GetHTTPProxyUsername(),
- m_pAFEngine->GetHTTPProxyPassword(),
- m_pAFEngine->GetHTTPProxyDomain());
- #endif
- }
- }
- break;
- case eServerStunUdp:
- m_sStunServerAddress = sServerName;
- if (iPort == 0)
- iPort = 3478;
- m_iStunServerPort = iPort;
- break;
- case eServerTurnUdp:
- m_sTurnUdpAddress = sServerName;
- m_iTurnUdpPort = iPort;
- break;
- case eServerTurnTcp:
- m_sTurnTcpAddress = sServerName;
- m_iTurnTcpPort = iPort;
- break;
- default: // there is no eServerStunTcp for XMPP
- break;
- }
- if(bDone)
- {
- string sStunHost;
- if (!m_pJabberStream->m_sSrvDomain.empty())
- {
- sStunHost = m_pAFEngine->CreateHost(AF_HOST_DNS_SRV, "_stun._udp." + m_pJabberStream->m_sSrvDomain, 0, AF_PROTOCOL_UDP
- #if (AF_DLL_VERSION > 950000)
- , &connParams
- #endif
- );
- /*
- m_pAFEngine->DNS_SRV_Lookup(m_iLoginDnsChannel,
- "_stun._udp." + m_pJabberStream->m_sSrvDomain,
- AF_PROTOCOL_UDP);
- */
- }
- //---------------------------addtion timing features to be added here--------------
- if ((!m_sStunServerAddress.empty()) && (m_iStunServerPort != 0))
- {
- sStunHost += m_pAFEngine->CreateHost(AF_HOST_PUBLIC,
- m_sStunServerAddress,
- m_iStunServerPort,
- AF_PROTOCOL_UDP
- #if (AF_DLL_VERSION > 950000)
- , &connParams
- #endif
- );
- }
- m_pAFEngine->SetSTUNServer(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- sStunHost);
- //---------------------------------------end -----------------------------------------
- string sTurnHost;
- if (!m_pJabberStream->m_sSrvDomain.empty())
- {
- sTurnHost = m_pAFEngine->CreateHost(AF_HOST_DNS_SRV, "_turn._udp." + m_pJabberStream->m_sSrvDomain, 0, AF_PROTOCOL_UDP
- #if (AF_DLL_VERSION > 950000)
- , &connParams
- #endif
- );
- /* m_pAFEngine->DNS_SRV_Lookup(m_iLoginDnsChannel,
- "_stun-relay._udp." + m_pJabberStream->m_sSrvDomain,
- AF_PROTOCOL_UDP); */
- }
- if ((!m_sTurnUdpAddress.empty()) && (m_iTurnUdpPort != 0))
- {
- sTurnHost += m_pAFEngine->CreateHost(AF_HOST_PUBLIC,
- m_sTurnUdpAddress,
- m_iTurnUdpPort,
- AF_PROTOCOL_UDP
- #if (AF_DLL_VERSION > 950000)
- , &connParams
- #endif
- );
- }
- if (!m_pJabberStream->m_sSrvDomain.empty())
- {
- sTurnHost += m_pAFEngine->CreateHost(AF_HOST_DNS_SRV, "_turn._tcp." + m_pJabberStream->m_sSrvDomain, 0, AF_PROTOCOL_TCP
- #if (AF_DLL_VERSION > 950000)
- , &connParams
- #endif
- );
- /* m_pAFEngine->DNS_SRV_Lookup(m_iLoginDnsChannel,
- "_stun-relay._tcp." + m_pJabberStream->m_sSrvDomain,
- AF_PROTOCOL_TCP); */
- }
- if ((!m_sTurnTcpAddress.empty()) && (m_iTurnTcpPort != 0))
- {
- sTurnHost += m_pAFEngine->CreateHost(AF_HOST_PUBLIC,
- m_sTurnTcpAddress,
- m_iTurnTcpPort,
- AF_PROTOCOL_TCP
- #if (AF_DLL_VERSION > 950000)
- , &connParams
- #endif
- );
- }
- m_pAFEngine->SetTURNServer(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- sTurnHost);
- #if (AF_DLL_VERSION > 950000)
- AfFirewallDetectionParams param;
- param.iDetectUdpConnectivity = 1;
- param.iDetectTcpConnectivity = 1;
- param.iDetectProxyConnectivity = 1;
- param.iDetectUPnPConnectivity = 1;
- param.iCheckTurnCredentials = 0;
- param.iUPnPDeviceDiscoveryTimeout = 500;
- m_pAFEngine->DetectConnectivity(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- /*NULL*/¶m);
- #else
- m_pAFEngine->DetectConnectivity();
- #endif
- }
- m_pJabberStream->Log("DetectConnectivity called");
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::AddContact(
- BSTR bstrJid,
- BSTR bstrFirstName,
- BSTR bstrLastName,
- BSTR bstrDisplayName,
- BSTR bstrGroupName)
- {
- string sJID = ToBareJid(ToStringA(bstrJid));
- string sDisplayName = ToStringU8(bstrDisplayName);
- string sGroupName = ToStringU8(bstrGroupName);
- if (sJID.empty())
- return ThrowError("ERROR: Empty ID.");
- if (sJID.size() > 2047)
- return ThrowError("ERROR: Contact's length too long.");
- if (compare_i(sJID, m_pJabberStream->jabber_get_bare_jid()))
- return ThrowError("ERROR: Invalid contact.");
- if (m_pJabberStream->m_pJabberBuddy->jabber_is_in_buddy_list(sJID))
- return ThrowError("ERROR: Already in the contact list.");
- m_pJabberStream->m_pJabberRoster->jabber_roster_add_buddy(
- sJID,
- sDisplayName,
- sGroupName);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RemoveContact(BSTR bstrJid)
- {
- string sJID = ToBareJid(ToStringA(bstrJid));
- if (sJID.empty())
- return ThrowError("ERROR: Empty ID.");
- #ifdef USE_REMOVE_BUDDY
- m_pJabberStream->m_pJabberRoster->jabber_roster_remove_buddy(sJID);
- #else
- m_pJabberStream->m_pJabberPresence->jabber_presence_subscription_set(sJID, "unsubscribe");
- m_pJabberStream->m_pJabberBuddy->jabber_buddy_remove(sJID);
- #endif
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::GetContactList(SAFEARRAY **pVal)
- #else
- STDMETHODIMP CXmppCommCtrl::GetContactList(std::vector<std::string> *pVal)
- #endif
- {
- CHECK_POINTER(pVal);
- ListofString ls;
- m_pJabberStream->m_pJabberBuddy->jabber_get_buddy_list(ls);
- ListofString::const_iterator iter = ls.begin();
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aContacts(ls.size());
- int nIndex = 0;
- for (; iter != ls.end(); ++iter)
- {
- aContacts.PutString(nIndex++, *iter);
- }
- aContacts.Detach(pVal);
- #else
- pVal->clear();
- for (; iter != ls.end(); ++iter)
- {
- pVal->push_back(*iter);
- }
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_ContactDisplayName(BSTR bstrJid, BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- string sDisplayName = GetContactDisplayName(sJid);
- BstrFromStringU8(pVal, sDisplayName);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_ContactDisplayName(BSTR bstrJid, BSTR newVal)
- {
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- string sDisplayName = ToStringU8(newVal);
- JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sJid);
- if (jb)
- {
- jb->m_sDisplayName = sDisplayName;
- }
- if (!m_pJabberStream->m_pJabberRoster->jabber_roster_alias_change(sJid, sDisplayName))
- {
- m_pJabberStream->m_pJabberBuddy->SetExtDisplayName(sJid, sDisplayName);
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_Nickname(BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- string sDisplayName = m_pJabberStream->m_sDisplayName;
- if (sDisplayName.empty())
- {
- sDisplayName = jabber_get_node(m_pJabberStream->jabber_get_bare_jid());
- }
- BstrFromStringU8(pVal, sDisplayName);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_Nickname(BSTR newVal)
- {
- string sDisplayName = ToStringU8(newVal);
- if (m_pJabberStream->m_sDisplayName != sDisplayName)
- {
- m_pJabberStream->m_sDisplayName = sDisplayName;
- if (m_pJabberStream->m_StreamState != JABBER_STREAM_OFFLINE)
- {
- m_pJabberStream->m_pJabberIQ->StorePrivateData(
- "nick",
- "http://jabber.org/protocol/nick",
- sDisplayName);
- m_pJabberStream->SendNicknameToContacts(sDisplayName);
- }
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::AddContactResponse(BSTR bstrJid, VARIANT_BOOL bAccept)
- {
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberPresence->jabber_presence_subscription_set(
- sJid,
- ToBOOL(bAccept) ? "subscribed" : "unsubscribed");
- // Sept 19, 2005: requested by Comcast to remove buddy if rejecting an add contact request
- //if (!bAccept)
- //{
- // m_pJabberStream->m_pJabberRoster->jabber_roster_remove_buddy(sJid);
- //}
- /*
- if (bAccept)
- {
- JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sJid);
- if (jb)
- {
- if (jb->m_sSubscription == "none"
- && (jb->m_iSubscription & JABBER_SUB_PENDING) == 0)
- {
- m_pJabberStream->m_pJabberPresence->jabber_presence_subscription_set(
- sJid, "subscribe");
- }
- }
- }
- */
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GuestAddContactResponse(BSTR bstrGuestEmail, VARIANT_BOOL bAccept)
- {
- string sGuestEmail = ToStringA(bstrGuestEmail);
- if (sGuestEmail.empty())
- return ThrowError("ERROR: Empty guest email address.");
- m_pJabberStream->m_pJabberMessage->GuestAddContactResponse(
- sGuestEmail,
- ToBOOL(bAccept));
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::GetContactResource(BSTR bstrJid, SAFEARRAY **pVal)
- #else
- STDMETHODIMP CXmppCommCtrl::GetContactResource(BSTR bstrJid, std::vector<std::string> *pVal)
- #endif
- {
- CHECK_POINTER(pVal);
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sJid);
- if (!jb)
- return ThrowError("ERROR: Invalid user name.");
- JabberResourceList::iterator iter = jb->m_resourceList.begin();
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aResource(jb->m_resourceList.size() * 7);
- int iIndex = 0;
- for (; iter != jb->m_resourceList.end(); ++iter)
- {
- JabberBuddyResource* jbr = *iter;
- aResource.PutBstr(iIndex++, StringU8ToBstr(jbr->m_sResourceName));
- aResource.PutBstr(iIndex++, StringU8ToBstr(jbr->m_sShowState));
- aResource.PutBstr(iIndex++, StringU8ToBstr(jbr->m_sStatus));
- aResource.PutString(iIndex++, jbr->m_sAvatar);
- aResource.PutString(iIndex++, itoa(jbr->m_bVideoSupport));
- aResource.PutString(iIndex++, itoa(jbr->m_bAudioSupport));
- aResource.PutString(iIndex++, jbr->m_iDeliveryReceiptSupport == DELIVERY_RECEIPT_CAPS_SUPPORTED ? "1" : "0");
- }
- aResource.Detach(pVal);
- #else
- pVal->clear();
- for (; iter != jb->m_resourceList.end(); ++iter)
- {
- JabberBuddyResource* jbr = *iter;
- pVal->push_back(jbr->m_sResourceName);
- pVal->push_back(jbr->m_sShowState);
- pVal->push_back(jbr->m_sStatus);
- pVal->push_back(jbr->m_sAvatar);
- pVal->push_back(itoa(jbr->m_bVideoSupport));
- pVal->push_back(itoa(jbr->m_bAudioSupport));
- pVal->push_back(jbr->m_iDeliveryReceiptSupport == DELIVERY_RECEIPT_CAPS_SUPPORTED ? "1" : "0");
- }
- #endif
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::GetContactGroupList(BSTR bstrJid, SAFEARRAY **pVal)
- #else
- STDMETHODIMP CXmppCommCtrl::GetContactGroupList(BSTR bstrJid, std::vector<std::string> *pVal)
- #endif
- {
- CHECK_POINTER(pVal);
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sJid);
- if (!jb)
- return ThrowError("ERROR: Invalid user name.");
- ListofString::iterator iter = jb->m_groupList.begin();
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aGroups(jb->m_groupList.size());
- int iIndex = 0;
- for (; iter != jb->m_groupList.end(); ++iter)
- {
- aGroups.PutBstr(iIndex++, StringU8ToBstr(*iter));
- }
- aGroups.Detach(pVal);
- #else
- pVal->clear();
- for (; iter != jb->m_groupList.end(); ++iter)
- {
- pVal->push_back(*iter);
- }
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::AddContactGroup(BSTR bstrJid, BSTR bstrGroup)
- {
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- string sGroup = ToStringU8(bstrGroup);
- if (sGroup.empty())
- return ThrowError("ERROR: Empty group name.");
- m_pJabberStream->m_pJabberRoster->jabber_roster_group_add(sJid, sGroup);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RemoveContactGroup(BSTR bstrJid, BSTR bstrGroup)
- {
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- string sGroup = ToStringU8(bstrGroup);
- if (sGroup.empty())
- return ThrowError("ERROR: Empty group name.");
- m_pJabberStream->m_pJabberRoster->jabber_roster_group_remove(sJid, sGroup);
- return S_OK;
- }
- //Removed
- //November 11, 2008
- //STDMETHODIMP CXmppCommCtrl::GetMyResource(SAFEARRAY **pVal)
- //{
- // CHECK_POINTER(pVal);
- // string sBareJid = m_pJabberStream->jabber_get_bare_jid();
- //
- // JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sBareJid);
- // //JabberBuddy* jb = new JabberBuddy;
- // if (!jb)
- // return S_OK;
- //
- // int iSize = jb->m_resourceList.size() * 5;
- // if (iSize <= 0)
- // return S_OK;
- //
- // JabberResourceList::iterator iter = jb->m_resourceList.begin();
- // for (; iter != jb->m_resourceList.end(); ++iter)
- // {
- // JabberBuddyResource* jbr = *iter;
- // if (jbr->m_sResourceName == m_pJabberStream->m_sResource)
- // {
- // iSize -= 5;
- // }
- // }
- //
- // if (iSize <= 0)
- // {
- // return S_OK;
- // }
- //
- // BstrArray aResources(iSize);
- // int iIndex = 0;
- // iter = jb->m_resourceList.begin();
- // for (; iter != jb->m_resourceList.end(); ++iter)
- // {
- // JabberBuddyResource* jbr = *iter;
- // if (jbr->m_sResourceName == m_pJabberStream->m_sResource)
- // continue;
- //
- // if (jbr->m_sShowState.empty())
- // jbr->m_sShowState = "Available";
- //
- // aResources.PutBstr(iIndex++, StringU8ToBstr(jbr->m_sResourceName));
- // aResources.PutBstr(iIndex++, StringU8ToBstr(jbr->m_sShowState));
- // aResources.PutBstr(iIndex++, StringU8ToBstr(jbr->m_sStatus));
- // aResources.PutString(iIndex++, jbr->m_sAvatar);
- // aResources.PutString(iIndex++, itoa(jbr->m_bVideoSupport));
- // }
- //
- // aResources.Detach(pVal);
- // return S_OK;
- //}
- //
- STDMETHODIMP CXmppCommCtrl::SendChatMessage(int iChatID, BSTR bstrJid, BSTR bstrMsg)
- {
- BSTR bstrHtml;
- BstrFromString(&bstrHtml, string(""));
- return SendChatMessageHTML(iChatID, bstrJid, bstrMsg, bstrHtml);
- }
- STDMETHODIMP CXmppCommCtrl::SendChatMessageHTML(
- int iChatID,
- BSTR bstrJid,
- BSTR bstrMsg,
- BSTR bstrHTML)
- {
- string sMsg = ToStringU8(bstrMsg);
- string sHtml = ToStringU8(bstrHTML);
- if (sMsg.empty() && sHtml.empty())
- return ThrowError("ERROR: Empty chat message and HTML message.");
- string sJid = ToFullJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- #if 0
- if (sMsg.length() <= 2)
- {
- int nCh = atoi(sMsg.c_str());
- char szTest[1];
- szTest[0] = nCh;
- szTest[1] = '\0';
- sMsg.assign(szTest);
- }
- #endif
- int iMessageID = m_pJabberStream->m_pJabberMessage->jabber_message_send_chat(iChatID, sJid, sMsg, sHtml);
- if (iMessageID <= 0)
- return ThrowError("ERROR: Invalid XHTML message");
- return (HRESULT)iMessageID;
- }
- STDMETHODIMP CXmppCommCtrl::AddBlock(BSTR bstrJid)
- {
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberPrivacy->jabber_privacy_add_block(sJid);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RemoveBlock(BSTR bstrJid)
- {
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberPrivacy->jabber_privacy_remove_block(sJid);
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::GetBlockList(SAFEARRAY **pVal)
- #else
- STDMETHODIMP CXmppCommCtrl::GetBlockList(std::vector<std::string> *pVal)
- #endif
- {
- CHECK_POINTER(pVal);
- ListofString ls;
- m_pJabberStream->m_pJabberPrivacy->jabber_privacy_get_block_list(ls);
- ListofString::iterator iter = ls.begin();
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray a(ls.size());
- int i = 0;
- for (; iter != ls.end(); ++iter)
- {
- a.PutString(i++, *iter);
- }
- a.Detach(pVal);
- #else
- pVal->clear();
- for(; iter != ls.end(); ++iter)
- {
- pVal->push_back(*iter);
- }
- #endif
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::GetChatSessionParticipants(int iChatID, SAFEARRAY** pVal)
- #else
- STDMETHODIMP CXmppCommCtrl::GetChatSessionParticipants(int iChatID, std::vector<std::string> *pVal)
- #endif
- {
- SetofString participants;
- m_pJabberStream->m_pJabberMessage->jabber_get_chat_session_participants(iChatID, participants);
- tstring id = m_pJabberStream->m_sUserName;
- //Remove your own id
- participants.erase(m_pJabberStream->NormalizeJid(ToFullJid(m_pJabberStream->m_sUserName)));
- SetofString::iterator iterSS = participants.begin();
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aJid(participants.size());
- int i = 0;
- for (; iterSS != participants.end(); iterSS++) {
- aJid.PutString(i++, *iterSS);
- }
- aJid.Detach(pVal);
- #else
- pVal->clear();
- for(; iterSS != participants.end(); iterSS++)
- {
- pVal->push_back(*iterSS);
- }
- #endif
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::SendMulticastMessage(int iChatID, VARIANT vJid, BSTR bstrMsg)
- #else
- STDMETHODIMP CXmppCommCtrl::SendMulticastMessage(int iChatID, const std::vector<std::string> &vJid, BSTR bstrMsg)
- #endif
- {
- BSTR bstrHtml;
- BstrFromString(&bstrHtml, string(""));
- return SendMulticastMessageHTML(iChatID, vJid, bstrMsg, bstrHtml);
- }
- STDMETHODIMP CXmppCommCtrl::SendMulticastMessageHTML(
- int iChatID,
- #ifdef USE_VARIANT_IN_EVENT
- VARIANT vJid,
- #else
- const std::vector<std::string> &vJid,
- #endif
- BSTR bstrMsg,
- BSTR bstrHTML)
- {
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aJid;
- aJid.Attach(&vJid);
- int iSize = aJid.GetSize();
- #else
- int iSize = vJid.size();
- #endif
- if (iSize == 0)
- return ThrowError("ERROR: Empty recipient.");
- string sMsg = ToStringU8(bstrMsg);
- string sHtml = ToStringU8(bstrHTML);
- if (sMsg.empty() && sHtml.empty())
- return ThrowError("ERROR: Empty message.");
- SetofString ss;
- for (int i = 0; i < iSize; i++)
- {
- #ifdef USE_VARIANT_IN_EVENT
- ss.insert(ToFullJid(ToStringA(aJid.GetBstr(i))));
- #else
- ss.insert(ToFullJid(ToStringA(vJid[i])));
- #endif
- }
- bool bGoodHtml = m_pJabberStream->m_pJabberMessage->jabber_message_send_multicast(
- iChatID,
- ss,
- sMsg,
- sHtml);
- #ifdef USE_VARIANT_IN_EVENT
- aJid.Detach();
- #endif
- if (!bGoodHtml) {
- return ThrowError("ERROR: Invalid XHTML message");
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SendXML(BSTR bstrXML)
- {
- string sMsg = ToStringU8(bstrXML);
- if (sMsg.empty())
- {
- return ThrowError("ERROR: Empty XML message.");
- }
- m_pJabberStream->jabber_send_raw(sMsg);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::TransportMode(BSTR bstrTransportMode)
- {
- string sMode = ToStringA(bstrTransportMode);
- if (sMode.empty())
- return ThrowError("ERROR: Empty Transport Mode.");
- if (m_pJabberStream->m_StreamState != JABBER_STREAM_OFFLINE)
- return ThrowError("ERROR: Must be logout first.");
- if (compare_i(sMode, "tls"))
- {
- m_pJabberStream->UseTLS(true);
- }
- else
- {
- m_pJabberStream->UseTLS(false);
- if (!compare_i(sMode, "tcp"))
- {
- return ThrowError(sMode +" Transport Mode not supported.");
- }
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SetApplicationActiveMode(int eApplicationActiveMode)
- {
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::ApplicationKeepAliveHandler()
- {
- m_pJabberStream->Log("ApplicationKeepAliveHandler");
- if (m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED)
- {
- m_pJabberStream->jabber_keepalive();
- }
- return S_OK;
- }
- #ifdef PROXY_DETECTION
- STDMETHODIMP CXmppCommCtrl::DetectHttpProxy(VARIANT_BOOL* pVal)
- {
- CHECK_POINTER(pVal);
- *pVal = VARIANT_FALSE;
- if (m_ProxyDetection)
- {
- tstring sUrl = m_pJabberStream->GetServerName();
- long nPort = m_pJabberStream->GetServerPort();
- CComBSTR bstrUrl = ToBstr(sUrl);
- VARIANT_BOOL vbDetected = VARIANT_FALSE;
- if (SUCCEEDED(m_ProxyDetection->DetectHTTPProxy(bstrUrl, nPort, &vbDetected)))
- {
- if (vbDetected == VARIANT_TRUE)
- {
- CComBSTR bstrAddress;
- m_ProxyDetection->GetDetectedAddress(&bstrAddress);
- m_ProxyDetection->GetDetectedPort(&nPort);
- string sAddress = ToStringA(bstrAddress);
- if (!sAddress.empty())
- {
- SetNATTraversalServer(eServerHttpProxy, bstrAddress, nPort, false);
- *pVal = VARIANT_TRUE;
- }
- }
- }
- }
- return S_OK;
- }
- #endif
- STDMETHODIMP CXmppCommCtrl::CreateChatSession(int *pVal)
- {
- CHECK_POINTER(pVal);
- *pVal = m_pJabberStream->m_pJabberMessage->jabber_new_chat_session_id();
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_IsSubscriptionPending(BSTR bstrJid, VARIANT_BOOL *pVal)
- {
- CHECK_POINTER(pVal);
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sJid);
- if (!jb)
- return ThrowError("ERROR: Invalid user name.");
- if (jb->m_resourceList.size() != 0)
- {
- *pVal = ToVB(FALSE);
- }
- else
- {
- *pVal = ToVB((jb->m_iSubscription & JABBER_SUB_PENDING) != 0);
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_IgnoreResource(VARIANT_BOOL *pVal)
- {
- CHECK_POINTER(pVal);
- *pVal = ToVB(m_pJabberStream->m_bIgnoreResource);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_IgnoreResource(VARIANT_BOOL newVal)
- {
- m_pJabberStream->m_bIgnoreResource = ToBOOL(newVal);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RetrieveOfflineMessage(BSTR bstrJid)
- {
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberMessage->jabber_retrieve_offline_message(sJid, 0);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RemoveOfflineMessage(BSTR bstrJid, BSTR bstrMsgID)
- {
- CHECK_LOGIN();
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberMessage->jabber_remove_offline_message(
- sJid,
- ToStringA(bstrMsgID));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RetrieveContactProfile(BSTR bstrJid)
- {
- CHECK_LOGIN();
- string s = ToBareJid(ToStringA(bstrJid));
- if (s.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberRoster->jabber_roster_retrieve_vcard(s);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetPresenceState(BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pJabberStream->m_sPresenceState);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetPresenceStatus(BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromStringU8(pVal, m_pJabberStream->m_sPresenceStatus);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SetPresence(BSTR bstrState, BSTR bstrStatus)
- {
- CHECK_LOGIN();
- string s = ToStringA(bstrState);
- if (!jabber_presence_state_validate(s))
- return ThrowError("ERROR: Invalid presence state.");
- if (compare_i(s, "available"))
- s = "chat";
- m_pJabberStream->m_sPresenceState = s;
- m_pJabberStream->m_sPresenceStatus = ToStringU8(bstrStatus);
- m_pJabberStream->m_pJabberPresence->jabber_presence_send(
- m_pJabberStream->m_sPresenceState,
- m_pJabberStream->m_sPresenceStatus);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::IsLoggedIn(VARIANT_BOOL *pVal)
- {
- CHECK_POINTER(pVal);
- *pVal = ToVB(m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::IsInContactList(BSTR bstrJid, VARIANT_BOOL *pVal)
- {
- CHECK_POINTER(pVal);
- CHECK_LOGIN();
- string sJid = ToBareJid(ToStringA(bstrJid));
- *pVal = ToVB(m_pJabberStream->m_pJabberBuddy->jabber_is_in_buddy_list(sJid));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_UserName(BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- CHECK_LOGIN();
- BstrFromString(pVal, m_pJabberStream->m_sUserName);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_Domain(BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pJabberStream->m_sDomain);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_Domain(BSTR newVal)
- {
- if (m_pJabberStream->m_StreamState != JABBER_STREAM_OFFLINE)
- return ThrowError("ERROR: Invalid XMPP login state.");
- m_pJabberStream->m_sDomain = ToStringA(newVal);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SetVideoSupport(VARIANT_BOOL bSupport)
- {
- // video support can be toggled on/off
- m_pJabberStream->m_bVideoSupport = ToBOOL(bSupport);
- if (m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED)
- m_pJabberStream->m_pJabberPresence->UpdateVideoSupport();
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SetAudioSupport(VARIANT_BOOL bSupport)
- {
- m_pJabberStream->m_bAudioSupport = ToBOOL(bSupport);
- #ifndef _COMCAST
- // setting audio support also sends capability message
- if (m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED)
- m_pJabberStream->m_pJabberPresence->UpdateVideoSupport();
- #endif
- return S_OK;
- }
- void CXmppCommCtrl::KillLoginTimer()
- {
- if (m_iLoginTimer)
- KillTimer(m_iLoginTimer);
- m_iLoginTimer = 0;
- }
- void CXmppCommCtrl::KillRegistrationTimer()
- {
- if (m_iRegistrationTimer)
- KillTimer(m_iRegistrationTimer);
- m_iRegistrationTimer = 0;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::GetAllowList(SAFEARRAY **pVal)
- #else
- STDMETHODIMP CXmppCommCtrl::GetAllowList(std::vector<std::string> *pVal)
- #endif
- {
- CHECK_POINTER(pVal);
- CHECK_LOGIN();
- ListofString ls;
- m_pJabberStream->m_pJabberBuddy->jabber_get_allow_list(ls);
- ListofString::const_iterator iter = ls.begin();
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aContacts(ls.size());
- int nIndex = 0;
- for (; iter != ls.end(); ++iter)
- {
- aContacts.PutString(nIndex++, *iter);
- }
- aContacts.Detach(pVal);
- #else
- pVal->clear();
- for(; iter != ls.end(); iter++)
- {
- pVal->push_back(*iter);
- }
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SendTypingEvent(int iChatID, BSTR bstrJid, VARIANT_BOOL bStart)
- {
- CHECK_LOGIN();
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberMessage->jabber_send_typing_event(iChatID, sJid, ToBOOL(bStart));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_Avatar(BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pJabberStream->m_sAvatar);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_Avatar(BSTR newVal)
- {
- string sAvatar = ToStringA(newVal);
- if (sAvatar.empty())
- return ThrowError("ERROR: Empty avatar.");
- m_pJabberStream->m_sAvatar = sAvatar;
- m_pJabberStream->m_pJabberPresence->jabber_update_avatar();
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SetAvatar(BSTR bstrFile)
- {
- #ifdef USE_VCARD_FOR_AVATAR
- string sAvatar = ToStringA(bstrFile);
- if (sAvatar.empty()){
- if(!m_pJabberStream->m_mpVCard[eVCardInfoTypeAvatarHash].empty()){
- m_pJabberStream->m_mpVCard[eVCardInfoTypeAvatarHash].clear();
- m_pJabberStream->m_mpVCard[eVCardInfoTypePublishedAvatarHash] = INVALID_STRING;
- m_pJabberStream->m_mpVCard[eVCardInfoTypeAvatarPath].clear();
- m_pJabberStream->m_pJabberPresence->jabber_update_avatar();
- }
- }
- else{
- // Get image type from extension
- size_t dotPos = sAvatar.find_last_of('.');
- if(dotPos == string::npos){
- return ThrowError("Invalid image type for avatar.");
- }
- string sType = sAvatar.substr(dotPos + 1);
- ifstream fileReader(sAvatar.c_str(), ios::in | ios::binary);
- if(!fileReader.is_open()){
- return ThrowError("Error in opening image file for avatar.");
- }
- // Check size of the iamge
- long begin = (long)fileReader.tellg();
- fileReader.seekg (0, ios::end);
- long end = (long)fileReader.tellg();
- long size = end - begin;
- if(size > (8 * 1024)){
- fileReader.close();
- return ThrowError("Avatar file size too large.");
- }
- fileReader.seekg (0, ios::beg);
- ostringstream oss;
- oss << fileReader.rdbuf();
- string sImageData(oss.str());
- string sImageHash = jabber_sha_hash(sImageData);
- // publish if it's a different image
- if(m_pJabberStream->m_mpVCard[eVCardInfoTypeAvatarHash] != sImageHash){
- m_pJabberStream->m_mpVCard[eVCardInfoTypeAvatarHash] = sImageHash;
- m_pJabberStream->m_mpVCard[eVCardInfoTypePublishedAvatarHash] = sImageHash;
- m_pJabberStream->m_pJabberRoster->jabber_vcard_set_photo(sType, sImageData);
- // presence will be published after server acknowledges vcard publication
- }
- }
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::DownloadAvatar(BSTR bstrJid, BSTR bstrDir)
- {
- #ifdef USE_VCARD_FOR_AVATAR
- string sJid = ToBareJid(ToStringA(bstrJid));
- std::map<EVCardInfoType, std::string> *pmpVCard = NULL;
- if (sJid.empty()){
- // Self
- sJid = m_pJabberStream->jabber_get_bare_jid();
- pmpVCard = &m_pJabberStream->m_mpVCard;
- }
- else{
- JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sJid);
- if (!jb)
- return ThrowError("ERROR: Invalid user name.");
- pmpVCard = &jb->m_mpVCard;
- }
- if((*pmpVCard)[eVCardInfoTypeAvatarHash] == (*pmpVCard)[eVCardInfoTypePublishedAvatarHash]){
- // Fire an event to let know avatar is ready
- FIRE_EVENT(Fire_OnAvatarDownloaded, sJid, (*pmpVCard)[eVCardInfoTypeAvatarPath]);
- return S_OK;
- }
- (*pmpVCard)[eVCardInfoTypeAvatarPath] = ToStringA(bstrDir);
- m_pJabberStream->m_pJabberRoster->jabber_vcard_request(ToBareJid(ToStringA(bstrJid))); // Send bstrJid instead of sJid because jabber_vcard_request takes empty string for self
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SendEmotiphon(int iChatID, BSTR bstrJid, BSTR bstrEmotiphon)
- {
- CHECK_LOGIN();
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- string sEmotiphon = ToStringU8(bstrEmotiphon);
- if (sEmotiphon.empty())
- return ThrowError("ERROR: Empty emotiphon.");
- m_pJabberStream->m_pJabberMessage->jabber_send_emotiphon(iChatID, sJid, sEmotiphon);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_SeeContactState(BSTR bstrJid, VARIANT_BOOL *pVal)
- {
- CHECK_LOGIN();
- CHECK_POINTER(pVal);
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- *pVal = ToVB(m_pJabberStream->m_pJabberPrivacy->GetSeeContactState(sJid));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_SeeContactState(BSTR bstrJid, VARIANT_BOOL newVal)
- {
- CHECK_LOGIN();
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberPrivacy->SetSeeContactState(sJid, ToBOOL(newVal));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_BlockContactMessage(BSTR bstrJid, VARIANT_BOOL *pVal)
- {
- CHECK_LOGIN();
- CHECK_POINTER(pVal);
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- *pVal = ToVB(m_pJabberStream->m_pJabberPrivacy->GetBlockContactMessage(sJid));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_BlockContactMessage(BSTR bstrJid, VARIANT_BOOL newVal)
- {
- CHECK_LOGIN();
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberPrivacy->SetBlockContactMessage(sJid, ToBOOL(newVal));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_AllowViewMyState(BSTR bstrJid, VARIANT_BOOL *pVal)
- {
- CHECK_LOGIN();
- CHECK_POINTER(pVal);
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- *pVal = ToVB(m_pJabberStream->m_pJabberPrivacy->GetAllowViewMyState(sJid));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_AllowViewMyState(BSTR bstrJid, VARIANT_BOOL newVal)
- {
- CHECK_LOGIN();
- string sJid = ToBareJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberPrivacy->SetAllowViewMyState(sJid, ToBOOL(newVal));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_Version(BSTR *pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pJabberStream->m_sVersion);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_Version(BSTR newVal)
- {
- CHECK_NOT_LOGGEDIN();
- string sVersion = ToStringA(newVal);
- if (sVersion.empty())
- return ThrowError("ERROR: Empty version number.");
- m_pJabberStream->m_sVersion = sVersion;
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_SignalPort(int *pVal)
- {
- CHECK_POINTER(pVal);
- *pVal = 0;
- m_pJabberStream->Log("get_SignalPort not supported");
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_SignalPort(int newVal)
- {
- CHECK_NOT_LOGGEDIN();
- m_pJabberStream->Log("put_SignalPort not supported");
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::GetContactListInGroup(BSTR bstrGroupName, SAFEARRAY **pVal)
- #else
- STDMETHODIMP CXmppCommCtrl::GetContactListInGroup(BSTR bstrGroupName, std::vector<std::string> *pVal)
- #endif
- {
- CHECK_LOGIN();
- CHECK_POINTER(pVal);
- string sGroupName = ToStringU8(bstrGroupName);
- if (sGroupName.empty())
- return ThrowError("ERROR: Empty group name.");
- ListofString ls;
- m_pJabberStream->m_pJabberBuddy->GetContactListInGroup(sGroupName, ls);
- ListofString::const_iterator iter = ls.begin();
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aContacts(ls.size());
- int nIndex = 0;
- for (; iter != ls.end(); ++iter)
- {
- aContacts.PutString(nIndex++, *iter);
- }
- aContacts.Detach(pVal);
- #else
- pVal->clear();
- for(; iter != ls.end(); iter++)
- {
- pVal->push_back(*iter);
- }
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::ChangeGroupName(BSTR bstrJid, BSTR bstrOldGroupName, BSTR bstrNewGroupName)
- {
- CHECK_LOGIN();
- string sOldGroupName = ToStringU8(bstrOldGroupName);
- string sNewGroupName = ToStringU8(bstrNewGroupName);
- if (sOldGroupName.empty() || sNewGroupName.empty())
- return ThrowError("ERROR: Empty group name");
- string sJid = ToBareJid(ToStringA(bstrJid));
- m_pJabberStream->m_pJabberRoster->ChangeGroupName(sJid, sOldGroupName, sNewGroupName);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_KeepAlivePeriod(int *pVal)
- {
- CHECK_POINTER(pVal);
- *pVal = m_iKeepAlivePeriod;
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_KeepAlivePeriod(int newVal)
- {
- if (newVal <= 0)
- newVal = 0;
- m_pJabberStream->Log("Setting keep alive period to " + tostring(newVal));
- m_iConsecutiveKeepalives = 0;
- m_iKeepAlivePeriod = newVal;
- if (m_iKeepAliveTimer)
- {
- KillTimer(m_iKeepAliveTimer);
- m_iKeepAliveTimer = 0;
- }
- if (m_iKeepAlivePeriod)
- {
- m_iKeepAliveTimer = SetTimer(KEEP_ALIVE_TIMER, m_iKeepAlivePeriod*1000);
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SendPresence(BSTR bstrJid)
- {
- CHECK_LOGIN();
- string sJid = ToFullJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name.");
- m_pJabberStream->m_pJabberPresence->SendPresence(sJid);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::ContinueLogin()
- {
- m_pJabberStream->m_pJabberIQ->jabber_iq_accept_prefs();
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- STDMETHODIMP CXmppCommCtrl::SendExitChat(int iChatID, VARIANT vJID)
- #else
- STDMETHODIMP CXmppCommCtrl::SendExitChat(int iChatID, const std::vector<std::string> &vJID)
- #endif
- {
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aJid;
- aJid.Attach(&vJID);
- int iSize = aJid.GetSize();
- #else
- int iSize = vJID.size();
- #endif
- if (iSize == 0)
- return ThrowError("ERROR: Empty recipient.");
- SetofString ss;
- for (int i = 0; i < iSize; i++)
- {
- #ifdef USE_VARIANT_IN_EVENT
- ss.insert(ToFullJid(ToStringA(aJid.GetBstr(i))));
- #else
- ss.insert(ToFullJid(ToStringA(vJID[i])));
- #endif
- }
- #ifdef USE_VARIANT_IN_EVENT
- aJid.Detach();
- #endif
- m_pJabberStream->m_pJabberMessage->jabber_send_exit_chat(iChatID, ss);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_HashedPassword(BSTR* pVal)
- {
- CHECK_LOGIN();
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pJabberStream->m_pJabberAuth->GetHashedPassword());
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_HashedPassword(BSTR newVal)
- {
- if (m_pJabberStream->m_StreamState == JABBER_STREAM_CONNECTED)
- return ThrowError("ERROR: Already loggin.");
- m_pJabberStream->m_pJabberAuth->SetHashedPassword(ToStringA(newVal));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::StorePrivateData(BSTR bstrName, BSTR bstrNameSpace, BSTR bstrData)
- {
- CHECK_LOGIN();
- string sName = ToStringA(bstrName);
- string sNameSpace = ToStringA(bstrNameSpace);
- string sData = ToStringU8(bstrData);
- if (sName.empty() || sNameSpace.empty() || sData.empty())
- return ThrowError("ERROR: Empty string.");
- m_pJabberStream->m_pJabberIQ->StorePrivateData(sName, sNameSpace, sData);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RetrievePrivateData(BSTR bstrName, BSTR bstrNameSpace)
- {
- CHECK_LOGIN();
- string sName = ToStringA(bstrName);
- string sNameSpace = ToStringA(bstrNameSpace);
- if (sName.empty() || sNameSpace.empty())
- return ThrowError("ERROR: Empty string.");
- m_pJabberStream->m_pJabberIQ->RetrievePrivateData(sName, sNameSpace);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SendPresence2(BSTR bstrJid, BSTR bstrState, BSTR bstrStatus)
- {
- CHECK_LOGIN();
- string sJid = ToFullJid(ToStringA(bstrJid));
- if (sJid.empty())
- return ThrowError("ERROR: Please select a User Name");
- string sState = ToStringA(bstrState);
- if (sState.empty())
- return ThrowError("ERROR: Empty state.");
- m_pJabberStream->m_pJabberPresence->SendPresence2(sJid, sState, ToStringU8(bstrStatus));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SendFile(
- BSTR bstrJid,
- BSTR bstrFileName,
- int* pVal)
- {
- CHECK_LOGIN();
- CHECK_POINTER(pVal);
- string sJid = ToFullJid(ToStringA(bstrJid));
- if (sJid.empty())
- {
- return ThrowError("ERROR: Please select a User Name.");
- }
- int nFileId = GetNextFileId();
- // SendFileHelper takes wide-byte string as file name
- string sErrorMsg = SendFileHelper(sJid, ToString(bstrFileName), nFileId);
- if (!sErrorMsg.empty())
- {
- return ThrowError(sErrorMsg);
- }
- *pVal = nFileId;
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::AcceptFileTransfer(int nFileId, BSTR bstrFileName, VARIANT_BOOL bAccept)
- {
- // CHECK_LOGIN();
- #ifndef NO_FILE_TRANSFER
- bool bIsAccept = (bAccept == VARIANT_TRUE);
- FtContainer* pFt;
- FtContainerMap::iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter == m_FtContainerMap.end())
- {
- return ThrowError(E_INVALID_FILE_ID);
- }
- if (iter->second.m_uState == FTS_ABORTED)
- {
- return ThrowError(E_FILE_ABORTED);
- }
- string sId = iter->first;
- pFt = &(iter->second);
- if (pFt->m_bFileSender)
- {
- return ThrowError(E_NOT_FILE_RECEIVER);
- }
- tstring sPathName = ToString(bstrFileName); // this string is not used to be sent through XMPP,
- // so it can be wide byte
- if (bIsAccept)
- {
- string sDisplayName = GetContactDisplayName(iter->second.m_sUserId);
- tstring sFileName = iter->second.m_fti.m_sFileName;
- if (sPathName.empty())
- {
- tstring sTitle = tstring("Receive File from ") + tstring(sDisplayName);
- sPathName = PromptFileDlg(sTitle, sFileName, false);
- if (sPathName.empty())
- {
- bIsAccept = false;
- }
- }
- }
- string sAnswerSDP;
- if (bIsAccept)
- {
- CreateFtReceiver(pFt->m_sUserId, nFileId, *pFt);
- UpdateReceiverParams(*pFt, sPathName);
- sAnswerSDP = pFt->m_pFileReceiver->GetFileTransferInfo().m_sLocalSDP;
- if (sAnswerSDP.empty())
- {
- bIsAccept = false;
- }
- pFt->m_pFileReceiver->Log("reply Xmpp response to " + pFt->m_sUserId);
- pFt->m_pFileReceiver->Log("Receiver SDP:\r\n " + sAnswerSDP);
- pFt->m_pFileReceiver->Log("remote SDP:\r\n " + pFt->m_fti.m_sRemoteSDP);
- }
- if (!bIsAccept)
- {
- iter->second.m_uState = FTS_ABORTED;
- }
- #ifndef MESSAGE_FILE_TRANSFER
- #ifdef JINGLE_FILE_TRANSFER
- m_pJabberStream->m_pJabberIQ->FileTransferResponse(pFt->m_sUserId, sId.c_str(), itoa(nFileId), sAnswerSDP, bIsAccept, *pFt);
- #else
- string sPrimaryAddr = "";
- string sSecondaryAddr = "";
- int nPrimaryPort = 0;
- int nSecondaryPort = 0;
- m_pJabberStream->m_pJabberIQ->FileTransferResponse(pFt->m_sUserId, iter->first, itoa(nFileId), sPrimaryAddr, nPrimaryPort, sSecondaryAddr, nSecondaryPort, bIsAccept);
- #endif
- #else
- m_pJabberStream->m_pJabberMessage->FileTransferResponse(pFt->m_sUserId, sId.c_str(), itoa(nFileId), sAnswerSDP, bIsAccept, *pFt);
- #endif
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::CancelFileTransfer(int nFileId)
- {
- #ifndef NO_FILE_TRANSFER
- // CHECK_LOGIN();
- FtContainerMap::iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter == m_FtContainerMap.end())
- {
- return ThrowError(E_INVALID_FILE_ID);
- }
- FtContainer& fts = iter->second;
- // Should not cancel in these states
- switch (fts.m_uState)
- {
- case FTS_UNKNOWN:
- case FTS_ERROR:
- case FTS_ABORTED:
- case FTS_REQUEST_REJECTED:
- case FTS_SEND_COMPLETE:
- case FTS_RECEIVE_COMPLETE:
- return S_OK;
- }
- fts.m_uState = FTS_ABORTED;
- CloseFtContainer(fts);
- #ifndef MESSAGE_FILE_TRANSFER
- m_pJabberStream->m_pJabberIQ->FileTransferCancel(fts.m_sUserId, iter->first);
- #else
- m_pJabberStream->m_pJabberMessage->FileTransferCancel(fts.m_sUserId, iter->first);
- #endif
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetTransferFile(int nFileId, BSTR* pVal)
- {
- // CHECK_LOGIN();
- CHECK_POINTER(pVal);
- FtContainerMap::iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter != m_FtContainerMap.end())
- {
- tstring sPathName = iter->second.m_fti.m_sFileName;
- tstring sDirectory = iter->second.m_fti.m_sDirectory;
- if (!sDirectory.empty())
- {
- #ifdef __unix__
- sPathName = sDirectory + tstring("/") + sPathName;
- #else
- sPathName = sDirectory + tstring("\\") + sPathName;
- #endif
- }
- BstrFromString(pVal, sPathName.mbs());
- }
- else
- {
- return ThrowError(E_INVALID_FILE_ID);
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetTransferPartner(int nFileId, BSTR* pVal)
- {
- // CHECK_LOGIN();
- CHECK_POINTER(pVal);
- FtContainerMap::const_iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter == m_FtContainerMap.end())
- return ThrowError(E_INVALID_FILE_ID);
- BstrFromStringU8(pVal, (iter->second).m_sUserId);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetTransferState(int nFileId, BSTR* pVal)
- {
- // CHECK_LOGIN();
- CHECK_POINTER(pVal);
- FtContainerMap::const_iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter == m_FtContainerMap.end())
- return ThrowError(E_INVALID_FILE_ID);
- BstrFromString(pVal, GetStateString((iter->second).m_uState));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetTransferProgress(int nFileId, int* pVal)
- {
- // CHECK_LOGIN();
- CHECK_POINTER(pVal);
- #ifndef NO_FILE_TRANSFER
- TransferStats stats;
- *pVal = 0;
- FtContainerMap::const_iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter == m_FtContainerMap.end())
- return ThrowError(E_INVALID_FILE_ID);
- const FtContainer& fts = iter->second;
- if (NULL != fts.m_pFileSender.get())
- {
- fts.m_pFileSender->GetTransferStats(stats);
- }
- else if (NULL != fts.m_pFileReceiver.get())
- {
- fts.m_pFileReceiver->GetTransferStats(stats);
- }
- else
- {
- return S_FALSE;
- }
- int nPercent = 0;
- switch (fts.m_uState)
- {
- case FTS_RECEIVE_COMPLETE:
- case FTS_SEND_COMPLETE:
- nPercent = 100;
- case FTS_RECEIVING:
- case FTS_SENDING:
- break;
- default:
- return S_FALSE;
- }
- if(stats.m_bTransferComplete || stats.m_bForcedTransferComplete)
- nPercent = 100;
- if (0 == nPercent && stats.m_dwCurrentBytes == 0)
- return S_FALSE;
- if (0 == nPercent && stats.m_dwTotalBytes == 0)
- return S_FALSE;
- #if 0
- int nTotalTime = 0;
- if (stats.m_bTransferComplete || stats.m_bForcedTransferComplete)
- {
- nTotalTime = stats.m_dwEndTime - stats.m_dwStartTime;
- }
- else
- {
- nTotalTime = stats.m_dwCurrentTime - stats.m_dwStartTime;
- }
- if (0 == nPercent && nTotalTime <= 0){
- return S_FALSE;
- }
- #endif
- if(0 == nPercent)
- nPercent = (int)PERCENT(stats.m_dwCurrentBytes, stats.m_dwTotalBytes);
- if (100 == nPercent)
- {
- // avoid displaying 100%
- nPercent = 99;
- }
- *pVal = nPercent;
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetTransferSize(int nFileId, int* pVal)
- {
- // CHECK_LOGIN();
- CHECK_POINTER(pVal);
- FtContainerMap::const_iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter == m_FtContainerMap.end())
- return ThrowError(E_INVALID_FILE_ID);
- *pVal = (iter->second).m_uFileSize;
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::IsInbound(int nFileId, VARIANT_BOOL* pVal)
- {
- // CHECK_LOGIN();
- CHECK_POINTER(pVal);
- FtContainerMap::iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter != m_FtContainerMap.end())
- {
- bool bIsSender = iter->second.m_bFileSender;
- *pVal = ToVB(!bIsSender);
- }
- else
- {
- return ThrowError(E_INVALID_FILE_ID);
- }
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::get_FileTransferPort(int *pVal)
- {
- // CHECK_POINTER(pVal);
- *pVal = 0; //m_nFileTransferPort;
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::put_FileTransferPort(int newVal)
- {
- // m_nFileTransferPort = newVal;
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::RequestFile(
- BSTR bstrJid,
- BSTR bstrFileName,
- int* pVal)
- {
- #ifndef NO_FILE_TRANSFER
- CHECK_LOGIN();
- CHECK_POINTER(pVal);
- string sJid = ToFullJid(ToStringA(bstrJid));
- if (sJid.empty())
- {
- return ThrowError("ERROR: Please select a User Name.");
- }
- tstring sFileName = ToStringU8(bstrFileName);
- int nFileId = GetNextFileId();
- FtContainer ftContainer;
- ftContainer.m_fti.m_sFileName = sFileName;
- ftContainer.m_fti.m_uFileType = FileTransferInfo::GENERIC_FILE;
- ftContainer.m_fti.m_sDetails = "";
- ftContainer.m_fti.m_uTransferId = nFileId;
- ftContainer.m_sUserId = sJid;
- ftContainer.m_uState = FTS_SENT_REQUEST;
- PostMessage(WM_UPDATE_FILE, ftContainer.m_fti.m_uTransferId, 0);
- ftContainer.m_bFileSender = true;
- ftContainer.m_bFilePull = true;
- m_pJabberStream->m_pJabberMessage->SendRequestFile(sJid, sFileName, "filetransfer",
- itoa(nFileId), ftContainer);
- *pVal = nFileId;
- #endif
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::AcceptFileRequest(int nFileId, BSTR bstrFileName, VARIANT_BOOL bAccept)
- {
- // CHECK_LOGIN();
- bool bIsAccept = Tobool(bAccept);
- // bIsAccept = false;
- FtContainer* pFt;
- FtContainerMap::iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter == m_FtContainerMap.end())
- {
- return ThrowError(E_INVALID_FILE_ID);
- }
- string sId = iter->first;
- pFt = &(iter->second);
- if (bIsAccept)
- {
- // string sPathName = ToStringU8(bstrFileName);
- // SendFileHelper takes wide-byte string as file name
- tstring sPathName = ToString(bstrFileName);
- string sErrorMsg = SendFileHelper(pFt->m_sUserId, sPathName, nFileId);
- if (!sErrorMsg.empty())
- {
- bIsAccept = false;
- }
- }
- if (!bIsAccept)
- {
- m_pJabberStream->m_pJabberMessage->FileTransferCancel(pFt->m_sUserId, itoa(nFileId));
- }
- return S_OK;
- }
- #ifndef NO_PROXY_IN_XMPP
- STDMETHODIMP CXmppCommCtrl::GetHttpProxyAddr(BSTR* pVal)
- {
- CHECK_POINTER(pVal);
- string sProxyHost = m_pAFEngine->GetHTTPProxy(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID
- #endif
- );
- BstrFromString(pVal, m_pAFEngine->GetHostAddress(sProxyHost));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetHttpProxyPort(int* pVal)
- {
- CHECK_POINTER(pVal);
- string sProxyHost = m_pAFEngine->GetHTTPProxy(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID
- #endif
- );
- *pVal = m_pAFEngine->GetHostPort(sProxyHost);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::SetHttpProxyAuthentication(BSTR bstrUserName, BSTR bstrPassword, BSTR bstrDomain)
- {
- string sUsername = ToStringA(bstrUserName);
- string sPassword = ToStringA(bstrPassword);
- string sDomain = ToStringA(bstrDomain);
- m_pAFEngine->SetHTTPProxy(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID,
- #endif
- m_pAFEngine->GetHTTPProxy(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID
- #endif
- ),
- sUsername,
- sPassword,
- sDomain);
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetHttpProxyUserName(BSTR* pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pAFEngine->GetHTTPProxyUsername(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID
- #endif
- ));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetHttpProxyPassword(BSTR* pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pAFEngine->GetHTTPProxyPassword(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID
- #endif
- ));
- return S_OK;
- }
- STDMETHODIMP CXmppCommCtrl::GetHttpProxyDomain(BSTR* pVal)
- {
- CHECK_POINTER(pVal);
- BstrFromString(pVal, m_pAFEngine->GetHTTPProxyDomain(
- #if (AF_DLL_VERSION > 9600000)
- m_iAFEServerStoreID
- #endif
- ));
- return S_OK;
- }
- #endif // NO_PROXY_IN_XMPP
- void CXmppCommCtrl::AddFTEntry(const string& sKey, FtContainer& ft)
- {
- m_FtContainerMap[sKey] = ft;
- }
- void CXmppCommCtrl::RemoveFTEntry(const string& sKey)
- {
- FtContainerMap::iterator iter = m_FtContainerMap.find(sKey);
- if (iter != m_FtContainerMap.end())
- {
- m_FtContainerMap.erase(iter);
- // CloseFtContainer(iter->second);
- }
- }
- void CXmppCommCtrl::FileTransferAccepted(int nFileId)
- {
- #ifndef NO_FILE_TRANSFER
- FtContainer* pFt;
- FtContainerMap::iterator iter = m_FtContainerMap.FindTransferId(nFileId);
- if (iter != m_FtContainerMap.end())
- {
- pFt = &(iter->second);
- if (pFt->m_uState == FTS_SENT_REQUEST)
- {
- pFt->m_uState = FTS_REQUEST_ACCEPTED;
- #ifdef __unix__
- m_pJabberStream->m_pXmppComm->PostMessage(WM_UPDATE_FILE, nFileId, 0);
- #else
- ::PostMessage(m_pJabberStream->m_pXmppComm->m_hWnd, WM_UPDATE_FILE, nFileId, 0);
- #endif
- if (pFt->m_pFileSender.get())
- {
- pFt->m_pFileSender->Log("File Transfer Accepted.");
- pFt->m_pFileSender->SetFileTransferInfo(pFt->m_fti);
- pFt->m_pFileSender->Log("Remote SDP: \r\n" + pFt->m_fti.m_sRemoteSDP);
- //pFt->m_uState = FTS_SEND_CONNECTING;
- pFt->m_pFileSender->RudpConnect(pFt->m_fti.m_sRemoteSDP);
- pFt->m_pFileSender->Log("Rudp Connect");
- }
- }
- }
- #endif
- }
- int CXmppCommCtrl::GetNextFileId()
- {
- if (m_nNextFileId == INT_MAX)
- {
- m_nNextFileId = rand();
- return GetNextFileId();
- }
- return m_nNextFileId++;
- }
- FtContainer CXmppCommCtrl::CreateFtSender(
- const string& sJid,
- const tstring& sPathName,
- int nFileId,
- u_int16_t uFileType,
- const string& sSubject)
- {
- FtContainer ftContainer;
- #ifndef NO_FILE_TRANSFER
- ftContainer.m_pFileSender.reset(new FileSender);
- ftContainer.m_pFileSender->SetAFEngine(m_pAFEngine, m_iAFEServerStoreID);
- ftContainer.m_pFileObserver.reset(new WindowObserver);
- #ifdef __unix__
- ftContainer.m_pFileObserver->Init(this, WM_UPDATE_FILE, nFileId);
- #else
- ftContainer.m_pFileObserver->Init(m_hWnd, WM_UPDATE_FILE, nFileId);
- #endif
- ftContainer.m_pFileSender->Attach(ftContainer.m_pFileObserver.get());
- ftContainer.m_fti.m_sDirectory = GetDirName(sPathName);
- ftContainer.m_fti.m_sFileName = GetFileName(sPathName);
- ftContainer.m_fti.m_uFileType = uFileType;
- ftContainer.m_fti.m_sDetails = sSubject;
- ftContainer.m_fti.m_uTransferId = nFileId;
- ftContainer.m_bFileSender = true;
- ftContainer.m_pFileSender->OpenLogFile(ftContainer.m_fti.m_sFileName);
- ftContainer.m_pFileSender->SetFileTransferInfo(ftContainer.m_fti);
- ftContainer.m_uState = FTS_SENT_REQUEST;
- PostMessage(WM_UPDATE_FILE, ftContainer.m_fti.m_uTransferId, 0);
- ftContainer.m_sUserId = sJid;
- #endif
- return ftContainer;
- }
- void CXmppCommCtrl::CreateFtReceiver(
- const string& sJid,
- int nFileId,
- FtContainer& ftContainer)
- {
- #ifndef NO_FILE_TRANSFER
- ftContainer.m_pFileReceiver.reset(new FileReceiver);
- ftContainer.m_pFileReceiver->SetAFEngine(m_pAFEngine, m_iAFEServerStoreID);
- ftContainer.m_pFileObserver.reset(new WindowObserver);
- #ifdef __unix__
- ftContainer.m_pFileObserver->Init(this, WM_UPDATE_FILE, nFileId);
- #else
- ftContainer.m_pFileObserver->Init(m_hWnd, WM_UPDATE_FILE, nFileId);
- #endif
- ftContainer.m_pFileReceiver->Attach(ftContainer.m_pFileObserver.get());
- ftContainer.m_sUserId = sJid;
- ftContainer.m_uState = FTS_RECEIVE_REQUEST;
- #endif
- }
- void CXmppCommCtrl::UpdateReceiverParams(
- FtContainer& ftContainer,
- const tstring& sPathName)
- {
- #ifndef NO_FILE_TRANSFER
- ftContainer.m_fti.m_sFileName = ::GetFileName(sPathName);
- ftContainer.m_fti.m_sDirectory = GetDirName(sPathName);
- if (ftContainer.m_pFileReceiver.get() == NULL)
- return;
- ftContainer.m_pFileReceiver->OpenLogFile(ftContainer.m_fti.m_sFileName);
- ftContainer.m_pFileReceiver->SetFileTransferInfo(ftContainer.m_fti);
- ftContainer.m_uState = FTS_RECEIVE_CONNECTING;
- PostMessage(WM_UPDATE_FILE, ftContainer.m_fti.m_uTransferId, 0);
- ftContainer.m_pFileReceiver->Log("Initialize RUDP Channel.");
- ftContainer.m_pFileReceiver->Log("Rudp Connect.");
- ftContainer.m_pFileReceiver->RudpConnect(ftContainer.m_fti.m_sRemoteSDP);
- #endif
- }
- bool CXmppCommCtrl::CloseFtContainer(FtContainer& ft)
- {
- #ifndef NO_FILE_TRANSFER
- PAL::Critical_Section cs(*m_pFileTransferMutex);
- if (NULL != ft.m_pFileSender.get())
- {
- PAL_DB("FT Closing SENDER");
- ft.m_pFileSender->Close();
- ft.m_pFileSender->Detach(ft.m_pFileObserver.get());
- ft.m_pFileSender.reset();
- ft.m_pFileObserver.reset();
- PAL_DB("FT SENDER Closed");
- return true;
- }
- else if (NULL != ft.m_pFileReceiver.get())
- {
- PAL_DB("FT Closing RECEIVER");
- ft.m_pFileReceiver->Close();
- ft.m_pFileReceiver->Detach(ft.m_pFileObserver.get());
- ft.m_pFileReceiver.reset();
- ft.m_pFileObserver.reset();
- PAL_DB("FT RECEIVER Closed");
- return true;
- }
- #endif
- return false;
- }
- // clean up all ongoing file transfers
- void CXmppCommCtrl::FtCleanup()
- {
- if (m_FtContainerMap.empty())
- return;
- FtContainerMap::iterator iter = m_FtContainerMap.begin();
- for (; iter != m_FtContainerMap.end(); ++iter)
- {
- //CloseFtContainer(iter->second);
- FtContainer& fts = (iter->second);
- fts.m_uState = FTS_ERROR;
- bool b = CloseFtContainer(fts);
- if (b)
- {
- #ifndef NO_FILE_TRANSFER
- #ifndef MESSAGE_FILE_TRANSFER
- m_pJabberStream->m_pJabberIQ->FileTransferCancel(fts.m_sUserId, iter->first);
- #else
- m_pJabberStream->m_pJabberMessage->FileTransferCancel(fts.m_sUserId, iter->first);
- #endif
- #endif
- // m_pChatService->SendFileEnd(fts.m_sUserId, fts.m_fti.m_uTransferId, ECS_FAILURE);
- }
- }
- m_FtContainerMap.clear();
- m_FileIdMap.clear();
- }
- string CXmppCommCtrl::FileIdToString(int nFileId)
- {
- // string sFileId = m_pJabberStream->jabber_get_full_jid() + itoa(nFileId);
- string sFileId = itoa(nFileId);
- return sFileId;
- }
- int CXmppCommCtrl::FindFileId(string sFileId)
- {
- std::map<int, string>::iterator iter = m_FileIdMap.begin();
- for (; iter != m_FileIdMap.end(); ++iter)
- {
- if (iter->second == sFileId)
- {
- return iter->first;
- }
- }
- return -1;
- }
- string CXmppCommCtrl::GetContactDisplayName(const string& sJid)
- {
- JabberBuddy* jb = m_pJabberStream->m_pJabberBuddy->jabber_buddy_find(sJid);
- #ifdef SUPPORT_MULTICAST_DISPLAYNAME
- string sDisplayName;
- if (jb && !jb->m_sDisplayName.empty())
- {
- sDisplayName = jb->m_sDisplayName;
- }
- else
- {
- sDisplayName = m_pJabberStream->m_pJabberBuddy->FindExtDisplayName(sJid);
- if (sDisplayName.empty())
- {
- sDisplayName = jabber_get_node(sJid);
- }
- }
- #else
- if (!jb)
- {
- return "";
- }
- string sDisplayName = jb->m_sDisplayName;
- #endif
- return sDisplayName;
- }
- tstring CXmppCommCtrl::PromptFileDlg(const tstring& sTitle, const tstring& sFileName, bool bOpen)
- {
- #ifndef __unix__
- #ifndef NO_FILE_TRANSFER
- CFileDialog dlg(bOpen);
- #ifndef _WIN32_WCE
- if (!sFileName.empty())
- {
- TCSCPY(dlg.m_szFileName, sFileName.c_str());
- }
- #else
- tstring tsName = sFileName;
- tsName += L".ext"; //dummy extenstion
- TCSCPY(dlg.m_szFileName, tsName.c_str());
- #endif
- dlg.m_ofn.lpstrTitle = sTitle.c_str();
- dlg.m_ofn.lpstrFilter = EXTENSION_FILTER;
- dlg.m_ofn.Flags |= OFN_OVERWRITEPROMPT;
- int iRet = dlg.DoModal();
- if (IDOK != iRet)
- {
- return "";
- }
- return dlg.m_szFileName;
- #else
- return "";
- #endif
- #else // __unix__
- return "";
- #endif
- }
- string CXmppCommCtrl::SendFileHelper(
- const string& sJid,
- const tstring& sPathNameOrg, // expected to be in wide-byte
- int nFileId)
- {
- #ifndef NO_FILE_TRANSFER
- CComBSTR bstrJid = ToBstr(sJid);
- tstring sDisplayName = GetContactDisplayName(ToBareJid(ToStringA(bstrJid)));
- tstring sPathName = sPathNameOrg;
- if (sPathName.empty())
- {
- tstring sTitle = tstring("Send File to ") + tstring(sDisplayName);
- sPathName = PromptFileDlg(sTitle, "");
- if (sPathName.empty())
- {
- return "No file selected.";
- }
- }
- if (!FileExists(sPathName.c_str()))
- {
- return "File does not exist.";
- }
- long nSize = GetFileSize(sPathName);
- if (nSize <= 0)
- {
- return "File is empty or is in use.";
- }
- tstring sFileName = GetFileName(sPathName);
- string sTransferId = FileIdToString(nFileId);
- m_FileIdMap[nFileId] = sTransferId;
- string sSubject = "filetransfer";
- FtContainer ft;
- ft = CreateFtSender(sJid, sPathName, nFileId, FileTransferInfo::GENERIC_FILE, sSubject);
- ft.m_pFileSender->Log("Initialize Sender UDP.");
- if (!ft.m_pFileSender->InitRudpChannel())
- {
- return "RUDP channel initialization error";
- }
- string sOfferSDP = ft.m_pFileSender->GetFileTransferInfo().m_sLocalSDP;
- ft.m_uFileSize = nSize;
- ft.m_pFileSender->Log("Sending Xmpp request to " + sJid);
- ft.m_pFileSender->Log("Sender SDP: \r\n" + sOfferSDP);
- #ifndef MESSAGE_FILE_TRANSFER
- #ifdef JINGLE_FILE_TRANSFER
- m_pJabberStream->m_pJabberIQ->FileTransferRequest(sJid, sFileName, sSubject, nSize, sTransferId, sOfferSDP, ft);
- #else
- string sPrimaryAddr = "";
- string sSecondaryAddr = "";
- int nPrimaryPort = 0;
- int nSecondaryPort = 0;
- m_pJabberStream->m_pJabberIQ->FileTransferRequest(sJid, sFileName, sSubject, nSize, sTransferId, sPrimaryAddr, nPrimaryPort, sSecondaryAddr, nSecondaryPort, ft);
- #endif
- #else
- m_pJabberStream->m_pJabberMessage->FileTransferRequest(sJid, sFileName, sSubject, nSize, sTransferId, sOfferSDP, ft);
- #endif
- #endif
- return "";
- }
- HRESULT CXmppCommCtrl::Call_Fire_OnLoginResponse(int iResponse)
- {
- if (iResponse == JABBER_LOGIN_SUCCESS)
- {
- m_pJabberStream->m_pJabberIQ->RetrievePrivateData(
- "nick",
- "http://jabber.org/protocol/nick");
- }
- FIRE_EVENT(Fire_OnLoginResponse, iResponse);
- return S_OK;
- }
- HRESULT CXmppCommCtrl::Call_Fire_OnPrivateDataRetrieved(const string& sName, const string& sNameSpace, const string& sUtf8Data)
- {
- if ((sName == "nick") && (sNameSpace == "http://jabber.org/protocol/nick"))
- {
- //if (m_pJabberStream->m_sDisplayName != sUtf8Data)
- {
- m_pJabberStream->m_sDisplayName = sUtf8Data;
- FIRE_EVENT(Fire_OnUpdateMyNickname, ToBstr(sUtf8Data));
- }
- return S_OK;
- }
- #ifdef USE_VARIANT_IN_EVENT
- BstrArray aData(3);
- aData.PutString(0, sName);
- aData.PutString(1, sNameSpace);
- aData.PutBstr(2, StringU8ToBstr(sUtf8Data));
- _FIRE_EVENT(m_pJabberStream->m_pXmppComm, Fire_OnPrivateDataRetrieved, aData.GetVariantRef());
- #else
- CComBSTR bstrName = ToBstr(sName);
- CComBSTR bstrNameSpace = ToBstr(sNameSpace);
- CComBSTR bstrData = StringU8ToBstr(sUtf8Data);
- _FIRE_EVENT(m_pJabberStream->m_pXmppComm, Fire_OnPrivateDataRetrieved, bstrName, bstrNameSpace, bstrData);
- #endif
- return S_OK;
- }
Advertisement
Add Comment
Please, Sign In to add comment