From dc334c5e6eec4d1d5ff919b925d68d9743e6c654 Mon Sep 17 00:00:00 2001 From: Gluzskiy Alexandr Date: Tue, 14 Sep 2010 15:14:34 +0300 Subject: initial pescense sign parsing code (needed for full support of xep-027) --- jabber_account.cpp | 15 +++++++++++-- jabber_account.h | 8 ++++--- 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<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)); + } + } } -- cgit v1.2.3