diff options
author | Alexander Lantsev <aunsane@gmail.com> | 2012-10-20 18:58:08 +0000 |
---|---|---|
committer | Alexander Lantsev <aunsane@gmail.com> | 2012-10-20 18:58:08 +0000 |
commit | 0414c927e4a23bd6232e0ef64c34dbc3482793b1 (patch) | |
tree | 472cadf74a4a6cf48b46fe68a448248f23f8abd6 | |
parent | 13ff5e8e9ff54af333a2d11d439122515addb0b5 (diff) |
- added basic search
git-svn-id: http://svn.miranda-ng.org/main/trunk@2002 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r-- | protocols/Skype/src/skype_contacts.cpp | 64 | ||||
-rw-r--r-- | protocols/Skype/src/skype_proto.cpp | 27 | ||||
-rw-r--r-- | protocols/Skype/src/skype_proto.h | 1 | ||||
-rw-r--r-- | protocols/Skype/src/skype_subclassing.cpp | 39 | ||||
-rw-r--r-- | protocols/Skype/src/skype_subclassing.h | 21 |
5 files changed, 147 insertions, 5 deletions
diff --git a/protocols/Skype/src/skype_contacts.cpp b/protocols/Skype/src/skype_contacts.cpp index e67abebf76..086c197c2c 100644 --- a/protocols/Skype/src/skype_contacts.cpp +++ b/protocols/Skype/src/skype_contacts.cpp @@ -706,4 +706,68 @@ void CSkypeProto::SetAllContactStatus(int status) this->SetSettingWord(hContact, SKYPE_SETTINGS_STATUS, status);
hContact = (HANDLE)::CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)hContact, (LPARAM)this->m_szModuleName);
}
+}
+
+void __cdecl CSkypeProto::SearchContactBySidAsync(void* arg)
+{
+ const wchar_t *sid = (wchar_t *)arg;
+
+ HANDLE hContact = this->GetContactBySid(sid);
+ if (hContact)
+ {
+ //ShowPopup(is, _T("Contact already in your contact list"), ALLOW_MSGBOX, NULL);
+ this->SendBroadcast(ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)sid, 0);
+ return;
+ }
+
+ CContactSearch::Ref search; + g_skype->CreateIdentitySearch(::mir_u2a(sid), search); + + bool valid; + if (!search->IsValid(valid) || !valid || !search->Submit()) + { + return; + } + + CContact::Refs contacts; + search->GetResults(contacts); + for (int i = 0 ; i < contacts.size(); i++) + { + PROTOSEARCHRESULT isr = {0};
+ isr.cbSize = sizeof(isr);
+ isr.flags = PSR_TCHAR;
+
+ SEString data;
+ contacts[i]->GetPropSkypename(data);
+ isr.id = ::mir_utf8decodeW((const char *)data);
+ contacts[i]->GetPropDisplayname(data);
+ isr.nick = ::mir_utf8decodeW((const char *)data);
+ {
+ contacts[i]->GetPropFullname(data);
+ wchar_t *fullname = ::mir_utf8decodeW((const char*)data);
+
+ wchar_t *first = wcstok(fullname, L" ");
+ wchar_t *last = wcstok(NULL, L" ");
+ if (last == NULL)
+ {
+ last = L"";
+ }
+ isr.firstName = first;
+ isr.lastName = last;
+ }
+ {
+ contacts[i]->GetPropEmails(data);
+ wchar_t *emails = ::mir_utf8decodeW((const char*)data);
+
+ wchar_t* main = wcstok(emails, L" ");
+ if (main == NULL)
+ {
+ isr.email = main;
+ }
+ }
+
+ this->SendBroadcast(ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE)sid, (LPARAM)&isr);
+ } + + this->SendBroadcast(ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE)sid, 0);
}
\ No newline at end of file diff --git a/protocols/Skype/src/skype_proto.cpp b/protocols/Skype/src/skype_proto.cpp index 609450a2b6..c40ce6c854 100644 --- a/protocols/Skype/src/skype_proto.cpp +++ b/protocols/Skype/src/skype_proto.cpp @@ -154,7 +154,7 @@ DWORD_PTR __cdecl CSkypeProto:: GetCaps(int type, HANDLE hContact) switch(type)
{
case PFLAGNUM_1:
- return PF1_IM | PF1_PEER2PEER;
+ return PF1_IM | PF1_BASICSEARCH | PF1_ADDSEARCHRES/* | PF1_SEARCHBYEMAIL | PF1_SEARCHBYNAME*/;
case PFLAGNUM_2:
case PFLAGNUM_3:
return PF2_ONLINE | PF2_SHORTAWAY | PF2_HEAVYDND | PF2_INVISIBLE;
@@ -182,11 +182,28 @@ HICON __cdecl CSkypeProto::GetIcon( int iconIndex ) int __cdecl CSkypeProto::GetInfo( HANDLE hContact, int infoType ) { return 0; }
-HANDLE __cdecl CSkypeProto::SearchBasic( const TCHAR* id ) { return 0; }
-HANDLE __cdecl CSkypeProto::SearchByEmail( const TCHAR* email ) { return 0; }
-HANDLE __cdecl CSkypeProto::SearchByName( const TCHAR* nick, const TCHAR* firstName, const TCHAR* lastName ) { return 0; }
+HANDLE __cdecl CSkypeProto::SearchBasic(const TCHAR* id)
+{
+ if ( !this->IsOnline())
+ return 0;
+
+ wchar_t *sid = ::mir_tstrdup(id);
+ this->ForkThread(&CSkypeProto::SearchContactBySidAsync, sid); + + return sid; +}
+
+HANDLE __cdecl CSkypeProto::SearchByEmail( const TCHAR* email )
+{
+ return 0;
+}
+HANDLE __cdecl CSkypeProto::SearchByName( const TCHAR* nick, const TCHAR* firstName, const TCHAR* lastName )
+{
+ return 0;
+}
HWND __cdecl CSkypeProto::SearchAdvanced( HWND owner ) { return 0; }
-HWND __cdecl CSkypeProto::CreateExtendedSearchUI( HWND owner ) { return 0; }
+
+HWND __cdecl CSkypeProto::CreateExtendedSearchUI( HWND owner ){ return 0; }
int __cdecl CSkypeProto::RecvContacts( HANDLE hContact, PROTORECVEVENT* ) { return 0; }
int __cdecl CSkypeProto::RecvFile( HANDLE hContact, PROTORECVFILET* ) { return 0; }
diff --git a/protocols/Skype/src/skype_proto.h b/protocols/Skype/src/skype_proto.h index f9f1a24a1a..669ec40b09 100644 --- a/protocols/Skype/src/skype_proto.h +++ b/protocols/Skype/src/skype_proto.h @@ -152,6 +152,7 @@ protected: void SetAllContactStatus(int status);
void __cdecl LoadContactList(void*);
+ void __cdecl SearchContactBySidAsync(void*);
// utils
static char* GetCountryNameById(int countryId);
diff --git a/protocols/Skype/src/skype_subclassing.cpp b/protocols/Skype/src/skype_subclassing.cpp index ad3c265749..587a4ba6cf 100644 --- a/protocols/Skype/src/skype_subclassing.cpp +++ b/protocols/Skype/src/skype_subclassing.cpp @@ -94,6 +94,45 @@ void CContactGroup::OnChange(const ContactRef& contact) (proto->*callback)(contact); } +// CContactSearch + +CContactSearch::CContactSearch(unsigned int oid, SERootObject* root) : ContactSearch(oid, root) +{ + this->isSeachFailed = false; + this->isSeachFinished = false; +} + +void CContactSearch::OnChange(int prop) +{ + if (prop == P_CONTACT_SEARCH_STATUS) + { + CContactSearch::STATUS status; + this->GetPropContactSearchStatus(status); + if (status == FINISHED) + this->isSeachFinished = true; + if (status == FAILED) + this->isSeachFailed = true; + } + + //SEString value = GetProp(prop); + //List_String dbg = getPropDebug(prop, value); + //fprintf(stdout,"CONTACTSEARCH.%d:%s = %s\n", getOID(), (const char*)dbg[1], (const char*)dbg[2]); +} + +void CContactSearch::OnNewResult(const ContactRef& contact, const uint& rankValue) +{ + Sid::String identity; + contact->GetIdentity(identity); +} + +void CContactSearch::BlockWhileSearching() +{ + this->isSeachFailed = false; + this->isSeachFinished = false; + while ( !this->isSeachFailed && !this->isSeachFinished) + Sleep(1); +} + // CContact CContact::CContact(unsigned int oid, SERootObject* root) : Contact(oid, root) diff --git a/protocols/Skype/src/skype_subclassing.h b/protocols/Skype/src/skype_subclassing.h index 97ff2952eb..a8f87a6e50 100644 --- a/protocols/Skype/src/skype_subclassing.h +++ b/protocols/Skype/src/skype_subclassing.h @@ -38,6 +38,27 @@ private: void OnChange(int prop); };
+class CContactSearch : public ContactSearch +{ +public: + typedef DRef<CContactSearch, ContactSearch> Ref; + typedef DRefs<CContactSearch, ContactSearch> Refs; + + bool isSeachFailed; + bool isSeachFinished; + + CContactSearch(unsigned int oid, SERootObject* root); + + //void set_controller(CommandContactSearch* controller) { m_controller = controller; } + + void OnChange(int prop); + void OnNewResult(const ContactRef& contact, const uint& rankValue); + + void BlockWhileSearching(); + + //CommandContactSearch* m_controller; +};
+
class CContactGroup : public ContactGroup
{
public:
|