diff options
author | Gluzskiy Alexandr <sss123next@list.ru> | 2010-09-14 15:14:34 +0300 |
---|---|---|
committer | Gluzskiy Alexandr <sss123next@list.ru> | 2010-09-14 15:14:34 +0300 |
commit | dc334c5e6eec4d1d5ff919b925d68d9743e6c654 (patch) | |
tree | 20b979c07159e27463adec76b30b0ad24b25676b | |
parent | e21fc45beaf3d6abcb012ffecb796e5053e8e5ac (diff) |
initial pescense sign parsing code (needed for full support of xep-027)
-rw-r--r-- | jabber_account.cpp | 15 | ||||
-rw-r--r-- | jabber_account.h | 8 | ||||
-rw-r--r-- | utilities.cpp | 65 |
3 files changed, 80 insertions, 8 deletions
diff --git a/jabber_account.cpp b/jabber_account.cpp index 85c89d6..636815b 100644 --- a/jabber_account.cpp +++ b/jabber_account.cpp @@ -28,10 +28,15 @@ void JabberAccount::setJabberInterface(IJabberInterface *JIf) { JabberInterface = JIf; } -void JabberAccount::setSendHandler(HANDLE hHandler) +void JabberAccount::setSendHandler(HJHANDLER hHandler) { hSendHandler = hHandler; } +void JabberAccount::setPrescenseHandler(HJHANDLER hHandler) +{ + hPrescenseHandler = hHandler; +} + TCHAR *JabberAccount::getAccountName() { @@ -45,15 +50,21 @@ IJabberInterface *JabberAccount::getJabberInterface() { return JabberInterface; } -HANDLE JabberAccount::getSendHandler() +HJHANDLER JabberAccount::getSendHandler() { return hSendHandler; } +HJHANDLER JabberAccount::getPrescenseHandler() +{ + return hPrescenseHandler; +} + JabberAccount::JabberAccount() { AccountName = NULL; hSendHandler = INVALID_HANDLE_VALUE; + hPrescenseHandler = INVALID_HANDLE_VALUE; AccountNumber = -1; JabberInterface = NULL; } diff --git a/jabber_account.h b/jabber_account.h index 9f5f228..3f2f6a9 100644 --- a/jabber_account.h +++ b/jabber_account.h @@ -21,19 +21,21 @@ public: void setAccountName(TCHAR *Name); void setAccountNumber(int Number); void setJabberInterface(IJabberInterface *JIf); - void setSendHandler(HANDLE hHandler); + void setSendHandler(HJHANDLER hHandler); + void setPrescenseHandler(HJHANDLER hHandler); TCHAR *getAccountName(); int getAccountNumber(); IJabberInterface *getJabberInterface(); - HANDLE getSendHandler(); + HJHANDLER getSendHandler(); + HJHANDLER getPrescenseHandler(); ~JabberAccount(); JabberAccount(); private: TCHAR *AccountName; int AccountNumber; IJabberInterface *JabberInterface; - HJHANDLER hSendHandler; + HJHANDLER hSendHandler, hPrescenseHandler; }; #endif
\ No newline at end of file diff --git a/utilities.cpp b/utilities.cpp index 649b4e1..a64abae 100644 --- a/utilities.cpp +++ b/utilities.cpp @@ -358,9 +358,6 @@ int GetJabberInterface(WPARAM w, LPARAM l) //get interface for all jabber accoun static JABBER_HANDLER_FUNC SendHandler(IJabberInterface *ji, HXML node, void *pUserData) { - extern bool bJabberAPI, bIsMiranda09; - if(!bJabberAPI || !bIsMiranda09) - return FALSE; HXML local_node = node; for(int n = 0; n <= xi.getChildCount(node); n++) { @@ -544,6 +541,63 @@ static JABBER_HANDLER_FUNC SendHandler(IJabberInterface *ji, HXML node, void *pU return FALSE; } +HANDLE sign_file_mutex = NULL; + +static JABBER_HANDLER_FUNC PrescenseHandler(IJabberInterface *ji, HXML node, void *pUserData) +{ + HXML local_node = node; + for(int n = 0; n <= xi.getChildCount(node); n++) + { + LPCTSTR str = xi.getText(local_node); + LPCTSTR nodename = xi.getName(local_node); + if(nodename) + { + if(_tcsstr(nodename, _T("x"))) + { + for(int n = 0; n < xi.getAttrCount(local_node); n++) + { + LPCTSTR name = xi.getAttrName(local_node, n); + LPCTSTR value = xi.getAttrValue(local_node, name); + if(_tcsstr(value, _T("jabber:x:signed"))) + { + LPCTSTR data = xi.getText(local_node); + wstring sign = _T("-----BEGIN PGP MESSAGE-----\n\n"); + sign += data; + sign += _T("\n-----END PGP MESSAGE-----\n"); + TCHAR *path_c = UniGetContactSettingUtf(NULL, szGPGModuleName, "szHomePath", _T("")); + wstring path_out = path_c; + mir_free(path_c); + path_out += _T("\\sign.asc"); + WaitForSingleObject(sign_file_mutex, INFINITE); + sign_file_mutex = CreateMutex(NULL, FALSE, NULL); + DeleteFile(path_out.c_str()); + wfstream f(path_out.c_str(), std::ios::out); + char *tmp = mir_utf8encodeW(sign.c_str()); + f<<tmp; + mir_free(tmp); + f.close(); + if(_waccess(path_out.c_str(), 0) == -1) + { + if(errno == ENOENT) + { + ReleaseMutex(sign_file_mutex); + debuglog<<"info: Failed to write sign in file\n"; + return FALSE; + } + } + + DeleteFile(path_out.c_str()); + ReleaseMutex(sign_file_mutex); + return FALSE; + } + } + } + } + local_node = xi.getChild(node, n); + } + return FALSE; +} + void AddHandlers() { @@ -557,6 +611,11 @@ void AddHandlers() { (*p)->setSendHandler((*p)->getJabberInterface()->Net()->AddSendHandler((JABBER_HANDLER_FUNC)SendHandler)); } + if((*p)->getPrescenseHandler() == INVALID_HANDLE_VALUE) + { + (*p)->setPrescenseHandler((*p)->getJabberInterface()->Net()->AddPresenceHandler((JABBER_HANDLER_FUNC)PrescenseHandler)); + } + } } |