From 89c883cf565ac91bf21d1711f7c3972fb6281bf7 Mon Sep 17 00:00:00 2001 From: Alexander Lantsev Date: Thu, 27 Sep 2012 17:23:10 +0000 Subject: -- added proto caps - added service function (creating and hoking services, events, threads) - some minir issues and code review git-svn-id: http://svn.miranda-ng.org/main/trunk@1687 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- protocols/Skype/Skype.vcxproj.filters | 4 ++- protocols/Skype/res/Resource.rc | 8 ++--- protocols/Skype/src/resource.h | 3 +- protocols/Skype/src/skype.h | 5 ++- protocols/Skype/src/skype_dialogs.cpp | 32 +++++++++---------- protocols/Skype/src/skype_proto.cpp | 23 +++++++++++++- protocols/Skype/src/skype_proto.h | 16 +++++----- protocols/Skype/src/skype_settings.cpp | 2 +- protocols/Skype/src/skype_utils.cpp | 57 +++++++++++++++++++++++++++++++--- 9 files changed, 112 insertions(+), 38 deletions(-) diff --git a/protocols/Skype/Skype.vcxproj.filters b/protocols/Skype/Skype.vcxproj.filters index 4c5f0221b3..ef8f0e7bab 100644 --- a/protocols/Skype/Skype.vcxproj.filters +++ b/protocols/Skype/Skype.vcxproj.filters @@ -36,7 +36,9 @@ Header Files - + + Header Files + diff --git a/protocols/Skype/res/Resource.rc b/protocols/Skype/res/Resource.rc index 147c08d1a7..1edb17d873 100644 --- a/protocols/Skype/res/Resource.rc +++ b/protocols/Skype/res/Resource.rc @@ -38,8 +38,8 @@ STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU EXSTYLE WS_EX_CONTROLPARENT FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - LTEXT "Skype name:",IDC_STATIC,7,7,53,12 - EDITTEXT IDC_SN,61,7,131,12,ES_AUTOHSCROLL + LTEXT "Skype login:",IDC_STATIC,7,7,53,12 + EDITTEXT IDC_SL,61,7,131,12,ES_AUTOHSCROLL LTEXT "Password:",IDC_STATIC,7,23,53,12 EDITTEXT IDC_PW,61,23,131,12,ES_PASSWORD | ES_AUTOHSCROLL END @@ -50,8 +50,8 @@ EXSTYLE WS_EX_CONTROLPARENT FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN GROUPBOX "User Details",IDC_STATIC,7,7,291,60 - LTEXT "Skype name:",IDC_STATIC,17,19,61,8 - EDITTEXT IDC_SN,84,17,123,13,ES_AUTOHSCROLL + LTEXT "Skype login:",IDC_STATIC,17,19,61,8 + EDITTEXT IDC_SL,84,17,123,13,ES_AUTOHSCROLL LTEXT "Password:",IDC_STATIC,17,35,61,8 EDITTEXT IDC_PW,84,33,123,13,ES_PASSWORD | ES_AUTOHSCROLL END diff --git a/protocols/Skype/src/resource.h b/protocols/Skype/src/resource.h index dd62507289..2cfd6eaeab 100644 --- a/protocols/Skype/src/resource.h +++ b/protocols/Skype/src/resource.h @@ -7,6 +7,7 @@ #define IDI_ICON 101 #define IDC_SN 1001 #define IDC_PW 1002 +#define IDC_SL 1003 // Next default values for new objects // @@ -14,7 +15,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1003 +#define _APS_NEXT_CONTROL_VALUE 1004 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/protocols/Skype/src/skype.h b/protocols/Skype/src/skype.h index 49f0f59234..2c16c608cf 100644 --- a/protocols/Skype/src/skype.h +++ b/protocols/Skype/src/skype.h @@ -65,4 +65,7 @@ extern HINSTANCE g_hInstance; static const char* g_keyFileName = "..\\..\\..\\SkypeKit\\keypair.crt"; -extern CSkype* g_skype; \ No newline at end of file +extern CSkype* g_skype; + +#define SKYPE_SETTINGS_LOGIN "SkypeLogin" +#define SKYPE_SETTINGS_PASSWORD "Password" \ No newline at end of file diff --git a/protocols/Skype/src/skype_dialogs.cpp b/protocols/Skype/src/skype_dialogs.cpp index 4410d91364..f8563c4922 100644 --- a/protocols/Skype/src/skype_dialogs.cpp +++ b/protocols/Skype/src/skype_dialogs.cpp @@ -13,13 +13,13 @@ INT_PTR CALLBACK CSkypeProto::SkypeAccountProc(HWND hwnd, UINT message, WPARAM w SetWindowLongPtr(hwnd, GWLP_USERDATA, lparam); DBVARIANT dbv; - if ( !DBGetContactSettingString(0, proto->ModuleName(), "SkypeName", &dbv)) + if ( !DBGetContactSettingWString(0, proto->ModuleName(), SKYPE_SETTINGS_LOGIN, &dbv)) { - SetDlgItemText(hwnd, IDC_SN, dbv.ptszVal); + SetDlgItemText(hwnd, IDC_SL, dbv.ptszVal); DBFreeVariant(&dbv); } - if ( !DBGetContactSettingString(0, proto->ModuleName(), "Password", &dbv)) + if ( !DBGetContactSettingWString(0, proto->ModuleName(), SKYPE_SETTINGS_PASSWORD, &dbv)) { CallService( MS_DB_CRYPT_DECODESTRING, @@ -31,7 +31,7 @@ INT_PTR CALLBACK CSkypeProto::SkypeAccountProc(HWND hwnd, UINT message, WPARAM w if ( !proto->IsOffline()) { - SendMessage(GetDlgItem(hwnd, IDC_SN), EM_SETREADONLY, 1, 0); + SendMessage(GetDlgItem(hwnd, IDC_SL), EM_SETREADONLY, 1, 0); SendMessage(GetDlgItem(hwnd, IDC_PW), EM_SETREADONLY, 1, 0); } @@ -42,7 +42,7 @@ INT_PTR CALLBACK CSkypeProto::SkypeAccountProc(HWND hwnd, UINT message, WPARAM w { switch(LOWORD(wparam)) { - case IDC_SN: + case IDC_SL: case IDC_PW: SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } @@ -55,12 +55,12 @@ INT_PTR CALLBACK CSkypeProto::SkypeAccountProc(HWND hwnd, UINT message, WPARAM w proto = reinterpret_cast(GetWindowLongPtr(hwnd, GWLP_USERDATA)); TCHAR str[128]; - GetDlgItemText(hwnd, IDC_SN, str, sizeof(str)); - DBWriteContactSettingTString(0, proto->ModuleName(), "SkypeName", str); + GetDlgItemText(hwnd, IDC_SL, str, sizeof(str)); + DBWriteContactSettingWString(0, proto->ModuleName(), SKYPE_SETTINGS_LOGIN, str); GetDlgItemText(hwnd, IDC_PW, str, sizeof(str)); CallService(MS_DB_CRYPT_ENCODESTRING, sizeof(str), reinterpret_cast(str)); - DBWriteContactSettingTString(0, proto->ModuleName(), "Password", str); + DBWriteContactSettingWString(0, proto->ModuleName(), SKYPE_SETTINGS_PASSWORD, str); return TRUE; } @@ -85,13 +85,13 @@ INT_PTR CALLBACK CSkypeProto::SkypeOptionsProc(HWND hwnd, UINT message, WPARAM w SetWindowLongPtr(hwnd, GWLP_USERDATA, lparam); DBVARIANT dbv; - if ( !DBGetContactSettingString(0, proto->ModuleName(), "SkypeName", &dbv)) + if ( !DBGetContactSettingString(0, proto->ModuleName(), SKYPE_SETTINGS_LOGIN, &dbv)) { - SetDlgItemText(hwnd, IDC_SN, dbv.ptszVal); + SetDlgItemText(hwnd, IDC_SL, dbv.ptszVal); DBFreeVariant(&dbv); } - if ( !DBGetContactSettingString(0, proto->ModuleName(), "Password", &dbv)) + if ( !DBGetContactSettingString(0, proto->ModuleName(), SKYPE_SETTINGS_PASSWORD, &dbv)) { CallService( MS_DB_CRYPT_DECODESTRING, @@ -103,7 +103,7 @@ INT_PTR CALLBACK CSkypeProto::SkypeOptionsProc(HWND hwnd, UINT message, WPARAM w if ( !proto->IsOffline()) { - SendMessage(GetDlgItem(hwnd, IDC_SN), EM_SETREADONLY, 1, 0); + SendMessage(GetDlgItem(hwnd, IDC_SL), EM_SETREADONLY, 1, 0); SendMessage(GetDlgItem(hwnd, IDC_PW), EM_SETREADONLY, 1, 0); } } @@ -115,7 +115,7 @@ INT_PTR CALLBACK CSkypeProto::SkypeOptionsProc(HWND hwnd, UINT message, WPARAM w { switch(LOWORD(wparam)) { - case IDC_SN: + case IDC_SL: case IDC_PW: SendMessage(GetParent(hwnd), PSM_CHANGED, 0, 0); } @@ -128,12 +128,12 @@ INT_PTR CALLBACK CSkypeProto::SkypeOptionsProc(HWND hwnd, UINT message, WPARAM w proto = reinterpret_cast(GetWindowLongPtr(hwnd, GWLP_USERDATA)); TCHAR str[128]; - GetDlgItemText(hwnd, IDC_SN, str, sizeof(str)); - DBWriteContactSettingTString(0, proto->ModuleName(), "SkypeName", str); + GetDlgItemText(hwnd, IDC_SL, str, sizeof(str)); + DBWriteContactSettingTString(0, proto->ModuleName(), SKYPE_SETTINGS_LOGIN, str); GetDlgItemText(hwnd, IDC_PW, str, sizeof(str)); CallService(MS_DB_CRYPT_ENCODESTRING, sizeof(str), reinterpret_cast(str)); - DBWriteContactSettingTString(0, proto->ModuleName(), "Password", str); + DBWriteContactSettingTString(0, proto->ModuleName(), SKYPE_SETTINGS_PASSWORD, str); return TRUE; } diff --git a/protocols/Skype/src/skype_proto.cpp b/protocols/Skype/src/skype_proto.cpp index ba3635274c..18cc3a9e52 100644 --- a/protocols/Skype/src/skype_proto.cpp +++ b/protocols/Skype/src/skype_proto.cpp @@ -50,7 +50,27 @@ int __cdecl CSkypeProto::FileCancel( HANDLE hContact, HANDLE hTransfer ) { re int __cdecl CSkypeProto::FileDeny( HANDLE hContact, HANDLE hTransfer, const TCHAR* szReason ) { return 0; } int __cdecl CSkypeProto::FileResume( HANDLE hTransfer, int* action, const TCHAR** szFilename ) { return 0; } -DWORD_PTR __cdecl CSkypeProto:: GetCaps( int type, HANDLE hContact ) { return 0; } +DWORD_PTR __cdecl CSkypeProto:: GetCaps(int type, HANDLE hContact) +{ + switch(type) + { + case PFLAGNUM_1: + return PF1_IM | PF1_PEER2PEER; + case PFLAGNUM_2: + case PFLAGNUM_3: + return PF2_ONLINE | PF2_SHORTAWAY | PF2_HEAVYDND | PF2_INVISIBLE; + case PFLAGNUM_4: + return PF4_FORCEAUTH | PF4_FORCEADDED | PF4_SUPPORTTYPING | PF4_AVATARS | + PF4_OFFLINEFILES | PF4_IMSENDUTF | PF4_IMSENDOFFLINE; + case PFLAG_UNIQUEIDTEXT: + return (INT_PTR)Translate("Skype login"); + case PFLAG_UNIQUEIDSETTING: + return (INT_PTR) "SL"; + default: + return 0; + } +} + HICON __cdecl CSkypeProto::GetIcon( int iconIndex ) { return 0; } int __cdecl CSkypeProto::GetInfo( HANDLE hContact, int infoType ) { return 0; } @@ -81,6 +101,7 @@ int CSkypeProto::SetStatus(int new_status) { this->isOffline = true; this->account->Logout(false); + this->account->BlockWhileLoggingOut(); }; break; diff --git a/protocols/Skype/src/skype_proto.h b/protocols/Skype/src/skype_proto.h index 43a430c153..bbd6a37926 100644 --- a/protocols/Skype/src/skype_proto.h +++ b/protocols/Skype/src/skype_proto.h @@ -76,22 +76,20 @@ public: protected: bool isOffline; CAccount::Ref account; + TCHAR* password; HANDLE hNetlibUser; - void Log( const char* fmt, ... ); - - - + void Log(const char* fmt, ...); void CreateService(const char* szService, SkypeServiceFunc serviceProc); - //void CreateServiceParam(const char* szService, SkypeServiceFunc serviceProc, LPARAM lParam); + void CreateServiceParam(const char* szService, SkypeServiceFunc serviceProc, LPARAM lParam); - //HANDLE CreateHookableEvent(const char* szService); + HANDLE CreateHookableEvent(const char* szService); void HookEvent(const char*, SkypeEventFunc); - //int SendBroadcast(HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam); + int SendBroadcast(HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam); - //void ForkThread(SkypeThreadFunc, void*); - //HANDLE ForkThreadEx(SkypeThreadFunc, void*, UINT* threadID = NULL); + void ForkThread(SkypeThreadFunc, void*); + HANDLE ForkThreadEx(SkypeThreadFunc, void*, UINT* threadID = NULL); TCHAR* GetSettingString(const char *szSetting, TCHAR* defVal = NULL); diff --git a/protocols/Skype/src/skype_settings.cpp b/protocols/Skype/src/skype_settings.cpp index 8a2d0c0bfa..3222605577 100644 --- a/protocols/Skype/src/skype_settings.cpp +++ b/protocols/Skype/src/skype_settings.cpp @@ -20,7 +20,7 @@ TCHAR* CSkypeProto::GetDecodeSettingString(HANDLE hContact, const char *szSettin { DBVARIANT dbv; TCHAR* result = NULL; - if ( !DBGetContactSettingString(0, this->m_szModuleName, szSetting, &dbv)) + if ( !DBGetContactSettingWString(0, this->m_szModuleName, szSetting, &dbv)) { CallService( MS_DB_CRYPT_DECODESTRING, diff --git a/protocols/Skype/src/skype_utils.cpp b/protocols/Skype/src/skype_utils.cpp index 1f218dfc08..66529fb097 100644 --- a/protocols/Skype/src/skype_utils.cpp +++ b/protocols/Skype/src/skype_utils.cpp @@ -12,15 +12,64 @@ void CSkypeProto::Log(const char* fmt, ...) CallService(MS_NETLIB_LOG, (WPARAM)this->hNetlibUser, (LPARAM)msg); } +void CSkypeProto::CreateService(const char* szService, SkypeServiceFunc serviceProc) +{ + char moduleName[MAXMODULELABELLENGTH]; + + mir_snprintf(moduleName, sizeof(moduleName), "%s%s", this->m_szModuleName, szService); + CreateServiceFunctionObj(moduleName, (MIRANDASERVICEOBJ)*(void**)&serviceProc, this); +} + +void CSkypeProto::CreateServiceParam(const char* szService, SkypeServiceFunc serviceProc, LPARAM lParam) +{ + char moduleName[MAXMODULELABELLENGTH]; + + mir_snprintf(moduleName, sizeof(moduleName), "%s%s", this->m_szModuleName, szService); + CreateServiceFunctionObjParam(moduleName, (MIRANDASERVICEOBJPARAM)*(void**)&serviceProc, this, lParam); +} + +HANDLE CSkypeProto::CreateHookableEvent(const char* szService) +{ + char moduleName[MAXMODULELABELLENGTH]; + + mir_snprintf(moduleName, sizeof(moduleName), "%s%s", this->m_szModuleName, szService); + return CreateHookableEvent(moduleName); +} + void CSkypeProto::HookEvent(const char* szEvent, SkypeEventFunc handler) { HookEventObj(szEvent, (MIRANDAHOOKOBJ)*( void**)&handler, this); } -void CSkypeProto::CreateService(const char* szService, SkypeServiceFunc serviceProc) +int CSkypeProto::SendBroadcast(HANDLE hContact, int type, int result, HANDLE hProcess, LPARAM lParam) { - char temp[MAX_PATH*2]; + ACKDATA ack = {0}; + ack.cbSize = sizeof(ACKDATA); + ack.szModule = m_szModuleName; + ack.hContact = hContact; + ack.type = type; + ack.result = result; + ack.hProcess = hProcess; + ack.lParam = lParam; + return CallService(MS_PROTO_BROADCASTACK, 0, (LPARAM)&ack); +} - mir_snprintf(temp, sizeof(temp), "%s%s", this->m_szModuleName, szService); - CreateServiceFunctionObj(temp, (MIRANDASERVICEOBJ)*(void**)&serviceProc, this); +void CSkypeProto::ForkThread(SkypeThreadFunc pFunc, void *param) +{ + UINT threadID; + CloseHandle((HANDLE)mir_forkthreadowner( + (pThreadFuncOwner)*(void**)&pFunc, + this, + param, + &threadID)); +} + +HANDLE CSkypeProto::ForkThreadEx(SkypeThreadFunc pFunc, void *param, UINT* threadID) +{ + UINT lthreadID; + return (HANDLE)mir_forkthreadowner( + (pThreadFuncOwner)*(void**)&pFunc, + this, + param, + threadID ? threadID : <hreadID); } \ No newline at end of file -- cgit v1.2.3