diff options
author | Robert Pösel <robyer@seznam.cz> | 2012-11-05 21:11:48 +0000 |
---|---|---|
committer | Robert Pösel <robyer@seznam.cz> | 2012-11-05 21:11:48 +0000 |
commit | 048aaf0c4e77402adf584e3318e5aae6f1cdd749 (patch) | |
tree | def343da80e282ae43164e45e672a1386db66546 /protocols/Xfire/src | |
parent | 35a9af527f9b7ec35e81455784cd0a795be910c5 (diff) |
XFire adoption (crashes on login, no 64bit)
git-svn-id: http://svn.miranda-ng.org/main/trunk@2212 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Xfire/src')
168 files changed, 21932 insertions, 0 deletions
diff --git a/protocols/Xfire/src/Jamfile b/protocols/Xfire/src/Jamfile new file mode 100644 index 0000000000..a8bd2d8d8a --- /dev/null +++ b/protocols/Xfire/src/Jamfile @@ -0,0 +1,152 @@ +SubDir TOP src ; + +LOCATE_TARGET = bin ; +Library libxfirelib : + SHA1.cpp + socket.cpp + packetreader.cpp + client.cpp + xfirepacket.cpp + xfirepacketcontent.cpp + clientinformationpacket.cpp + xfireutils.cpp + clientversionpacket.cpp + authpacket.cpp + xfireparse.cpp + variablevalue.cpp + clientloginpacket.cpp + loginfailedpacket.cpp + loginsuccesspacket.cpp + messagepacket.cpp + buddylistonlinepacket.cpp + buddylistnamespacket.cpp + buddylistgamespacket.cpp + buddylistgames2packet.cpp + buddylist.cpp + otherloginpacket.cpp + messageackpacket.cpp + invitebuddypacket.cpp + inviterequestpacket.cpp + xfirerecvpacketcontent.cpp + recvdidpacket.cpp + recvprefspacket.cpp + xfiresendpacketcontent.cpp + recvstatusmessagepacket.cpp + sendstatusmessagepacket.cpp + sendmessagepacket.cpp + sendacceptinvitationpacket.cpp + sendgamestatuspacket.cpp + sendgameserverpacket.cpp + senddenyinvitationpacket.cpp + recvremovebuddypacket.cpp + sendremovebuddypacket.cpp + sendnickchangepacket.cpp + sendkeepalivepacket.cpp + xfiregame.cpp + recvoldversionpacket.cpp + xfiregameresolver.cpp + dummyxfiregameresolver.cpp + monitoredobj.cpp + sendgamestatus2packet.cpp + ; + +InstallLib $(LIBDIR) : libxfirelib$(SUFLIB) ; +#InstallFile $(DESTDIR) : sendkeepalivepacket.h ; + + +########## +## IsElem, DoInstall copied from Crystal Space Installation ! +######## +#============================================================================ +# Helper rules +# Copyright (C)2003 by Matze Braun <matzebraun@users.sourceforge.net> +# Copyright (C)2004 by Eric Sunshine <sunshine@sunshineco.com> +# +# This library is free software; you can redistribute it and/or modify it +# under the terms of the GNU Library General Public License as published by +# the Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This library is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public +# License for more details. +# +# You should have received a copy of the GNU Library General Public License +# along with this library; if not, write to the Free Software Foundation, +# Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +#============================================================================ + + +## IsElem element : list +## Returns "true" if the element is in the list. Otherwise nothing is +## returned. +rule IsElem +{ + local i ; + + for i in $(>) + { + if $(i) = $(<) + { + return "true" ; + } + } + + return ; +} + +rule DoInstall +{ + InstallFile /usr/local/include/xfirelib : $(1) ; +} + + +## Recurse [ rule ] : types [ : prefix ] +## Recursively scan current directory, $(SUBDIR), for files matching 'types' +## and invoke 'rule' for each file which matches one of the 'types'. +## 'types' is a list of file extensions (with the leading dot). 'rule' will +## be invoked with two arguments: (1) the basename of the file including the +## extension, (2) a list of the path components from the current directory +## to the file's directory. When 'rule' is invoked, it will see a $(SUBDIR) +## value of the directory containing the file (as if the rule had been +## invoked from within the file's directory). 'prefix' is an optional list +## of path components which will be prepended to rule's second argument. +## Returns the list of visited files. It is legal to omit 'rule', if you +## are interested only in obtaining the list of files matching 'types'. +rule Recurse +{ + local innerrule = $(1) ; + local types = $(2) ; + local prefix = $(3) ; + local files = [ GLOB $(SUBDIR) : * ] ; + local visited ; + + local i ; + for i in $(files) + { + if [ IsElem $(i:S) : $(types) ] + { + visited += [ FDirName $(prefix) $(i:BS) ] ; + if $(innerrule) + { + $(innerrule) $(i:BS) : $(prefix) ; + } + } + else + { + if ! [ IsElem $(i:BS) : $(DOT) $(DOTDOT) ] + { + local SUBDIR = $(i) ; # Called rules see this new temporary value. + visited += [ Recurse $(innerrule) : $(types) : $(prefix) $(i:BS) ] ; + } + } + } + return $(visited) ; +} + + + + +Recurse DoInstall : .h ; diff --git a/protocols/Xfire/src/SHA1.cpp b/protocols/Xfire/src/SHA1.cpp new file mode 100644 index 0000000000..f296b563cd --- /dev/null +++ b/protocols/Xfire/src/SHA1.cpp @@ -0,0 +1,263 @@ +/*
+ 100% free public domain implementation of the SHA-1 algorithm
+ by Dominik Reichl <dominik.reichl@t-online.de>
+
+ Version 1.5 - 2005-01-01
+ - 64-bit compiler compatibility added
+ - Made variable wiping optional (define SHA1_WIPE_VARIABLES)
+ - Removed unnecessary variable initializations
+ - ROL32 improvement for the Microsoft compiler (using _rotl)
+
+ ======== Test Vectors (from FIPS PUB 180-1) ========
+
+ SHA1("abc") =
+ A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
+
+ SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") =
+ 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
+
+ SHA1(A million repetitions of "a") =
+ 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
+*/
+
+#include "stdafx.h"
+
+#include "SHA1.h"
+
+#define SHA1_MAX_FILE_BUFFER 8000
+
+// Rotate x bits to the left
+#ifndef ROL32
+#ifdef _MSC_VER
+#define ROL32(_val32, _nBits) _rotl(_val32, _nBits)
+#else
+#define ROL32(_val32, _nBits) (((_val32)<<(_nBits))|((_val32)>>(32-(_nBits))))
+#endif
+#endif
+
+#ifdef SHA1_LITTLE_ENDIAN
+#define SHABLK0(i) (m_block->l[i] = \
+ (ROL32(m_block->l[i],24) & 0xFF00FF00) | (ROL32(m_block->l[i],8) & 0x00FF00FF))
+#else
+#define SHABLK0(i) (m_block->l[i])
+#endif
+
+#define SHABLK(i) (m_block->l[i&15] = ROL32(m_block->l[(i+13)&15] ^ m_block->l[(i+8)&15] \
+ ^ m_block->l[(i+2)&15] ^ m_block->l[i&15],1))
+
+// SHA-1 rounds
+#define _R0(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK0(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); }
+#define _R1(v,w,x,y,z,i) { z+=((w&(x^y))^y)+SHABLK(i)+0x5A827999+ROL32(v,5); w=ROL32(w,30); }
+#define _R2(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0x6ED9EBA1+ROL32(v,5); w=ROL32(w,30); }
+#define _R3(v,w,x,y,z,i) { z+=(((w|x)&y)|(w&x))+SHABLK(i)+0x8F1BBCDC+ROL32(v,5); w=ROL32(w,30); }
+#define _R4(v,w,x,y,z,i) { z+=(w^x^y)+SHABLK(i)+0xCA62C1D6+ROL32(v,5); w=ROL32(w,30); }
+
+
+CSHA1::CSHA1()
+{
+ m_block = (SHA1_WORKSPACE_BLOCK *)m_workspace;
+
+ Reset();
+}
+
+CSHA1::~CSHA1()
+{
+ Reset();
+}
+
+void CSHA1::Reset()
+{
+ // SHA1 initialization constants
+ m_state[0] = 0x67452301;
+ m_state[1] = 0xEFCDAB89;
+ m_state[2] = 0x98BADCFE;
+ m_state[3] = 0x10325476;
+ m_state[4] = 0xC3D2E1F0;
+
+ m_count[0] = 0;
+ m_count[1] = 0;
+}
+
+void CSHA1::Transform(UINT_32 *state, UINT_8 *buffer)
+{
+ // Copy state[] to working vars
+ UINT_32 a = state[0], b = state[1], c = state[2], d = state[3], e = state[4];
+
+ memcpy(m_block, buffer, 64);
+
+ // 4 rounds of 20 operations each. Loop unrolled.
+ _R0(a,b,c,d,e, 0); _R0(e,a,b,c,d, 1); _R0(d,e,a,b,c, 2); _R0(c,d,e,a,b, 3);
+ _R0(b,c,d,e,a, 4); _R0(a,b,c,d,e, 5); _R0(e,a,b,c,d, 6); _R0(d,e,a,b,c, 7);
+ _R0(c,d,e,a,b, 8); _R0(b,c,d,e,a, 9); _R0(a,b,c,d,e,10); _R0(e,a,b,c,d,11);
+ _R0(d,e,a,b,c,12); _R0(c,d,e,a,b,13); _R0(b,c,d,e,a,14); _R0(a,b,c,d,e,15);
+ _R1(e,a,b,c,d,16); _R1(d,e,a,b,c,17); _R1(c,d,e,a,b,18); _R1(b,c,d,e,a,19);
+ _R2(a,b,c,d,e,20); _R2(e,a,b,c,d,21); _R2(d,e,a,b,c,22); _R2(c,d,e,a,b,23);
+ _R2(b,c,d,e,a,24); _R2(a,b,c,d,e,25); _R2(e,a,b,c,d,26); _R2(d,e,a,b,c,27);
+ _R2(c,d,e,a,b,28); _R2(b,c,d,e,a,29); _R2(a,b,c,d,e,30); _R2(e,a,b,c,d,31);
+ _R2(d,e,a,b,c,32); _R2(c,d,e,a,b,33); _R2(b,c,d,e,a,34); _R2(a,b,c,d,e,35);
+ _R2(e,a,b,c,d,36); _R2(d,e,a,b,c,37); _R2(c,d,e,a,b,38); _R2(b,c,d,e,a,39);
+ _R3(a,b,c,d,e,40); _R3(e,a,b,c,d,41); _R3(d,e,a,b,c,42); _R3(c,d,e,a,b,43);
+ _R3(b,c,d,e,a,44); _R3(a,b,c,d,e,45); _R3(e,a,b,c,d,46); _R3(d,e,a,b,c,47);
+ _R3(c,d,e,a,b,48); _R3(b,c,d,e,a,49); _R3(a,b,c,d,e,50); _R3(e,a,b,c,d,51);
+ _R3(d,e,a,b,c,52); _R3(c,d,e,a,b,53); _R3(b,c,d,e,a,54); _R3(a,b,c,d,e,55);
+ _R3(e,a,b,c,d,56); _R3(d,e,a,b,c,57); _R3(c,d,e,a,b,58); _R3(b,c,d,e,a,59);
+ _R4(a,b,c,d,e,60); _R4(e,a,b,c,d,61); _R4(d,e,a,b,c,62); _R4(c,d,e,a,b,63);
+ _R4(b,c,d,e,a,64); _R4(a,b,c,d,e,65); _R4(e,a,b,c,d,66); _R4(d,e,a,b,c,67);
+ _R4(c,d,e,a,b,68); _R4(b,c,d,e,a,69); _R4(a,b,c,d,e,70); _R4(e,a,b,c,d,71);
+ _R4(d,e,a,b,c,72); _R4(c,d,e,a,b,73); _R4(b,c,d,e,a,74); _R4(a,b,c,d,e,75);
+ _R4(e,a,b,c,d,76); _R4(d,e,a,b,c,77); _R4(c,d,e,a,b,78); _R4(b,c,d,e,a,79);
+
+ // Add the working vars back into state
+ state[0] += a;
+ state[1] += b;
+ state[2] += c;
+ state[3] += d;
+ state[4] += e;
+
+ // Wipe variables
+#ifdef SHA1_WIPE_VARIABLES
+ a = b = c = d = e = 0;
+#endif
+}
+
+// Use this function to hash in binary data and strings
+void CSHA1::Update(UINT_8 *data, UINT_32 len)
+{
+ UINT_32 i, j;
+
+ j = (m_count[0] >> 3) & 63;
+
+ if((m_count[0] += len << 3) < (len << 3)) m_count[1]++;
+
+ m_count[1] += (len >> 29);
+
+ if((j + len) > 63)
+ {
+ i = 64 - j;
+ memcpy(&m_buffer[j], data, i);
+ Transform(m_state, m_buffer);
+
+ for( ; i + 63 < len; i += 64) Transform(m_state, &data[i]);
+
+ j = 0;
+ }
+ else i = 0;
+
+ memcpy(&m_buffer[j], &data[i], len - i);
+}
+
+// Hash in file contents
+bool CSHA1::HashFile(char *szFileName)
+{
+ unsigned long ulFileSize, ulRest, ulBlocks;
+ unsigned long i;
+ UINT_8 uData[SHA1_MAX_FILE_BUFFER];
+ FILE *fIn;
+
+ if(szFileName == NULL) return false;
+
+ fIn = fopen(szFileName, "rb");
+ if(fIn == NULL) return false;
+
+ fseek(fIn, 0, SEEK_END);
+ ulFileSize = (unsigned long)ftell(fIn);
+ fseek(fIn, 0, SEEK_SET);
+
+ if(ulFileSize != 0)
+ {
+ ulBlocks = ulFileSize / SHA1_MAX_FILE_BUFFER;
+ ulRest = ulFileSize % SHA1_MAX_FILE_BUFFER;
+ }
+ else
+ {
+ ulBlocks = 0;
+ ulRest = 0;
+ }
+
+ for(i = 0; i < ulBlocks; i++)
+ {
+ fread(uData, 1, SHA1_MAX_FILE_BUFFER, fIn);
+ Update((UINT_8 *)uData, SHA1_MAX_FILE_BUFFER);
+ }
+
+ if(ulRest != 0)
+ {
+ fread(uData, 1, ulRest, fIn);
+ Update((UINT_8 *)uData, ulRest);
+ }
+
+ fclose(fIn); fIn = NULL;
+ return true;
+}
+
+void CSHA1::Final()
+{
+ UINT_32 i;
+ UINT_8 finalcount[8];
+
+ for(i = 0; i < 8; i++)
+ finalcount[i] = (UINT_8)((m_count[((i >= 4) ? 0 : 1)]
+ >> ((3 - (i & 3)) * 8) ) & 255); // Endian independent
+
+ Update((UINT_8 *)"\200", 1);
+
+ while ((m_count[0] & 504) != 448)
+ Update((UINT_8 *)"\0", 1);
+
+ Update(finalcount, 8); // Cause a SHA1Transform()
+
+ for(i = 0; i < 20; i++)
+ {
+ m_digest[i] = (UINT_8)((m_state[i >> 2] >> ((3 - (i & 3)) * 8) ) & 255);
+ }
+
+ // Wipe variables for security reasons
+#ifdef SHA1_WIPE_VARIABLES
+ i = 0;
+ memset(m_buffer, 0, 64);
+ memset(m_state, 0, 20);
+ memset(m_count, 0, 8);
+ memset(finalcount, 0, 8);
+ Transform(m_state, m_buffer);
+#endif
+}
+
+// Get the final hash as a pre-formatted string
+void CSHA1::ReportHash(char *szReport, unsigned char uReportType)
+{
+ unsigned char i;
+ char szTemp[16];
+
+ if(szReport == NULL) return;
+
+ if(uReportType == REPORT_HEX)
+ {
+ sprintf(szTemp, "%02X", m_digest[0]);
+ strcat(szReport, szTemp);
+
+ for(i = 1; i < 20; i++)
+ {
+ sprintf(szTemp, " %02X", m_digest[i]);
+ strcat(szReport, szTemp);
+ }
+ }
+ else if(uReportType == REPORT_DIGIT)
+ {
+ sprintf(szTemp, "%u", m_digest[0]);
+ strcat(szReport, szTemp);
+
+ for(i = 1; i < 20; i++)
+ {
+ sprintf(szTemp, " %u", m_digest[i]);
+ strcat(szReport, szTemp);
+ }
+ }
+ else strcpy(szReport, "Error: Unknown report type!");
+}
+
+// Get the raw message digest
+void CSHA1::GetHash(UINT_8 *puDest)
+{
+ memcpy(puDest, m_digest, 20);
+}
+
diff --git a/protocols/Xfire/src/SHA1.h b/protocols/Xfire/src/SHA1.h new file mode 100644 index 0000000000..b95a00970f --- /dev/null +++ b/protocols/Xfire/src/SHA1.h @@ -0,0 +1,116 @@ +/*
+ 100% free public domain implementation of the SHA-1 algorithm
+ by Dominik Reichl <dominik.reichl@t-online.de>
+
+ Version 1.5 - 2005-01-01
+ - 64-bit compiler compatibility added
+ - Made variable wiping optional (define SHA1_WIPE_VARIABLES)
+ - Removed unnecessary variable initializations
+ - ROL32 improvement for the Microsoft compiler (using _rotl)
+
+ ======== Test Vectors (from FIPS PUB 180-1) ========
+
+ SHA1("abc") =
+ A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
+
+ SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") =
+ 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
+
+ SHA1(A million repetitions of "a") =
+ 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
+*/
+
+#ifndef ___SHA1_HDR___
+#define ___SHA1_HDR___
+//#define UINT_8 unsigned char
+//#define UINT_32 unsigned long
+
+#include <stdio.h> // Needed for file access
+#include <memory.h> // Needed for memset and memcpy
+#include <string.h> // Needed for strcat and strcpy
+#include <iostream>
+
+#ifdef _MSC_VER
+#include <stdlib.h>
+#endif
+
+// If you're compiling big endian, just comment out the following line
+#define SHA1_LITTLE_ENDIAN
+
+// #define or #undef this, if you want the CSHA1 class to wipe all
+// temporary variables after processing
+#define SHA1_WIPE_VARIABLES
+
+/////////////////////////////////////////////////////////////////////////////
+// Define 8- and 32-bit variables
+
+#ifndef UINT_32
+
+#ifdef _MSC_VER
+
+#define UINT_8 unsigned __int8
+#define UINT_32 unsigned __int32
+
+#else
+
+#define UINT_8 unsigned char
+
+#if (ULONG_MAX == 0xFFFFFFFF)
+#define UINT_32 unsigned long
+#else
+#define UINT_32 unsigned int
+#endif
+
+#endif
+#endif
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Declare SHA1 workspace
+
+typedef union
+{
+ UINT_8 c[64];
+ UINT_32 l[16];
+} SHA1_WORKSPACE_BLOCK;
+
+class CSHA1
+{
+public:
+ // Two different formats for ReportHash(...)
+ enum
+ {
+ REPORT_HEX = 0,
+ REPORT_DIGIT = 1
+ };
+
+ // Constructor and Destructor
+ CSHA1();
+ ~CSHA1();
+
+ UINT_32 m_state[5];
+ UINT_32 m_count[2];
+ UINT_8 m_buffer[64];
+ UINT_8 m_digest[20];
+
+ void Reset();
+
+ // Update the hash value
+ void Update(UINT_8 *data, UINT_32 len);
+ bool HashFile(char *szFileName);
+
+ // Finalize hash and report
+ void Final();
+ void ReportHash(char *szReport, unsigned char uReportType = REPORT_HEX);
+ void GetHash(UINT_8 *puDest);
+
+private:
+ // Private SHA-1 transformation
+ void Transform(UINT_32 *state, UINT_8 *buffer);
+
+ // Member variables
+ UINT_8 m_workspace[64];
+ SHA1_WORKSPACE_BLOCK *m_block; // SHA1 pointer to the byte array above
+};
+
+#endif
diff --git a/protocols/Xfire/src/Xfire_avatar_loader.cpp b/protocols/Xfire/src/Xfire_avatar_loader.cpp new file mode 100644 index 0000000000..e1fe2fdd01 --- /dev/null +++ b/protocols/Xfire/src/Xfire_avatar_loader.cpp @@ -0,0 +1,86 @@ +#include "stdafx.h"
+#include "Xfire_avatar_loader.h"
+
+Xfire_avatar_loader::Xfire_avatar_loader(xfirelib::Client* client) {
+ threadrunning=FALSE;
+ this->client=client;
+ InitializeCriticalSection(&this->avatarMutex);
+}
+
+Xfire_avatar_loader::~Xfire_avatar_loader() {
+ //liste leeren, damit der laufende thread abgebrochen wird
+ list.clear();
+ //warten bis der thread geschlossen wurde
+ EnterCriticalSection(&this->avatarMutex);
+ LeaveCriticalSection(&this->avatarMutex);
+ //critical section entfernen
+ DeleteCriticalSection(&this->avatarMutex);
+}
+
+void Xfire_avatar_loader::loadThread(LPVOID lparam) {
+ Xfire_avatar_loader* loader=(Xfire_avatar_loader*)lparam;
+
+ //kein loader, dann abbruch
+ if(!lparam)
+ return;
+
+ if(loader) {
+ EnterCriticalSection(&loader->avatarMutex);
+ loader->threadrunning=TRUE;
+ }
+
+ while(1){
+ //keinen avatarload auftrag mehr
+ if(!loader->list.size())
+ break;
+
+ //letzten load process holen
+ Xfire_avatar_process process=loader->list.back();
+
+ //buddyinfo abfragen
+ GetBuddyInfo buddyinfo;
+ buddyinfo.userid=process.userid;
+ if(loader->client)
+ if(loader->client->connected)
+ {
+ loader->client->send(&buddyinfo);
+ }
+ else //nicht mehr verbunden? dann liste leeren und schleife abbrechen
+ {
+ loader->list.clear();
+ break;
+ }
+
+ //auftrag entfernen
+ loader->list.pop_back();
+
+ Sleep(1000);
+ }
+
+ if(loader)
+ {
+ loader->threadrunning=FALSE;
+ LeaveCriticalSection(&loader->avatarMutex);
+ }
+
+ return;
+}
+
+BOOL Xfire_avatar_loader::loadAvatar(HANDLE hcontact,char*username,unsigned int userid) {
+ Xfire_avatar_process process={0};
+
+ //struktur füllen
+ process.hcontact = hcontact;
+ if(username)
+ strcpy_s(process.username,128,username);
+ process.userid=userid;
+
+ //Avataranfrage an die liste übergeben
+ this->list.push_back(process);
+
+ if(!threadrunning && client!=NULL) {
+ mir_forkthread(Xfire_avatar_loader::loadThread,(LPVOID)this);
+ }
+
+ return TRUE;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_avatar_loader.h b/protocols/Xfire/src/Xfire_avatar_loader.h new file mode 100644 index 0000000000..a51082629e --- /dev/null +++ b/protocols/Xfire/src/Xfire_avatar_loader.h @@ -0,0 +1,58 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2009 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+//Klasse behandelt alle Iconsachen unter Xfire
+
+#ifndef _XFIRE_AVATAR_LOADER
+#define _XFIRE_AVATAR_LOADER
+
+#include "client.h"
+#include "Xfire_base.h"
+#include "getbuddyinfo.h"
+#include <vector>
+
+using namespace xfirelib;
+
+struct Xfire_avatar_process {
+ HANDLE hcontact;
+ char username[128];
+ unsigned int userid;
+};
+
+class Xfire_avatar_loader : public Xfire_base {
+private:
+ static void loadThread(LPVOID lparam);
+ xfirelib::Client *client;
+ CRITICAL_SECTION avatarMutex;
+public:
+ vector<Xfire_avatar_process> list;
+ BOOL threadrunning;
+ BOOL loadAvatar(HANDLE hcontact,char*username,unsigned int userid);
+ Xfire_avatar_loader(xfirelib::Client* client);
+ ~Xfire_avatar_loader();
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_base.cpp b/protocols/Xfire/src/Xfire_base.cpp new file mode 100644 index 0000000000..2d28b12659 --- /dev/null +++ b/protocols/Xfire/src/Xfire_base.cpp @@ -0,0 +1,567 @@ +#include "stdafx.h"
+
+#include "Xfire_base.h"
+
+//rechnet die einzelnen chars des strings zusammen
+BYTE Xfire_base::accStringByte(char* str){
+ BYTE temp=0;
+
+ //keins tirng? bye bye
+ if(str==NULL)
+ return 0;
+
+ for(unsigned int i=0;i<(int)strlen(str);i++)
+ {
+ temp+=str[i];
+ }
+
+ return temp;
+}
+
+//lowercased einen string
+void Xfire_base::strtolower(char*str)
+{
+ //keins tirng? bye bye
+ if(str==NULL)
+ return;
+
+ //lowercase it :)
+ for(unsigned int i=0;i<(int)strlen(str);i++)
+ {
+ str[i]=tolower(str[i]);
+ }
+}
+
+//uppercased einen string
+void Xfire_base::strtoupper(char*str)
+{
+ //keins tirng? bye bye
+ if(str==NULL)
+ return;
+
+ //lowercase it :)
+ for(unsigned int i=0;i<(int)strlen(str);i++)
+ {
+ str[i]=toupper(str[i]);
+ }
+}
+
+//setzt einen string
+void Xfire_base::setString(char*from,char**to)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(from==NULL||to==NULL)
+ return;
+
+ //stringgröße auslesen
+ int size=strlen(from);
+
+ //bestehenden zielpointer leeren
+ if(*to!=NULL)
+ delete[] *to;
+
+ //neuen string anlegen
+ *to=new char[size+1];
+
+ //string in neues array kopieren
+ strcpy_s(*to,size+1,from);
+}
+
+//setzt einen string
+void Xfire_base::appendString(char*from,char**to)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(from==NULL||to==NULL||*to==NULL)
+ return;
+
+ //stringgröße auslesen
+ int size=strlen(from);
+ int size2=strlen(*to);
+
+ //temporären pointer anlegen
+ char* append=new char[size+size2+1];
+
+ //string in neues array kopieren
+ strcpy_s(append,size+size2+1,*to);
+ //zusätzlichen stirng anhängen
+ strcat_s(append,size+size2+1,from);
+ //altes to entfernen
+ delete[] *to;
+ //appendstring zuordnen
+ *to=append;
+}
+
+//liest einen stringval aus der db und setzt einen string für
+void Xfire_base::readStringfromDB(char*name,unsigned int dbid,char**to)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL||to==NULL)
+ return;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i",name,dbid);
+ if(!DBGetContactSettingTString(NULL, protocolname, temp,&dbv))
+ {
+ //string setzen
+ setString(dbv.pszVal,to);
+ //dbval wieder freigeben
+ DBFreeVariant(&dbv);
+ }
+}
+
+//liest einen stringval aus der db welches unterid hat und setzt einen string für
+void Xfire_base::readStringfromDB(char*name,unsigned int dbid,int id,char**to)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL||to==NULL)
+ return;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i_%i",name,dbid,id);
+ if(!DBGetContactSettingTString(NULL, protocolname, temp,&dbv))
+ {
+ //string setzen
+ setString(dbv.pszVal,to);
+ //dbval wieder freigeben
+ DBFreeVariant(&dbv);
+ }
+}
+
+//schreibt einen stringval in die db welche unterid hat
+void Xfire_base::writeStringtoDB(char*name,unsigned int dbid,int id,char*val)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL||val==NULL)
+ return;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i_%i",name,dbid,id);
+ DBWriteContactSettingTString(NULL, protocolname, temp,val);
+}
+
+//schreibt einen stringval in die db welche unterid hat
+void Xfire_base::writeStringtoDB(char*name,unsigned int dbid,char*val)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL||val==NULL)
+ return;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i",name,dbid);
+ DBWriteContactSettingTString(NULL, protocolname, temp,val);
+}
+
+//schreibt einen bytewert in die db
+void Xfire_base::writeBytetoDB(char*name,unsigned int dbid,int val)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL)
+ return;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i",name,dbid);
+ DBWriteContactSettingByte(NULL, protocolname, temp, val);
+}
+
+//schreibt einen wordwert in die db
+void Xfire_base::writeWordtoDB(char*name,unsigned int dbid,int val)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL)
+ return;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i",name,dbid);
+ DBWriteContactSettingWord(NULL, protocolname, temp, val);
+}
+
+
+//liest einen byteval aus der db und gibt es zurück
+unsigned char Xfire_base::readBytefromDB(char*name,unsigned int dbid,int defaultval)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL)
+ return 0;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i",name,dbid);
+ return DBGetContactSettingByte(NULL, protocolname, temp, defaultval);
+}
+
+//liest einen wordval aus der db und gibt es zurück
+unsigned int Xfire_base::readWordfromDB(char*name,unsigned int dbid,int defaultval)
+{
+ //keine quelle, kein ziel? dann nix machen
+ if(name==NULL)
+ return 0;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i",name,dbid);
+ return DBGetContactSettingWord(NULL, protocolname, temp, defaultval);
+}
+
+//entfernt einen dbeintrag
+BOOL Xfire_base::removeDBEntry(char*name,unsigned int dbid)
+{
+ //kein name?
+ if(name==NULL)
+ return 0;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i",name,dbid);
+
+ //eintrag entfernen
+ if(!DBGetContactSetting(NULL, protocolname, temp,&dbv))
+ {
+ DBFreeVariant(&dbv);
+ DBDeleteContactSetting(NULL, protocolname, temp);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//entfernt einen dbeintrag welche unterid's hat
+BOOL Xfire_base::removeDBEntry(char*name,unsigned int dbid,int id)
+{
+ //kein name?
+ if(name==NULL)
+ return 0;
+
+ //wert aus der dblesen
+ sprintf_s(temp,128,"%s_%i_%i",name,dbid,id);
+
+ //eintrag entfernen
+ if(!DBGetContactSetting(NULL, protocolname, temp,&dbv))
+ {
+ DBFreeVariant(&dbv);
+ DBDeleteContactSetting(NULL, protocolname, temp);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//sucht innerhalb eines strings ein anderen string und liefert true zurück wenn gefunden
+BOOL Xfire_base::inString(char*str,char*search,char**pos) {
+ //leere pointer?, dann FALSE zurück
+ if(str==NULL||search==NULL)
+ {
+ //poszeiger, falls übergeben, auf NULL setzen
+ if(pos) *pos=NULL;
+ return FALSE;
+ }
+
+ //ist der gesuchte string größer, wie der string wo gesucht werden soll? dann FALSE zurück
+ unsigned int sizeofsearch=strlen(search);
+ if(sizeofsearch>strlen(str))
+ {
+ //poszeiger, falls übergeben, auf NULL setzen
+ if(pos) *pos=NULL;
+ return FALSE;
+ }
+
+ char* src=str;
+ char* s=search;
+
+ while(*src!=0)
+ {
+ if(*src==*s) //gleich, dann zum nächsten buchstaben springen
+ s++;
+ else if(*s==0) //string ende erreicht? dann true
+ {
+ //poszeiger mit aktueller pos füllen, da position gefunden
+ if(pos) *pos=src-sizeofsearch;
+ return TRUE;
+ }
+ else //anderer biuchstabe? dann wieder zurück zum anfangsbuchstaben
+ s=search;
+ src++;
+ }
+ if(*s==0) //string ende erreicht? dann true
+ {
+ //poszeiger mit aktueller pos füllen, da position gefunden
+ if(pos) *pos=src-sizeofsearch;
+ return TRUE;
+ }
+
+ //poszeiger, falls übergeben, auf NULL setzen
+ if(pos) *pos=NULL;
+ //nix gefunden, FALSE
+ return FALSE;
+}
+
+void Xfire_base::strreplace(char*search,char*replace,char**data) {
+ //leere pointer?, dann zurück
+ if(replace==NULL||search==NULL||data==NULL||*data==NULL)
+ {
+ return;
+ }
+
+ char* pos=NULL;
+ //gesuchten string suchen
+ if(this->inString(*data,search,&pos))
+ {
+ //gefunden? dann replace
+ *pos=0;
+ char* newdata=NULL;
+ //alles vorm gefunden anhängen
+ this->setString(*data,&newdata);
+ //ersetzendes anhängen
+ this->appendString(replace,&newdata);
+ //poszeiger um die größe des zusuchenden strings erhöhen
+ pos+=strlen(search);
+ //rest anhängen
+ this->appendString(pos,&newdata);
+ //alten string löschen
+ delete[] *data;
+ *data=NULL;
+ //neuen auf diesen setzen
+ this->setString(newdata,data);
+ //temporären newdata löschen
+ delete[] newdata;
+ }
+}
+
+//stringvergleich mit wildcards
+BOOL Xfire_base::wildcmp(const char*search,const char *text) {
+ //keine gültigen strings, dann abbruch
+ if(search==NULL || text==NULL || *text==0 || *search==0)
+ return FALSE;
+
+ //wildcardmodus
+ int wildc=0;
+
+ do {
+ //wilcard gefunden?
+ if(*search=='*')
+ {
+ //wildcardmodus an
+ wildc=1;
+ //nächsten suchzeichen
+ search++;
+ //wenn searchzeichen 0, dann 1 zurückgeben, da der rest des searchstings egal ist
+ if(*search==0)
+ return TRUE;
+ }
+
+ //prüfe searchzeichen mit textzeichen, aber nut wenn kein wildcardmodus aktiv ist
+ if(*search!=*text && !wildc)
+ return FALSE;
+
+ //kein wildcardmodus
+ if(!wildc)
+ {
+ //nächstes suchzeichen
+ search++;
+ }
+ //wenn suchzeichen und textzeichen gleich ist
+ else if(*search==*text)
+ {
+ //den wildcardmodus abschalten
+ wildc=0;
+ //nächstes suchzeichen
+ search++;
+ }
+ //nächstes textzeichen
+ text++;
+ //wenn textende erreicht und suchzeichen noch vorhanden, dann 0 zurückgegebn
+ if(*text==0 && *search!=0)
+ return FALSE;
+ }
+ //solange weiter bis kein suchzeichen mehr vorhanden is
+ while(*search!=0);
+
+ //textzeichen übrig 0 zurück
+ if(*text!=0)
+ return FALSE;
+
+ //volle übereinstimmung
+ return TRUE;
+}
+
+//wrapper wenn nur gameid angegeben
+BOOL Xfire_base::getIniValue(unsigned int gameid,const char* valname,char*out,int sizeofout) {
+ return Xfire_base::getIniValue(gameid,0,valname,out,sizeofout);
+}
+
+
+//läd einen eintrag aus der ini
+BOOL Xfire_base::getIniValue(unsigned int gameid,unsigned int subid,const char* valname,char*out,int sizeofout) {
+ //kein ziel oder kein variablenname, dann FALSE zurück
+ if(!out || !valname)
+ return FALSE;
+
+ char idstring[15];
+ char path[MAX_PATH];
+
+ //pfad einlesen
+ if(!getIniPath(path))
+ return FALSE; //kein pfad bug?!?!
+
+ if(subid==0) {
+ sprintf_s(idstring,15,"%d",gameid);
+
+ if(xfire_GetPrivateProfileString(idstring, valname, "", out, sizeofout, path))
+ return TRUE;
+
+ subid++;
+ }
+
+ sprintf_s(idstring,15,"%d_%d",gameid,subid);
+
+ if(xfire_GetPrivateProfileString(idstring, valname, "", out, sizeofout, path))
+ return TRUE;
+
+ return FALSE;
+}
+
+BOOL Xfire_base::getIniPath(char*path) {
+ //kein ziel abbruch
+ if(!path)
+ return FALSE;
+
+ FoldersGetCustomPath( XFireWorkingFolder, path, MAX_PATH, "" );
+ strcat_s(path,MAX_PATH,"\\");
+ strcat_s(path,MAX_PATH,"xfire_games.ini");
+
+ return TRUE;
+}
+
+BOOL Xfire_base::getIconPath(char*path) {
+ //kein ziel abbruch
+ if(!path)
+ return FALSE;
+
+ FoldersGetCustomPath( XFireIconFolder, path, MAX_PATH, "" );
+ strcat_s(path,MAX_PATH,"\\");
+
+ return TRUE;
+}
+
+BOOL Xfire_base::getGamename(unsigned int gameid,char* out,int outsize){
+ //kein ziel
+ if(!out)
+ return FALSE;
+
+ if(!getIniValue(gameid,"LongName",out,outsize))
+ {
+ //customnamen laden, wenn vorhanden
+ DBVARIANT dbv;
+ char dbstr[80]="";
+ sprintf_s(dbstr,XFIRE_MAXSIZEOFGAMENAME,"customgamename_%d",gameid);
+ if(!DBGetContactSetting(NULL,protocolname,dbstr,&dbv)) {
+ sprintf_s(out,outsize,"%s",dbv.pszVal);
+ DBFreeVariant(&dbv);
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ return TRUE;
+}
+
+//wandelt einen buffer mit größe in ein hicon mit hilfe von gdi+ um
+HICON Xfire_base::createHICONfromdata(LPVOID data,unsigned int size) {
+ //zielspeichern anlegen
+ HGLOBAL buffer=GlobalAlloc(GMEM_MOVEABLE, size);
+ if(buffer) {
+ LPVOID data2=GlobalLock(buffer);
+ if(data2) {
+ CopyMemory(data2, data, size);
+
+ IStream* stream=NULL;
+ if(CreateStreamOnHGlobal(data2,FALSE,&stream)== S_OK)
+ {
+ HICON hicon=NULL;
+ Gdiplus::Bitmap image(stream);
+
+ image.GetHICON(&hicon);
+ stream->Release();
+
+ GlobalUnlock(buffer);
+ GlobalFree(buffer);
+
+ return hicon;
+ }
+ GlobalUnlock(buffer);
+ }
+ GlobalFree(buffer);
+ }
+ return NULL;
+}
+
+//wandelt einen buffer mit größe in ein hicon mit hilfe von gdi+ um
+HBITMAP Xfire_base::createHBITMAPfromdata(LPVOID data,unsigned int size) {
+ //zielspeichern anlegen
+ HGLOBAL buffer=GlobalAlloc(GMEM_MOVEABLE, size);
+ if(buffer) {
+ LPVOID data2=GlobalLock(buffer);
+ if(data2) {
+ CopyMemory(data2, data, size);
+
+ IStream* stream=NULL;
+ if(CreateStreamOnHGlobal(data2,FALSE,&stream)== S_OK)
+ {
+ HBITMAP hbitmap=NULL;
+ Gdiplus::Bitmap image(stream);
+
+ image.GetHBITMAP(0,&hbitmap);
+ stream->Release();
+
+ GlobalUnlock(buffer);
+ GlobalFree(buffer);
+
+ return hbitmap;
+ }
+ GlobalUnlock(buffer);
+ }
+ GlobalFree(buffer);
+ }
+ return NULL;
+}
+
+//prüft ob processid noch gültig is
+BOOL Xfire_base::isValidPid(DWORD pid) {
+ DWORD aProcesses[1024],cbNeeded,cProcesses;
+
+ if(pid==NULL)
+ return FALSE;
+
+ if(!EnumProcesses(aProcesses,sizeof(aProcesses),&cbNeeded))
+ return FALSE;
+
+ cProcesses = cbNeeded / sizeof(DWORD);
+
+ for ( unsigned int i = 0; i < cProcesses; i++ )
+ if(aProcesses[i]==pid)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+//sucht nach einen process und liefert die pid
+BOOL Xfire_base::getPidByProcessName(char*name,DWORD*pid) {
+ if(pid==NULL||name==NULL)
+ return FALSE;
+
+ HANDLE hSnapShot = CreateToolhelp32Snapshot ( TH32CS_SNAPALL, 0);
+ PROCESSENTRY32* processInfo = new PROCESSENTRY32;
+ processInfo->dwSize = sizeof ( PROCESSENTRY32);
+
+ while ( Process32Next ( hSnapShot,processInfo ) != FALSE)
+ {
+ if(processInfo->th32ProcessID!=0) {
+ if(_stricmp(processInfo->szExeFile,name)==0)
+ {
+ *pid=processInfo->th32ProcessID;
+ CloseHandle ( hSnapShot);
+ return TRUE;
+ }
+ }
+ }
+ CloseHandle ( hSnapShot);
+ return FALSE;
+}
diff --git a/protocols/Xfire/src/Xfire_base.h b/protocols/Xfire/src/Xfire_base.h new file mode 100644 index 0000000000..5753e631c4 --- /dev/null +++ b/protocols/Xfire/src/Xfire_base.h @@ -0,0 +1,81 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+/*
+ Beinhaltet Basisfunktionen
+*/
+
+#ifndef _XFIRE_BASE
+#define _XFIRE_BASE
+
+#include "baseProtocol.h"
+
+extern HANDLE XFireWorkingFolder;
+extern HANDLE XFireIconFolder;
+
+#define XFIRE_MAXSIZEOFGAMENAME 80
+
+class Xfire_base {
+private:
+ //vars
+ DBVARIANT dbv;
+public:
+ char temp[128];
+ //funktionen/tools
+ void setString(char*from,char**to);
+ void appendString(char*from,char**to);
+ void readStringfromDB(char*name,unsigned int dbid,char**to);
+ void readStringfromDB(char*name,unsigned int dbid,int id,char**to);
+ unsigned char readBytefromDB(char*name,unsigned int dbid,int defaultval=0);
+ unsigned int readWordfromDB(char*name,unsigned int dbid,int defaultval=0);
+ BOOL removeDBEntry(char*name,unsigned int dbid);
+ BOOL removeDBEntry(char*name,unsigned int dbid,int id2);
+ void writeStringtoDB(char*name,unsigned int dbid,int id,char*val);
+ void writeStringtoDB(char*name,unsigned int dbid,char*val);
+ void writeBytetoDB(char*name,unsigned int dbid,int val);
+ void writeWordtoDB(char*name,unsigned int dbid,int val);
+ void strtolower(char*);
+ void strtoupper(char*);
+ void strreplace(char*search,char*replace,char**data);
+ BYTE accStringByte(char*);
+ BOOL inString(char*str,char*search,char**pos=NULL);
+ BOOL wildcmp(const char*search,const char *text);
+ // ini funktionen
+ BOOL getIniValue(unsigned int gameid,const char* valname,char*out,int sizeofout=255);
+ BOOL getIniValue(unsigned int gameid,unsigned int subid,const char* valname,char*out,int sizeofout=255);
+ BOOL getIniPath(char*path);
+ BOOL getIconPath(char*path);
+ // gamename
+ BOOL getGamename(unsigned int gameid,char* out,int outsize=255);
+ //gdi+
+ HICON createHICONfromdata(LPVOID data,unsigned int size);
+ HBITMAP createHBITMAPfromdata(LPVOID data,unsigned int size);
+ //processzeugs
+ BOOL isValidPid(DWORD pid);
+ BOOL getPidByProcessName(char*name,DWORD*pid);
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_game.cpp b/protocols/Xfire/src/Xfire_game.cpp new file mode 100644 index 0000000000..10ae7bc783 --- /dev/null +++ b/protocols/Xfire/src/Xfire_game.cpp @@ -0,0 +1,487 @@ +#include "stdafx.h"
+
+#include "Xfire_game.h"
+#include "pwd_dlg.h" //passwort eingabe dlg
+
+//prüft nach, ob das game das nötige extragameargs im launcherstring hat
+BOOL Xfire_game::haveExtraGameArgs() {
+ //kein launcher stirng, dann abbruch
+ if(!this->launchparams)
+ return FALSE;
+
+ //wenn platzhalter vorhanden, dann TRUE zurück
+ if(this->inString(this->launchparams,"%UA_LAUNCHER_EXTRA_ARGS%"))
+ return TRUE;
+
+ return FALSE;
+}
+
+//startes das spiel
+BOOL Xfire_game::start_game(char*ip,unsigned int port,char*pw) {
+ //launchparam prüfen ob gefüllt?
+ if(this->launchparams==NULL)
+ return FALSE;
+
+ //ist launchparam großgenug für eibne urlprüfung?
+ if(strlen(this->launchparams)>5)
+ {
+ //launchparams ne url? dann openurl funktion von miranda verwenden
+ if(this->launchparams[0]=='h'&&
+ this->launchparams[1]=='t'&&
+ this->launchparams[2]=='t'&&
+ this->launchparams[3]=='p'&&
+ this->launchparams[4]==':')
+ {
+ return CallService( MS_UTILS_OPENURL, 1, (LPARAM)this->launchparams );
+ }
+ }
+
+ //spiel hat netwerkparameter?
+ int networksize=0;
+ char* mynetworkparams=NULL;
+
+ if(this->networkparams)
+ {
+ if(ip)
+ {
+ char portstr[6]="";
+ int pwsize=255;
+
+ //größe des netzwerparams berechnen
+ if(this->pwparams)
+ pwsize+=strlen(this->pwparams);
+
+ mynetworkparams=new char[strlen(this->networkparams)+pwsize];
+ strcpy_s(mynetworkparams,strlen(this->networkparams)+pwsize,this->networkparams);
+
+ //port begrenzen
+ port=port%65535;
+ //port in string wandeln
+ sprintf_s(portstr,6,"%d",port);
+
+ str_replace(mynetworkparams,"%UA_GAME_HOST_NAME%",ip);
+ str_replace(mynetworkparams,"%UA_GAME_HOST_PORT%",portstr);
+
+ //passwort dialog, nur wenn SHIFT gehalten wird beim join, da sonst immer gefragt wird
+ if(GetAsyncKeyState(VK_LSHIFT) && this->pwparams){
+ char password[256]=""; //passwort maximal 255 zeichen
+
+ if(ShowPwdDlg(password)) {
+ char* mypwargs=new char[pwsize];
+
+ //speicher frei?
+ if(mypwargs!=NULL) {
+ strcpy_s(mypwargs,pwsize,this->pwparams);
+ str_replace(mypwargs, "%UA_GAME_HOST_PASSWORD%", password);
+ str_replace(mynetworkparams,"%UA_LAUNCHER_PASSWORD_ARGS%",mypwargs);
+ delete[] mypwargs;
+ }
+ else
+ str_replace(mynetworkparams,"%UA_LAUNCHER_PASSWORD_ARGS%","");
+ }
+ else
+ {
+ str_replace(mynetworkparams,"%UA_LAUNCHER_PASSWORD_ARGS%","");
+ }
+ }
+ else
+ str_replace(mynetworkparams,"%UA_LAUNCHER_PASSWORD_ARGS%","");
+
+ //bestimmte felder erstmal leer ersetzen
+ str_replace(mynetworkparams,"%UA_LAUNCHER_RCON_ARGS%","");
+ }
+
+ if(mynetworkparams)
+ networksize=strlen(mynetworkparams)+strlen(this->networkparams);
+ }
+
+ //extra parameter
+ int extraparamssize=0;
+ if(this->extraparams)
+ {
+ extraparamssize=strlen(this->extraparams);
+ }
+
+ //temporäres array anlegen
+ char*temp=NULL;
+ temp=new char[strlen(this->launchparams)+networksize+extraparamssize+1];
+
+ if(temp==NULL)
+ {
+ //wenn nwparams gesetzt, leeren
+ if(mynetworkparams)
+ delete[] mynetworkparams;
+
+ return FALSE;
+ }
+
+ //launcherstring ins temporäre array
+ strcpy_s(temp,strlen(this->launchparams)+1,this->launchparams);
+
+ //netzwerkparameter ?
+ if(mynetworkparams)
+ {
+ str_replace(temp,"%UA_LAUNCHER_NETWORK_ARGS%",mynetworkparams);
+ delete[] mynetworkparams;
+ }
+ else
+ str_replace(temp,"%UA_LAUNCHER_NETWORK_ARGS%","");
+
+ if(this->extraparams)
+ str_replace(temp,"%UA_LAUNCHER_EXTRA_ARGS%",this->extraparams);
+ else
+ str_replace(temp,"%UA_LAUNCHER_EXTRA_ARGS%","");
+
+ //auf createprocess umgebaut
+ STARTUPINFO si = { sizeof(si) };
+ PROCESS_INFORMATION pi;
+
+ // MessageBox(NULL,temp,temp,0);
+
+ //starten
+ if(CreateProcess(0, temp, 0, 0, FALSE, 0, 0, GetLaunchPath(temp) , &si, &pi)==0)
+ {
+ //schlug fehl, dann runas methode verwenden
+ char*exe=strrchr(temp,'\\');
+ if(exe==0)
+ {
+ delete[] temp;
+ return FALSE;
+ }
+ *exe=0;
+ exe++;
+ char*params=strchr(exe,'.');
+ if(params!=0)
+ {
+ params=strchr(params,' ');
+ if(params!=0)
+ {
+ *params=0;
+ params++;
+ }
+ }
+
+
+ SHELLEXECUTEINFO sei = {0};
+ sei.cbSize = sizeof(sei);
+ sei.hwnd = NULL;
+ sei.lpVerb = "runas";
+ sei.lpFile = exe;
+ sei.lpParameters = params;
+ sei.lpDirectory = temp;
+ sei.nShow = SW_SHOWNORMAL;
+ ShellExecuteEx(&sei);
+ }
+ delete[] temp;
+ return TRUE;
+}
+
+//prüft den übergebenen pfad, ob es dem spiel vergleichbar
+BOOL Xfire_game::checkpath(PROCESSENTRY32* processInfo)
+{
+ //gibts net, weg mit dir
+ if(this->path==NULL)
+ return FALSE;
+
+ //versuche ein processhandle des speils zubekommen
+ HANDLE op=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, processInfo->th32ProcessID);
+
+ if(op)
+ {
+ //varaibele wohin der pfad eingelesen wird
+ char fpath[MAX_PATH]="";
+
+ //lese den pfad des spiels aus
+ GetModuleFileNameEx(op,NULL,fpath,sizeof(fpath));
+
+ //8.3 pfade umwandeln, nur wenn sich eine tilde im string befindet
+ if(strchr(fpath,'~'))
+ GetLongPathNameA(fpath,fpath,sizeof(fpath));
+
+ //alles in kelinbuchstaben umwandeln
+ this->strtolower(fpath);
+
+ if(this->wildcmp(this->path,fpath))
+ //if(strcmp(this->path,fpath)==0)
+ {
+ //pfad stimmt überein, commandline prüfen
+ if(checkCommandLine(op,this->mustcontain,this->notcontain))
+ {
+ //handle zuamachen
+ CloseHandle(op);
+ //positive antwort an die gamedetection
+ return TRUE;
+ }
+ }
+ else //prüfe den multipfad
+ {
+ int size=mpath.size();
+ for(int j=0;j<size;j++)
+ {
+ if(strcmp(mpath.at(j),fpath)==0)
+ {
+ //pfad stimmt überein, commandline prüfen
+ if(checkCommandLine(op,this->mustcontain,this->notcontain))
+ {
+ //handle zumachen
+ CloseHandle(op);
+ //positive antwort an die gamedetection
+ return TRUE;
+ }
+ }
+ }
+ }
+ //is nich das game, handle zumachen
+ CloseHandle(op);
+ }
+ else //if(this->mustcontain==NULL&&this->notcontain==NULL) //spiele die was bestimmtes im pfad benötigen skippen
+ {
+ char* exename=strrchr(this->path,'\\')+1;
+
+ //kleiner fix bei fehlerhaften pfaden kann keine exe ermittelt werden also SKIP
+ if((unsigned int)exename==0x1)
+ return FALSE;
+
+ //exenamen des process kleinschreiben
+ this->strtolower(processInfo->szExeFile);
+
+ //vergleich die exenamen
+ if(strcmp(exename,processInfo->szExeFile)==0)
+ {
+ return TRUE;
+ }
+ else //anderen pfade des games noch durchprüfen
+ {
+ int size=mpath.size();
+ for(int j=0;j<size;j++)
+ {
+ //exenamen rausfischen
+ char* exename=strrchr(mpath.at(j),'\\')+1;
+
+ //mhn keien exe, nächsten pfad prüfen
+ if((unsigned int)exename==0x1)
+ continue;
+
+ //exe vergleichen
+ if(strcmp(exename,processInfo->szExeFile)==0)
+ {
+ //positive antwort an die gamedetection
+ return TRUE;
+ }
+ }
+ }
+ }
+
+ //keine übereinstimmung
+ return FALSE;
+}
+
+//icondaten setzen
+void Xfire_game::setIcon(HICON hicon,HANDLE handle) {
+ this->hicon=hicon;
+ this->iconhandl=handle;
+}
+
+//liest gamewerte aus der db
+void Xfire_game::readFromDB(unsigned dbid)
+{
+ //lese alle string werte aus der db und befülle die passenden variablen damit
+ this->readStringfromDB("gamepath",dbid,&this->path);
+
+ //8.3 fix, prüfe auf ~ pfad, wenn ja pfad var umwalnd in longname
+ if(this->path)
+ {
+ BOOL found=FALSE;
+ for(unsigned int i=0;i<strlen(this->path);i++)
+ {
+ if(this->path[i] == '~')
+ {
+ found=TRUE;
+ break;
+ }
+ }
+ //gefunden? dann stirng wandeln und in pfad speichern
+ if(found) {
+ char ctemp[MAX_PATH]="";
+ strcpy_s(ctemp,MAX_PATH,this->path);
+ GetLongPathNameA(ctemp,ctemp,sizeof(ctemp));
+ this->strtolower(ctemp);
+ this->setString(ctemp,&this->path);
+ }
+ }
+
+ this->readStringfromDB("gamelaunch",dbid,&this->launchparams);
+ this->readStringfromDB("gamenetargs",dbid,&this->networkparams);
+ this->readStringfromDB("gamepwargs",dbid,&this->pwparams);
+ this->readStringfromDB("gameuserargs",dbid,&this->userparams);
+ this->readStringfromDB("gamecmdline",dbid,&this->mustcontain);
+ this->readStringfromDB("gamencmdline",dbid,&this->notcontain);
+
+ //alle sonstigen werte
+ this->id=this->readWordfromDB("gameid",dbid);
+ this->send_gameid=this->readWordfromDB("gamesendid",dbid);
+ if(this->send_gameid==0)
+ this->send_gameid=this->id;
+ this->setstatusmsg=this->readWordfromDB("gamesetsmsg",dbid,0);
+ this->custom=this->readBytefromDB("gamecustom",dbid,0);
+ this->skip=this->readBytefromDB("gameskip",this->id,0);
+ this->notinstartmenu=this->readBytefromDB("notinstartmenu",this->id,0);
+ this->noicqstatus=this->readBytefromDB("gamenostatus",this->id,0);
+ this->readStringfromDB("gameextraparams",this->id,&this->extraparams);
+ this->readStringfromDB("customgamename",this->id,&this->customgamename);
+ this->readStringfromDB("statusmsg",this->id,&this->statusmsg);
+
+ //mehrere pfade
+ int size=this->readWordfromDB("gamemulti",dbid,0);
+ for(int j=0;j<size;j++)
+ {
+ char* tpath=NULL;
+ this->readStringfromDB("gamepath",dbid,j,&tpath);
+
+ if(tpath)
+ {
+ mpath.push_back(tpath);
+ }
+ }
+
+ //spielname auslesen, wird später für die sortierung gebraucht
+ setNameandIcon();
+}
+
+//läd spielnamen aus, sowie icon
+void Xfire_game::setNameandIcon()
+{
+ if(this->customgamename)
+ {
+ this->setString(this->customgamename,&this->name);
+ }
+ else
+ {
+ //std::string game=GetGame(this->id,0,&this->iconhandl,&this->hicon,TRUE);
+ //zielbuffer für den namen
+ char buf[XFIRE_MAXSIZEOFGAMENAME]="Unknown Game";
+ //name des spiels auslesen
+ this->getGamename(this->id,buf,XFIRE_MAXSIZEOFGAMENAME);
+ //namen setzen
+ this->setString(buf,&this->name);
+ }
+}
+
+//liest gamewerte aus der db
+void Xfire_game::writeToDB(unsigned dbid)
+{
+ //alle stringwerte schreiben
+ this->writeStringtoDB("gamepath",dbid,this->path);
+ this->writeStringtoDB("gamelaunch",dbid,this->launchparams);
+ this->writeStringtoDB("gamenetargs",dbid,this->networkparams);
+ this->writeStringtoDB("gamepwargs",dbid,this->pwparams);
+ this->writeStringtoDB("gameuserargs",dbid,this->userparams);
+ this->writeStringtoDB("gamecmdline",dbid,this->mustcontain);
+ this->writeStringtoDB("gamencmdline",dbid,this->notcontain);
+
+ //alle sonstigen werte
+ this->writeWordtoDB("gameid",dbid,this->id);
+ if(this->send_gameid!=0&&this->send_gameid!=this->id) this->writeWordtoDB("gamesendid",dbid,this->send_gameid);
+ if(this->setstatusmsg!=0) this->writeWordtoDB("gamesetsmsg",dbid,this->setstatusmsg);
+ if(this->custom!=0) this->writeBytetoDB("gamecustom",dbid,this->custom);
+ //wenn gesetzt, dann eintrag machen
+ if(this->skip!=0)
+ this->writeBytetoDB("gameskip",this->id,this->skip);
+ else //wenn nicht eintrag aus db löschen
+ this->removeDBEntry("gameskip",this->id);
+ if(this->notinstartmenu!=0)
+ this->writeBytetoDB("notinstartmenu",this->id,this->notinstartmenu);
+ else //wenn nicht eintrag aus db löschen
+ this->removeDBEntry("notinstartmenu",this->id);
+ if(this->noicqstatus!=0)
+ this->writeBytetoDB("gamenostatus",this->id,this->noicqstatus);
+ else //wenn nicht eintrag aus db löschen
+ this->removeDBEntry("gamenostatus",this->id);
+ if(this->extraparams!=0)
+ this->writeStringtoDB("gameextraparams",this->id,this->extraparams);
+ else //wenn nicht eintrag aus db löschen
+ this->removeDBEntry("gameextraparams",this->id);
+ if(this->customgamename!=0)
+ this->writeStringtoDB("customgamename",this->id,this->customgamename);
+ else //wenn nicht eintrag aus db löschen
+ this->removeDBEntry("customgamename",this->id);
+ if(this->statusmsg!=0)
+ this->writeStringtoDB("statusmsg",this->id,this->statusmsg);
+ else //wenn nicht eintrag aus db löschen
+ this->removeDBEntry("statusmsg",this->id);
+
+
+
+ //mehrere pfade
+ int size=mpath.size();
+ if(size>0)
+ {
+ this->writeWordtoDB("gamemulti",dbid,mpath.size());
+ for(int j=0;j<size;j++)
+ {
+ this->writeStringtoDB("gamepath",dbid,j,mpath.at(j));
+ }
+ }
+
+ //sendid 0 dann standard id reinladen
+ if(this->send_gameid==0)
+ this->send_gameid=this->id;
+}
+
+//erzeugt ein menüpunkt
+void Xfire_game::createMenuitem(unsigned int pos,int dbid)
+{
+ CLISTMENUITEM mi = { 0 };
+ char servicefunction[100];
+
+ if(dbid<0)
+ dbid=pos;
+
+ memset(&mi,0,sizeof(CLISTMENUITEM));
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "StartGame%d");
+ mi.popupPosition = 500084000;
+ mi.pszPopupName = Translate("Start game");
+ mi.pszContactOwner=protocolname;
+ mi.cbSize = sizeof( mi );
+
+ sprintf(temp,servicefunction,this->id);
+ //wenn die servicefunktion schon exisitert vernichten, hehe
+ if(ServiceExists(temp))
+ DestroyServiceFunction(temp);
+ CreateServiceFunctionParam(temp,StartGame,this->id);
+ mi.pszService = temp;
+ mi.position = 500090002+pos;
+ mi.hIcon = this->hicon?this->hicon:LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszName = menuitemtext(this->name);
+ this->menuhandle=Menu_AddMainMenuItem(&mi);
+
+ //menu aktualisieren ob hidden
+ this->refreshMenuitem();
+}
+
+//entfernt menüpunkt
+void Xfire_game::remoteMenuitem()
+{
+ if(menuhandle!=NULL)
+ {
+ CallService( MS_CLIST_REMOVEMAINMENUITEM, ( WPARAM )menuhandle, 0 );
+ menuhandle=NULL;
+ }
+}
+
+//aktualisiert menüpunkt ob hidden
+void Xfire_game::refreshMenuitem()
+{
+ if(menuhandle!=NULL)
+ {
+ CLISTMENUITEM clmi = { 0 };
+ clmi.cbSize = sizeof( clmi );
+ clmi.flags = CMIM_FLAGS;
+
+ if(this->notinstartmenu)
+ clmi.flags|= CMIF_HIDDEN;
+
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )menuhandle, ( LPARAM )&clmi );
+ }
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_game.h b/protocols/Xfire/src/Xfire_game.h new file mode 100644 index 0000000000..0d502d121b --- /dev/null +++ b/protocols/Xfire/src/Xfire_game.h @@ -0,0 +1,194 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+/*
+ Beinhaltet alle Funktionen und Informationen des Spiels
+*/
+
+#ifndef _XFIRE_GAME
+#define _XFIRE_GAME
+
+#include "Xfire_base.h"
+#include <vector>
+
+using namespace std;
+
+//externe funktion die das spielstarten steuern
+extern int StartGame(WPARAM wParam,LPARAM lParam,LPARAM fParam);
+
+class Xfire_game : public Xfire_base {
+public:
+ //id des spiels
+ unsigned int id;
+ //handle des menuitems
+ HANDLE menuhandle;
+ //spiel soll bei der detection übersprungen werden
+ BOOL skip;
+ //voicehat?
+ BOOL voicechat;
+ //es soll kein icq und co status gesetzt werden
+ BOOL noicqstatus;
+ //handelt es sich um ein "custom" spiel
+ BOOL custom;
+ //soll ein spez. status gesetzt werden
+ BOOL setstatusmsg;
+ //iconhandle von miranda
+ HANDLE iconhandl;
+ //hicon vom icon des spiels
+ HICON hicon;
+ //dont show in startmenü
+ BOOL notinstartmenu;
+
+ //pfad des spiels wenn es laufen sollte
+ char* path;
+ //startparameter des spiels
+ char* launchparams;
+ //netzwerkparameter
+ char* networkparams;
+ //username parameter
+ char* userparams;
+ //passwort paramter
+ char* pwparams;
+ //mustcontain parameter
+ char* mustcontain;
+ //notcontain parameter
+ char* notcontain;
+ //spielname
+ char* name;
+ //extraparameter
+ char* extraparams;
+ //custom gamename
+ char* customgamename;
+ //custom statusmsg for xfire
+ char* statusmsg;
+
+ //mehrere pfade
+ vector<char*> mpath;
+
+ //zu sende gameid
+ signed short send_gameid;
+
+ //konstruktor
+ Xfire_game() {
+ //vars leer setzen
+ path=NULL;
+ launchparams=NULL;
+ networkparams=NULL;
+ userparams=NULL;
+ pwparams=NULL;
+ mustcontain=NULL;
+ notcontain=NULL;
+ name=NULL;
+ menuhandle=NULL;
+ iconhandl=NULL;
+ hicon=NULL;
+ extraparams=NULL;
+ customgamename=NULL;
+ statusmsg=NULL;
+ id=skip=noicqstatus=custom=setstatusmsg=send_gameid=notinstartmenu=voicechat=0;
+ }
+ //dekonstruktor
+ ~Xfire_game() {
+ //entferne dyn arrays
+ if(path)
+ {
+ delete[] path;
+ path=NULL;
+ }
+ if(launchparams)
+ {
+ delete[] launchparams;
+ launchparams=NULL;
+ }
+ if(networkparams)
+ {
+ delete[] networkparams;
+ networkparams=NULL;
+ }
+ if(userparams)
+ {
+ delete[] userparams;
+ userparams=NULL;
+ }
+ if(pwparams)
+ {
+ delete[] pwparams;
+ pwparams=NULL;
+ }
+ if(mustcontain)
+ {
+ delete[] mustcontain;
+ mustcontain=NULL;
+ }
+ if(notcontain)
+ {
+ delete[] notcontain;
+ notcontain=NULL;
+ }
+ if(name)
+ {
+ delete[] name;
+ name=NULL;
+ }
+ if(extraparams)
+ {
+ delete[] extraparams;
+ extraparams=NULL;
+ }
+ if(customgamename)
+ {
+ delete[] customgamename;
+ customgamename=NULL;
+ }
+ if(statusmsg)
+ {
+ delete[] statusmsg;
+ statusmsg=NULL;
+ }
+
+ for(unsigned int i = 0 ; i < mpath.size() ; i ++) {
+ if(mpath.at(i)!=NULL)
+ delete mpath.at(i);
+ }
+ mpath.clear();
+
+ remoteMenuitem();
+ }
+
+ //funktionen
+ void readFromDB(unsigned dbid);
+ void writeToDB(unsigned dbid);
+ void createMenuitem(unsigned int pos,int dbid=-1);
+ void refreshMenuitem();
+ void remoteMenuitem();
+ void setNameandIcon();
+ void setIcon(HICON hicon,HANDLE handle);
+ BOOL checkpath(PROCESSENTRY32* processInfo);
+ BOOL start_game(char*ip=NULL,unsigned int port=0,char*pw=NULL);
+ BOOL haveExtraGameArgs();
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_gamelist.cpp b/protocols/Xfire/src/Xfire_gamelist.cpp new file mode 100644 index 0000000000..3496a2e3f1 --- /dev/null +++ b/protocols/Xfire/src/Xfire_gamelist.cpp @@ -0,0 +1,312 @@ +#include "stdafx.h"
+
+#include "Xfire_gamelist.h"
+
+//liefert bestimmtes game zurück
+Xfire_game* Xfire_gamelist::getGame(unsigned int dbid)
+{
+ if(dbid<gamelist.size())
+ {
+ return gamelist.at(dbid);
+ }
+ return NULL;
+}
+
+//liefert bestimmtes game zurück
+Xfire_game* Xfire_gamelist::getGamebyGameid(unsigned int gameid)
+{
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++) {
+ Xfire_game* game=(Xfire_game*)gamelist.at(i);
+ if(game->id==gameid)
+ return game;
+ }
+ return NULL;
+}
+
+void Xfire_gamelist::readGamelist(int anz) {
+ //spiele einzeln einlesen
+ for(int i=0;i<anz;i++)
+ {
+ //erzeuge gameobject
+ Xfire_game* game=new Xfire_game();
+
+ if(game) {
+ //lese das spiel ein
+ game->readFromDB(i);
+ //icons laden
+ Xfire_icon_cache icon=this->iconmngr.getGameIconEntry(game->id);
+ game->setIcon(icon.hicon,icon.handle);
+ //in die liste einfügen
+ gamelist.push_back(game);
+ }
+ }
+}
+
+//setzt den ingamestatus
+void Xfire_gamelist::SetGameStatus(BOOL status)
+{
+ ingame=status;
+}
+
+Xfire_gamelist::Xfire_gamelist()
+{
+ nextgameid=0;
+ ingame=FALSE;
+ InitializeCriticalSection(&gamlistMutex);
+}
+
+//dekonstruktor
+Xfire_gamelist::~Xfire_gamelist() {
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++) {
+ Xfire_game* game=(Xfire_game*)gamelist.at(i);
+ if(game) delete game;
+ }
+ gamelist.clear();
+ DeleteCriticalSection(&gamlistMutex);
+}
+
+//hole das nächste game
+BOOL Xfire_gamelist::getnextGame(Xfire_game**currentgame)
+{
+ //kein pointer dann false zurückliefern
+ if(currentgame==NULL)
+ return FALSE;
+
+ //is die derzeitige id kleiner wie die anzahl an games, dann passendes game zurückliefern
+ if(nextgameid<gamelist.size())
+ {
+ *currentgame=gamelist.at(nextgameid);
+ nextgameid++;
+
+ //muss das spiel geskippt werden, dann nochmal funktion aufrufen um das nächste game zubekommen
+ if((*currentgame)->skip||(*currentgame)->id==32||(*currentgame)->id==33||(*currentgame)->id==34||(*currentgame)->id==35)
+ {
+ return getnextGame(currentgame);
+ }
+
+ return TRUE;
+ }
+ else
+ {
+ //liste durchgearbeitet, nextid wieder auf 0 setzen
+ nextgameid=0;
+ return FALSE;
+ }
+}
+
+void Xfire_gamelist::Block(BOOL block)
+{
+ if(block)
+ EnterCriticalSection(&gamlistMutex);
+ else
+ LeaveCriticalSection(&gamlistMutex);
+}
+
+//fügt simple ein gameobject in den vector ein
+void Xfire_gamelist::Addgame(Xfire_game* newgame)
+{
+ //spielicon auslesen
+ Xfire_icon_cache icon=this->iconmngr.getGameIconEntry(newgame->id);
+ newgame->setIcon(icon.hicon,icon.handle);
+
+ gamelist.push_back(newgame);
+}
+
+//entfernt ein game aus der liste
+BOOL Xfire_gamelist::Removegame(int id)
+{
+ std::vector<Xfire_game *>::iterator i = gamelist.begin();
+ while( i != gamelist.end() ) {
+ if((*i)->id == id) {
+ (*i)->remoteMenuitem();
+ gamelist.erase(i);
+ return TRUE;
+ }
+ ++i;
+ }
+ return FALSE;
+}
+
+//setzt die aktuelle id als currentgame
+int Xfire_gamelist::CurrentGame()
+{
+ this->SetGameStatus(TRUE);
+ return nextgameid-1;
+}
+
+//erzeugt das menu der gameliste
+void Xfire_gamelist::createStartmenu()
+{
+ //keine games in der internen liste? abbruch
+ if(gamelist.size()==0)
+ return;
+
+ //sortierarray
+ int* sorttemp=new int[gamelist.size()];
+
+ //zuordnungen setzen
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++)
+ sorttemp[i]=i;
+
+ //sortiert mit bubblesortalgo
+ BOOL changed=FALSE;
+ do
+ {
+ changed=FALSE;
+ for(unsigned int i = 1 ; i < gamelist.size() ; i ++)
+ {
+ Xfire_game* game=(Xfire_game*)gamelist.at(sorttemp[i-1]);
+ Xfire_game* game2=(Xfire_game*)gamelist.at(sorttemp[i]);
+ //sortieren
+ if(strcmp(game->name,game2->name)>0)
+ {
+ int tempi=sorttemp[i-1];
+ sorttemp[i-1]=sorttemp[i];
+ sorttemp[i]=tempi;
+ changed=TRUE;
+ }
+ }
+ }
+ while(changed);
+
+ //menüpunkte anlegen
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++) {
+ Xfire_game* game=(Xfire_game*)gamelist.at(sorttemp[i]);
+ game->createMenuitem(i,sorttemp[i]);
+ }
+
+ //entferne sortarray
+ delete[] sorttemp;
+
+ //dummymenu entfernen
+ removeDummyMenuItem();
+}
+
+//schreibt derzeitige gameliste in die db
+void Xfire_gamelist::writeDatabase()
+{
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++) {
+ Xfire_game* game=(Xfire_game*)gamelist.at(i);
+ if(game) game->writeToDB(i);
+ }
+
+ //anzahl aktualisieren
+ DBWriteContactSettingWord(NULL, protocolname, "foundgames", gamelist.size());
+}
+
+//prüft ob ein game schon in der liste is
+BOOL Xfire_gamelist::Gameinlist(int id,int*dbid)
+{
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++) {
+ Xfire_game* game=(Xfire_game*)gamelist.at(i);
+ if(game)
+ {
+ if(game->id==id)
+ {
+ //soll eine dbid zurückgeliefert werden? dann setzen
+ if(dbid)
+ *dbid=i;
+
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+//gibt die anzahl der spiele zurück
+int Xfire_gamelist::countGames()
+{
+ return gamelist.size();
+}
+
+//leert das startmenu
+void Xfire_gamelist::clearStartmenu()
+{
+ //erstelle dummyeintrag, für workaround
+ createDummyMenuItem();
+
+ //einzelene menüpunkte entfernen
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++) {
+ Xfire_game* game=(Xfire_game*)gamelist.at(i);
+ if(game) game->remoteMenuitem();
+ }
+}
+
+//dekonstruktor
+void Xfire_gamelist::clearGamelist() {
+ createDummyMenuItem();
+ for(unsigned int i = 0 ; i < gamelist.size() ; i ++) {
+ Xfire_game* game=(Xfire_game*)gamelist.at(i);
+ if(game) delete game;
+ }
+ gamelist.clear();
+}
+
+//erstellt ein dummyeintrag
+void Xfire_gamelist::createDummyMenuItem()
+{
+ CLISTMENUITEM midummy = { 0 };
+ midummy.cbSize = sizeof( midummy );
+ midummy.position = 500090001;
+ midummy.pszName = Translate("Please wait ...");
+ //midummy.flags = CMIF_GRAYED; geht nicht bei 0.8.1
+ midummy.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ midummy.popupPosition = 500084000;
+ midummy.pszPopupName = Translate("Start game");
+ midummy.pszContactOwner=protocolname;
+ dummymenuitem=Menu_AddMainMenuItem(&midummy);
+}
+
+//entfernt dummymenueintrag
+void Xfire_gamelist::removeDummyMenuItem()
+{
+ CallService( MS_CLIST_REMOVEMAINMENUITEM, ( WPARAM )dummymenuitem, 0 );
+}
+
+//säubert die datenbank spiel einträge udn trägt custom spiele vorher nach
+void Xfire_gamelist::clearDatabase(BOOL dontaddcustom)
+{
+ BOOL somethingfound=TRUE;
+ int i3=0;
+
+ //db durchsuchen
+ while(somethingfound) {
+ somethingfound=FALSE;
+ //customeintrag? dann ab in die gameliste damit
+ if(this->readBytefromDB("gamecustom",i3)==1)
+ {
+ //customgame nur in die liste adden wenn es gewollt is
+ if(!dontaddcustom)
+ {
+ //erzeuge gameobject
+ Xfire_game* game=new Xfire_game();
+ //lese das spiel ein
+ game->readFromDB(i3);
+ //spielicon auslesen
+ /*Xfire_icon_cache icon=this->iconmngr.getGameIconEntry(game->id);
+ game->setIcon(icon.hicon,icon.handle);
+ //in die liste einfügen
+ gamelist.push_back(game);*/
+ this->Addgame(game);
+ }
+ }
+
+ if(this->removeDBEntry("gamecustom",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gameid",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamepath",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamepwargs",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gameuserargs",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamecmdline",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamencmdline",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamelaunch",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamenetargs",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamemulti",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamesendid",i3)) somethingfound=TRUE;
+ if(this->removeDBEntry("gamesetsmsg",i3)) somethingfound=TRUE;
+
+ for(int i2=0;i2<10;i2++)
+ if(this->removeDBEntry("gamepath",i3,i2)) somethingfound=TRUE;
+ i3++;
+ }
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_gamelist.h b/protocols/Xfire/src/Xfire_gamelist.h new file mode 100644 index 0000000000..0f6c341a45 --- /dev/null +++ b/protocols/Xfire/src/Xfire_gamelist.h @@ -0,0 +1,75 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+/*
+ Klasse soll die Gameliste verwalten. Dazu gehört das dynamische Einfügen/Löschen/Verändern von Games.
+ Erstellen/Sortieren der Menüpunkte ...
+*/
+
+#ifndef _XFIRE_GAMELIST
+#define _XFIRE_GAMELIST
+
+#include "Xfire_game.h"
+#include "Xfire_icon_mng.h"
+#include <vector>
+
+using namespace std;
+
+class Xfire_gamelist : public Xfire_base {
+private:
+ vector<Xfire_game*> gamelist;
+ HANDLE dummymenuitem;
+ unsigned int nextgameid;
+ BOOL ingame;
+ CRITICAL_SECTION gamlistMutex;
+
+ void removeDummyMenuItem();
+ void createDummyMenuItem();
+public:
+ Xfire_icon_mng iconmngr;
+
+ void readGamelist(int anz);
+ void clearGamelist();
+ void createStartmenu();
+ void clearStartmenu();
+ void clearDatabase(BOOL dontaddcustom=FALSE);
+ void writeDatabase();
+ BOOL Gameinlist(int id,int*dbid=NULL);
+ void Addgame(Xfire_game* newgame);
+ BOOL Xfire_gamelist::Removegame(int id);
+ int countGames();
+ ~Xfire_gamelist();
+ Xfire_gamelist();
+ BOOL getnextGame(Xfire_game**currentgame);
+ BOOL Ingame(){return ingame;}
+ void SetGameStatus(BOOL ingame);
+ int CurrentGame();
+ Xfire_game* getGame(unsigned int dbid);
+ Xfire_game* getGamebyGameid(unsigned int gameid);
+ void Block(BOOL block);
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_icon_mng.cpp b/protocols/Xfire/src/Xfire_icon_mng.cpp new file mode 100644 index 0000000000..f5612e8e56 --- /dev/null +++ b/protocols/Xfire/src/Xfire_icon_mng.cpp @@ -0,0 +1,216 @@ +#include "stdafx.h"
+#include "Xfire_icon_mng.h"
+
+//liefert den handle eines icons zurück
+HANDLE Xfire_icon_mng::getGameIconHandle(unsigned int gameid) {
+ Xfire_icon_cache entry={0};
+
+ //icon im cache dann zurückliefern
+ if(getIconfromCache(gameid,&entry))
+ return entry.handle;
+
+ //ansonsten gameicon laden
+ return this->LoadGameIcon(gameid).handle;
+}
+
+//liefert den index des icons zurück
+unsigned int Xfire_icon_mng::getGameIconId(unsigned int gameid) {
+ for(unsigned int i=0;i<iconcache.size();i++)
+ {
+ if(iconcache.at(i).gameid==gameid)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+//gameicon mit hilfe von id zurückliefern
+HICON Xfire_icon_mng::getGameIconFromId(unsigned int id) {
+ //id nur im bereich zurückliefern
+ if(id<0 || id>iconcache.size()-1)
+ return NULL;
+
+ return iconcache.at(id).hicon;
+}
+
+//liefert das hicon zurück
+HICON Xfire_icon_mng::getGameIcon(unsigned int gameid) {
+ Xfire_icon_cache entry={0};
+
+ //icon im cache dann zurückliefern
+ if(getIconfromCache(gameid,&entry))
+ return entry.hicon;
+
+ return this->LoadGameIcon(gameid).hicon;
+}
+
+//liefert den icon eintrag zurück
+Xfire_icon_cache Xfire_icon_mng::getGameIconEntry(unsigned int gameid) {
+ Xfire_icon_cache entry={0};
+
+ //icon im cache dann zurückliefern
+ if(getIconfromCache(gameid,&entry))
+ return entry;
+
+ return this->LoadGameIcon(gameid);
+}
+
+//sucht nach dem spielicon im cache
+BOOL Xfire_icon_mng::getIconfromCache(unsigned int gameid,Xfire_icon_cache* out) {
+ //kein ziel, keine prüfung
+ if(out==NULL)
+ return FALSE;
+
+ for(unsigned int i=0;i<iconcache.size();i++)
+ {
+ if(iconcache.at(i).gameid==gameid)
+ {
+ *out=iconcache.at(i);
+ return TRUE;
+ }
+ }
+
+ //nicht gefunden
+ return FALSE;
+}
+
+//dekonstruktor
+Xfire_icon_mng::~Xfire_icon_mng() {
+ //geladene icons wieder freigeben
+ for(unsigned int i=0;i<iconcache.size();i++)
+ {
+ if(iconcache.at(i).hicon)
+ {
+ DestroyIcon(iconcache.at(i).hicon);
+ iconcache.at(i).hicon=NULL;
+ }
+ }
+ iconcache.clear();
+
+ //Icons.dll wieder freigeben
+ if(hIconDll) {
+ FreeLibrary(hIconDll);
+ hIconDll=NULL;
+ }
+}
+
+//konstruktor
+Xfire_icon_mng::Xfire_icon_mng() {
+ hIconDll=NULL;
+}
+
+//erzeugt aus HICON ein Handle, welches in Miranda in der Clist angewendet werden kann
+HANDLE Xfire_icon_mng::createIconHandle(HICON hicon) {
+ if(!hicon)
+ return NULL;
+
+ return (HANDLE)CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)hicon, 0);
+}
+
+//eigentliche laderoutine
+Xfire_icon_cache Xfire_icon_mng::LoadGameIcon(unsigned int gameid) {
+ Xfire_icon_cache entry={0};
+
+ //shortname
+ char shortname[255]="";
+
+ if(!getIniValue(gameid,"ShortName",shortname))
+ return entry;
+
+ //spielid zuweisen
+ entry.gameid=gameid;
+
+ //Icons.dll noch nicht geladen?!?
+ if(!hIconDll)
+ {
+ //versuch die Icons.dll zuladen
+ char path[MAX_PATH]="";
+ if(!getIconPath(path))
+ return entry;
+ strcat_s(path,MAX_PATH,IconsdllName);
+
+ hIconDll = LoadLibrary(path);
+ }
+
+ //dll konnte geladen werden
+ if(hIconDll) {
+ char resourcename[255]="";
+ //kurznamen des spiels uppercasen und .ICO anhängen
+ sprintf_s(resourcename,255,"XF_%s.ICO",shortname);
+ Xfire_base::strtoupper(resourcename);
+
+ //versuche die resource zufinden
+ HRSRC hrsrc = FindResource(hIconDll,resourcename,"ICONS");
+ if(hrsrc) {
+ //aus der resource ein HICON erstellen
+ int size=SizeofResource(hIconDll,hrsrc);
+ //iconresource laden
+ HGLOBAL hglobal=LoadResource(hIconDll,hrsrc);
+ if(hglobal) {
+ //lock
+ LPVOID data=LockResource(hglobal);
+ if(data) {
+ //erzeuge ein handle für das icon und ab in den cache damit
+ entry.hicon=this->createHICONfromdata(data,size);
+ UnlockResource(hglobal);
+ }
+ FreeResource(hglobal);
+ }
+ }
+ }
+
+ //kein icon in der dll, dann aus dem internet laden
+ if(!entry.hicon)
+ entry.hicon=downloadIcon(shortname);
+
+ //wenn ein hicon erzeugt wurde, dann handle erstellen und in den cache laden
+ if(entry.hicon)
+ entry.handle=this->createIconHandle(entry.hicon);
+
+ //eintrag in den cache, selbst wenn kein icon geladen werden konnte
+ this->iconcache.push_back(entry);
+
+ return entry;
+}
+
+//icon vom xfire server laden
+HICON Xfire_icon_mng::downloadIcon(char* shortname) {
+ //nur vom internetladen, wenn die option aktiv ist
+ if(!DBGetContactSettingByte(NULL,protocolname,"xfiresitegameico",0))
+ return NULL;
+
+ //keinen namen angegeben?
+ if(!shortname)
+ return NULL;
+
+ //buffer
+ char*buf=NULL;
+ unsigned int size=0;
+
+ char url[255]="http://media.xfire.com/xfire/xf/images/icons/";
+ strcat_s(url,255,shortname);
+ strcat_s(url,255,".gif");
+
+ //verscuhe das icon aus dem inet zulasen
+ if(GetWWWContent2(url,NULL,FALSE,&buf,&size))
+ {
+ //aus dem buffer ein hicon erzeugen
+ HICON hicon=this->createHICONfromdata(buf,size);
+ //speicher freigeben
+ delete[] buf;
+
+ return hicon;
+ }
+
+ return NULL;
+}
+
+//setzt alle handles der icons neu
+int Xfire_icon_mng::resetIconHandles() {
+ for(unsigned int i=0;i<iconcache.size();i++)
+ {
+ iconcache.at(i).handle=this->createIconHandle(iconcache.at(i).hicon);
+ }
+ return 0;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_icon_mng.h b/protocols/Xfire/src/Xfire_icon_mng.h new file mode 100644 index 0000000000..895d18ba91 --- /dev/null +++ b/protocols/Xfire/src/Xfire_icon_mng.h @@ -0,0 +1,70 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2009 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+//Klasse behandelt alle Iconsachen unter Xfire
+
+#ifndef _XFIRE_ICON_MNG
+#define _XFIRE_ICON_MNG
+
+#include "Xfire_base.h"
+#include <vector>
+
+const char IconsdllName[]="Icons.dll";
+
+#pragma comment(lib,"ole32.lib")
+
+using namespace std;
+
+//eintrag eines icons
+struct Xfire_icon_cache {
+ unsigned int gameid;
+ HANDLE handle;
+ HICON hicon;
+};
+
+//icon loader, cache manager
+class Xfire_icon_mng : public Xfire_base {
+private:
+ vector<Xfire_icon_cache> iconcache;
+ BOOL getIconfromCache(unsigned int gameid,Xfire_icon_cache* out);
+ Xfire_icon_cache LoadGameIcon(unsigned int gameid);
+ HANDLE createIconHandle(HICON hicon);
+ HICON downloadIcon(char* shortname);
+
+ HINSTANCE hIconDll;
+public:
+ HANDLE getGameIconHandle(unsigned int gameid);
+ HICON getGameIcon(unsigned int gameid);
+ unsigned int getGameIconId(unsigned int gameid);
+ HICON getGameIconFromId(unsigned int gameid);
+ Xfire_icon_cache getGameIconEntry(unsigned int gameid);
+ int resetIconHandles();
+
+ Xfire_icon_mng();
+ ~Xfire_icon_mng();
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_proxy.cpp b/protocols/Xfire/src/Xfire_proxy.cpp new file mode 100644 index 0000000000..641c481097 --- /dev/null +++ b/protocols/Xfire/src/Xfire_proxy.cpp @@ -0,0 +1,96 @@ +#include "stdafx.h"
+
+#include "Xfire_proxy.h"
+
+extern HANDLE hNetlib;
+HANDLE hBindPort=NULL;
+HANDLE netlibcon=NULL;
+
+
+void FromServerToClient(LPVOID lParam) {
+ char buf[1024]={0};
+
+ HANDLE hConnection=(HANDLE)lParam;
+ do {
+ if(!hBindPort) return;
+
+ int cbRead = Netlib_Recv(netlibcon, buf, sizeof(buf), 0);
+ if( cbRead == SOCKET_ERROR)
+ break;
+
+ if(cbRead) {
+ Netlib_Send(hConnection, buf, cbRead, 0);
+ }
+ }
+ while(1);
+}
+
+//xfireclient baut verbindung auf
+void XfireclientConnecting(HANDLE hConnection, DWORD, void* extra )
+{
+ char buf[1024]={0};
+
+ //verbindung zum richtigen xfire server aufbauen
+ NETLIBOPENCONNECTION ncon = { 0 };
+ ncon.cbSize = sizeof(ncon);
+ ncon.szHost = "206.220.42.147";
+ ncon.wPort = (WORD)atol("25999");
+ ncon.timeout=5;
+ netlibcon = (HANDLE) CallService(MS_NETLIB_OPENCONNECTION, (WPARAM) hNetlib, (LPARAM) & ncon);
+
+ if(!netlibcon) {
+ Netlib_CloseHandle(hConnection);
+ }
+
+ mir_forkthread(FromServerToClient,(LPVOID)hConnection);
+
+ //schleife behandelt empfangende daten
+ do {
+ int cbRead = Netlib_Recv(hConnection, buf, sizeof(buf), 0);
+ if( cbRead == SOCKET_ERROR)
+ {
+ Netlib_CloseHandle(hConnection);
+ Netlib_CloseHandle(netlibcon);
+ break;
+ }
+
+ if(cbRead) {
+ if(!Netlib_Send(netlibcon, buf, cbRead, 0))
+ {
+ Netlib_CloseHandle(hConnection);
+ Netlib_CloseHandle(netlibcon);
+ break;
+ }
+ }
+ }
+ while(1);
+}
+
+//inits nachdem alle module geladen wurden
+int AfterSystemModulesLoaded(WPARAM wParam,LPARAM lParam)
+{
+ //init netlib handle
+ NETLIBUSER nlu = {0};
+ nlu.cbSize = sizeof(nlu);
+ nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_INCOMING;
+ nlu.szSettingsModule = protocolname;
+ nlu.szDescriptiveName = "XFire server connection";
+ hNetlib = (HANDLE) CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM) & nlu);
+
+ //init socet server
+ NETLIBBIND nb = {0};
+ nb.cbSize = NETLIBBIND_SIZEOF_V2;
+ nb.pfnNewConnectionV2 = XfireclientConnecting;
+ nb.pExtra = NULL;
+ nb.wPort = 25999;
+ hBindPort = (HANDLE)CallService( MS_NETLIB_BINDPORT, (WPARAM)hNetlib,(LPARAM) &nb);
+
+
+ return 0;
+}
+
+int initXfireProxy() {
+ //inits nach dem alle module geladen wurden
+ HookEvent(ME_SYSTEM_MODULESLOADED, AfterSystemModulesLoaded);
+ return 0;
+}
diff --git a/protocols/Xfire/src/Xfire_proxy.h b/protocols/Xfire/src/Xfire_proxy.h new file mode 100644 index 0000000000..3623d969dc --- /dev/null +++ b/protocols/Xfire/src/Xfire_proxy.h @@ -0,0 +1,8 @@ +#ifndef _XFIRE_PROXY
+#define _XFIRE_PROXY
+
+#include "baseProtocol.h"
+
+int initXfireProxy();
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_voicechat.cpp b/protocols/Xfire/src/Xfire_voicechat.cpp new file mode 100644 index 0000000000..ccca22b1a8 --- /dev/null +++ b/protocols/Xfire/src/Xfire_voicechat.cpp @@ -0,0 +1,380 @@ +#include "stdafx.h"
+#include "Xfire_voicechat.h"
+
+//konstruktor
+Xfire_voicechat::Xfire_voicechat() {
+ this->resetCurrentvoicestatus();
+ ipport=NULL;
+ tsrDLL=NULL;
+ IpHlpApiDLL=NULL;
+ tsrGetServerInfo=NULL;
+ GetExtendedTcpTable=NULL;
+ pid=0;
+}
+
+//dekonstruktor
+Xfire_voicechat::~Xfire_voicechat() {
+ //geladene tsr remote dll freigeben
+ if(tsrDLL) {
+ FreeLibrary(tsrDLL);
+ tsrDLL=NULL;
+ }
+ //geladene iphlper freigeben
+ if(IpHlpApiDLL) {
+ FreeLibrary(IpHlpApiDLL);
+ IpHlpApiDLL=NULL;
+ }
+}
+
+//init
+void Xfire_voicechat::initVoicechat() {
+ //tsremotedll laden
+ tsrDLL=this->loadTSR();
+ //weitere dll's laden
+ IpHlpApiDLL=LoadLibraryA("IpHlpApi.dll");
+ if(IpHlpApiDLL) {
+ GetExtendedTcpTable=(pGetExtendedTcpTable)GetProcAddress(IpHlpApiDLL,"GetExtendedTcpTable");
+ }
+ else
+ {
+ XFireLog("IpHlpApi.dll load failed!");
+ }
+}
+
+//prüft ob das paket schonmal versendet wurde, soll unnötigen nwtraffic reduzieren, *ÜBERLEGUNG* ob wirklich notwendig
+BOOL Xfire_voicechat::alreadySend(SendGameStatus2Packet* packet) {
+ if(packet==NULL)
+ return FALSE;
+
+ if(packet->ip[3] != lastpacket.ip[3] ||
+ packet->ip[2] != lastpacket.ip[2] ||
+ packet->ip[1] != lastpacket.ip[1] ||
+ packet->ip[0] != lastpacket.ip[0] ||
+ packet->port != lastpacket.port) {
+ lastpacket=*packet;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+//prüft nach laufenden voicechat anwendungen
+BOOL Xfire_voicechat::checkVoicechat(SendGameStatus2Packet* packet) {
+ //kein gültiger verweis?
+ if(packet==NULL)
+ return FALSE;
+ //jeh nach letzten status handeln
+ switch(currentvoice) {
+ case XFIREVOICECHAT_TS2:
+ if(checkforTS2(packet)) {
+ return alreadySend(packet);
+ }
+ else
+ {
+ //kein ts2 mehr? dann paket restten
+ resetSendGameStatus2Packet(packet);
+ resetCurrentvoicestatus();
+ //in db schreiben
+ writeToDatabase(packet);
+ return TRUE;
+ }
+ break;
+ case XFIREVOICECHAT_TS3:
+ if(checkforTS3(packet)) {
+ return alreadySend(packet);
+ }
+ else
+ {
+ //kein ts3 mehr? dann paket restten
+ resetSendGameStatus2Packet(packet);
+ resetCurrentvoicestatus();
+ //in db schreiben
+ writeToDatabase(packet);
+ return TRUE;
+ }
+ break;
+ case XFIREVOICECHAT_MUMBLE:
+ if(checkforMumble(packet)) {
+ return alreadySend(packet);
+ }
+ else
+ {
+ //kein mumble mehr? dann paket restten
+ resetSendGameStatus2Packet(packet);
+ resetCurrentvoicestatus();
+ //in db schreiben
+ writeToDatabase(packet);
+ return TRUE;
+ }
+ break;
+ default:
+ //prüfe nach ts3
+ if(checkforTS3(packet)) {
+ return alreadySend(packet);
+ }
+ //prüfe nach ts2
+ else if(checkforTS2(packet)) {
+ return alreadySend(packet);
+ }
+ //prüfe nach mumble
+ else if(checkforMumble(packet)) {
+ return alreadySend(packet);
+ }
+ break;
+ };
+
+ return FALSE;
+}
+
+//setzte currentvoice auf 0 zurück, falls es einen disconnect gab
+void Xfire_voicechat::resetCurrentvoicestatus() {
+ currentvoice=XFIREVOICECHAT_NOVOICE;
+ lastpacket.ip[3]=0;
+ lastpacket.ip[2]=0;
+ lastpacket.ip[1]=0;
+ lastpacket.ip[0]=0;
+ lastpacket.port=0;
+ pid=0;
+}
+
+//resettet das packet auf 0
+void Xfire_voicechat::resetSendGameStatus2Packet(SendGameStatus2Packet* packet) {
+ if(packet==NULL)
+ return;
+ //voiceid
+ packet->gameid=XFIREVOICECHAT_NOVOICE;
+ //ip zuweisen
+ packet->ip[3]=0;
+ packet->ip[2]=0;
+ packet->ip[1]=0;
+ packet->ip[0]=0;
+ //port zuweisen
+ packet->port=0;
+}
+
+//schreibt derzetigen status in die mirandadb für variables usw
+void Xfire_voicechat::writeToDatabase(SendGameStatus2Packet* packet) {
+ //für sprintf
+ char temp[32]="";
+
+ if(packet==NULL || packet->gameid==XFIREVOICECHAT_NOVOICE) {
+ //einträge aus der db entfernen
+ DBDeleteContactSetting(NULL,protocolname, "VServerIP");
+ DBDeleteContactSetting(NULL,protocolname, "currentvoicename");
+ //zurück
+ return;
+ }
+ //ip speichern
+ sprintf_s(temp,32,"%d.%d.%d.%d:%d",(unsigned char)packet->ip[3],(unsigned char)packet->ip[2],(unsigned char)packet->ip[1],(unsigned char)packet->ip[0],packet->port);
+ DBWriteContactSettingTString(NULL, protocolname, "VServerIP", temp);
+ //namen jeh nach id schreiben
+ switch(packet->gameid) {
+ case XFIREVOICECHAT_TS3:
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Teamspeak 3");
+ break;
+ case XFIREVOICECHAT_TS2:
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Teamspeak 2");
+ break;
+ case XFIREVOICECHAT_MUMBLE:
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Mumble");
+ break;
+ case XFIREVOICECHAT_VENTRILO:
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Ventrilo");
+ break;
+ };
+}
+
+//versucht die TSR zuladen
+HMODULE Xfire_voicechat::loadTSR(char* path,BOOL nolocaltest) {
+ char pathtotsr[MAX_PATH]="";
+
+ /*if(path)
+ ; was tun*/
+ strcat_s(pathtotsr,MAX_PATH,"TSRemote.dll");
+
+ //versuche dll zuladen
+ HMODULE tsrDLL = LoadLibrary(pathtotsr);
+ //konnte nicht geladen werden
+ if(!tsrDLL)
+ {
+ XFireLog("TSRemote.dll load failed!");
+
+ //bei keinem lokalen test abbruch
+ if(nolocaltest) return NULL;
+
+ //nochmal engl. lokal versuchen
+ tsrDLL = LoadLibrary("C:\\Program Files\\Teamspeak2_RC2\\client_sdk\\TSRemote.dll");
+
+ if(!tsrDLL) {
+ XFireLog("TSRemote.dll load faild (using standard installationpath)!");
+
+ //deutsches sys?
+ tsrDLL = LoadLibrary("C:\\Programme\\Teamspeak2_RC2\\client_sdk\\TSRemote.dll");
+
+ if(!tsrDLL)
+ XFireLog("TSRemote.dll load failed (using standard installationpath2)!");
+
+ //aufgeben
+ return NULL;
+ }
+ }
+
+ XFireLog("TSRemote.dll successfully loaded!");
+
+ //getserverinfo funktion holen
+ tsrGetServerInfo = (LPtsrGetServerInfo)GetProcAddress(tsrDLL,"tsrGetServerInfo");
+
+ return tsrDLL;
+}
+
+
+//teamspeak 3 detection, benötigt ts3plugin
+BOOL Xfire_voicechat::checkforTS3(SendGameStatus2Packet* packet) {
+ ts3IPPORT* ipport=NULL;
+ //kein gültiger verweis?
+ if(packet==NULL)
+ return FALSE;
+ //existiert ein filemap?
+ HANDLE hMapObject = OpenFileMappingA(FILE_MAP_READ, FALSE, "$ts3info4xfire$");
+ //nicht gefunden, dann kein ts3
+ if (hMapObject == NULL)
+ return FALSE;
+ //versuch ipport zubesorgen
+ ipport = (ts3IPPORT *) MapViewOfFile(hMapObject, FILE_MAP_READ, 0, 0, sizeof(ts3IPPORT));
+ //fehler beim zugriff auf filemap?
+ if(ipport==NULL)
+ {
+ CloseHandle(hMapObject);
+ return FALSE;
+ }
+
+ //wenn kein port, dann stimmt was mit der ip nicht, paket resetten
+ if(ipport->port==0) {
+ //packet resetten
+ resetSendGameStatus2Packet(packet);
+ //in db schreiben
+ writeToDatabase(packet);
+ return TRUE;
+ }
+
+ //voiceid zuweisen
+ this->currentvoice=XFIREVOICECHAT_TS3;
+ packet->gameid=XFIREVOICECHAT_TS3;
+ //ip zuweisen
+ packet->ip[3]=ipport->ip[3];
+ packet->ip[2]=ipport->ip[2];
+ packet->ip[1]=ipport->ip[1];
+ packet->ip[0]=ipport->ip[0];
+ //port zuweisen
+ packet->port=ipport->port;
+ //unmap, handle schließem
+ UnmapViewOfFile(ipport);
+ CloseHandle(hMapObject);
+ //in db schreiben
+ writeToDatabase(packet);
+ //ts3 gefunden
+ return TRUE;
+}
+
+//teamspeak 2 detection mit hilfe der tsr
+BOOL Xfire_voicechat::checkforTS2(SendGameStatus2Packet* packet) {
+ TtsrServerInfo serverinfo={0};
+
+ //get funktion ist nicht initialisiert
+ if(this->tsrGetServerInfo==NULL || packet==NULL)
+ {
+ return FALSE;
+ }
+
+ //infos holen
+ this->tsrGetServerInfo(&serverinfo);
+
+ //auswerten wenn serverip gesetzt
+ if(serverinfo.ServerIp[0]!=0)
+ {
+ char * pos=strrchr(serverinfo.ServerIp,':');
+ if(pos==0)
+ {
+ return FALSE;
+ }
+
+ *pos=0;
+ unsigned int ip=inet_addr(serverinfo.ServerIp);
+ pos++;
+ int port=atoi(pos);
+
+ //port zuweisen
+ packet->port=port;
+ //ip zuweisen
+ packet->ip[3]=LOBYTE(LOWORD(ip));
+ packet->ip[2]=HIBYTE(LOWORD(ip));
+ packet->ip[1]=LOBYTE(HIWORD(ip));
+ packet->ip[0]=HIBYTE(HIWORD(ip));
+ //gameid/voice zuweisen
+ packet->gameid=XFIREVOICECHAT_TS2;
+ this->currentvoice=XFIREVOICECHAT_TS2;
+ //ab in die db
+ writeToDatabase(packet);
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+//detection für mumble
+BOOL Xfire_voicechat::checkforMumble(SendGameStatus2Packet* packet) {
+ //kein gültiger verweis?
+ if(packet==NULL)
+ return FALSE;
+
+ //gültige pid
+ if(this->pid!=0 && !this->isValidPid(this->pid))
+ {
+ this->pid=0;
+ return FALSE;
+ }
+ else {
+ if(!this->getPidByProcessName("mumble.exe",&this->pid)) {
+ return FALSE;
+ }
+ }
+
+ DWORD size=0;
+ MIB_TCPTABLE_OWNER_PID* ptab=NULL;
+ //tcptabelle holen
+ this->GetExtendedTcpTable(NULL,&size,FALSE, AF_INET, TCP_TABLE_OWNER_PID_CONNECTIONS, 0);
+ //überhaupt was drin?
+ if(size) {
+ ptab=(MIB_TCPTABLE_OWNER_PID*)malloc(size);
+ //liste auslesen
+ if(GetExtendedTcpTable(ptab,&size,FALSE, AF_INET, TCP_TABLE_OWNER_PID_CONNECTIONS, 0)==NO_ERROR)
+ {
+ for(unsigned int i=0;i<ptab->dwNumEntries;i++)
+ {
+ if(ptab->table[i].dwOwningPid==this->pid && ptab->table[i].dwLocalAddr!=ptab->table[i].dwRemoteAddr) //verbindung gefunden, hoffentlich
+ {
+ unsigned char*rip=(unsigned char*)&ptab->table[i].dwRemoteAddr;
+ XFireLog("IP %x,%x",ptab->table[i].dwRemoteAddr,ptab->table[i].dwRemotePort);
+ //ipzuweisen
+ packet->ip[3]=rip[0];
+ packet->ip[2]=rip[1];
+ packet->ip[1]=rip[2];
+ packet->ip[0]=rip[3];
+ //portzuweisen
+ packet->port=r(ptab->table[i].dwRemotePort);
+ //mumble
+ packet->gameid=XFIREVOICECHAT_MUMBLE;
+ this->currentvoice=XFIREVOICECHAT_MUMBLE;
+ //table wieder freigeben
+ delete ptab;
+ //mumble läuft + ip gefunden also TRUE
+ return TRUE;
+ }
+ }
+ }
+ delete ptab;
+ }
+
+ return FALSE;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/Xfire_voicechat.h b/protocols/Xfire/src/Xfire_voicechat.h new file mode 100644 index 0000000000..1b70f3f456 --- /dev/null +++ b/protocols/Xfire/src/Xfire_voicechat.h @@ -0,0 +1,114 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2009 by
+ * dufte <dufte@justmail.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+//Klasse behandelt alle Iconsachen unter Xfire
+
+#include "stdafx.h"
+
+#ifndef _XFIRE_VOICECHAT
+#define _XFIRE_VOICECHAT
+
+#include "client.h"
+#include "sendgamestatus2packet.h"
+#include "Xfire_base.h"
+
+#include <vector>
+
+/* tsr definitionen für teamspeak 2 */
+struct TtsrServerInfo
+{
+ char ServerName[30];
+ char WelcomeMessage[256];
+ int ServerVMajor;
+ int ServerVMinor;
+ int ServerVRelease;
+ int ServerVBuild;
+ char ServerPlatform[28]; //geändert in 28 - dufte
+ char ServerIp[30];
+ char ServerHost[102];
+ int ServerType;
+ int ServerMaxUsers;
+ int SupportedCodecs;
+ int ChannelCount;
+ int PlayerCount;
+};
+
+typedef int (__stdcall *LPtsrGetServerInfo)(TtsrServerInfo *tsrServerInfo);
+
+/* klassen definitionen */
+struct ts3IPPORT {
+ unsigned char ip[4];
+ unsigned short port;
+};
+
+enum XFIREVOICECHATTYPE {
+ XFIREVOICECHAT_NOVOICE,
+ XFIREVOICECHAT_TS3=35,
+ XFIREVOICECHAT_TS2=32,
+ XFIREVOICECHAT_MUMBLE=34,
+ XFIREVOICECHAT_VENTRILO=33,
+ XFIREVOICECHAT_IPDETECT=999
+};
+
+using namespace xfirelib;
+
+class Xfire_voicechat : public Xfire_base {
+private:
+ //interner status, des aktiven voicechats
+ XFIREVOICECHATTYPE currentvoice;
+ //ipportport structur für ts3
+ ts3IPPORT* ipport;
+ //statuspacket caching
+ SendGameStatus2Packet lastpacket;
+ //tsremotedll
+ HMODULE tsrDLL;
+ //tsrGetServerInfo funktion vom tsremotedll
+ LPtsrGetServerInfo tsrGetServerInfo;
+ //GetExtendedTcpTable für mumble
+ pGetExtendedTcpTable GetExtendedTcpTable;
+ //pid für mumble
+ DWORD pid;
+ //IpHlperApi Module
+ HMODULE IpHlpApiDLL;
+public:
+ Xfire_voicechat();
+ ~Xfire_voicechat();
+
+ void initVoicechat();
+ void resetSendGameStatus2Packet(SendGameStatus2Packet* packet);
+ void resetCurrentvoicestatus();
+ void writeToDatabase(SendGameStatus2Packet* packet);
+ HMODULE loadTSR(char* path=NULL,BOOL nolocaltest=FALSE);
+ BOOL checkVoicechat(SendGameStatus2Packet* packet);
+ BOOL alreadySend(SendGameStatus2Packet* packet);
+
+ //prüf routinen
+ BOOL checkforTS3(SendGameStatus2Packet* packet);
+ BOOL checkforTS2(SendGameStatus2Packet* packet);
+ BOOL checkforMumble(SendGameStatus2Packet* packet);
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/addgamedialog.cpp b/protocols/Xfire/src/addgamedialog.cpp new file mode 100644 index 0000000000..4d3d717b8c --- /dev/null +++ b/protocols/Xfire/src/addgamedialog.cpp @@ -0,0 +1,867 @@ +#include "stdafx.h"
+
+#include "addgamedialog.h"
+
+extern HANDLE XFireWorkingFolder;
+extern Xfire_gamelist xgamelist;
+
+char inipath[MAX_PATH];
+char* buffer=NULL;
+BOOL dontClose=FALSE;
+
+vector<lbInicache> Inicache;
+Xfire_game* editgame=NULL;
+
+HWND hwndTab,hPage;
+
+void AddGameDialog(HWND hwndDlg,Xfire_game* game) {
+ //übergebendes game, dem editgame zuordnen, damit wechselt es in den editmodus
+ editgame=game;
+ if(DialogBox(hinstance,MAKEINTRESOURCE(IDD_ADDGAMEMAIN),hwndDlg,DlgAddGameProcMain)) {
+ }
+ //wieder auf NULL setzen
+ editgame=NULL;
+}
+
+static void FillGameList( LPVOID hwndDlg ) {
+ //liste.,suche und suchlabel unsichtbar machen
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_GAMELIST),SW_HIDE);
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_SEARCH),SW_HIDE);
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_STC14),SW_HIDE);
+
+ //handle von progressbar holen
+ HWND hwndPB=GetDlgItem((HWND)hwndDlg,IDC_PROGRESS);
+
+ //das schließen des dialogs verhindern
+ dontClose=TRUE;
+
+ if(Inicache.size()==0)
+ {
+ //temp xfirebaseob für strlower
+ Xfire_base tempxfire;
+ //vector für doppelfilter
+ vector<DWORD> dublBuffer;
+ //Cache ist leer, Cache füllen
+ FoldersGetCustomPath( XFireWorkingFolder, inipath, 1024, "" );
+ strcat_s(inipath,MAX_PATH,"\\");
+ strcat_s(inipath,MAX_PATH,"xfire_games.ini");
+
+ //ini soll in den RAM geladen werden, fürs schnellere ausparsen
+ FILE* f=fopen(inipath,"rb");
+ //wenn ini nicht aufrufbar, abbrechen
+ if(f==NULL)
+ return;
+ //ans ende der datei springen
+ fseek(f,0,SEEK_END);
+ //aktuelle position im filepoitner als größe zwischenspeichern
+ int size=ftell(f);
+ //buffer anelgen
+ buffer=new char[size+1];
+ //wenn nicht genug ram, abbruch
+ if(buffer==NULL)
+ return;
+ //buffer nullen
+ memset(buffer,0,size+1);
+ //zum anfang springen
+ fseek(f,0,SEEK_SET);
+ //ini komplett in den ram lesen
+ fread(buffer,size,1,f);
+ //datei schließen
+ fclose(f);
+
+ //parse einzelne sections aus
+
+ //pointer vom buffer
+ char*p=buffer;
+ //zahlenbufer1 und pointer
+ char zahlbuffer[10]="";
+ char*z=zahlbuffer;
+ //zahlenbuffer2 uznd pointer
+ char zahlbuffer2[10]="";
+ char*z2=zahlbuffer2;
+
+ //progressbar auf bytegröße anpassen
+ SendMessage(hwndPB, PBM_SETRANGE32, 0,size);
+
+ //solange bis wir bei 0 angekommen sind
+ if(*p!=0)
+ p++;
+ while(*p!=0)
+ {
+ if(*p=='['&&*(p-1)=='\n')
+ {
+ z=zahlbuffer;
+ z2=zahlbuffer2;
+ p++;
+ while(*p>='0'&&*p<='9'&&p!=0)
+ {
+ *z=*p;
+ p++;
+ z++;
+ }
+ *z=0;
+ if(*p=='_') {
+ p++;
+ while(*p>='0'&&*p<='9'&&p!=0)
+ {
+ *z2=*p;
+ p++;
+ z2++;
+ }
+ *z2=0;
+ }
+
+ //erste zahl gefunden
+ if(z!=zahlbuffer)
+ {
+ int gameid=atoi(zahlbuffer);
+ //prüfe ob das game schon in der gameliste ist
+ if(!xgamelist.Gameinlist(gameid))
+ {
+ char*name=p;
+ lbInicache listentry;
+ char gameidtemp[10]="";
+ char ret[512];
+ DWORD uniqid=0;
+ BYTE accLaunch=0;
+ BYTE accDetect=0;
+
+ //bis zum nächsten isgleich springen
+ while(*name!='=')
+ name++;
+ name++;
+
+ //jetzt den umbruch suchen
+ p=name;
+ while(*p!='\n'&&*p!='\r') p++;
+ *p=0;
+ p++;
+
+ //spielnamen in den listentry einfügen
+ strcpy_s(listentry.name,255,name);
+
+ if(z2!=zahlbuffer2)
+ {
+ listentry.gameid=MAKELONG(gameid,atoi(zahlbuffer2));
+ sprintf_s(gameidtemp,10,"%d_%d",gameid,atoi(zahlbuffer2));
+ }
+ else
+ {
+ listentry.gameid=gameid;
+ sprintf_s(gameidtemp,10,"%d",gameid);
+ }
+
+
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherExe", "", ret, 512, inipath)) {
+ //lower launchstring
+ tempxfire.strtolower(ret);
+ //einzelnen ziechen zusammenrechnen
+ if(z2!=zahlbuffer2)
+ {
+ //wenn pfad, dann exe vorher rausziehen
+ if(strrchr(ret,'\\'))
+ accLaunch=tempxfire.accStringByte(strrchr(ret,'\\'));
+ else
+ accLaunch=tempxfire.accStringByte(ret);
+ }
+ //Steam.exe als launcher?
+ if((ret[0]=='s')&&
+ ret[1]=='t'&&
+ ret[2]=='e'&&
+ ret[3]=='a'&&
+ ret[4]=='m'&&
+ ret[5]=='.'&&
+ ret[6]=='e'&&
+ ret[7]=='x'&&
+ ret[8]=='e')
+ {
+ strcat_s(listentry.name,255," (Steam)");
+ }
+ }
+
+ if(z2!=zahlbuffer2) {
+ if(xfire_GetPrivateProfileString(gameidtemp, "DetectExe", "", ret, 512, inipath)) {
+ //lower launchstring
+ tempxfire.strtolower(ret);
+ //einzelnen ziechen zusammenrechnen
+ //wenn pfad, dann exe vorher rausziehen
+ if(strrchr(ret,'\\'))
+ accDetect=tempxfire.accStringByte(strrchr(ret,'\\'));
+ else
+ accDetect=tempxfire.accStringByte(ret);
+ }
+ }
+
+ //standardmäßig TRUE
+ BOOL addtolist=TRUE;
+
+ //schon ein eintrag vorhanden?
+ if(z2!=zahlbuffer2) {
+ //uniq id zusammen bauen aus spielid sowie zusammengerechneten launchstring und detectstring
+ uniqid=MAKELONG(gameid,MAKEWORD(accLaunch,accDetect));
+ for(uint i = 0 ; i < dublBuffer.size() ; i ++) {
+ if(dublBuffer.at(i)==uniqid)
+ {
+ addtolist=FALSE;
+ break;
+ }
+ }
+ }
+
+ //nur eintragen, wenn kein doppelter gefunden wurde
+ if(addtolist) {
+ //eintrag einfügen
+ int idx=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_ADDSTRING, 0, (LPARAM)listentry.name);
+ SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_SETITEMDATA, idx, listentry.gameid);
+ //eintrag in den buffer für die dublikateprüfung
+ dublBuffer.push_back(uniqid);
+ //und eintrag in den cache
+ Inicache.push_back(listentry);
+ SendMessage(hwndPB, PBM_SETPOS, (WPARAM)(p-buffer), 0);
+ }
+ }
+ }
+ }
+ else
+ p++;
+ }
+ }
+ else
+ {
+ //liste mit dem cache aufbauen
+ for(uint i = 0 ; i < Inicache.size() ; i ++) {
+ //spielid in der liste spielliste?
+ if(!xgamelist.Gameinlist(LOWORD(Inicache.at(i).gameid)))
+ {
+ //eintrag in die listeeinfügen
+ int idx=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_ADDSTRING, 0, (LPARAM)Inicache.at(i).name);
+ //gameid zuweisen
+ SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_SETITEMDATA, idx, Inicache.at(i).gameid);
+ }
+ }
+ }
+
+ //progressbar unsichtbar
+ ShowWindow(hwndPB,SW_HIDE);
+ //liste sichtbar machen
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_GAMELIST),SW_SHOW);
+ //suche und suchlabel sichtbar machen
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_SEARCH),SW_SHOW);
+ ShowWindow(GetDlgItem((HWND)hwndDlg,IDC_STC14),SW_SHOW);
+
+ dontClose=FALSE;
+}
+
+BOOL OpenFileDialog(HWND hwndDlg,OPENFILENAME*ofn,char*exe) {
+ //pointer zum exenamen
+ char* exename=NULL;
+ //buffer vom pfad
+ static char szFile[260]=""; //static damit noch nach dem aufruf lesbar bleibt
+ //buffer vom filter
+ char szFilter[260]="";
+ //backslash suchen
+ exename=strrchr(exe,'\\')+1;
+ //kein backslash dann normal ret als exenamen verwenden
+ if((int)exename==1) exename=exe;
+ //filterstring aufbauen
+ sprintf(szFilter,"%s|%s|%s|*.*|",exename,exename,Translate("All Files"));
+ //umbruch in 0 wandeln
+ unsigned int sizeFilter=strlen(szFilter);
+ for(unsigned int i=0;i<sizeFilter;i++)
+ if(szFilter[i]=='|') szFilter[i]=0;
+ //openfiledia vorbereiten
+ ZeroMemory(ofn, sizeof(OPENFILENAME));
+ ofn->lStructSize = sizeof(OPENFILENAME);
+ ofn->hwndOwner = hwndDlg;
+ ofn->lpstrFile = szFile;
+ ofn->nMaxFile = sizeof(szFile);
+ ofn->lpstrFilter = szFilter;
+ ofn->nFilterIndex = 1;
+ ofn->lpstrFileTitle = exe;
+ ofn->nMaxFileTitle = 0;
+ ofn->lpstrInitialDir = NULL;
+ ofn->Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
+
+ return GetOpenFileName(ofn);
+}
+
+INT_PTR CALLBACK DlgAddGameProc (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch (uMsg) {
+ case WM_INITDIALOG:
+ {
+ //übersetzen lassen
+ TranslateDialogDefault(hwndDlg);
+
+
+ //per thread liste füllen
+ mir_forkthread(FillGameList,hwndDlg);
+ }
+ break;
+ case WM_COMMAND:
+ if(LOWORD(wParam) == IDC_SEARCH && HIWORD(wParam)==EN_CHANGE)
+ {
+ char temp[256];
+ //eingabe bei der suche auslesen
+ GetDlgItemText(hwndDlg,IDC_SEARCH,temp,256);
+ //eingabe in der liste suchen
+ int idx=SendDlgItemMessage(hwndDlg, IDC_GAMELIST, LB_FINDSTRING, 0, (LPARAM)temp);
+ //gefunden?
+ if(idx!=LB_ERR)
+ {
+ //als aktiv setzen
+ SendDlgItemMessage(hwndDlg, IDC_GAMELIST,LB_SETCURSEL,idx,0);
+ }
+ }
+ else if(LOWORD(wParam) == IDCANCEL)
+ {
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ else if(LOWORD(wParam) == IDC_CUSTOM)
+ {
+ int idx=SendDlgItemMessage(hwndDlg, IDC_GAMELIST, LB_GETCURSEL, 0, 0);
+ //es wurde was ausgewählt?
+ if(idx==LB_ERR) {
+ MessageBoxA(hwndDlg,Translate("Please choose one game in the list!"),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ char ret[512]="";
+ char gameidtemp[10]="";
+
+ int gameids=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_GETITEMDATA, idx, 0);
+ //gameid splitten
+ int gameid1=LOWORD(gameids);
+ int gameid2=HIWORD(gameids);
+
+ if(gameid2!=0)
+ sprintf_s(gameidtemp,10,"%d_%d",gameid1,gameid2);
+ else
+ sprintf_s(gameidtemp,10,"%d",gameid1);
+
+ //spielnamen holen
+ if(xfire_GetPrivateProfileString(gameidtemp, "LongName", "", ret, 512, inipath)) {
+ sprintf_s(gameidtemp,10,"%d",gameid1);
+
+ //einige felder vorbelegen
+ SetDlgItemText(hPage,IDC_ADD_NAME,ret);
+ SetDlgItemText(hPage,IDC_ADD_DETECTEXE,"");
+ SetDlgItemText(hPage,IDC_ADD_LAUNCHEREXE,"");
+ SetDlgItemText(hPage,IDC_ADD_ID,gameidtemp);
+ SetDlgItemText(hPage,IDC_ADD_STATUSMSG,"");
+ SetDlgItemText(hPage,IDC_ADD_CUSTOMPARAMS,"");
+ SetDlgItemText(hPage,IDC_ADD_SENDID,gameidtemp);
+
+ //auf customeintrag edit tab wechseln
+ TabCtrl_SetCurSel(hwndTab, 1);
+ ShowWindow(hwndDlg,SW_HIDE);
+ ShowWindow(hPage,SW_SHOW);
+ }
+ }
+ }
+ else if(LOWORD(wParam) == IDOK)
+ {
+ int idx=SendDlgItemMessage(hwndDlg, IDC_GAMELIST, LB_GETCURSEL, 0, 0);
+ //es wurde was ausgewählt?
+ if(idx==LB_ERR) {
+ MessageBoxA(hwndDlg,Translate("Please choose one game in the list!"),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ //datei öffnen dialog
+ OPENFILENAME ofn;
+ //listdata auslesen, wo die gameid gespeihcert ist
+ int gameids=SendDlgItemMessage( (HWND)hwndDlg, IDC_GAMELIST, LB_GETITEMDATA, idx, 0);
+ //gameid splitten
+ int gameid1=LOWORD(gameids);
+ int gameid2=HIWORD(gameids);
+ char gameidtemp[10]="";
+ char ret[512];
+
+ if(gameid2!=0)
+ sprintf_s(gameidtemp,10,"%d_%d",gameid1,gameid2);
+ else
+ sprintf_s(gameidtemp,10,"%d",gameid1);
+
+ //neuen gameeintrag anlegen
+ Xfire_game* newgame=new Xfire_game();
+ //gameid und sendid setzen
+ newgame->id=gameid1;
+ newgame->send_gameid=gameid1;
+ //es handelt sich um einen customeintrag, man staune xD
+ newgame->custom=1;
+
+ //launcherexe abfragen
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherExe", "", ret, 512, inipath)) {
+ //datei vom user öffnen lassen
+ if(OpenFileDialog(hwndDlg,&ofn,ret))
+ {
+ //lowercase pfad
+ newgame->strtolower(ofn.lpstrFile);
+ //pfad dem spiel zuordnen
+ newgame->setString(ofn.lpstrFile,&newgame->launchparams);
+ }
+ else
+ {
+ //speicher freigeben
+ delete newgame;
+ return FALSE;
+ }
+ }
+
+ //detectexe abfragen
+ if(xfire_GetPrivateProfileString(gameidtemp, "DetectExe", "", ret, 512, inipath)) {
+ //datei vom user öffnen lassen
+ if(OpenFileDialog(hwndDlg,&ofn,ret))
+ {
+ //lowercase pfad
+ newgame->strtolower(ofn.lpstrFile);
+ //pfad dem spiel zuordnen
+ newgame->setString(ofn.lpstrFile,&newgame->path);
+ }
+ else
+ {
+ //speicher freigeben
+ delete newgame;
+ return FALSE;
+ }
+ } //MatchExe abfragen
+ else if(xfire_GetPrivateProfileString(gameidtemp, "MatchExe", "", ret, 512, inipath)) {
+ //datei vom user öffnen lassen
+ if(OpenFileDialog(hwndDlg,&ofn,ret))
+ {
+ //lowercase pfad
+ newgame->strtolower(ofn.lpstrFile);
+ //pfad dem spiel zuordnen
+ newgame->setString(ofn.lpstrFile,&newgame->path);
+ }
+ else
+ {
+ //speicher freigeben
+ delete newgame;
+ return FALSE;
+ }
+ }
+
+
+ //prüfe ob schon ein launchstring festgelegt wurde, wenn nicht die detectexe nehmen
+ if(!newgame->launchparams&&newgame->path) {
+ newgame->setString(newgame->path,&newgame->launchparams);
+ }
+
+ //prüfe ob schon ein detectexe festgelegt wurde, wenn nicht die launchstring nehmen
+ if(newgame->launchparams&&!newgame->path) {
+ newgame->setString(newgame->launchparams,&newgame->path);
+ }
+
+ //LauncherUrl wird der launcherstring überschrieben
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherUrl", "", ret, 512, inipath)) {
+ newgame->setString(ret,&newgame->launchparams);
+ }
+ else if(xfire_GetPrivateProfileString(gameidtemp, "Launch", "", ret, 512, inipath)) {
+ str_replace(ret,"%UA_LAUNCHER_EXE_PATH%",""); //erstmal unwichtige sachen entfernen
+ //str_replace(ret,"%UA_LAUNCHER_EXTRA_ARGS%",""); // - auch entfernen
+ str_replace(ret,"%UA_LAUNCHER_LOGIN_ARGS%",""); // - auch entfernen
+
+ //ein leerzeichen anfügen
+ newgame->appendString(" ",&newgame->launchparams);
+ //nun commandline des launchstringes dranhängen
+ newgame->appendString(ret,&newgame->launchparams);
+ }
+
+ //restliche wichtige felder einfügen
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherPasswordArgs", "", ret, 512, inipath))
+ newgame->setString(ret,&newgame->pwparams);
+ if(xfire_GetPrivateProfileString(gameidtemp, "LauncherNetworkArgs", "", ret, 512, inipath))
+ newgame->setString(ret,&newgame->networkparams);
+ if(xfire_GetPrivateProfileString(gameidtemp, "CommandLineMustContain[0]", "", ret, 512, inipath))
+ newgame->setString(ret,&newgame->mustcontain);
+ if(xfire_GetPrivateProfileString(gameidtemp, "XUSERSendId", "", ret, 512, inipath))
+ newgame->send_gameid=atoi(ret);
+ if(xfire_GetPrivateProfileString(gameidtemp, "XUSERSetStatusMsg", "", ret, 512, inipath))
+ newgame->setstatusmsg=atoi(ret);
+
+ //namen setzen und icon laden
+ newgame->setNameandIcon();
+ //spiel in die gameliste einfügen
+ xgamelist.Addgame(newgame);
+ //derzeitige gameliste in die datenbank eintragen
+ xgamelist.writeDatabase();
+ //startmenu leeren
+ xgamelist.clearStartmenu();
+ //startmenu neuerzeugen
+ xgamelist.createStartmenu();
+
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ }
+ break;
+ case WM_CLOSE:
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+ //hauptfenster schließen
+ SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ break;
+ }
+ return FALSE;
+}
+
+
+INT_PTR CALLBACK DlgAddGameProc2 (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ //ein spiel wurde zum editieren geöffnet, felder alle vorbelegen
+ if(editgame) {
+ //add augf übernehmen umstellen
+ SetDlgItemTextA(hwndDlg,IDOK,Translate("Apply"));
+
+ //namen vorbelegen
+ if(editgame->customgamename)
+ SetDlgItemTextA(hwndDlg,IDC_ADD_NAME,editgame->customgamename);
+ else if(editgame->name)
+ SetDlgItemTextA(hwndDlg,IDC_ADD_NAME,editgame->name);
+
+ //gameid setzen und feld schreibschützen
+ char gameid[10]="";
+ _itoa_s(editgame->id,gameid,10,10);
+ SetDlgItemTextA(hwndDlg,IDC_ADD_ID,gameid);
+ EnableWindow(GetDlgItem(hwndDlg,IDC_ADD_ID),FALSE);
+
+ //sendgameid setzen, bei -1 leer lassen
+ if(editgame->send_gameid!=-1)
+ {
+ _itoa_s(editgame->send_gameid,gameid,10,10);
+ SetDlgItemTextA(hwndDlg,IDC_ADD_SENDID,gameid);
+ }
+
+ //launcherstring
+ if(editgame->launchparams) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_LAUNCHEREXE,editgame->launchparams);
+ }
+
+ //detectstring
+ if(editgame->path) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_DETECTEXE,editgame->path);
+ }
+
+ //statusmsg
+ if(editgame->statusmsg) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_STATUSMSG,editgame->statusmsg);
+ }
+
+ //mustcontain parameter
+ if(editgame->mustcontain) {
+ SetDlgItemTextA(hwndDlg,IDC_ADD_CUSTOMPARAMS,editgame->mustcontain);
+ }
+ }
+ //dialog übersetzen
+ TranslateDialogDefault(hwndDlg);
+
+ return TRUE;
+
+ case WM_COMMAND:
+ {
+ if(LOWORD(wParam) == IDC_SENDIDHELP)
+ {
+ MessageBoxA(hwndDlg, Translate("If you add a mod of a Xfire supported game, then you can specify what gameid will be sent to Xfire. So if you add a Half-Life mod, you can set the Half-Life game id and if you start the game, your Xfire buddies will see the Half-Life game icon next to your name and the game time will be tracked."), Translate("XFire Options"), MB_OK|MB_ICONASTERISK);
+ }
+ else if(LOWORD(wParam) == IDC_GAMEIDHELP)
+ {
+ MessageBoxA(hwndDlg, Translate("Every game in Xfire needs an id. Use a number above the last used id to avoid problems with used ids. Every number above 10000 should be save. This id will not be sent to Xfire, when you start a game."), Translate("XFire Options"), MB_OK|MB_ICONASTERISK);
+ }
+ else if(LOWORD(wParam) == IDC_ADD_BROWSEDETECT)
+ {
+ OPENFILENAME ofn;
+ if(OpenFileDialog(hwndDlg,&ofn,"*.exe"))
+ {
+ SetDlgItemText(hwndDlg,IDC_ADD_DETECTEXE,ofn.lpstrFile);
+ }
+ }
+ else if(LOWORD(wParam) == IDC_ADD_BROWSELAUNCHER)
+ {
+ OPENFILENAME ofn;
+ if(OpenFileDialog(hwndDlg,&ofn,"*.exe"))
+ {
+ SetDlgItemText(hwndDlg,IDC_ADD_LAUNCHEREXE,ofn.lpstrFile);
+ }
+ }
+ else if(LOWORD(wParam) == IDCANCEL)
+ {
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ else if(LOWORD(wParam) == IDOK)
+ {
+ char temp[256];
+
+ //fillgames sucht noch
+ if(dontClose) {
+ MessageBoxA(hwndDlg, Translate("Please wait, gameini will be currently parsed ..."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ return FALSE;
+ }
+
+ //neuen gameeintrag anlegen
+ Xfire_game* newgame=NULL;
+
+ if(editgame)
+ newgame=editgame;
+ else
+ newgame=new Xfire_game();
+
+ //Spielname
+ GetDlgItemText(hwndDlg,IDC_ADD_NAME,temp,256);
+ if(!strlen(temp))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please enter a game name."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ //spielname zuordnen
+ newgame->setString(temp,&newgame->customgamename);
+ //spielnamen fürs menü
+ newgame->setString(temp,&newgame->name);
+ }
+ //spielid nur setzen/prüfen, wenn kein editgame
+ if(!editgame) {
+ GetDlgItemText(hwndDlg,IDC_ADD_ID,temp,256);
+ if(!strlen(temp))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please enter a game id."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ int gameid=atoi(temp);
+ //negative gameid blocken
+ if(gameid<1)
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please enter a game id above 1."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ //gameid auf uniq prüfen
+ else if(xgamelist.getGamebyGameid(gameid))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("This game id is already in use."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ //gameid zuordnen
+ newgame->id=gameid;
+ //standardmäßig wird bei einem customeintrag keine id versendet
+ newgame->send_gameid=-1;
+ }
+ }
+ //zu sendene spielid
+ GetDlgItemText(hwndDlg,IDC_ADD_SENDID,temp,256);
+ if(strlen(temp))
+ {
+ //standardmäßig wird bei einem customeintrag keine id versendet
+ int sendid=atoi(temp);
+ if(sendid>0)
+ newgame->send_gameid=sendid;
+ }
+
+ //launcher exe
+ GetDlgItemText(hwndDlg,IDC_ADD_LAUNCHEREXE,temp,256);
+ if(strlen(temp))
+ {
+ //lowercase pfad
+ newgame->strtolower(temp);
+ //detect exe
+ newgame->setString(temp,&newgame->launchparams);
+ }
+ //detectexe
+ GetDlgItemText(hwndDlg,IDC_ADD_DETECTEXE,temp,256);
+ if(!strlen(temp))
+ {
+ if(!editgame) delete newgame;
+ return MessageBoxA(hwndDlg, Translate("Please select a game exe. Note: If you dont select a launcher exe, the game exe will be used in the game start menu."), Translate("XFire Options"), MB_OK|MB_ICONEXCLAMATION);
+ }
+ else
+ {
+ //lowercase pfad
+ newgame->strtolower(temp);
+ //detect exe
+ newgame->setString(temp,&newgame->path);
+ //wenn kein launcher exe/pfad angeben wurde, dann den gamepath nehmen
+ if(!newgame->launchparams)
+ newgame->setString(temp,&newgame->launchparams);
+
+ }
+ //mustcontain parameter
+ GetDlgItemText(hwndDlg,IDC_ADD_CUSTOMPARAMS,temp,256);
+ if(strlen(temp))
+ {
+ newgame->setString(temp,&newgame->mustcontain);
+ }
+ //statusmsg speichern
+ GetDlgItemText(hwndDlg,IDC_ADD_STATUSMSG,temp,256);
+ if(strlen(temp))
+ {
+ newgame->setString(temp,&newgame->statusmsg);
+ newgame->setstatusmsg=1;
+ }
+ //custom eintrag aktivieren
+ newgame->custom=1;
+ //spiel in die gameliste einfügen, aber nur im nicht editmodus
+ if(!editgame)
+ xgamelist.Addgame(newgame);
+ //derzeitige gameliste in die datenbank eintragen
+ xgamelist.writeDatabase();
+ //startmenu leeren
+ xgamelist.clearStartmenu();
+ //startmenu neuerzeugen
+ xgamelist.createStartmenu();
+
+ return SendMessage(GetParent(hwndDlg),WM_CLOSE,0,0);
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+
+INT_PTR CALLBACK DlgAddGameProcMain (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+)
+{
+ switch (uMsg)
+ {
+ case WM_INITDIALOG:
+ {
+ TCITEMA tci = {0};
+ int iTotal;
+ RECT rcClient;
+
+ //icon des dialogs setzen
+ SendMessage(hwndDlg,WM_SETICON, (WPARAM)false, (LPARAM)LoadIcon(hinstance, MAKEINTRESOURCE(IDI_TM)));
+
+ hwndTab = GetDlgItem(hwndDlg, IDC_OPTIONSTAB);
+ TabCtrl_DeleteAllItems(hwndTab);
+ GetClientRect(GetParent(hwndTab), &rcClient);
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_ADDGAME), hwndDlg, DlgAddGameProc);
+
+ //bei editgame keine spiellisteauswahl
+ if(!editgame)
+ {
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Supported Games");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 10, rcClient.bottom - 28, 1);
+ iTotal++;
+ }
+ else
+ ShowWindow(hPage,FALSE);
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_ADDGAME2), hwndDlg, DlgAddGameProc2);
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Custom game");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 10, rcClient.bottom - 28, 1);
+ iTotal++;
+
+ //bei editgame 2. registerkarte aktiv schalten
+ if(!editgame) {
+ ShowWindow(hPage,FALSE);
+ TabCtrl_SetCurSel(hwndTab, 0);
+ }
+
+ return TRUE;
+ }
+ case WM_CLOSE:
+ //nicht schließen, wenn noch der thread läuft
+ if(dontClose) return FALSE;
+ //buffer leeren
+ if(buffer)
+ {
+ delete[] buffer;
+ buffer=NULL;
+ }
+ EndDialog(hwndDlg,0);
+ break;
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom)
+ {
+ case 0:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ TCITEM tci;
+ int i,count;
+
+ tci.mask = TCIF_PARAM;
+ count = TabCtrl_GetItemCount(GetDlgItem(hwndDlg,IDC_OPTIONSTAB));
+ for (i=0; i<count; i++)
+ {
+ TabCtrl_GetItem(GetDlgItem(hwndDlg,IDC_OPTIONSTAB),i,&tci);
+ SendMessage((HWND)tci.lParam,WM_NOTIFY,0,lParam);
+ }
+ break;
+ }
+ }
+ break;
+
+ case IDC_OPTIONSTAB:
+ {
+ HWND hTabCtrl = GetDlgItem(hwndDlg, IDC_OPTIONSTAB);
+
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case TCN_SELCHANGING:
+ {
+ TCITEM tci;
+
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(hTabCtrl, TabCtrl_GetCurSel(hTabCtrl), &tci);
+ ShowWindow((HWND)tci.lParam, SW_HIDE);
+ }
+ break;
+
+ case TCN_SELCHANGE:
+ {
+ TCITEM tci;
+
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(hTabCtrl, TabCtrl_GetCurSel(hTabCtrl), &tci);
+ ShowWindow((HWND)tci.lParam,SW_SHOW);
+ }
+ break;
+ }
+ break;
+ }
+ }
+ break;
+ }
+ return FALSE;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/addgamedialog.h b/protocols/Xfire/src/addgamedialog.h new file mode 100644 index 0000000000..3795df1ed5 --- /dev/null +++ b/protocols/Xfire/src/addgamedialog.h @@ -0,0 +1,28 @@ +#ifndef _ADDGAME_H
+#define _ADDGAME_H
+
+#include "baseProtocol.h"
+#include "Xfire_gamelist.h"
+
+//dialog funktion
+INT_PTR CALLBACK DlgAddGameProc (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+);
+
+INT_PTR CALLBACK DlgAddGameProcMain (HWND hwndDlg,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+);
+
+//struct für den cache
+struct lbInicache {
+ char name[255];
+ unsigned int gameid;
+};
+
+void AddGameDialog(HWND hwndDlg,Xfire_game* game=NULL);
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/all_statusmsg.cpp b/protocols/Xfire/src/all_statusmsg.cpp new file mode 100644 index 0000000000..52e06e79ba --- /dev/null +++ b/protocols/Xfire/src/all_statusmsg.cpp @@ -0,0 +1,398 @@ +//beinhaltet funktionen zum setzen des status wenn man ingame ist
+
+#include "stdafx.h"
+#include "baseProtocol.h"
+#include "m_variables.h"
+#include "Xfire_gamelist.h"
+
+extern Xfire_gamelist xgamelist;
+
+
+#include <vector>
+
+using namespace std;
+
+#include "xdebug.h"
+
+//vector beinhaltet statusmessages
+vector<string> *olstatusmsg=NULL;
+vector<string> *protoname=NULL;
+vector<unsigned int> *olstatus=NULL;
+vector<unsigned int> *oltostatus=NULL;
+PROTOCOLDESCRIPTOR **temp;
+int anz,statusid;
+int statustype;
+
+BOOL BackupStatusMsg() {
+ DBVARIANT dbv;
+
+ statustype=DBGetContactSettingByte(NULL,protocolname,"statuschgtype",0);
+
+ XFireLog("Backup Status Message ...");
+
+ //alten vector löschen
+ if(olstatusmsg!=NULL)
+ {
+ delete olstatusmsg;
+ olstatusmsg=NULL;
+ }
+ if(protoname!=NULL)
+ {
+ delete protoname;
+ protoname=NULL;
+ }
+ if(olstatus!=NULL)
+ {
+ delete olstatus;
+ olstatus=NULL;
+ }
+ if(oltostatus!=NULL)
+ {
+ delete oltostatus;
+ oltostatus=NULL;
+ }
+ olstatusmsg=new vector<string>;
+ protoname=new vector<string>;
+ olstatus=new vector<unsigned int>;
+ oltostatus=new vector<unsigned int>;
+
+ //alle protokolle durchgehen und den status in den vector sichern
+ // TODO: was enumprotocols, is enumprotos okay?
+ CallService(MS_PROTO_ENUMPROTOS,(WPARAM)&anz,(LPARAM)&temp);
+ for(int i=0;i<anz;i++)
+ {
+ statusid=CallProtoService(temp[i]->szName,PS_GETSTATUS,0,0);
+ XFireLog("Get Status of %s ...",temp[i]->szName);
+
+ char ttemp[128]="";
+ sprintf_s(ttemp,128,"%s%s",temp[i]->szName,PS_SETAWAYMSG);
+
+ //xfire wird geskipped, offline prots und invs prots auch, und locked status prots auch
+ if(statusid==ID_STATUS_INVISIBLE||statusid==ID_STATUS_OFFLINE||!lstrcmpiA( temp[i]->szName, protocolname )||!ServiceExists(ttemp)||DBGetContactSettingByte(NULL,temp[i]->szName,"LockMainStatus",0)==1)
+ {
+ XFireLog("-> Skip %s.",temp[i]->szName);
+
+ olstatus->push_back(-1);
+ olstatusmsg->push_back("");
+ if(statustype) oltostatus->push_back(-1);
+ protoname->push_back("");
+ continue;
+ }
+
+ int dummystatusid=statusid;
+
+ if(statustype)
+ {
+ if(statusid!=0)
+ {
+ int caps=CallProtoService(temp[i]->szName,PS_GETCAPS,PFLAGNUM_2,0);
+
+ //normale statusreihenfolge
+ if(DBGetContactSettingByte(NULL,protocolname,"dndfirst",0)==0)
+ {
+ if(caps&PF2_LIGHTDND)
+ {
+ oltostatus->push_back(ID_STATUS_OCCUPIED);
+ dummystatusid=ID_STATUS_OCCUPIED;
+ XFireLog("%s supports OCCUPIED.",temp[i]->szName);
+ }
+ else if(caps&PF2_HEAVYDND)
+ {
+ oltostatus->push_back(ID_STATUS_DND);
+ dummystatusid=ID_STATUS_DND;
+ XFireLog("%s supports DND.",temp[i]->szName);
+ }
+ else if(caps&PF2_SHORTAWAY)
+ {
+ oltostatus->push_back(ID_STATUS_AWAY);
+ dummystatusid=ID_STATUS_AWAY;
+ XFireLog("%s supports AWAY.",temp[i]->szName);
+ }
+ else
+ {
+ XFireLog("%s no Away???.",temp[i]->szName);
+ oltostatus->push_back(statusid);
+ dummystatusid=statusid;
+ }
+ }
+ else //dnd bevorzugt
+ {
+ if(caps&PF2_HEAVYDND)
+ {
+ oltostatus->push_back(ID_STATUS_DND);
+ dummystatusid=ID_STATUS_DND;
+ XFireLog("%s supports DND.",temp[i]->szName);
+ }
+ else if(caps&PF2_LIGHTDND)
+ {
+ oltostatus->push_back(ID_STATUS_OCCUPIED);
+ dummystatusid=ID_STATUS_OCCUPIED;
+ XFireLog("%s supports OCCUPIED.",temp[i]->szName);
+ }
+ else if(caps&PF2_SHORTAWAY)
+ {
+ oltostatus->push_back(ID_STATUS_AWAY);
+ dummystatusid=ID_STATUS_AWAY;
+ XFireLog("%s supports AWAY.",temp[i]->szName);
+ }
+ else
+ {
+ XFireLog("%s no Away???.",temp[i]->szName);
+ oltostatus->push_back(statusid);
+ dummystatusid=statusid;
+ }
+ }
+ }
+ else
+ oltostatus->push_back(-1);
+ }
+
+ switch(statusid)
+ {
+ case ID_STATUS_ONLINE:
+ if(DBGetContactSetting(NULL,"SRAway","OnMsg",&dbv))
+ olstatusmsg->push_back(Translate("Yep, I'm here."));
+ break;
+ case ID_STATUS_AWAY:
+ if(DBGetContactSetting(NULL,"SRAway","AwayMsg",&dbv))
+ olstatusmsg->push_back(Translate("I've been away since %time%."));
+ break;
+ case ID_STATUS_NA:
+ if(DBGetContactSetting(NULL,"SRAway","NaMsg",&dbv))
+ olstatusmsg->push_back(Translate("Give it up, I'm not in!"));
+ break;
+ case ID_STATUS_OCCUPIED:
+ if(DBGetContactSetting(NULL,"SRAway","OccupiedMsg",&dbv))
+ olstatusmsg->push_back(Translate("Not right now."));
+ break;
+ case ID_STATUS_DND:
+ if(DBGetContactSetting(NULL,"SRAway","DndMsg",&dbv))
+ olstatusmsg->push_back(Translate("Give a guy some peace, would ya?"));
+ break;
+ case ID_STATUS_FREECHAT:
+ if(DBGetContactSetting(NULL,"SRAway","FreeChatMsg",&dbv))
+ olstatusmsg->push_back(Translate("Well, I would talk to you if Miranda ICQ supported chat"));
+ break;
+ case ID_STATUS_ONTHEPHONE:
+ if(DBGetContactSetting(NULL,"SRAway","OtpMsg",&dbv))
+ olstatusmsg->push_back(Translate("That'll be the phone."));
+ break;
+ case ID_STATUS_OUTTOLUNCH:
+ if(DBGetContactSetting(NULL,"SRAway","OtlMsg",&dbv))
+ olstatusmsg->push_back(Translate("Mmm...food."));
+ break;
+ default:
+ //nix zumachn, kenn den status nicht
+ olstatus->push_back(-1);
+ olstatusmsg->push_back("");
+ protoname->push_back("");
+ continue;
+ }
+
+ //ab in den vector
+ olstatus->push_back(statusid);
+ if(olstatus->size()>olstatusmsg->size())
+ {
+ olstatusmsg->push_back(string(dbv.pszVal));
+ protoname->push_back(temp[i]->szName);
+ //freigeben
+ DBFreeVariant(&dbv);
+ }
+ else
+ protoname->push_back(temp[i]->szName);
+ }
+
+ return TRUE;
+}
+
+BOOL SetGameStatusMsg()
+{
+ char* statusmsg=NULL;
+
+ //prüfe ob vector leer
+ if(olstatusmsg==NULL)
+ return FALSE;
+
+ //zusetzende statusmsg erstellen
+ if (ServiceExists(MS_VARS_FORMATSTRING))
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(NULL,protocolname,"setstatusmsg",&dbv)) {
+ //direkte funktionen verwenden
+ statusmsg = variables_parse(dbv.pszVal,NULL,0);
+ if (statusmsg == NULL)
+ {
+ DBFreeVariant(&dbv);
+ return FALSE;
+ }
+
+ DBFreeVariant(&dbv);
+ }
+ }
+ else
+ {
+ //alternativ zweig ohne variables
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(NULL,protocolname,"setstatusmsg",&dbv)) {
+
+ DBVARIANT dbv3;
+
+ //statusmsg rein
+ xgamelist.setString(dbv.pszVal,&statusmsg);
+
+ //mit den vars ersetzen beginnen
+
+ //derzeitiges spiel
+ if(!DBGetContactSetting(NULL,protocolname, "currentgamename",&dbv3))
+ {
+ xgamelist.strreplace("%myxfiregame%",dbv3.pszVal,&statusmsg);
+ DBFreeVariant(&dbv3);
+ }
+ else
+ xgamelist.strreplace("%myxfiregame%","",&statusmsg);
+
+ //derzeitiges voiceprogram
+ if(!DBGetContactSetting(NULL,protocolname, "currentvoicename",&dbv3))
+ {
+ xgamelist.strreplace("%myxfirevoice%",dbv3.pszVal,&statusmsg);
+ DBFreeVariant(&dbv3);
+ }
+ else
+ xgamelist.strreplace("%myxfirevoice%","",&statusmsg);
+
+ //derzeitige voiceip
+ if(!DBGetContactSetting(NULL,protocolname, "VServerIP",&dbv3))
+ {
+ xgamelist.strreplace("%myxfirevoiceip%",dbv3.pszVal,&statusmsg);
+ DBFreeVariant(&dbv3);
+ }
+ else
+ xgamelist.strreplace("%myxfirevoiceip%","",&statusmsg);
+
+ //derzeitige gameip
+ if(!DBGetContactSetting(NULL,protocolname, "ServerIP",&dbv3))
+ {
+ xgamelist.strreplace("%myxfireserverip%",dbv3.pszVal,&statusmsg);
+ DBFreeVariant(&dbv3);
+ }
+ else
+ xgamelist.strreplace("%myxfireserverip%","",&statusmsg);
+
+ }
+ }
+
+ // TODO: MS_PROTO_ENUMPROTOCOLS was original... is enumprotos okay?
+ CallService(MS_PROTO_ENUMPROTOS,(WPARAM)&anz,(LPARAM)&temp);
+ for(int i=0;i<anz;i++)
+ {
+ if(olstatus->at(i)!=-1)
+ {
+ if(statustype)
+ {
+ //newawaysys
+ if(ServiceExists("NewAwaySystem/SetStateA"))
+ {
+ XFireLog("-> SetStatusMsg of %s with NewAwaySystem/SetStateA.",protoname->at(i).c_str());
+
+ NAS_PROTOINFO npi = {0};
+ npi.cbSize=sizeof(NAS_PROTOINFO);
+ npi.szProto=(char*)protoname->at(i).c_str();
+ npi.status=oltostatus->at(i);
+ npi.szMsg=mir_strdup(statusmsg);
+ CallService("NewAwaySystem/SetStateA", (WPARAM)&npi, (LPARAM)1);
+ }
+ else if(ServiceExists("NewAwaySystem/SetStateW")) {
+ XFireLog("-> SetStatusMsg of %s with NewAwaySystem/SetStateW.",protoname->at(i).c_str());
+
+ NAS_PROTOINFO npi = {0};
+ npi.cbSize=sizeof(NAS_PROTOINFO);
+ npi.szProto=(char*)protoname->at(i).c_str();
+ npi.status=oltostatus->at(i);
+ npi.szMsg=mir_strdup(statusmsg);
+ CallService("NewAwaySystem/SetStateW", (WPARAM)&npi, (LPARAM)1);
+ }
+ else
+ {
+ XFireLog("-> SetStatusMsg of %s with Miranda with occupied status.",protoname->at(i).c_str());
+
+ //statusmsg für beschäftigt setzen
+ CallProtoService(temp[i]->szName,PS_SETAWAYMSG,oltostatus->at(i),(LPARAM)statusmsg);
+ //status auf beschäftigt wechseln
+ CallProtoService(temp[i]->szName,PS_SETSTATUS,oltostatus->at(i),0);
+ //statusmsg für beschäftigt setzen
+ if(CallProtoService(temp[i]->szName,PS_GETSTATUS,0,0)!=oltostatus->at(i))
+ {
+ XFireLog("Set StatusMsg again, Status was not succesfully set.");
+ CallProtoService(temp[i]->szName,PS_SETAWAYMSG,oltostatus->at(i),(LPARAM)statusmsg);
+ }
+ }
+ }
+ else
+ {
+ XFireLog("-> SetStatusMsg of %s.",protoname->at(i).c_str());
+
+ CallProtoService(temp[i]->szName,PS_SETAWAYMSG,olstatus->at(i),(LPARAM)statusmsg);
+ }
+ }
+ }
+
+ if (ServiceExists(MS_VARS_FORMATSTRING))
+ CallService(MS_VARS_FREEMEMORY, (WPARAM)statusmsg, 0);
+ else
+ if(statusmsg) delete[] statusmsg;
+
+ return TRUE;
+}
+
+BOOL SetOldStatusMsg()
+{
+ //prüfe ob vector leer
+ if(olstatusmsg==NULL)
+ return FALSE;
+
+ // TODO: was enumprotocols, is enumprotos okay?
+ CallService(MS_PROTO_ENUMPROTOS,(WPARAM)&anz,(LPARAM)&temp);
+ for(int i=0;i<anz;i++)
+ {
+ if(olstatus->at(i)!=-1)
+ {
+ if(statustype)
+ {
+ //alten status setzen
+ CallProtoService(temp[i]->szName,PS_SETSTATUS,olstatus->at(i),0);
+ //status wurde nicht gewechselt, dann statusmsg nachträglich setzen
+ if(CallProtoService(temp[i]->szName,PS_GETSTATUS,0,0)!=olstatus->at(i))
+ CallProtoService(temp[i]->szName,PS_SETAWAYMSG,olstatus->at(i),(LPARAM)olstatusmsg->at(i).c_str());
+ }
+ else
+ {
+ CallProtoService(temp[i]->szName,PS_SETSTATUS,olstatus->at(i),0);
+ CallProtoService(temp[i]->szName,PS_SETAWAYMSG,olstatus->at(i),(LPARAM)olstatusmsg->at(i).c_str());
+ }
+ }
+ }
+
+ //alten vector löschen
+ if(protoname!=NULL)
+ {
+ delete protoname;
+ protoname=NULL;
+ }
+ if(olstatusmsg!=NULL)
+ {
+ delete olstatusmsg;
+ olstatusmsg=NULL;
+ }
+ if(olstatus!=NULL)
+ {
+ delete olstatus;
+ olstatus=NULL;
+ }
+ if(oltostatus!=NULL)
+ {
+ delete olstatus;
+ olstatus=NULL;
+ }
+
+ return TRUE;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/all_statusmsg.h b/protocols/Xfire/src/all_statusmsg.h new file mode 100644 index 0000000000..a3a95a56b7 --- /dev/null +++ b/protocols/Xfire/src/all_statusmsg.h @@ -0,0 +1,7 @@ +//definitionen für die statusmsg handling geschichte
+#include "baseProtocol.h"
+
+//sichert die statusmeldungen in den speicher
+BOOL BackupStatusMsg();
+BOOL SetGameStatusMsg();
+BOOL SetOldStatusMsg();
\ No newline at end of file diff --git a/protocols/Xfire/src/authpacket.cpp b/protocols/Xfire/src/authpacket.cpp new file mode 100644 index 0000000000..9183fd1e48 --- /dev/null +++ b/protocols/Xfire/src/authpacket.cpp @@ -0,0 +1,47 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "authpacket.h" +#include "xfireparse.h" +#include "variablevalue.h" + +namespace xfirelib { + using namespace std; + + AuthPacket::AuthPacket() : XFireRecvPacketContent() { + salt = 0; + } + AuthPacket::~AuthPacket() { + delete salt; + } + + void AuthPacket::parseContent(char *buf, int length, int numberOfAtts) { + + //XFireParse parse; + salt = new VariableValue(); + //parse.readVariableValue(buf, 0, length, salt); + salt->readVariableValue(buf, 0, length); + } + +}; diff --git a/protocols/Xfire/src/authpacket.h b/protocols/Xfire/src/authpacket.h new file mode 100644 index 0000000000..5a9f5bb057 --- /dev/null +++ b/protocols/Xfire/src/authpacket.h @@ -0,0 +1,54 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __AUTHPACKET_H +#define __AUTHPACKET_H + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + +#define XFIRE_PACKET_AUTH_ID 128 + +namespace xfirelib { + + class AuthPacket : public XFireRecvPacketContent { + public: + AuthPacket(); + virtual ~AuthPacket(); + + XFirePacketContent* newPacket() { return new AuthPacket(); } + + + int getPacketId() { return XFIRE_PACKET_AUTH_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + VariableValue *getSalt() { return salt; } + private: + VariableValue *salt; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/baseProtocol.h b/protocols/Xfire/src/baseProtocol.h new file mode 100644 index 0000000000..1e63fb59c2 --- /dev/null +++ b/protocols/Xfire/src/baseProtocol.h @@ -0,0 +1,272 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by
+ * dufte <dufte@justmail.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+#define MIRANDA_VER 0x0A00
+
+//=====================================================
+// Includes (yea why not include lots of stuff :D )
+//=====================================================
+#include <windows.h>
+#include <gdiplus.h>
+#include <Wininet.h>
+#include <commctrl.h>
+#include <stdio.h>
+#include <time.h>
+#include <stddef.h>
+#include <process.h>
+#include <string.h>
+#include <winsock.h>
+#include "resource.h"
+#include <winbase.h>
+#include <tlhelp32.h>
+#include <Psapi.h>
+#include <string.h>
+#include <Iphlpapi.h>
+
+//Miranda SDK headers
+#include <newpluginapi.h>
+#include <m_clist.h>
+#include <m_clui.h>
+#include <m_skin.h>
+#include <m_langpack.h>
+#include <m_protomod.h>
+#include <m_database.h>
+#include <m_system.h>
+#include <m_protocols.h>
+#include <m_protomod.h>
+#include <m_protosvc.h>
+#include <m_protoint.h>
+#include <m_userinfo.h>
+#include <m_options.h>
+#include <m_utils.h>
+#include <m_ignore.h>
+#include <m_clc.h>
+#include <m_netlib.h>
+#include <m_avatars.h>
+#include <m_folders.h>
+#include <m_assocmgr.h>
+#include <m_icolib.h>
+#include <m_genmenu.h>
+#include <m_cluiframes.h>
+#include <m_account.h>
+#include <m_protoplugin.h>
+
+#include "services.h"
+
+/*#pragma comment(lib, "atl.lib")
+#include <atldef.h>
+#define _ATL_DLL_IMPL
+#include <atliface.h>*/
+
+#ifndef _BASEPROTO_H
+#define _BASEPROTO_H
+
+//=======================================================
+// Definitions
+//=======================================================
+#define protocolname "XFire" //no spaces here :)
+
+/* */
+typedef DWORD (*pGetExtendedTcpTable)(
+ __out_bcount_opt(*pdwSize) PVOID pTcpTable,
+ __inout PDWORD pdwSize,
+ __in BOOL bOrder,
+ __in ULONG ulAf,
+ __in TCP_TABLE_CLASS TableClass,
+ __in ULONG Reserved
+ );
+
+typedef DWORD (*pGetExtendedUdpTable)(
+ __out_bcount_opt(*pdwSize) PVOID pUdpTable,
+ __inout PDWORD pdwSize,
+ __in BOOL bOrder,
+ __in ULONG ulAf,
+ __in UDP_TABLE_CLASS TableClass,
+ __in ULONG Reserved
+ );
+
+//=======================================================
+// Defines
+//=======================================================
+//General
+extern HINSTANCE hinstance;
+extern int bpStatus;
+
+//Services.c
+int GetCaps(WPARAM wParam,LPARAM lParam);
+int GetName(WPARAM wParam,LPARAM lParam);
+int TMLoadIcon(WPARAM wParam,LPARAM lParam);
+int SetStatus(WPARAM wParam,LPARAM lParam);
+int GetStatus(WPARAM wParam,LPARAM lParam);
+BOOL IsXFireContact(HANDLE h);
+int displayPopup(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType,HICON hhicon=NULL);
+BOOL CreateToolTip(int toolID, HWND hDlg, CHAR* pText);
+void EnableDlgItem(HWND hwndDlg, UINT control, int state);
+BOOL str_replace(char*src,char*find,char*rep);
+extern void Message(LPVOID msg);
+extern void MessageE(LPVOID msg);
+char* GetLaunchPath(char*launch);
+unsigned short r(unsigned short data);
+BOOL GetServerIPPort(DWORD pid,char*localaddrr,unsigned long localaddr,char*ip1,char*ip2,char*ip3,char*ip4,long*port);
+BOOL GetServerIPPort2(DWORD pid,char*localaddrr,unsigned long localaddr,char*ip1,char*ip2,char*ip3,char*ip4,long*port);
+int SetNickName(WPARAM newnick, LPARAM lparam);
+BOOL FindTeamSpeak(DWORD*pid,int*vid);
+char*menuitemtext(char*mtext);
+BOOL checkCommandLine(HANDLE hProcess,char * mustcontain,char * mustnotcontain);
+char * getItem(char * string,char delim,int count);
+BOOL GetWWWContent(char*host,char* request,char*filename,BOOL dontoverwrite);
+BOOL GetWWWContent2(char*address,char*filename,BOOL dontoverwrite,char**tobuf=NULL,unsigned int* size=NULL);
+BOOL CheckWWWContent(char*address);
+unsigned int getfilesize(char*path);
+void UpdateMyXFireIni(LPVOID dummy);
+void UpdateMyIcons(LPVOID dummy);
+BOOL IsContactMySelf(std::string buddyusername);
+DWORD xfire_GetPrivateProfileString(__in LPCTSTR lpAppName, __in LPCTSTR lpKeyName, __in LPCTSTR lpDefault, __out LPTSTR lpReturnedString, __in DWORD nSize, __in LPCTSTR lpFileName);
+BOOL mySleep(int ms,HANDLE evt);
+void __stdcall XFireLog( const char* fmt, ... );
+
+#define ID_STATUS_RECONNECT ID_STATUS_OFFLINE-1
+
+struct CONTACT // Contains info about users
+{
+ TCHAR* name;
+ TCHAR* user;
+ TCHAR* host;
+ bool ExactOnly;
+ bool ExactWCOnly;
+ bool ExactNick;
+};
+
+
+#define MSGBOX(msg) mir_forkthread(Message,(LPVOID)msg)
+#define MSGBOXE(msg) mir_forkthread(MessageE,(LPVOID)msg)
+
+#pragma comment(lib,"Advapi32.lib")
+#pragma comment(lib,"Psapi.lib")
+#pragma comment(lib,"gdiplus.lib")
+#pragma comment(lib,"comdlg32.lib")
+#pragma comment(lib,"comctl32.lib")
+#pragma comment(lib,"shell32.lib")
+
+//=====================================================
+// Definitions
+//=====================================================
+
+struct GameIco {
+ int gameid;
+ HANDLE handle;
+ HICON hicon;
+};
+
+struct XFireContact {
+ char * username;
+ char * nick;
+ int id;
+ int sid;
+};
+
+struct XFireAvatar {
+ int type;
+ char backup[256];
+ char file[256];
+ char rfile[256];
+};
+
+struct XFire_FoundGame
+{
+ int gameid;
+ int gameid2;
+ short send_gameid;
+ char path[256];
+ char mpath[9][256];
+ int morepaths;
+ char launchparams[1024];
+ char networkparams[1024];
+ char userparams[1024];
+ char pwparams[1024];
+ char mustcontain[1024];
+ char notcontain[1024];
+ char temp[128];
+ BOOL setstatusmsg;
+ BOOL custom;
+ BOOL skip;
+ BOOL noicqstatus;
+ HANDLE menuitem;
+};
+
+struct XFire_SetAvatar
+{
+ HANDLE hContact;
+ char* username;
+};
+
+struct gServerstats {
+ int players;
+ int maxplayers;
+ char name[512];
+ char map[512];
+ char gametype[512];
+ char fgametype[512];
+ BOOL password;
+};
+
+struct GameServerQuery_query {
+ int xfiregameid;
+ char ip[16];
+ WORD port;
+ HANDLE handle; //will be overwritten
+ int queryengine; // immer 0
+};
+
+#define XFIRE_MAX_STATIC_STRING_LEN 1024
+#define XFIRE_SCAN_VAL 0x3
+
+#define XFIRE_GAME_ICON 0
+#define XFIRE_VOICE_ICON 1
+
+
+typedef struct {
+ int cbSize;
+ char *szProto; // pointer to protocol modulename (NULL means global)
+ union
+ {
+ char *szMsg;
+ WCHAR *wszMsg;
+ TCHAR *tszMsg;
+ }; // pointer to the status message _format_ (i.e. it's an unparsed message containing variables, in any case. NAS takes care of parsing) (may be NULL - means that there's no specific message for this protocol - then the global status message will be used)
+/*
+ Be aware that MS_NAS_GETSTATE allocates memory for szMsg through Miranda's
+ memory management interface (MS_SYSTEM_GET_MMI). And MS_NAS_SETSTATE
+ expects szMsg to be allocated through the same service. MS_NAS_SETSTATE deallocates szMsg.
+*/
+ WORD status; // status mode. 0 means current (NAS will overwrite 0 with the current status mode)
+// for MS_NAS_GETSTATE if the specified status is not 0, MS_NAS_GETSTATE will return the default/last status message (depends on settings) - i.e. the same message that will be shown by default when user changes status to the specified one. please note that, for example, if current status mode is ID_STATUS_AWAY, then status messages returned by MS_NAS_GETSTATE for status=0 and status=ID_STATUS_AWAY may be different! for status=ID_STATUS_AWAY it always returns the default/last status message, and for status=0 it returns _current_ status message.
+ int Flags;
+} NAS_PROTOINFO;
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/buddyinfo.cpp b/protocols/Xfire/src/buddyinfo.cpp new file mode 100644 index 0000000000..bcd9d47c81 --- /dev/null +++ b/protocols/Xfire/src/buddyinfo.cpp @@ -0,0 +1,64 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include <vector> +#include <string> + +#include "buddyinfo.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + void BuddyInfoPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + + VariableValue val; + + XDEBUG2( "Len: %ld\n", length ); + + index+=2; //paar bytes überspringen + + index += val.readValue(buf,index,4); + this->userid = val.getValueAsLong(); + + XDEBUG2( "UserId: %ld\n", this->userid); + + index+=2; + + this->avatarmode = buf[index]; + XDEBUG2( "Avatarmode: %ld\n", this->avatarmode); + index+=6; + + + index += val.readValue(buf,index,4); + this->avatarid = val.getValueAsLong(); + XDEBUG2( "Avatarid: %ld\n", this->avatarid); + + } + +};
\ No newline at end of file diff --git a/protocols/Xfire/src/buddyinfo.h b/protocols/Xfire/src/buddyinfo.h new file mode 100644 index 0000000000..54f918dffd --- /dev/null +++ b/protocols/Xfire/src/buddyinfo.h @@ -0,0 +1,52 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +//packet wird empfangen, nachdem man buddyinfos angefordert hat + +#ifndef __BUDDYINFO_H +#define __BUDDYINFO_H + +#include "xfirerecvpacketcontent.h" +#include <string> + +#define XFIRE_BUDDYINFO 0xAE + +namespace xfirelib { + class BuddyInfoPacket : public XFireRecvPacketContent { + public: + virtual ~BuddyInfoPacket() { } + int getPacketId() { return XFIRE_BUDDYINFO; } + + XFirePacketContent *newPacket() { return new BuddyInfoPacket(); } + void parseContent(char *buf, int length, int numberOfAtts); + + unsigned char avatarmode; + unsigned int avatarid; + unsigned int userid; + + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/buddylist.cpp b/protocols/Xfire/src/buddylist.cpp new file mode 100644 index 0000000000..ea7e264502 --- /dev/null +++ b/protocols/Xfire/src/buddylist.cpp @@ -0,0 +1,373 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include <iostream> +#include <vector> +#include "buddylist.h" +#include "buddylistonlinepacket.h" +#include "buddylistgamespacket.h" +#include "buddylistgames2packet.h" +#include "recvremovebuddypacket.h" +#include "recvstatusmessagepacket.h" +#include "recvbuddychangednick.h" +#include "xdebug.h" + +//buddylist verarbeitung von der main in buddylist verschoben, um doppelte schleifenverarbeitung zuunterbinden +#include "baseProtocol.h" + +extern HANDLE handlingBuddys(xfirelib::BuddyListEntry *entry, int clan=0,char* group=NULL,BOOL dontscan=FALSE); +extern void setBuddyStatusMsg(xfirelib::BuddyListEntry *entry,std::string statusmsg); + +namespace xfirelib { + + using namespace std; + + BuddyList::BuddyList(Client *client) { + entries = new vector<BuddyListEntry *>; + + //clan entries initialisieren - dufte + entriesClan = new vector<BuddyListEntry *>; + + this->client = client; + this->client->addPacketListener( this ); + } + BuddyList::~BuddyList() { + for(vector<BuddyListEntry *>::iterator it = entries->begin(); + it != entries->end(); it++) { + delete *it; + } + delete entries; + + //clan entries entfernen - dufte + for(vector<BuddyListEntry *>::iterator it = entriesClan->begin(); + it != entriesClan->end(); it++) { + delete *it; + } + delete entriesClan; + } + + BuddyListEntry *BuddyList::getBuddyById(long userid) { + for(uint i = 0 ; i < entries->size() ; i++) { + BuddyListEntry *entry = entries->at(i); + if(entry->userid == userid) + return entry; + } + + //clan entries durchsuchen - dufte + for(uint i = 0 ; i < entriesClan->size() ; i++) { + BuddyListEntry *entry = entriesClan->at(i); + if(entry->userid == userid) + return entry; + } + + return 0; + } + + BuddyListEntry *BuddyList::getBuddyByName(string username) { + for(uint i = 0 ; i < entries->size() ; i++) { + BuddyListEntry *entry = entries->at(i); + if(entry->username == username) + return entry; + } + + //clan entries durchsuchen - dufte + for(uint i = 0 ; i < entriesClan->size() ; i++) { + BuddyListEntry *entry = entriesClan->at(i); + if(entry->username == username) + return entry; + } + + return 0; + } + + BuddyListEntry *BuddyList::getBuddyBySid(const char *sid) { + for(uint i = 0 ; i < entries->size() ; i++) { + BuddyListEntry *entry = entries->at(i); + + if(memcmp((void *)sid,(void *)entry->sid,16) == 0) + return entry; + + } + + //clan entries durchsuchen - dufte + for(uint i = 0 ; i < entriesClan->size() ; i++) { + BuddyListEntry *entry = entriesClan->at(i); + + if(memcmp((void *)sid,(void *)entry->sid,16) == 0) + return entry; + + } + + return 0; + } + + + void BuddyList::initEntries(BuddyListNamesPacket *buddyNames) { + for(uint i = 0 ; i < buddyNames->usernames->size() ; i++) { + BuddyListEntry *entry = new BuddyListEntry; + entry->username = buddyNames->usernames->at(i); + entry->userid = buddyNames->userids->at(i); + entry->nick = buddyNames->nicks->at(i); + //buddies in miranda verarbeiten + handlingBuddys(entry,0,NULL); + entries->push_back(entry); + } + } + + // funktion zum initialisieren der clanliste - dufte + void BuddyList::initEntriesClan(ClanBuddyListNamesPacket *buddyNames) { + for(uint i = 0 ; i < buddyNames->usernames->size() ; i++) { + BuddyListEntry *entry = new BuddyListEntry; + entry->username = buddyNames->usernames->at(i); + entry->userid = buddyNames->userids->at(i); + entry->nick = buddyNames->nicks->at(i); + entry->clanid = buddyNames->clanid; + /* ## buddies im miranda verarbietn */ + char temp[255]; + char * dummy; + sprintf_s(temp,255,"Clan_%d",entry->clanid); + + DBVARIANT dbv;
+ if(!DBGetContactSetting(NULL,protocolname,temp,&dbv))
+ {
+ dummy=dbv.pszVal;
+ } + else + dummy=NULL; + + handlingBuddys(entry,entry->clanid,dummy); + /* ## ende */ + entriesClan->push_back(entry); + } + } + + void BuddyList::updateFriendsofFriend(FriendsBuddyListNamesPacket* friends) + { + for(uint i = 0 ; i < friends->sids->size() ; i++) { + BuddyListEntry *entry = getBuddyBySid( friends->sids->at(i) ); + if(entry){ + XDEBUG2("Friends of Friend %s!\n",friends->usernames->at(i).c_str()); + entry->nick=friends->nicks->at(i); + entry->username=friends->usernames->at(i); + entry->userid=friends->userids->at(i); + }else{ + XERROR(("updateFriendsofFriendBuddies: sid not found!\n")); + } + } + } + + void BuddyList::updateOnlineBuddies(BuddyListOnlinePacket* buddiesOnline) { + for(uint i = 0 ; i < buddiesOnline->userids->size() ; i++) { + BuddyListEntry *entry = getBuddyById( buddiesOnline->userids->at(i) ); + if(entry){ + entry->setSid( buddiesOnline->sids->at(i) ); + //buddies in miranda verarbeiten + handlingBuddys(entry,0,NULL); + }else{ + XERROR(("updateOnlineBuddies: Could not find buddy with this sid!\n")); + } + } + } + + void BuddyList::updateBuddiesGame(BuddyListGamesPacket* buddiesGames) { + bool isFirst = buddiesGames->getPacketId() == XFIRE_BUDDYS_GAMES_ID; + for(uint i = 0 ; i < buddiesGames->sids->size() ; i++) { + BuddyListEntry *entry = getBuddyBySid( buddiesGames->sids->at(i) ); + if(!entry) { + //nicht zuordbare sids zuordnen + XERROR("Add dummy Contact in buddylist for friends of friends!\n"); + BuddyListEntry *newentry = new BuddyListEntry; + newentry->username = ""; + newentry->userid = 0; + newentry->nick = ""; + newentry->setSid(buddiesGames->sids->at(i)); + entries->push_back(newentry); + //nochmal entry suchen + entry = newentry; //getBuddyBySid( buddiesGames->sids->at(i) ); + } + if(entry){ + if(isFirst) { + entry->game = buddiesGames->gameids->at(i); + delete entry->gameObj; entry->gameObj = NULL; + } else { + entry->game2 = buddiesGames->gameids->at(i); + delete entry->game2Obj; entry->game2Obj = NULL; + } + XDEBUG(( "Resolving Game ... \n" )); + XFireGameResolver *resolver = client->getGameResolver(); + if(resolver) { + XDEBUG(( "Resolving Game ... \n" )); + if(isFirst) + entry->gameObj = resolver->resolveGame( entry->game, i, buddiesGames ); + else + entry->game2Obj = resolver->resolveGame( entry->game2, i, buddiesGames ); + } else { + XDEBUG(( "No GameResolver ? :(\n" )); + } + XDEBUG(( "%s: Game (%ld): %s / Game2 (%ld): %s\n", + entry->username.c_str(), + entry->game, + (entry->gameObj == NULL ? "UNKNOWN" : entry->gameObj->getGameName().c_str()), + entry->game2, + (entry->game2Obj== NULL ? "UNKNOWN" :entry->game2Obj->getGameName().c_str()) + )); + }else{ + XERROR("updateBuddiesGame: Could not find buddy with this sid!\n"); + } + } + } + + void BuddyList::receivedPacket(XFirePacket *packet) { + XFirePacketContent *content = packet->getContent(); + if(content == 0) return; + XDEBUG2( "hmm... %d\n", content->getPacketId() ); + switch(content->getPacketId()) { + case XFIRE_BUDDYS_NAMES_ID: { + XINFO(( "Received Buddy List..\n" )); + this->initEntries( (BuddyListNamesPacket*)content ); + break; + } + case XFIRE_CLAN_BUDDYS_NAMES_ID: { + XINFO(( "Received Clan Buddy List..\n" )); + this->initEntriesClan( (ClanBuddyListNamesPacket*)content ); + break; + } + //neue nicks updaten, dufte + case XFIRE_RECVBUDDYCHANGEDNICK: { + RecvBuddyChangedNick* recvchangednick=(RecvBuddyChangedNick*)content; + XINFO(( "Received new nick of a buddy..\n" )); + BuddyListEntry* entry=NULL; + entry=this->getBuddyById(recvchangednick->userid); + if(entry) { + entry->nick=recvchangednick->newnick; + recvchangednick->entry=(void*)entry; + handlingBuddys(entry,0,NULL); + } + break; + } + case XFIRE_BUDDYS_ONLINE_ID: { + XINFO(( "Received Buddy Online Packet..\n" )); + this->updateOnlineBuddies( (BuddyListOnlinePacket *)content ); + break; + } + case XFIRE_FRIENDS_BUDDYS_NAMES_ID: { + XINFO(( "Received Friends of Friend..\n" )); + this->updateFriendsofFriend( (FriendsBuddyListNamesPacket *)content ); + break; + } + case XFIRE_BUDDYS_GAMES2_ID: + case XFIRE_BUDDYS_GAMES_ID: { + XINFO(( "Recieved the game a buddy is playing..\n" )); + this->updateBuddiesGame( (BuddyListGamesPacket *)content ); + break; + } + case XFIRE_RECVREMOVEBUDDYPACKET: { + RecvRemoveBuddyPacket *p = (RecvRemoveBuddyPacket*)content; + XDEBUG2( "Buddy was removed from contact list (userid: %ld)\n", p->userid ); + std::vector<BuddyListEntry *>::iterator i = entries->begin(); + while( i != entries->end() ) { + if((*i)->userid == p->userid) { + BuddyListEntry *buddy = *i; + XINFO(( "%s (%s) was removed from BuddyList.\n", buddy->username.c_str(), buddy->nick.c_str() )); + p->username = buddy->username; + p->handle = buddy->hcontact; // handle übergeben - dufte + entries->erase(i); + // i.erase(); + break; // we are done. + } + ++i; + } + break; + } + case XFIRE_RECV_STATUSMESSAGE_PACKET_ID: { + RecvStatusMessagePacket *status = (RecvStatusMessagePacket*) content; + + //status->entries=new PBuddyListEntry[status->sids->size]; + + for(uint i = 0 ; i < status->sids->size() ; i++) { + BuddyListEntry *entry = getBuddyBySid( status->sids->at(i) ); + //status->entries[i]=entry; + + if(entry == NULL) { + XERROR(( "No such Entry - Got StatusMessage from someone who is not in the buddylist ??\n" )); + return; + } + else + { + entry->statusmsg = status->msgs->at(i).c_str(); + setBuddyStatusMsg(entry,entry->statusmsg); //auf eine funktion reduziert, verringert cpuauslastung und beseitigt das + //das problem der fehlenden statusmsg + } + } + + break; + } + } + } + + BuddyListEntry::~BuddyListEntry() { + if(lastpopup) { + delete[] lastpopup; + lastpopup=NULL; + } + } + + BuddyListEntry::BuddyListEntry() { + memset(sid,0,16); + statusmsg = std::string(); + game = 0; + game2 = 0; + gameObj = NULL; + game2Obj = NULL; + hcontact = NULL; + clanid = 0; + lastpopup=NULL; + } + bool BuddyListEntry::isOnline() { + for(int i = 0 ; i < 16 ; i++) { + if(sid[i]) return true; + } + return false; + } + void BuddyListEntry::setSid(const char *sid) { + int s=0; + for(int i = 0 ; i < 16 ; i++) { //wenn buddy offline geht, seine gameinfos zurücksetzen - dufte + if(sid[i]) + { + s=1; + break; + } + } + if(s) + { + this->statusmsg = std::string(); + this->game = 0; + this->game2 = 0; + this->gameObj = NULL; + this->game2Obj = NULL; + } + memcpy(this->sid,sid,16); + } +}; + diff --git a/protocols/Xfire/src/buddylist.h b/protocols/Xfire/src/buddylist.h new file mode 100644 index 0000000000..7ab1e26878 --- /dev/null +++ b/protocols/Xfire/src/buddylist.h @@ -0,0 +1,100 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __BUDDYLIST_H +#define __BUDDYLIST_H + +#include <iostream> +#include <vector> + +#include "buddylistnamespacket.h" +#include "clanbuddylistnamespacket.h" +#include "buddylistgamespacket.h" +#include "buddylistonlinepacket.h" +#include "packetlistener.h" +#include "client.h" +#include "xfiregame.h" +#include "friendsoffriendlist.h" + + +namespace xfirelib { + using namespace std; + + struct Client; + struct BuddyListEntry; + + class BuddyList : public PacketListener { + public: + BuddyList(Client *client); + ~BuddyList(); + + vector <BuddyListEntry *> * getEntries() { return entries; } + vector <BuddyListEntry *> * getEntriesClan() { return entriesClan; } + + void receivedPacket(XFirePacket *packet); + BuddyListEntry *getBuddyById(long userid); + BuddyListEntry *getBuddyBySid(const char *sid); + BuddyListEntry *getBuddyByName(string username); + private: + void initEntries(BuddyListNamesPacket* buddynames); + void initEntriesClan(ClanBuddyListNamesPacket* buddynames); + void updateOnlineBuddies(BuddyListOnlinePacket* buddiesOnline); + void updateBuddiesGame(BuddyListGamesPacket* buddiesGames); + void updateFriendsofFriend(FriendsBuddyListNamesPacket* friends); + + Client *client; + vector <BuddyListEntry *> * entries; + vector <BuddyListEntry *> * entriesClan; + }; + + + class BuddyListEntry { + public: + BuddyListEntry(); + ~BuddyListEntry(); + bool isOnline(); + + void setSid(const char *sid); + + long userid; + char sid[16]; + string nick; + string username; + string statusmsg; + string gameinfo; + long game; + long game2; + HANDLE hcontact; + int clanid; + + //lastpopup + char* lastpopup; + + XFireGame *gameObj; + XFireGame *game2Obj; + }; + + typedef BuddyListEntry *PBuddyListEntry; +}; + + +#endif diff --git a/protocols/Xfire/src/buddylistgames2packet.cpp b/protocols/Xfire/src/buddylistgames2packet.cpp new file mode 100644 index 0000000000..2252339908 --- /dev/null +++ b/protocols/Xfire/src/buddylistgames2packet.cpp @@ -0,0 +1,39 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "buddylistgames2packet.h" +#include "xdebug.h" + +namespace xfirelib { + BuddyListGames2Packet::BuddyListGames2Packet() : BuddyListGamesPacket() { + + } + void BuddyListGames2Packet::parseContent(char *buf, int length, int numberOfAtts) { + XDEBUG( "....Parsing Packet Content of game 2 ??\n" ) + this->BuddyListGamesPacket::parseContent(buf,length,numberOfAtts); + XDEBUG2( "Parsed Packet Content of game 2 ??? ( %ld )\n", gameids->at(0) ) + } + +}; + diff --git a/protocols/Xfire/src/buddylistgames2packet.h b/protocols/Xfire/src/buddylistgames2packet.h new file mode 100644 index 0000000000..81fe92eecb --- /dev/null +++ b/protocols/Xfire/src/buddylistgames2packet.h @@ -0,0 +1,46 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#ifndef __BUDDYLISTGAMES2PACKET_H +#define __BUDDYLISTGAMES2PACKET_H + +#define XFIRE_BUDDYS_GAMES2_ID 147 + +#include "buddylistgamespacket.h" + +namespace xfirelib { + + class BuddyListGames2Packet : public BuddyListGamesPacket { + public: + BuddyListGames2Packet(); + XFirePacketContent* newPacket() { return new BuddyListGames2Packet(); } + virtual int getPacketId() { return XFIRE_BUDDYS_GAMES2_ID; } + virtual void parseContent(char *buf, int length, int numberOfAtts); + }; + +}; + + +#endif + diff --git a/protocols/Xfire/src/buddylistgamespacket.cpp b/protocols/Xfire/src/buddylistgamespacket.cpp new file mode 100644 index 0000000000..4ba878951b --- /dev/null +++ b/protocols/Xfire/src/buddylistgamespacket.cpp @@ -0,0 +1,144 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include <vector> +#include <string> + +#include "buddylistgamespacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + BuddyListGamesPacket::BuddyListGamesPacket() { + ips = 0; + ports = 0; + gameids = 0; + gameids2 = 0; + sids = 0; + type = 0; + } + BuddyListGamesPacket::~BuddyListGamesPacket() { + if(ips) { + for( vector<char*>::iterator it = ips->begin() ; + it != ips->end() ; it++) { + delete[] *it; + } + } + delete ips; + delete ports; + delete gameids; + delete gameids2; + delete sids; + } + + void BuddyListGamesPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + int numberOfSids = 0; + VariableValue val; + + index += val.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 03 + numberOfSids = (unsigned char) buf[index]; + index ++; // Ignore 00 + index ++; + sids = new vector<char *>; + for(int i = 0 ; i < numberOfSids ; i++) { + index += val.readValue(buf,index,16); + char *sid = new char[16]; + memcpy(sid,val.getValue(),16); + sids->push_back(sid); + } + + index += val.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 03 + numberOfSids = (unsigned char) buf[index]; + index ++; // Ignore 00 + index ++; + + gameids = new vector<long>; + gameids2 = new vector<long>; + for(int i = 0 ; i < numberOfSids ; i++) { + index += val.readValue(buf,index,2); + long game = val.getValueAsLong(); + index += val.readValue(buf,index,2); + long game2 = val.getValueAsLong(); + gameids->push_back(game); + gameids2->push_back(game2); + } + + index += val.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 03 + numberOfSids = (unsigned char) buf[index]; + index ++; // Ignore 00 + index ++; + + ips = new vector<char *>; + for(int i = 0 ; i < numberOfSids ; i++) { + index += val.readValue(buf,index,4); + char *ip = new char[4]; + memcpy(ip,val.getValue(),4); + ips->push_back(ip); + } + + index += val.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 03 + numberOfSids = (unsigned char) buf[index]; + index ++; // Ignore 00 + index ++; + +// static int was=0; +// int portwasnull=0; + + +// was++; + + ports = new vector<long>; + for(int i = 0 ; i < numberOfSids ; i++) { + index += val.readValue(buf,index,2); + long port = val.getValueAsLong(); +// if(port==0) +// { +// portwasnull=1; +// } + ports->push_back(port); + index += 2; // fixed port bug - dufte + } + +// char temp[512]; + /* sprintf(temp,"packet%d_%d.dmp",was,portwasnull); + FILE * f = fopen(temp,"wb"); + fwrite(buf,length,1,f); + fclose(f);*/ + + } + + +}; diff --git a/protocols/Xfire/src/buddylistgamespacket.h b/protocols/Xfire/src/buddylistgamespacket.h new file mode 100644 index 0000000000..ba0264c29e --- /dev/null +++ b/protocols/Xfire/src/buddylistgamespacket.h @@ -0,0 +1,61 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __BUDDYLISTGAMESPACKET_H +#define __BUDDYLISTGAMESPACKET_H + +#define XFIRE_BUDDYS_GAMES_ID 135 + +#include <vector> +#include <string> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + + +namespace xfirelib { + using namespace std; + + class BuddyListGamesPacket : public XFireRecvPacketContent { + public: + BuddyListGamesPacket(); + virtual ~BuddyListGamesPacket(); + + XFirePacketContent* newPacket() { return new BuddyListGamesPacket(); } + + virtual int getPacketId() { return XFIRE_BUDDYS_GAMES_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + virtual void parseContent(char *buf, int length, int numberOfAtts); + + vector<char *> *ips; + vector<long> *ports; + vector<long> *gameids; + vector<long> *gameids2; + vector<char *> *sids; + int type; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/buddylistnamespacket.cpp b/protocols/Xfire/src/buddylistnamespacket.cpp new file mode 100644 index 0000000000..80e962fe4d --- /dev/null +++ b/protocols/Xfire/src/buddylistnamespacket.cpp @@ -0,0 +1,104 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include <vector> +#include <string> + +#include "buddylistnamespacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + BuddyListNamesPacket::BuddyListNamesPacket() { + usernames = 0; + nicks = 0; + userids = 0; + } + BuddyListNamesPacket::~BuddyListNamesPacket() { + delete usernames; + delete nicks; + delete userids; + } + + void BuddyListNamesPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + //prüfe ob das packet mit 0x7 anfängt um eventuell crashes zufixen + if(buf[0]!=0x7) + { + usernames = new vector<string>; + nicks = new vector<string>; + userids = new vector<long>; + return; + } + + // friends + VariableValue friends; + index += friends.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 01, dufte skip 1 + + usernames = new vector<string>; + index = readStrings(usernames,buf,index); + + index += friends.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 01, dufte skip 1 + + nicks = new vector<string>; + index = readStrings(nicks,buf,index); + + index += friends.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 01, dufte skip 1 + + index += friends.readValue(buf,index,2); // 2 bytes lesen, für große mengen an friends + userids = new vector<long>; + int numberOfIds = friends.getValueAsLong(); + for(int i = 0 ; i < numberOfIds ; i++) { + index += friends.readValue(buf,index,4); + userids->push_back(friends.getValueAsLong()); + XDEBUG2( "UserID: %ld\n", friends.getValueAsLong() ); + } + } + + int BuddyListNamesPacket::readStrings(vector<string> *strings, char *buf, int index) { + VariableValue friends; + index += friends.readValue(buf,index,2); //jeweils 2 bytes lesen + //index ++; // Ignore 00 0 brauch nicht mehr geskippt werden + int numberOfStrings = friends.getValueAsLong(); + XDEBUG3( "name: %s numberOfStrings: %d\n", friends.getName().c_str(), numberOfStrings ); + for(int i = 0 ; i < numberOfStrings ; i++) { + int length = (unsigned char)buf[index++]; + index++; + index += friends.readValue(buf,index,length); + string stringvalue = string(friends.getValue(),length); + strings->push_back(stringvalue); + XDEBUG3( "String length: %2d : %s\n", length, stringvalue.c_str() ); + } + return index; + } + +}; diff --git a/protocols/Xfire/src/buddylistnamespacket.h b/protocols/Xfire/src/buddylistnamespacket.h new file mode 100644 index 0000000000..5c50f4f110 --- /dev/null +++ b/protocols/Xfire/src/buddylistnamespacket.h @@ -0,0 +1,61 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __BUDDYLISTNAMESPACKET_H +#define __BUDDYLISTNAMESPACKET_H + +#define XFIRE_BUDDYS_NAMES_ID 131 + +#include <vector> +#include <string> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + + +namespace xfirelib { + using namespace std; + + class BuddyListNamesPacket : public XFireRecvPacketContent { + public: + BuddyListNamesPacket(); + virtual ~BuddyListNamesPacket(); + + XFirePacketContent* newPacket() { return new BuddyListNamesPacket(); } + + int getPacketId() { return XFIRE_BUDDYS_NAMES_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + //private: + int readStrings(vector<string> *strings, char *buf, int index); + + vector<string> *usernames; + vector<string> *nicks; + vector<long> *userids; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/buddylistonlinepacket.cpp b/protocols/Xfire/src/buddylistonlinepacket.cpp new file mode 100644 index 0000000000..3dd726d4e9 --- /dev/null +++ b/protocols/Xfire/src/buddylistonlinepacket.cpp @@ -0,0 +1,85 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "stdafx.h" +#include "buddylistonlinepacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include <vector> +#include "xdebug.h" +#include <iostream> + +namespace xfirelib { + using namespace std; + + void BuddyListOnlinePacket::parseContent(char *buf, int length, int numberOfAtts) { + DUMPPACKET("BuddyListOnlinePacket") + XINFO(( "Got List of buddys that are online\n" )); + int index = 0; + // friends + VariableValue userid; + userids = new vector<long>; + + /* auskommentiert, wird nicht mehr gesendet 2.3.11 + index += userid.readName(buf,index); + */ + index ++; // Ignore 01 + index ++; // Ignore 04 + index ++; // Ignore 02 + + + int numberOfIds = (unsigned char)buf[index]; + index++; + index++;//ignore 00 + for(int i = 0 ; i < numberOfIds ; i++) { + index += userid.readValue(buf,index,4); + userids->push_back(userid.getValueAsLong()); + XINFO2( "UserID: %ld\n", userid.getValueAsLong() ); + } + + VariableValue sid; + sids = new vector<char *>; + /* auskommentiert, wird nicht mehr gesendet 2.3.11 + index += sid.readName(buf,index); */ + + index ++; // Ignore 03 + index ++; // Ignore 04 + index ++; // Ignore 03 + + + numberOfIds = (unsigned char)buf[index]; + index++; + index++;//ignore 00 + for(int i = 0 ; i < numberOfIds ; i++) { + index += userid.readValue(buf,index,16); + char *sid = new char[16]; + memcpy(sid,userid.getValue(),16); + sids->push_back(sid); + //for(int loop = 0; loop < userid.getValueLength();loop++){ + // XINFO(( "SID: %d\n", userid.getValue()[loop] )); + //} + } + + } + +}; diff --git a/protocols/Xfire/src/buddylistonlinepacket.h b/protocols/Xfire/src/buddylistonlinepacket.h new file mode 100644 index 0000000000..1f9b432b63 --- /dev/null +++ b/protocols/Xfire/src/buddylistonlinepacket.h @@ -0,0 +1,53 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __BUDDYLISTONLINEPACKET_H +#define __BUDDYLISTONLINEPACKET_H + +#include <vector> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + + +#define XFIRE_BUDDYS_ONLINE_ID 132 + +namespace xfirelib { +using namespace std; + class BuddyListOnlinePacket : public XFireRecvPacketContent { + public: + XFirePacketContent* newPacket() { return new BuddyListOnlinePacket(); } + + + int getPacketId() { return XFIRE_BUDDYS_ONLINE_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + vector<long> *userids; + vector<char *> *sids; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/clanbuddylistnamespacket.cpp b/protocols/Xfire/src/clanbuddylistnamespacket.cpp new file mode 100644 index 0000000000..2a1b4c77a6 --- /dev/null +++ b/protocols/Xfire/src/clanbuddylistnamespacket.cpp @@ -0,0 +1,112 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include <vector> +#include <string> + +#include "clanbuddylistnamespacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + ClanBuddyListNamesPacket::ClanBuddyListNamesPacket() { + usernames = 0; + nicks = 0; + userids = 0; + clanid = 0; + } + ClanBuddyListNamesPacket::~ClanBuddyListNamesPacket() { + delete usernames; + delete nicks; + delete userids; + } + + void ClanBuddyListNamesPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + + VariableValue friends; + + XDEBUG2( "Len: %ld\n", length ); + + index+=2; //paar bytes überspringen + + index += friends.readValue(buf,index,2); + this->clanid = friends.getValueAsLong(); + + index+=4; //paar bytes überspringen + + userids = new vector<long>; + + index += friends.readValue(buf,index); + + int numberOfIds = friends.getValueAsLong(); + + XDEBUG2( "numberofId: %ld\n", numberOfIds ); + + for(int i = 0 ; i < numberOfIds ; i++) { + index += friends.readValue(buf,index,4); + userids->push_back(friends.getValueAsLong()); + XDEBUG3( "UserID: %ld %ld\n",i+1, friends.getValueAsLong() ); + } + + XDEBUG2( "NextByte: %ld\n",buf[index] ); + XDEBUG2( "NextByte: %ld\n",buf[index+1] ); + + index+=3; //nächsten 3 skippen + + XDEBUG2( "NextByte: %ld\n",buf[index] ); + XDEBUG2( "NextByte: %ld\n",buf[index+1] ); + + usernames = new vector<string>; + index = readStrings(usernames,buf,index); + + index+=3; //nächsten 3 skippen + + nicks = new vector<string>; + index = readStrings(nicks,buf,index); + + } + + int ClanBuddyListNamesPacket::readStrings(vector<string> *strings, char *buf, int index) { + VariableValue friends; + index += friends.readValue(buf,index,2); + //index ++; // Ignore 00 + int numberOfStrings = friends.getValueAsLong(); + XDEBUG3( "name: %s numberOfStrings: %d\n", friends.getName().c_str(), numberOfStrings ); + for(int i = 0 ; i < numberOfStrings ; i++) { + int length = (unsigned char)buf[index++]; + index++; + index += friends.readValue(buf,index,length); + string stringvalue = string(friends.getValue(),length); + strings->push_back(stringvalue); + XDEBUG(( "String length: %2d : %s\n", length, stringvalue.c_str() )); + } + return index; + } + +}; diff --git a/protocols/Xfire/src/clanbuddylistnamespacket.h b/protocols/Xfire/src/clanbuddylistnamespacket.h new file mode 100644 index 0000000000..f47fc694f7 --- /dev/null +++ b/protocols/Xfire/src/clanbuddylistnamespacket.h @@ -0,0 +1,64 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __CLANBUDDYLISTNAMESPACKET_H +#define __CLANBUDDYLISTNAMESPACKET_H + +#define XFIRE_CLAN_BUDDYS_NAMES_ID 159 + +#include <vector> +#include <string> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + + +namespace xfirelib { + using namespace std; + + class ClanBuddyListNamesPacket : public XFireRecvPacketContent { + public: + ClanBuddyListNamesPacket(); + virtual ~ClanBuddyListNamesPacket(); + + XFirePacketContent* newPacket() { return new ClanBuddyListNamesPacket(); } + + int getPacketId() { return XFIRE_CLAN_BUDDYS_NAMES_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 10024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + //private: + int readStrings(vector<string> *strings, char *buf, int index); + + long clanid; + vector<string> *usernames; + vector<string> *nicks; + vector<long> *userids; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/claninvitationpacket.cpp b/protocols/Xfire/src/claninvitationpacket.cpp new file mode 100644 index 0000000000..08fb2b2267 --- /dev/null +++ b/protocols/Xfire/src/claninvitationpacket.cpp @@ -0,0 +1,138 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include <vector> +#include <string> + +#include "claninvitationpacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + ClanInvitationPacket::ClanInvitationPacket() { + } + ClanInvitationPacket::~ClanInvitationPacket() { + } + + void ClanInvitationPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + numberOfInv = 0; + VariableValue val; + + index+=0x3; //einige bytes überspringen + + numberOfInv=buf[index]; + XDEBUG2("Invs %d\n",numberOfInv); + + index+=2; // überspring 0 + + //clan id's überspringen, wird eh nicht gebraucht + for(int i=0;i<numberOfInv;i++) + index+=4; + + index++; // 0x72 überspringen + + index+=4; // weitere bytes überspringen + + //clanidnamen überspringen + for(int i=0;i<numberOfInv;i++) + { + int length = (unsigned char)buf[index++]; + index++; + index += val.readValue(buf,index,length); + string stringvalue = string(val.getValue(),length); + XDEBUG2("Clanidnames von %s\n",stringvalue.c_str()); + } + + //weitere 5 bytes überspringen + index+=5; + + for(int i=0;i<numberOfInv;i++) + { + int length = (unsigned char)buf[index++]; + index++; + index += val.readValue(buf,index,length); + string stringvalue = string(val.getValue(),length); + XDEBUG2("Inv von %s\n",stringvalue.c_str()); + clanname[i]=stringvalue; + } + + //weitere 5 bytes skippen + index+=5; + + //weitere leere bytes skippen, weis nich was für einen sinn haben + for(int i=0;i<numberOfInv;i++) + index+=4; + + //weitere 5 bytes skippen + index+=5; + + //usernames auslesen + for(int i=0;i<numberOfInv;i++) + { + int length = (unsigned char)buf[index++]; + index++; + index += val.readValue(buf,index,length); + string stringvalue = string(val.getValue(),length); + XDEBUG2("Usernames von %s\n",stringvalue.c_str()); + invitefromusername[i]=stringvalue; + } + + //nochmal weitere 5 bytes skippen + index+=5; + + //nicks auslesen + for(int i=0;i<numberOfInv;i++) + { + int length = (unsigned char)buf[index++]; + index++; + index += val.readValue(buf,index,length); + string stringvalue = string(val.getValue(),length); + XDEBUG2("Nicks von %s\n",stringvalue.c_str()); + invitefrom[i]=stringvalue; + } + + //nochmal weitere 5 bytes skippen + index+=5; + + //einladungen auslesen + for(int i=0;i<numberOfInv;i++) + { + int length = (unsigned char)buf[index++]; + index++; + index += val.readValue(buf,index,length); + string stringvalue = string(val.getValue(),length); + XDEBUG2("Nicks von %s\n",stringvalue.c_str()); + invitemsg[i]=stringvalue; + } + + } + + +}; diff --git a/protocols/Xfire/src/claninvitationpacket.h b/protocols/Xfire/src/claninvitationpacket.h new file mode 100644 index 0000000000..b595c5ba9c --- /dev/null +++ b/protocols/Xfire/src/claninvitationpacket.h @@ -0,0 +1,61 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __CLANINVITATION_H +#define __CLANINVITATION_H + +#define XFIRE_CLANINVITATION_ID 165 + +#include <string> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + +namespace xfirelib { + using namespace std; + + class ClanInvitationPacket : public XFireRecvPacketContent { + public: + ClanInvitationPacket(); + virtual ~ClanInvitationPacket(); + + XFirePacketContent* newPacket() { return new ClanInvitationPacket(); } + + virtual int getPacketId() { return XFIRE_CLANINVITATION_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + virtual void parseContent(char *buf, int length, int numberOfAtts); + + //maximal 10 inv, mehr wird denk ich äh nich aufeinmal auftreten + string clanname[10]; + string invitefrom[10]; + string invitefromusername[10]; + string invitemsg[10]; + + int numberOfInv; + }; +}; + +#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/client.cpp b/protocols/Xfire/src/client.cpp new file mode 100644 index 0000000000..4800482e27 --- /dev/null +++ b/protocols/Xfire/src/client.cpp @@ -0,0 +1,296 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "xdebug.h" +#include "client.h" +#include "clientinformationpacket.h" +#include "clientversionpacket.h" +#include "xfirepacket.h" +#include "authpacket.h" +#include "clientloginpacket.h" +#include "buddylistnamespacket.h" +#include "messagepacket.h" +#include "sendmessagepacket.h" +#include "messageackpacket.h" +#include "recvoldversionpacket.h" +#include "sendkeepalivepacket.h" + +#include "baseProtocol.h" + +#include <iostream> + +//#define XFIRE_HOST "cs.xfire.com" +#define XFIRE_HOST "206.220.42.147" +#define XFIRE_PORT 25999 + +extern BOOL mySleep(int ms,HANDLE evt); +extern HANDLE hConnectionClose; +extern WINBASEAPI
+BOOL
+WINAPI
+ResetEvent(
+ __in HANDLE hEvent
+ ); + +//#define UINT_8 unsigned char +//#define UINT_32 unsigned long + +namespace xfirelib { + +using namespace std; + + Client::Client() { + XDEBUG(("Client constructor ...\n")); + gameResolver = NULL; + packetReader = new PacketReader(NULL); + packetReader->addPacketListener( this ); + buddyList = new BuddyList( this ); + socket=NULL; +#ifndef NO_PTHREAD + sendpingthread.p=NULL; + readthread.p=NULL; +#endif + } + + Client::~Client(){ + XDEBUG(("Client destructor ...\n")); + delete username; + delete password; + delete buddyList; + delete packetReader; + delete socket; + } + + void Client::connect( string username, string password, int useproxy, string proxyip, int proxyport) { + try { + this->gotBudduyList=FALSE; + this->username = new string(username); + this->password = new string(password); + socket = new Socket( XFIRE_HOST, XFIRE_PORT,useproxy,proxyip,proxyport ); + + //bevors losgeht, erstmal die localaddr sichern + struct sockaddr_in sa;
+ int iLen = sizeof(sa);
+ getsockname(socket->m_sock, (SOCKADDR*)&sa, &iLen);
+ strcpy(this->localaddr,inet_ntoa(sa.sin_addr)); + this->llocaladdr=inet_addr(this->localaddr); + + packetReader->setSocket(socket); + + ResetEvent(hConnectionClose); + + startThreads(); + //packetReader->startListening(); + + + socket->send("UA01"); + XDEBUG(("Sent UA01\n")); + ClientInformationPacket *infoPacket = new ClientInformationPacket(); + this->send( infoPacket ); + delete infoPacket; + XINFO(("sent ClientInformationPacket\n")); + + ClientVersionPacket *versionPacket = new ClientVersionPacket(); + versionPacket->setProtocolVersion( protocolVersion); + this->send( versionPacket ); + delete versionPacket; + + XINFO(("sent ClientVersionPacket\n")); + this->connected=TRUE; + } catch( SocketException ex ) { + XERROR(("Socket Exception ?! %s \n",ex.description().c_str() )); + this->connected=FALSE; + } + } + XFireGameResolver *Client::getGameResolver() { + return gameResolver; + } + void Client::startThreads() { + XINFO(("About to start thread\n")); +#ifndef NO_PTHREAD + void* (*func)(void*) = &xfirelib::Client::startReadThread; + pthread_create( &readthread, NULL, func, (void*)this ); + void* (*func2)(void*) = &xfirelib::Client::startSendPingThread; + pthread_create( &sendpingthread, NULL, func2, (void*)this ); +#else + //mir_create!!!! + mir_forkthread(xfirelib::Client::startReadThread,(LPVOID)this); + mir_forkthread(xfirelib::Client::startSendPingThread,(LPVOID)this); +#endif + } +#ifndef NO_PTHREAD + void *Client::startReadThread(void *ptr) { +#else + void Client::startReadThread(LPVOID lParam) { + void* ptr=(void*)lParam; +#endif + if(ptr==NULL||((Client*)ptr)->packetReader==NULL) +#ifndef NO_PTHREAD + return NULL; +#else + return; +#endif + try { + ((Client*)ptr)->packetReader->run(); + } catch (SocketException ex) { + XERROR(("Socket Exception ?! %s \n",ex.description().c_str() )); + + //miranda bescheid geben, wir haben verbindung verloren + if(ptr==NULL||((Client*)ptr)->connected) SetStatus(ID_STATUS_OFFLINE,NULL); + + //((Client*)ptr)->disconnect(); + } +#ifndef NO_PTHREAD + return NULL; +#else + return; +#endif + } + +#ifndef NO_PTHREAD + void *Client::startSendPingThread(void *ptr) { + Client *me = (Client*)ptr; +#else + void Client::startSendPingThread(LPVOID lParam) { + Client *me = (Client*)lParam; +#endif + SendKeepAlivePacket packet; + + while(1) { +#ifndef NO_PTHREAD + pthread_testcancel(); +#endif + //Sleep(60000); // Sleep for 40 sek + if(mySleep(60000,hConnectionClose))
+ {
+#ifndef NO_PTHREAD
+ return NULL;
+#else
+ return;
+#endif
+ } +#ifndef NO_PTHREAD + pthread_testcancel(); +#endif + XDEBUG(( "Sending KeepAlivePacket\n" )); + if(!me->send( &packet )) { + XINFO(( "Could not send KeepAlivePacket... exiting thread.\n" )); + break; + } + } +#ifndef NO_PTHREAD
+ return NULL;
+#else
+ return;
+#endif
+ } + + void Client::disconnect() { + this->connected=FALSE; + + //socket vom packetreader auf NULL, damit die readschleife geschlossen wird + if(this->packetReader!=NULL) + this->packetReader->setSocket(NULL); + + XDEBUG( "cancelling readthread ... \n"); +#ifndef NO_PTHREAD + if(readthread.p!=NULL) pthread_cancel (readthread); + readthread.p=NULL; + + XDEBUG( "cancelling sendpingthread ... \n"); + if(sendpingthread.p!=NULL) pthread_cancel (sendpingthread); + sendpingthread.p=NULL; +#endif + + XDEBUG( "deleting socket ...\n" ); + if(socket){ + delete socket; + socket = NULL; + } + XDEBUG(( "done\n" )); + } + + bool Client::send( XFirePacketContent *content ) { + if(!socket) { + XERROR(( "Trying to send content packet altough socket is NULL ! (ignored)\n" )); + return false; + } + XFirePacket *packet = new XFirePacket(content); + packet->sendPacket( socket ); + delete packet; + return true; + } + + void Client::addPacketListener( PacketListener *listener ) { + packetReader->addPacketListener( listener ); + } + + + void Client::receivedPacket( XFirePacket *packet ) { + XDEBUG(("Client::receivedPacket\n")); + if( packet == NULL ) { + XERROR(("packet is NULL !!!\n")); + return; + } + if( packet->getContent() == NULL ) { + XERROR(("ERRRR getContent() returns null ?!\n")); + return; + } + XFirePacketContent *content = packet->getContent(); + + switch( content->getPacketId() ) { + case XFIRE_PACKET_AUTH_ID: { + XINFO(("Got Auth Packet .. Sending Login\n")); + AuthPacket *authPacket = (AuthPacket*)packet->getContent(); + + ClientLoginPacket *login = new ClientLoginPacket(); + login->setSalt( authPacket->getSalt() ); + login->setUsername( *username ); + login->setPassword( *password ); + send( login ); + delete login; + break; + } + + case XFIRE_MESSAGE_ID: { + XDEBUG(( "Got Message, sending ACK\n" )); + MessagePacket *message = (MessagePacket*)packet->getContent(); + if(message->getMessageType() == 0){ + MessageACKPacket *ack = new MessageACKPacket(); + memcpy(ack->sid,message->getSid(),16); + ack->imindex = message->getImIndex(); + send( ack ); + delete ack; + }else if(message->getMessageType() == 2){ + send(message); + } + break; + } + + default: + //cout << "Nothing here ... " << endl; + break; + } + + } +}; diff --git a/protocols/Xfire/src/client.h b/protocols/Xfire/src/client.h new file mode 100644 index 0000000000..5822c6c27e --- /dev/null +++ b/protocols/Xfire/src/client.h @@ -0,0 +1,96 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __CLIENT_H +#define __CLIENT_H + +#include "stdafx.h" + +#ifndef NO_PTHREAD + #include <pthread.h> +#endif + +#include <string> +#include "packetreader.h" +#include "xfirepacketcontent.h" +#include "packetlistener.h" +#include "buddylist.h" +#include "xfiregameresolver.h" + +namespace xfirelib { + struct BuddyList; + +class Client : public PacketListener { + public: + Client(); + ~Client(); + //proxy hinzugefügt dufte + void connect(std::string username, std::string password,int useproxy=0,string proxyip="",int proxyport=0); + /** + * Sends a XFirePacketContent (does NOT delete content) + * Returns true if sent successfully. + */ + bool send(XFirePacketContent *content); + + BuddyList *getBuddyList() { return buddyList; } + void addPacketListener(PacketListener *packetListener); + void disconnect(); + void sendMessage(string username, string message); + void sendNickChange(string nick); + XFireGameResolver *getGameResolver(); + void setGameResolver(XFireGameResolver *resolver) { + delete this->gameResolver; + this->gameResolver = resolver; + } + + BOOL gotBudduyList; + BOOL connected; + char protocolVersion; + char localaddr[18]; + unsigned long llocaladdr; + + protected: + void receivedPacket( XFirePacket *packet ); + void startThreads(); +#ifndef NO_PTHREAD + static void *startReadThread(void *ptr); + static void *startSendPingThread(void *ptr); +#else + static void startReadThread(LPVOID lParam); + static void startSendPingThread(LPVOID lParam); +#endif + private: + XFireGameResolver *gameResolver; + PacketReader *packetReader; + std::string *username; + std::string *password; + Socket *socket; + BuddyList *buddyList; +#ifndef NO_PTHREAD + pthread_t readthread; + pthread_t sendpingthread; +#endif +}; + +}; + +#endif diff --git a/protocols/Xfire/src/clientinformationpacket.cpp b/protocols/Xfire/src/clientinformationpacket.cpp new file mode 100644 index 0000000000..f0d65e8a00 --- /dev/null +++ b/protocols/Xfire/src/clientinformationpacket.cpp @@ -0,0 +1,77 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "clientinformationpacket.h" +#include "xfireutils.h" +#include <string.h> +#include <iostream> + +namespace xfirelib { + using namespace std; + + int ClientInformationPacket::getPacketContent(char *packet) { + int index = 0; + int skins = 2; + int i; + + index = XFireUtils::addAttributName(packet,index, "skin");/*add skin*/ + packet[index++] = 0x04; + packet[index++] = 0x01; + packet[index++] = (char)skins; + packet[index++] = 0x00; + packet[index++] = strlen("Standard"); + packet[index++] = 0x00; + + memcpy(packet+index,"Standard",strlen("Standard"));/*add first skin name*/ + index += strlen("Standard"); + + packet[index++] = strlen("XFire"); + packet[index++] = 0x00; + + memcpy(packet+index,"XFire",strlen("XFire"));/*add second skin name*/ + index += strlen("XFire"); + + VariableValue val; + val.setName( "version" ); + index += val.writeName( packet, index ); + //index = XFireUtils::addAttributName(packet,index, "version");/*add version of skins*/ + packet[index++] = 0x04; + packet[index++] = 0x02; + packet[index++] = (char)skins; + packet[index++] = 0x00; + + for(i = 0;i < skins;i++){/*(forEachSkin){ 01 00 00 00 }*/ + packet[index++] = 0x01; + packet[index++] = 0x00; + packet[index++] = 0x00; + packet[index++] = 0x00; + } + length = index; + return index; + } + + int ClientInformationPacket::getPacketAttributeCount() { + return 2; + } + +} diff --git a/protocols/Xfire/src/clientinformationpacket.h b/protocols/Xfire/src/clientinformationpacket.h new file mode 100644 index 0000000000..533e3fbc91 --- /dev/null +++ b/protocols/Xfire/src/clientinformationpacket.h @@ -0,0 +1,55 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#ifndef __CLIENTINFORMATIONPACKET_H +#define __CLIENTINFORMATIONPACKET_H + +#include "xfiresendpacketcontent.h" +#include "variablevalue.h" + +#include <string> + +namespace xfirelib { + + /** + * (Internal) packet used by Client::login( std::string, std::string ) + * Users of xfirelib won't need this packet. + */ + class ClientInformationPacket : public XFireSendPacketContent { + public: + XFirePacketContent* newPacket() { return new ClientInformationPacket(); } + + int getPacketId() { return 18; } + int getPacketContent(char *buf); + int getPacketAttributeCount(); + int getPacketSize() { return 46; }; + void parseContent(char *buf, int length, int numberOfAtts) { }; + std::string skinname; + private: + int length; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/clientloginpacket.cpp b/protocols/Xfire/src/clientloginpacket.cpp new file mode 100644 index 0000000000..30a28cc7eb --- /dev/null +++ b/protocols/Xfire/src/clientloginpacket.cpp @@ -0,0 +1,120 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "clientloginpacket.h" +#include "xfireutils.h" +#include "SHA1.h" +#include <string.h> +#include <iostream> + +namespace xfirelib { + using namespace std; + + int ClientLoginPacket::getPacketContent(char *packet) { + int index = 0; + /*Username*/ + + index = XFireUtils::addAttributName(packet,index, "name");/*add username attribute*/ + packet[index] = 0x01; + packet[index+1] = (char)name.length(); + packet[index+2] = 0x00; + index +=3; + std::copy(name.begin(),name.end(),packet+index); + index += name.size(); + + /*Crypted Password*/ + unsigned char pass[41]; + pass[40] = 0x00; + cryptPassword(pass); + index = XFireUtils::addAttributName(packet,index, "password");/*add username attribute*/ + packet[index] = 0x01; + packet[index+1] = (char)40; + packet[index+2] = 0x00; + index += 3; + + memcpy(packet+index,pass,40); + index += 40; + + VariableValue val; + val.setName( "flags" ); + index += val.writeName( packet, index ); + packet[index++] = 0x02; + packet[index++] = 0x00; + packet[index++] = 0x00; + packet[index++] = 0x00; + packet[index++] = 0x00; + + val.setName( "sid" ); + index += val.writeName( packet, index ); + packet[index++] = 0x03; + + for(int i=0;i<16;i++) + { + packet[index++] = 0x0; + } + + length = index; + return index; + } + + int ClientLoginPacket::getPacketAttributeCount() { + return 3; + } + + void ClientLoginPacket::cryptPassword(unsigned char *crypt){ + std::string total; + char temp[81]; + CSHA1 sha1; + + total = name+password+"UltimateArena"; + hashSha1(total.c_str(),crypt); + memcpy(temp,crypt,40); + memcpy(temp+40,salt->getValue(),40); + temp[80] = 0x00; + + hashSha1(temp,crypt); + } + + + +/*give string and you will get the hash*/ +void ClientLoginPacket::hashSha1(const char *string, unsigned char *sha){ + + char result[41]; + unsigned char temp[1024]; + CSHA1 sha1; + sha1.Reset(); + sha1.Update((UINT_8 *)string, strlen(string)); + sha1.Final(); + sha1.GetHash(temp); + + result[0] = 0; + char szTemp[16]; + for(int i = 0 ; i < 20 ; i++) { + sprintf(szTemp, "%02x", temp[i]); + strcat(result,szTemp); + } + memcpy(sha,result,40); + sha[40] = 0x00; +} +} diff --git a/protocols/Xfire/src/clientloginpacket.h b/protocols/Xfire/src/clientloginpacket.h new file mode 100644 index 0000000000..56f8641b25 --- /dev/null +++ b/protocols/Xfire/src/clientloginpacket.h @@ -0,0 +1,71 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#ifndef __CLIENTLOGINPACKET_H +#define __CLIENTLOGINPACKET_H + + + +#include "xfiresendpacketcontent.h" +#include "variablevalue.h" +#include <string.h> + +namespace xfirelib { + + /** + * (Internal) Packet used to send login/authorization data. + * Users of xfirelib should not use it, call + * Client::connect( std::string username, std::string password ) + * instead. + */ + class ClientLoginPacket : public XFireSendPacketContent { + public: + XFirePacketContent* newPacket() { return new ClientLoginPacket(); } + + int getPacketId() { return 1; } + int getPacketContent(char *buf); + int getPacketAttributeCount(); + int getPacketSize() { return 1024; }; + void setUsername(std::string name) {this->name = name;} + void setPassword(std::string password) {this->password = password; }; + + /** + *Set the salt the server sent us to crypt the password + *@param salt The VariableValue object that we extracted from the packet + */ + void setSalt(VariableValue *salt) {this->salt = salt; }; + + void parseContent(char *buf, int length, int numberOfAtts) { }; + private: + void cryptPassword(unsigned char *crypt); + void hashSha1(const char *string, unsigned char *sha); + int length; + std::string name; + std::string password; + VariableValue *salt; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/clientversionpacket.cpp b/protocols/Xfire/src/clientversionpacket.cpp new file mode 100644 index 0000000000..3150eac746 --- /dev/null +++ b/protocols/Xfire/src/clientversionpacket.cpp @@ -0,0 +1,52 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "clientversionpacket.h" +#include "xfireutils.h" +#include <string.h> + +namespace xfirelib { + + int ClientVersionPacket::getPacketContent(char *packet) { + int index = 0; + + index = XFireUtils::addAttributName(packet,index, "version");/*add xfire version*/ + packet[index] = 0x02; + packet[index+1] = (char) version;//protocol version + packet[index+2] = 0x00; + packet[index+3] = 0x00; + packet[index+4] = 0x00; + index += 5; + length = index; + return index; + } + + int ClientVersionPacket::getPacketAttributeCount() { + return 1; + } + + void ClientVersionPacket::setProtocolVersion(int newVersion){ + version = newVersion; + } + +} diff --git a/protocols/Xfire/src/clientversionpacket.h b/protocols/Xfire/src/clientversionpacket.h new file mode 100644 index 0000000000..4c40b1875a --- /dev/null +++ b/protocols/Xfire/src/clientversionpacket.h @@ -0,0 +1,54 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#ifndef __CLIENTVERSIONPACKET_H +#define __CLIENTVERSIONPACKET_H + +#include "xfiresendpacketcontent.h" + +namespace xfirelib { + + /** + * (Internal) Packet used to send client version information. + * it is sent in Client::connect( std::string, std::string ) + * so users of xfirelib won't need this packet. + */ + class ClientVersionPacket : public XFireSendPacketContent { + public: + XFirePacketContent* newPacket() { return new ClientVersionPacket(); } + + int getPacketId() { return 3; } + int getPacketContent(char *buf); + int getPacketAttributeCount(); + int getPacketSize() { return 1024; }; + void setProtocolVersion(int version); + void parseContent(char *buf, int length, int numberOfAtts) { }; + private: + int length; + int version; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/dummyxfiregameresolver.cpp b/protocols/Xfire/src/dummyxfiregameresolver.cpp new file mode 100644 index 0000000000..5189c8ef9b --- /dev/null +++ b/protocols/Xfire/src/dummyxfiregameresolver.cpp @@ -0,0 +1,49 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "dummyxfiregameresolver.h" +#include "xdebug.h" + +namespace xfirelib { + + XFireGame *DummyXFireGameResolver::resolveGame(int gameid, int iterator, BuddyListGamesPacket *packet) { + XDEBUG2( "Resolving GameId: %d\n", gameid ); + DummyXFireGame *game = new DummyXFireGame(); + switch(gameid) { + case 2: game->init( gameid, "America's Army: Special Forces", packet,iterator ); break; + case 3: game->init( gameid, "Unreal Tournament", packet,iterator ); break; + case 4: game->init( gameid, "Unreal Tournament 2003", packet ,iterator); break; + case 5: game->init( gameid, "Counter-Strike 1.6", packet ,iterator); break; + case 32: game->init( gameid, "Teamspeak", packet ,iterator); break; + case 4181: game->init( gameid, "Unreal Tournament 2004", packet,iterator ); break; + case 4578: game->init( gameid, "Battlefield 2", packet ,iterator); break; + case 4611: game->init( gameid, "Live for Speed", packet,iterator ); break; + default: + game->init( gameid, "Non Resolvegame", packet,iterator ); + break; + } + return game; + } + + +}; diff --git a/protocols/Xfire/src/dummyxfiregameresolver.h b/protocols/Xfire/src/dummyxfiregameresolver.h new file mode 100644 index 0000000000..fdaaeb5c0b --- /dev/null +++ b/protocols/Xfire/src/dummyxfiregameresolver.h @@ -0,0 +1,69 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __DUMMYXFIREGAMERESOLVER_H +#define __DUMMYXFIREGAMERESOLVER_H + +#include "xfiregame.h" +#include "xfiregameresolver.h" +#include "xdebug.h" +#include <string> + +namespace xfirelib { + + struct DummyXFireGame; + class DummyXFireGameResolver : public XFireGameResolver { + public: + XFireGame *resolveGame(int gameid, int iterator, BuddyListGamesPacket *packet); + + }; + + + class DummyXFireGame : public XFireGame { + public: + // TODO !!!!!!!!!!!!! this->packet = packet should NOT be used !! + // we need to create a copy of packet, because it will be deleted as soon + // as all listeners are notified !!! + void init(int gameid, std::string gamename, BuddyListGamesPacket *packet, int iterator) { + this->gameid = gameid; + this->gamename = gamename; + this->packet = packet; + + memcpy(ip,packet->ips->at(iterator),4); + port = packet->ports->at(iterator); + XDEBUG(( "init .. %d / %s\n", gameid, gamename.c_str() )); + } + + int getGameId() { return gameid; } + std::string getGameName() { return gamename; } + + BuddyListGamesPacket *packet; + int gameid; + char ip[4]; + long port; + std::string gamename; + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/friendsoffriendlist.cpp b/protocols/Xfire/src/friendsoffriendlist.cpp new file mode 100644 index 0000000000..bb2c4f884f --- /dev/null +++ b/protocols/Xfire/src/friendsoffriendlist.cpp @@ -0,0 +1,111 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include <vector> +#include <string> + +#include "friendsoffriendlist.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + FriendsBuddyListNamesPacket::FriendsBuddyListNamesPacket() { + usernames = 0; + nicks = 0; + userids = 0; + } + FriendsBuddyListNamesPacket::~FriendsBuddyListNamesPacket() { + delete usernames; + delete nicks; + delete userids; + } + + void FriendsBuddyListNamesPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + + VariableValue friends; + + XDEBUG2( "Len: %ld\n", length ); + + index+=8; //paar bytes überspringen + + int numberOfIds = (unsigned char)buf[index]; + XDEBUG2( "numberofId: %ld\n", numberOfIds ); + index++; + index++;//ignore 00 + sids = new vector<char *>; + for(int i = 0 ; i < numberOfIds ; i++) { + index += friends.readValue(buf,index,16); + char *sid = new char[16]; + memcpy(sid,friends.getValue(),16); + sids->push_back(sid); + } + + XERROR("Sids ausgelesen\n"); + + index+=7; + + index+=4; + + userids = new vector<long>; + for(int i = 0 ; i < numberOfIds ; i++) { + index += friends.readValue(buf,index,4); + userids->push_back(friends.getValueAsLong()); + XDEBUG3( "UserID: %ld %ld\n",i+1, friends.getValueAsLong() ); + } + + index+=7; + + usernames = new vector<string>; + index = readStrings(usernames,buf,index); + + index+=7; + + nicks = new vector<string>; + index = readStrings(nicks,buf,index); + + } + + int FriendsBuddyListNamesPacket::readStrings(vector<string> *strings, char *buf, int index) { + VariableValue friends; + index += friends.readValue(buf,index,2); + //index ++; // Ignore 00 + int numberOfStrings = friends.getValueAsLong(); + XDEBUG3( "name: %s numberOfStrings: %d\n", friends.getName().c_str(), numberOfStrings ); + for(int i = 0 ; i < numberOfStrings ; i++) { + int length = (unsigned char)buf[index++]; + index++; + index += friends.readValue(buf,index,length); + string stringvalue = string(friends.getValue(),length); + strings->push_back(stringvalue); + XDEBUG(( "String length: %2d : %s\n", length, stringvalue.c_str() )); + } + return index; + } + +}; diff --git a/protocols/Xfire/src/friendsoffriendlist.h b/protocols/Xfire/src/friendsoffriendlist.h new file mode 100644 index 0000000000..70c59a76e9 --- /dev/null +++ b/protocols/Xfire/src/friendsoffriendlist.h @@ -0,0 +1,64 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __FRIENDSBUDDYLISTNAMESPACKET_H +#define __FRIENDSBUDDYLISTNAMESPACKET_H + +#define XFIRE_FRIENDS_BUDDYS_NAMES_ID 0x88 + +#include <vector> +#include <string> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + + +namespace xfirelib { + using namespace std; + + class FriendsBuddyListNamesPacket : public XFireRecvPacketContent { + public: + FriendsBuddyListNamesPacket(); + virtual ~FriendsBuddyListNamesPacket(); + + XFirePacketContent* newPacket() { return new FriendsBuddyListNamesPacket(); } + + int getPacketId() { return XFIRE_FRIENDS_BUDDYS_NAMES_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 10024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + //private: + int readStrings(vector<string> *strings, char *buf, int index); + + vector<string> *usernames; + vector<string> *nicks; + vector<long> *userids; + vector<char *> *sids; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/gameinfopacket.cpp b/protocols/Xfire/src/gameinfopacket.cpp new file mode 100644 index 0000000000..a134af85c9 --- /dev/null +++ b/protocols/Xfire/src/gameinfopacket.cpp @@ -0,0 +1,85 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include <vector> +#include <string> + +#include "gameinfopacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + GameInfoPacket::GameInfoPacket() { + } + GameInfoPacket::~GameInfoPacket() { + } + + void GameInfoPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + int numberOfSids = 0; + VariableValue val; + + index += val.readName(buf,index); + + index++; //ignore 04 + index++; //ignore 03 + + XDEBUG2("Anzahl: %d\n",buf[index]); + numberOfSids = buf[index]; + + index++; //ignore 01 + index++; //ignore 0 + + sids = new vector<char *>; + for(int i = 0 ; i < numberOfSids ; i++) { + index += val.readValue(buf,index,16); + char *sid = new char[16]; + memcpy(sid,val.getValue(),16); + sids->push_back(sid); + } + index += val.readName(buf,index); + + index += 4; // nächsten 4 bytes skippen + + gameinfo=new vector<string>; + for(int i = 0 ; i < numberOfSids ; i++) { + int length = (unsigned char)buf[index++]; + index++; + index += val.readValue(buf,index,length); + string stringvalue = string(val.getValue(),length); + gameinfo->push_back(stringvalue); + XDEBUG(( "String length: %2d : %s\n", length, stringvalue.c_str() )); + } + + XDEBUG2("Position: %d\n",index); + + } + + +}; diff --git a/protocols/Xfire/src/gameinfopacket.h b/protocols/Xfire/src/gameinfopacket.h new file mode 100644 index 0000000000..dfd890e814 --- /dev/null +++ b/protocols/Xfire/src/gameinfopacket.h @@ -0,0 +1,56 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __GAMEINFOPACKET_H +#define __GAMEINFOPACKET_H + +#define XFIRE_GAMEINFO_ID 156 + +#include <string> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + +namespace xfirelib { + using namespace std; + + class GameInfoPacket : public XFireRecvPacketContent { + public: + GameInfoPacket(); + virtual ~GameInfoPacket(); + + XFirePacketContent* newPacket() { return new GameInfoPacket(); } + + virtual int getPacketId() { return XFIRE_GAMEINFO_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + virtual void parseContent(char *buf, int length, int numberOfAtts); + + vector<char *> *sids; + vector<string> *gameinfo; + }; +}; + +#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/getbuddyinfo.cpp b/protocols/Xfire/src/getbuddyinfo.cpp new file mode 100644 index 0000000000..6d21742510 --- /dev/null +++ b/protocols/Xfire/src/getbuddyinfo.cpp @@ -0,0 +1,56 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "getbuddyinfo.h" +#include <string.h> +#include <iostream> + +/* + mit dem paket kan man buddyinfos anfordern, bei zu aggressiven anfragen kappt xfire die verbindung + getestet mit clanbuddy's >270 members +*/ + +namespace xfirelib { + using namespace std; + + int GetBuddyInfo::getPacketContent(char *packet) { + int index = 0; + + VariableValue val; + val.setValueFromLong(userid,4); + + packet[index++] = 0x01; + packet[index++] = 0x02; + index += val.writeValue(packet, index); + + length = index; + return index; + } + + int GetBuddyInfo::getPacketAttributeCount() { + return 1; + } + +} diff --git a/protocols/Xfire/src/getbuddyinfo.h b/protocols/Xfire/src/getbuddyinfo.h new file mode 100644 index 0000000000..efd8ded51d --- /dev/null +++ b/protocols/Xfire/src/getbuddyinfo.h @@ -0,0 +1,55 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +//mit dem packet kann man die buddyinfos anfordern + +#ifndef __GETBUDDYINFO_H +#define __GETBUDDYINFO_H + +#include "xfiresendpacketcontent.h" +#include "variablevalue.h" + +#include <string> + +namespace xfirelib { + + class GetBuddyInfo : public XFireSendPacketContent { + public: + XFirePacketContent* newPacket() { return new GetBuddyInfo(); } + + int getPacketId() { return 0x25; } + int getPacketContent(char *buf); + int getPacketAttributeCount(); + int getPacketSize() { return 1000; }; + void parseContent(char *buf, int length, int numberOfAtts) { }; + + unsigned int userid; + + private: + int length; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/iniupdater.cpp b/protocols/Xfire/src/iniupdater.cpp new file mode 100644 index 0000000000..61b99884ed --- /dev/null +++ b/protocols/Xfire/src/iniupdater.cpp @@ -0,0 +1,128 @@ +//iniupdater.cpp by dufte, großen dank an xfireplus.com
+
+#include "stdafx.h"
+
+#include "iniupdater.h"
+#include "baseProtocol.h"
+
+extern HANDLE XFireWorkingFolder;
+extern HANDLE XFireIconFolder;
+
+BOOL CALLBACK DlgUpdateDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+
+ char*buf=NULL; //leeren zeiger für den empfangen buffer
+ GetWWWContent2(INI_WHATSNEW,NULL,FALSE,&buf);
+
+ if(buf!=NULL)
+ {
+ SetDlgItemText(hwndDlg,IDC_UPDATEGAMES,buf);
+ delete[] buf;
+ }
+
+ SetFocus(GetDlgItem(hwndDlg,IDOK));
+
+ return TRUE;
+ }
+ case WM_COMMAND:
+ switch (LOWORD(wParam))
+ {
+ case IDOK:
+ EndDialog(hwndDlg,IDOK);
+ return TRUE;
+
+ case IDCANCEL:
+ EndDialog(hwndDlg,IDCANCEL);
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+void UpdateMyXFireIni(LPVOID dummy) {
+ char request[1024];
+ char file[1024];
+ char file2[1024];
+ char file3[1024];
+
+ //ini pfad rausbekommen
+ FoldersGetCustomPath( XFireWorkingFolder, file, 1024, "" );
+ strcat(file,"\\");
+ strcpy(file2,file);
+ strcpy(file3,file);
+ strcat(file,"xfire_games.new");
+ strcat(file2,"xfire_games.ini");
+ strcat(file3,"xfire_games.old");
+
+ sprintf_s(request,1024,"%s%d",INI_URLREQUEST,getfilesize(file2));
+
+ if(CheckWWWContent(request))
+ {
+ if(DBGetContactSettingByte(NULL,protocolname,"dontaskforupdate",0)==1||DialogBox(hinstance,MAKEINTRESOURCE(IDD_UPDATE),NULL,DlgUpdateDialogProc)==IDOK)
+ {
+ if(GetWWWContent2(request,file,FALSE))
+ {
+ //altes backup löschen
+ remove(file3);
+ //derzeitige ini und sichern
+ rename(file2,file3);
+ //lösche .old, wenn aktiv
+ if(DBGetContactSettingByte(NULL,protocolname,"nobackupini",0))
+ remove(file3);
+ //neue aktiv schalten
+ rename(file,file2);
+
+ if(DBGetContactSettingByte(NULL,protocolname,"dontaskforupdate",0)==0) MSGBOX(Translate("The xfire_games.ini was updated."));
+ }
+ else
+ MSGBOX(Translate("Error during xfire_games Update."));
+ }
+ }
+}
+
+void UpdateMyIcons(LPVOID dummy) {
+ char request[1024];
+ char file[1024];
+ char file2[1024];
+ char file3[1024];
+
+ //ini pfad rausbekommen
+ FoldersGetCustomPath( XFireIconFolder, file, 1024, "" );
+ strcat(file,"\\");
+ strcpy(file2,file);
+ strcpy(file3,file);
+ strcat(file,"icons.new");
+ strcat(file2,"icons.dll");
+ strcat(file3,"icons.old");
+
+ sprintf_s(request,1024,"%s%d",ICO_URLREQUEST,getfilesize(file2));
+
+ if(CheckWWWContent(request))
+ {
+ if(DBGetContactSettingByte(NULL,protocolname,"dontaskforupdate",0)==1||MessageBox(NULL,Translate("There is a new Icons.dll online, do you want to update now?"),"Miranda XFire Protocol Plugin",MB_YESNO|MB_ICONQUESTION)==IDYES)
+ {
+ if(GetWWWContent2(request,file,FALSE)) {
+ //altes backup löschen
+ remove(file3);
+ //derzeitige ini und sichern
+ rename(file2,file3);
+ //lösche .old, wenn aktiv
+ if(DBGetContactSettingByte(NULL,protocolname,"nobackupini",0))
+ remove(file3);
+ //neue aktiv schalten
+ rename(file,file2);
+
+ if(DBGetContactSettingByte(NULL,protocolname,"dontaskforupdate",0)==0) MSGBOX(Translate("The Icons.dll was updated."));
+ }
+ else
+ MSGBOX(Translate("Error during Icons.dll Update."));
+ }
+ }
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/iniupdater.h b/protocols/Xfire/src/iniupdater.h new file mode 100644 index 0000000000..f89174ae7d --- /dev/null +++ b/protocols/Xfire/src/iniupdater.h @@ -0,0 +1,10 @@ +//iniupdater.h by dufte
+
+#define INI_UPDATERHOST "xfireplus.com"
+#define INI_REQUEST "/xfire_games/xfire_games.php?format=miranda"
+
+
+//#define INI_URLREQUEST "http://xfireplus.com/xfire_games/xfire_games.php?format=miranda"
+#define INI_URLREQUEST "http://xfire.pro-laming.de/getini.php?fsize="
+#define INI_WHATSNEW "http://xfire.pro-laming.de/whatsnew.txt"
+#define ICO_URLREQUEST "http://xfire.pro-laming.de/getini.php?mode=ico&fsize="
\ No newline at end of file diff --git a/protocols/Xfire/src/invitebuddypacket.cpp b/protocols/Xfire/src/invitebuddypacket.cpp new file mode 100644 index 0000000000..f9e46cdebf --- /dev/null +++ b/protocols/Xfire/src/invitebuddypacket.cpp @@ -0,0 +1,93 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "stdafx.h" +#include "invitebuddypacket.h" +#include "variablevalue.h" + +namespace xfirelib { + using namespace std; + + InviteBuddyPacket::InviteBuddyPacket() { + names = new vector<string>; + msgs = new vector<string>; + } + InviteBuddyPacket::~InviteBuddyPacket() { + delete names; + delete msgs; + } + + void InviteBuddyPacket::parseContent(char *buf, int length, int numberOfAtts) { + /* Useless.. we only receive Packet 138 for invitations + VariableValue val; + int index = 0; + index += val.readName( buf, index ); + int namecount = (unsigned char)buf[index++]; + for(int i = 0 ; i < namecount ; i++) { + int namelen = (unsigned char)buf[index++]; + index++; // ignore 00 + index += val.readValue( buf, index, namelen ); + this->msg->push_back(string(val.getValue(),val.getValueLength())); + } + index += val.readName( buf, index ); + + int msgcount = (unsigned char)buf[index++]; + for(int i = 0 ; i < msgcount ; i++) { + int msglen = (unsigned char)buf[index++]; + index++; // ignore 00 + index += val.readValue(buf,index,msglen); + this->msg->push_back(string(val.getValue(),val.getValueLength())); + } + */ + } + int InviteBuddyPacket::getPacketContent(char *buf) { + int index = 0; + VariableValue val; + val.setName("name"); + index += val.writeName(buf,index); + buf[index++] = names->size(); + for(uint i = 0 ; i < names->size() ; i++) { + string name = names->at(i); + buf[index++] = name.length(); + buf[index++] = 0; + memcpy(buf+index,name.c_str(),name.length()); + index+=name.length(); + } + val.setName("msg"); + index += val.writeName(buf,index); + buf[index++] = msgs->size(); + for(uint i = 0 ; i < msgs->size() ; i++) { + string msg = msgs->at(i); + buf[index++] = msg.length(); + buf[index++] = 0; + memcpy(buf+index,msg.c_str(),msg.length()); + index+=msg.length(); + } + return index; + } + + void InviteBuddyPacket::addInviteName(string name, string msg) { + this->names->push_back(name); + this->msgs->push_back(msg); + } + + +}; diff --git a/protocols/Xfire/src/invitebuddypacket.h b/protocols/Xfire/src/invitebuddypacket.h new file mode 100644 index 0000000000..055898d04a --- /dev/null +++ b/protocols/Xfire/src/invitebuddypacket.h @@ -0,0 +1,66 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __INVITEBUDDYPACKET_H +#define __INVITEBUDDYPACKET_H + +#include "xfiresendpacketcontent.h" +#include <vector> +#include <string> + +#define XFIRE_PACKET_INVITE_BUDDY 6 + +using namespace xfirelib; + +namespace xfirelib { + using namespace std; + + /** + * Packet Used to Invite Buddy into Contact List + * (Received is InviteRequestPacket) + */ + class InviteBuddyPacket : public XFireSendPacketContent { + public: + InviteBuddyPacket(); + ~InviteBuddyPacket(); + + XFirePacketContent* newPacket() { return new InviteBuddyPacket(); } + + + int getPacketId() { return XFIRE_PACKET_INVITE_BUDDY; } + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 2; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + void addInviteName(string name, string msg); + + vector<string> *names; + vector<string> *msgs; + private: + }; + +}; + + + +#endif diff --git a/protocols/Xfire/src/inviterequestpacket.cpp b/protocols/Xfire/src/inviterequestpacket.cpp new file mode 100644 index 0000000000..dc105d31ff --- /dev/null +++ b/protocols/Xfire/src/inviterequestpacket.cpp @@ -0,0 +1,51 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "inviterequestpacket.h" +#include "variablevalue.h" +#include <string> + +namespace xfirelib { + using namespace std; + + void InviteRequestPacket::parseContent(char *buf, int length, int numberOfAtts) { + VariableValue val; + int index = 0; + index += val.readName(buf,index); + index += 4; // Ignore 04 01 01 00 + index += val.readValue(buf,index,-1,1); + name = string(val.getValue(),val.getValueLength()); + + index += val.readName(buf,index); + index += 4; // Ignore 04 01 01 00 + index += val.readValue(buf,index,-1,1); + nick = string(val.getValue(),val.getValueLength()); + + index += val.readName(buf,index); + index += 4; // Ignore 04 01 01 00 + index += val.readValue(buf,index,-1,1); + msg = string(val.getValue(),val.getValueLength()); + } + +}; diff --git a/protocols/Xfire/src/inviterequestpacket.h b/protocols/Xfire/src/inviterequestpacket.h new file mode 100644 index 0000000000..5f8bac43cb --- /dev/null +++ b/protocols/Xfire/src/inviterequestpacket.h @@ -0,0 +1,60 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __INVITEREQUESTPACKET_H +#define __INVITEREQUESTPACKET_H + +#include <string> +#include "xfirerecvpacketcontent.h" + +#define XFIRE_PACKET_INVITE_REQUEST_PACKET 138 + +namespace xfirelib { + using namespace std; + + /** + * Received when someone invites you to his buddylist + * (For sending invitations see InviteBuddyPacket) + */ + class InviteRequestPacket : public XFireRecvPacketContent { + public: + XFirePacketContent* newPacket() { return new InviteRequestPacket(); } + + + int getPacketId() { return XFIRE_PACKET_INVITE_REQUEST_PACKET; } + int getPacketContent(char *buf) { return 0;} + int getPacketAttributeCount() { return 3; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + string name; + string nick; + string msg; + + private: + }; + +}; + + +#endif + diff --git a/protocols/Xfire/src/loginfailedpacket.cpp b/protocols/Xfire/src/loginfailedpacket.cpp new file mode 100644 index 0000000000..9d6490dfb2 --- /dev/null +++ b/protocols/Xfire/src/loginfailedpacket.cpp @@ -0,0 +1,38 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#include "stdafx.h" +#include "loginfailedpacket.h" +#include "xfireparse.h" +#include "variablevalue.h" + +namespace xfirelib { + using namespace std; + using namespace xfirelib; + + void LoginFailedPacket::parseContent(char *buf, int length, int numberOfAtts) { + cout << "Login failed, incorrect username or password" << endl; + } + +}; diff --git a/protocols/Xfire/src/loginfailedpacket.h b/protocols/Xfire/src/loginfailedpacket.h new file mode 100644 index 0000000000..20f955bc51 --- /dev/null +++ b/protocols/Xfire/src/loginfailedpacket.h @@ -0,0 +1,47 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __LOGINFAILEDPACKET_H +#define __LOGINFAILEDPACKET_H + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + +#define XFIRE_LOGIN_FAILED_ID 129 + +namespace xfirelib { + + class LoginFailedPacket : public XFireRecvPacketContent { + public: + XFirePacketContent* newPacket() { return new LoginFailedPacket(); } + + + int getPacketId() { return XFIRE_LOGIN_FAILED_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + }; +}; + + +#endif diff --git a/protocols/Xfire/src/loginsuccesspacket.cpp b/protocols/Xfire/src/loginsuccesspacket.cpp new file mode 100644 index 0000000000..483c2fbb4b --- /dev/null +++ b/protocols/Xfire/src/loginsuccesspacket.cpp @@ -0,0 +1,74 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xdebug.h" +#include "loginsuccesspacket.h" + +namespace xfirelib { + + void LoginSuccessPacket::parseContent(char *buf, int length, int numberOfAtts) { + + int read = 0; + for(int i = 0 ; i < numberOfAtts ; i++) { + VariableValue *val = new VariableValue(); + read += val->readName(buf, read); + XDEBUG(( "Read Variable Name: %s\n", val->getName().c_str() )); + if(val->getName() == "userid") { + read++; // ignore 02 + read += val->readValue(buf, read, 3); + read++; // ignore 00 + XDEBUG2( "My userid: %lu\n", val->getValueAsLong() ); + this->myuid=val->getValueAsLong(); + } else if(val->getName() == "sid") { + read++; // ignore 03 + read+=val->readValue(buf, read, 16); + //XDEBUG(( "My SID: %u\n", val->getValue() )); + } else if(val->getName() == "nick") { + //int lengthLength = (int)val->getValueAsLong(); + read++; // ignore 01 + //read+=val->readValue(buf, read, -1, 1); + + unsigned int l = (unsigned char)buf[read++]; //dufte - nick wird benötigt + XDEBUG2( "Nick Length: %d\n", l ); + read++; + read += val->readValue(buf,read,l); + XDEBUG2( "Nick Length: %s\n", val->getValue() ); + + this->nick=std::string(val->getValue(),l); + + } else if(val->getName() == "status") { + read+=5; // ignore everything + } else if(val->getName() == "dlset") { + read+=3; // ignore everything + } else { + i = numberOfAtts; + // If we find something we don't know .. we stop parsing the + // packet.. who cares about the rest... + } + delete val; + } + } + + +}; diff --git a/protocols/Xfire/src/loginsuccesspacket.h b/protocols/Xfire/src/loginsuccesspacket.h new file mode 100644 index 0000000000..55dae54b01 --- /dev/null +++ b/protocols/Xfire/src/loginsuccesspacket.h @@ -0,0 +1,51 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __LOGINSUCCESSPACKET_H +#define __LOGINSUCCESSPACKET_H + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" +#include <string.h> // benötigten header eingefügt + +#define XFIRE_LOGIN_SUCCESS_ID 130 + +namespace xfirelib { + + class LoginSuccessPacket : public XFireRecvPacketContent { + public: + XFirePacketContent* newPacket() { return new LoginSuccessPacket(); } + + int getPacketId() { return XFIRE_LOGIN_SUCCESS_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + std::string nick; + long myuid; + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/m8.h b/protocols/Xfire/src/m8.h new file mode 100644 index 0000000000..94a25be3bf --- /dev/null +++ b/protocols/Xfire/src/m8.h @@ -0,0 +1,9 @@ +#ifndef _M8_H
+#define _M8_H
+
+#include "baseProtocol.h"
+
+class Xfire_m8 : public PROTO_INTERFACE {
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/main.cpp b/protocols/Xfire/src/main.cpp new file mode 100644 index 0000000000..82cf23243e --- /dev/null +++ b/protocols/Xfire/src/main.cpp @@ -0,0 +1,3754 @@ +#include "stdafx.h"
+
+/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by
+ * dufte <dufte@justmail.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+//xfire stuff
+#include "client.h"
+#include "xfirepacket.h"
+#include "loginfailedpacket.h"
+#include "otherloginpacket.h"
+#include "loginsuccesspacket.h"
+#include "messagepacket.h"
+#include "sendstatusmessagepacket.h"
+#include "sendmessagepacket.h"
+#include "invitebuddypacket.h"
+#include "sendacceptinvitationpacket.h"
+#include "senddenyinvitationpacket.h"
+#include "sendremovebuddypacket.h"
+#include "sendnickchangepacket.h"
+#include "sendgamestatuspacket.h"
+#include "sendgamestatus2packet.h"
+#include "dummyxfiregameresolver.h"
+#include "sendgameserverpacket.h"
+#include "recvstatusmessagepacket.h"
+#include "recvoldversionpacket.h"
+#include "packetlistener.h"
+#include "inviterequestpacket.h"
+#include "buddylistgames2packet.h"
+#include "dummyxfiregameresolver.h"
+#include "sendtypingpacket.h"
+#include "xfireclanpacket.h"
+#include "recvremovebuddypacket.h"
+#include "gameinfopacket.h"
+#include "claninvitationpacket.h"
+#include "xfireprefpacket.h"
+#include "searchbuddy.h"
+#include "xfirefoundbuddys.h"
+#include "getbuddyinfo.h"
+#include "buddyinfo.h"
+#include "variables.h"
+#include "passworddialog.h"
+#include "setnickname.h"
+#include "all_statusmsg.h"
+#include "processbuddyinfo.h"
+#include "recvprefspacket.h"
+#include "sendsidpacket.h"
+#include "friendsoffriendlist.h"
+#include "recvbuddychangednick.h"
+
+//miranda stuff
+#include "baseProtocol.h"
+#include "Xfire_gamelist.h"
+#include "Xfire_proxy.h"
+#include "Xfire_avatar_loader.h"
+#include "Xfire_voicechat.h"
+
+#include <stdexcept>
+
+Xfire_gamelist xgamelist;
+Xfire_voicechat voicechat;
+
+HANDLE hLogEvent;
+int bpStatus = ID_STATUS_OFFLINE;
+int previousMode;
+int OptInit(WPARAM wParam,LPARAM lParam);
+int OnDetailsInit(WPARAM wParam,LPARAM lParam);
+HANDLE hFillListEvent = 0;
+CONTACT user;
+HINSTANCE hinstance = NULL;
+int hLangpack;
+HANDLE heventXStatusIconChanged;
+HANDLE copyipport,gotoclansite,vipport,joingame,startthisgame,removefriend,blockfriend;
+int foundgames=0;
+Gdiplus::GdiplusStartupInput gdiplusStartupInput;
+ULONG_PTR gdiplusToken;
+
+//xfire preferences, wichtige variablen
+xfire_prefitem xfireconfig[XFIRE_RECVPREFSPACKET_MAXCONFIGS];
+extern xfireconfigitem xfireconfigitems[XFIRE_RECVPREFSPACKET_SUPPORTEDONFIGS];
+
+CRITICAL_SECTION modeMsgsMutex;
+CRITICAL_SECTION avatarMutex;
+CRITICAL_SECTION connectingMutex;
+
+DWORD pid=NULL; //processid des gefunden spiels
+DWORD ts2pid=NULL; // processid vom teamspeak/ventrilo
+
+HANDLE XFireAvatarFolder = NULL;
+HANDLE XFireWorkingFolder = NULL;
+HANDLE XFireIconFolder = NULL;
+HANDLE hookgamestart = NULL;
+char statusmessage[2][1024];
+BOOL sendonrecieve=FALSE;
+HANDLE hNetlib=NULL;
+pGetExtendedUdpTable _GetExtendedUdpTable=NULL;
+extern LPtsrGetServerInfo tsrGetServerInfo;
+
+//eventhandles
+HANDLE hGameDetection = CreateEvent(NULL,FALSE,FALSE,NULL);
+HANDLE hConnectionClose = CreateEvent(NULL,TRUE,FALSE,NULL);
+
+PLUGININFOEX pluginInfoEx={
+ sizeof(PLUGININFOEX),
+ "Xfire protocol",
+ PLUGIN_MAKE_VERSION(0,1,8,4),
+ "Xfire Protocol Plugin by dufte [Built: "__DATE__" "__TIME__"]",
+ "dufte",
+ "dufte@justmail.de",
+ "(c) 2012 Xfirelib by Herbert Poul, Xfire Miranda protocol plugin by dufte",
+ "http://miranda-ng.org",
+ 0,
+ // {9B8E1735-970D-4ce0-930C-A561956BDCA2}
+ { 0x9b8e1735, 0x970d, 0x4ce0, { 0x93, 0xc, 0xa5, 0x61, 0x95, 0x6b, 0xdc, 0xa2 } }
+};
+
+int FillList(WPARAM wParam, LPARAM lParam);
+HANDLE CList_AddContact(XFireContact xfc, bool InList, bool SetOnline,int clan);
+HANDLE CList_FindContact (int uid);
+void CList_MakeAllOffline();
+int RecvMessage(WPARAM wParam, LPARAM lParam);
+int SendMessage(WPARAM wParam, LPARAM lParam);
+static int UserIsTyping(WPARAM wParam, LPARAM lParam);
+HANDLE LoadGameIcon(char* g, int id, HICON* ico,BOOL onyico=FALSE,char * gamename=NULL,int*uu=NULL);
+void SetIcon(HANDLE hcontact,HANDLE hicon,int ctype=EXTRA_ICON_ADV1);
+BOOL GetAvatar(char* username,XFireAvatar* av);
+//void SetAvatar(HANDLE hContact, char* username);
+static void SetAvatar(LPVOID lparam);
+static int GetIPPort(WPARAM /*wParam*/,LPARAM lParam);
+static int GetVIPPort(WPARAM /*wParam*/,LPARAM lParam);
+int RebuildContactMenu( WPARAM wParam, LPARAM lParam );
+int doneQuery( WPARAM wParam, LPARAM lParam );
+static int GotoProfile(WPARAM wParam,LPARAM lParam);
+static int GotoProfileAct(WPARAM wParam,LPARAM lParam);
+static int GotoXFireClanSite(WPARAM wParam,LPARAM lParam);
+static int ReScanMyGames(WPARAM wParam,LPARAM lParam);
+static int SetNickDlg(WPARAM wParam,LPARAM lParam);
+static int CustomGameSetup(WPARAM wParam,LPARAM lParam);
+
+#ifndef NO_PTHREAD
+ void *gamedetectiont(void *ptr);
+ void *inigamedetectiont(void *ptr);
+ pthread_t gamedetection;
+#else
+ void inigamedetectiont(LPVOID lParam);
+ void gamedetectiont(LPVOID lparam);
+#endif
+
+static int GotoProfile2(WPARAM wParam,LPARAM lParam);
+HANDLE handlingBuddys(BuddyListEntry *entry, int clan=0,char* group=NULL,BOOL dontscan=FALSE);
+int StatusIcon(WPARAM wParam,LPARAM lParam);
+int AddtoList( WPARAM wParam, LPARAM lParam );
+int BasicSearch(WPARAM wParam,LPARAM lParam);
+int GetAvatarInfo(WPARAM wParam, LPARAM lParam); //GAIR_NOAVATAR
+static int SearchAddtoList(WPARAM wParam,LPARAM lParam);
+void CreateGroup(char*grpn,char*field); //void CreateGroup(char*grp);
+int SetAwayMsg(WPARAM wParam, LPARAM lParam);
+int GetAwayMsg(WPARAM /*wParam*/, LPARAM lParam);
+int ContactDeleted(WPARAM wParam,LPARAM /*lParam*/);
+int JoinGame(WPARAM wParam,LPARAM lParam);
+extern void Scan4Games( LPVOID lparam );
+int RemoveFriend(WPARAM wParam,LPARAM lParam);
+int BlockFriend(WPARAM wParam,LPARAM lParam);
+int GetXStatusIcon(WPARAM wParam, LPARAM lParam);
+int StartThisGame(WPARAM wParam,LPARAM lParam);
+int IconLibChanged(WPARAM wParam, LPARAM lParam);
+int SendPrefs(WPARAM wparam, LPARAM lparam);
+void SetAvatar2(LPVOID lparam);
+int ExtraListRebuild(WPARAM wparam, LPARAM lparam);
+int ExtraImageApply(WPARAM wparam, LPARAM lparam);
+
+//XFire Stuff
+using namespace xfirelib;
+
+class XFireClient : public PacketListener {
+
+ public:
+ Client* client;
+ Xfire_avatar_loader* avatarloader;
+ BOOL useutf8;
+
+ XFireClient(string username, string password,char protover,int useproxy=0,string proxyip="",int proxyport=0);
+ ~XFireClient();
+ void run();
+
+ void Status(string s);
+
+ void receivedPacket(XFirePacket *packet);
+
+ void getBuddyList();
+ void sendmsg(char*usr,char*msg);
+ void setNick(char*nnick);
+ void handlingBuddy(HANDLE handle);
+ void CheckAvatar(BuddyListEntry* entry);
+
+ private:
+ vector<string> explodeString(string s, string e);
+ string joinString(vector<string> s, int startindex, int endindex=-1, string delimiter=" ");
+ void BuddyList();
+
+ string *lastInviteRequest;
+
+ string username;
+ string password;
+ string proxyip;
+ int useproxy;
+ int proxyport;
+ BOOL connected;
+ unsigned int myuid;
+ };
+
+XFireClient* myClient=NULL;
+
+void XFireClient::CheckAvatar(BuddyListEntry* entry) {
+ //kein entry, zurück
+ if(!entry)
+ return;
+
+ //keine avatars?
+ if(DBGetContactSettingByte(NULL,protocolname,"noavatars",-1)==0)
+ {
+ //avatar gelocked?
+ if(DBGetContactSettingByte(entry->hcontact, "ContactPhoto", "Locked", -1)!=1)
+ {
+ //avatar lade auftrag übergeben
+ this->avatarloader->loadAvatar(entry->hcontact,(char*)entry->username.c_str(),entry->userid);
+ }
+ }
+}
+
+void XFireClient::handlingBuddy(HANDLE handle){
+ vector<BuddyListEntry*> *entries = client->getBuddyList()->getEntries();
+ for(uint i = 0 ; i < entries->size() ; i ++) {
+ BuddyListEntry *entry = entries->at(i);
+ if(entry->hcontact==handle)
+ {
+ handlingBuddys(entry,0,NULL);
+ break;
+ }
+ }
+ //mir_forkthread(
+}
+
+void XFireClient::setNick(char*nnick) {
+ /*if(strlen(nnick)==0)
+ return;*/
+ SendNickChangePacket nick;
+ if(this->useutf8)
+ nick.nick = ( char* )nnick;
+ else
+ nick.nick = mir_utf8encode(( char* )nnick);
+ client->send( &nick );
+}
+
+
+void XFireClient::sendmsg(char*usr,char*cmsg) {
+ SendMessagePacket msg;
+ // if(strlen(cmsg)>255)
+ // *(cmsg+255)=0;
+ msg.init(client, usr, cmsg);
+ client->send( &msg );
+ }
+
+
+ XFireClient::XFireClient(string username_,string password_,char protover,int useproxy,string proxyip,int proxyport)
+ : username(username_), password(password_) {
+ client = new Client();
+ client->setGameResolver( new DummyXFireGameResolver() );
+ client->protocolVersion=protover;
+ avatarloader = new Xfire_avatar_loader(client);
+ this->useproxy=useproxy;
+ this->proxyip=proxyip;
+ this->proxyport=proxyport;
+ useutf8=FALSE;
+
+ avatarloader=new Xfire_avatar_loader(client);
+
+ lastInviteRequest = NULL;
+ connected = FALSE;
+ }
+
+ XFireClient::~XFireClient() {
+ if(client!=NULL) {
+ client->disconnect();
+ delete client;
+ }
+ if(avatarloader) {
+ delete avatarloader;
+ avatarloader=NULL;
+ }
+ if(lastInviteRequest!=NULL) delete lastInviteRequest;
+ }
+
+ void XFireClient::run() {
+ client->connect(username,password,useproxy,proxyip,proxyport);
+ client->addPacketListener(this);
+ }
+
+ void XFireClient::Status(string s) {
+ //da bei xfire statusmsg nur 100bytes länge unterstützt werden, wird gecutted
+ if(!client->gotBudduyList)
+ return;
+
+ if(s.length()>100)
+ {
+ char* temp=(char*)s.c_str();
+ *(temp+100)=0;
+ }
+ SendStatusMessagePacket *packet = new SendStatusMessagePacket();
+
+ if(myClient->useutf8)
+ packet->awaymsg = s.c_str();
+ else
+ packet->awaymsg = mir_utf8encode(s.c_str());
+
+ client->send( packet );
+ delete packet;
+ }
+
+ void XFireClient::receivedPacket(XFirePacket *packet) {
+ XFirePacketContent *content = packet->getContent();
+
+ switch(content->getPacketId())
+ {
+ /*case XFIRE_RECVBUDDYCHANGEDNICK:
+ {
+ RecvBuddyChangedNick *changednick = (RecvBuddyChangedNick*)content;
+ if(changednick) {
+ handlingBuddys((BuddyListEntry*)changednick->entry,0,NULL);
+ }
+ break;
+ }*/
+ //Konfigpacket empfangen
+ case XFIRE_RECVPREFSPACKET:
+ {
+ //Konfigarray leeren
+ memset(&xfireconfig,0,sizeof(xfire_prefitem)*XFIRE_RECVPREFSPACKET_MAXCONFIGS);
+ RecvPrefsPacket *config = (RecvPrefsPacket*)content;
+ //konfigs in array speichern
+ if(config!=NULL)
+ {
+ //ins preferenes array sichern
+ for(int i=0;i<XFIRE_RECVPREFSPACKET_MAXCONFIGS;i++)
+ {
+ xfireconfig[i]=config->config[i];
+ }
+ //datenbank einträge durchführen
+ for(int i=0;i<XFIRE_RECVPREFSPACKET_SUPPORTEDONFIGS;i++)
+ {
+ char temp=1;
+ if(xfireconfig[xfireconfigitems[i].xfireconfigid].wasset==1)
+ {
+ temp=0;
+ }
+ DBWriteContactSettingByte(NULL,protocolname,xfireconfigitems[i].dbentry,temp);
+ }
+ }
+ break;
+ }
+ case XFIRE_FOUNDBUDDYS_ID:
+ {
+ PROTOSEARCHRESULT psr;
+ ZeroMemory(&psr, sizeof(psr));
+ psr.cbSize = sizeof(psr);
+
+ XFireFoundBuddys *fb = (XFireFoundBuddys*)content;
+ for(uint i = 0 ; i < fb->usernames->size() ; i++) {
+ if((char*)fb->usernames->at(i).c_str()!=NULL)
+ psr.nick = (char*)fb->usernames->at(i).c_str();
+ if((char*)fb->fname->at(i).c_str()!=NULL)
+ psr.firstName = (char*)fb->fname->at(i).c_str();
+ if((char*)fb->lname->at(i).c_str()!=NULL)
+ psr.lastName = (char*)fb->lname->at(i).c_str();
+ ProtoBroadcastAck(protocolname, NULL, ACKTYPE_SEARCH, ACKRESULT_DATA, (HANDLE) 1, (LPARAM) & psr);
+ }
+
+ ProtoBroadcastAck(protocolname, NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+ break;
+ }
+ case XFIRE_BUDDYINFO:
+ {
+ BuddyInfoPacket *buddyinfo = (BuddyInfoPacket*)content;
+ BuddyListEntry *entry = client->getBuddyList()->getBuddyById( buddyinfo->userid );
+
+ //wenn die uid die gleiche wie die eigene ist, dann avatar auch selbst zuweisen
+ if(buddyinfo->userid==this->myuid) {
+ ProcessBuddyInfo(buddyinfo,NULL,"myxfireavatar");
+ }
+
+ if(entry)
+ ProcessBuddyInfo(buddyinfo,entry->hcontact,(char*)entry->username.c_str());
+
+ break;
+ }
+ case XFIRE_CLANINVITATION_ID:
+ {
+ ClanInvitationPacket *claninv = (ClanInvitationPacket*)content;
+ for(int i=0;i<claninv->numberOfInv;i++)
+ {
+ char msg[XFIRE_MAX_STATIC_STRING_LEN];
+ sprintf(msg,Translate("%s (Nickname: %s) has invited you to join the %s clan. Message: %s%sPlease go to the XFireclan-Site to accept the Invitation."),claninv->invitefromusername[i].c_str(),
+ claninv->invitefrom[i].c_str(),
+ claninv->clanname[i].c_str(),
+ claninv->invitemsg[i].c_str(),"\n");
+ MSGBOX(msg);
+ }
+ break;
+ }
+ case XFIRE_GAMEINFO_ID:
+ {
+ GameInfoPacket *gameinfo = (GameInfoPacket*)content;
+ for(uint i = 0 ; i < gameinfo->sids->size() ; i++) {
+ BuddyListEntry *entry = client->getBuddyList()->getBuddyBySid( gameinfo->sids->at(i) );
+ if(entry){
+ entry->gameinfo = gameinfo->gameinfo->at(i);
+ handlingBuddys(entry,0,NULL);
+ }
+ }
+ break;
+ }
+ case XFIRE_RECVREMOVEBUDDYPACKET:
+ {
+ RecvRemoveBuddyPacket *remove = (RecvRemoveBuddyPacket*)content;
+ CallService( MS_DB_CONTACT_DELETE, (WPARAM) remove->handle, 1 );
+ break;
+ }
+ case XFIRE_BUDDYS_NAMES_ID:
+ {
+ //status nachricht nach der buddylist senden
+ client->gotBudduyList=TRUE;
+ if(sendonrecieve)
+ {
+ if(myClient!=NULL)
+ {
+ if(myClient->client->connected)
+ {
+ //
+ if (bpStatus == ID_STATUS_AWAY)
+ myClient->Status(statusmessage[1]);
+ else
+ myClient->Status(statusmessage[0]);
+ }
+ }
+ sendonrecieve=FALSE;
+ }
+ sendonrecieve=FALSE;
+
+/* GetBuddyInfo buddyinfo;
+
+ vector<BuddyListEntry*> *entries = client->getBuddyList()->getEntries();
+ for(uint i = 0 ; i < entries->size() ; i ++) {
+ BuddyListEntry *entry = entries->at(i);
+ handlingBuddys(entry,0,NULL);
+ }*/
+ break;
+ }
+ /* case XFIRE_CLAN_BUDDYS_NAMES_ID:
+ {
+ vector<BuddyListEntry*> *entries = client->getBuddyList()->getEntriesClan();
+
+ char temp[255];
+ char * dummy;
+ ClanBuddyListNamesPacket *clan = (ClanBuddyListNamesPacket*)content;
+ sprintf(temp,"Clan_%d",clan->clanid);
+
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(NULL,protocolname,temp,&dbv))
+ {
+ dummy=dbv.pszVal;
+ }
+ else
+ dummy=NULL;
+
+ for(uint i = 0 ; i < entries->size() ; i ++) {
+ BuddyListEntry *entry = entries->at(i);
+ if(entry->clanid==clan->clanid) {
+ handlingBuddys(entry,clan->clanid,dummy);
+ }
+ }
+ break;
+ }*/
+ case XFIRE_FRIENDS_BUDDYS_NAMES_ID:
+ {
+ for(uint i = 0 ; i < ((FriendsBuddyListNamesPacket*)content)->userids->size() ; i++) {
+ BuddyListEntry *entry = client->getBuddyList()->getBuddyById( ((FriendsBuddyListNamesPacket*)content)->userids->at(i) );
+ if(entry) {
+ char fofname[128]="Friends of Friends Playing";
+ DBVARIANT dbv;
+ //gruppennamen überladen
+ if(!DBGetContactSetting(NULL,protocolname,"overload_fofgroupname",&dbv))
+ {
+ strcpy_s(fofname,128,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ CreateGroup(Translate(fofname),"fofgroup");
+ HANDLE hc=handlingBuddys(entry,-1,Translate(fofname));
+ if(hc)
+ {
+ CheckAvatar(entry);
+ DBWriteContactSettingByte(hc,protocolname,"friendoffriend",1);
+ }
+ }
+ }
+ break;
+ }
+ /*case XFIRE_BUDDYS_ONLINE_ID:
+ {
+ for(uint i = 0 ; i < ((BuddyListOnlinePacket*)content)->userids->size() ; i++) {
+ BuddyListEntry *entry = client->getBuddyList()->getBuddyById( ((BuddyListOnlinePacket*)content)->userids->at(i) );
+ if(entry){
+ handlingBuddys(entry,0,NULL);
+ }
+ }
+ break;
+ }*/
+ /*case XFIRE_RECV_STATUSMESSAGE_PACKET_ID:
+ {
+ for(uint i=0;i<((RecvStatusMessagePacket*)content)->sids->size();i++)
+ {
+ BuddyListEntry *entry = this->client->getBuddyList()->getBuddyBySid( ((RecvStatusMessagePacket*)content)->sids->at(i) );
+ if(entry) //crashbug entfernt
+ setBuddyStatusMsg(entry,entry->statusmsg); //auf eine funktion reduziert, verringert cpuauslastung und beseitigt das
+ //das problem der fehlenden statusmsg
+ //handlingBuddys(entry,0,NULL);
+ }
+ break;
+ }*/
+ case XFIRE_BUDDYS_GAMES_ID:
+ {
+ vector<char *> *sids=NULL; //dieses array dient zu zwischensicherung von unbekannten sids
+ for(uint i=0;i<((BuddyListGamesPacket*)content)->sids->size();i++)
+ {
+ BuddyListEntry *entry = this->client->getBuddyList()->getBuddyBySid( ((BuddyListGamesPacket*)content)->sids->at(i) );
+ if(entry!=NULL)
+ {
+ //wir haben einen unbekannten user
+ if(entry->username.length()==0)
+ {
+ //sid array ist noch nicht init
+ if(sids==NULL)
+ {
+ sids = new vector<char *>;
+ }
+ //kopie der sid anlegen
+ char *sid = new char[16];
+ memcpy(sid,((BuddyListGamesPacket*)content)->sids->at(i),16);
+ //ab ins array damit
+ sids->push_back(sid);
+ }
+ else
+ {
+ if(entry->game==0&&
+ entry->hcontact!=0&&
+ DBGetContactSettingByte(entry->hcontact,protocolname,"friendoffriend",0)==1)
+ {
+ DBWriteContactSettingWord(entry->hcontact,protocolname,"Status",ID_STATUS_OFFLINE);
+ //CallService( MS_DB_CONTACT_DELETE, (WPARAM) entry->hcontact, 0);
+ }
+ else
+ {
+ handlingBuddys(entry,0,NULL);
+ }
+ }
+ }
+ }
+ //sid anfragen nur senden, wenn das sids array init wurde
+ if(sids)
+ {
+ SendSidPacket sp;
+ sp.sids=sids;
+ client->send( &sp );
+ delete sids;
+ }
+ break;
+ }
+ case XFIRE_BUDDYS_GAMES2_ID:
+ {
+ for(uint i=0;i<((BuddyListGames2Packet*)content)->sids->size();i++)
+ {
+ BuddyListEntry *entry = this->client->getBuddyList()->getBuddyBySid( ((BuddyListGames2Packet*)content)->sids->at(i) );
+ if(entry!=NULL) handlingBuddys(entry,0,NULL);
+ }
+ break;
+ }
+ case XFIRE_PACKET_INVITE_REQUEST_PACKET: //friend request
+ {
+ InviteRequestPacket *invite = (InviteRequestPacket*)content;
+
+ //nur nich blockierte buddy's durchlassen
+ if(!DBGetContactSettingByte(NULL,"XFireBlock",(char*)invite->name.c_str(),0))
+ {
+ XFireContact xfire_newc;
+ xfire_newc.username=(char*)invite->name.c_str();
+ xfire_newc.nick=(char*)invite->nick.c_str();
+ xfire_newc.id=0;
+
+ HANDLE handle=CList_AddContact(xfire_newc,TRUE,TRUE,0);
+
+ if(handle) { // invite nachricht mitsenden
+ string str;
+ CCSDATA ccs;
+ PROTORECVEVENT pre;
+
+ str=(char*)invite->msg.c_str();
+
+ time_t t = time(NULL);
+ ccs.szProtoService = PSR_MESSAGE;
+ ccs.hContact = handle;
+ ccs.wParam = 0;
+ ccs.lParam = (LPARAM) & pre;
+ pre.flags = 0;
+ pre.timestamp = t;
+ pre.szMessage = (char*)mir_utf8decode((char*)str.c_str(),NULL);
+ //invite nachricht konnte nicht zugewiesen werden?!?!?!
+ if(!pre.szMessage)
+ pre.szMessage=(char*)str.c_str();
+ pre.lParam = 0;
+ CallService(MS_PROTO_CHAINRECV, 0, (LPARAM) &ccs);
+ }
+ }
+ else
+ {
+ SendDenyInvitationPacket deny;
+ deny.name = invite->name;
+ client->send( &deny );
+ }
+ break;
+ }
+ case XFIRE_CLAN_PACKET:
+ {
+ char temp[100];
+ XFireClanPacket *clan = (XFireClanPacket*)content;
+
+ for(int i=0;i<clan->count;i++)
+ {
+ sprintf(temp,"Clan_%d",clan->clanid[i]);
+ DBWriteContactSettingTString(NULL, protocolname, temp, (char*)clan->name[i].c_str());
+
+ sprintf(temp,"ClanUrl_%d",clan->clanid[i]);
+ DBWriteContactSettingTString(NULL, protocolname, temp, (char*)clan->url[i].c_str());
+
+ if(!DBGetContactSettingByte(NULL,protocolname,"noclangroups",0)) {
+ CreateGroup((char*)clan->name[i].c_str(),"mainclangroup");
+ }
+ }
+ break;
+ }
+ case XFIRE_LOGIN_FAILED_ID:
+ MSGBOXE(Translate("Login failed."));
+ SetStatus(ID_STATUS_OFFLINE,NULL);
+ break;
+ case XFIRE_LOGIN_SUCCESS_ID: //login war erfolgreich
+ {
+ LoginSuccessPacket *login = (LoginSuccessPacket*)content;
+ char * temp = mir_utf8decode((char*)login->nick.c_str(),NULL);
+ //nick speichern
+ DBWriteContactSettingString(NULL,protocolname,"Nick",temp);
+ //uid speichern
+ DBWriteContactSettingDword(NULL,protocolname,"myuid",login->myuid);
+ this->myuid=login->myuid;
+ //avatar auslesen
+ GetBuddyInfo* buddyinfo=new GetBuddyInfo();
+ buddyinfo->userid=login->myuid;
+ mir_forkthread(SetAvatar2,(LPVOID)buddyinfo);
+ break;
+ }
+
+ case XFIRE_RECV_OLDVERSION_PACKET_ID:
+ {
+ RecvOldVersionPacket *version = (RecvOldVersionPacket*)content;
+ char temp[255];
+
+ if((unsigned int)client->protocolVersion<(unsigned int)version->newversion)
+ {
+ DBWriteContactSettingByte(NULL,protocolname,"protover",version->newversion);
+ //recprotoverchg
+ if(DBGetContactSettingWord(NULL,protocolname,"recprotoverchg",0)==0)
+ {
+ sprintf_s(temp,255,Translate("The protocol version is too old. Changed current version from %d to %d. You can reconnect now."),client->protocolVersion,version->newversion);
+ MSGBOXE(temp);
+ }
+ else
+ {
+ SetStatus(ID_STATUS_RECONNECT,NULL);
+ return;
+ }
+ }
+ else
+ {
+ sprintf_s(temp,255,Translate("The protocol version is too old. Cannot detect a new version number."));
+ MSGBOXE(temp);
+ SetStatus(ID_STATUS_OFFLINE,NULL);
+ }
+ break;
+ }
+
+ case XFIRE_OTHER_LOGIN:
+ MSGBOXE(Translate("Someone loged in with your account.disconnect."));
+ SetStatus(ID_STATUS_OFFLINE,NULL);
+ break;
+
+ //ne nachricht für mich, juhu
+ case XFIRE_MESSAGE_ID: {
+ string str;
+ CCSDATA ccs;
+ PROTORECVEVENT pre;
+
+ if( (( MessagePacket*)content)->getMessageType() == 0){
+ BuddyListEntry *entry = client->getBuddyList()->getBuddyBySid( ((MessagePacket*)content)->getSid() );
+ if(entry!=NULL)
+ {
+ str=((MessagePacket*)content)->getMessage();
+ time_t t = time(NULL);
+ ccs.szProtoService = PSR_MESSAGE;
+ ccs.hContact = entry->hcontact;
+ ccs.wParam = 0;
+ ccs.lParam = (LPARAM) & pre;
+ pre.flags = 0;
+ pre.timestamp = t;
+ if(this->useutf8)
+ {
+ pre.szMessage = (char*)str.c_str();
+ pre.flags = PREF_UTF;
+ }
+ else
+ pre.szMessage = (char*)mir_utf8decode((char*)str.c_str(),NULL);
+ pre.lParam = 0;
+
+ CallService(MS_PROTO_CONTACTISTYPING,(WPARAM)ccs.hContact,PROTOTYPE_CONTACTTYPING_OFF);
+ CallService(MS_PROTO_CHAINRECV, 0, (LPARAM) &ccs);
+
+ }
+ }
+ else if( (( MessagePacket*)content)->getMessageType() == 3) {
+ BuddyListEntry *entry = client->getBuddyList()->getBuddyBySid( ((MessagePacket*)content)->getSid() );
+ if(entry!=NULL)
+ {
+ CallService(MS_PROTO_CONTACTISTYPING,(WPARAM)entry->hcontact,5);
+ }
+ }
+
+ break;
+ }
+
+ //refresh buddy's
+ /* if(content->getPacketId()==XFIRE_RECV_STATUSMESSAGE_PACKET_ID||
+ content->getPacketId()==XFIRE_BUDDYS_GAMES_ID||
+ content->getPacketId()==XFIRE_BUDDYS_GAMES2_ID)
+ CallService(MS_CLIST_FRAMES_UPDATEFRAME, (WPARAM)-1, (LPARAM)FU_TBREDRAW | FU_FMREDRAW);*/
+ }
+
+ //
+ }
+
+//=====================================================
+
+extern "C" __declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion)
+{
+ return &pluginInfoEx;
+}
+
+extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = {MIID_PROTOCOL, MIID_LAST};
+
+//=====================================================
+// Unloads plugin
+//=====================================================
+
+extern "C" __declspec(dllexport) int Unload(void)
+{
+ //urlprefix raushaun
+ if(ServiceExists(MS_ASSOCMGR_ADDNEWURLTYPE))
+ CallService(MS_ASSOCMGR_REMOVEURLTYPE, 0, (LPARAM)"xfire:");
+
+ //gamedetetion das dead signal geben
+ SetEvent(hGameDetection);
+
+#ifndef NO_PTHREAD
+ pthread_cancel (gamedetection);
+ pthread_win32_process_detach_np ();
+#endif
+
+ DeleteCriticalSection(&modeMsgsMutex);
+ DeleteCriticalSection(&connectingMutex);
+ DeleteCriticalSection(&avatarMutex);
+
+ Gdiplus::GdiplusShutdown(gdiplusToken);
+
+ return 0;
+}
+
+void __stdcall XFireLog( const char* fmt, ... )
+{
+ va_list vararg;
+ va_start( vararg, fmt );
+ char* str = ( char* )alloca( 32000 );
+ mir_vsnprintf( str, 32000, fmt, vararg );
+ va_end( vararg );
+
+ CallService( MS_NETLIB_LOG, ( WPARAM )hNetlib, ( LPARAM )str );
+}
+
+//=====================================================
+// WINAPI DllMain
+//=====================================================
+
+BOOL WINAPI DllMain(HINSTANCE hinst,DWORD fdwReason,LPVOID lpvReserved)
+{
+ hinstance = hinst;
+ //AtlAxWinInit();
+ return TRUE;
+}
+
+//suche nach ini und danach starte gamedetection thread
+void StartIniUpdateAndDetection(LPVOID dummy)
+{
+ EnterCriticalSection(&connectingMutex);
+
+ //ini/ico updater, nur wenn aktiv
+ if(DBGetContactSettingByte(NULL,protocolname,"autoiniupdate",0))
+ UpdateMyXFireIni(NULL);
+ if(DBGetContactSettingByte(NULL,protocolname,"autoicodllupdate",0))
+ UpdateMyIcons(NULL);
+
+#ifndef NO_PTHREAD
+ void* (*func)(void*) = &inigamedetectiont;
+ pthread_create( &gamedetection, NULL, func , NULL);
+#else
+ mir_forkthread(inigamedetectiont,NULL);
+#endif
+
+ LeaveCriticalSection(&connectingMutex);
+}
+
+int UrlCall(WPARAM wparam,LPARAM lparam) {
+ //lparam!=0?
+ if(lparam) {
+ //nach dem doppelpunkt suchen
+ char*type=strchr((char*)lparam,':');
+ //gefunden, dann anch fragezeichen suchen
+ if(type)
+ {
+ type++;
+ char*q=strchr(type,'?');
+ //gefunden? dann urltype ausschneiden
+ if(q)
+ {
+ //abschneiden
+ *q=0;
+ //ein addfriend url request?
+ if(strcmp("add_friend",type)==0)
+ {
+ q++;
+ //nach = suchen
+ char*g=strchr(q,'=');
+ //gefunden? dann abschneiden
+ if(g)
+ {
+ *g=0;
+ g++;
+ //user parameter?
+ if(strcmp("user",q)==0)
+ {
+ //tempbuffer für die frage and en user
+ char temp[100];
+
+ if(strlen(g)>25) //zugroße abschneiden
+ *(g+25)=0;
+
+ sprintf_s(temp,100,Translate("Do you really want to add %s to your friend list?"),g);
+ //Nutzer vorher fragen, ob er wirklich user xyz adden möchte
+ if(MessageBoxA(NULL,temp,"Miranda XFire Protocol Plugin",MB_YESNO|MB_ICONQUESTION)==IDYES)
+ {
+ if(myClient!=NULL)
+ {
+ if(myClient->client->connected)
+ {
+ InviteBuddyPacket invite;
+ invite.addInviteName(g, Translate("Add me to your friends list."));
+ myClient->client->send(&invite);
+ }
+ else
+ MSGBOXE(Translate("XFire is not connected."));
+ }
+ else
+ MSGBOXE(Translate("XFire is not connected."));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ return 0;
+}
+
+//wenn alle module geladen sind
+static int OnSystemModulesLoaded(WPARAM wParam,LPARAM lParam)
+{
+ char servicefunction[100];
+
+ /*NETLIB***********************************/
+ NETLIBUSER nlu;
+ ZeroMemory(&nlu, sizeof(nlu));
+ nlu.cbSize = sizeof(nlu);
+ nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS;
+ nlu.szSettingsModule = protocolname;
+ nlu.szDescriptiveName = "XFire server connection";
+ hNetlib = (HANDLE) CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM) & nlu);
+ /*NETLIB***********************************/
+
+ HookEvent(ME_USERINFO_INITIALISE, OnDetailsInit);
+ HookEvent(ME_DB_CONTACT_DELETED, ContactDeleted);
+
+ //hook das queryplugin
+ HookEvent("GameServerQuery/doneQuery" , doneQuery);
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_SETAWAYMSG);
+ CreateServiceFunction(servicefunction, SetAwayMsg);
+
+ /*NETLIBUSER nlu;
+ ZeroMemory(&nlu, sizeof(nlu));
+ nlu.cbSize = sizeof(nlu);
+ nlu.flags = NUF_NOHTTPSOPTION;
+ nlu.szSettingsModule = protocolname;
+ nlu.szDescriptiveName = "XFire Gamedetectionthread";
+ hNetlibUser = (HANDLE) CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM) & nlu);*/
+
+
+ // Variables support
+ if (ServiceExists(MS_VARS_REGISTERTOKEN))
+ {
+ TOKENREGISTER tr = {0};
+ tr.cbSize = sizeof(TOKENREGISTER);
+ tr.memType = TR_MEM_MIRANDA;
+ tr.flags = TRF_FREEMEM | TRF_PARSEFUNC | TRF_FIELD;
+
+ tr.tszTokenString = _T("xfiregame");
+ tr.parseFunction = Varxfiregame;
+ tr.szHelpText = "XFire\tCurrent Game";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ tr.tszTokenString = _T("myxfiregame");
+ tr.parseFunction = Varmyxfiregame;
+ tr.szHelpText = "XFire\tMy Current Game";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ tr.tszTokenString = _T("xfireserverip");
+ tr.parseFunction = Varxfireserverip;
+ tr.szHelpText = "XFire\tServerIP";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ tr.tszTokenString = _T("myxfireserverip");
+ tr.parseFunction = Varmyxfireserverip;
+ tr.szHelpText = "XFire\tMy Current ServerIP";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ tr.tszTokenString = _T("xfirevoice");
+ tr.parseFunction = Varxfirevoice;
+ tr.szHelpText = "XFire\tVoice";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ tr.tszTokenString = _T("myxfirevoice");
+ tr.parseFunction = Varmyxfirevoice;
+ tr.szHelpText = "XFire\tMy Current Voice";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ tr.tszTokenString = _T("xfirevoiceip");
+ tr.parseFunction = Varxfirevoiceip;
+ tr.szHelpText = "XFire\tVoice ServerIP";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ tr.tszTokenString = _T("myxfirevoiceip");
+ tr.parseFunction = Varmyxfirevoiceip;
+ tr.szHelpText = "XFire\tMy Voice ServerIP";
+ CallService(MS_VARS_REGISTERTOKEN, 0, (LPARAM) &tr);
+
+ }
+
+ //File Association Manager support
+ if(ServiceExists(MS_ASSOCMGR_ADDNEWURLTYPE))
+ {
+ AssocMgr_AddNewUrlType("xfire:",Translate("Xfire Link Protocol"),hinstance,IDI_TM,XFIRE_URLCALL,0);
+ }
+
+ //sound einfügen
+ SkinAddNewSoundEx(Translate("xfirebstartgame"),protocolname,Translate("Buddy start a game"));
+
+ //hook für mbot einfügen, nur wenn mbot option aktiv
+ if(DBGetContactSettingByte(NULL,protocolname,"mbotsupport",0))
+ HookEvent(XFIRE_INGAMESTATUSHOOK, mBotNotify);
+
+ //init der extraicons wenn service vorhanden
+ /*if(ServiceExists(MS_EXTRAICON_REGISTER))
+ {
+ extraiconGAME=ExtraIcon_Register("Game Icon","Xfire game icons.","XFIRE_main",RebuildIcons,ApplyIcons);
+ extraiconGAME=ExtraIcon_Register("Voice Icon","Xfire voice icons.","XFIRE_main");
+ }*/
+
+ //initialisiere teamspeak und co detection
+ voicechat.initVoicechat();
+
+ mir_forkthread(StartIniUpdateAndDetection,NULL);
+
+ return 0;
+}
+
+//=====================================================
+// Called when plugin is loaded into Miranda
+//=====================================================
+
+/*placebo funktionen*/
+/*PROTO_INTERFACE* xfireProtoInit( const char* pszProtoName, const TCHAR* tszUserName )
+{
+ Xfire_m8 m8=new Xfire_m8();
+ return m8;
+}
+/*placebo funktionen*/
+/*static int xfireProtoUninit( void* ppro )
+{
+ return 0;
+}
+
+*/
+
+int ExtraListRebuild(WPARAM wparam, LPARAM lparam)
+{
+ //für alle gameicons ein neues handle setzen
+ return xgamelist.iconmngr.resetIconHandles();
+}
+
+int ExtraImageApply(WPARAM wparam, LPARAM lparam)
+{
+ HANDLE hContact=(HANDLE)wparam;
+ // TODO: maybe need to fix extra icons
+ char *szProto;
+ szProto = ( char* ) CallService( MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0);
+ if ( szProto != NULL && !lstrcmpiA( szProto, protocolname ) && DBGetContactSettingWord(hContact, protocolname, "Status", ID_STATUS_OFFLINE)!=ID_STATUS_OFFLINE) {
+ int gameid=DBGetContactSettingWord(hContact, protocolname, "GameId", 0);
+ int gameid2=DBGetContactSettingWord(hContact, protocolname, "VoiceId", 0);
+
+ if(gameid!=0)
+ {
+ SetIcon(hContact,xgamelist.iconmngr.getGameIconHandle(gameid));
+ }
+ if(gameid2!=0)
+ {
+ SetIcon(hContact,xgamelist.iconmngr.getGameIconHandle(gameid2),EXTRA_ICON_ADV2);
+ }
+ }
+ return 0;
+}
+
+
+
+extern "C" __declspec(dllexport) int Load(void)
+{
+ mir_getLP(&pluginInfoEx);
+
+ InitializeCriticalSection(&modeMsgsMutex);
+ InitializeCriticalSection(&connectingMutex);
+ InitializeCriticalSection(&avatarMutex);
+
+ Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
+
+ //void* init = GetProcAddress(LoadLibrary("atl"),"AtlAxWinInit"); _asm call init;
+
+ //keine protoversion in der db, dann wohl der erste start von xfire
+ if(DBGetContactSettingByte(NULL,protocolname,"protover",0)==0)
+ {
+ DBWriteContactSettingByte(NULL,protocolname,"protover",0x84);
+ DBWriteContactSettingWord(NULL,protocolname,"avatarloadlatency",1000);
+ DBWriteContactSettingByte(NULL,protocolname,"gameico",0);
+ DBWriteContactSettingByte(NULL,protocolname,"voiceico",1);
+ DBWriteContactSettingByte(NULL,protocolname,"specialavatarload",1);
+ DBWriteContactSettingByte(NULL,protocolname,"xfiresitegameico",1);
+ DBWriteContactSettingByte(NULL,protocolname,"recprotoverchg",1);
+
+ if(MessageBoxA(NULL,Translate("It seems that is the first time you use this plugin. Do you want to automatically download the latest available xfire_games.ini und icons.dll?\r\nWithout the ini xfire cant detect any games on your computer."),"Miranda XFire Protocol Plugin",MB_YESNO|MB_ICONQUESTION)==IDYES)
+ {
+ DBWriteContactSettingByte(NULL,protocolname,"autoiniupdate",1);
+ DBWriteContactSettingByte(NULL,protocolname,"autoicodllupdate",1);
+ }
+ }
+
+
+ XDEBUGS("-----------------------------------------------------\n");
+
+ //statusmessages setzen
+ strcpy(statusmessage[0],"");
+ strcpy(statusmessage[1],"(AFK) Away from Keyboard");
+
+ char servicefunction[100];
+
+ HookEvent(ME_OPT_INITIALISE, OptInit);
+ HookEvent(ME_SYSTEM_MODULESLOADED, OnSystemModulesLoaded);
+
+ PROTOCOLDESCRIPTOR pd = {0};
+ pd.cbSize = PROTOCOLDESCRIPTOR_V3_SIZE;
+ pd.szName = protocolname;
+ pd.type = PROTOTYPE_PROTOCOL;
+ CallService(MS_PROTO_REGISTERMODULE,0,(LPARAM)&pd);
+
+
+ hLogEvent=CreateHookableEvent("XFireProtocol/Log");
+
+ CList_MakeAllOffline();
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_GETCAPS);
+ CreateServiceFunction(servicefunction, GetCaps);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_GETNAME);
+ CreateServiceFunction(servicefunction, GetName);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_LOADICON);
+ CreateServiceFunction(servicefunction, TMLoadIcon);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_SETSTATUS);
+ CreateServiceFunction(servicefunction, SetStatus);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_GETSTATUS);
+ CreateServiceFunction(servicefunction, GetStatus);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PSS_ADDED);
+ CreateServiceFunction(servicefunction, AddtoList);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_ADDTOLIST);
+ CreateServiceFunction(servicefunction, SearchAddtoList);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_GETAVATARINFO);
+ CreateServiceFunction(servicefunction, GetAvatarInfo);
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_GETMYAVATAR);
+ CreateServiceFunction(servicefunction, GetMyAvatar);
+
+ HookEvent(ME_CLIST_EXTRA_IMAGE_APPLY, ExtraImageApply);
+ HookEvent(ME_CLIST_EXTRA_LIST_REBUILD, ExtraListRebuild);
+
+ //erstell eine hook für andere plugins damit diese nachprüfen können, ab wann jemand ingame ist oer nicht
+ hookgamestart = CreateHookableEvent(XFIRE_INGAMESTATUSHOOK);
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PS_BASICSEARCH);
+ CreateServiceFunction(servicefunction, BasicSearch);
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PSS_MESSAGE);
+ CreateServiceFunction( servicefunction, SendMessage );
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PSS_USERISTYPING);
+ CreateServiceFunction( servicefunction, UserIsTyping );
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PSR_MESSAGE);
+ CreateServiceFunction( servicefunction, RecvMessage );
+
+ strcpy(servicefunction, XFIRE_URLCALL);
+ CreateServiceFunction( servicefunction, UrlCall );
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, PSS_GETAWAYMSG);
+ CreateServiceFunction( servicefunction, GetAwayMsg );
+
+ strcpy(servicefunction, XFIRE_SET_NICK);
+ CreateServiceFunction( servicefunction, SetNickName );
+
+ strcpy(servicefunction, XFIRE_SEND_PREFS);
+ CreateServiceFunction( servicefunction, SendPrefs );
+
+ //für mtipper, damit man das statusico übertragen kann
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "/GetXStatusIcon");
+ CreateServiceFunction( servicefunction, GetXStatusIcon );
+
+ char AvatarsFolder[MAX_PATH]= "";
+ CallService(MS_DB_GETPROFILEPATH, (WPARAM) MAX_PATH, (LPARAM)AvatarsFolder);
+ strcat(AvatarsFolder, "\\");
+ strcat(AvatarsFolder, "XFire");
+ XFireWorkingFolder = FoldersRegisterCustomPath(protocolname, "Working Folder", AvatarsFolder);
+ XFireIconFolder = FoldersRegisterCustomPath(protocolname, "Game Icon Folder", AvatarsFolder);
+ strcat(AvatarsFolder, "\\Avatars");
+ XFireAvatarFolder = FoldersRegisterCustomPath(protocolname, "Avatars", AvatarsFolder);
+
+ //kein folders plugin, verzeichnisse anlegen
+ if (!ServiceExists(MS_FOLDERS_REGISTER_PATH)) {
+ CreateDirectory("XFire",NULL);
+ CreateDirectory("XFire\\Avatars",NULL);
+ }
+
+ //erweiterte Kontextmenüpunkte
+ CLISTMENUITEM mi = { 0 };
+ memset(&mi,0,sizeof(CLISTMENUITEM));
+ mi.cbSize = sizeof( mi );
+ mi.pszPopupName = protocolname;
+
+ //gotoprofilemenüpunkt
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "GotoProfile");
+ CreateServiceFunction(servicefunction,GotoProfile);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.pszContactOwner=protocolname;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszName = LPGEN("&XFire Online Profile");
+ Menu_AddContactMenuItem(&mi);
+
+ //gotoxfireclansitemenüpunkt
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "GotoXFireClanSite");
+ CreateServiceFunction(servicefunction,GotoXFireClanSite);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.pszContactOwner=protocolname;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszName = LPGEN("XFire &Clan Site");
+ gotoclansite=Menu_AddContactMenuItem(&mi);
+
+ //kopiermenüpunkt
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "GetIPPort");
+ CreateServiceFunction(servicefunction,GetIPPort);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("C&opy Server Address and Port");
+ copyipport=Menu_AddContactMenuItem(&mi);
+
+ //kopiermenüpunkt
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "VoiceIPPort");
+ CreateServiceFunction(servicefunction,GetVIPPort);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("Cop&y Voice Server Address and Port");
+ vipport=Menu_AddContactMenuItem(&mi);
+
+ //joinmenüpunkt
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "JoinGame");
+ CreateServiceFunction(servicefunction,JoinGame);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("Join &Game ...");
+ joingame=Menu_AddContactMenuItem(&mi);
+
+ //joinmenüpunkt
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "StartThisGame");
+ CreateServiceFunction(servicefunction,StartThisGame);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("Play this Game ...");
+ startthisgame=Menu_AddContactMenuItem(&mi);
+
+ //remove friend
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "RemoveFriend");
+ CreateServiceFunction(servicefunction,RemoveFriend);
+ mi.pszService = servicefunction;
+ mi.position = 2000070000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("Remove F&riend ...");
+ removefriend=Menu_AddContactMenuItem(&mi);
+
+ //block user
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "BlockFriend");
+ CreateServiceFunction(servicefunction,BlockFriend);
+ mi.pszService = servicefunction;
+ mi.position = 2000070000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("Block U&ser ...");
+ blockfriend=Menu_AddContactMenuItem(&mi);
+
+ //my fire profile
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "GotoProfile2");
+ CreateServiceFunction(servicefunction,GotoProfile2);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("&My XFire Online Profile");
+ Menu_AddMainMenuItem(&mi);
+
+ //my activity protocol
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "GotoProfileAct");
+ CreateServiceFunction(servicefunction,GotoProfileAct);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("&Activity Report");
+ Menu_AddMainMenuItem(&mi);
+
+ //rescan my games
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "ReScanMyGames");
+ CreateServiceFunction(servicefunction,ReScanMyGames);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("&Rescan my Games ...");
+ Menu_AddMainMenuItem(&mi);
+
+ strcpy(servicefunction, protocolname);
+ strcat(servicefunction, "SetNick");
+ CreateServiceFunction(servicefunction,SetNickDlg);
+ mi.pszService = servicefunction;
+ mi.position = 500090000;
+ mi.hIcon = LoadIcon(hinstance,MAKEINTRESOURCE(ID_OP));
+ mi.pszContactOwner=protocolname;
+ mi.pszName = LPGEN("Set &Nickname");
+ Menu_AddMainMenuItem(&mi);
+
+ HookEvent( ME_CLIST_PREBUILDCONTACTMENU, RebuildContactMenu );
+
+ //lade GetExtendedUdpTable Funktion
+ HMODULE hmod=LoadLibraryA("IpHlpApi.dll");
+ _GetExtendedUdpTable=(pGetExtendedUdpTable)GetProcAddress(hmod,"GetExtendedUdpTable");
+ if(_GetExtendedUdpTable==NULL&&DBGetContactSettingByte(NULL,protocolname,"ipportdetec",0))
+ {
+ //MessageBoxA(0,"GetExtendedUdpTable not found. ServerIP/Port detection feature will be disabled.","Miranda XFire Protocol Plugin",MB_OK|MB_ICONINFORMATION);
+ DBWriteContactSettingByte(NULL,protocolname,"ipportdetec",0);
+ XFireLog("Wasn't able to get GetExtendedUdpTable function");
+ }
+
+ char szFile[MAX_PATH];
+ GetModuleFileNameA(hinstance, szFile, MAX_PATH);
+
+ SKINICONDESC sid = {0};
+ sid.cbSize = sizeof(SKINICONDESC);
+ sid.pszDefaultFile = szFile;
+ sid.cx = sid.cy = 16;
+ sid.pszSection = (char*)LPGEN( "Protocols/XFire" );
+ sid.pszName = "XFIRE_main";
+ sid.pszDescription = (char*)Translate("Protocol icon");
+ sid.iDefaultIndex = -IDI_TM;
+ Skin_AddIcon(&sid);
+ return 0;
+}
+
+//funktion liefert für xstatusid den passenden ico zurück, für tipper zb notwendig
+int GetXStatusIcon(WPARAM wParam, LPARAM lParam) {
+ if(lParam == LR_SHARED)
+ {
+ if(wParam>1)
+ return (int)xgamelist.iconmngr.getGameIconFromId(wParam-2); //icocache[(int)wParam-2].hicon;
+ }
+ else
+ {
+ if(wParam>1)
+ return (int)CopyIcon((HICON)xgamelist.iconmngr.getGameIconFromId(wParam-2)/*icocache[(int)wParam-2].hicon*/);
+ }
+
+ return 0;
+}
+
+int RecvMessage(WPARAM wParam, LPARAM lParam)
+{
+ CCSDATA *ccs = ( CCSDATA* )lParam;
+ DBDeleteContactSetting(ccs->hContact, "CList", "Hidden");
+
+ char *szProto;
+ szProto = ( char* ) CallService( MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) ccs->hContact, 0);
+ if ( szProto != NULL && !lstrcmpiA( szProto, protocolname ))
+ return CallService( MS_PROTO_RECVMSG, wParam, lParam );
+
+ return 1;
+}
+
+static void SetMeAFK( LPVOID param )
+{
+ if(bpStatus==ID_STATUS_ONLINE)
+ {
+ SetStatus(ID_STATUS_AWAY,(LPARAM)param);
+ }
+}
+
+static void SetStatusLate( LPVOID param )
+{
+ Sleep(1000);
+ if(bpStatus==ID_STATUS_OFFLINE)
+ {
+ SetStatus((WPARAM)param,0);
+ }
+}
+
+static void SendAck( LPVOID param )
+{
+ ProtoBroadcastAck(protocolname, param, ACKTYPE_MESSAGE, ACKRESULT_SUCCESS, (HANDLE) 1, 0);
+}
+
+static void SendBadAck( LPVOID param )
+{
+ ProtoBroadcastAck(protocolname, param, ACKTYPE_MESSAGE, ACKRESULT_FAILED, (HANDLE) 0, LPARAM(Translate("XFire does not support offline messaging!")));
+}
+
+static int UserIsTyping(WPARAM wParam, LPARAM lParam)
+{
+ HANDLE hContact = ( HANDLE )wParam;
+ DBVARIANT dbv;
+
+ if(lParam==PROTOTYPE_SELFTYPING_ON)
+ {
+ if(DBGetContactSettingByte(NULL,protocolname,"sendtyping",1)==1)
+ {
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ if(!DBGetContactSettingTString(hContact, protocolname, "Username",&dbv))
+ {
+ SendTypingPacket typing;
+ typing.init(myClient->client, dbv.pszVal);
+ myClient->client->send( &typing );
+ DBFreeVariant(&dbv);
+ }
+ }
+ }
+ else if(lParam==PROTOTYPE_SELFTYPING_OFF)
+ {
+ }
+
+ return 0;
+}
+
+int SendMessage(WPARAM wParam, LPARAM lParam)
+{
+ CCSDATA *ccs = (CCSDATA *) lParam;
+ PROTORECVEVENT* pre = (PROTORECVEVENT*)ccs->lParam;
+ ACKDATA * ack = (ACKDATA*) lParam;
+ DBVARIANT dbv;
+ int sended=0;
+
+ DBGetContactSettingTString(ccs->hContact, protocolname, "Username",&dbv);
+ if(myClient!=NULL)
+ if(myClient->client->connected&&DBGetContactSettingWord(ccs->hContact, protocolname, "Status", -1)!=ID_STATUS_OFFLINE)
+ {
+ /*if(myClient->useutf8)
+ myClient->sendmsg(dbv.pszVal, ( char* )ccs->lParam);
+ else*/
+ myClient->sendmsg(dbv.pszVal, mir_utf8encode(( char* )ccs->lParam));
+
+ mir_forkthread(SendAck,ccs->hContact);
+ sended=1;
+ }
+ else
+ {
+ mir_forkthread(SendBadAck,ccs->hContact);
+ }
+ DBFreeVariant(&dbv);
+
+ return sended;
+}
+
+//=======================================================
+//GetCaps
+//=======================================================
+
+int GetCaps(WPARAM wParam,LPARAM lParam)
+{
+ if(wParam==PFLAGNUM_1)
+ return PF1_BASICSEARCH|PF1_MODEMSG|PF1_IM;
+ else if(wParam==PFLAGNUM_2)
+ return PF2_ONLINE|PF2_SHORTAWAY; // add the possible statuses here.
+ else if(wParam==PFLAGNUM_3)
+ return PF2_ONLINE|(DBGetContactSettingByte(NULL,protocolname,"nocustomaway",0)==1?0:PF2_SHORTAWAY);
+ else if(wParam==PFLAGNUM_4)
+ return PF4_SUPPORTTYPING|PF4_AVATARS;
+ else if(wParam==PFLAG_UNIQUEIDTEXT)
+ return (int) Translate("Username");
+ else if(wParam==PFLAG_UNIQUEIDSETTING)
+ return (int)"Username";
+ else if(wParam==PFLAG_MAXLENOFMESSAGE)
+ return 3996; //255;
+ return 0;
+}
+
+//=======================================================
+//GetName (tray icon)
+//=======================================================
+int GetName(WPARAM wParam,LPARAM lParam)
+{
+ lstrcpyn((char*)lParam,"XFire",wParam);
+ return 0;
+}
+
+//=======================================================
+//TMLoadIcon
+//=======================================================
+int TMLoadIcon(WPARAM wParam,LPARAM lParam)
+{
+ if(LOWORD( wParam ) == PLI_PROTOCOL) {
+ if(wParam & PLIF_ICOLIB)
+ return (int)Skin_GetIcon("XFIRE_main");
+ return (int)CopyIcon( Skin_GetIcon("XFIRE_main"));
+ }
+ return NULL;
+}
+
+
+static void ConnectingThread(LPVOID params)
+{
+ WPARAM wParam=(WPARAM)params;
+
+ EnterCriticalSection(&connectingMutex);
+
+ if(myClient!=NULL&&myClient->client!=NULL)
+ myClient->run();
+ else
+ {
+ EnterCriticalSection(&connectingMutex);
+ return;
+ }
+
+ if(myClient->client->connected)
+ {
+ sendonrecieve=TRUE;
+ }
+ else
+ {
+ if(DBGetContactSettingWord(NULL,protocolname,"noconnectfailedbox",0)==0) MSGBOXE(Translate("Unable to connect to XFire."));
+ wParam =ID_STATUS_OFFLINE;
+ }
+
+ int oldStatus;
+ oldStatus = bpStatus;
+ bpStatus = wParam;
+
+ ProtoBroadcastAck(protocolname,NULL,ACKTYPE_STATUS,ACKRESULT_SUCCESS,(HANDLE)oldStatus,wParam);
+
+ LeaveCriticalSection(&connectingMutex);
+}
+
+//=======================================================
+//SetStatus
+//=======================================================
+int SetStatus(WPARAM wParam,LPARAM lParam)
+{
+ int oldStatus;
+
+ oldStatus = bpStatus;
+
+ if(bpStatus==ID_STATUS_CONNECTING)
+ return 0;
+
+ if(wParam!=ID_STATUS_ONLINE&&wParam!=ID_STATUS_OFFLINE&&wParam!=ID_STATUS_AWAY&&wParam!=ID_STATUS_RECONNECT)
+ if(DBGetContactSettingByte(NULL,protocolname,"oninsteadafk",0)==0)
+ wParam=ID_STATUS_AWAY; //protokoll auf away schalten
+ else
+ wParam=ID_STATUS_ONLINE; //protokoll auf online schalten
+
+ if (
+ (wParam == ID_STATUS_ONLINE && bpStatus!=ID_STATUS_ONLINE) || // offline --> online
+ (wParam == ID_STATUS_AWAY && bpStatus==ID_STATUS_OFFLINE) // offline --> away
+ )
+ {
+ if(bpStatus == ID_STATUS_AWAY) // away --> online
+ {
+ myClient->Status(statusmessage[0]);
+ }
+ else
+ {
+ // the status has been changed to online (maybe run some more code)
+ DBVARIANT dbv;
+ DBVARIANT dbv2;
+
+ if(DBGetContactSetting(NULL,protocolname,"login",&dbv))
+ {
+ MSGBOXE(Translate("No Loginname is set!"));
+ wParam=ID_STATUS_OFFLINE;
+ }
+ else if(DBGetContactSetting(NULL,protocolname,"password",&dbv2))
+ {
+ MSGBOXE(Translate("No Password is set!"));
+ wParam=ID_STATUS_OFFLINE;
+ }
+ else
+ {
+ CallService(MS_DB_CRYPT_DECODESTRING,strlen(dbv2.pszVal)+1,(LPARAM)dbv2.pszVal);
+
+ if(myClient!=NULL)
+ delete myClient;
+
+ //alter proxycode, entfernt da über netlib die proxysache geregelt wird
+ /* if(DBGetContactSettingByte(NULL, protocolname, "useproxy" ,0))
+ {
+ //verbindung über proxy
+ DBVARIANT dbv3;
+ DBVARIANT dbv4;
+ if(!DBGetContactSetting(NULL,protocolname,"proxyip",&dbv3))
+ {
+ if(!DBGetContactSetting(NULL,protocolname,"proxyport",&dbv4))
+ {
+ myClient = new XFireClient(dbv.pszVal,dbv2.pszVal,DBGetContactSettingByte(NULL,protocolname,"protover",0),1,dbv3.pszVal,atoi(dbv4.pszVal));
+ DBFreeVariant(&dbv4);
+ }
+ DBFreeVariant(&dbv3);
+ }
+ }
+ else */
+ myClient = new XFireClient(dbv.pszVal,dbv2.pszVal,DBGetContactSettingByte(NULL,protocolname,"protover",0));
+
+ //prüfe ob utf8 option aktiv, dann schlater auf true
+ if(DBGetContactSettingByte(NULL,protocolname,"useutf8",0))
+ {
+ myClient->useutf8=TRUE;
+ }
+
+
+ //verbindung als thread
+ bpStatus = ID_STATUS_CONNECTING;
+ ProtoBroadcastAck(protocolname,NULL,ACKTYPE_STATUS,ACKRESULT_SUCCESS,(HANDLE)oldStatus,ID_STATUS_CONNECTING);
+
+ mir_forkthread(ConnectingThread,(LPVOID)wParam);
+ //alte verb
+ /*
+ myClient->run();
+
+ if(myClient->client->connected)
+ {
+ sendonrecieve=TRUE;
+ }
+ else
+ {
+ MSGBOXE(Translate("Unable to connect to XFire."));
+ wParam =ID_STATUS_OFFLINE;
+ }
+ */
+ //für die vars
+ DBDeleteContactSetting(NULL,protocolname,"currentgamename");
+ DBDeleteContactSetting(NULL,protocolname,"currentvoicename");
+ DBDeleteContactSetting(NULL,protocolname,"VServerIP");
+ DBDeleteContactSetting(NULL,protocolname,"ServerIP");
+
+ DBFreeVariant(&dbv);
+ DBFreeVariant(&dbv2);
+ return 0;
+ }
+ }
+ }
+ else if (wParam == ID_STATUS_AWAY && bpStatus!=ID_STATUS_AWAY)
+ {
+ if(bpStatus == ID_STATUS_OFFLINE) // nix
+ {
+ }
+ else if(myClient!=NULL&&myClient->client->connected) // online --> afk
+ {
+ //setze bei aktivem nocustomaway die alte awaystatusmsg zurück, bugfix
+ if(DBGetContactSettingByte(NULL,protocolname,"nocustomaway",0))
+ strcpy_s(statusmessage[1],1024,"(AFK) Away from Keyboard");
+
+ myClient->Status(statusmessage[1]);
+ }
+ }
+ else if ((wParam == ID_STATUS_OFFLINE || wParam == ID_STATUS_RECONNECT) && bpStatus!=ID_STATUS_OFFLINE) // * --> offline
+ {
+ SetEvent(hConnectionClose);
+
+ // the status has been changed to offline (maybe run some more code)
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ myClient->client->disconnect();
+ CList_MakeAllOffline();
+
+ //teamspeak/ventrilo pid sowie gamepid auf NULL setzen, damit bei einem reconnect die neuerkannt werden
+ pid=NULL;
+ ts2pid=NULL;
+ DBWriteContactSettingWord(NULL,protocolname,"currentgame",0);
+ DBWriteContactSettingWord(NULL,protocolname,"currentvoice",0);
+ DBDeleteContactSetting(NULL,protocolname, "VServerIP");
+ DBDeleteContactSetting(NULL,protocolname, "ServerIP");
+
+ if(wParam == ID_STATUS_RECONNECT)
+ {
+ mir_forkthread(SetStatusLate,(LPVOID)oldStatus);
+ wParam = ID_STATUS_OFFLINE;
+ }
+ }
+ else
+ {
+ // the status has been changed to unknown (maybe run some more code)
+ }
+ //broadcast the message
+ bpStatus = wParam;
+ ProtoBroadcastAck(protocolname,NULL,ACKTYPE_STATUS,ACKRESULT_SUCCESS,(HANDLE)oldStatus,wParam);
+
+
+ return 0;
+}
+
+//=======================================================
+//GetStatus
+//=======================================================
+int GetStatus(WPARAM wParam,LPARAM lParam)
+{
+ if (bpStatus == ID_STATUS_ONLINE)
+ return ID_STATUS_ONLINE;
+ else if (bpStatus == ID_STATUS_AWAY)
+ return ID_STATUS_AWAY;
+ else if (bpStatus == ID_STATUS_CONNECTING)
+ return ID_STATUS_CONNECTING;
+ else
+ return ID_STATUS_OFFLINE;
+}
+
+HANDLE CList_AddContact(XFireContact xfc, bool InList, bool SetOnline,int clan)
+{
+ HANDLE hContact;
+
+ if (xfc.username == NULL)
+ return 0;
+
+ // here we create a new one since no one is to be found
+ hContact = (HANDLE) CallService( MS_DB_CONTACT_ADD, 0, 0);
+ if ( hContact ) {
+ CallService( MS_PROTO_ADDTOCONTACT, (WPARAM) hContact, (LPARAM)protocolname );
+
+ if ( InList )
+ DBDeleteContactSetting(hContact, "CList", "NotOnList");
+ else
+ DBWriteContactSettingByte(hContact, "CList", "NotOnList", 1);
+ DBDeleteContactSetting(hContact, "CList", "Hidden");
+
+ if(strlen(xfc.nick)>0)
+ {
+ if(myClient->useutf8)
+ DBWriteContactSettingUTF8String(hContact, protocolname, "Nick", xfc.nick);
+ else
+ DBWriteContactSettingTString(hContact, protocolname, "Nick", mir_utf8decode(( char* )xfc.nick,NULL));
+ }
+ else if(strlen(xfc.username)>0)
+ DBWriteContactSettingTString(hContact, protocolname, "Nick", xfc.username);
+
+ DBWriteContactSettingTString(hContact, protocolname, "Username", xfc.username);
+
+ //DBWriteContactSettingTString(hContact, protocolname, "Screenname", xfc.nick);
+ DBWriteContactSettingDword(hContact, protocolname, "UserId", xfc.id);
+
+ if(clan>0)
+ DBWriteContactSettingDword(hContact, protocolname, "Clan", clan);
+
+ DBWriteContactSettingWord(hContact, protocolname, "Status", SetOnline ? ID_STATUS_ONLINE:ID_STATUS_OFFLINE);
+
+ if(DBGetContactSettingByte(NULL,protocolname,"noavatars",-1)==0)
+ {
+ if(!DBGetContactSettingByte(NULL,protocolname,"specialavatarload",0))
+ {
+ XFire_SetAvatar* xsa=new XFire_SetAvatar;
+ xsa->hContact=hContact;
+ xsa->username=new char[strlen(xfc.username)+1];
+ strcpy(xsa->username,xfc.username);
+ mir_forkthread(SetAvatar,(LPVOID)xsa);
+ }
+ else
+ {
+ /*
+ scheinbar unterpricht xfire bei zu agressiven nachfragen der buddyinfos die verbindung , deshalb erstmal auskommentiert
+ getestet mit clanbuddy's >270 members
+
+ mit hilfe der buddyinfos kann man den avatar laden und screenshot infos etc bekommt man auch
+ */
+ GetBuddyInfo* buddyinfo=new GetBuddyInfo();
+ buddyinfo->userid=xfc.id;
+ mir_forkthread(SetAvatar2,(LPVOID)buddyinfo);
+ }
+
+
+ }
+
+ if (xfc.id==0) {
+ DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 );
+ DBWriteContactSettingByte( hContact, "CList", "Hidden", 1 );
+ }
+
+ return hContact;
+ }
+ return false;
+}
+
+BOOL IsXFireContact(HANDLE hContact)
+{
+ char *szProto;
+ szProto = ( char* ) CallService( MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0);
+ if ( szProto != NULL && !lstrcmpiA( szProto, protocolname )) {
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+HANDLE CList_FindContact (int uid)
+{
+ char *szProto;
+
+ HANDLE hContact = (HANDLE) CallService( MS_DB_CONTACT_FINDFIRST, 0, 0);
+ while (hContact) {
+ szProto = ( char* ) CallService( MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0);
+ if ( szProto != NULL && !lstrcmpiA( szProto, protocolname )) {
+ if ( DBGetContactSettingDword(hContact, protocolname, "UserId",-1)==uid)
+ {
+ return (HANDLE)hContact;
+ }
+ }
+ hContact = (HANDLE) CallService( MS_DB_CONTACT_FINDNEXT, (WPARAM) hContact, 0);
+ }
+ return 0;
+}
+
+void CList_MakeAllOffline()
+{
+ vector<HANDLE> fhandles;
+ char *szProto;
+ HANDLE hContact = (HANDLE) CallService( MS_DB_CONTACT_FINDFIRST, 0, 0);
+ while (hContact) {
+ szProto = ( char* ) CallService( MS_PROTO_GETCONTACTBASEPROTO, (WPARAM) hContact, 0);
+ if ( szProto != NULL && !lstrcmpiA( szProto, protocolname )) {
+ //freunde von freunden in eine seperate liste setzen
+ //nur wenn das nicht abgestellt wurde
+ if(DBGetContactSettingByte(hContact,protocolname,"friendoffriend",0)==1&&
+ DBGetContactSettingByte(NULL,protocolname,"fofdbremove",0)==1)
+ {
+ fhandles.push_back(hContact);
+ }
+
+ //DBDeleteContactSetting(hContact, protocolname, "XStatusMsg");
+ //DBDeleteContactSetting(hContact, protocolname, "XStatusId");
+ //DBDeleteContactSetting(hContact, protocolname, "XStatusName");
+ //DBDeleteContactSetting(hContact, "CList", "StatusMsg");
+ DBDeleteContactSetting(hContact, protocolname, "ServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "Port");
+ DBDeleteContactSetting(hContact, protocolname, "ServerName");
+ DBDeleteContactSetting(hContact, protocolname, "GameType");
+ DBDeleteContactSetting(hContact, protocolname, "Map");
+ DBDeleteContactSetting(hContact, protocolname, "Players");
+ DBDeleteContactSetting(hContact, protocolname, "Passworded");
+
+ DBWriteContactSettingTString(hContact, "CList", "StatusMsg", "");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusMsg");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusId");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusName");
+
+ if(DBGetContactSettingByte(NULL,protocolname,"noavatars",-1)==1)
+ {
+ DBDeleteContactSetting(hContact, "ContactPhoto", "File");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "RFile");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "Backup");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "Format");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "ImageHash");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "XFireAvatarId");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "XFireAvatarMode");
+ }
+ else
+ {
+ //prüf ob der avatar noch existiert
+ DBVARIANT dbv;
+ if(!DBGetContactSettingTString(hContact, "ContactPhoto", "File",&dbv))
+ {
+ FILE*f=fopen(dbv.pszVal,"r");
+ if(f==NULL)
+ {
+ DBDeleteContactSetting(hContact, "ContactPhoto", "File");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "RFile");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "Backup");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "Format");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "ImageHash");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "XFireAvatarId");
+ DBDeleteContactSetting(hContact, "ContactPhoto", "XFireAvatarMode");
+ }
+ else
+ {
+ fclose(f);
+ }
+ DBFreeVariant(&dbv);
+ }
+ }
+ DBWriteContactSettingWord(hContact,protocolname,"Status",ID_STATUS_OFFLINE);
+ }
+ hContact = (HANDLE) CallService( MS_DB_CONTACT_FINDNEXT, (WPARAM) hContact, 0);
+ }
+ //alle gefundenen handles lsöchen
+ for(uint i=0;i<fhandles.size();i++)
+ {
+ CallService( MS_DB_CONTACT_DELETE, (WPARAM) fhandles.at(i), 0);
+ }
+}
+
+void SetIcon(HANDLE hcontact,HANDLE hicon,int ctype)
+{
+ IconExtraColumn iec;
+ iec.cbSize = sizeof(iec);
+ iec.hImage = hicon;
+ iec.ColumnType = ctype;
+ CallService(MS_CLIST_EXTRA_SET_ICON, (WPARAM)hcontact, (LPARAM)&iec);
+}
+
+void SetAvatar2(LPVOID lparam) {
+ static int lasttime=0;
+ int sleep=DBGetContactSettingWord(NULL,protocolname,"avatarloadlatency",1000);
+ lasttime+=sleep;
+
+ if(mySleep(lasttime,hConnectionClose))
+ {
+ delete lparam;
+ lasttime-=sleep;
+ return;
+ }
+
+ GetBuddyInfo* buddyinfo=(GetBuddyInfo*)lparam;
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ myClient->client->send( buddyinfo );
+
+ delete lparam;
+ lasttime-=sleep;
+}
+
+void SetAvatar(LPVOID lparam)
+//void SetAvatar(HANDLE hContact, char* username)
+{
+ //EnterCriticalSection(&avatarMutex);
+ //WaitForSingleObject(hMutex, INFINITE);
+ static int lasttime=0;
+ int sleep=DBGetContactSettingWord(NULL,protocolname,"avatarloadlatency",250);
+
+ if(bpStatus==ID_STATUS_OFFLINE)
+ return;
+
+ lasttime+=sleep;
+ //Sleep(lasttime);
+ if(mySleep(lasttime,hConnectionClose))
+ {
+ delete lparam;
+ lasttime-=sleep;
+ return;
+ }
+
+ if(bpStatus==ID_STATUS_OFFLINE)
+ return;
+
+ XFireAvatar av;
+
+ XFire_SetAvatar* xsa=(XFire_SetAvatar*)lparam;
+
+ if(xsa->hContact==NULL)
+ return;
+
+ if(GetAvatar(xsa->username,&av))
+ {
+ PROTO_AVATAR_INFORMATION AI;
+ AI.cbSize = sizeof(AI);
+ AI.format = av.type;
+ AI.hContact = xsa->hContact;
+ lstrcpy(AI.filename,av.file);
+ ProtoBroadcastAck(protocolname, xsa->hContact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS,(HANDLE) &AI, 0);
+ }
+
+ delete(xsa);
+ //ReleaseMutex(hMutex);
+
+ lasttime-=sleep;
+}
+
+BOOL GetAvatar(char* username,XFireAvatar* av)
+{
+ BOOL status=FALSE;
+
+ if(av==NULL||username==NULL)
+ return FALSE;
+
+ char address[256]="http://www.xfire.com/profile/";
+ strcat_s(address,256,username);
+ strcat_s(address,256,"/");
+
+ //netlib request
+ NETLIBHTTPREQUEST nlhr={0},*nlhrReply;
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_GET;
+ nlhr.flags = NLHRF_NODUMP|NLHRF_GENERATEHOST|NLHRF_SMARTAUTHHEADER;
+ nlhr.szUrl = address;
+
+ nlhrReply=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,(WPARAM)hNetlib,(LPARAM)&nlhr);
+
+ if(nlhrReply) {
+ //nicht auf dem server
+ if (nlhrReply->resultCode != 200) {
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ return FALSE;
+ }
+ //keine daten für mich
+ else if (nlhrReply->dataLength < 1 || nlhrReply->pData == NULL)
+ {
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ return FALSE;
+ }
+ else
+ {
+ //fwrite(nlhrReply->pData,nlhrReply->dataLength,1,f);
+
+ //id wo angefangen wird, die adresse "rauszuschneiden"
+ char avatarid[]="m_user_avatar_img_wrapper";
+ char* pointer_av=avatarid;
+ //ende des datenbuffers
+ char* deathend=nlhrReply->pData+nlhrReply->dataLength;
+ char* pointer=nlhrReply->pData;
+ //status ob gefunden oder nich
+ BOOL found=FALSE;
+
+ while(pointer<deathend&&*pointer_av!=0)
+ {
+ if(*pointer_av==*pointer)
+ {
+ pointer_av++;
+ if(pointer_av-avatarid>4)
+ found=TRUE;
+ }
+ else
+ pointer_av=avatarid;
+
+ pointer++;
+ }
+ //was gefunden, nun das bild raustrennen
+ if(*pointer_av==0)
+ {
+ char * pos = NULL;
+ pos=strchr(pointer,'/');
+ pos-=5;
+ pointer=pos;
+
+ pos=strchr(pointer,' ');
+ if(pos)
+ {
+ pos--;
+ *pos=0;
+
+ //analysieren, welchent typ das bild hat
+ pos=strrchr(pointer,'.');
+ if(pos)
+ {
+ char filename[512];
+ FoldersGetCustomPath( XFireAvatarFolder, filename, 1024, "" );
+ strcat(filename,"\\");
+ strcat(filename,username);
+
+ pos++;
+ //gif?!?!
+ if(*pos=='g'&&
+ *(pos+1)=='i'&&
+ *(pos+2)=='f')
+ {
+ av->type=PA_FORMAT_GIF;
+ strcat(filename,".gif");
+ }
+ else//dann kanns nur jpg sein
+ {
+ av->type=PA_FORMAT_JPEG;
+ strcat(filename,".jpg");
+ }
+
+ //verusch das bild runterladen
+ if(GetWWWContent2(pointer,filename,FALSE))
+ {
+ strcpy_s(av->file,256,filename); //setzte dateinamen
+ status=TRUE; //avatarladen hat geklappt, cool :)
+ }
+ }
+ }
+ }
+ }
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ }
+
+ return status;
+}
+
+static int GetIPPort(WPARAM wParam,LPARAM lParam)
+{
+ char temp[XFIRE_MAX_STATIC_STRING_LEN];
+ HGLOBAL clipbuffer;
+ char* buffer;
+
+ if(DBGetContactSettingWord((HANDLE)wParam, protocolname, "Port", -1)==0)
+ return 0;
+
+ DBVARIANT dbv;
+ if(DBGetContactSettingTString((HANDLE)wParam, protocolname, "ServerIP",&dbv))
+ return 0;
+
+ sprintf(temp,"%s:%d",dbv.pszVal,DBGetContactSettingWord((HANDLE)wParam, protocolname, "Port", -1));
+
+ DBFreeVariant(&dbv);
+
+ if(OpenClipboard(NULL))
+ {
+ EmptyClipboard();
+
+ clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(temp)+1);
+ buffer = (char*)GlobalLock(clipbuffer);
+ strcpy(buffer, LPCSTR(temp));
+ GlobalUnlock(clipbuffer);
+
+ SetClipboardData(CF_TEXT, clipbuffer);
+ CloseClipboard();
+ }
+
+ return 0;
+}
+
+static int GetVIPPort(WPARAM wParam,LPARAM lParam)
+{
+ char temp[XFIRE_MAX_STATIC_STRING_LEN];
+ HGLOBAL clipbuffer;
+ char* buffer;
+
+ if(DBGetContactSettingWord((HANDLE)wParam, protocolname, "VPort", -1)==0)
+ return 0;
+
+ DBVARIANT dbv;
+ if(DBGetContactSettingTString((HANDLE)wParam, protocolname, "VServerIP",&dbv))
+ return 0;
+
+ sprintf(temp,"%s:%d",dbv.pszVal,DBGetContactSettingWord((HANDLE)wParam, protocolname, "VPort", -1));
+
+ DBFreeVariant(&dbv);
+
+ if(OpenClipboard(NULL))
+ {
+ EmptyClipboard();
+
+ clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(temp)+1);
+ buffer = (char*)GlobalLock(clipbuffer);
+ strcpy(buffer, LPCSTR(temp));
+ GlobalUnlock(clipbuffer);
+
+ SetClipboardData(CF_TEXT, clipbuffer);
+ CloseClipboard();
+ }
+
+ return 0;
+}
+
+static int GotoProfile(WPARAM wParam,LPARAM lParam)
+{
+ DBVARIANT dbv;
+ char temp[64]="";
+
+ if(DBGetContactSettingTString((HANDLE)wParam, protocolname, "Username",&dbv))
+ return 0;
+
+ strcpy(temp,"http://xfire.com/profile/");
+ strcat_s(temp,64,dbv.pszVal);
+ DBFreeVariant(&dbv);
+
+ CallService( MS_UTILS_OPENURL, 1, (LPARAM)temp );
+
+ return 0;
+}
+
+static int GotoXFireClanSite(WPARAM wParam,LPARAM lParam) {
+ DBVARIANT dbv;
+ char temp[64]="";
+
+ int clanid=DBGetContactSettingDword((HANDLE)wParam, protocolname, "Clan",-1);
+ sprintf(temp,"ClanUrl_%d",clanid);
+
+ if(DBGetContactSettingTString(NULL, protocolname, temp,&dbv))
+ return 0;
+
+ strcpy(temp,"http://xfire.com/clans/");
+ strcat_s(temp,64,dbv.pszVal);
+ DBFreeVariant(&dbv);
+
+ CallService( MS_UTILS_OPENURL, 1, (LPARAM)temp );
+
+ return 0;
+}
+
+static int GotoProfile2(WPARAM wParam,LPARAM lParam)
+{
+ DBVARIANT dbv;
+ char temp[64]="";
+
+ if(DBGetContactSettingTString(NULL, protocolname, "login",&dbv))
+ return 0;
+
+ strcpy(temp,"http://xfire.com/profile/");
+ strcat_s(temp,64,dbv.pszVal);
+ DBFreeVariant(&dbv);
+
+ CallService( MS_UTILS_OPENURL, 1, (LPARAM)temp );
+
+ //prefrences pakcet senden
+ //XFirePrefPacket *packet2 = new XFirePrefPacket();
+ //myClient->client->send( packet2 );
+ //delete(packet2);
+
+ return 0;
+}
+
+static int GotoProfileAct(WPARAM wParam,LPARAM lParam)
+{
+ DBVARIANT dbv;
+ char temp[64]="";
+
+ if(DBGetContactSettingTString(NULL, protocolname, "login",&dbv))
+ return 0;
+
+ strcpy(temp,"http://www.xfire.com/?username=");
+ strcat_s(temp,64,dbv.pszVal);
+ DBFreeVariant(&dbv);
+
+ CallService( MS_UTILS_OPENURL, 1, (LPARAM)temp );
+
+ //prefrences pakcet senden
+ //XFirePrefPacket *packet2 = new XFirePrefPacket();
+ //myClient->client->send( packet2 );
+ //delete(packet2);
+
+ return 0;
+}
+
+int RebuildContactMenu( WPARAM wParam, LPARAM lParam )
+{
+ CLISTMENUITEM clmi = { 0 };
+ clmi.cbSize = sizeof( clmi );
+ CLISTMENUITEM clmi2 = { 0 };
+ clmi2.cbSize = sizeof( clmi2 );
+ CLISTMENUITEM clmi3 = { 0 };
+ clmi3.cbSize = sizeof( clmi3 );
+ CLISTMENUITEM clmi4 = { 0 };
+ clmi4.cbSize = sizeof( clmi4 );
+ CLISTMENUITEM clmi5 = { 0 };
+ clmi5.cbSize = sizeof( clmi5 );
+ CLISTMENUITEM clmi6 = { 0 };
+ clmi6.cbSize = sizeof( clmi6 );
+ CLISTMENUITEM clmi7 = { 0 };
+ clmi7.cbSize = sizeof( clmi7 );
+ CLISTMENUITEM clmi8 = { 0 };
+ clmi8.cbSize = sizeof( clmi8 );
+
+ //kopieren von port und ip nur erlauben, wenn verfügbar
+ clmi.flags = CMIM_FLAGS;
+ clmi2.flags = CMIM_FLAGS;
+ clmi3.flags = CMIM_FLAGS;
+ clmi4.flags = CMIM_FLAGS;
+ clmi5.flags = CMIM_FLAGS;
+ clmi6.flags = CMIM_FLAGS;
+ clmi7.flags = CMIM_FLAGS;
+ clmi8.flags = CMIM_FLAGS;
+
+ DBVARIANT dbv;
+ if(DBGetContactSettingTString((HANDLE)wParam, protocolname, "ServerIP",&dbv))
+ clmi.flags|= CMIF_HIDDEN;
+ else
+ DBFreeVariant(&dbv);
+
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )copyipport, ( LPARAM )&clmi );
+
+ //kopieren von voice port und ip nur erlauben, wenn verfügbar
+ DBVARIANT dbv2;
+ if(DBGetContactSettingTString((HANDLE)wParam, protocolname, "VServerIP",&dbv2))
+ {
+ clmi2.flags|= CMIF_HIDDEN;
+ }
+ else
+ DBFreeVariant(&dbv2);
+
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )vipport, ( LPARAM )&clmi2 );
+
+ //clansite nur bei clanmembern anbieten
+ if(DBGetContactSettingDword((HANDLE)wParam, protocolname, "Clan",0)==0)
+ clmi3.flags|= CMIF_HIDDEN;
+
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )gotoclansite, ( LPARAM )&clmi3 );
+
+ //NotOnList
+ if(DBGetContactSettingDword((HANDLE)wParam, "CList", "NotOnList",0)==0)
+ clmi5.flags|= CMIF_HIDDEN;
+
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )blockfriend, ( LPARAM )&clmi5 );
+
+ //speichere gameid ab
+ int gameid=DBGetContactSettingWord((HANDLE)wParam, protocolname, "GameId",0);
+ //spiel in xfirespieliste?
+ if(!xgamelist.Gameinlist(gameid))
+ {
+ //nein, dann start und join auf unsichbar schalten
+ clmi7.flags|= CMIF_HIDDEN;
+ clmi4.flags|= CMIF_HIDDEN;
+ }
+ else
+ {
+ //gameobject holen
+ Xfire_game* game=xgamelist.getGamebyGameid(gameid);
+ //hat das spiel netzwerkparameter?
+ if(game)
+ {
+ if(game->networkparams)
+ {
+ //is beim buddy ein port hinterlegt, also spielt er im internet?
+ if(!DBGetContactSettingDword((HANDLE)wParam, protocolname, "Port",0))
+ {
+ //nein, dann join button auch ausblenden
+ clmi4.flags|= CMIF_HIDDEN;
+ }
+ }
+ else
+ clmi4.flags|= CMIF_HIDDEN;
+ }
+ else
+ clmi4.flags|= CMIF_HIDDEN;
+ }
+
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )joingame, ( LPARAM )&clmi4 );
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )startthisgame, ( LPARAM )&clmi7 );
+
+
+ //remove freind nur bei noramlen buddies
+ if(DBGetContactSettingByte((HANDLE)wParam, protocolname, "friendoffriend",0)==1)
+ clmi8.flags|= CMIF_HIDDEN;
+
+ CallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )removefriend, ( LPARAM )&clmi8 );
+
+ return 0;
+}
+
+//wird beim miranda start ausgeführt, lädt spiele und startet gamedetection
+#ifndef NO_PTHREAD
+void *inigamedetectiont(void *ptr)
+#else
+void inigamedetectiont(LPVOID lParam)
+#endif
+{
+ Scan4Games(NULL);
+#ifndef NO_PTHREAD
+ return gamedetectiont(ptr);
+#else
+ gamedetectiont(NULL);
+#endif
+
+}
+
+void SetXFireGameStatusMsg(Xfire_game* game)
+{
+ char inipath[XFIRE_MAX_STATIC_STRING_LEN]="";
+ static char statusmsg[100]="";
+
+ //kein gameobject, dann abbrechen
+ if(!game) return;
+
+ if(!game->statusmsg)
+ {
+ xgamelist.getIniValue(game->id,"XUSERStatusMsg",statusmsg,100);
+ }
+ else
+ {
+ strcpy_s(statusmsg,100,game->statusmsg);
+ }
+
+ if(statusmsg[0]!=0)
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ myClient->Status(statusmsg);
+
+}
+
+#ifndef NO_PTHREAD
+void *gamedetectiont(void *ptr)
+#else
+void gamedetectiont(LPVOID lparam)
+#endif
+{
+ DWORD ec; //exitcode der processid
+ int ts2port=0;
+ int vid=0;
+ char ts2ip[4]={0,0,0,0};
+ char temp[200];
+ Xfire_game* currentgame=NULL;
+ BOOL disabledsound=FALSE;
+ BOOL disabledpopups=FALSE;
+
+ //vaiable zum spielzeit messen
+ time_t t1;
+
+
+ if(DBGetContactSettingByte(NULL,protocolname,"nogamedetect",0))
+#ifndef NO_PTHREAD
+ return ptr;
+#else
+ return;
+#endif
+
+ DWORD lowpids=DBGetContactSettingByte(NULL,protocolname,"skiplowpid",100);
+
+ //XFireLog("XFire Gamedetectionthread started ...","");
+
+ while(1)
+ {
+ //Sleep(12000);
+ //XFireLog("12 Sek warten ...","");
+ if(mySleep(12000,hGameDetection))
+ {
+#ifndef NO_PTHREAD
+ return ptr;
+#else
+ return;
+#endif
+ }
+
+#ifndef NO_PTHREAD
+ pthread_testcancel();
+#else
+ if(Miranda_Terminated())
+ return;
+#endif
+
+ if(myClient!=NULL)
+ if(!myClient->client->connected)
+ {
+ //XFireLog("PID und TSPID resett ...","");
+ ts2pid=pid=0;
+ //voicechat internen status zurücksetzen
+ voicechat.resetCurrentvoicestatus();
+ }
+ /*
+ else*/
+ {
+ //erstmal nach TS2 suchen
+ //XFireLog("Teamspeak detection ...","");
+ if(DBGetContactSettingByte(NULL,protocolname,"ts2detection",0))
+ {
+ SendGameStatus2Packet *packet = new SendGameStatus2Packet();
+ if(voicechat.checkVoicechat(packet)) {
+ if(myClient!=NULL)
+ {
+ XFireLog("Send voicechat infos ...");
+ myClient->client->send( packet );
+ }
+ }
+ delete packet;
+
+ //nach ts3 mapfile suchen
+ //HANDLE hMapObject = OpenFileMappingA(FILE_MAP_READ, FALSE, "$ts3info4xfire$");
+ //if (hMapObject) {
+ //}
+ //wenn remote feature aktiviert, darüber ip erkennen
+ /*if(DBGetContactSettingByte(NULL,protocolname,"ts2useremote",0))
+ {
+ //ipholen
+ SendGameStatus2Packet *packet = new SendGameStatus2Packet();
+ if(TSSetupPacket(packet,&ts2pid,&ts2port))
+ {
+ DBWriteContactSettingWord(NULL,protocolname,"currentvoice",packet->gameid);
+
+ if(packet->ip[3]!=0)
+ {
+ sprintf(temp,"%d.%d.%d.%d:%d",(unsigned char)packet->ip[3],(unsigned char)packet->ip[2],(unsigned char)packet->ip[1],(unsigned char)packet->ip[0],packet->port);
+ DBWriteContactSettingTString(NULL, protocolname, "VServerIP", temp);
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Teamspeak");
+ }
+ else
+ {
+ DBDeleteContactSetting(NULL,protocolname, "VServerIP");
+ DBDeleteContactSetting(NULL,protocolname, "currentvoicename");
+ }
+
+ if(myClient!=NULL)
+ myClient->client->send( packet );
+ }
+ delete packet;
+
+ }
+ else
+ {
+ if(!ts2pid)
+ {
+ if(FindTeamSpeak(&ts2pid,&vid))
+ {
+ //gefunden, serverdaten scannen
+ SendGameStatus2Packet *packet = new SendGameStatus2Packet();
+ if(myClient!=NULL)
+ if(GetServerIPPort2(ts2pid,myClient->client->localaddr,myClient->client->llocaladdr,&packet->ip[3],&packet->ip[2],&packet->ip[1],&packet->ip[0],&packet->port))
+ {
+ if(packet->port!=0)
+ {
+ packet->gameid=vid;
+
+ if(vid==32)
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Teamspeak");
+ else if(vid==33)
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Ventrilo");
+ else if(vid==34)
+ DBWriteContactSettingTString(NULL, protocolname, "currentvoicename", "Mumble");
+
+ DBWriteContactSettingWord(NULL,protocolname,"currentvoice",vid);
+
+ sprintf(temp,"%d.%d.%d.%d:%d",(unsigned char)packet->ip[3],(unsigned char)packet->ip[2],(unsigned char)packet->ip[1],(unsigned char)packet->ip[0],packet->port);
+ DBWriteContactSettingTString(NULL, protocolname, "VServerIP", temp);
+
+ if(myClient!=NULL)
+ myClient->client->send( packet );
+ }
+ }
+ delete packet;
+ }
+ }
+ else
+ {
+ //HANDLE op=OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ts2pid);
+ //if(op!=NULL) GetExitCodeProcess(op,&ec);
+
+ //if(ec!=STILL_ACTIVE) //nicht mehr offen
+ if (GetProcessVersion(ts2pid) == 0)
+ {
+ SendGameStatus2Packet *packet = new SendGameStatus2Packet();
+ packet->gameid=0;
+ DBWriteContactSettingWord(NULL,protocolname,"currentvoice",0);
+ DBDeleteContactSetting(NULL,protocolname, "VServerIP");
+ DBDeleteContactSetting(NULL,protocolname, "currentvoicename");
+
+ if(myClient!=NULL)
+ myClient->client->send( packet );
+ ts2pid=0;
+ delete packet;
+ }
+ else
+ {
+ SendGameStatus2Packet *packet = new SendGameStatus2Packet();
+ if(myClient!=NULL)
+ if(GetServerIPPort2(ts2pid,myClient->client->localaddr,myClient->client->llocaladdr,&packet->ip[3],&packet->ip[2],&packet->ip[1],&packet->ip[0],&packet->port))
+ {
+ if(packet->port!=0)
+ {
+ packet->gameid=vid;
+ DBWriteContactSettingWord(NULL,protocolname,"currentvoice",vid);
+
+ sprintf(temp,"%d.%d.%d.%d:%d",(unsigned char)packet->ip[3],(unsigned char)packet->ip[2],(unsigned char)packet->ip[1],(unsigned char)packet->ip[0],packet->port);
+ DBWriteContactSettingTString(NULL, protocolname, "VServerIP", temp);
+
+ if(myClient!=NULL)
+ myClient->client->send( packet );
+ }
+ }
+ delete packet;
+ }
+ //if(op!=NULL) CloseHandle(op);
+ }
+ }*/
+ }
+
+ if(currentgame!=NULL)
+ {
+
+ //XFireLog("XFire Gamedetection - Game still running ...","");
+
+ //prüf ob das spiel noch offen
+ ec=0;
+ //HANDLE op=OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
+ //if(op!=NULL) GetExitCodeProcess(op,&ec);
+
+ //if(GetLastError()==5) //anwendung ist noch offen und der zugriff wird noch darauf blockiert
+ //{
+ //
+ //}
+ //else if(ec!=STILL_ACTIVE) //nicht mehr offen
+
+ if (!xgamelist.isValidPid(pid))
+ {
+ //XFireLog("XFire Gamedetection - Game was closed ID: %i",currentgame);
+ SendGameStatusPacket *packet = new SendGameStatusPacket();
+ packet->gameid=0;
+ if(DBGetContactSettingByte(NULL,protocolname,"sendgamestatus",1))
+ if(myClient!=NULL)
+ myClient->client->send( packet );
+
+ //spielzeit messen
+ time_t t2=time(NULL);
+ time_t t3=t2-t1;
+ tm * mytm=gmtime(&t3);
+
+ //statusmsg von xfire zurücksetzen
+ if(currentgame->setstatusmsg)
+ {
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ if(bpStatus==ID_STATUS_ONLINE)
+ myClient->Status(statusmessage[0]);
+ else if(bpStatus==ID_STATUS_AWAY)
+ myClient->Status(statusmessage[1]);
+ }
+
+ sprintf(temp,Translate("Last game: %s playtime: %.2d:%.2d:%.2d"),currentgame->name,mytm->tm_hour,mytm->tm_min,mytm->tm_sec);
+ DBWriteContactSettingTString(NULL, protocolname, "LastGame", temp);
+
+ if(currentgame->noicqstatus!=TRUE&&DBGetContactSettingByte(NULL,protocolname,"autosetstatusmsg",0))
+ SetOldStatusMsg();
+
+ DBWriteContactSettingWord(NULL,protocolname,"currentgame",0);
+ DBDeleteContactSetting(NULL,protocolname,"currentgamename");
+
+ //popup wieder aktivieren, menuservice funk aufrufen, nur wenn popups vorher abgestellt wurden
+ if(disabledpopups)
+ if(DBGetContactSettingByte(NULL,protocolname,"nopopups",0))
+ {
+ if(ServiceExists("PopUp/EnableDisableMenuCommand"))
+ {
+ CallService("PopUp/EnableDisableMenuCommand",NULL,NULL);
+ }
+ else if(ServiceExists("PopUp/ToggleEnabled"))
+ {
+ CallService("PopUp/ToggleEnabled",NULL,NULL);
+ }
+ disabledpopups=FALSE;
+ }
+ //sound wieder aktivieren, nur wenn es vorher abgestellt wurde
+ if(disabledsound)
+ if(DBGetContactSettingByte(NULL,protocolname,"nosoundev",0))
+ {
+ DBWriteContactSettingByte(NULL,"Skin","UseSound",1);
+ disabledsound=FALSE;
+ }
+
+ //bug beseitigt, wenn spiel beendet, alte ip entfernen
+ DBDeleteContactSetting(NULL,protocolname, "ServerIP");
+
+ pid=NULL;
+ currentgame=NULL;
+ xgamelist.SetGameStatus(FALSE);
+
+ NotifyEventHooks(hookgamestart,0,0);
+
+ delete packet;
+ }
+ else //noch offen
+ {
+ //XFireLog("Spiel noch offen ...","");
+ //nur nwspiele nach ip/port scannen
+ if(DBGetContactSettingByte(NULL,protocolname,"ipportdetec",0))
+ if(currentgame->networkparams!=NULL&¤tgame->send_gameid>0)
+ {
+ SendGameStatusPacket *packet = new SendGameStatusPacket();
+ //verscueh serverip und port zu scannen
+
+ //XFireLog("IPPort detection ...","");
+ if(GetServerIPPort(pid,myClient->client->localaddr,myClient->client->llocaladdr,&packet->ip[3],&packet->ip[2],&packet->ip[1],&packet->ip[0],&packet->port))
+ {
+
+ if(packet->ip[3]!=0)
+ {
+ sprintf(temp,"%d.%d.%d.%d:%d",(unsigned char)packet->ip[3],(unsigned char)packet->ip[2],(unsigned char)packet->ip[1],(unsigned char)packet->ip[0],packet->port);
+ DBWriteContactSettingTString(NULL, protocolname, "ServerIP", temp);
+ }
+ else
+ DBDeleteContactSetting(NULL,protocolname, "ServerIP");
+
+ packet->gameid=currentgame->send_gameid;
+ if(DBGetContactSettingByte(NULL,protocolname,"sendgamestatus",1))
+ if(myClient!=NULL)
+ myClient->client->send( packet );
+
+ if(currentgame->noicqstatus!=TRUE&&DBGetContactSettingByte(NULL,protocolname,"autosetstatusmsg",0))
+ SetGameStatusMsg();
+ }
+ delete packet;
+ }
+ //XFireLog("fertig ...","");
+ //packet->=xf[currentgame].gameid2;
+ }
+
+ //if(op!=NULL) CloseHandle(op);
+ }
+ else
+ {
+ //XFireLog("nach spiel suchen ...","");
+ //hardcoded game detection
+ HANDLE hSnapShot = CreateToolhelp32Snapshot ( TH32CS_SNAPALL, 0);
+ PROCESSENTRY32* processInfo = new PROCESSENTRY32;
+ processInfo->dwSize = sizeof ( PROCESSENTRY32);
+
+ XFireLog("XFire Gamedetection - Suche laufende Spiele ...");
+
+ //gamelist blocken
+ xgamelist.Block(TRUE);
+
+
+ while ( Process32Next ( hSnapShot,processInfo ) != FALSE && currentgame==NULL)
+ {
+ //überspringe niedrige pids
+ if(processInfo->th32ProcessID<lowpids)
+ continue;
+
+ Xfire_game* nextgame;
+ while(xgamelist.getnextGame(&nextgame))
+ {
+ if(nextgame->checkpath(processInfo))
+ {
+ SendGameStatusPacket *packet = new SendGameStatusPacket() ;
+
+ XFireLog("XFire Gamedetection - Spiel gefunden: %i",nextgame->id);
+
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ currentgame=nextgame;
+ pid=processInfo->th32ProcessID;
+ DBWriteContactSettingWord(NULL,protocolname,"currentgame",currentgame->id);
+ DBWriteContactSettingString(NULL,protocolname,"currentgamename",currentgame->name);
+ packet->gameid=currentgame->send_gameid;
+ t1=time(NULL);
+
+ if(DBGetContactSettingByte(NULL,protocolname,"sendgamestatus",1))
+ {
+ XFireLog("XFire Gamedetection - Sendgame-ID: %i",currentgame->send_gameid);
+ if(currentgame->send_gameid>0)
+ {
+ XFireLog("XFire Gamedetection - Setzte Status für XFire");
+ myClient->client->send( packet );
+ }
+ }
+
+ xgamelist.SetGameStatus(TRUE);
+
+ //eventhook triggern
+ NotifyEventHooks(hookgamestart,1,0);
+
+ //statusmsg für xfire setzen
+ if(currentgame->setstatusmsg)
+ {
+ SetXFireGameStatusMsg(currentgame);
+ }
+
+ if(currentgame->noicqstatus!=TRUE&&DBGetContactSettingByte(NULL,protocolname,"autosetstatusmsg",0))
+ {
+ BackupStatusMsg();
+ SetGameStatusMsg();
+ }
+ //popup abschalten, menuservice funk aufrufen
+ if(DBGetContactSettingByte(NULL,protocolname,"nopopups",0))
+ {
+ if(ServiceExists("PopUp/EnableDisableMenuCommand")&&DBGetContactSettingByte(NULL,"PopUp","ModuleIsEnabled",0)==1&&DBGetContactSettingByte(NULL,"PopUp","DisableWhenFullscreen",0)==0) /**/
+ {
+ disabledpopups=TRUE;
+ CallService("PopUp/EnableDisableMenuCommand",NULL,NULL);
+ }
+ else if(ServiceExists("PopUp/ToggleEnabled")&&DBGetContactSettingByte(NULL,"YAPP","Enabled",0)==1)
+ {
+ disabledpopups=TRUE;
+ CallService("PopUp/ToggleEnabled",NULL,NULL);
+ }
+ }
+ //sound abschalten
+ if(DBGetContactSettingByte(NULL,protocolname,"nosoundev",0)&&DBGetContactSettingByte(NULL,"Skin","UseSound",0)==1)
+ {
+ DBWriteContactSettingByte(NULL,"Skin","UseSound",0);
+ disabledsound=TRUE;
+ }
+ }
+
+ delete packet;
+
+ break;
+ }
+ }
+ }
+ CloseHandle ( hSnapShot);
+
+ //gamelist unblocken
+ xgamelist.Block(FALSE);
+ }
+ }
+ }
+}
+
+static int ReScanMyGames(WPARAM wParam,LPARAM lParam)
+{
+ DBDeleteContactSetting(NULL, protocolname, "foundgames");
+
+ mir_forkthread(Scan4Games,NULL);
+
+ return 0;
+}
+
+static int CustomGameSetup(WPARAM wParam,LPARAM lParam)
+{
+ //DialogBox(hinstance,MAKEINTRESOURCE(IDD_GAMELIST),NULL,DlgAddGameProc);
+ return 0;
+}
+
+void setBuddyStatusMsg(BuddyListEntry *entry,string statusmsg)
+{
+ char status[300];
+ int mystatus=ID_STATUS_ONLINE;
+
+ if(entry==NULL)
+ return;
+
+ if(IsContactMySelf(entry->username))
+ return;
+
+ if(strlen(entry->statusmsg.c_str())>5)
+ {
+ char* away=(char*)entry->statusmsg.c_str();
+ if(
+ (*(away)=='('
+ && *(away+1)=='A'
+ && *(away+2)=='F'
+ && *(away+3)=='K'
+ && *(away+4)==')')
+ ||
+ (*(away)=='('
+ &&*(away+1)=='A'
+ && *(away+2)=='B'
+ && *(away+3)=='S'
+ && *(away+4)==')')
+ )
+ {
+ mystatus=ID_STATUS_AWAY;
+ }
+ }
+
+ //statusmsg umwandeln
+ char * temp = mir_utf8decode((char*)entry->statusmsg.c_str(),NULL);
+ if(temp==NULL) temp=(char*)entry->statusmsg.c_str();
+
+ //DBDeleteContactSetting(hContact, "CList", "StatusMsg");
+ DBWriteContactSettingWord(entry->hcontact, protocolname, "Status", mystatus);
+
+ if(entry->game!=0)
+ {
+ char temp2[255];
+ temp2[0]=0;
+
+ DBVARIANT dbv;
+ if(!DBGetContactSettingTString(entry->hcontact,protocolname, "RGame",&dbv))
+ {
+ strcat(temp2,dbv.pszVal);
+ strcat(temp2," ");
+ DBFreeVariant(&dbv);
+ }
+
+ if(DBGetContactSettingByte(NULL,protocolname,"noipportinstatus",0)==0)
+ {
+ if(!DBGetContactSettingTString(entry->hcontact,protocolname, "ServerName",&dbv))
+ {
+ strcat(temp2,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ else
+ {
+ if(!DBGetContactSettingTString(entry->hcontact,protocolname, "ServerIP",&dbv))
+ {
+ strcat(temp2,"(");
+ strcat(temp2,dbv.pszVal);
+ sprintf(status,":%d)",DBGetContactSettingWord(entry->hcontact, protocolname, "Port", 0));
+ strcat(temp2,status);
+ DBFreeVariant(&dbv);
+ }
+ }
+ }
+
+ strncpy(status,temp2,97);
+
+ if(strlen(entry->statusmsg.c_str())>0)
+ {
+ strcat(status," - ");
+ strcat(status,temp);
+ }
+ DBWriteContactSettingTString(entry->hcontact, "CList", "StatusMsg", status );
+ DBWriteContactSettingTString(entry->hcontact, protocolname, "XStatusMsg", status );
+ }
+ else
+ {
+ DBWriteContactSettingTString(entry->hcontact, "CList", "StatusMsg", temp );
+ DBWriteContactSettingTString(entry->hcontact, protocolname, "XStatusMsg", temp );
+ DBWriteContactSettingByte(entry->hcontact, protocolname, "XStatusId", 1);
+ DBWriteContactSettingTString(entry->hcontact, protocolname, "XStatusName", "");
+ }
+}
+
+/*void CheckAvatar(void *ventry)
+{
+ BuddyListEntry* entry=(BuddyListEntry*)ventry;
+ DBVARIANT dbv;
+ if(entry==NULL)
+ return;
+ if(DBGetContactSettingByte(NULL,protocolname,"noavatars",-1)==0)
+ {
+ if(DBGetContactSettingByte(entry->hcontact, "ContactPhoto", "Locked", -1)!=1)
+ {
+ if(!DBGetContactSettingByte(NULL,protocolname,"specialavatarload",0))
+ {
+ if(DBGetContactSetting(entry->hcontact,"ContactPhoto", "File",&dbv))
+ {
+ XFire_SetAvatar* xsa=new XFire_SetAvatar;
+ xsa->hContact=entry->hcontact;
+ xsa->username=new char[strlen(entry->username.c_str())+1];
+ strcpy(xsa->username,entry->username.c_str());
+
+ mir_forkthread(SetAvatar,(LPVOID)xsa);
+ }
+ }
+ else
+ {
+ /*
+ scheinbar unterpricht xfire bei zu agressiven nachfragen der buddyinfos die verbindung , deshalb erstmal auskommentiert
+ getestet mit clanbuddy's >270 members
+
+ mit hilfe der buddyinfos kann man den avatar laden und screenshot infos etc bekommt man auch
+ */
+/* GetBuddyInfo* buddyinfo=new GetBuddyInfo();
+ buddyinfo->userid=entry->userid;
+ mir_forkthread(SetAvatar2,(LPVOID)buddyinfo);
+ }
+ }
+ }
+}*/
+
+HANDLE handlingBuddys(BuddyListEntry *entry, int clan,char*group,BOOL dontscan)
+{
+ HANDLE hContact;
+ string game;
+
+ if(entry==NULL)
+ return NULL;
+
+ //wenn der buddy ich selbst ist, dann ignorieren
+ if(IsContactMySelf(entry->username))
+ return NULL;
+
+ if(entry->hcontact==NULL)
+ {
+ entry->hcontact=CList_FindContact(entry->userid);
+ if(entry->hcontact&&clan==-1)
+ {
+ DBWriteContactSettingWord(entry->hcontact, protocolname, "Status", ID_STATUS_ONLINE);
+ DBWriteContactSettingString(entry->hcontact, protocolname, "MirVer", "xfire");
+ }
+ }
+
+ if(entry->hcontact==NULL)
+ {
+ XFireContact xfire_newc;
+ xfire_newc.username=(char*)entry->username.c_str();
+ xfire_newc.nick=(char*)entry->nick.c_str();
+ xfire_newc.id=entry->userid;
+
+ entry->hcontact=CList_AddContact(xfire_newc,TRUE,entry->isOnline()?TRUE:FALSE,clan);
+ }
+
+
+ hContact=entry->hcontact;
+
+ if(hContact!=0)
+ {
+ if(strlen(entry->nick.c_str())>0&&DBGetContactSettingByte(NULL,protocolname,"shownicks",1))
+ {
+ char*nick=NULL;
+
+ if(myClient->useutf8)
+ nick=( char* )entry->nick.c_str();
+ else
+ nick=mir_utf8decode(( char* )entry->nick.c_str(),NULL);
+
+ if(nick)
+ {
+ if(myClient->useutf8)
+ DBWriteContactSettingUTF8String(hContact, protocolname, "Nick", nick);
+ else
+ DBWriteContactSettingTString(hContact, protocolname, "Nick", nick);
+ }
+ else
+ DBWriteContactSettingString(hContact, protocolname, "Nick", entry->username.c_str());
+
+ //DBWriteContactSettingStringUtf(hContact, protocolname, "Nick", entry->nick.c_str());
+ //DBWriteContactSettingUTF8String(hContact, protocolname, "Nick", ( char* )entry->nick.c_str());
+ }
+ else
+ DBWriteContactSettingString(hContact, protocolname, "Nick", entry->username.c_str());
+
+ if(!entry->isOnline())
+ {
+ DBWriteContactSettingWord(hContact, protocolname, "Status", ID_STATUS_OFFLINE);
+ DBDeleteContactSetting(hContact, protocolname, "XStatusMsg");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusId");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusName");
+ DBDeleteContactSetting(hContact, "CList", "StatusMsg");
+ DBWriteContactSettingTString(hContact, protocolname, "XStatusName", "");
+ DBDeleteContactSetting(hContact, protocolname, "ServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "Port");
+ DBDeleteContactSetting(hContact, protocolname, "VServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "VPort");
+ DBDeleteContactSetting(hContact, protocolname, "RVoice");
+ DBDeleteContactSetting(hContact, protocolname, "RGame");
+ DBDeleteContactSetting(hContact, protocolname, "GameId");
+ DBDeleteContactSetting(hContact, protocolname, "VoiceId");
+ DBDeleteContactSetting(hContact, protocolname, "GameInfo");
+ }
+ else if(entry->game>0||entry->game2>0)
+ {
+ char temp[XFIRE_MAX_STATIC_STRING_LEN]="";
+ char gname[255]="";
+
+ DummyXFireGame *gameob;
+
+ if(strlen(entry->gameinfo.c_str())>0)
+ DBWriteContactSettingTString(hContact, protocolname, "GameInfo", entry->gameinfo.c_str());
+
+ //beim voicechat foglendes machn
+ if(entry->game2>0)
+ {
+ gameob=(DummyXFireGame*)entry->game2Obj; //obj wo ip und port sind auslesen
+
+ xgamelist.getGamename(entry->game2,gname,255);
+
+ DBWriteContactSettingTString(hContact, protocolname, "RVoice", gname);
+
+ if(gameob)
+ {
+ if((unsigned char)gameob->ip[3]!=0) // wenn ip, dann speichern
+ {
+ sprintf(temp,"%d.%d.%d.%d",(unsigned char)gameob->ip[3],(unsigned char)gameob->ip[2],(unsigned char)gameob->ip[1],(unsigned char)gameob->ip[0]);
+ DBWriteContactSettingTString(hContact, protocolname, "VServerIP", temp);
+ DBWriteContactSettingWord(hContact, protocolname, "VPort", (unsigned long)gameob->port);
+ }
+ else
+ {
+ DBDeleteContactSetting(hContact, protocolname, "VServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "VPort");
+ }
+ }
+
+ DBWriteContactSettingWord(hContact, protocolname, "VoiceId", entry->game2);
+
+ SetIcon(hContact,xgamelist.iconmngr.getGameIconHandle(entry->game2),EXTRA_ICON_ADV2); //icon seperat setzen
+ }
+ else
+ {
+ DBDeleteContactSetting(hContact, protocolname, "VServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "VPort");
+ DBDeleteContactSetting(hContact, protocolname, "RVoice");
+ DBDeleteContactSetting(hContact, protocolname, "VoiceId");
+ SetIcon(hContact,(HANDLE)-1,EXTRA_ICON_ADV2);
+ }
+
+ //beim game folgendes machen
+ if(entry->game>0)
+ {
+ HICON hicongame=xgamelist.iconmngr.getGameIcon(entry->game);
+
+ xgamelist.getGamename(entry->game,gname,255);
+
+ DBWriteContactSettingTString(hContact, protocolname, "RGame", gname);
+
+ //beinhaltet ip und port
+ gameob=(DummyXFireGame*)entry->gameObj;
+
+ //popup, wenn jemand was spielt
+ if(DBGetContactSettingByte(NULL,protocolname,"gamepopup",0)==1) {
+ char temp[256]="";
+
+ sprintf(temp,Translate("%s playing %s."),
+ //ist ein nick gesetzt?
+ (entry->nick.length()==0?
+ //nein dann username
+ entry->username.c_str():
+ //klar, dann nick nehmen
+ entry->nick.c_str())
+ ,gname);
+
+ if(gameob)
+ {
+ if((unsigned char)gameob->ip[3]!=0)
+ {
+ sprintf(temp,Translate("%s playing %s on server %d.%d.%d.%d:%d."),
+ //ist ein nick gesetzt?
+ (entry->nick.length()==0?
+ //nein dann username
+ entry->username.c_str():
+ //klar, dann nick nehmen
+ entry->nick.c_str())
+ ,gname,(unsigned char)gameob->ip[3],(unsigned char)gameob->ip[2],(unsigned char)gameob->ip[1],(unsigned char)gameob->ip[0],(unsigned long)gameob->port);
+ }
+ }
+
+ /*
+ POPUP-Filter
+ Nur Popups anzeigen die noch nicht angezeigt wurden
+ */
+ if(entry->lastpopup==NULL)
+ {
+ //größe des popupstrings
+ int size=strlen(temp)+1;
+ //popup darstellen
+ displayPopup(NULL,temp,"Miranda XFire Protocol Plugin",0,hicongame);
+ //letzten popup definieren
+ entry->lastpopup=new char[size];
+ //string kopieren
+ strcpy_s(entry->lastpopup,size,temp);
+ }
+ else
+ {
+ if(strcmp(entry->lastpopup,temp)!=0)
+ {
+ delete[] entry->lastpopup;
+ entry->lastpopup=NULL;
+
+ //größe des popupstrings
+ int size=strlen(temp)+1;
+ //popup darstellen
+ displayPopup(NULL,temp,"Miranda XFire Protocol Plugin",0,hicongame);
+ //letzten popup definieren
+ entry->lastpopup=new char[size];
+ //string kopieren
+ strcpy_s(entry->lastpopup,size,temp);
+ }
+ }
+ }
+
+ if(gameob)
+ {
+ if((unsigned char)gameob->ip[3]!=0)
+ {
+ //ip und port in kontakt speichern
+ sprintf(temp,"%d.%d.%d.%d",(unsigned char)gameob->ip[3],(unsigned char)gameob->ip[2],(unsigned char)gameob->ip[1],(unsigned char)gameob->ip[0]);
+ DBWriteContactSettingTString(hContact, protocolname, "ServerIP", temp);
+ DBWriteContactSettingWord(hContact, protocolname, "Port", (unsigned long)gameob->port);
+
+ //lass das query arbeiten
+ if(dontscan==FALSE)
+ if(ServiceExists("GameServerQuery/Query")&&DBGetContactSettingByte(NULL,protocolname,"gsqsupport",0))
+ {
+ GameServerQuery_query gsqq={0};
+ gsqq.port=gameob->port;
+ gsqq.xfiregameid=entry->game;
+ strcpy(gsqq.ip,temp);
+ CallService("GameServerQuery/Query" , (WPARAM) entry, (LPARAM)&gsqq);
+ }
+ }
+ else
+ {
+ DBDeleteContactSetting(hContact, protocolname, "ServerName");
+ DBDeleteContactSetting(hContact, protocolname, "ServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "Port");
+ }
+ }
+
+ SetIcon(hContact,xgamelist.iconmngr.getGameIconHandle(entry->game));
+
+ //DBDeleteContactSetting(hContact, "CList", "StatusMsg");
+ DBWriteContactSettingWord(hContact, protocolname, "Status", ID_STATUS_ONLINE);
+ DBWriteContactSettingTString(hContact, protocolname, "XStatusName", Translate("Playing"));
+ setBuddyStatusMsg(entry,entry->statusmsg);
+ DBWriteContactSettingByte(hContact, protocolname, "XStatusId", xgamelist.iconmngr.getGameIconId(entry->game)+2);
+
+ //buddy vorher ein spielgestartet, wenn nicht sound spielen?
+ if(!DBGetContactSettingWord(hContact, protocolname, "GameId",0))
+ SkinPlaySound( Translate( "xfirebstartgame" ) );
+
+ DBWriteContactSettingWord(hContact, protocolname, "GameId", entry->game);
+ }
+ else
+ {
+ SetIcon(hContact,(HANDLE)-1);
+ DBDeleteContactSetting(hContact, protocolname, "ServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "Port");
+ if(strlen(entry->statusmsg.c_str())==0)
+ {
+ DBDeleteContactSetting(hContact, protocolname, "XStatusMsg");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusId");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusName");
+ }
+ DBDeleteContactSetting(hContact, protocolname, "RGame");
+ DBDeleteContactSetting(hContact, protocolname, "GameId");
+ setBuddyStatusMsg(entry,entry->statusmsg);
+ }
+ }
+ else if(strlen(entry->statusmsg.c_str())>0)
+ {
+ setBuddyStatusMsg(entry,entry->statusmsg);
+
+ SetIcon(hContact,(HANDLE)-1);
+ SetIcon(hContact,(HANDLE)-1,EXTRA_ICON_ADV2);
+ DBDeleteContactSetting(hContact, protocolname, "ServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "Port");
+ DBDeleteContactSetting(hContact, protocolname, "VServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "VPort");
+ DBDeleteContactSetting(hContact, protocolname, "RVoice");
+ DBDeleteContactSetting(hContact, protocolname, "RGame");
+ DBDeleteContactSetting(hContact, protocolname, "GameId");
+ DBDeleteContactSetting(hContact, protocolname, "VoiceId");
+ }
+ else
+ {
+ if(DBGetContactSettingWord(entry->hcontact, protocolname, "Status", -1)==ID_STATUS_OFFLINE)
+ {
+ if(DBGetContactSettingByte(NULL, protocolname, "noclanavatars", 0)==1&&clan>0)
+ ;
+ else
+ if(myClient) myClient->CheckAvatar(entry);
+ }
+
+ SetIcon(hContact,(HANDLE)-1);
+ SetIcon(hContact,(HANDLE)-1,EXTRA_ICON_ADV2);
+ DBWriteContactSettingWord(hContact, protocolname, "Status", ID_STATUS_ONLINE);
+ DBWriteContactSettingString(entry->hcontact, protocolname, "MirVer", "xfire");
+ if(clan>0) DBWriteContactSettingDword(hContact, protocolname, "Clan", clan);
+ DBWriteContactSettingTString(hContact, "CList", "StatusMsg", "");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusMsg");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusId");
+ DBDeleteContactSetting(hContact, protocolname, "XStatusName");
+ //DBDeleteContactSetting(hContact, "CList", "StatusMsg");
+ DBDeleteContactSetting(hContact, protocolname, "ServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "Port");
+ DBDeleteContactSetting(hContact, protocolname, "VServerIP");
+ DBDeleteContactSetting(hContact, protocolname, "VPort");
+ DBDeleteContactSetting(hContact, protocolname, "RVoice");
+ DBDeleteContactSetting(hContact, protocolname, "RGame");
+ DBDeleteContactSetting(hContact, protocolname, "GameId");
+ DBDeleteContactSetting(hContact, protocolname, "VoiceId");
+ }
+ }
+ if(group!=NULL)
+ {
+ if(!DBGetContactSettingByte(NULL,protocolname,"noclangroups",0))
+ {
+ if(clan>0)
+ {
+ int val=DBGetContactSettingByte(NULL,protocolname,"mainclangroup",0);
+
+ if( DBGetContactSettingByte(NULL,protocolname,"skipfriendsgroups",0)==0 ||
+ (DBGetContactSettingByte(NULL,protocolname,"skipfriendsgroups",0)==1&&
+ DBGetContactSettingByte(entry->hcontact, protocolname, "isfriend", 0)==0)
+ )
+ {
+ if(val==0)
+ {
+ DBWriteContactSettingTString(entry->hcontact, "CList", "Group", group);
+ }
+ else
+ {
+ char temp[256];
+ DBVARIANT dbv;
+ sprintf_s(temp,256,"%d",val-1);
+ DBGetContactSettingString(NULL,"CListGroups",temp,&dbv);
+ if(dbv.pszVal!=NULL)
+ {
+ sprintf_s(temp,256,"%s\\%s",&dbv.pszVal[1],group);
+ DBWriteContactSettingTString(entry->hcontact, "CList", "Group", temp);
+ DBFreeVariant(&dbv);
+ }
+ }
+ }
+ }
+ else if(clan==-1)//hauptgruppe für fof
+ {
+ int val=DBGetContactSettingByte(NULL,protocolname,"fofgroup",0);
+
+ if(val==0)
+ {
+ DBWriteContactSettingTString(entry->hcontact, "CList", "Group", group);
+ }
+ else
+ {
+ char temp[256];
+ DBVARIANT dbv;
+ sprintf_s(temp,256,"%d",val-1);
+ DBGetContactSettingString(NULL,"CListGroups",temp,&dbv);
+ if(dbv.pszVal!=NULL)
+ {
+ sprintf_s(temp,256,"%s\\%s",&dbv.pszVal[1],group);
+ DBWriteContactSettingTString(entry->hcontact, "CList", "Group", temp);
+ DBFreeVariant(&dbv);
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ DBWriteContactSettingByte(entry->hcontact, protocolname, "isfriend", 1);
+ }
+
+ return hContact;
+}
+
+int AddtoList( WPARAM wParam, LPARAM lParam ) {
+ CCSDATA* ccs = (CCSDATA*)lParam;
+
+ if (ccs->hContact)
+ {
+ DBVARIANT dbv2;
+ if(!DBGetContactSetting(ccs->hContact,protocolname,"Username",&dbv2)) {
+
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ SendAcceptInvitationPacket accept;
+ accept.name = dbv2.pszVal;
+ myClient->client->send(&accept );
+ }
+
+ //temporären buddy entfernen, da eh ein neues packet kommt
+ DBWriteContactSettingByte(ccs->hContact, protocolname, "DontSendDenyPacket", 1);
+ CallService(MS_DB_CONTACT_DELETE, (WPARAM) ccs->hContact, 0);
+ }
+ }
+ return 0;
+}
+
+
+static void __cdecl AckBasicSearch(void * pszNick)
+{
+ if(pszNick!=NULL)
+ {
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ SearchBuddy search;
+ search.searchfor(( char* )pszNick);
+ myClient->client->send(&search );
+ }
+ }
+}
+
+int BasicSearch(WPARAM wParam,LPARAM lParam) {
+ static char buf[50];
+ if ( lParam ) {
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ lstrcpynA(buf, (const char *)lParam, 50);
+ mir_forkthread(AckBasicSearch, &buf );
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+
+static int SearchAddtoList(WPARAM wParam,LPARAM lParam)
+{
+ PROTOSEARCHRESULT *psr = ( PROTOSEARCHRESULT* ) lParam;
+
+ if ( psr->cbSize != sizeof( PROTOSEARCHRESULT ))
+ return 0;
+
+ if((int)wParam==0)
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ InviteBuddyPacket invite;
+ invite.addInviteName( psr->nick, Translate("Add me to your friends list."));
+ myClient->client->send(&invite );
+ }
+
+ return -1;
+}
+
+
+void CreateGroup(char*grpn,char*field) {
+ DBVARIANT dbv;
+ char* grp[255];
+
+ int val=DBGetContactSettingByte(NULL,protocolname,field,0);
+
+ if(val==0)
+ {
+ strcpy_s((char*)grp,255,grpn);//((char*)clan->name[i].c_str());
+ }
+ else
+ {
+ char temp[255];
+ DBVARIANT dbv;
+ sprintf_s(temp,255,"%d",val-1);
+ DBGetContactSettingString(NULL,"CListGroups",temp,&dbv);
+ if(dbv.pszVal!=NULL)
+ {
+ sprintf_s((char*)grp,255,"%s\\%s",&dbv.pszVal[1],(char*)grpn);
+ DBFreeVariant(&dbv);
+ }
+ else //gruppe existiert nciht mehr, auf root alles legen
+ {
+ strcpy_s((char*)grp,255,grpn);
+ DBWriteContactSettingByte(NULL,protocolname,field,0);
+ }
+ }
+
+
+ char group[255]="";
+ char temp[10];
+ int i=0;
+ for (i = 0;; i++)
+ {
+ sprintf(temp,"%d",i);
+ if (DBGetContactSettingString(NULL, "CListGroups", temp, &dbv))
+ {
+ i--;
+ break;
+ }
+ if (dbv.pszVal[0] != '\0' && !lstrcmp(dbv.pszVal + 1, (char*)grp)) {
+ DBFreeVariant(&dbv);
+ return;
+ }
+ DBFreeVariant(&dbv);
+ }
+ strcpy_s(group,255,"D");
+ strcat_s(group,255,(char*)grp);
+ group[0]= 1 | GROUPF_EXPANDED;
+ sprintf(temp,"%d",i+1);
+ DBWriteContactSettingString(NULL, "CListGroups", temp, group);
+ CallServiceSync(MS_CLUI_GROUPADDED, i + 1, 0);
+}
+
+
+int SetAwayMsg(WPARAM wParam, LPARAM lParam) {
+ EnterCriticalSection(&modeMsgsMutex);
+ if(( char* )lParam==NULL)
+ {
+ if(wParam==ID_STATUS_ONLINE)
+ {
+ strcpy(statusmessage[0],"");
+ }
+ else if((wParam!=ID_STATUS_ONLINE&&wParam!=ID_STATUS_OFFLINE)&&DBGetContactSettingByte(NULL,protocolname,"nocustomaway",0)==0)
+ {
+ strcpy(statusmessage[1],"(AFK) Away from Keyboard");
+ }
+ }
+ else
+ {
+ if(wParam==ID_STATUS_ONLINE)
+ {
+ strcpy(statusmessage[0],( char* )lParam);
+ }
+ else if((wParam!=ID_STATUS_ONLINE&&wParam!=ID_STATUS_OFFLINE)&&DBGetContactSettingByte(NULL,protocolname,"nocustomaway",0)==0&&strlen(( char* )lParam)>0)
+ {
+ strcpy(statusmessage[1],( char* )lParam);
+ }
+ else if(wParam!=ID_STATUS_ONLINE&&wParam!=ID_STATUS_OFFLINE)
+ {
+ strcpy(statusmessage[1],"(AFK) Away from Keyboard");
+ }
+ }
+
+ if(myClient!=NULL)
+ {
+ if(myClient->client->connected)
+ {
+ if(bpStatus==ID_STATUS_ONLINE)
+ myClient->Status(statusmessage[0]);
+ else if(wParam!=ID_STATUS_ONLINE&&wParam!=ID_STATUS_OFFLINE)
+ myClient->Status(statusmessage[1]);
+ }
+ }
+ LeaveCriticalSection(&modeMsgsMutex);
+ return 0;
+}
+
+static void SendAMAck( LPVOID param )
+{
+ DBVARIANT dbv;
+
+ if(!DBGetContactSettingTString((HANDLE)param, protocolname, "XStatusMsg",&dbv))
+ {
+ ProtoBroadcastAck(protocolname, (HANDLE)param, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE) 1, LPARAM(dbv.pszVal));
+ }
+ else
+ ProtoBroadcastAck(protocolname, (HANDLE)param, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE) 1, LPARAM(""));
+}
+
+int SetNickName(WPARAM wparam, LPARAM newnick)
+{
+ if(newnick==NULL)
+ {
+ return FALSE;
+ }
+
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ myClient->setNick((char*)newnick);
+ DBWriteContactSettingString(NULL,protocolname,"Nick",(char*)newnick);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//sendet neue preferencen zu xfire
+int SendPrefs(WPARAM wparam, LPARAM lparam)
+{
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ PrefsPacket prefs;
+ for(int i=0;i<XFIRE_RECVPREFSPACKET_MAXCONFIGS;i++)
+ {
+ prefs.config[i]=xfireconfig[i];
+ }
+ myClient->client->send( &prefs );
+ return TRUE;
+ }
+ return FALSE;
+}
+
+
+int GetAwayMsg(WPARAM /*wParam*/, LPARAM lParam)
+{
+ CCSDATA* ccs = (CCSDATA*)lParam;
+
+ mir_forkthread(SendAMAck,ccs->hContact);
+ return 1;
+}
+
+int ContactDeleted(WPARAM wParam,LPARAM lParam) {
+ if(!DBGetContactSettingByte((HANDLE)wParam, protocolname, "DontSendDenyPacket", 0))
+ if(DBGetContactSettingByte((HANDLE)wParam,"CList","NotOnList",0))
+ {
+ if(myClient!=NULL)
+ if(myClient->client->connected)
+ {
+ DBVARIANT dbv2;
+ if(!DBGetContactSetting((HANDLE)wParam,protocolname,"Username",&dbv2)) {
+ SendDenyInvitationPacket deny;
+ deny.name = dbv2.pszVal;
+ myClient->client->send( &deny );
+ }
+ }
+ }
+ return 0;
+}
+
+int StartGame(WPARAM wParam,LPARAM lParam,LPARAM fParam) {
+ //gamelist blocken
+ xgamelist.Block(TRUE);
+
+ Xfire_game*game=xgamelist.getGamebyGameid(fParam);
+
+ //starte das spiel
+ if(game)
+ game->start_game();
+
+ //gamelist blocken
+ xgamelist.Block(FALSE);
+
+
+ return 0;
+}
+
+int RemoveFriend(WPARAM wParam,LPARAM lParam) {
+ char temp[256];
+ DBVARIANT dbv;
+
+ if(!DBGetContactSettingTString((HANDLE)wParam, protocolname, "Username",&dbv))
+ {
+ sprintf(temp,Translate("Do you really want delete your friend %s?"),dbv.pszVal);
+ if(MessageBoxA(NULL,temp,Translate("Confirm Delete"),MB_YESNO|MB_ICONQUESTION)==IDYES)
+ {
+ if(myClient!=NULL)
+ {
+ if(myClient->client->connected)
+ {
+ SendRemoveBuddyPacket removeBuddy;
+
+ removeBuddy.userid=DBGetContactSettingDword((HANDLE)wParam,protocolname,"UserId",0);
+
+ if(removeBuddy.userid!=0)
+ {
+ myClient->client->send(&removeBuddy);
+ }
+ }
+ }
+ }
+ DBFreeVariant(&dbv);
+ }
+ return 0;
+}
+
+int BlockFriend(WPARAM wParam,LPARAM lParam) {
+ DBVARIANT dbv;
+
+ if(!DBGetContactSettingTString((HANDLE)wParam, protocolname, "Username",&dbv))
+ {
+ if(MessageBoxA(NULL,Translate("Block this user from ever contacting you again?"),Translate("Block Confirmation"),MB_YESNO|MB_ICONQUESTION)==IDYES)
+ {
+ if(myClient!=NULL)
+ {
+ if(myClient->client->connected)
+ {
+ DBWriteContactSettingByte(NULL,"XFireBlock",dbv.pszVal,1);
+
+ SendDenyInvitationPacket deny;
+ deny.name = dbv.pszVal;
+ myClient->client->send( &deny );
+ }
+ }
+ }
+ CallService( MS_DB_CONTACT_DELETE, (WPARAM) wParam, 1 );
+ DBFreeVariant(&dbv);
+ }
+ return 0;
+}
+
+int StartThisGame(WPARAM wParam,LPARAM lParam) {
+ //gamelist blocken
+ xgamelist.Block(TRUE);
+
+ //hole die gameid des spiels
+ int id=DBGetContactSettingWord((HANDLE)wParam, protocolname, "GameId",0);
+
+ //hole passendes spielobjekt
+ Xfire_game*game=xgamelist.getGamebyGameid(id);
+
+ //starte das spiel
+ if(game)
+ game->start_game();
+
+ //gamelist blocken
+ xgamelist.Block(FALSE);
+
+ return 0;
+}
+
+int JoinGame(WPARAM wParam,LPARAM lParam) {
+ //gamelist blocken
+ xgamelist.Block(TRUE);
+
+ //hole die gameid des spiels
+ int id=DBGetContactSettingWord((HANDLE)wParam, protocolname, "GameId",0);
+
+ //hole passendes spielobjekt
+ Xfire_game*game=xgamelist.getGamebyGameid(id);
+
+ //starte das spiel
+ if(game)
+ {
+ DBVARIANT dbv; //dbv.pszVal
+ int port=DBGetContactSettingWord((HANDLE)wParam, protocolname, "Port",0);
+ if(!DBGetContactSettingTString((HANDLE)wParam, protocolname, "ServerIP",&dbv))
+ {
+ //starte spiel mit netzwerk parametern
+ game->start_game(dbv.pszVal,port);
+ DBFreeVariant(&dbv);
+ }
+ }
+
+ //gamelist unblocken
+ xgamelist.Block(FALSE);
+
+
+ return 0;
+}
+
+
+int doneQuery( WPARAM wParam, LPARAM lParam ) {
+ char temp[256];
+ BuddyListEntry* bud=(BuddyListEntry*)wParam;
+ gServerstats* gameinfo = (gServerstats*)lParam;
+ DBWriteContactSettingTString(bud->hcontact, protocolname, "ServerName", gameinfo->name);
+ DBWriteContactSettingTString(bud->hcontact, protocolname, "GameType", gameinfo->gametype);
+ DBWriteContactSettingTString(bud->hcontact, protocolname, "Map", gameinfo->map);
+ sprintf(temp,"(%d/%d)",gameinfo->players,gameinfo->maxplayers);
+ DBWriteContactSettingTString(bud->hcontact, protocolname, "Players", temp);
+ DBWriteContactSettingByte(bud->hcontact, protocolname, "Passworded", gameinfo->password);
+
+ if(myClient!=NULL)
+ handlingBuddys(bud,0,NULL,TRUE);
+
+ return 0;
+}
+
+static int SetNickDlg(WPARAM wParam,LPARAM lParam) {
+ return ShowSetNick();
+}
+
+
+int IconLibChanged(WPARAM wParam, LPARAM lParam) {
+ /*int x=0;
+ char temp[255];
+ for(int i=0;i<1024;i++)
+ {
+ if(icocache[i].hicon>0)
+ {
+ //ImageList_ReplaceIcon(hAdvancedStatusIcon,(int)icocache[i].handle,icocache[i].hicon);
+ HANDLE before=icocache[i].handle;
+ icocache[i].handle=(HANDLE)CallService(MS_CLIST_EXTRA_ADD_ICON, (WPARAM)icocache[i].hicon, 0);
+ sprintf(temp,"before: %d after: %d",before,icocache[i].handle);
+ MessageBoxA(NULL,temp,temp,0);
+ DrawIcon(GetDC(NULL),x,0,(HICON)CallService(MS_SKIN2_GETICONBYHANDLE,0,(LPARAM)icocache[i].handle));
+ x+=32;
+ }
+ }*/
+ return 0;
+}
+
+
+int GetAvatarInfo(WPARAM wParam, LPARAM lParam) {
+ PROTO_AVATAR_INFORMATION* pai = (PROTO_AVATAR_INFORMATION*)lParam;
+
+ if(DBGetContactSettingByte(NULL,protocolname,"noavatars",-1)!=0)
+ return GAIR_NOAVATAR;
+
+ pai->format=DBGetContactSettingWord(pai->hContact,"ContactPhoto","Format",0);
+ if(pai->format==0)
+ return GAIR_NOAVATAR;
+
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(pai->hContact,"ContactPhoto","File",&dbv))
+ {
+ strcpy(pai->filename,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ else
+ return GAIR_NOAVATAR;
+
+ return GAIR_SUCCESS;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/messageackpacket.cpp b/protocols/Xfire/src/messageackpacket.cpp new file mode 100644 index 0000000000..178e2c9717 --- /dev/null +++ b/protocols/Xfire/src/messageackpacket.cpp @@ -0,0 +1,75 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "messageackpacket.h" +#include "xdebug.h" +#include "string.h" +#include "variablevalue.h" +#include <iostream> + +namespace xfirelib { + + MessageACKPacket::MessageACKPacket() { + memset( sid, 0, 16 ); + imindex = -1; + } + MessageACKPacket::~MessageACKPacket() { + } + + int MessageACKPacket::getPacketContent(char *buf) { + int index = 0; + VariableValue val; + val.setName("sid"); + val.setValue(sid,16); + + index += val.writeName(buf,index); + buf[index++] = 3; + index += val.writeValue(buf,index); + + val.setName("peermsg"); + index += val.writeName(buf,index); + buf[index++] = 5; + buf[index++] = 2; + + val.setName("msgtype"); + val.setValueFromLong(1,4); + index += val.writeName(buf,index); + buf[index++] = 2; + index += val.writeValue(buf,index); + + val.setName("imindex"); + val.setValueFromLong(imindex,4); + index += val.writeName(buf,index); + buf[index++] = 02; + index += val.writeValue(buf,index); + + return index; + } + + void MessageACKPacket::parseContent(char *buf, int length, int numberOfAtts) { + } + + +}; + diff --git a/protocols/Xfire/src/messageackpacket.h b/protocols/Xfire/src/messageackpacket.h new file mode 100644 index 0000000000..35d0848fbd --- /dev/null +++ b/protocols/Xfire/src/messageackpacket.h @@ -0,0 +1,61 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __MESSAGEACKPACKET_H +#define __MESSAGEACKPACKET_H + +#include "xfiresendpacketcontent.h" + +#define XFIRE_MESSAGE_ACK_ID 2 + +namespace xfirelib { + + /** + * (Internal) Packet used to acknowledge a received message. + * It is of no use to users of the library because it is already + * sent by the Client. + */ + class MessageACKPacket : public XFireSendPacketContent { + public: + MessageACKPacket(); + ~MessageACKPacket(); + + XFirePacketContent* newPacket() { return new MessageACKPacket(); } + + + int getPacketId() { return XFIRE_MESSAGE_ACK_ID; } + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 2; } + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + char sid[16]; + long imindex; + + private: + }; + +}; + + +#endif + diff --git a/protocols/Xfire/src/messagepacket.cpp b/protocols/Xfire/src/messagepacket.cpp new file mode 100644 index 0000000000..61617bc541 --- /dev/null +++ b/protocols/Xfire/src/messagepacket.cpp @@ -0,0 +1,92 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "messagepacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include <iostream> +#include <string> +#include "xdebug.h" + + +namespace xfirelib { + using namespace std; + + MessagePacket::MessagePacket(){ + packetID = 133; + } + +int MessagePacket::getPacketContent(char *packet){ + memcpy(packet,buf,bufLength); + packetID = 2; + return 150; +} + void MessagePacket::parseContent(char *buf, int length, int numberOfAtts) { + + bufLength = length; + XINFO(( "Got IM\n" )); + + int index = 0; + sid = new VariableValue(); + peermsg = new VariableValue(); + msgtype = new VariableValue(); + + index += sid->readName(buf,index); + index++; //ignore 03 + index += sid->readValue(buf,index,16); + + index += peermsg->readName(buf,index); + index++; + index++; + index += msgtype->readName(buf,index); + index++; + index += msgtype->readValue(buf,index,4); + + if(msgtype->getValue()[0] == 0){ + imindex = new VariableValue(); + index += imindex->readName(buf,index); + + VariableValue messageTemp; + index++;//ignore 02 + index += imindex->readValue(buf,index,4); + index += messageTemp.readName(buf,index); + index++; + index += messageTemp.readValue(buf,index,2); + int messageLength = messageTemp.getValueAsLong(); + index = messageTemp.readValue(buf,index,messageLength); + + for(int i = 0; i < messageTemp.getValueLength();i++){ + message += messageTemp.getValue()[i]; + } + /*TODO: implement this and answer the package*/ + }else if(msgtype->getValue()[0] == 1){ + cout << "got ack for a message we have sent" << endl; + }else if(msgtype->getValue()[0] == 2){ + memcpy(this->buf,buf,150); + /*answer the packet*/ + cout << "some auth magic stuff" << length << endl; + } + } + +}; diff --git a/protocols/Xfire/src/messagepacket.h b/protocols/Xfire/src/messagepacket.h new file mode 100644 index 0000000000..fe867ef96b --- /dev/null +++ b/protocols/Xfire/src/messagepacket.h @@ -0,0 +1,63 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __MESSAGEPACKET_H +#define __MESSAGEPACKET_H + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" +#include <string> + +#define XFIRE_MESSAGE_ID 133 + +namespace xfirelib { + + class MessagePacket : public XFireRecvPacketContent { + public: + + MessagePacket(); + XFirePacketContent* newPacket() { return new MessagePacket(); } + + int getPacketContent(char *packet); + int getPacketId() { return packetID; } + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + std::string getMessage() {return message; } + int getMessageType(){return msgtype->getValue()[0];} + int getImIndex(){ return imindex->getValue()[0];}//TODO: fix this if we have more than 255 messages + int getPacketAttributeCount(){ return 2; } + char * getSid(){ return sid->getValue(); } + + private: + VariableValue *sid; + VariableValue *peermsg; + VariableValue *msgtype; + VariableValue *imindex; + std::string message; + char buf[150]; + int bufLength; + int packetID;//Special case because we have to answer this packet with id 2 + }; +}; + + +#endif diff --git a/protocols/Xfire/src/monitoredobj.cpp b/protocols/Xfire/src/monitoredobj.cpp new file mode 100644 index 0000000000..42b00120ae --- /dev/null +++ b/protocols/Xfire/src/monitoredobj.cpp @@ -0,0 +1,41 @@ +/* + * xfiregateway - Jabber Gateway for XFire. + * Copyright (C) 2006 by + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "stdafx.h" + +#include "monitoredobj.h" + +//alle string klassen entfernt, da die stringklasse instabil ist - dufte + +namespace xfirelib { + int MonitoredObj::id = 0; + MonitoredObj::MonitoredObj() { + this->myid = id++; + } + + MonitoredObj::~MonitoredObj() { + } + + int MonitoredObj::getTotalObjectCount() { + int total = 0; + return total; + } + +}; diff --git a/protocols/Xfire/src/monitoredobj.h b/protocols/Xfire/src/monitoredobj.h new file mode 100644 index 0000000000..4e4b2d66f6 --- /dev/null +++ b/protocols/Xfire/src/monitoredobj.h @@ -0,0 +1,49 @@ +/* + * xfiregateway - Jabber Gateway for XFire. + * Copyright (C) 2006 by + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef __MONITOREDOBJ_H +#define __MONITOREDOBJ_H + +#include <typeinfo> +#include <string> +#include "xdebug.h" +#include <map> + +namespace xfirelib { + class MonitoredObj { + public: + MonitoredObj(); + ~MonitoredObj(); + int getTotalObjectCount(); + + std::string classname; + int myid; + static std::map<std::string,int> instances; + static int id; + }; + + +}; + + + +#endif diff --git a/protocols/Xfire/src/options.cpp b/protocols/Xfire/src/options.cpp new file mode 100644 index 0000000000..2cb78c3318 --- /dev/null +++ b/protocols/Xfire/src/options.cpp @@ -0,0 +1,1270 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by
+ * dufte <dufte@justmail.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+#include "stdafx.h"
+
+#include "baseProtocol.h"
+#include "m_variables.h"
+#include "recvprefspacket.h"
+#include "Xfire_gamelist.h"
+#include "addgamedialog.h"
+
+extern HANDLE XFireWorkingFolder;
+extern HANDLE XFireIconFolder;
+extern xfire_prefitem xfireconfig[XFIRE_RECVPREFSPACKET_MAXCONFIGS];
+extern Xfire_gamelist xgamelist;
+
+struct mytreeitem {
+ char name[256];
+ char dbentry[256];
+ int parent;
+ int icon;
+ HTREEITEM hitem;
+};
+
+extern int bpStatus;
+BOOL alreadyInit=FALSE;
+HWND ghwndDlg2;
+HWND addgameDialog=NULL;
+
+xfireconfigitem xfireconfigitems[XFIRE_RECVPREFSPACKET_SUPPORTEDONFIGS] = {
+ {IDC_KONFIG_1,1,"sendgamestatus"},
+ {IDC_KONFIG_2,3,"hideprofile"},
+ {IDC_KONFIG_3,2,"ipportdetec"},
+ {IDC_KONFIG_4,0xa,"shownicks"},
+ {IDC_KONFIG_5,0xb,"ts2detection"},
+ {IDC_KONFIG_6,0xc,"sendtyping"},
+ {IDC_KONFIG_7,8,"friendsoffriends"},
+};
+
+#define NUM_ICONS 4
+
+static mytreeitem mytree[] = {
+ {"Avatars","",1,0},
+ {"Disable avatars","noavatars",0,0},
+ {"Dont download avatars of clan members","noclanavatars",0,0},
+ {"Use alternate way for Avatar download","specialavatarload",0,0},
+ {"General","",1,0},
+ {"Use UTF8 for messaging and nick's (beta)","useutf8",0,0},
+ {"Automatically reconnect on protocol version changes","recprotoverchg",0,0},
+ {"No Ip/Port in StatusMsg","noipportinstatus",0,0},
+ {"Use Online status for unsupported global statuses","oninsteadafk",0,0},
+ {"Dont move friends to clan groups","skipfriendsgroups",0,0},
+ {"GameServerQuery support","gsqsupport",0,0},
+ {"No custom away message","nocustomaway",0,0},
+ {"Remove friend of friend buddies from database","fofdbremove",0,0},
+ /*{"Show usernames only","onlyusername",0},*/
+ {"Hide yourself in buddylist","skipmyself",0,0},
+ {"Dont display game search results","dontdisresults",0,0},
+ {"Dont display game search status window","dontdissstatus",0,0},
+ {"Display popup, if someone start a game","gamepopup",0,0},
+ {"Dont automatically create clan groups","noclangroups",0,0},
+ {"Enable MBot support","mbotsupport",0,0},
+ {"Gamedetection","",1,0},
+ /*{"Scan for games on every Miranda start","scanalways",0},*/
+ {"Disable game detection","nogamedetect",0,0},
+ /*{"Enable server IP/Port detection","ipportdetec",0},*/
+ /*{"Enable TeamSpeak2/Ventrilo detection","",0},*/
+ {"Use TSRemote.dll to get teamspeak server info","ts2useremote",0,0},
+ {"Disable popups when ingame","nopopups",0,0},
+ {"Disable sound events when ingame","nosoundev",0,0},
+ {"Files","",1,0},
+ {"Automatically update xfire_games.ini (pro-laming.de)","autoiniupdate",0,0},
+ {"Automatically update icons.dll (pro-laming.de)","autoicodllupdate",0,0},
+ {"Download missing game icons from Xfire website","xfiresitegameico",0,0},
+ {"No backup on update","nobackupini",0,0},
+ {"Background updating","dontaskforupdate",0,0},
+};
+
+//funktion zum auslesen aller einträge unter XFireBlock
+static int enumSettingsProc(const char *szSetting,LPARAM lParam)
+{
+ if(strlen(szSetting)>0)
+ {
+ SendDlgItemMessage( (HWND)lParam, IDC_BLOCKUSER, LB_ADDSTRING, 0, (LPARAM)szSetting);
+ }
+ EnableDlgItem((HWND)lParam, IDC_REMUSER, TRUE);
+ return 0;
+}
+
+//damit die änderungen sofort sichtbar sind
+static BOOL CALLBACK DlgProcOpts2(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ char inipath[XFIRE_MAX_STATIC_STRING_LEN]="";
+ static BOOL inifound = FALSE;
+ static BOOL dllfound = FALSE;
+ static int nomsgboxsel[] = {1,0,2};
+ static HWND hwndTree = NULL;
+ static char login[128];
+
+ switch (msg)
+ {
+ case PSM_CHANGED:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_INITDIALOG:
+ {
+ DBVARIANT dbv;
+ TranslateDialogDefault(hwndDlg);
+
+ ghwndDlg2=hwndDlg;
+
+ hwndTree = GetDlgItem(hwndDlg, IDC_TREE);
+ SetWindowLong(hwndTree,GWL_STYLE,GetWindowLong(hwndTree,GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES);
+ SendMessage(hwndDlg, DM_REBUILD_TREE, 0, 0);
+
+ FoldersGetCustomPath( XFireWorkingFolder, inipath, 1024, "" );
+ strcat(inipath,"\\");
+ strcat(inipath,"xfire_games.ini");
+
+ FILE * f = fopen(inipath,"r");
+ if(f!=NULL)
+ {
+ fclose(f);
+ CheckDlgButton(hwndDlg,IDC_CHKG,1);
+ inifound = TRUE;
+ }
+ else
+ {
+ EnableDlgItem(hwndDlg, IDC_SETUPGAMES, FALSE);
+ inifound = FALSE;
+ }
+
+ FoldersGetCustomPath( XFireIconFolder, inipath, 1024, "" );
+ strcat(inipath,"\\");
+ strcat(inipath,"icons.dll");
+
+ f = fopen(inipath,"r");
+ if(f!=NULL)
+ {
+ fclose(f);
+ CheckDlgButton(hwndDlg,IDC_CHKI,1);
+ dllfound = TRUE;
+ }
+ else
+ dllfound = FALSE;
+
+ if(!DBGetContactSetting(NULL,protocolname,"login",&dbv)) {
+ SetDlgItemText(hwndDlg,IDC_LOGIN,dbv.pszVal);
+
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSetting(NULL,protocolname,"Nick",&dbv)) {
+ SetDlgItemText(hwndDlg,IDC_NICK,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSetting(NULL,protocolname,"password",&dbv)) {
+ //bit of a security hole here, since it's easy to extract a password from an edit box
+ CallService(MS_DB_CRYPT_DECODESTRING,strlen(dbv.pszVal)+1,(LPARAM)dbv.pszVal);
+ SetDlgItemText(hwndDlg,IDC_PASSWORD,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ char temp[255]="";
+ sprintf(temp,"%d",DBGetContactSettingByte(NULL,protocolname,"protover",0x5b));
+ SetDlgItemText(hwndDlg,IDC_PVER,temp);
+
+ EnableWindow(GetDlgItem(hwndDlg,IDC_LASTGAME),FALSE);
+ if(!DBGetContactSetting(NULL,protocolname,"LastGame",&dbv)) {
+ SetDlgItemText(hwndDlg,IDC_LASTGAME,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ if(bpStatus==ID_STATUS_OFFLINE&&bpStatus!=ID_STATUS_CONNECTING) {
+ EnableDlgItem(hwndDlg, IDC_NICK, FALSE);
+ }
+ else
+ {
+ int size=sizeof(xfireconfigitems)/sizeof(xfireconfigitem);
+ for(int i=0;i<size;i++)
+ {
+ EnableDlgItem(hwndDlg, xfireconfigitems[i].id, TRUE);
+ if(xfireconfig[xfireconfigitems[i].xfireconfigid].wasset==0)
+ {
+ CheckDlgButton(hwndDlg,xfireconfigitems[i].id,1);
+ }
+ else
+ {
+ CheckDlgButton(hwndDlg,xfireconfigitems[i].id,0);
+ }
+ }
+ //wenn die erste option aktiv ist, untere aktivieren, sonst deaktivieren
+ if(!(BYTE)IsDlgButtonChecked(hwndDlg, IDC_KONFIG_1 ))
+ {
+ CheckDlgButton(hwndDlg,IDC_KONFIG_2,0);
+ CheckDlgButton(hwndDlg,IDC_KONFIG_3,0);
+ EnableDlgItem(hwndDlg, IDC_KONFIG_2, FALSE);
+ EnableDlgItem(hwndDlg, IDC_KONFIG_3, FALSE);
+ }
+ }
+
+ return TRUE;
+ }
+
+
+
+ case WM_COMMAND:
+ if(!(BYTE)IsDlgButtonChecked(hwndDlg, IDC_KONFIG_1 ))
+ {
+ CheckDlgButton(hwndDlg,IDC_KONFIG_2,0);
+ CheckDlgButton(hwndDlg,IDC_KONFIG_3,0);
+ EnableDlgItem(hwndDlg, IDC_KONFIG_2, FALSE);
+ EnableDlgItem(hwndDlg, IDC_KONFIG_3, FALSE);
+ }
+ else
+ {
+ EnableDlgItem(hwndDlg, IDC_KONFIG_2, TRUE);
+ EnableDlgItem(hwndDlg, IDC_KONFIG_3, TRUE);
+ }
+ if ( LOWORD( wParam ) == IDC_URLNEWACC ) {
+ CallService( MS_UTILS_OPENURL, 1, ( LPARAM )"http://www.xfire.com/register/" );
+ return TRUE;
+ }
+ if ( LOWORD( wParam ) == IDC_LOSTPW ) {
+ CallService( MS_UTILS_OPENURL, 1, ( LPARAM )"https://secure.xfire.com/lost_password/" );
+ return TRUE;
+ }
+
+ if ((LOWORD(wParam) == 19901 || LOWORD(wParam) == 25466 || LOWORD(wParam) == IDC_LOGIN || LOWORD(wParam) == IDC_PIP || LOWORD(wParam) == IDC_PPORT || LOWORD(wParam) == IDC_NICK || LOWORD(wParam) == IDC_PASSWORD) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) )
+ return 0;
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ int reconnectRequired=0;
+ char str[128];
+ DBVARIANT dbv;
+
+ GetDlgItemText(hwndDlg,IDC_LOGIN,login,sizeof(login));
+ dbv.pszVal=NULL;
+ if(DBGetContactSetting(NULL,protocolname,"login",&dbv) || strcmp(login,dbv.pszVal))
+ reconnectRequired=1;
+ if(dbv.pszVal!=NULL) DBFreeVariant(&dbv);
+
+ //den login lowercasen
+ int size=strlen(login);
+ BOOL mustlowercase=FALSE;
+ for(int i=0;i<size;i++)
+ {
+ if(login[i]>='A'&&login[i]<='Z')
+ mustlowercase=TRUE;
+ login[i]=tolower(login[i]);
+ }
+ if(mustlowercase) {
+ MessageBoxA(NULL,Translate("The username must be lowercase, so it will be lowercased saved."),Translate("XFire Options"),MB_OK|MB_ICONINFORMATION);
+ SetDlgItemText(hwndDlg,IDC_LOGIN,login);
+ }
+
+ DBWriteContactSettingString(NULL,protocolname,"login",login);
+ DBWriteContactSettingString(NULL,protocolname,"Username",login);
+
+ //nur wenn der nick erfolgreich übertragen wurde
+ GetDlgItemText(hwndDlg,IDC_NICK,login,sizeof(login));
+ dbv.pszVal=NULL;
+ if(DBGetContactSetting(NULL,protocolname,"Nick",&dbv) || strcmp(login,dbv.pszVal))
+ {
+ if(CallService(XFIRE_SET_NICK,0,(WPARAM)login))
+ DBWriteContactSettingString(NULL,protocolname,"Nick",login);
+ }
+ if(dbv.pszVal!=NULL) DBFreeVariant(&dbv);
+
+ GetDlgItemText(hwndDlg,IDC_PASSWORD,str,sizeof(str));
+ CallService(MS_DB_CRYPT_ENCODESTRING,sizeof(str),(LPARAM)str);
+ dbv.pszVal=NULL;
+ if(DBGetContactSetting(NULL,protocolname,"password",&dbv) || strcmp(str,dbv.pszVal))
+ reconnectRequired=1;
+ if(dbv.pszVal!=NULL) DBFreeVariant(&dbv);
+ DBWriteContactSettingString(NULL,protocolname,"password",str);
+ GetDlgItemText(hwndDlg,IDC_SERVER,str,sizeof(str));
+
+ //neue preferencen sichern
+ if(bpStatus!=ID_STATUS_OFFLINE&&bpStatus!=ID_STATUS_CONNECTING)
+ {
+ int size=sizeof(xfireconfigitems)/sizeof(xfireconfigitem);
+ for(int i=0;i<size;i++)
+ {
+ if(!(BYTE)IsDlgButtonChecked(hwndDlg, xfireconfigitems[i].id))
+ {
+ DBWriteContactSettingByte(NULL,protocolname,xfireconfigitems[i].dbentry,0);
+ xfireconfig[xfireconfigitems[i].xfireconfigid].wasset=1;
+ xfireconfig[xfireconfigitems[i].xfireconfigid].data[0]=1;
+ xfireconfig[xfireconfigitems[i].xfireconfigid].data[1]=1;
+ xfireconfig[xfireconfigitems[i].xfireconfigid].data[2]=0;
+ xfireconfig[xfireconfigitems[i].xfireconfigid].data[3]=0x30;
+ }
+ else
+ {
+ xfireconfig[xfireconfigitems[i].xfireconfigid].wasset=0;
+ DBWriteContactSettingByte(NULL,protocolname,xfireconfigitems[i].dbentry,1);
+ }
+ }
+ CallService(XFIRE_SEND_PREFS,0,0);
+ }
+
+ //protocolversion wird autoamtisch vergeben
+ //GetDlgItemText(hwndDlg,IDC_PVER,str,sizeof(str));
+ //DBWriteContactSettingByte(NULL,protocolname,"protover",(char)atoi(str));
+
+ if(reconnectRequired) MessageBox(hwndDlg,Translate("The changes you have made require you to reconnect to the XFire network before they take effect"),Translate("XFire Options"),MB_OK|MB_ICONINFORMATION);
+ return TRUE;
+ }
+
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL CALLBACK DlgProcOpts3(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ char inipath[XFIRE_MAX_STATIC_STRING_LEN]="";
+ static BOOL inifound = FALSE;
+ static BOOL dllfound = FALSE;
+ static int nomsgboxsel[] = {1,0,2};
+ static HWND hwndTree = NULL;
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+
+ hwndTree = GetDlgItem(hwndDlg, IDC_TREE);
+
+ SetWindowLong(hwndTree,GWL_STYLE,GetWindowLong(hwndTree,GWL_STYLE)|TVS_NOHSCROLL|TVS_CHECKBOXES);
+
+ SendMessage(hwndDlg, DM_REBUILD_TREE, 0, 0);
+
+ SendDlgItemMessage( hwndDlg, IDC_NOMSG, CB_ADDSTRING, 0, (LPARAM)TranslateT("Hidden" ));
+ SendDlgItemMessage( hwndDlg, IDC_NOMSG, CB_ADDSTRING, 0, (LPARAM)TranslateT("Messagebox" ));
+ SendDlgItemMessage( hwndDlg, IDC_NOMSG, CB_ADDSTRING, 0, (LPARAM)TranslateT("Popup" ));
+
+ //iconslots auswahl einfügen
+ SendDlgItemMessage( hwndDlg, IDC_CBGICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #1 (ICQ X-Status)" ));
+ SendDlgItemMessage( hwndDlg, IDC_CBGICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #2" ));
+ SendDlgItemMessage( hwndDlg, IDC_CBGICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #3" ));
+ SendDlgItemMessage( hwndDlg, IDC_CBGICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #4" ));
+ SendDlgItemMessage( hwndDlg, IDC_CBVICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #1 (ICQ X-Status)" ));
+ SendDlgItemMessage( hwndDlg, IDC_CBVICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #2" ));
+ SendDlgItemMessage( hwndDlg, IDC_CBVICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #3" ));
+ SendDlgItemMessage( hwndDlg, IDC_CBVICO, CB_ADDSTRING, 0, (LPARAM)TranslateT("Advanced #4" ));
+
+ //scanalways
+ SendDlgItemMessage( hwndDlg, IDC_SCANUPDATECB, CB_ADDSTRING, 0, (LPARAM)TranslateT("No" ));
+ SendDlgItemMessage( hwndDlg, IDC_SCANUPDATECB, CB_ADDSTRING, 0, (LPARAM)TranslateT("On every start" ));
+ SendDlgItemMessage( hwndDlg, IDC_SCANUPDATECB, CB_ADDSTRING, 0, (LPARAM)TranslateT("Daily" ));
+
+ SendDlgItemMessage( hwndDlg, IDC_CBVICO, CB_SETCURSEL, DBGetContactSettingByte(NULL,protocolname,"voiceico",-1), 0);
+ SendDlgItemMessage( hwndDlg, IDC_CBGICO, CB_SETCURSEL, DBGetContactSettingByte(NULL,protocolname,"gameico",-1), 0);
+ SendDlgItemMessage( hwndDlg, IDC_SCANUPDATECB, CB_SETCURSEL, DBGetContactSettingByte(NULL,protocolname,"scanalways",0), 0);
+
+ SendDlgItemMessage( hwndDlg, IDC_NOMSG, CB_SETCURSEL, nomsgboxsel[DBGetContactSettingByte(NULL,protocolname,"nomsgbox",0)], 0);
+
+ /* Gruppen raussuchen */
+ {
+ int gruppen_id=0;
+ char temp[8];
+ DBVARIANT dbv;
+
+ SendDlgItemMessage( hwndDlg, IDC_CLANGROUP, CB_ADDSTRING, 0, (LPARAM)TranslateT("<Root Group>" ));
+ SendDlgItemMessage( hwndDlg, IDC_FOFGROUP, CB_ADDSTRING, 0, (LPARAM)TranslateT("<Root Group>" ));
+
+ sprintf_s(temp,8,"%d",gruppen_id);
+ while(!DBGetContactSettingString(NULL,"CListGroups",temp,&dbv))
+ {
+ gruppen_id++;
+ sprintf_s(temp,8,"%d",gruppen_id);
+
+ if(dbv.pszVal!=NULL) {
+ SendDlgItemMessage( hwndDlg, IDC_CLANGROUP, CB_ADDSTRING, 0, (LPARAM)&dbv.pszVal[1]);
+ SendDlgItemMessage( hwndDlg, IDC_FOFGROUP, CB_ADDSTRING, 0, (LPARAM)&dbv.pszVal[1]);
+ DBFreeVariant(&dbv);
+ }
+ }
+ SendDlgItemMessage( hwndDlg, IDC_CLANGROUP, CB_SETCURSEL, DBGetContactSettingByte(NULL,protocolname,"mainclangroup",0), 0);
+ SendDlgItemMessage( hwndDlg, IDC_FOFGROUP, CB_SETCURSEL, DBGetContactSettingByte(NULL,protocolname,"fofgroup",0), 0);
+ }
+
+
+
+ return TRUE;
+ }
+
+ case DM_REBUILD_TREE:
+ //baue optionsmenü auf
+ TreeView_SelectItem(hwndTree, NULL);
+ ShowWindow(hwndTree, SW_HIDE);
+ TreeView_DeleteAllItems(hwndTree);
+ {
+ TVINSERTSTRUCT tvis;
+ HTREEITEM lastSec = NULL;
+
+ tvis.hParent = NULL;
+ tvis.hInsertAfter = TVI_SORT;
+ tvis.item.state = tvis.item.stateMask = TVIS_EXPANDED;
+
+ int size=sizeof(mytree)/sizeof(mytreeitem);
+
+
+ for(int i=0;i<size;i++)
+ {
+ tvis.item.mask = TVIF_TEXT | TVIF_STATE | TVIF_PARAM;
+ tvis.item.iImage = -1;
+ tvis.item.stateMask = TVIS_EXPANDED;
+ tvis.item.state = TVIS_EXPANDED;
+ tvis.hParent = lastSec;
+ if ( mytree[i].parent ) {
+ tvis.hParent = NULL;
+ tvis.item.lParam = -1;
+ tvis.item.pszText = Translate(mytree[i].name);
+ tvis.hParent = tvis.item.hItem = TreeView_InsertItem( hwndTree, &tvis );
+ lastSec=tvis.hParent;
+ tvis.item.stateMask = TVIS_STATEIMAGEMASK;
+ tvis.item.state = INDEXTOSTATEIMAGEMASK(0);
+ TreeView_SetItem( hwndTree, &tvis.item );
+ }
+ else
+ {
+ tvis.item.stateMask = TVIS_STATEIMAGEMASK;
+ tvis.item.state = INDEXTOSTATEIMAGEMASK(DBGetContactSettingByte(NULL,protocolname,mytree[i].dbentry,0)==1?2:1);
+ tvis.item.lParam = 0;
+ tvis.item.pszText = Translate(mytree[i].name);
+ mytree[i].hitem=TreeView_InsertItem( hwndTree, &tvis );
+ }
+ }
+ }
+ {
+ TVITEM tvi;
+ tvi.hItem = TreeView_GetRoot(hwndTree);
+ while ( tvi.hItem != NULL ) {
+ tvi.mask = TVIF_PARAM | TVIF_HANDLE | TVIF_STATE;
+ TreeView_GetItem(hwndTree, &tvi);
+ if ( tvi.lParam == -1 )
+ TreeView_SetItemState(hwndTree, tvi.hItem, INDEXTOSTATEIMAGEMASK(0), TVIS_STATEIMAGEMASK);
+
+ tvi.hItem=TreeView_GetNextSibling(hwndTree,tvi.hItem);
+ }
+ }
+
+
+ ShowWindow(hwndTree, SW_SHOW);
+
+ break;
+
+ case PSM_CHANGED:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_COMMAND:
+ CheckDlgButton(hwndDlg,IDC_CHKI,dllfound);
+ CheckDlgButton(hwndDlg,IDC_CHKG,inifound);
+
+ if(HIWORD(wParam) == CBN_SELCHANGE)
+ {
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ return 0;
+ }
+
+ if ((LOWORD(wParam) == IDC_LOGIN || LOWORD(wParam) == 1013 || LOWORD(wParam) == 1015 || LOWORD(wParam) == 3 || LOWORD(wParam) == IDC_NICK || LOWORD(wParam) == IDC_PASSWORD) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) )
+ return 0;
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->idFrom)
+ {
+ case IDC_TREE:
+ {
+ switch(((NMHDR*)lParam)->code) { //wenn was geändert wurde, apply aktivieren
+ case TVN_SELCHANGEDA:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case TVN_KEYDOWN: //tastatursteuerung
+ {
+ NMTVKEYDOWN* ptkd = (NMTVKEYDOWN*)lParam;
+ if (ptkd&&ptkd->wVKey==VK_SPACE&&TreeView_GetSelection(ptkd->hdr.hwndFrom))
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ case NM_CLICK: //wenn was geklickt wurde, apply aktivieren
+ {
+ TVHITTESTINFO hti;
+ hti.pt.x=(short)LOWORD(GetMessagePos());
+ hti.pt.y=(short)HIWORD(GetMessagePos());
+ ScreenToClient(((LPNMHDR)lParam)->hwndFrom,&hti.pt);
+ if(TreeView_HitTest(((LPNMHDR)lParam)->hwndFrom,&hti))
+ if (hti.flags&TVHT_ONITEM)
+ if(hti.flags&TVHT_ONITEMSTATEICON)
+ if (TreeView_GetParent(hwndTree, hti.hItem)!=NULL)
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ }
+ }
+ }
+ }
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ int reconnectRequired=0;
+ int ccc;
+
+ hwndTree = GetDlgItem(hwndDlg, IDC_TREE);
+
+ //optionen speichern
+ for(int i=0;i<sizeof(mytree)/sizeof(mytreeitem);i++)
+ {
+ TVITEM tvic;
+ if(mytree[i].parent==0)
+ {
+ tvic.hItem=mytree[i].hitem;
+ tvic.mask = TVIF_PARAM | TVIF_HANDLE | TVIF_STATE;
+
+ TreeView_GetItem(hwndTree, &tvic);
+ if ((( tvic.state & TVIS_STATEIMAGEMASK ) >> 12 == 2 ))
+ DBWriteContactSettingByte(NULL,protocolname,mytree[i].dbentry,1);
+ else
+ DBWriteContactSettingByte(NULL,protocolname,mytree[i].dbentry,0);
+ }
+ }
+
+ DBWriteContactSettingByte(NULL,protocolname,"nomsgbox",(BYTE)nomsgboxsel[SendDlgItemMessage(hwndDlg, IDC_NOMSG, CB_GETCURSEL, 0, 0)]);
+
+ ccc=SendDlgItemMessage(hwndDlg, IDC_CBVICO, CB_GETCURSEL, 0, 0);
+ DBWriteContactSettingByte(NULL,protocolname,"voiceico",(BYTE)ccc);
+ ccc=SendDlgItemMessage(hwndDlg, IDC_CBGICO, CB_GETCURSEL, 0, 0);
+ DBWriteContactSettingByte(NULL,protocolname,"gameico",(BYTE)ccc);
+ ccc=SendDlgItemMessage(hwndDlg, IDC_CLANGROUP, CB_GETCURSEL, 0, 0);
+ DBWriteContactSettingByte(NULL,protocolname,"mainclangroup",(BYTE)ccc);
+ ccc=SendDlgItemMessage(hwndDlg, IDC_FOFGROUP, CB_GETCURSEL, 0, 0);
+ DBWriteContactSettingByte(NULL,protocolname,"fofgroup",(BYTE)ccc);
+ ccc=SendDlgItemMessage(hwndDlg, IDC_SCANUPDATECB, CB_GETCURSEL, 0, 0);
+ DBWriteContactSettingByte(NULL,protocolname,"scanalways",(BYTE)ccc);
+
+ //protocolversion wird autoamtisch vergeben
+ //GetDlgItemText(hwndDlg,IDC_PVER,str,sizeof(str));
+ //DBWriteContactSettingByte(NULL,protocolname,"protover",(char)atoi(str));
+
+ if(reconnectRequired) MessageBox(hwndDlg,Translate("The changes you have made require you to reconnect to the XFire network before they take effect"),Translate("XFire Options"),MB_OK|MB_ICONINFORMATION);
+ return TRUE;
+ }
+
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL CALLBACK DlgProcOpts4(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ char inipath[XFIRE_MAX_STATIC_STRING_LEN]="";
+ static BOOL inifound = FALSE;
+ static BOOL dllfound = FALSE;
+ static int nomsgboxsel[] = {1,0,2};
+ static HWND hwndTree = NULL;
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ //addgamedia auf 0 setzen
+ TranslateDialogDefault(hwndDlg);
+
+ FoldersGetCustomPath( XFireWorkingFolder, inipath, 1024, "" );
+ strcat(inipath,"\\");
+ strcat(inipath,"xfire_games.ini");
+
+ FILE * f = fopen(inipath,"r");
+ if(f!=NULL)
+ {
+ fclose(f);
+ CheckDlgButton(hwndDlg,IDC_CHKG,1);
+ inifound = TRUE;
+ }
+ else
+ {
+ EnableDlgItem(hwndDlg, IDC_SETUPGAMES, FALSE);
+ inifound = FALSE;
+ }
+
+ FoldersGetCustomPath( XFireIconFolder, inipath, 1024, "" );
+ strcat(inipath,"\\");
+ strcat(inipath,"icons.dll");
+
+ f = fopen(inipath,"r");
+ if(f!=NULL)
+ {
+ fclose(f);
+ CheckDlgButton(hwndDlg,IDC_CHKI,1);
+ dllfound = TRUE;
+ }
+ else
+ dllfound = FALSE;
+
+ //alle blockierten nutzer in die liste einfügen
+ DBCONTACTENUMSETTINGS dbces;
+
+ // enum all setting the contact has for the module
+ dbces.pfnEnumProc = enumSettingsProc;
+ dbces.szModule = "XFireBlock";
+ dbces.lParam = (LPARAM)hwndDlg;
+ CallService(MS_DB_CONTACT_ENUMSETTINGS, 0,(LPARAM)&dbces);
+
+ SendMessage(GetDlgItem(hwndDlg,IDC_REMUSER),BM_SETIMAGE,IMAGE_ICON,(WPARAM)LoadSkinnedIcon(SKINICON_OTHER_DELETE));
+
+ FoldersGetCustomPath( XFireWorkingFolder, inipath, 1024, "" );
+ SetDlgItemText(hwndDlg,IDC_FILESSHOULDBE,inipath);
+
+ EnableDlgItem(hwndDlg, IDC_REMUSER, FALSE);
+
+ return TRUE;
+ }
+
+ case PSM_CHANGED:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_COMMAND:
+ CheckDlgButton(hwndDlg,IDC_CHKI,dllfound);
+ CheckDlgButton(hwndDlg,IDC_CHKG,inifound);
+
+ if(LOWORD(wParam) == IDC_REMUSER) //nutzer soll aus der blockierliste raus
+ {
+ char temp[255];
+ int sel=SendDlgItemMessage(hwndDlg, IDC_BLOCKUSER, LB_GETCURSEL, 0, 0);
+ if(sel!=LB_ERR) //nur wenn was ausgewählt wurde
+ {
+ SendDlgItemMessage(hwndDlg, IDC_BLOCKUSER, LB_GETTEXT, sel, (LPARAM)temp);
+ SendDlgItemMessage(hwndDlg, IDC_BLOCKUSER, LB_DELETESTRING, sel, 0);
+ DBDeleteContactSetting(NULL,"XFireBlock",temp);
+ if(SendDlgItemMessage(hwndDlg, IDC_BLOCKUSER, LB_GETCOUNT, 0, 0)==0)
+ EnableDlgItem(hwndDlg, IDC_REMUSER, FALSE);
+ }
+ }
+
+
+ if ((LOWORD(wParam) == 9508 || LOWORD(wParam) == IDC_LOGIN || LOWORD(wParam) == IDC_SETUPGAMES || LOWORD(wParam) == IDC_PASSWORD) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) )
+ return 0;
+
+ break;
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ return TRUE;
+ }
+
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL CALLBACK DlgProcOpts5(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DBVARIANT dbv;
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+
+ CheckDlgButton(hwndDlg,IDC_ENABLESTSMSG,DBGetContactSettingByte(NULL,protocolname,"autosetstatusmsg",0));
+ CheckDlgButton(hwndDlg,IDC_CHGSTATUS,DBGetContactSettingByte(NULL,protocolname,"statuschgtype",0));
+ CheckDlgButton(hwndDlg,IDC_DNDFIRST,DBGetContactSettingByte(NULL,protocolname,"dndfirst",0));
+ if(!DBGetContactSetting(NULL,protocolname,"setstatusmsg",&dbv)) {
+ SetDlgItemText(hwndDlg,IDC_STATUSMSG,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ if(!IsDlgButtonChecked(hwndDlg, IDC_ENABLESTSMSG))
+ {
+ EnableDlgItem(hwndDlg, IDC_STATUSMSG, FALSE);
+ }
+ /* if(!ServiceExists(MS_VARS_FORMATSTRING))
+ {
+ EnableDlgItem(hwndDlg, IDC_STATUSMSG, FALSE);
+ EnableDlgItem(hwndDlg, IDC_ENABLESTSMSG, FALSE);
+ EnableDlgItem(hwndDlg, IDC_CHGSTATUS, FALSE);
+ EnableDlgItem(hwndDlg, IDC_DNDFIRST, FALSE);
+ }*/
+
+ return TRUE;
+ }
+
+ case PSM_CHANGED:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+
+ case WM_COMMAND:
+ if ( IsDlgButtonChecked(hwndDlg, IDC_ENABLESTSMSG) ) {
+ EnableDlgItem(hwndDlg, IDC_STATUSMSG, TRUE);
+ }
+ else
+ {
+ EnableDlgItem(hwndDlg, IDC_STATUSMSG, FALSE);
+ }
+
+ if ((LOWORD(wParam) == IDC_LOGIN || LOWORD(wParam) == IDC_STATUSMSG || LOWORD(wParam) == IDC_PASSWORD) && (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) )
+ return 0;
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+
+ break;
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ int reconnectRequired=0;
+ char str[512];
+
+ GetDlgItemText(hwndDlg,IDC_STATUSMSG,str,sizeof(str));
+ DBWriteContactSettingString(NULL,protocolname,"setstatusmsg",str);
+
+ DBWriteContactSettingByte(NULL,protocolname, "autosetstatusmsg", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_ENABLESTSMSG));
+ DBWriteContactSettingByte(NULL,protocolname, "statuschgtype", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_CHGSTATUS));
+ DBWriteContactSettingByte(NULL,protocolname, "dndfirst", (BYTE)IsDlgButtonChecked(hwndDlg, IDC_DNDFIRST));
+
+ return TRUE;
+ }
+
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL CALLBACK DlgProcOpts6(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ addgameDialog=NULL;
+
+ TranslateDialogDefault(hwndDlg);
+
+ //elemente erstmal abstellen
+ EnableDlgItem(hwndDlg, IDC_DONTDETECT, FALSE);
+ EnableDlgItem(hwndDlg, IDC_NOSTATUSMSG, FALSE);
+ EnableDlgItem(hwndDlg, IDC_NOTINSTARTMENU, FALSE);
+ EnableDlgItem(hwndDlg, IDC_APPLY, FALSE);
+ EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, FALSE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_HIDE);
+
+ //gamelist füllen
+ SendMessage(hwndDlg,WM_FILLGAMELIST,0,0);
+
+ //SendMessage(GetDlgItem(hwndDlg,IDC_CREATETXTLIST),BM_SETIMAGE,IMAGE_ICON,(WPARAM)LoadSkinnedIcon(SKINICON_OTHER_USERDETAILS));
+
+ return TRUE;
+ }
+ case WM_FILLGAMELIST:
+ {
+ //spielliste leeren
+ SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_RESETCONTENT, 0, 0);
+ //spiele auslesen und in die liste einfügen
+ int found=DBGetContactSettingWord(NULL,protocolname,"foundgames",0);
+ char temp[XFIRE_MAXSIZEOFGAMENAME];
+ for(int i=0;i<found;i++)
+ {
+ //id auslesen
+ sprintf_s(temp,XFIRE_MAXSIZEOFGAMENAME,"gameid_%d",i);
+ int gameid=DBGetContactSettingWord(NULL,protocolname,temp,0);
+ //spielnamen auslesen
+ xgamelist.getGamename(gameid,temp,XFIRE_MAXSIZEOFGAMENAME);
+ //eintrag einfügen
+ int idx=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_ADDSTRING, 0, (LPARAM)temp);
+ //id an das element übergeben
+ SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_SETITEMDATA, idx, gameid);
+ }
+ return TRUE;
+ }
+ case WM_COMMAND:
+ {
+ if(LOWORD(wParam)==IDC_REMOVE)
+ {
+ int idx=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETCURSEL, 0, 0);
+
+ //was ausgewählt in der liste?
+ if(idx!=LB_ERR) {
+ //user fragen ob er das game wirklich löschen will
+ if(MessageBox(hwndDlg,Translate("Are you sure you want to remove this game?"),Translate("XFire Options"),MB_YESNO|MB_ICONQUESTION)==IDYES) {
+ //gameliste blocken
+ xgamelist.Block(TRUE);
+ //spielid auslesen
+ int gameid=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_GETITEMDATA, idx, 0);
+ //spiel per gameid entfernen
+ xgamelist.Removegame(gameid);
+ //db säubern
+ xgamelist.clearDatabase(TRUE);
+ //derzeitige gameliste in die datenbank eintragen
+ xgamelist.writeDatabase();
+ //startmenu leeren
+ xgamelist.clearStartmenu();
+ //startmenu neuerzeugen
+ xgamelist.createStartmenu();
+ //gameliste unblocken
+ xgamelist.Block(FALSE);
+ //gamelist neu füllen
+ SendMessage(hwndDlg,WM_FILLGAMELIST,0,0);
+ //erstes vorauswählen
+ SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_SETCURSEL, 0, 0);
+ //liste refresh
+ SendMessage(hwndDlg,WM_COMMAND,MAKELONG(IDC_LGAMELIST,LBN_SELCHANGE),0);
+ }
+ }
+ else
+ MessageBox(hwndDlg,Translate("Please select a game."),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION);
+
+ }
+ else
+ if(LOWORD(wParam)==IDC_ADDGAME)
+ {
+ //gameliste blocken
+ xgamelist.Block(TRUE);
+ //if(DialogBox(hinstance,MAKEINTRESOURCE(IDD_ADDGAME),hwndDlg,DlgAddGameProc)) {
+ AddGameDialog(hwndDlg);
+ //gameliste unblocken
+ xgamelist.Block(FALSE);
+ //gamelist neu füllen
+ SendMessage(hwndDlg,WM_FILLGAMELIST,0,0);
+ }
+ //copy gamelist to clipboard button entfernt
+ /*else if(LOWORD(wParam)==IDC_CREATETXTLIST) //gameliste als textform für debugging erstellen
+ {
+ //gameliste blocken
+ xgamelist.Block(TRUE);
+
+ //alle games durchgehen
+ Xfire_game* nextgame;
+ //output string
+ char* out=new char[10];
+ xgamelist.setString("Xfire-gamelist:\r\n",&out);
+ while(xgamelist.getnextGame(&nextgame))
+ {
+ if(nextgame->name)
+ {
+ xgamelist.appendString("\r\nName: ",&out);
+ xgamelist.appendString(nextgame->name,&out);
+ }
+ if(nextgame->path)
+ {
+ xgamelist.appendString("\r\nPath: ",&out);
+ xgamelist.appendString(nextgame->path,&out);
+ }
+ if(nextgame->launchparams)
+ {
+ xgamelist.appendString("\r\nLaunch: ",&out);
+ xgamelist.appendString(nextgame->launchparams,&out);
+ }
+
+ char temp[10];
+ _itoa(nextgame->id,temp,10);
+ xgamelist.appendString("\r\nId: ",&out);
+ xgamelist.appendString(temp,&out);
+
+ _itoa(nextgame->send_gameid,temp,10);
+ xgamelist.appendString("\r\nSend-Id: ",&out);
+ xgamelist.appendString(temp,&out);
+
+ if(nextgame->skip)
+ {
+ xgamelist.appendString("\r\nThis game will be skipped in game detection!",&out);
+ }
+
+ xgamelist.appendString("\r\n",&out);
+ }
+
+ if(OpenClipboard(NULL))
+ {
+ HGLOBAL clipbuffer;
+ char* buffer;
+
+ EmptyClipboard();
+ clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(out)+1);
+ buffer = (char*)GlobalLock(clipbuffer);
+ strcpy(buffer, LPCSTR(out));
+ GlobalUnlock(clipbuffer);
+
+ SetClipboardData(CF_TEXT, clipbuffer);
+ CloseClipboard();
+ }
+
+ if(out!=NULL) delete[] out;
+
+ //gameliste unblocken
+ xgamelist.Block(FALSE);
+ }*/
+ else if(LOWORD(wParam)==IDC_EDITGAME) {
+ int idx=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETCURSEL, 0, 0);
+
+ //was ausgewählt in der liste?
+ if(idx!=LB_ERR) {
+ //gameliste blocken
+ xgamelist.Block(TRUE);
+ //gameid der aktuellen auswahl auslesen
+ int gameid=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_GETITEMDATA, idx, 0);
+ //spielobject holen
+ Xfire_game* tempgame=xgamelist.getGamebyGameid(gameid);
+ //gültiger verweis?
+ if(tempgame) {
+ //editmodus des addgamedialog
+ AddGameDialog(hwndDlg,tempgame);
+ //elemente wieder unsichtbar machen
+ EnableDlgItem(hwndDlg, IDC_DONTDETECT, FALSE);
+ EnableDlgItem(hwndDlg, IDC_NOSTATUSMSG, FALSE);
+ EnableDlgItem(hwndDlg, IDC_NOTINSTARTMENU, FALSE);
+ EnableDlgItem(hwndDlg, IDC_APPLY, FALSE);
+ EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, FALSE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_HIDE);
+ }
+ else
+ MessageBox(hwndDlg,Translate("Error unknown game id."),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION);
+ //gameliste unblocken
+ xgamelist.Block(FALSE);
+ //gamelist neu füllen
+ SendMessage(hwndDlg,WM_FILLGAMELIST,0,0);
+ }
+ else
+ MessageBox(hwndDlg,Translate("Please select a game."),Translate("XFire Options"),MB_OK|MB_ICONEXCLAMATION);
+ }else //wurde ein spiel aus der liste gewählt?
+ if(HIWORD(wParam)==LBN_SELCHANGE && LOWORD(wParam)==IDC_LGAMELIST)
+ {
+ int idx=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETCURSEL, 0, 0);
+ //es wurde was ausgewählt?
+ if(idx!=LB_ERR)
+ {
+ //textlänge auslesen
+ int size=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETTEXTLEN, idx, 0);
+ //textbuffer anlegen
+ char* text=new char[size+1];
+ SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETTEXT, idx, (LPARAM)text);
+ SetDlgItemText(hwndDlg,IDC_GAMENAME,text);
+ //textbuffer löschen
+ if(text!=NULL)
+ {
+ delete text;
+ text=NULL;
+ }
+ //id des spielsbekommen
+ int gameid=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_GETITEMDATA, idx, 0);
+
+ HICON hicon=xgamelist.iconmngr.getGameIcon(gameid);
+ //iconhandle holen und setzen
+ if(hicon)
+ SendMessage(GetDlgItem(hwndDlg,IDC_GAMEICO),STM_SETICON,(WPARAM)hicon,0);
+ else
+ SendMessage(GetDlgItem(hwndDlg,IDC_GAMEICO),STM_SETICON,0,0);
+
+ //elemente aktivieren
+ EnableDlgItem(hwndDlg, IDC_DONTDETECT, TRUE);
+ EnableDlgItem(hwndDlg, IDC_NOSTATUSMSG, TRUE);
+ EnableDlgItem(hwndDlg, IDC_APPLY, TRUE);
+ EnableDlgItem(hwndDlg, IDC_NOTINSTARTMENU, TRUE);
+ EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, TRUE);
+
+ Xfire_game* xgtemp = xgamelist.getGamebyGameid(gameid);
+ if(xgtemp && xgtemp->custom)
+ {
+ ShowWindow(GetDlgItem(hwndDlg,IDC_MANADDED),SW_SHOW);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_SHOW);
+ }
+ else
+ {
+ ShowWindow(GetDlgItem(hwndDlg,IDC_MANADDED),SW_HIDE);
+ ShowWindow(GetDlgItem(hwndDlg, IDC_EDITGAME), SW_HIDE);
+ }
+
+ //gameskip wert setzen
+ char temp[64]="";
+ sprintf_s(temp,64,"gameskip_%d",gameid);
+ CheckDlgButton(hwndDlg,IDC_DONTDETECT,DBGetContactSettingByte(NULL,protocolname,temp,0));
+ sprintf_s(temp,64,"gamenostatus_%d",gameid);
+ CheckDlgButton(hwndDlg,IDC_NOSTATUSMSG,DBGetContactSettingByte(NULL,protocolname,temp,0));
+ sprintf_s(temp,64,"notinstartmenu_%d",gameid);
+ CheckDlgButton(hwndDlg,IDC_NOTINSTARTMENU,DBGetContactSettingByte(NULL,protocolname,temp,0));
+
+ //extra parameter auslesen, aber nur, wenn das spiel auch sowas unterstützt
+ if(xgtemp && xgtemp->haveExtraGameArgs())
+ {
+ EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, TRUE);
+ sprintf_s(temp,64,"gameextraparams_%d",gameid);
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(NULL,protocolname,temp,&dbv))
+ {
+ SetDlgItemText(hwndDlg,IDC_EXTRAPARAMS,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ else
+ SetDlgItemText(hwndDlg,IDC_EXTRAPARAMS,"");
+ }
+ else
+ {
+ EnableDlgItem(hwndDlg, IDC_EXTRAPARAMS, FALSE);
+ SetDlgItemText(hwndDlg,IDC_EXTRAPARAMS,Translate("Not supported"));
+ }
+ }
+ }
+ else if(LOWORD(wParam)==IDC_APPLY)
+ {
+ //auswahl speichern
+ int idx=SendDlgItemMessage(hwndDlg, IDC_LGAMELIST, LB_GETCURSEL, 0, 0);
+ //es wurde was ausgewählt?
+ if(idx!=LB_ERR)
+ {
+ int gameid=SendDlgItemMessage( (HWND)hwndDlg, IDC_LGAMELIST, LB_GETITEMDATA, idx, 0);
+ int dbid;
+
+ //gamelist blocken
+ xgamelist.Block(TRUE);
+
+ if(xgamelist.Gameinlist(gameid,&dbid))
+ {
+ Xfire_game* game=xgamelist.getGame(dbid);
+ if(game)
+ {
+ game->skip=(BYTE)IsDlgButtonChecked(hwndDlg, IDC_DONTDETECT);
+ game->noicqstatus=(BYTE)IsDlgButtonChecked(hwndDlg, IDC_NOSTATUSMSG);
+ game->notinstartmenu=(BYTE)IsDlgButtonChecked(hwndDlg, IDC_NOTINSTARTMENU);
+
+ //extra parameter auslesen und das gameobj schreiben
+ char str[128]="";
+ GetDlgItemText(hwndDlg,IDC_EXTRAPARAMS,str,sizeof(str));
+ if(str[0]!=0)
+ {
+ //extra parameter sind gesetzt, zuweisen
+ game->setString(str,&game->extraparams);
+ }
+ else
+ {
+ //extra parameter leer, wenn gesetzt entfernen/freigeben
+ if(game->extraparams)
+ {
+ delete[] game->extraparams;
+ game->extraparams=NULL;
+ }
+ }
+
+
+ game->refreshMenuitem();
+ game->writeToDB(dbid);
+
+ SetDlgItemText(hwndDlg,IDC_TEXTSTATUS,Translate("Configuration saved!"));
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg,IDC_TEXTSTATUS,Translate("Game not found?!"));
+ }
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg,IDC_TEXTSTATUS,Translate("Game not found?!"));
+ }
+
+ //gamelist unblocken
+ xgamelist.Block(FALSE);
+ }
+ }
+ break;
+ }
+
+ case WM_NOTIFY:
+ {
+ break;
+ }
+ }
+ return FALSE;
+}
+
+static BOOL CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case PSM_CHANGED:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ break;
+ case WM_INITDIALOG:
+ {
+ HWND hwndTab,hPage;
+ TCITEMA tci = {0};
+ int iTotal;
+ RECT rcClient;
+
+ hwndTab = GetDlgItem(hwndDlg, IDC_OPTIONSTAB);
+ TabCtrl_DeleteAllItems(hwndTab);
+ GetClientRect(GetParent(hwndTab), &rcClient);
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_OPTLOGIN), hwndDlg, DlgProcOpts2);
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Account");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 6, rcClient.bottom - 28, 1);
+ iTotal++;
+
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_OPTFEAT), hwndDlg, DlgProcOpts3);
+ ShowWindow(hPage,FALSE);
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Features");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 6, rcClient.bottom - 28, 1);
+ iTotal++;
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_OPTFEAT2), hwndDlg, DlgProcOpts4);
+ ShowWindow(hPage,FALSE);
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Blocklist / Games");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 6, rcClient.bottom - 28, 1);
+ iTotal++;
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_OPTFEAT3), hwndDlg, DlgProcOpts5);
+ ShowWindow(hPage,FALSE);
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("StatusMsg");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 6, rcClient.bottom - 28, 1);
+ iTotal++;
+
+ hPage=CreateDialog(hinstance, MAKEINTRESOURCE(IDD_OPTFEAT4), hwndDlg, DlgProcOpts6);
+ ShowWindow(hPage,FALSE);
+ iTotal = TabCtrl_GetItemCount(hwndTab);
+ tci.mask = TCIF_PARAM|TCIF_TEXT;
+ tci.lParam = (LPARAM)hPage;
+ tci.pszText = Translate("Games");
+ SendMessageA(hwndTab, TCM_INSERTITEMA, iTotal, (WPARAM)&tci);
+ MoveWindow(hPage, 3, 24, rcClient.right - 6, rcClient.bottom - 28, 1);
+ iTotal++;
+
+ TabCtrl_SetCurSel(hwndTab, 0);
+
+ return TRUE;
+ }
+ case WM_NOTIFY:
+ switch (((LPNMHDR)lParam)->idFrom)
+ {
+ case 0:
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_APPLY:
+ {
+ TCITEM tci;
+ int i,count;
+
+ tci.mask = TCIF_PARAM;
+ count = TabCtrl_GetItemCount(GetDlgItem(hwndDlg,IDC_OPTIONSTAB));
+ for (i=0; i<count; i++)
+ {
+ TabCtrl_GetItem(GetDlgItem(hwndDlg,IDC_OPTIONSTAB),i,&tci);
+ SendMessage((HWND)tci.lParam,WM_NOTIFY,0,lParam);
+ }
+ break;
+ }
+ }
+ break;
+
+ case IDC_OPTIONSTAB:
+ {
+ HWND hTabCtrl = GetDlgItem(hwndDlg, IDC_OPTIONSTAB);
+
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case TCN_SELCHANGING:
+ {
+ TCITEM tci;
+
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(hTabCtrl, TabCtrl_GetCurSel(hTabCtrl), &tci);
+ ShowWindow((HWND)tci.lParam, SW_HIDE);
+ }
+ break;
+
+ case TCN_SELCHANGE:
+ {
+ TCITEM tci;
+
+ tci.mask = TCIF_PARAM;
+ TabCtrl_GetItem(hTabCtrl, TabCtrl_GetCurSel(hTabCtrl), &tci);
+ ShowWindow((HWND)tci.lParam,SW_SHOW);
+ }
+ break;
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+int OptInit(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp;
+
+ ghwndDlg2=NULL;
+
+ ZeroMemory(&odp,sizeof(odp));
+ odp.cbSize=sizeof(odp);
+ //odp.position=-790000000;
+ odp.hInstance=hinstance;
+ odp.pszTemplate=MAKEINTRESOURCE(IDD_OPT);
+ odp.pszTitle=Translate("XFire");
+ odp.pszGroup = Translate("Network");
+ odp.flags=ODPF_BOLDGROUPS;
+ //odp.nIDBottomSimpleControl=IDC_GROUPMAIN;
+ odp.pfnDlgProc=DlgProcOpts;
+ Options_AddPage(wParam, &odp);
+
+ return 0;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/otherloginpacket.cpp b/protocols/Xfire/src/otherloginpacket.cpp new file mode 100644 index 0000000000..d0d16fb41e --- /dev/null +++ b/protocols/Xfire/src/otherloginpacket.cpp @@ -0,0 +1,37 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "otherloginpacket.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + void OtherLoginPacket::parseContent(char *buf, int length, int numberOfAtts) { + XINFO(("Someone login in with the same account that we have\n")); + } + +}; diff --git a/protocols/Xfire/src/otherloginpacket.h b/protocols/Xfire/src/otherloginpacket.h new file mode 100644 index 0000000000..4f1168e427 --- /dev/null +++ b/protocols/Xfire/src/otherloginpacket.h @@ -0,0 +1,46 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __OTHERLOGINPACKET_H +#define __OTHERLOGINPACKET_H + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + +#define XFIRE_OTHER_LOGIN 145 + +namespace xfirelib { + + class OtherLoginPacket : public XFireRecvPacketContent { + public: + XFirePacketContent* newPacket() { return new OtherLoginPacket(); } + + int getPacketId() { return XFIRE_OTHER_LOGIN; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + }; +}; + + +#endif diff --git a/protocols/Xfire/src/packetlistener.h b/protocols/Xfire/src/packetlistener.h new file mode 100644 index 0000000000..5702affcff --- /dev/null +++ b/protocols/Xfire/src/packetlistener.h @@ -0,0 +1,41 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __PACKETLISTENER_H +#define __PACKETLISTENER_H + +#include "xfirepacket.h" + + +namespace xfirelib { + struct XFirePacket; + + class PacketListener { + public: + virtual ~PacketListener() { } + virtual void receivedPacket(XFirePacket *packet) = 0; + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/packetreader.cpp b/protocols/Xfire/src/packetreader.cpp new file mode 100644 index 0000000000..d06c480a6e --- /dev/null +++ b/protocols/Xfire/src/packetreader.cpp @@ -0,0 +1,163 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "packetreader.h" + +#include <iostream> +#include "xfirepacket.h" + +#include "clientinformationpacket.h" +#include "authpacket.h" +#include "loginfailedpacket.h" +#include "loginsuccesspacket.h" +#include "buddylistonlinepacket.h" +#include "buddylistnamespacket.h" +#include "clanbuddylistnamespacket.h" +#include "xfireclanpacket.h" +#include "buddylistgamespacket.h" +#include "buddylistgames2packet.h" +#include "messagepacket.h" +#include "otherloginpacket.h" +#include "invitebuddypacket.h" +#include "inviterequestpacket.h" +#include "recvremovebuddypacket.h" +#include "recvstatusmessagepacket.h" +#include "recvoldversionpacket.h" +#include "recvdidpacket.h" +#include "recvprefspacket.h" +#include "gameinfopacket.h" +#include "claninvitationpacket.h" +#include "xfirefoundbuddys.h" +#include "buddyinfo.h" +#include "friendsoffriendlist.h" +#include "recvbuddychangednick.h" + +#include "xdebug.h" +//#include "packetlistener.h" + +namespace xfirelib { + using namespace std; + + PacketReader::PacketReader(Socket *socket) { + this->socket = socket; + this->packetListeners = new vector<PacketListener *>(); + + initPackets(); + } + void PacketReader::setSocket(Socket *socket) { + this->socket = socket; + } + PacketReader::~PacketReader() { + // TODO: delete each packetListener .. + delete packetListeners; + + while(!packets->empty()) { delete packets->at(packets->size()-1); packets->pop_back(); } + delete packets; + } + + void PacketReader::initPackets() { + packets = new vector <XFirePacketContent *>(); + packets->push_back( new ClientInformationPacket() ); + packets->push_back( new AuthPacket() ); + packets->push_back( new LoginFailedPacket() ); + packets->push_back( new LoginSuccessPacket() ); + packets->push_back( new MessagePacket() ); + packets->push_back( new BuddyListOnlinePacket() ); + packets->push_back( new BuddyListNamesPacket() ); + packets->push_back( new BuddyListGamesPacket() ); + packets->push_back( new BuddyListGames2Packet() ); + packets->push_back( new OtherLoginPacket() ); + packets->push_back( new InviteBuddyPacket() ); + packets->push_back( new InviteRequestPacket() ); + packets->push_back( new RecvRemoveBuddyPacket() ); + packets->push_back( new RecvDidPacket() ); + packets->push_back( new RecvStatusMessagePacket() ); + packets->push_back( new RecvOldVersionPacket() ); + packets->push_back( new RecvPrefsPacket() ); + //neue packetklassen hinzugefügt - dufte + packets->push_back( new FriendsBuddyListNamesPacket() ); + packets->push_back( new ClanBuddyListNamesPacket() ); + packets->push_back( new XFireClanPacket() ); + packets->push_back( new GameInfoPacket() ); + packets->push_back( new ClanInvitationPacket() ); + packets->push_back( new XFireFoundBuddys() ); + packets->push_back( new BuddyInfoPacket() ); + packets->push_back( new RecvBuddyChangedNick() ); + } + + + void *muh(void *ptr); + + /* I moved thread starting to Client + + void PacketReader::startListening() { + PacketReader *myself = this; + void* (*func)(void*) = &xfirelib::PacketReader::thread_start; + XINFO(("About to start thread\n")); + int ret = pthread_create( &readthread, NULL, func, (void*)myself ); + XDEBUG(("ret: %d\n",ret)); + } + */ + + void PacketReader::run() { + // start receiving on socket... + XDEBUG(("Starting run() method .... \n")); + while(socket != NULL) { + string str; + //int b = socket->recv(str); + XFirePacket *packet = new XFirePacket(this); + XDEBUG(("Waiting for next packet ... \n")); + if(packet==NULL) continue; + packet->recvPacket( socket ); + XINFO(("Received packet\n")); + if(packet->getContent() != NULL) { + fireListeners( packet ); + } else { + XDEBUG(("Packet Content was NULL ... Unknown Packet Id ??\n")); + } + XDEBUG(("Notified Listeners\n"));// << b << "bytes: " << str << endl; + delete packet->getContent(); + delete packet; + } + } + + void PacketReader::fireListeners( XFirePacket *packet ) { + for(vector<PacketListener *>::iterator it = packetListeners->begin() ; + it != packetListeners->end() ; ++it) { + (*it)->receivedPacket( packet ); + } + } + + XFirePacketContent *PacketReader::getPacketContentClass(int packetId) { + XDEBUG(("Searching for a content class...\n")); + for(uint i = 0 ; i < packets->size() ; i++) + if(packets->at(i)->getPacketId() == packetId) return packets->at(i); + XDEBUG(("None Found\n")); + return NULL; + } + + void PacketReader::addPacketListener( PacketListener *listener ) { + packetListeners->push_back( listener ); + } +}; diff --git a/protocols/Xfire/src/packetreader.h b/protocols/Xfire/src/packetreader.h new file mode 100644 index 0000000000..6108500565 --- /dev/null +++ b/protocols/Xfire/src/packetreader.h @@ -0,0 +1,57 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "socket.h" + +#ifndef __PACKETREADER_H +#define __PACKETREADER_H + +#include <vector> +#include "xfirepacketcontent.h" +#include "packetlistener.h" + +namespace xfirelib { + struct PacketListener; + struct XFirePacket; + +class PacketReader { + public: + PacketReader(Socket *socket); + ~PacketReader(); + + void setSocket(Socket *socket); + void startListening(); + XFirePacketContent *getPacketContentClass(int packetId); + void addPacketListener( PacketListener *listener ); + void run(); + private: + void initPackets(); + void fireListeners( XFirePacket *packet ); + + Socket *socket; + std::vector <XFirePacketContent *> *packets; + std::vector <PacketListener *> *packetListeners; +}; + +}; + +#endif diff --git a/protocols/Xfire/src/passworddialog.cpp b/protocols/Xfire/src/passworddialog.cpp new file mode 100644 index 0000000000..7b2202c24f --- /dev/null +++ b/protocols/Xfire/src/passworddialog.cpp @@ -0,0 +1,59 @@ +//fürs passwort dialog - dufte
+
+#include "stdafx.h"
+#include "passworddialog.h"
+
+static char nick[255];
+BOOL usenick=FALSE;
+
+BOOL CALLBACK DlgPWProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static char* pw[255];
+ switch (msg)
+ {
+ case WM_CLOSE:
+ {
+ GetDlgItemTextA(hwndDlg,IDC_PWSTRING,(LPSTR)pw,254);
+ if(usenick)
+ GetDlgItemTextA(hwndDlg,IDC_PWNICK,(LPSTR)nick,254);
+ EndDialog(hwndDlg,(INT_PTR)pw);
+ break;
+ }
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+ //passwort und nick leeren
+ pw[0]=0;
+ nick[0]=0;
+ SendMessage(hwndDlg,WM_SETICON, (WPARAM)false, (LPARAM)LoadIcon(hinstance, MAKEINTRESOURCE(IDI_TM)));
+ if(!usenick)
+ EnableWindow(GetDlgItem(hwndDlg,IDC_PWNICK),FALSE);
+
+ return TRUE;
+ }
+ case WM_COMMAND:
+ {
+ if(LOWORD(wParam) == IDC_BTN4) {
+ SendMessage(hwndDlg,WM_CLOSE,0,0);
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+void ShowPasswordDialog(char*pw,char*mynick) {
+ if(mynick!=NULL)
+ {
+ usenick=TRUE;
+ }
+ else
+ usenick=FALSE;
+
+ char* npw = (char*)DialogBox(hinstance,MAKEINTRESOURCE(IDD_PWDLG),NULL,DlgPWProc);
+ strcpy(pw,npw);
+ if(mynick)
+ {
+ strcpy(mynick,(char*)nick);
+ }
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/passworddialog.h b/protocols/Xfire/src/passworddialog.h new file mode 100644 index 0000000000..4078c766df --- /dev/null +++ b/protocols/Xfire/src/passworddialog.h @@ -0,0 +1,4 @@ +#include "baseProtocol.h"
+#include "resource.h"
+
+void ShowPasswordDialog(char*pw,char*mynick=NULL);
\ No newline at end of file diff --git a/protocols/Xfire/src/processbuddyinfo.cpp b/protocols/Xfire/src/processbuddyinfo.cpp new file mode 100644 index 0000000000..e5e6fb6af7 --- /dev/null +++ b/protocols/Xfire/src/processbuddyinfo.cpp @@ -0,0 +1,111 @@ +#include "stdafx.h"
+#include "processbuddyinfo.h"
+
+#include <sys\stat.h>
+
+
+/*
+DBWriteContactSettingTString(xsa->hContact, "ContactPhoto", "Backup", av.backup);
+DBWriteContactSettingTString(xsa->hContact, "ContactPhoto", "File", av.file);
+DBWriteContactSettingTString(xsa->hContact, "ContactPhoto", "RFile", av.rfile);
+DBWriteContactSettingWord(xsa->hContact, "ContactPhoto", "Format", av.type);
+*/
+
+extern HANDLE XFireAvatarFolder;
+
+//vom Yahoo plugin
+/*int avt_hash(const char *key, DWORD ksize)
+{
+ const char *p = key;
+ int h = *p;
+ long l = 1;
+
+ if (h)
+ for (p += 1; l < ksize; p++, l++)
+ h = (h << 5) - h + *p;
+
+ return h;
+}*/
+
+void ProcessBuddyInfo(xfirelib::BuddyInfoPacket *buddyinfo,HANDLE hcontact,char* username) {
+ char temp[512]="";
+ char filename[512];
+ BOOL dl=FALSE;
+ int type;
+
+ //versuche doppeltes laden zuvermeiden
+ if(hcontact) //avatar von freunden
+ {
+ if(DBGetContactSettingDword(hcontact, "ContactPhoto", "XFireAvatarId", 0)==buddyinfo->avatarid &&
+ DBGetContactSettingByte(hcontact, "ContactPhoto", "XFireAvatarMode", 0)==buddyinfo->avatarmode)
+ return;
+ }
+ else //eigeneder avatar
+ {
+ if(DBGetContactSettingDword(hcontact, protocolname, "XFireAvatarId", 0)==buddyinfo->avatarid &&
+ DBGetContactSettingByte(hcontact, protocolname, "XFireAvatarMode", 0)==buddyinfo->avatarmode)
+ return;
+
+ //alten dateipfad des avatars löschen, wenn sichw as geändert hat
+ DBDeleteContactSetting(NULL,protocolname, "MyAvatarFile");
+ }
+
+ FoldersGetCustomPath( XFireAvatarFolder, filename, 1024, "" );
+ strcat(filename,"\\");
+
+ switch(buddyinfo->avatarmode) {
+ case 1:
+ strcat(filename,username);
+ strcat(filename,".gif");
+ type=PA_FORMAT_GIF;
+
+ sprintf(temp,"/xfire/xf/images/avatars/gallery/default/%03d.gif",buddyinfo->avatarid);
+
+ dl=GetWWWContent("media.xfire.com",temp,filename,FALSE);
+ break;
+ case 2:
+ strcat(filename,username);
+ strcat(filename,".jpg");
+ type=PA_FORMAT_JPEG;
+
+ sprintf(temp,"/avatar/100/%s.jpg?%d",username,buddyinfo->avatarid);
+
+ dl=GetWWWContent("screenshot.xfire.com",temp,filename,FALSE);
+ break;
+ case 3:
+ type=PA_FORMAT_GIF;
+ strcat(filename,"xfire.gif");
+
+ sprintf(temp,"/xfire/xf/images/avatars/gallery/default/xfire.gif",buddyinfo->avatarid);
+
+ dl=GetWWWContent("media.xfire.com",temp,filename,TRUE);
+ break;
+ default:
+ return;
+ }
+
+
+ if(dl!=FALSE)
+ {
+ if(hcontact) //buddyavatar setzen
+ {
+ DBWriteContactSettingDword(hcontact, "ContactPhoto", "XFireAvatarId", buddyinfo->avatarid);
+ DBWriteContactSettingByte(hcontact, "ContactPhoto", "XFireAvatarMode", buddyinfo->avatarmode);
+ PROTO_AVATAR_INFORMATION AI;
+ AI.cbSize = sizeof(AI);
+ AI.format = type;
+ AI.hContact = hcontact;
+ lstrcpy(AI.filename,filename);
+ ProtoBroadcastAck(protocolname, hcontact, ACKTYPE_AVATAR, ACKRESULT_SUCCESS,(HANDLE) &AI, 0);
+ }
+ else //eigenen avatar setzen
+ {
+ DBWriteContactSettingDword(NULL, protocolname, "XFireAvatarId", buddyinfo->avatarid);
+ DBWriteContactSettingByte(NULL, protocolname, "XFireAvatarMode", buddyinfo->avatarmode);
+ //neuen avatarfilepath eintragen
+ DBWriteContactSettingTString(NULL,protocolname, "MyAvatarFile",filename);
+ //beshceid geben, avatar hat sich geändert
+ CallService(MS_AV_REPORTMYAVATARCHANGED,(WPARAM)protocolname,0);
+ }
+ }
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/processbuddyinfo.h b/protocols/Xfire/src/processbuddyinfo.h new file mode 100644 index 0000000000..0964ef983b --- /dev/null +++ b/protocols/Xfire/src/processbuddyinfo.h @@ -0,0 +1,7 @@ +//funktion soll avatar runterladen und dem buddy zuordnen
+#include "baseProtocol.h"
+#include "resource.h"
+#include "getbuddyinfo.h"
+#include "buddyinfo.h"
+
+void ProcessBuddyInfo(xfirelib::BuddyInfoPacket *buddyinfo,HANDLE hcontact,char* username);
\ No newline at end of file diff --git a/protocols/Xfire/src/pwd_dlg.cpp b/protocols/Xfire/src/pwd_dlg.cpp new file mode 100644 index 0000000000..e2668b96d7 --- /dev/null +++ b/protocols/Xfire/src/pwd_dlg.cpp @@ -0,0 +1,53 @@ +//fürs nick - dialog
+
+#include "stdafx.h"
+#include "pwd_dlg.h"
+
+char password[256]="";
+
+BOOL CALLBACK DlgPwProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetWindowText(hwndDlg, "Please enter server password ...");
+ TranslateDialogDefault(hwndDlg);
+ SendMessage(hwndDlg,WM_SETICON, (WPARAM)false, (LPARAM)LoadIcon(hinstance, MAKEINTRESOURCE(IDI_TM)));
+ return TRUE;
+ }
+ case WM_COMMAND:
+ {
+ if(LOWORD(wParam) == IDOK)
+ {
+ GetDlgItemText(hwndDlg,IDC_NICKNAME,password,sizeof(password));
+ EndDialog(hwndDlg,TRUE);
+ return TRUE;
+ }
+ else if(LOWORD(wParam) == IDCANCEL)
+ {
+ EndDialog(hwndDlg,FALSE);
+ return FALSE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+BOOL ShowPwdDlg(char* pw) {
+ //kein gültiges ziel für das eingegebene passwort
+ if(&pw==NULL)
+ return FALSE;
+
+ if(DialogBox(hinstance,MAKEINTRESOURCE(IDD_SETNICKNAME),NULL,DlgPwProc))
+ {
+ //passwort kopieren
+ if(*password == 0)
+ return FALSE;
+
+ strcpy_s(pw,255,password);
+ return TRUE;
+ }
+
+ return FALSE;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/pwd_dlg.h b/protocols/Xfire/src/pwd_dlg.h new file mode 100644 index 0000000000..022c63de9f --- /dev/null +++ b/protocols/Xfire/src/pwd_dlg.h @@ -0,0 +1,4 @@ +#include "baseProtocol.h"
+#include "resource.h"
+
+BOOL ShowPwdDlg(char* pw);
\ No newline at end of file diff --git a/protocols/Xfire/src/recvbuddychangednick.cpp b/protocols/Xfire/src/recvbuddychangednick.cpp new file mode 100644 index 0000000000..f48b8da043 --- /dev/null +++ b/protocols/Xfire/src/recvbuddychangednick.cpp @@ -0,0 +1,48 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "recvbuddychangednick.h" +#include "variablevalue.h" + +//packet liest neue nicks ein + +namespace xfirelib { + using namespace std; + + void RecvBuddyChangedNick::parseContent(char *buf, int length, int numberOfAtts) { + VariableValue val; + int index = 0; + index +=2; // Ignore 02 01 02 ?? + index += val.readValue(buf,index,4); + userid = val.getValueAsLong(); + index +=2; // Ignore 0d 01 + int l = (unsigned char)buf[index++]; + index++; + index += val.readValue(buf,index,l); + string stringvalue = string(val.getValue(),l); + this->newnick=stringvalue; + } + +}; diff --git a/protocols/Xfire/src/recvbuddychangednick.h b/protocols/Xfire/src/recvbuddychangednick.h new file mode 100644 index 0000000000..6c3ae08e05 --- /dev/null +++ b/protocols/Xfire/src/recvbuddychangednick.h @@ -0,0 +1,52 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __RECVBUDDYCHANGEDNICK_H +#define __RECVBUDDYCHANGEDNICK_H + +//packet liest neue nicks ein + +#include "xfirerecvpacketcontent.h" +#include <string> + +#define XFIRE_RECVBUDDYCHANGEDNICK 161 + +namespace xfirelib { + class RecvBuddyChangedNick : public XFireRecvPacketContent { + public: + virtual ~RecvBuddyChangedNick() { } + int getPacketId() { return XFIRE_RECVBUDDYCHANGEDNICK; } + + XFirePacketContent *newPacket() { return new RecvBuddyChangedNick(); } + void parseContent(char *buf, int length, int numberOfAtts); + + long userid; + + std::string newnick; + void* entry; // handle eingefügt, damit ich schnell den buddy killen kann - dufte + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/recvdidpacket.cpp b/protocols/Xfire/src/recvdidpacket.cpp new file mode 100644 index 0000000000..ee0925c724 --- /dev/null +++ b/protocols/Xfire/src/recvdidpacket.cpp @@ -0,0 +1,35 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "recvdidpacket.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + + void RecvDidPacket::parseContent(char *buf, int length, int numberOfAtts) { + XDEBUG(("This is the useles DID packet, its realy useless\n")); + } + +}; diff --git a/protocols/Xfire/src/recvdidpacket.h b/protocols/Xfire/src/recvdidpacket.h new file mode 100644 index 0000000000..92e09ff2f3 --- /dev/null +++ b/protocols/Xfire/src/recvdidpacket.h @@ -0,0 +1,43 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __RECVDIDPACKET_H +#define __RECVDIDPACKET_H + +#include "xfirerecvpacketcontent.h" + +#define XFIRE_RECVDIDPACKET 144 + +namespace xfirelib { + class RecvDidPacket : public XFireRecvPacketContent { + public: + virtual ~RecvDidPacket() { } + int getPacketId() { return XFIRE_RECVDIDPACKET; } + + XFirePacketContent *newPacket() { return new RecvDidPacket(); } + void parseContent(char *buf, int length, int numberOfAtts); + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/recvoldversionpacket.cpp b/protocols/Xfire/src/recvoldversionpacket.cpp new file mode 100644 index 0000000000..635d69352a --- /dev/null +++ b/protocols/Xfire/src/recvoldversionpacket.cpp @@ -0,0 +1,42 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "recvoldversionpacket.h" + +#include "variablevalue.h" +#include "xdebug.h" +#include <vector> +#include <string> + +namespace xfirelib { + class RecvOldVersionPacket; + + RecvOldVersionPacket::RecvOldVersionPacket() : XFireRecvPacketContent() { + } + + void RecvOldVersionPacket::parseContent(char *buf, int length, int numberOfAtts) { + //aktuelle version + this->newversion=buf[12]; + } +}; diff --git a/protocols/Xfire/src/recvoldversionpacket.h b/protocols/Xfire/src/recvoldversionpacket.h new file mode 100644 index 0000000000..46bc1d6ccc --- /dev/null +++ b/protocols/Xfire/src/recvoldversionpacket.h @@ -0,0 +1,48 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __RECVOLDVERSIONPACKET_H +#define __RECVOLDVERSIONPACKET_H + +#define XFIRE_RECV_OLDVERSION_PACKET_ID 134 + +#include "xfirerecvpacketcontent.h" + +namespace xfirelib { + + class RecvOldVersionPacket : public XFireRecvPacketContent { + public: + RecvOldVersionPacket(); + virtual ~RecvOldVersionPacket() { } + XFirePacketContent *newPacket() { return new RecvOldVersionPacket; } + int getPacketId() { return XFIRE_RECV_OLDVERSION_PACKET_ID; } + + void parseContent(char *buf, int length, int numberOfAtts); + + char newversion; + + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/recvprefspacket.cpp b/protocols/Xfire/src/recvprefspacket.cpp new file mode 100644 index 0000000000..faad9ce964 --- /dev/null +++ b/protocols/Xfire/src/recvprefspacket.cpp @@ -0,0 +1,107 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "recvprefspacket.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + + void RecvPrefsPacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + + memset(&this->config,0,sizeof(xfire_prefitem)*XFIRE_RECVPREFSPACKET_MAXCONFIGS); + + XDEBUG("This packet gives us the preferences that you can set with the official client.\n"); + + //skip 4c,09 + index+=2; + + //anzahl an konfigurationen welche abgestellt wurden + int anz=buf[index]; + XDEBUG2("%d disabled Configs\n",anz); + + index++; + + for(int i=0;i<anz;i++) + { + int kid=buf[index]; + XDEBUG2("Konfigid: %d\n",kid); + + if(kid<XFIRE_RECVPREFSPACKET_MAXCONFIGS&&kid>0) + { + config[kid].wasset=1; + for(int j=0;j<4;j++) + { + index++; + config[kid].data[j]=buf[index]; + } + } + + XDEBUG2("Konfigval: %d\n",buf[index]); + index++; + } + + + } + + //prefences packet vorbereiten + int PrefsPacket::getPacketContent(char *buf) { + int index = 0; + + buf[index++]=5; + buf[index++]='p'; + buf[index++]='r'; + buf[index++]='e'; + buf[index++]='f'; + buf[index++]='s'; + + buf[index++]=9; + + //anzahlindex zwischenspeichern + int anzindex=index; + index++; + + int anz=0; + for(int j=0;j<XFIRE_RECVPREFSPACKET_MAXCONFIGS;j++) + { + if(this->config[j].wasset==1) + { + buf[index++]=j; + buf[index++]=this->config[j].data[0]; + buf[index++]=this->config[j].data[1]; + buf[index++]=this->config[j].data[2]; + buf[index++]=this->config[j].data[3]; + anz++; + } + } + + buf[anzindex]=anz; + + return index; + } + + +}; diff --git a/protocols/Xfire/src/recvprefspacket.h b/protocols/Xfire/src/recvprefspacket.h new file mode 100644 index 0000000000..24683f870b --- /dev/null +++ b/protocols/Xfire/src/recvprefspacket.h @@ -0,0 +1,81 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __RECVPREFSPACKET_H +#define __RECVPREFSPACKET_H + +#include "xfirerecvpacketcontent.h" +#include "xfiresendpacketcontent.h" + +#define XFIRE_RECVPREFSPACKET 141 +#define XFIRE_SENDPREFSPACKET 0xa + +#define XFIRE_RECVPREFSPACKET_MAXCONFIGS 32 +#define XFIRE_RECVPREFSPACKET_SUPPORTEDONFIGS 7 + +//zum zwischenspeichern, wird später benötigt zum versenden +struct xfire_prefitem { + unsigned char data[4]; + unsigned char wasset; +}; + +//für die optionen +struct xfireconfigitem {
+ unsigned long id;
+ char xfireconfigid;
+ char dbentry[256];
+}; + +namespace xfirelib { + + //packet mit den preferences + class RecvPrefsPacket : public XFireRecvPacketContent { + public: + virtual ~RecvPrefsPacket() { } + int getPacketId() { return XFIRE_RECVPREFSPACKET; } + + XFirePacketContent *newPacket() { return new RecvPrefsPacket(); } + void parseContent(char *buf, int length, int numberOfAtts); + + //array vorbereiten, eventuell auf 32 bytes aufstocken, man weis ja nie was kommt + xfire_prefitem config[XFIRE_RECVPREFSPACKET_MAXCONFIGS]; + }; + + //packet zum setzen neuer preferences + class PrefsPacket : public XFireSendPacketContent { + public: + virtual ~PrefsPacket() { } + + XFirePacketContent *newPacket() { return new PrefsPacket; } + int getPacketId() { return XFIRE_SENDPREFSPACKET; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 1; } + int getPacketSize() { return 1024; } + + xfire_prefitem config[XFIRE_RECVPREFSPACKET_MAXCONFIGS]; + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/recvremovebuddypacket.cpp b/protocols/Xfire/src/recvremovebuddypacket.cpp new file mode 100644 index 0000000000..1e9b14d939 --- /dev/null +++ b/protocols/Xfire/src/recvremovebuddypacket.cpp @@ -0,0 +1,39 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "recvremovebuddypacket.h" +#include "variablevalue.h" + +namespace xfirelib { + + void RecvRemoveBuddyPacket::parseContent(char *buf, int length, int numberOfAtts) { + VariableValue val; + int index = 0; + index += val.readName(buf,index); + index ++; // Ignore 02 ?? + index += val.readValue(buf,index,4); + userid = val.getValueAsLong(); + } + +}; diff --git a/protocols/Xfire/src/recvremovebuddypacket.h b/protocols/Xfire/src/recvremovebuddypacket.h new file mode 100644 index 0000000000..87c75c0012 --- /dev/null +++ b/protocols/Xfire/src/recvremovebuddypacket.h @@ -0,0 +1,56 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __RECVREMOVEBUDDYPACKET_H +#define __RECVREMOVEBUDDYPACKET_H + +#include "xfirerecvpacketcontent.h" +#include <string> + +#define XFIRE_RECVREMOVEBUDDYPACKET 139 + +namespace xfirelib { + class RecvRemoveBuddyPacket : public XFireRecvPacketContent { + public: + virtual ~RecvRemoveBuddyPacket() { } + int getPacketId() { return XFIRE_RECVREMOVEBUDDYPACKET; } + + XFirePacketContent *newPacket() { return new RecvRemoveBuddyPacket(); } + void parseContent(char *buf, int length, int numberOfAtts); + + long userid; + + /** + * I've added this attribute altough it is not part of the actual packet + * because by the time the packet content reaches the client + * application the user will no longer be in the BuddyList .. so no + * way for the client application to know which buddy was just removed. + * (it will be set by the BuddyList, not when parsing the packet) + */ + std::string username; + void* handle; // handle eingefügt, damit ich schnell den buddy killen kann - dufte + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/recvstatusmessagepacket.cpp b/protocols/Xfire/src/recvstatusmessagepacket.cpp new file mode 100644 index 0000000000..38387f424d --- /dev/null +++ b/protocols/Xfire/src/recvstatusmessagepacket.cpp @@ -0,0 +1,80 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "recvstatusmessagepacket.h" + +#include "variablevalue.h" +#include "xdebug.h" +#include <vector> +#include <string> + +namespace xfirelib { + RecvStatusMessagePacket::RecvStatusMessagePacket() { + centries=0; + } + + void RecvStatusMessagePacket::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + int numberOfIds = 0; + VariableValue val; + index += val.readName(buf,index); + index ++; // ignore 03 ?? + index ++; // jump to counter + numberOfIds = (unsigned char) buf[index]; + index ++; // Ignore 00 ?? + index ++; + sids = new std::vector<char *>; + for(int i = 0 ; i < numberOfIds ; i++) { + index += val.readValue(buf,index,16); + char *sid = new char[16]; + memcpy(sid,val.getValue(),16); + sids->push_back(sid); + } + + index += val.readName(buf,index); + XDEBUG(( "valname %s\n", val.getName().c_str() )); + index ++; // Ignore 04 ?? + msgs = new std::vector<std::string>; + index = readStrings(msgs,buf,index); + + } + + +int RecvStatusMessagePacket::readStrings(std::vector<std::string> *strings, char *buf, int index) { + VariableValue friends; + index += friends.readValue(buf,index); + index ++; // Ignore 00 + int numberOfStrings = friends.getValueAsLong(); + XDEBUG3( "name: %s numberOfStrings: %d\n", friends.getName().c_str(), numberOfStrings ); + for(int i = 0 ; i < numberOfStrings ; i++) { + int length = (unsigned char)buf[index++]; + index++; + index += friends.readValue(buf,index,length); + std::string stringvalue = std::string(friends.getValue(),length); + strings->push_back(stringvalue); + XDEBUG3( "String length: %2d : %s\n", length, stringvalue.c_str() ); + } + return index; + } +}; diff --git a/protocols/Xfire/src/recvstatusmessagepacket.h b/protocols/Xfire/src/recvstatusmessagepacket.h new file mode 100644 index 0000000000..95e61fab12 --- /dev/null +++ b/protocols/Xfire/src/recvstatusmessagepacket.h @@ -0,0 +1,57 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __RECVMESSAGEPACKET_H +#define __RECVMESSAGEPACKET_H + +#define XFIRE_RECV_STATUSMESSAGE_PACKET_ID 154 + +#include "xfirerecvpacketcontent.h" +#include "buddylist.h" +#include <string> +#include <vector> + +namespace xfirelib { + + class RecvStatusMessagePacket : public XFireRecvPacketContent { + public: + RecvStatusMessagePacket(); + virtual ~RecvStatusMessagePacket() { } + XFirePacketContent *newPacket() { return new RecvStatusMessagePacket; } + int getPacketId() { return XFIRE_RECV_STATUSMESSAGE_PACKET_ID; } + + void parseContent(char *buf, int length, int numberOfAtts); + char * getSid(int i){ return sids->at(i); } + + std::vector<char *> *sids; + std::vector<std::string> *msgs; + BuddyListEntry** entries; + int centries; + + private: + int readStrings(std::vector<std::string> *strings, char *buf, int index); + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/resource.h b/protocols/Xfire/src/resource.h new file mode 100644 index 0000000000..5d2cbd8a4e --- /dev/null +++ b/protocols/Xfire/src/resource.h @@ -0,0 +1,173 @@ +#define IDC_APPLY 1331
+#define ID_OP 13
+#define IDI_TM 14
+#define IDC_STC1 1
+#define IDC_NICK 2
+#define IDC_GRP1 11
+#define IDC_NOAV 12
+#define IDC_NOMSG 3
+#define IDC_GRP2 3
+#define IDC_GRP3 4
+#define IDC_GRP4 17
+#define IDC_SETUPGAMES 10551
+#define IDC_STC2 1
+#define IDC_STC3 2
+#define IDC_STC4 5
+#define IDC_GAME 6
+#define IDC_GRP5 88
+#define IDC_STC6 77
+#define IDC_STC8 55
+#define IDC_STC5 7
+#define IDC_GIP 8
+#define IDC_STC7 9
+#define IDC_GPORT 10
+#define IDC_VNAME 11
+#define IDC_STC10 12
+#define IDC_STC11 13
+#define IDC_VIP 14
+#define IDC_STC13 15
+#define IDC_VPORT 16
+#define IDC_DNICK 18
+#define IDC_DUSERNAME 19
+#define IDC_GAMEICO 100
+#define IDC_VOICEICO 200
+#define IDC_COPYGAME 1001
+#define IDC_COPYVOICE 1002
+#define IDC_STATIC -1
+#define IDI_ONLINE 104
+#define IDI_OFFLINE 105
+#define IDI_AWAY 128
+#define IDC_NOIPPORT 1007
+#define IDC_ONINAFK 1008
+#define IDI_TEST 10
+#define IDC_CHKI 1072
+#define IDD_OPT 102
+#define IDD_UD 1000
+#define IDD_UD2 1001
+#define IDC_CBGICO 1013
+#define IDC_CBVICO 1015
+#define IDC_GROUPCONFIG 1000
+#define IDC_GROUPMAIN 1002
+#define IDC_KEEPALIVE 1011
+#define IDC_PASSWORD 1020
+#define IDC_LOGIN 1022
+#define IDC_SERVER 1171
+#define IDC_SERVERPORT 1174
+#define IDC_STATIC -1
+#define IDC_STATIC -1
+#define IDC_STC9 1001
+#define IDC_NOCLANGROUP 5001
+#define IDC_BTN1 5002
+#define IDC_GRP6 1202
+#define IDC_PROFILIMG 1601
+#define IDC_SCANALWAYS 1621
+#define IDC_STC12 1702
+#define IDC_STC14 1804
+#define IDC_CHKG 1071
+#define IDC_GAMEINFOLIST 1992
+#define IDC_GRP7 19901
+#define IDC_FINDFILES 1234
+#define IDD_GAMELIST 1009
+#define IDC_LST1 1001
+#define IDC_NEVERD 1004
+#define IDC_RBN2 1005
+#define IDC_MANUAL 1006
+#define IDC_GAMEPATH 1007
+#define IDC_BTN2 1009
+#define IDC_GSQP 1991
+#define IDC_BTN3 1044
+#define IDC_LAUNCH 3002
+#define IDC_STC15 3003
+#define IDC_NOCUSTOMAWAY 91231
+#define IDC_TREE 1921
+#define DM_REBUILD_TREE 87714
+#define IDC_GRP8 10241
+#define IDC_BLOCKUSER 61002
+#define IDC_REMUSER 61003
+#define IDC_INSTALLTYPE 871002
+#define IDC_INSTALLTYPES 1707
+#define IDC_STC16 31001
+#define IDC_PVER 91002
+#define IDD_PWDLG 991000
+#define IDC_STC17 41901
+#define IDC_PWSTRING 1902
+#define IDC_BTN4 12903
+#define IDC_LASTGAME 19901
+#define IDI_JOIN 8888
+#define IDI_COPYGAME 8889
+#define IDI_JOINV 8890
+#define IDI_COPYVOICE 8891
+#define IDC_STC18 1001
+#define IDC_PWNICK 9502
+#define IDC_OPTIONSTAB 9503
+#define IDD_OPTLOGIN 9504
+#define IDD_OPTFEAT 9505
+#define IDD_OPTFEAT2 9506
+#define IDC_URLNEWACC 9507
+#define IDC_FILESSHOULDBE 9508
+#define IDC_PIP 9509
+#define IDC_PPORT 9510
+#define IDC_USEPROXY 9511
+#define IDD_OPTFEAT3 9512
+#define IDC_ENABLESTSMSG 9511
+#define IDC_STATUSMSG 9512
+#define IDD_SETNICKNAME 9513
+#define IDC_NICKNAME 9514
+#define IDC_CHGSTATUS 9515
+#define IDD_SEARCHING 9516
+#define IDC_SEARCHINGLABL 9517
+#define IDC_CURRENTGAME 9518
+#define IDC_LOSTPW 9519
+#define IDC_CLANGROUP 9520
+#define IDC_SCANUPDATECB 9521
+#define IDC_LGAMELIST 9522
+#define IDD_OPTFEAT4 9523
+#define IDC_DONTDETECT 9524
+#define IDC_GAMENAME 9525
+#define IDC_NOSTATUSMSG 9526
+#define IDC_TEXTSTATUS 9527
+#define IDC_KONFIG_1 9528
+#define IDC_KONFIG_2 9529
+#define IDC_KONFIG_3 9530
+#define IDC_KONFIG_4 9531
+#define IDC_KONFIG_5 9532
+#define IDC_KONFIG_6 9533
+#define IDC_KONFIG_7 9534
+#define IDC_FOFGROUP 9535
+#define IDC_WEBC 9536
+#define IDD_UPDATE 9537
+#define IDC_UPDATEGAMES 9538
+#define IDD_ADDGAME 9539
+#define IDC_ADDGAME 9540
+#define IDC_GAMELIST 9541
+#define IDC_PROGRESS 9542
+#define IDC_SEARCH 9543
+#define IDC_REMOVE 9544
+#define IDC_NOTINSTARTMENU 9545
+#define IDC_MANADDED 9546
+#define IDC_DNDFIRST 9547
+#define IDC_EXTRAPARAMS 9548
+#define IDD_ADDGAMEMAIN 9549
+#define IDD_ADDGAME2 9550
+#define IDC_ADD_NAME 9551
+#define IDC_ADD_DETECTEXE 9552
+#define IDC_ADD_BROWSEDETECT 9553
+#define IDC_ADD_LAUNCHEREXE 9554
+#define IDC_ADD_BROWSELAUNCHER 9555
+#define IDC_GAMEIDHELP 9556
+#define IDC_ADD_ID 9557
+#define IDC_ADD_SENDID 9558
+#define IDC_SENDIDHELP 9559
+#define IDC_ADD_STATUSMSG 9560
+#define IDC_EDITGAME 9561
+#define IDC_CREATETXTLIST 9562
+#define IDC_TESTBUTTON 9563
+#define IDC_CUSTOM 9564
+#define IDC_ADD_CUSTOMPARAMS 9565
+#define WM_SETPROFIMAGE WM_USER+10
+#define WM_FILLGAMELIST WM_USER+20
+#define WM_EDITGAMEDLG WM_USER+30
+
+/*
+ end of resource.h
+*/
\ No newline at end of file diff --git a/protocols/Xfire/src/searchbuddy.cpp b/protocols/Xfire/src/searchbuddy.cpp new file mode 100644 index 0000000000..716d88438c --- /dev/null +++ b/protocols/Xfire/src/searchbuddy.cpp @@ -0,0 +1,77 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "searchbuddy.h" +#include <string.h> +#include <iostream> + +namespace xfirelib { + using namespace std; + + int SearchBuddy::getPacketContent(char *packet) { + int index = 0; + + // name + VariableValue val; + val.setName( "name" ); + index += val.writeName( packet, index ); + + packet[index++] = 0x01; + + val.setValue((char*)searchstring.c_str(),searchstring.size()); + packet[index++] = searchstring.size()%256;
+ packet[index++] = (int)searchstring.size()/256;
+ index += val.writeValue(packet,index); + + val.setName( "fname" ); + index += val.writeName( packet, index ); + + packet[index++] = 0x01; + packet[index++] = 0x00; + packet[index++] = 0x00; + + val.setName( "lname" ); + index += val.writeName( packet, index ); + + packet[index++] = 0x01; + packet[index++] = 0x00; + packet[index++] = 0x00; + + val.setName( "email" ); + index += val.writeName( packet, index ); + + packet[index++] = 0x01; + packet[index++] = 0x00; + packet[index++] = 0x00; + + length = index; + return index; + } + + int SearchBuddy::getPacketAttributeCount() { + return 4; + } + +} diff --git a/protocols/Xfire/src/searchbuddy.h b/protocols/Xfire/src/searchbuddy.h new file mode 100644 index 0000000000..79c474d06c --- /dev/null +++ b/protocols/Xfire/src/searchbuddy.h @@ -0,0 +1,55 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +//packet, welches bei der buddysuche versendet wird, um neue freund zu finden + +#ifndef __SEARCHBUDDY_H +#define __SEARCHBUDDY_H + +#include "xfiresendpacketcontent.h" +#include "variablevalue.h" + +#include <string> + +namespace xfirelib { + + class SearchBuddy : public XFireSendPacketContent { + public: + XFirePacketContent* newPacket() { return new SearchBuddy(); } + + int getPacketId() { return 0xC; } + int getPacketContent(char *buf); + int getPacketAttributeCount(); + int getPacketSize() { return 1000; }; + void parseContent(char *buf, int length, int numberOfAtts) { }; + void searchfor(std::string s) { searchstring=s; } + + private: + int length; + std::string searchstring; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/searching4games.cpp b/protocols/Xfire/src/searching4games.cpp new file mode 100644 index 0000000000..abdb9c7b8e --- /dev/null +++ b/protocols/Xfire/src/searching4games.cpp @@ -0,0 +1,741 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by
+ * dufte <dufte@justmail.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+#include "stdafx.h"
+#include "baseProtocol.h"
+#include "Xfire_gamelist.h"
+
+#include <string>
+using std::string;
+
+extern int foundgames;
+extern HANDLE XFireAvatarFolder;
+extern HANDLE XFireWorkingFolder;
+extern int StartGame(WPARAM wParam,LPARAM lParam,LPARAM fParam);
+extern Xfire_gamelist xgamelist;
+
+//versucht die * in den pfaden der ini mit dem korrekten eintrag zu ersetzen
+BOOL CheckPath(char*ppath,char*pathwildcard=NULL)
+{
+ char* pos=0;
+ char* pos2=0;
+
+ pos = strchr(ppath,'*');
+ if(pos)
+ {
+ HANDLE fHandle;
+ WIN32_FIND_DATA wfd;
+ BOOL weiter=TRUE;
+
+ if(pathwildcard)
+ {
+ strcpy_s(pathwildcard,XFIRE_MAX_STATIC_STRING_LEN,ppath);
+ }
+
+ pos++;
+ *pos=0;
+ pos++;
+
+ //versuch die exe zu finden
+ fHandle=FindFirstFile(ppath,&wfd); // . skippen
+ FindNextFile(fHandle,&wfd); // .. auch skippen
+
+ while ((FindNextFile(fHandle,&wfd)&&weiter==TRUE)) // erstes file
+ {
+ if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // nur verzeichnisse sind interessant
+ {
+ char temp[XFIRE_MAX_STATIC_STRING_LEN];
+
+ strcpy(temp,ppath);
+ *(temp+strlen(temp)-1)=0;
+ strcat(temp,wfd.cFileName);
+ strcat(temp,"\\");
+ strcat(temp,pos);
+
+ if(GetFileAttributes(temp)!=0xFFFFFFFF) { //exe vorhanden???? unt hint?
+ //gefundenes in path kopieren
+ FindClose(fHandle);
+ strcpy(ppath,temp);
+ return TRUE;
+ }
+ }
+ }
+ FindClose(fHandle);
+ }
+ else
+ {
+ if(GetFileAttributes(ppath)!=0xFFFFFFFF) { //exe vorhanden???? unt hint?
+ //gefundenes in path kopieren
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+BOOL CALLBACK DlgSearchDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void ShowSearchDialog(LPVOID lparam)
+{
+ HWND* hwnd=(HWND*)lparam;
+ HWND myhwnd=CreateDialog(hinstance,MAKEINTRESOURCE(IDD_SEARCHING),NULL,DlgSearchDialogProc);
+
+ if(myhwnd==NULL)
+ return;
+
+ *hwnd=myhwnd;
+
+ ShowWindow(myhwnd,SW_SHOW);
+
+ //nachrichten schleife
+ MSG msg;
+ while (GetMessage(&msg,myhwnd,0,0))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+}
+
+void Scan4Games( LPVOID lparam )
+{
+ int i=2;
+ unsigned int i2=1;
+ BOOL split=FALSE;
+ int notfound=0;
+ char* pos=0;
+ char* pos2=0;
+ char *cutforlaunch = 0;
+ char temp[10]="";
+ char inipath[XFIRE_MAX_STATIC_STRING_LEN]="";
+ char ret[XFIRE_MAX_STATIC_STRING_LEN]="";
+ char gamename[XFIRE_MAX_STATIC_STRING_LEN]="";
+ char ret2[XFIRE_MAX_STATIC_STRING_LEN]="";
+ char gamelist[XFIRE_MAX_STATIC_STRING_LEN]="";
+ BOOL multiexe=FALSE;
+ BOOL somethingfound=TRUE;
+ int i3=0;
+ CLISTMENUITEM mi = { 0 };
+ DWORD gpps=1;
+ DWORD last_gpps=0;
+ static BOOL searching=FALSE;
+
+ //ich suche schon,also raushier
+ if(searching)
+ {
+ MSGBOX("Game searching is already running!");
+ return;
+ }
+ if(xgamelist.Ingame())
+ {
+ MSGBOX("A game is currently running, please close the game.");
+ return;
+ }
+
+ //gamelist blocken, damit nur 1 thread es ausführt/nutzt
+ xgamelist.Block(TRUE);
+
+ searching=TRUE;
+
+ //säubert die gameliste für eine neuauslesung
+ xgamelist.clearGamelist();
+
+ //prüfe ob schon gescannt wurde, dann das aus der db nehmen, beschleunigt den start
+ foundgames=DBGetContactSettingWord(NULL, protocolname, "foundgames",-1);
+
+ //um bei einer neuen version einen rescan zuforcen, bei bestimmten wert found auf 0 resetten
+ if(DBGetContactSettingWord(NULL, protocolname, "scanver",0)!=XFIRE_SCAN_VAL)
+ foundgames=-1;
+
+ BOOL loadgamesfromdb=FALSE;
+ if(DBGetContactSettingByte(NULL,protocolname,"scanalways",0)==0)
+ loadgamesfromdb=TRUE;
+ else
+ {
+ if(DBGetContactSettingByte(NULL,protocolname,"scanalways",0)==2)
+ {
+ time_t zeit;
+ struct tm *t;
+ time(&zeit);
+ t = localtime(&zeit);
+
+ if(t!=NULL)
+ {
+ if(t->tm_yday!=DBGetContactSettingWord(NULL,protocolname,"scanalways_t",0))
+ {
+ DBWriteContactSettingWord(NULL,protocolname,"scanalways_t",t->tm_yday);
+ }
+ else
+ loadgamesfromdb=TRUE;
+ }
+ }
+ }
+
+ //spiele von db laden
+ if(loadgamesfromdb)
+ if(foundgames>0)
+ {
+ //spieliste einlesen
+ xgamelist.readGamelist(foundgames);
+ //menüpunkte anlegen
+ xgamelist.createStartmenu();
+
+ //gamelist unblocken
+ xgamelist.Block(FALSE);
+
+ searching=FALSE;
+ return;
+ }
+ else if(foundgames==0)
+ {
+ searching=FALSE;
+ //dummymenü punkt entfernen
+ //CallService( MS_CLIST_REMOVEMAINMENUITEM, ( WPARAM )dummymenu, 0 );
+
+ //gamelist unblocken
+ xgamelist.Block(FALSE);
+
+ return;
+ }
+ else
+ foundgames=0;
+ else
+ foundgames=0;
+
+ HWND hwnd=NULL;
+
+ //suche dialog anzeigen
+ if(!DBGetContactSettingByte(NULL,protocolname,"dontdissstatus",0))
+ {
+ mir_forkthread(ShowSearchDialog,&hwnd);
+ }
+
+ FoldersGetCustomPath( XFireWorkingFolder, inipath, 1024, "" );
+ strcat(inipath,"\\");
+ strcat(inipath,"xfire_games.ini");
+
+ //erstmal db säubern
+ xgamelist.clearDatabase();
+
+ //maximal 200 notfounds, um die nicht belegten id's zu überspringen
+ while(notfound<200)
+ {
+ //2 gameids?
+ if(split)
+ sprintf(temp,"%i_%i",i,i2);
+ else
+ sprintf(temp,"%i",i);
+
+ //MessageBoxA(0,temp,temp,0);
+
+ //letztes ergeniss sichern
+ last_gpps=gpps;
+
+ //las ma mal suchen ....
+ gpps=xfire_GetPrivateProfileString(temp, "LongName", "", gamename, 255, inipath);
+
+ char entrytype[100]="";
+ if(gpps!=NULL) xfire_GetPrivateProfileString(temp, "SoftwareType", "", entrytype, 100, inipath);
+
+ //kein eintrag? voicechat? musiapplicationen? schon in der gameliste?
+ if(gpps!=NULL && strcmp(entrytype,"Music")!=0 && strcmp(entrytype,"VoiceChat")!=0 && !xgamelist.Gameinlist(i)) //was gefunden und noch nicht eintragen?
+ {
+ BOOL MatchExe=FALSE;
+ //MatchExe Games in der automatischen Suche skippen
+ if(xfire_GetPrivateProfileString(temp, "MatchExe", "", ret, 255, inipath))
+ MatchExe=TRUE;
+
+ //Registryschlüssel auslesen und pfad auf exe prüfen
+ xfire_GetPrivateProfileString(temp, "LauncherDirKey", "", ret, 255, inipath);
+ strcpy(ret2,ret);
+
+ //ersten part des registry schlüssel raustrennen
+ pos=strchr(ret2,'\\');
+ if(!MatchExe && pos!=0)
+ {
+ HKEY hkey,hsubk;
+
+ *pos=0; //string trennen
+ pos++;
+
+ pos2=strrchr(pos,'\\'); //key trennen
+ if(pos!=0)
+ {
+ *pos2=0;
+ pos2++;
+
+ //HKEY festlegen
+ switch(*(ret2+6))
+ {
+ case 'L':
+ hkey = HKEY_CLASSES_ROOT;
+ break;
+ case 'U':
+ hkey = HKEY_CURRENT_USER;
+ break;
+ case 'O':
+ hkey = HKEY_LOCAL_MACHINE;
+ break;
+ default:
+ hkey = NULL;
+ }
+ }
+ else
+ hkey = NULL;
+
+ if(hkey) //nur wenn der key erkannt wurde
+ {
+ if(RegOpenKeyA(hkey,pos,&hsubk) == ERROR_SUCCESS) //key versuchen zu "öffnen"
+ {
+ char path[XFIRE_MAX_STATIC_STRING_LEN]="";
+ char path_r[XFIRE_MAX_STATIC_STRING_LEN]="";
+ DWORD size=sizeof(path);
+
+ //key lesen
+ if(RegQueryValueEx(hsubk,pos2,NULL,NULL,(LPBYTE)path,&size)== ERROR_SUCCESS)
+ {
+ //zusätzlichen pfad anhängen
+ if(xfire_GetPrivateProfileString(temp, "LauncherDirAppend", "", ret2, 255, inipath))
+ {
+ if(*(path+strlen(path)-1)=='\\'&&*(ret2)=='\\')
+ strcat(path,(ret2+1));
+ else
+ strcat(path,ret2);
+ }
+
+ if(xfire_GetPrivateProfileString(temp, "LauncherDirTruncAt", "", ret2, 255, inipath))
+ {
+ //mögliches erstes anführungszeichen entfernen
+ if(*(path)=='"')
+ {
+ pos2=path;
+ pos2++;
+
+ strcpy(path,pos2);
+ }
+
+ //mögliche weitere anführungszeichen entfernen
+ pos=strchr(path,'"');
+ if(pos!=0)
+ *pos=0;
+
+ if(*(path+strlen(path)-1)!='\\')
+ *(path+strlen(path)-strlen(ret2))=0;
+ }
+
+ if(*(path+strlen(path)-1)!='\\')
+ strcat(path,"\\");
+
+
+ //dateiname auslesen
+ if(xfire_GetPrivateProfileString(temp, "InstallHint", "", ret2, 255, inipath))
+ {
+ char pathtemp[XFIRE_MAX_STATIC_STRING_LEN];
+ strcpy(pathtemp,path);
+ strcat(pathtemp,ret2);
+
+ if(CheckPath(pathtemp))
+ {
+ if(xfire_GetPrivateProfileString(temp, "DetectExe", "", ret, 255, inipath))
+ {
+ cutforlaunch=path+strlen(path);
+ strcpy(pathtemp,path);
+
+ //wenn backslash bei detectexe, dann diesen skippen (eveonline bug)
+ if(ret[0]=='\\')
+ {
+ strcat(pathtemp,(char*)&ret[1]);
+ }
+ else
+ {
+ strcat(pathtemp,ret);
+ }
+
+ if(CheckPath(pathtemp))
+ {
+ strcpy(path, pathtemp);
+ }
+ else
+ {
+ *(path)=0;
+ }
+ }
+ else if(xfire_GetPrivateProfileString(temp, "LauncherExe", "", ret2, 255, inipath))
+ {
+ cutforlaunch=path+strlen(path);
+ strcat(path,ret2);
+ }
+ }
+ else
+ {
+ *(path)=0;
+ }
+ }
+ else if(xfire_GetPrivateProfileString(temp, "DetectExe[0]", "", ret2, 255, inipath))
+ {
+ cutforlaunch=path+strlen(path);
+ strcat(path,ret2);
+ multiexe=TRUE;
+ if(!CheckPath(path,path_r))
+ {
+ *(path)=0;
+ }
+ }
+ else if(xfire_GetPrivateProfileString(temp, "DetectExe", "", ret2, 255, inipath))
+ {
+ cutforlaunch=path+strlen(path);
+
+ //wenn backslash bei detectexe, dann diesen skippen (eveonline bug)
+ if(ret2[0]=='\\')
+ {
+ strcat(path,(char*)&ret2[1]);
+ }
+ else
+ {
+ strcat(path,ret2);
+ }
+
+ if(!CheckPath(path,path_r))
+ {
+ *(path)=0;
+ }
+ }
+ else if(xfire_GetPrivateProfileString(temp, "LauncherExe", "", ret2, 255, inipath))
+ {
+ cutforlaunch=path+strlen(path);
+ strcat(path,ret2);
+ }
+
+
+ //prüfe ob existent, dann ist das spiel installiert
+ if(path[0]!=0 && GetFileAttributes(path)!=0xFFFFFFFF)
+ {
+ Xfire_game* newgame=new Xfire_game();
+ newgame->id=i;
+
+ //8.3 pfade umwandeln
+ //GetLongPathNameA(path,path,sizeof(path));
+
+ //lowercase pfad
+ for(unsigned int ii=0;ii<strlen(path);ii++)
+ path[ii]=tolower(path[ii]);
+
+ if(path_r[0]==0)
+ newgame->setString(path,&newgame->path);
+ else
+ {
+ //lowercase wildcard pfad
+ for(unsigned int ii=0;ii<strlen(path_r);ii++)
+ path_r[ii]=tolower(path_r[ii]);
+ newgame->setString(path_r,&newgame->path);
+ }
+
+ //spiel mit mehreren exefiles
+ if(multiexe)
+ {
+ multiexe=FALSE;
+ for(int i=1;i<9;i++)
+ {
+ sprintf(ret,"DetectExe[%d]",i);
+ if(xfire_GetPrivateProfileString(temp, ret, "", ret2, 512, inipath))
+ {
+ char* pos=strrchr(path,'\\');
+ if(pos!=0)
+ {
+ pos++;
+ *pos=0;
+ }
+ strcat(path,ret2);
+ if(!CheckPath(path))
+ {
+ *(path)=0;
+ }
+ else
+ {
+ for(unsigned int i2=0;i2<strlen(path);i2++)
+ path[i2]=tolower(path[i2]);
+
+ char* mpathtemp=new char[strlen(path)+1];
+ strcpy(mpathtemp,path);
+ newgame->mpath.push_back(mpathtemp);
+ }
+ }
+ }
+ }
+
+ //für launcherstring anpassen
+ char* pos=strrchr(path,'\\');
+ if(pos!=0)
+ {
+ pos++;
+ *pos=0;
+ }
+ xfire_GetPrivateProfileString(temp, "LauncherExe", "", ret2, 255, inipath); // anfügen
+ if(cutforlaunch!=0) *cutforlaunch=0;
+
+ //pfad aufbereiten
+ char launchpath[XFIRE_MAX_STATIC_STRING_LEN]="";
+ strcpy(launchpath,path);
+ //letzten backslash entfernen
+ if(launchpath[strlen(launchpath)-1]=='\\') launchpath[strlen(launchpath)-1]=0;
+
+ strcat(path,ret2);
+
+ newgame->setString(path,&newgame->launchparams);
+ newgame->appendString(" ",&newgame->launchparams);
+
+ xfire_GetPrivateProfileString(temp, "Launch", "", ret2, 512, inipath);
+ str_replace(ret2,"%UA_LAUNCHER_EXE_DIR%",launchpath);
+ str_replace(ret2,"%UA_LAUNCHER_EXE_PATH%",""); //erstmal unwichtige sachen entfernen
+ //str_replace(ret2,"%UA_LAUNCHER_EXTRA_ARGS%",""); // - auch entfernen
+ str_replace(ret2,"%UA_LAUNCHER_LOGIN_ARGS%",""); // - auch entfernen
+
+ newgame->appendString(ret2,&newgame->launchparams);
+
+ /*if(xfire_GetPrivateProfileString(temp, "LauncherLoginArgs", "", ret2, 512, inipath))
+ {
+ str_replace(xf[foundgames].launchparams,"%UA_LAUNCHER_LOGIN_ARGS%",ret2); // - auch entfernen
+ }
+ else*/
+ // str_replace(xf[foundgames].launchparams,"%UA_LAUNCHER_LOGIN_ARGS%",""); // - auch entfernen
+
+ if(xfire_GetPrivateProfileString(temp, "LauncherPasswordArgs", "", ret2, 512, inipath))
+ newgame->setString(ret2,&newgame->pwparams);
+
+ if(xfire_GetPrivateProfileString(temp, "LauncherNetworkArgs", "", ret2, 512, inipath))
+ newgame->setString(ret2,&newgame->networkparams);
+
+ if(xfire_GetPrivateProfileString(temp, "CommandLineMustContain[0]", "", ret2, 512, inipath))
+ newgame->setString(ret2,&newgame->mustcontain);
+
+ if(xfire_GetPrivateProfileString(temp, "XUSERSendId", "", ret2, 512, inipath))
+ newgame->send_gameid=atoi(ret2);
+
+ if(xfire_GetPrivateProfileString(temp, "XUSERSetStatusMsg", "", ret2, 512, inipath))
+ newgame->setstatusmsg=atoi(ret2);
+
+ //launcherurl?
+ if(xfire_GetPrivateProfileString(temp, "LauncherUrl", "", ret2, 512, inipath))
+ newgame->setString(ret2,&newgame->launchparams);
+
+ //soll alle string, welche nicht in der commandline eines spiels sein soll in einen string pakcen semikolon getrennt
+ sprintf(ret,"CommandLineMustNotContain[0]");
+ int i=0;
+
+ while(xfire_GetPrivateProfileString(temp, ret, "", ret2, 512, inipath))
+ {
+ if(!newgame->notcontain) newgame->setString("",&newgame->notcontain);
+ if(i>0)
+ newgame->appendString(";",&newgame->notcontain);
+ newgame->appendString(ret2,&newgame->notcontain);
+
+ i++;
+ sprintf(ret,"CommandLineMustNotContain[%d]",i);
+ }
+
+ newgame->setNameandIcon();
+
+ strcat(gamelist,gamename);
+ strcat(gamelist,", ");
+ if(foundgames%2==1)
+ strcat(gamelist,"\r\n");
+
+ xgamelist.Addgame(newgame);
+
+ foundgames++;
+
+ split=FALSE;
+ }
+
+ }
+
+ RegCloseKey(hsubk);
+ }
+ }
+
+ }
+ else if(!MatchExe && xfire_GetPrivateProfileString(temp, "LauncherDirDefault", "", ret2, 255, inipath))
+ {
+ if(xfire_GetPrivateProfileString(temp, "LauncherExe", "", ret, 255, inipath))
+ {
+ strcat(ret2,"\\");
+ strcat(ret2,ret);
+ }
+
+ str_replace(ret2,"%WINDIR%",getenv("WINDIR"));
+ str_replace(ret2,"%ProgramFiles%",getenv("ProgramFiles"));
+
+ //prüfe ob existent, dann ist das spiel installiert
+ if(GetFileAttributes(ret2)!=0xFFFFFFFF)
+ {
+
+ Xfire_game* newgame=new Xfire_game();
+
+ newgame->id=i;
+
+ //8.3 pfade umwandeln
+ //GetLongPathNameA(ret2,ret2,sizeof(ret2));
+
+ //lowercase pfad
+ for(unsigned int i=0;i<strlen(ret2);i++)
+ ret2[i]=tolower(ret2[i]);
+
+ newgame->setString(ret2,&newgame->path);
+
+ //launch parameterstring
+
+ //pfad aufbereiten
+ char launchpath[XFIRE_MAX_STATIC_STRING_LEN]="";
+ strcpy(launchpath,ret2);
+ if(strrchr(launchpath,'\\')!=0)
+ {
+ *(strrchr(launchpath,'\\'))=0;
+ }
+
+ newgame->setString(ret2,&newgame->launchparams);
+ newgame->appendString(" ",&newgame->launchparams);
+
+ xfire_GetPrivateProfileString(temp, "Launch", "", ret2, 512, inipath);
+
+ str_replace(ret2,"%UA_LAUNCHER_EXE_DIR%",launchpath);
+
+ str_replace(ret2,"%UA_LAUNCHER_EXE_PATH%",""); //unwichtige sachen entfernen
+ //str_replace(ret2,"%UA_LAUNCHER_EXTRA_ARGS%",""); // - auch entfernen
+ str_replace(ret2,"%UA_LAUNCHER_LOGIN_ARGS%",""); // - auch entfernen
+
+ newgame->appendString(ret2,&newgame->launchparams);
+
+ if(xfire_GetPrivateProfileString(temp, "LauncherPasswordArgs", "", ret2, 512, inipath))
+ newgame->setString(ret2,&newgame->pwparams);
+
+ if(xfire_GetPrivateProfileString(temp, "LauncherNetworkArgs", "", ret2, 512, inipath))
+ newgame->setString(ret2,&newgame->networkparams);
+
+ if(xfire_GetPrivateProfileString(temp, "CommandLineMustContain[0]", "", ret2, 512, inipath))
+ newgame->setString(ret2,&newgame->mustcontain);
+
+ if(xfire_GetPrivateProfileString(temp, "XUSERSendId", "", ret2, 512, inipath))
+ newgame->send_gameid=atoi(ret2);
+
+ if(xfire_GetPrivateProfileString(temp, "XUSERSetStatusMsg", "", ret2, 512, inipath))
+ newgame->setstatusmsg=atoi(ret2);
+
+ //soll alle string, welche nicht in der commandline eines spiels sein soll in einen string pakcen semikolon getrennt
+ sprintf(ret,"CommandLineMustNotContain[0]");
+ int i=0;
+
+ while(xfire_GetPrivateProfileString(temp, ret, "", ret2, 512, inipath))
+ {
+ if(!newgame->notcontain) newgame->setString("",&newgame->notcontain);
+ if(i>0)
+ newgame->appendString(";",&newgame->notcontain);
+ newgame->appendString(ret2,&newgame->notcontain);
+
+ i++;
+ sprintf(ret,"CommandLineMustNotContain[%d]",i);
+ }
+
+ newgame->setNameandIcon();
+
+ strcat(gamelist,gamename);
+ strcat(gamelist,", ");
+ if(foundgames%2==1)
+ strcat(gamelist,"\r\n");
+
+ xgamelist.Addgame(newgame);
+
+ foundgames++;
+
+ split=FALSE;
+ }
+
+ }
+
+ if(split)
+ i2++;
+ else
+ i++;
+ notfound=0;
+ }
+ else if(split==FALSE) // nichts gefunden, dann die 2. gameid probieren (games die zb über steam und normal installiert werden können, haben eine 2. id)
+ {
+ i2=1;
+ split=TRUE;
+ }
+ else if(split==TRUE&&last_gpps!=NULL) // keine weiteren einträge mit der 2. id gefunden, also wieder mit der normalen weitersuchen
+ {
+ split=FALSE;
+ i++;
+ i2=0;
+ }
+ else if(split==TRUE&&last_gpps==NULL) // überhaupt nix gefunden, vllt nicht belegete id's, überspringen und "notfound" hochsetzen
+ {
+ split=FALSE;
+ i2=0;
+ if(i==35) //großer sprung unbenutzer id's
+ i+=4000;
+ i++;
+ notfound++;
+ }
+ }
+
+ if(hwnd)SetDlgItemText(hwnd,IDC_CURRENTGAME,Translate("Write to database ..."));
+
+ //gefundene games in db eintragen
+ xgamelist.writeDatabase();
+
+ //scanversion setzen, um ungewollten rescan zu vermeiden
+ DBWriteContactSettingWord(NULL, protocolname, "scanver", XFIRE_SCAN_VAL);
+
+ EndDialog(hwnd,0);
+
+ if(!DBGetContactSettingByte(NULL,protocolname,"dontdisresults",0))
+ {
+ int p=strlen(gamelist)-2;
+ if(p>-1)
+ gamelist[p]=0; //letztes koma killen
+ sprintf(ret,Translate("Games found:%s%s"),"\r\n\r\n",gamelist);
+ MSGBOX(ret);
+ }
+
+ searching=FALSE;
+
+ xgamelist.createStartmenu();
+
+ //gamelist unblocken
+ xgamelist.Block(FALSE);
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/sendacceptinvitationpacket.cpp b/protocols/Xfire/src/sendacceptinvitationpacket.cpp new file mode 100644 index 0000000000..ece6c0bc3a --- /dev/null +++ b/protocols/Xfire/src/sendacceptinvitationpacket.cpp @@ -0,0 +1,47 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "sendacceptinvitationpacket.h" + +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + + int SendAcceptInvitationPacket::getPacketContent(char *buf) { + VariableValue val; + val.setName( "name" ); + val.setValue( name.c_str() ); + int index = 0; + index += val.writeName(buf, index); + buf[index++] = 01; + buf[index++] = name.length(); + buf[index++] = 00; + index += val.writeValue(buf, index); + + return index; + } + + +}; diff --git a/protocols/Xfire/src/sendacceptinvitationpacket.h b/protocols/Xfire/src/sendacceptinvitationpacket.h new file mode 100644 index 0000000000..9bc2c4769b --- /dev/null +++ b/protocols/Xfire/src/sendacceptinvitationpacket.h @@ -0,0 +1,51 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SENDACCEPTINVITATION_H +#define __SENDACCEPTINVITATION_H + +#include "xfiresendpacketcontent.h" +#include <string> + + +#define XFIRE_ACCEPT_INVITATION_PACKET 07 + +namespace xfirelib { + class SendAcceptInvitationPacket : public XFireSendPacketContent { + public: + virtual ~SendAcceptInvitationPacket() { } + int getPacketId() { return XFIRE_ACCEPT_INVITATION_PACKET; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 3; } + int getPacketSize() { return 1024; } + + std::string name; + private: + + }; + +}; + + +#endif + diff --git a/protocols/Xfire/src/senddenyinvitationpacket.cpp b/protocols/Xfire/src/senddenyinvitationpacket.cpp new file mode 100644 index 0000000000..f122c91ce4 --- /dev/null +++ b/protocols/Xfire/src/senddenyinvitationpacket.cpp @@ -0,0 +1,27 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "senddenyinvitationpacket.h" + + diff --git a/protocols/Xfire/src/senddenyinvitationpacket.h b/protocols/Xfire/src/senddenyinvitationpacket.h new file mode 100644 index 0000000000..10cf6a3a80 --- /dev/null +++ b/protocols/Xfire/src/senddenyinvitationpacket.h @@ -0,0 +1,43 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SENDDENYINVITATIONPACKET_H +#define __SENDDENYINVITATIONPACKET_H + +#include "sendacceptinvitationpacket.h" + +#define XFIRE_DENY_INVITATION_PACKET 8 + +namespace xfirelib { + + class SendDenyInvitationPacket : public SendAcceptInvitationPacket { + public: + virtual ~SendDenyInvitationPacket() { } + int getPacketId() { return XFIRE_DENY_INVITATION_PACKET; } + + private: + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/sendgameserverpacket.cpp b/protocols/Xfire/src/sendgameserverpacket.cpp new file mode 100644 index 0000000000..2f65e1578b --- /dev/null +++ b/protocols/Xfire/src/sendgameserverpacket.cpp @@ -0,0 +1,50 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "sendgameserverpacket.h" +#include "variablevalue.h" +#include <iostream> + +namespace xfirelib { + + int SendGameServerPacket::getPacketContent(char *buf) { + VariableValue val; + val.setName( "gip" ); + val.setValue(ip); + val.setValueLength(4); + + int index = 0; + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + val.setName("gport"); + val.setValueFromLong(port,4); + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + return index; + } + + +}; diff --git a/protocols/Xfire/src/sendgameserverpacket.h b/protocols/Xfire/src/sendgameserverpacket.h new file mode 100644 index 0000000000..d9f8dfc8b4 --- /dev/null +++ b/protocols/Xfire/src/sendgameserverpacket.h @@ -0,0 +1,49 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef _SENDGAMESERVERPACKET_H_ +#define _SENDGAMESERVERPACKET_H_ + +#include "xfiresendpacketcontent.h" + +#define XFIRE_GAME_SERVER_PACKET 04 + +namespace xfirelib { + class SendGameServerPacket : public XFireSendPacketContent { + public: + virtual ~SendGameServerPacket() { } + int getPacketId() { return XFIRE_GAME_SERVER_PACKET; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 3; } + int getPacketSize() { return 1024; } + + long port; + char ip[4]; + private: + + }; + +}; + +#endif //_SENDGAMESERVERPACKET_H_ diff --git a/protocols/Xfire/src/sendgamestatus2packet.cpp b/protocols/Xfire/src/sendgamestatus2packet.cpp new file mode 100644 index 0000000000..8859e004cb --- /dev/null +++ b/protocols/Xfire/src/sendgamestatus2packet.cpp @@ -0,0 +1,74 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "stdafx.h" + +#include "sendgamestatus2packet.h" +#include "variablevalue.h" +#include "xdebug.h" + +#include <windows.h> + +//packet vervollständigt + +namespace xfirelib { + + SendGameStatus2Packet::SendGameStatus2Packet() { + ip[0] = ip[1] = ip[2] = ip[3] = 0; + port = 0; + } + + int SendGameStatus2Packet::getPacketContent(char *buf) { + + VariableValue val; + + val.setName( getGameAttributeName() ); + + val.setValueFromLong(gameid,4); + + int index = 0; + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + + val.setName( getIPAttributeName() ); + + //BUG: hab ,4 hinzugefügt, führte und vista zum crash - dufte + val.setValue(ip,4); + val.setValueLength(4); + + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + val.setName( getPortAttributeName() ); + val.setValueFromLong(port,4); + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + + return index; + } + + +}; + diff --git a/protocols/Xfire/src/sendgamestatus2packet.h b/protocols/Xfire/src/sendgamestatus2packet.h new file mode 100644 index 0000000000..cad9d0108b --- /dev/null +++ b/protocols/Xfire/src/sendgamestatus2packet.h @@ -0,0 +1,56 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef _SENDGAMESTATUS2PACKET_H_ +#define _SENDGAMESTATUS2PACKET_H_ + +#include "sendgamestatuspacket.h" + +#define XFIRE_GAME_STATUS2_PACKET 15 + +namespace xfirelib { + + class SendGameStatus2Packet : public SendGameStatusPacket { + public: + virtual ~SendGameStatus2Packet() { } + SendGameStatus2Packet(); + int getPacketId() { return XFIRE_GAME_STATUS2_PACKET; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 3; } + int getPacketSize() { return 1024; } + + //gamestatus2 packet ready gemacht + long gameid; + char ip[4]; + long port; + + protected: + virtual std::string getGameAttributeName() { return "vid"; } + virtual std::string getIPAttributeName() { return "vip"; } + virtual std::string getPortAttributeName() { return "vport"; } + }; + +}; + +#endif diff --git a/protocols/Xfire/src/sendgamestatuspacket.cpp b/protocols/Xfire/src/sendgamestatuspacket.cpp new file mode 100644 index 0000000000..fe3ae43e5a --- /dev/null +++ b/protocols/Xfire/src/sendgamestatuspacket.cpp @@ -0,0 +1,69 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "stdafx.h" + +#include "sendgamestatuspacket.h" +#include "variablevalue.h" +#include "xdebug.h" + +#include <windows.h> + +namespace xfirelib { + + SendGameStatusPacket::SendGameStatusPacket() { + ip[0] = ip[1] = ip[2] = ip[3] = 0; + port = 0; + } + + int SendGameStatusPacket::getPacketContent(char *buf) { + + VariableValue val; + + val.setName( getGameAttributeName() ); + + val.setValueFromLong(gameid,4); + + int index = 0; + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + + val.setName( getIPAttributeName() ); + + //BUG: hab ,4 hinzugefügt, führte und vista zum crash - dufte + val.setValue(ip,4); + val.setValueLength(4); + + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + val.setName( getPortAttributeName() ); + val.setValueFromLong(port,4); + index += val.writeName(buf, index); + buf[index++] = 02; + index += val.writeValue(buf, index); + + return index; + } + + +}; diff --git a/protocols/Xfire/src/sendgamestatuspacket.h b/protocols/Xfire/src/sendgamestatuspacket.h new file mode 100644 index 0000000000..57bec411ee --- /dev/null +++ b/protocols/Xfire/src/sendgamestatuspacket.h @@ -0,0 +1,56 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef _SENDGAMESTATUSPACKET_H_ +#define _SENDGAMESTATUSPACKET_H_ + +#include "xfiresendpacketcontent.h" +#include <string> + +#define XFIRE_GAME_STATUS_PACKET 04 + +namespace xfirelib { + class SendGameStatusPacket : public XFireSendPacketContent { + public: + SendGameStatusPacket(); + virtual ~SendGameStatusPacket() { } + int getPacketId() { return XFIRE_GAME_STATUS_PACKET; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 3; } + int getPacketSize() { return 1024; } + + long gameid; + char ip[4]; + long port; + + protected: + virtual std::string getGameAttributeName() { return "gameid"; } + virtual std::string getIPAttributeName() { return "gip"; } + virtual std::string getPortAttributeName() { return "gport"; } + private: + + }; + +}; +#endif //_SENDGAMESTATUSPACKET_H_ diff --git a/protocols/Xfire/src/sendkeepalivepacket.cpp b/protocols/Xfire/src/sendkeepalivepacket.cpp new file mode 100644 index 0000000000..242ba88214 --- /dev/null +++ b/protocols/Xfire/src/sendkeepalivepacket.cpp @@ -0,0 +1,56 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "sendkeepalivepacket.h" +#include "variablevalue.h" +#include <string.h> + +namespace xfirelib { + + int SendKeepAlivePacket::getPacketContent(char *buf) { + int index = 0; + + VariableValue val; + val.setName("value"); + + index += val.writeName(buf,index); + buf[index++] = 2; + buf[index++] = 0; + buf[index++] = 0; + buf[index++] = 0; + buf[index++] = 0; + + val.setName("stats"); + + index += val.writeName(buf,index); + buf[index++] = 4; + buf[index++] = 2; + buf[index++] = 0; + buf[index++] = 0; + + return index; + } + + +}; diff --git a/protocols/Xfire/src/sendkeepalivepacket.h b/protocols/Xfire/src/sendkeepalivepacket.h new file mode 100644 index 0000000000..5d81785998 --- /dev/null +++ b/protocols/Xfire/src/sendkeepalivepacket.h @@ -0,0 +1,48 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SENDKEEPALIVEPACKET_H +#define __SENDKEEPALIVEPACKET_H + +#include "xfiresendpacketcontent.h" +#include <string> + +#define XFIRE_SEND_KEEPALIVE_PACKET_ID 13; + +namespace xfirelib { + using namespace std; + + class SendKeepAlivePacket : public XFireSendPacketContent { + public: + virtual ~SendKeepAlivePacket() { } + int getPacketId() { return XFIRE_SEND_KEEPALIVE_PACKET_ID; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 2; } + int getPacketSize() { return 26; } + + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/sendmessagepacket.cpp b/protocols/Xfire/src/sendmessagepacket.cpp new file mode 100644 index 0000000000..a0f7e4e3d0 --- /dev/null +++ b/protocols/Xfire/src/sendmessagepacket.cpp @@ -0,0 +1,103 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "sendmessagepacket.h" +#include "xfireutils.h" +#include <string.h> +#include <iostream> +#include "xdebug.h" + +#include "sendmessagepacket.h"
+#include "xfireutils.h"
+#include <string.h>
+#include <iostream>
+#include "xdebug.h"
+
+namespace xfirelib {
+ using namespace std;
+
+ std::map<std::string,int> SendMessagePacket::imindexes;
+
+ void SendMessagePacket::init(Client *client, string username, string message) {
+ BuddyListEntry *entry = client->getBuddyList()->getBuddyByName(username);
+ if(entry) {
+ setSid(entry->sid);
+ }
+ this->message = message;
+ initIMIndex();
+ }
+
+ void SendMessagePacket::initIMIndex() {
+ string str_sid(sid);
+ if( imindexes.count( str_sid ) < 1 )
+ imindex = imindexes[str_sid] = 1;
+ else
+ imindex = ++imindexes[str_sid];
+ }
+
+ void SendMessagePacket::setSid(const char *sid) {
+ memcpy(this->sid,sid,16);
+ }
+
+ int SendMessagePacket::getPacketContent(char *buf) {
+ if( imindex == 0 ) initIMIndex();
+
+ int index = 0;
+ VariableValue val;
+ val.setName("sid");
+ val.setValue(sid,16);
+
+ index += val.writeName(buf,index);
+ buf[index++] = 3;
+ index += val.writeValue(buf,index);
+
+ val.setName("peermsg");
+ index += val.writeName(buf,index);
+ buf[index++] = 5;
+ //buf[index++] = 7;
+ buf[index++] = 3;
+
+ val.setName("msgtype");
+ val.setValueFromLong(0,4);
+ index += val.writeName(buf,index);
+ buf[index++] = 2;
+ index += val.writeValue(buf,index);
+
+ val.setName("imindex");
+ val.setValueFromLong(imindex,4);
+ index += val.writeName(buf,index);
+ buf[index++] = 02;
+ index += val.writeValue(buf,index);
+
+ val.setName("im");
+ val.setValue((char*)message.c_str(),message.size());
+ index += val.writeName(buf,index);
+ buf[index++] = 01;
+ buf[index++] = message.size()%256;
+ buf[index++] = (int)message.size()/256;
+ index += val.writeValue(buf,index);
+
+ return index;
+ }
+} diff --git a/protocols/Xfire/src/sendmessagepacket.h b/protocols/Xfire/src/sendmessagepacket.h new file mode 100644 index 0000000000..f54efd778c --- /dev/null +++ b/protocols/Xfire/src/sendmessagepacket.h @@ -0,0 +1,77 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#ifndef __SENDMESSAGEPACKET_H +#define __SENDMESSAGEPACKET_H + + + +#include "xfiresendpacketcontent.h" +#include "variablevalue.h" +#include <string.h> +#include "client.h" + +namespace xfirelib {
+
+ class SendMessagePacket : public XFireSendPacketContent {
+ public:
+ SendMessagePacket() {
+ imindex = 0;
+ }
+ virtual ~SendMessagePacket() { }
+
+ void init(Client *client, string username, string message);
+ void setSid(const char *sid);
+
+ XFirePacketContent* newPacket() { return new SendMessagePacket(); }
+
+ int getPacketId() { return 2; }
+ int getPacketContent(char *buf);
+ int getPacketAttributeCount() {return 2;};
+ int getPacketSize() { return 5024; };
+
+ /**
+ * SID of the user to who the message should be sent.
+ */
+ char sid[16];
+ /**
+ * A running counter for each buddy. (will be initialized to 0 by default.. and..
+ * shouldn't be a problem to leave it 0)
+ */
+ long imindex;
+ /**
+ * Message body to be sent.
+ */
+ std::string message;
+
+ protected:
+ void initIMIndex();
+
+ static std::map<std::string,int> imindexes;
+
+ };
+
+}; + +#endif diff --git a/protocols/Xfire/src/sendnickchangepacket.cpp b/protocols/Xfire/src/sendnickchangepacket.cpp new file mode 100644 index 0000000000..57d38ac50d --- /dev/null +++ b/protocols/Xfire/src/sendnickchangepacket.cpp @@ -0,0 +1,49 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "sendnickchangepacket.h" +#include "variablevalue.h" +#include <string.h> + +namespace xfirelib { +/*TODO: this packet is outdated, sniff with official client and change it to a correct implementation*/ + int SendNickChangePacket::getPacketContent(char *buf) { + int index = 0; + + VariableValue val; + val.setName("nick"); + val.setValue((char*)nick.c_str(),nick.size()); + + index += val.writeName(buf,index); + buf[index++] = 1; + buf[index++] = nick.size(); + buf[index++] = 0; + + index += val.writeValue(buf,index); + + return index; + } + + +}; diff --git a/protocols/Xfire/src/sendnickchangepacket.h b/protocols/Xfire/src/sendnickchangepacket.h new file mode 100644 index 0000000000..940bac032d --- /dev/null +++ b/protocols/Xfire/src/sendnickchangepacket.h @@ -0,0 +1,51 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SENDNICKCHANGEPACKET_H +#define __SENDNICKCHANGEPACKET_H + +#include "xfiresendpacketcontent.h" +#include <string> + +#define XFIRE_SEND_NICKCHANGE_PACKET_ID 14; + +namespace xfirelib { + using namespace std; + + class SendNickChangePacket : public XFireSendPacketContent { + public: + virtual ~SendNickChangePacket() { } + + XFirePacketContent *newPacket() { return new SendNickChangePacket; } + int getPacketId() { return XFIRE_SEND_NICKCHANGE_PACKET_ID; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 1; } + int getPacketSize() { return 1024; } + + string nick; + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/sendremovebuddypacket.cpp b/protocols/Xfire/src/sendremovebuddypacket.cpp new file mode 100644 index 0000000000..a49b3f38ed --- /dev/null +++ b/protocols/Xfire/src/sendremovebuddypacket.cpp @@ -0,0 +1,46 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "sendremovebuddypacket.h" + +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + + int SendRemoveBuddyPacket::getPacketContent(char *buf) { + int index = 0; + VariableValue val; + val.setName("userid"); + XDEBUG2( "Creating packet to remove userid %ld\n", userid ); + index += val.writeName(buf,index); + val.setValueFromLong(userid,4); + buf[index++] = 2; + index += val.writeValue(buf,index); + + return index; + } + +}; + diff --git a/protocols/Xfire/src/sendremovebuddypacket.h b/protocols/Xfire/src/sendremovebuddypacket.h new file mode 100644 index 0000000000..6a27728300 --- /dev/null +++ b/protocols/Xfire/src/sendremovebuddypacket.h @@ -0,0 +1,46 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SENDREMOVEBUDDYPACKET_H +#define __SENDREMOVEBUDDYPACKET_H + +#include "xfiresendpacketcontent.h" + +#define XFIRE_SENDREMOVEBUDDYPACKET 9 + +namespace xfirelib { + + class SendRemoveBuddyPacket : public XFireSendPacketContent { + public: + virtual ~SendRemoveBuddyPacket() { } + int getPacketId() { return XFIRE_SENDREMOVEBUDDYPACKET; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 1; } + int getPacketSize() { return 1024; } + + long userid; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/sendsidpacket.cpp b/protocols/Xfire/src/sendsidpacket.cpp new file mode 100644 index 0000000000..34c80a7ff3 --- /dev/null +++ b/protocols/Xfire/src/sendsidpacket.cpp @@ -0,0 +1,71 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "sendsidpacket.h" +#include <string.h> +#include <iostream> + +/* + whois packet von xfire, für z.b. friends of friends +*/ + +namespace xfirelib { + using namespace std; + + int SendSidPacket::getPacketContent(char *packet) { + int index = 0; + + XERROR("Send Sid Packet!\n"); + + packet[index++] = 0x03; + packet[index++] = 's'; + packet[index++] = 'i'; + packet[index++] = 'd'; + packet[index++] = 4; + packet[index++] = 3; + XDEBUG2("Sids: %d\n",sids->size()); + packet[index++] = sids->size(); + packet[index++] = 0; + + for(uint i = 0 ; i < sids->size() ; i++) { + XDEBUG2("Sid%d:",i); + char* sid=sids->at(i); + for(int u = 0; u <16 ; u++) + { + XDEBUG2("%x,",sid[u]); + packet[index++] = sid[u]; + } + XDEBUG("\n"); + } + + length = index; + return index; + } + + int SendSidPacket::getPacketAttributeCount() { + return 1; + } + +} diff --git a/protocols/Xfire/src/sendsidpacket.h b/protocols/Xfire/src/sendsidpacket.h new file mode 100644 index 0000000000..ffffad2071 --- /dev/null +++ b/protocols/Xfire/src/sendsidpacket.h @@ -0,0 +1,58 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +//mit diesem packet kann man sids welche man nicht zuordnen kann, erfragen wer sich dahinter verbirgt +//eine art whois, wahrscheinlich + +#ifndef __SENDSIDPACKET_H +#define __SENDSIDPACKET_H + +#include "xfiresendpacketcontent.h" +#include "variablevalue.h" + +#include <vector> +#include <string> + +namespace xfirelib { + using namespace std; + + class SendSidPacket : public XFireSendPacketContent { + public: + XFirePacketContent* newPacket() { return new SendSidPacket(); } + + int getPacketId() { return 0x5; } + int getPacketContent(char *buf); + int getPacketAttributeCount(); + int getPacketSize() { return 1000; }; + void parseContent(char *buf, int length, int numberOfAtts) { }; + + vector<char *> *sids; + + private: + int length; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/sendstatusmessagepacket.cpp b/protocols/Xfire/src/sendstatusmessagepacket.cpp new file mode 100644 index 0000000000..6495515119 --- /dev/null +++ b/protocols/Xfire/src/sendstatusmessagepacket.cpp @@ -0,0 +1,43 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "sendstatusmessagepacket.h" + +#include <string.h> + +namespace xfirelib { + + int SendStatusMessagePacket::getPacketContent(char *buf) { + int index = 0; + buf[index++] = 0x2e; + buf[index++] = 0x01; + buf[index++] = awaymsg.length(); + buf[index++] = 0x00; + memcpy(buf+index,awaymsg.c_str(),awaymsg.length()); + index+=awaymsg.length(); + return index; + } + + +}; diff --git a/protocols/Xfire/src/sendstatusmessagepacket.h b/protocols/Xfire/src/sendstatusmessagepacket.h new file mode 100644 index 0000000000..3c4106e260 --- /dev/null +++ b/protocols/Xfire/src/sendstatusmessagepacket.h @@ -0,0 +1,52 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __SENDSTATUSMESSAGEPACKET_H +#define __SENDSTATUSMESSAGEPACKET_H + +#include "xfiresendpacketcontent.h" +#include <string> + +#define XFIRE_SEND_STATUSMESSAGE_PACKET_ID 32 + +namespace xfirelib { + using namespace std; + + class SendStatusMessagePacket : public XFireSendPacketContent { + public: + ~SendStatusMessagePacket(){}; + XFirePacketContent *newPacket() { return new SendStatusMessagePacket; } + + int getPacketId() { return XFIRE_SEND_STATUSMESSAGE_PACKET_ID; } + + int getPacketContent(char *buf); + int getPacketAttributeCount() { return 1; } + int getPacketSize() { return 1024; } + + + string awaymsg; + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/sendtypingpacket.cpp b/protocols/Xfire/src/sendtypingpacket.cpp new file mode 100644 index 0000000000..3cc09d80e9 --- /dev/null +++ b/protocols/Xfire/src/sendtypingpacket.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h"
+
+/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+//sendtypingklasse hinzugefügt http://xfirelib.sphene.net/board2/showThread/367 - big thx to Fl0ri4n - dufte
+
+
+#include "sendtypingpacket.h"
+#include "xfireutils.h"
+#include <string.h>
+#include <iostream>
+#include "xdebug.h"
+
+namespace xfirelib {
+using namespace std;
+
+std::map<std::string,int> SendTypingPacket::imindexes;
+
+void SendTypingPacket::init(Client *client, string username) {
+BuddyListEntry *entry = client->getBuddyList()->getBuddyByName(username);
+if(entry) {
+setSid(entry->sid);
+}
+initIMIndex();
+}
+
+void SendTypingPacket::initIMIndex() {
+string str_sid(sid);
+if( imindexes.count( str_sid ) < 1 )
+imindex = imindexes[str_sid] = 1;
+else
+imindex = ++imindexes[str_sid];
+
+}
+void SendTypingPacket::setSid(const char *sid) {
+memcpy(this->sid,sid,16);
+}
+
+int SendTypingPacket::getPacketContent(char *buf) {
+if( imindex == 0 ) initIMIndex();
+
+int index = 0;
+VariableValue val;
+val.setName("sid");
+val.setValue(sid,16);
+
+index += val.writeName(buf,index);
+buf[index++] = 3;
+index += val.writeValue(buf,index);
+
+val.setName("peermsg");
+index += val.writeName(buf,index);
+buf[index++] = 5;
+//buf[index++] = 7;
+buf[index++] = 3;
+
+val.setName("msgtype");
+val.setValueFromLong(3,4);
+index += val.writeName(buf,index);
+buf[index++] = 2;
+index += val.writeValue(buf,index);
+
+val.setName("imindex");
+val.setValueFromLong(imindex,4);
+index += val.writeName(buf,index);
+buf[index++] = 02;
+index += val.writeValue(buf,index);
+
+val.setName("typing");
+val.setValueFromLong(1,4);
+index += val.writeName(buf,index);
+buf[index++] = 02;
+index += val.writeValue(buf,index);
+
+return index;
+}
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/sendtypingpacket.h b/protocols/Xfire/src/sendtypingpacket.h new file mode 100644 index 0000000000..d3226f3a0e --- /dev/null +++ b/protocols/Xfire/src/sendtypingpacket.h @@ -0,0 +1,79 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+//sendtypingklasse hinzugefügt http://xfirelib.sphene.net/board2/showThread/367 - big thx to Fl0ri4n - dufte
+
+#ifndef __SENDTYPINGPACKET_H
+#define __SENDTYPINGPACKET_H
+
+
+
+#include "xfiresendpacketcontent.h"
+#include "variablevalue.h"
+#include <string.h>
+#include "client.h"
+
+namespace xfirelib {
+
+class SendTypingPacket : public XFireSendPacketContent {
+public:
+SendTypingPacket() {
+imindex = 0;
+}
+virtual ~SendTypingPacket() { }
+
+void init(Client *client, string username);
+void setSid(const char *sid);
+
+XFirePacketContent* newPacket() { return new SendTypingPacket(); }
+
+int getPacketId() { return 2; }
+int getPacketContent(char *buf);
+int getPacketAttributeCount() {return 2;};
+int getPacketSize() { return 1024; };
+
+/**
+* SID of the user to who the message should be sent.
+*/
+char sid[16];
+/**
+* A running counter for each buddy. (will be initialized to 0 by default.. and..
+* shouldn't be a problem to leave it 0)
+*/
+long imindex;
+
+protected:
+void initIMIndex();
+
+static std::map<std::string,int> imindexes;
+
+};
+
+};
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/services.cpp b/protocols/Xfire/src/services.cpp new file mode 100644 index 0000000000..3f39200e59 --- /dev/null +++ b/protocols/Xfire/src/services.cpp @@ -0,0 +1,81 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by + * dufte <dufte@justmail.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+#include "stdafx.h"
+
+#include "baseProtocol.h"
+
+BOOL IsContactMySelf(std::string buddyusername) {
+ DBVARIANT dbv;
+
+ //nur wenn option aktiv, sonst immer FALSE
+ if(!DBGetContactSettingByte(NULL,protocolname,"skipmyself",0))
+ return FALSE;
+
+ if(!DBGetContactSetting(NULL,protocolname,"login",&dbv))
+ {
+ if(!lstrcmpiA( dbv.pszVal, buddyusername.c_str() ))
+ {
+ DBFreeVariant(&dbv);
+ return TRUE;
+ }
+ DBFreeVariant(&dbv);
+ }
+ else
+ return FALSE;
+
+ return FALSE;
+}
+
+//liefert vollendateipfad vom eigenen avatar zurück, wenn definiert
+int GetMyAvatar(WPARAM wparam,LPARAM lparam) {
+ DBVARIANT dbv;
+
+ if(!DBGetContactSetting(NULL,protocolname,"MyAvatarFile",&dbv))
+ {
+ strncpy((char*)wparam, dbv.pszVal, (int)lparam);
+ DBFreeVariant(&dbv);
+ return 0;
+ }
+
+ return -1;
+}
+
+//liefert vollendateipfad vom eigenen avatar zurück, wenn definiert
+int mBotNotify(WPARAM wparam,LPARAM lparam) {
+
+ if(wparam) {
+ CallService(MBOT_TRIGGER,(WPARAM)"xfireingame",1);
+ }
+ else
+ {
+ CallService(MBOT_TRIGGER,(WPARAM)"xfireingame",0);
+ }
+
+ return 0;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/services.h b/protocols/Xfire/src/services.h new file mode 100644 index 0000000000..af0477f1c7 --- /dev/null +++ b/protocols/Xfire/src/services.h @@ -0,0 +1,18 @@ +#ifndef _XFIRESERVICES_H
+#define _XFIRESERVICES_H
+
+#define XFIRE_URLCALL "XFire/UrlCall"
+
+#define XFIRE_SET_NICK "XFire/SetNickname"
+
+#define XFIRE_SEND_PREFS "XFire/SendXFirePrefs"
+
+#define XFIRE_INGAMESTATUSHOOK "XFire/Gamestatus"
+
+#define MBOT_TRIGGER "MBot/Trigger"
+
+//liefert den eigenen avatar zurück
+int GetMyAvatar(WPARAM wparam,LPARAM lparam);
+int mBotNotify(WPARAM wparam,LPARAM lparam);
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/setnickname.cpp b/protocols/Xfire/src/setnickname.cpp new file mode 100644 index 0000000000..2062c2f487 --- /dev/null +++ b/protocols/Xfire/src/setnickname.cpp @@ -0,0 +1,46 @@ +//fürs nick - dialog
+
+#include "stdafx.h"
+#include "setnickname.h"
+
+BOOL CALLBACK DlgNickProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+ SendMessage(hwndDlg,WM_SETICON, (WPARAM)false, (LPARAM)LoadIcon(hinstance, MAKEINTRESOURCE(IDI_TM)));
+
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(NULL,protocolname,"Nick",&dbv)) {
+ SetDlgItemText(hwndDlg,IDC_NICKNAME,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ return TRUE;
+ }
+ case WM_COMMAND:
+ {
+ if(LOWORD(wParam) == IDOK)
+ {
+ char nick[255];
+ GetDlgItemText(hwndDlg,IDC_NICKNAME,nick,sizeof(nick));
+
+ CallService(XFIRE_SET_NICK,0,(LPARAM)nick);
+
+ EndDialog(hwndDlg,TRUE);
+ return TRUE;
+ }
+ else if(LOWORD(wParam) == IDCANCEL)
+ {
+ EndDialog(hwndDlg,FALSE);
+ return FALSE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+BOOL ShowSetNick() {
+ return DialogBox(hinstance,MAKEINTRESOURCE(IDD_SETNICKNAME),NULL,DlgNickProc);
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/setnickname.h b/protocols/Xfire/src/setnickname.h new file mode 100644 index 0000000000..f3d9eb552e --- /dev/null +++ b/protocols/Xfire/src/setnickname.h @@ -0,0 +1,4 @@ +#include "baseProtocol.h"
+#include "resource.h"
+
+BOOL ShowSetNick();
\ No newline at end of file diff --git a/protocols/Xfire/src/socket.cpp b/protocols/Xfire/src/socket.cpp new file mode 100644 index 0000000000..f5f48e5588 --- /dev/null +++ b/protocols/Xfire/src/socket.cpp @@ -0,0 +1,272 @@ +// Copied from http://linuxgazette.net/issue74/tougher.html
+// (only slightly modified)
+// heavy modified (für windows umgeschrieben) - dufte
+
+// Implementation of the Socket class.
+
+
+#include "stdafx.h"
+
+#include "xdebug.h"
+#include "socket.h"
+#include "string.h"
+#include <string.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <iostream>
+
+/*NETLIB*****************/
+#include <newpluginapi.h>
+#include <m_netlib.h>
+extern HANDLE hNetlib;
+/*NETLIB*****************/
+
+
+using namespace std;
+
+Socket::Socket( std::string host, int port, int useproxy, std::string proxyhost , int proxyport ) :
+ m_sock ( -1 )
+{
+
+ memset ( &m_addr,
+ 0,
+ sizeof ( m_addr ) );
+
+ if(!create()) {
+ throw SocketException( "Could not create socket." );
+ }
+ if(!connect(host,port,useproxy,proxyhost,proxyport)) {
+ throw SocketException( "Could not bind port." );
+ }
+}
+
+Socket::~Socket()
+{
+ Netlib_CloseHandle(this->netlibcon);
+}
+
+bool Socket::create()
+{
+
+/*
+ m_sock = socket ( AF_INET, SOCK_STREAM, 0 );
+
+
+ if ( ! is_valid() )
+ return false;*/
+
+
+ // TIME_WAIT - argh
+// int on = 1;
+ //if ( setsockopt ( m_sock, SOL_SOCKET, SO_REUSEADDR, ( const char* ) &on, sizeof ( on ) ) == -1 )
+// return false;
+
+ return true;
+
+}
+
+
+
+bool Socket::bind ( const int port )
+{
+/* if ( ! is_valid() )
+ {
+ return false;
+ }
+
+
+
+ m_addr.sin_family = AF_INET;
+ m_addr.sin_addr.s_addr = INADDR_ANY;
+ m_addr.sin_port = htons ( port );
+
+ int bind_return = ::bind ( m_sock,
+ ( struct sockaddr * ) &m_addr,
+ sizeof ( m_addr ) );
+
+
+ if ( bind_return == -1 )
+ {
+ return false;
+ }
+*/
+ return true;
+}
+
+
+bool Socket::listen() const
+{
+ /*if ( ! is_valid() )
+ {
+ return false;
+ }
+
+ int listen_return = ::listen ( m_sock, MAXCONNECTIONS );
+
+
+ if ( listen_return == -1 )
+ {
+ return false;
+ }
+*/
+ return false;
+}
+
+
+bool Socket::accept ( Socket& new_socket ) const
+{
+ /*int addr_length = sizeof ( m_addr );
+ new_socket.m_sock = ::accept ( m_sock, ( sockaddr * ) &m_addr, ( socklen_t * ) &addr_length );
+
+ if ( new_socket.m_sock <= 0 )
+ return false;
+ else
+ return true;*/
+ return false;
+
+}
+
+bool Socket::send ( char *buf, int length ) const {
+ int status = Netlib_Send(this->netlibcon,buf, length,0); //::send ( m_sock, buf, length, 0);
+ if ( status == -1 )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+bool Socket::send ( const std::string s ) const
+{
+ int status = Netlib_Send(this->netlibcon,s.c_str(), s.size(),0); //::send ( m_sock, s.c_str(), s.size(), 0);
+ if ( status == -1 )
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+int Socket::recv ( char *buf, int maxlen ) const {
+ int status = Netlib_Recv(this->netlibcon,buf,maxlen,0); //::recv( m_sock, buf, maxlen, 0 );
+
+ if ( status == -1 )
+ {
+ //std::cout << "status == -1 errno == " << errno << " in Socket::recv WSA:::" << ::WSAGetLastError() << "\n";
+ return 0;
+ }
+ return status;
+}
+
+int Socket::recv ( std::string& s ) const
+{
+ char buf [ MAXRECV + 1 ];
+
+ s = "";
+
+ memset ( buf, 0, MAXRECV + 1 );
+
+ int status = Netlib_Recv(this->netlibcon,buf,MAXRECV,0);//::recv ( m_sock, buf, MAXRECV, 0 );
+
+ if ( status == -1 )
+ {
+ //std::cout << "status == -1 errno == " << errno << " in Socket::recv\n";
+ return 0;
+ }
+ else if ( status == 0 )
+ {
+ return 0;
+ }
+ else
+ {
+ s = buf;
+ return status;
+ }
+}
+
+
+
+bool Socket::connect ( const std::string host, const int port, int useproxy,std::string proxyhost,int proxyport)
+{
+ //if ( ! is_valid() ) return false;
+
+ /*m_addr.sin_family = AF_INET;
+ if(useproxy)
+ {
+ m_addr.sin_port = htons ( proxyport );
+ m_addr.sin_addr.s_addr=inet_addr(proxyhost.c_str());
+ }
+ else
+ {
+ m_addr.sin_port = htons ( port );
+ m_addr.sin_addr.s_addr=inet_addr(host.c_str());
+ }
+ */
+
+ int status = 0; //inet_pton ( AF_INET, host.c_str(), &m_addr.sin_addr );
+
+ /* XDEBUG(("Is valid .. %d\n",status));
+ if ( errno == EAFNOSUPPORT ) return false; */
+ //status = ::connect ( m_sock, ( sockaddr * ) &m_addr, sizeof ( m_addr ) );
+
+ /*if(useproxy&&status==0) {
+ char temp[1024];
+ this->send("CONNECT cs.xfire.com:25999 HTTP/1.1\nHost: cs.xfire.com:25999\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)\n\n");
+ this->recv((char*)temp,1024);
+ }*/
+
+ NETLIBOPENCONNECTION ncon = { 0 };
+ ncon.cbSize = sizeof(ncon);
+ ncon.szHost = "cs.xfire.com";
+ ncon.wPort = (WORD)atol("25999");
+ ncon.timeout=5;
+ netlibcon = (HANDLE) CallService(MS_NETLIB_OPENCONNECTION, (WPARAM) hNetlib, (LPARAM) & ncon);
+
+
+ //std::cout << "status: " << status << std::endl;
+ if ( netlibcon != NULL )
+ {
+ //CallService(MS_NETLIB_OPENCONNECTION, (WPARAM) hNetlib, (LPARAM) & ncon);
+ m_sock=CallService(MS_NETLIB_GETSOCKET,(WPARAM) netlibcon,0);
+ return true;
+ }
+ else {
+ int errsv = errno;
+ if(errsv == SOCKET_ERROR) {
+ // std::cout << "Connection refused to " << host << ":" << port << std::endl;
+ throw SocketException( "Connection refused." );
+ }
+ //std::cout << "errno: " << errsv << std::endl;
+ return false;
+ }
+}
+
+void Socket::set_non_blocking ( const bool b )
+{
+/* u_long arg=0;
+
+ if(b) arg=1;*/
+
+ //ioctlsocket(m_sock, 0x8004667e,&arg);
+// int opts;
+
+ /* opts = fcntl ( m_sock,
+ F_GETFL );
+
+ if ( opts < 0 )
+ {
+ return;
+ }
+*/
+ //if ( b )
+ // opts = ( opts | O_NONBLOCK );
+ /*else
+ opts = ( opts & ~O_NONBLOCK );*/
+
+ /*fcntl ( m_sock,
+ F_SETFL,opts );*/
+
+}
diff --git a/protocols/Xfire/src/socket.h b/protocols/Xfire/src/socket.h new file mode 100644 index 0000000000..370aeb74f7 --- /dev/null +++ b/protocols/Xfire/src/socket.h @@ -0,0 +1,67 @@ +// Copied from http://linuxgazette.net/issue74/tougher.html +// (only slightly modified) + + +// Definition of the Socket class + + +#ifndef Socket_class +#define Socket_class + +#include "stdafx.h" + +#include <sys/types.h> +//#include <netinet/in.h> +//#include <netdb.h> +//#include <unistd.h> +#include <string> +//#include <arpa/inet.h> +#include <winsock2.h> + +#include "socketexception.h" + + +const int MAXHOSTNAME = 200; +const int MAXCONNECTIONS = 5; +const int MAXRECV = 500; + +class Socket +{ + public: + //proxy hinzugefügt dufte + Socket( std::string host, int port,int useproxy = 0,std::string proxyhost = " ", int proxyport = 0 ); + virtual ~Socket(); + + // Server initialization + bool create(); + bool bind ( const int port ); + bool listen() const; + bool accept ( Socket& ) const; + + // Client initialization + bool connect ( const std::string host, const int port, int useproxy,std::string proxyhost,int proxyport); + + // Data Transimission + bool send ( char *buf, int length ) const; + bool send ( const std::string ) const; + int recv ( std::string& ) const; + int recv ( char *buf, int maxlen ) const; + + + void set_non_blocking ( const bool ); + + bool is_valid() const { return true; } + + int m_sock; + + private: + + + sockaddr_in m_addr; + HANDLE netlibcon; + + +}; + + +#endif diff --git a/protocols/Xfire/src/socketexception.h b/protocols/Xfire/src/socketexception.h new file mode 100644 index 0000000000..dc506aeaf7 --- /dev/null +++ b/protocols/Xfire/src/socketexception.h @@ -0,0 +1,45 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +// SocketException class + + +#ifndef SocketException_class +#define SocketException_class + +#include <string> + +class SocketException +{ + public: + SocketException ( std::string s ) : m_s ( s ) {}; + ~SocketException (){}; + + std::string description() { return m_s; } + + private: + + std::string m_s; + +}; + +#endif diff --git a/protocols/Xfire/src/stdafx.cpp b/protocols/Xfire/src/stdafx.cpp new file mode 100644 index 0000000000..f16632cd31 --- /dev/null +++ b/protocols/Xfire/src/stdafx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : Quelldatei, die nur die Standard-Includes einbindet.
+// xfiretest.pch ist der vorkompilierte Header.
+// stdafx.obj enthält die vorkompilierten Typinformationen.
+
+#include "stdafx.h"
+
+// TODO: Auf zusätzliche Header verweisen, die in STDAFX.H
+// und nicht in dieser Datei erforderlich sind.
diff --git a/protocols/Xfire/src/stdafx.h b/protocols/Xfire/src/stdafx.h new file mode 100644 index 0000000000..3b6a0d7bd2 --- /dev/null +++ b/protocols/Xfire/src/stdafx.h @@ -0,0 +1,36 @@ +// stdafx.h : Includedatei für Standardsystem-Includedateien
+// oder häufig verwendete projektspezifische Includedateien,
+// die nur in unregelmäßigen Abständen geändert werden.
+//
+
+#pragma once
+
+#ifndef _WIN32_WINNT // Lassen Sie die Verwendung spezifischer Features von Windows XP oder später zu.
+#define _WIN32_WINNT 0x0501 // Ändern Sie dies in den geeigneten Wert für andere Versionen von Windows.
+#endif
+
+#include <stdio.h>
+#include <cstdlib>
+#include <tchar.h>
+#include <iostream>
+
+#define uint unsigned int
+#define socklen_t int
+
+#define NO_PTHREAD
+
+#pragma warning(disable:4267)
+#pragma warning(disable:4244)
+#pragma warning(disable:4312)
+#pragma warning(disable:4099)
+#pragma warning(disable:4311)
+#pragma comment(lib,"ws2_32.lib")
+
+#ifndef NO_PTHREAD
+#pragma comment(lib,"pthreads.lib")
+#endif
+
+#pragma comment(lib,"user32.lib")
+#pragma comment(lib,"gdi32.lib")
+
+// TODO: Hier auf zusätzliche Header, die das Programm erfordert, verweisen.
diff --git a/protocols/Xfire/src/testclient/Jamfile b/protocols/Xfire/src/testclient/Jamfile new file mode 100644 index 0000000000..29b07b1a20 --- /dev/null +++ b/protocols/Xfire/src/testclient/Jamfile @@ -0,0 +1,5 @@ +SubDir TOP src testclient ; + +LOCATE_TARGET = bin/testclient ; +Main xfirelibtest : test.cpp ; +LinkLibraries xfirelibtest : libxfirelib ; diff --git a/protocols/Xfire/src/testclient/test.cpp b/protocols/Xfire/src/testclient/test.cpp new file mode 100644 index 0000000000..0d4f2070ab --- /dev/null +++ b/protocols/Xfire/src/testclient/test.cpp @@ -0,0 +1,310 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "../xdebug.h" + + +#include <iostream> +#include <string> +#include <stdexcept> + +#include "test.h" +#include "../client.h" +#include "../xfirepacket.h" +#include "../loginfailedpacket.h" +#include "../otherloginpacket.h" +#include "../messagepacket.h" +#include "../sendstatusmessagepacket.h" +#include "../sendmessagepacket.h" +#include "../invitebuddypacket.h" +#include "../sendacceptinvitationpacket.h" +#include "../senddenyinvitationpacket.h" +#include "../sendremovebuddypacket.h" +#include "../sendnickchangepacket.h" +#include "../sendgamestatuspacket.h" +#include "../sendgamestatus2packet.h" +#include "../dummyxfiregameresolver.h" +#include "../sendgameserverpacket.h" +#include "../recvoldversionpacket.h" + +namespace xfirelibtest { + using namespace std; + using namespace xfirelib; + + XFireTestClient::XFireTestClient(string username_,string password_) + : username(username_), password(password_) { + client = new Client(); + client->setGameResolver( new DummyXFireGameResolver() ); + lastInviteRequest = NULL; + } + XFireTestClient::~XFireTestClient() { + delete client; + delete lastInviteRequest; + } + + void XFireTestClient::run() { + client->connect(username,password); + client->addPacketListener(this); + // Starting input loop ... + string input; + bool done = false; + while(!done) { + cout << "Give me Your Commands:\n>>> "; + getline(cin,input); + //string words[10]; + //split(input, words, 10, " "); + vector<string> cmds = explodeString(input," "); + //cout << "Command: " << cmds[0]; + //XDEBUG(( "Input: %s %d Command: %s\n", input.c_str(), cmds.size(), cmds[0].c_str() )); + if(cmds.size() > 0) { + if(cmds[0] == "help") { + cout << "No help available right now :(" << endl; + cout << "But a short list of available commands: " << endl; + cout << " quit" << endl; + cout << " buddylist" << endl; + cout << " away" << endl; + cout << " back" << endl; + cout << " game <gameid>" << endl; + cout << " game2 <game2id>" << endl; + cout << " nick" << endl; + cout << " invite <username>" << endl; + cout << " accept [<username>]" << endl; + cout << " deny [<username>]" << endl; + cout << " remove <username>" << endl; + cout << " send <username> <message .....>" << endl; + } else if(cmds[0] == "quit") { + cout << "Quitting" << endl; + done = true; + } else if(cmds[0] == "buddylist") { + printBuddyList(); + } else if(cmds[0] == "away" || cmds[0] == "back") { + SendStatusMessagePacket *packet = new SendStatusMessagePacket(); + packet->awaymsg = joinString(cmds,1);//input.substr(5); + client->send( packet ); + delete packet; + } else if(cmds[0] == "game" || cmds[0] == "game2") { + int gameid = 0; + if(cmds.size() > 1) { + gameid = atoi(cmds[1].c_str()); + } + SendGameStatusPacket *packet = + (cmds[0] == "game" ? new SendGameStatusPacket() : + new SendGameStatus2Packet()); + packet->gameid = 2; + packet->gameid = gameid; + char ip[] = {0,0,0,0}; + memcpy(packet->ip,ip,4); + packet->port = 0; + client->send( packet ); + delete packet; + } else if(cmds[0] == "nick"){ + if(cmds.size() < 2) { + cout << "Usage: nick <nickname>" << endl; + continue; + } + SendNickChangePacket nick; + nick.nick = joinString(cmds,1); + client->send( &nick ); + cout << "Sent nick change." << endl; + }else if(cmds[0] == "send"){ + if(cmds.size() < 3) { + cout << "Usage: send <username> <message>" << endl; + continue; + } + SendMessagePacket msg; + msg.init(client, cmds[1], joinString(cmds,2)); + client->send( &msg ); + cout << "Sent message." << endl; + } else if(cmds[0] == "invite") { + if(cmds.size() < 3) { + cout << "Usage: invite <username> <message>" << endl; + } else { + InviteBuddyPacket invite; + invite.addInviteName( cmds[1], joinString(cmds,2) ); + client->send( &invite ); + cout << "Sent Invitation." << endl; + } + } else if(cmds[0] == "accept" || cmds[0] == "deny") { + string name; + if(cmds.size() < 2) { + if(lastInviteRequest == 0) { + cout << "No Invitation Request pending (try " << cmds[0] << " <username>)" << endl; + continue; + } + name = string(*lastInviteRequest); + delete lastInviteRequest; + lastInviteRequest = 0; + } else { + name = cmds[1]; + } + if(cmds[0] == "accept") { + SendAcceptInvitationPacket accept; + accept.name = name; + client->send( &accept ); + cout << "Sent Accept Invitation." << endl; + } else { + SendDenyInvitationPacket deny; + deny.name = name; + client->send( &deny ); + cout << "Sent Deny Invitation." << endl; + } + } else if(cmds[0] == "remove") { + if(cmds.size() < 2) { + cout << "Usage: remove <user name>" << endl; + continue; + } + string name = cmds[1]; + BuddyListEntry *entry = client->getBuddyList()->getBuddyByName( name ); + if(entry == NULL) { + cout << "Noone with this name is in your buddy list ?" << endl; + continue; + } + SendRemoveBuddyPacket removeBuddy; + removeBuddy.userid = entry->userid; + client->send( &removeBuddy ); + cout << "Sent Remove Buddy." << endl; + } + + else { + cout << "Unknown Command." << endl; + } + } + } + client->disconnect(); + delete client; + client = 0; + } + string XFireTestClient::joinString(vector<string> s, int startindex, int endindex, string delimiter) { + string ret; + int max = (unsigned)endindex > s.size() || endindex < 0 ? s.size() : endindex; + for(int i = startindex ; i < max ; i++) { + if(i != startindex) + ret += delimiter; + ret += s[i]; + } + return ret; + } + vector<string> XFireTestClient::explodeString(string s, string e) { + vector<string> ret; + int iPos = s.find(e, 0); + int iPit = e.length(); + while(iPos > -1) { + if(iPos != 0) + ret.push_back(s.substr(0,iPos)); + s.erase(0,iPos+iPit); + iPos = s.find(e,0); + } + if(s!="") + ret.push_back(s); + return ret; + } + + void XFireTestClient::receivedPacket(XFirePacket *packet) { + XFirePacketContent *content = packet->getContent(); + cout << "TestClient : Received Packet: " << content->getPacketId() << endl; + switch(content->getPacketId()) { + case XFIRE_LOGIN_FAILED_ID: { + client->disconnect(); + delete client; + client = 0; + cout << "TestClient : Login failed." << endl; + break; + } + case XFIRE_MESSAGE_ID: { + cout << "TestClient : Got Message." << endl; + if( (( MessagePacket*)content)->getMessageType() == 0){ + cout << "TestClient : Message is " << ((MessagePacket*)content)->getMessage() <<endl; + BuddyListEntry *entry = client->getBuddyList()->getBuddyBySid( ((MessagePacket*)content)->getSid() ); + cout << "TestClient : from user " << entry->nick << "(" << entry->username << ")" <<endl; + } + break; + } + case XFIRE_RECV_OLDVERSION_PACKET_ID: { + cout << "Testclient: Our protocol version is too old" << endl; + break; + } + case XFIRE_PACKET_INVITE_REQUEST_PACKET: { + cout << "Invitation Request: " << endl; + InviteRequestPacket *invite = (InviteRequestPacket*)content; + cout << " Name : " << invite->name << endl; + cout << " Nick : " << invite->nick << endl; + cout << " Message: " << invite->msg << endl; + cout << " -- type 'accept' for accepting this request. (or 'accept " + << invite->name << "' if you receive another invitation in the meantime." << endl; + lastInviteRequest = new string(invite->name); + break; + } + case XFIRE_OTHER_LOGIN:{ + client->disconnect(); + delete client; + client = 0; + cout << "TestClient : Someone loged in with our account.disconnect" << endl; + break; + } + case XFIRE_BUDDYS_NAMES_ID: { + printBuddyList(); + } +default: +cout << "nothing--------" << endl; +break; + } +} + + void XFireTestClient::printBuddyList() { + printf("Buddy List: (* marks online users)\n"); + printf("----------------- Buddy List --------------------------------------------------------\n"); + printf(" %20s | %20s | %10s | %20s | %7s | %7s\n","User Name", "Nick", "UserId", "Status Msg" ,"Gameid" ,"Gameid2" ); + vector<BuddyListEntry*> *entries = client->getBuddyList()->getEntries(); + for(uint i = 0 ; i < entries->size() ; i ++) { + BuddyListEntry *entry = entries->at(i); + printf("%1s %20s | %20s | %10ld | %20s | %7ld | %ld\n", + (entry->isOnline() ? "*" : ""), + entry->username.c_str(), + entry->nick.c_str(), + entry->userid, + entry->statusmsg.c_str(), + entry->game, + entry->game2); + } + printf("-------------------------------------------------------------------------------------\n\n"); + } +}; + +using namespace std; +using namespace xfirelib; +using namespace xfirelibtest; + +int main(int argc, char **params) { + if(argc < 3) { + cout << "Usage: " << params[0] << " <username> <password>" << endl; + return 0; + } + XFireTestClient *testClient = new + XFireTestClient(string(params[1]),string(params[2])); + try { + testClient->run(); + } catch( exception e ) { + cout << "Exception: " << e.what() << endl; + } + delete testClient; + return 0; +} diff --git a/protocols/Xfire/src/testclient/test.h b/protocols/Xfire/src/testclient/test.h new file mode 100644 index 0000000000..55af5d6f4a --- /dev/null +++ b/protocols/Xfire/src/testclient/test.h @@ -0,0 +1,60 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __TEST_H +#define __TEST_H + +#include <string> +#include <vector> +#include "../packetlistener.h" +#include "../xfirepacket.h" +#include "../client.h" +#include "../inviterequestpacket.h" + +namespace xfirelibtest { + using namespace std; + using namespace xfirelib; + + class XFireTestClient : public PacketListener { + + public: + XFireTestClient(string username, string password); + ~XFireTestClient(); + void run(); + + void receivedPacket(XFirePacket *packet); + + private: + vector<string> explodeString(string s, string e); + string joinString(vector<string> s, int startindex, int endindex=-1, string delimiter=" "); + void printBuddyList(); + + Client *client; + string *lastInviteRequest; + + string username; + string password; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/tools.cpp b/protocols/Xfire/src/tools.cpp new file mode 100644 index 0000000000..44e755cd28 --- /dev/null +++ b/protocols/Xfire/src/tools.cpp @@ -0,0 +1,1077 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by
+ * dufte <dufte@justmail.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+#include "stdafx.h"
+
+#include <winsock2.h>
+#include "tools.h"
+#include "xdebug.h"
+
+extern HANDLE hNetlib;
+
+//convert buf to hexstring
+/*char* tohex(unsigned char*buf,int size) {
+ static char buffer[1024*10]="";
+
+ strcpy(buffer,"");
+
+ for(int i=0;i<size;i++)
+ {
+ if(i%16==0&&i!=0)
+ sprintf(buffer,"%s\n%02x ",buffer,buf[i]);
+ else
+ sprintf(buffer,"%s%02x ",buffer,buf[i]);
+ }
+
+ return buffer;
+}*/
+
+//von icqproto kopiert
+void EnableDlgItem(HWND hwndDlg, UINT control, int state)
+{
+ EnableWindow(GetDlgItem(hwndDlg, control), state);
+}
+
+
+//eigene string replace funktion, da die von der std:string klasse immer abstürzt
+BOOL str_replace(char*src,char*find,char*rep)
+{
+ string strpath = src;
+ int pos = strpath.find(find);
+
+ if(pos>-1)
+ {
+ char *temp=new char[strlen(src)+strlen(rep)+1];
+
+ strcpy(temp,src);
+ *(temp+pos)=0;
+
+ strcat(temp,rep);
+ strcat(temp,(src+pos+strlen(find)));
+ strcpy(src,temp);
+
+ delete temp;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* popup darstellen */
+int displayPopup(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType,HICON hicon)
+{
+ static signed char bUsePopups = -1;
+ static BOOL bIconsNotLoaded = TRUE;
+
+ static HICON hicNotify = NULL, hicWarning = NULL, hicError = NULL;
+
+ if ((uType&MB_TYPEMASK) == MB_OK)
+ {
+ POPUPDATAEX ppd = {0};
+
+ if (bIconsNotLoaded)
+ {
+ hicNotify = Skin_GetIcon("popup_notify");
+ hicWarning = Skin_GetIcon("popup_warning");
+ hicError = Skin_GetIcon("popup_error");
+ bIconsNotLoaded = FALSE;
+ }
+
+ lstrcpynA(ppd.lpzContactName, lpCaption, sizeof(ppd.lpzContactName));
+ lstrcpynA(ppd.lpzText, lpText, sizeof(ppd.lpzText));
+
+ if ((uType&MB_ICONMASK) == MB_ICONSTOP)
+ {
+ ppd.lchIcon = hicError;
+ ppd.colorBack = RGB(191,0,0);
+ ppd.colorText = RGB(255,245,225);
+ } else
+ if ((uType&MB_ICONMASK) == MB_ICONWARNING)
+ {
+ ppd.lchIcon = hicWarning;
+ ppd.colorBack = RGB(210,210,150);
+ ppd.colorText = RGB(0,0,0);
+ } else
+ /* if ((uType&MB_ICONMASK) == MB_ICONINFORMATION) */
+ {
+ ppd.lchIcon = hicNotify;
+ ppd.colorBack = RGB(230,230,230);
+ ppd.colorText = RGB(0,0,0);
+ }
+
+ if(hicon!=NULL)
+ ppd.lchIcon=hicon;
+
+ PUAddPopUpEx(&ppd);
+ }
+
+ return IDOK;
+}
+
+char*menuitemtext(char*mtext)
+{
+ static char temp[256]="";
+ int anz=0;
+ int j=0;
+
+ if(!mtext)
+ return NULL;
+
+ int size=strlen(mtext);
+
+ if(!size || size>255)
+ return mtext;
+
+ //alle & zeichen zählen
+ for(int i=0;i<size;i++,j++)
+ {
+ temp[j]=mtext[i];
+ if(mtext[i]=='&')
+ {
+ j++;
+ temp[j]='&';
+ }
+ }
+ //terminieren
+ temp[j]=0;
+
+ return temp;
+}
+
+void Message(LPVOID msg)
+{
+ switch(DBGetContactSettingByte(NULL,protocolname,"nomsgbox",0))
+ {
+ case 1:
+ return;
+ case 2:
+ displayPopup(NULL,(LPCSTR)msg,"Miranda XFire Protocol Plugin",MB_OK);
+ return;
+ }
+
+ MSGBOXPARAMS mbp;
+ mbp.cbSize=sizeof(mbp);
+ mbp.hwndOwner=NULL;
+ mbp.hInstance=hinstance;
+ mbp.lpszText=(char*)msg;
+ mbp.lpszCaption="Miranda XFire Protocol Plugin";
+ mbp.dwStyle=MB_USERICON;
+ mbp.lpszIcon=MAKEINTRESOURCE(IDI_TM);
+ mbp.dwContextHelpId=NULL;
+ mbp.lpfnMsgBoxCallback=NULL;
+ mbp.dwLanguageId=LANG_ENGLISH;
+ MessageBoxIndirect(&mbp);
+ //MessageBoxA(0,(char*)msg,"Miranda XFire Protocol Plugin",MB_OK|MB_ICONINFORMATION);
+}
+
+void MessageE(LPVOID msg)
+{
+ static BOOL already=FALSE;
+ switch(DBGetContactSettingByte(NULL,protocolname,"nomsgbox",0))
+ {
+ case 0:
+ if(!already)
+ {
+ already=TRUE; //keine doppelte fehlernachrichten
+ Message(msg);
+ already=FALSE;
+ }
+ break;
+ case 2:
+ displayPopup(NULL,(LPCSTR)msg,"Miranda XFire Protocol Plugin",MB_OK|MB_ICONSTOP);
+ break;
+ }
+}
+
+//funktion soll pfad erkennen und zurückgeben
+char* GetLaunchPath(char*launch)
+{
+ static char temp[XFIRE_MAX_STATIC_STRING_LEN]="";
+ char find[]=".exe "; //gesucht wird
+ char * p = temp;
+ char * f = find;
+
+ if(launch==NULL)
+ return temp;
+
+ strcpy(temp,launch);
+
+ while(*p!=0&&*f!=0)
+ {
+ if(tolower(*p)==*f)
+ {
+ f++;
+ }
+ else
+ f=find;
+
+ p++;
+ }
+
+ if(*f==0)
+ {
+ *p=0;
+ }
+ else
+ return temp;
+
+ if(strrchr(temp,'\\'))
+ {
+ *(strrchr(temp,'\\'))=0;
+ }
+
+ return temp;
+}
+//roll bits, vllt ein tickschneller als die funktionen von winsock
+unsigned short r(unsigned short data)
+{
+ _asm {
+ mov ax,data
+ rol ax,8
+ mov data,ax
+ }
+ return data;
+}
+
+//simple und hoffetnlich schnelle teamspeakdetection
+BOOL FindTeamSpeak(DWORD*pid,int*vid) {
+ BOOL found=FALSE;
+ if(pid==NULL)
+ return FALSE;
+
+ HANDLE hSnapShot = CreateToolhelp32Snapshot ( TH32CS_SNAPALL, 0);
+ PROCESSENTRY32* processInfo = new PROCESSENTRY32;
+ processInfo->dwSize = sizeof ( PROCESSENTRY32);
+
+// XFireLog("Scanning for voiceprograms ...");
+
+
+ while ( Process32Next ( hSnapShot,processInfo ) != FALSE)
+ {
+ if(processInfo->th32ProcessID!=0) {
+ int size=strlen(processInfo->szExeFile);
+
+ if(size==13)
+ {
+ if((processInfo->szExeFile[0]=='T'||processInfo->szExeFile[0]=='t')&&
+ processInfo->szExeFile[1]=='e'&&
+ processInfo->szExeFile[2]=='a'&&
+ processInfo->szExeFile[3]=='m'&&
+ processInfo->szExeFile[4]=='S'&&
+ processInfo->szExeFile[5]=='p'&&
+ processInfo->szExeFile[6]=='e'&&
+ processInfo->szExeFile[7]=='a'&&
+ processInfo->szExeFile[8]=='k')
+ {
+ *pid=processInfo->th32ProcessID;
+ found=TRUE;
+ *vid=32;
+ break;
+ }
+ }
+ else if(size==12)
+ {
+ if((processInfo->szExeFile[0]=='V'||processInfo->szExeFile[0]=='v')&&
+ processInfo->szExeFile[1]=='e'&&
+ processInfo->szExeFile[2]=='n'&&
+ processInfo->szExeFile[3]=='t'&&
+ processInfo->szExeFile[4]=='r'&&
+ processInfo->szExeFile[5]=='i'&&
+ processInfo->szExeFile[6]=='l'&&
+ processInfo->szExeFile[7]=='o')
+ {
+ *pid=processInfo->th32ProcessID;
+ found=TRUE;
+ *vid=33;
+ break;
+ }
+ }
+ else if(size==10)
+ {
+ if((processInfo->szExeFile[0]=='m'||processInfo->szExeFile[0]=='M')&&
+ processInfo->szExeFile[1]=='u'&&
+ processInfo->szExeFile[2]=='m'&&
+ processInfo->szExeFile[3]=='b'&&
+ processInfo->szExeFile[4]=='l'&&
+ processInfo->szExeFile[5]=='e')
+ {
+ *pid=processInfo->th32ProcessID;
+ found=TRUE;
+ *vid=34;
+ break;
+ }
+ }
+ }
+ }
+ CloseHandle ( hSnapShot);
+ return found;
+}
+
+//funktion wird in main gesetzt
+extern pGetExtendedUdpTable _GetExtendedUdpTable;
+
+
+#include <vector>
+
+#define maxuppackets 4
+
+//funktion liefer ip/port einer verbindung
+BOOL GetServerIPPort(DWORD pid,char*localaddrr,unsigned long localaddr,char*ip1,char*ip2,char*ip3,char*ip4,long*port)
+{
+ static std::vector<int> localport;
+ static const int hdrInclude = 1;
+ static int lastip=0;
+ static int lastport=0;
+ static int lastpid=0;
+
+ //DUMP("***Suche IP/Port***","");
+
+ //wenn die funktion nicht initialisiert werden konnte, könne wir nicht serverip und port rausbekommen
+ if(_GetExtendedUdpTable==NULL)
+ {
+ XFireLog("no GetExtendedUdpTable function");
+ return FALSE;
+ }
+
+ if(pid!=lastpid)
+ {
+ lastip=lastport=0;
+ lastpid=pid;
+ }
+
+ DWORD size=0;
+ MIB_UDPTABLE_OWNER_PID * ptab=NULL;
+
+ _GetExtendedUdpTable(NULL,&size,FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0);
+ ptab=(MIB_UDPTABLE_OWNER_PID*)malloc(size);
+ int ret=_GetExtendedUdpTable(ptab,&size,FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0);
+ //alle grad geöffnet updverb nach der pid vom spiel suchen, um an den port ranzukommen
+ if(ret==NO_ERROR)
+ {
+ BOOL notfound=TRUE;
+ for(unsigned int i=0;i<ptab->dwNumEntries;i++)
+ {
+ if(ptab->table[i].dwOwningPid==pid) //spiel gefunden
+ {
+ localport.push_back(ptab->table[i].dwLocalPort);
+ //DUMP("Localport: %d",ptab->table[i].dwLocalPort);
+ //localport=; //port wird gesichert
+ //break; //wir brauchen nicht mehr suchen
+ notfound=FALSE;
+ }
+ }
+ if(notfound) //kein port gefunden
+ {
+ //DUMP("Kein Localport gefunden","");
+ XFireLog("no local port found");
+ return FALSE; //dann erstmal schluss
+ }
+ }
+ else
+ {
+ XFireLog("GetExtendedUdpTable error!");
+ return FALSE;
+ }
+
+ if(ptab) delete ptab; //speicher frei machn
+
+
+ //socker erstellen
+ SOCKET s;
+ s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
+ if(s==INVALID_SOCKET)
+ {
+ //DUMP("Kann Rawsocket nicht erstellen. Error: %d",WSAGetLastError());
+ XFireLog("unable to create raw socket %d",WSAGetLastError());
+ closesocket(s);
+ return FALSE;
+ }
+
+ static struct sockaddr_in msockaddr;
+ memset(&msockaddr,0,sizeof(msockaddr));
+ msockaddr.sin_addr.s_addr = localaddr;
+ msockaddr.sin_family = AF_INET;
+ msockaddr.sin_port = 0;
+
+ //socket an nw binden
+ if (bind(s, (sockaddr *)&msockaddr, sizeof(msockaddr)) == SOCKET_ERROR)
+ {
+ //DUMP("Kann Rawsocket nicht binden. Error: %d",WSAGetLastError());
+ XFireLog("unable to bind raw socket %d",WSAGetLastError());
+ closesocket(s);
+ return FALSE;
+ }
+
+ //wir wollen alles was da reinkommt haben
+ static int I = 1;
+ static DWORD b;
+ if (WSAIoctl(s, _WSAIOW(IOC_VENDOR,1), &I, sizeof(I), NULL, NULL, &b, NULL, NULL) == SOCKET_ERROR)
+ {
+ //DUMP("IOCTL Error","");
+ /*closesocket(s);
+ return FALSE;*/
+ XFireLog("IOCTL error %d",WSAGetLastError());
+ //unter bestimmten umständen schlägt es hier fehl, dann lass trotzdem ip weiter erkennen
+ }
+
+ //socket soll timeout auswerfen, wenn nix kommt, damit der gamethread nicht hängt
+ //DUMP("timeout>>>","");
+ static int timeout=200;
+ if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout) == SOCKET_ERROR))
+ {
+ XFireLog("setsockopt(SO_RCVTIMEO) error %d",WSAGetLastError());
+ }
+
+ //updstruct, nur mit wichtigen sachen
+ struct mpacket {
+ unsigned char ipv;
+ char dmp[11]; //dummy
+ //srcip, serverip
+ unsigned char ip1;
+ unsigned char ip2;
+ unsigned char ip3;
+ unsigned char ip4;
+ //unsere nw
+ unsigned int ipdst;
+ char temp[1024];
+ };
+ struct mpacket2 {
+ unsigned char ipv;
+ char dmp[11]; //dummy
+ //srcip, serverip
+ unsigned long srcip;
+ //server ip
+ unsigned char ip1;
+ unsigned char ip2;
+ unsigned char ip3;
+ unsigned char ip4;
+ char temp[1024];
+ };
+ struct udp {
+ //srcport
+ u_short srcport;
+ //dstport
+ u_short dstport;
+ };
+
+ mpacket temp={0}; //empfamngsbuffer
+ udp * temp2;
+ char * temp3;
+ mpacket2 * temp4;
+
+ for (int I=0;I<maxuppackets;I++) //maximal 4 packete, das reicht
+ {
+ int msize=recv(s,(char*)&temp,sizeof(mpacket),0);
+ if(msize) //empfangen
+ {
+ /*DUMP("Packet empfangen","");
+ DUMP("Dump Full packet##############","");
+ DUMP(tohex((unsigned char*)&temp,msize),"");
+ DUMP("Dump Full packet##############","");
+
+ DUMP("Headersize: %d",(temp.ipv & 0x0f)*4);*/
+
+ temp3=(char*)&temp;
+ temp3+=(temp.ipv & 0x0f)*4;
+ temp2=(udp*)temp3;
+ temp4=(mpacket2*)&temp;
+
+ /*DUMP("Dump Udp##############","");
+ DUMP(tohex((unsigned char*)temp2,sizeof(udp)),"");
+ DUMP("Dump Udp##############","");*/
+
+
+ for(unsigned int i = 0 ; i < localport.size() ; i++)
+ {
+ //DUMP("destport %d ==",temp2->dstport);
+ //DUMP("== %d",localport.at(i));
+ if(temp2->dstport==localport.at(i)/*FIX: für XP SP3 ->*/&&temp4->srcip!=localaddr) //ist das ziel des packets, gleich dem port des spiels
+ {
+ *port=r(temp2->srcport); //ja dann serverdaten an gamethread übermitteln
+ *ip1=temp.ip1;
+ *ip2=temp.ip2;
+ *ip3=temp.ip3;
+ *ip4=temp.ip4;
+ closesocket(s); //socket zumachn
+
+ //DUMP("SourceIP %d",temp4->srcip);
+ //DUMP("SourcePort %d",temp2->srcport);
+ if(lastip!=temp4->srcip||temp2->srcport!=lastport)
+ {
+ lastport=temp2->srcport; //fixed port wechsel, damit dieser auch mitgetielt wird, wenn zb vorher nur serverinfos angefordert wurden
+ lastip=temp4->srcip;
+ closesocket(s);
+ //DUMP("IP gefunden","");
+ XFireLog("got ip!");
+ return TRUE;
+ }
+
+ XFireLog("no serverip found!");
+ return FALSE;
+ }
+ /* else if(temp4->srcip==localaddr && temp2->srcport==localport.at(i)) //gesendete gamepackets
+ {
+ *port=r(temp2->dstport); //ja dann serverdaten an gamethread übermitteln
+ *ip1=temp4->ip1;
+ *ip2=temp4->ip2;
+ *ip3=temp4->ip3;
+ *ip4=temp4->ip4;
+ closesocket(s); //socket zumachn
+ return TRUE;
+ }*/
+ }
+ }
+ else if(msize==SOCKET_ERROR)
+ {
+ XFireLog("recv() error %d",WSAGetLastError());
+ }
+ }
+ closesocket(s); //socket zumachn
+ lastip=0;
+ lastport=0;
+ return TRUE;
+}
+
+//funktion liefert ip/port einer verbindung, dupliziert für teamspeak/ventrilo, wegen static vals
+//TODO: eventuell umbauen, damit es für beide genutzt werden kann
+BOOL GetServerIPPort2(DWORD pid,char*localaddrr,unsigned long localaddr,char*ip1,char*ip2,char*ip3,char*ip4,long*port)
+{
+ static std::vector<int> localport;
+ static const int hdrInclude = 1;
+ static int lastip=0;
+ static int lastpid=0;
+ static int lastport=0;
+
+ //wenn die funktion nicht initialisiert werden konnte, könne wir nicht serverip und port rausbekommen
+ if(_GetExtendedUdpTable==NULL)
+ return FALSE;
+
+ if(pid!=lastpid)
+ {
+ lastip=lastport=0;
+ lastpid=pid;
+ }
+
+ DWORD size=0;
+ MIB_UDPTABLE_OWNER_PID * ptab=NULL;
+
+ _GetExtendedUdpTable(NULL,&size,FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0);
+ ptab=(MIB_UDPTABLE_OWNER_PID*)malloc(size);
+ int ret=_GetExtendedUdpTable(ptab,&size,FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0);
+ //alle grad geöffnet updverb nach der pid vom spiel suchen, um an den port ranzukommen
+ if(ret==NO_ERROR)
+ {
+ BOOL notfound=TRUE;
+ for(unsigned int i=0;i<ptab->dwNumEntries;i++)
+ {
+ if(ptab->table[i].dwOwningPid==pid) //spiel gefunden
+ {
+ localport.push_back(ptab->table[i].dwLocalPort);
+ //localport=; //port wird gesichert
+ //break; //wir brauchen nicht mehr suchen
+ notfound=FALSE;
+ }
+ }
+ if(notfound) //kein port gefunden
+ {
+ if(lastip!=0)
+ {
+ lastip=0;
+ lastport=0;
+ return TRUE;
+ }
+ return FALSE; //dann erstmal schluss
+ }
+ }
+ else
+ return FALSE;
+
+ if(ptab) delete ptab; //speicher frei machn
+
+
+ //socker erstellen
+ SOCKET s;
+ s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
+
+ static struct sockaddr_in msockaddr;
+ memset(&msockaddr,0,sizeof(msockaddr));
+ msockaddr.sin_addr.s_addr = localaddr;
+ msockaddr.sin_family = AF_INET;
+ msockaddr.sin_port = 0;
+
+ //socket an nw binden
+ if (bind(s, (sockaddr *)&msockaddr, sizeof(msockaddr)) == SOCKET_ERROR)
+ {
+ closesocket(s);
+ return FALSE;
+ }
+
+ //wir wollen alles was da reinkommt haben
+ static int I = 1;
+ DWORD b;
+ if (WSAIoctl(s, _WSAIOW(IOC_VENDOR,1), &I, sizeof(I), NULL, NULL, &b, NULL, NULL) == SOCKET_ERROR)
+ {
+ /*closesocket(s);
+ return FALSE;*/
+ //unter bestimmten umständen schlägt es hier fehl, dann lass trotzdem ip weiter erkennen
+ }
+
+ //socket soll timeout auswerfen, wenn nix kommt, damit der gamethread nicht hängt
+ //DUMP("timeout>>>","");
+ static int timeout=200;
+ setsockopt(s, SOL_SOCKET, SO_RCVTIMEO,(char*)&timeout, sizeof(timeout));
+
+ //updstruct, nur mit wichtigen sachen
+ struct mpacket {
+ unsigned char ipv;
+ char dmp[11]; //dummy
+ //srcip, serverip
+ unsigned char ip1;
+ unsigned char ip2;
+ unsigned char ip3;
+ unsigned char ip4;
+ //unsere nw
+ unsigned int ipdst;
+ char temp[1024];
+ };
+ struct mpacket2 {
+ unsigned char ipv;
+ char dmp[11]; //dummy
+ //srcip, serverip
+ unsigned long srcip;
+ //server ip
+ unsigned char ip1;
+ unsigned char ip2;
+ unsigned char ip3;
+ unsigned char ip4;
+ char temp[1024];
+ };
+ struct udp {
+ //srcport
+ u_short srcport;
+ //dstport
+ u_short dstport;
+ };
+
+ mpacket temp={0}; //empfamngsbuffer
+ udp * temp2;
+ char * temp3;
+ mpacket2 * temp4;
+
+ for (int I=0;I<maxuppackets;I++) //maximal 4 packete, das reicht
+ {
+ int msize=recv(s,(char*)&temp,sizeof(mpacket),0);
+ if(msize) //empfangen
+ {
+ temp3=(char*)&temp;
+ temp3+=(temp.ipv & 0x0f)*4;
+ temp2=(udp*)temp3;
+ temp4=(mpacket2*)&temp;
+
+ for(unsigned int i = 0 ; i < localport.size() ; i++)
+ if(temp2->dstport==localport.at(i)/*FIX: für XP SP3 ->*/&&temp4->srcip!=localaddr) //ist das ziel des packets, gleich dem port des spiels
+ {
+ *port=r(temp2->srcport); //ja dann serverdaten an gamethread übermitteln
+ *ip1=temp.ip1;
+ *ip2=temp.ip2;
+ *ip3=temp.ip3;
+ *ip4=temp.ip4;
+ closesocket(s); //socket zumachn
+
+ if(lastip!=temp4->srcip||temp2->srcport!=lastport)
+ {
+ lastport=temp2->srcport; //fixed port wechsel, damit dieser auch mitgetielt wird, wenn zb vorher nur serverinfos angefordert wurden
+ lastip=temp4->srcip;
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+ /* else if(temp4->srcip==localaddr && temp2->srcport==localport.at(i)) //gesendete gamepackets
+ {
+ *port=r(temp2->dstport); //ja dann serverdaten an gamethread übermitteln
+ *ip1=temp4->ip1;
+ *ip2=temp4->ip2;
+ *ip3=temp4->ip3;
+ *ip4=temp4->ip4;
+ closesocket(s); //socket zumachn
+ return TRUE;
+ }*/
+ }
+ }
+ closesocket(s); //socket zumachn
+ lastip=0;
+ lastport=0;
+ return TRUE;
+}
+
+
+char * getItem(char * string,char delim,int count)
+{
+ static char item[255];
+ char i=0;
+
+ while(*string!='\0'&&count>0)
+ {
+ if(*string==delim)
+ {
+ item[i]=0;
+ i=0;
+ count--;
+ string++;
+ }
+ else {
+ item[i]=*string;
+ i++;
+ string++;
+ }
+ }
+ if(*string=='\0')
+ item[i]=0;
+ if(count>1)
+ item[0]=0;
+
+ for(unsigned int i=0;i<strlen(item);i++)
+ {
+ item[i]=tolower(item[i]);
+ }
+
+ return item;
+}
+
+// soll commandline der spiele prüfen
+//
+// TRUE bedeutet, entweder ok, oder konnte wegen systemfehler nicht geprüft werden
+// FALSE bedeutet beinhaltet nicht das, was es soll
+//
+// get process comamndline quelle hier:
+// http://forum.sysinternals.com/forum_posts.asp?TID=6510
+#define cb 1024
+
+pZwQueryInformationProcess _ZwQueryInformationProcess = NULL;
+//pZwClose _ZwClose = NULL;
+pZwReadVirtualMemory _ZwReadVirtualMemory = NULL;
+
+BOOL checkCommandLine(HANDLE hProcess,char * mustcontain,char * mustnotcontain)
+{
+ WCHAR * buffer;
+ char * buffer2;
+ PPEB peb = NULL;
+ PPROCESS_PARAMETERS proc_params = NULL;
+ PVOID UserPool = (PVOID)LocalAlloc(LPTR, 8192);
+ PROCESS_BASIC_INFORMATION ProcessInfo;
+
+ //strings leer abbruch
+ if(!mustcontain&&!mustnotcontain)
+ return TRUE;
+
+ //prüfe und lade nötige funktionen
+ if(_ZwQueryInformationProcess==NULL)
+ {
+ _ZwQueryInformationProcess = (pZwQueryInformationProcess)GetProcAddress(GetModuleHandle( "ntdll.dll"), "ZwQueryInformationProcess");
+ if(_ZwQueryInformationProcess==NULL)
+ {
+ return TRUE;
+ }
+ }
+ if(_ZwReadVirtualMemory==NULL)
+ {
+ _ZwReadVirtualMemory = (pZwReadVirtualMemory)GetProcAddress(GetModuleHandle( "ntdll.dll"), "ZwReadVirtualMemory");
+ if(_ZwReadVirtualMemory==NULL)
+ {
+ return TRUE;
+ }
+ }
+
+ //commandline bekommen, siehe link oben
+ ULONG rc = _ZwQueryInformationProcess(hProcess,ProcessBasicInformation,&ProcessInfo,sizeof(ProcessInfo),NULL);
+
+ rc = _ZwReadVirtualMemory(hProcess,ProcessInfo.PebBaseAddress, UserPool, sizeof(PEB), NULL);
+
+ peb = (PPEB)UserPool;
+ rc = _ZwReadVirtualMemory(hProcess,peb->ProcessParameters,UserPool,sizeof(PROCESS_PARAMETERS),NULL);
+
+ proc_params = (PPROCESS_PARAMETERS)UserPool;
+ ULONG uSize = 0;
+ LPVOID pBaseAddress = NULL;
+
+ uSize = proc_params->CommandLine.Length;
+ pBaseAddress = proc_params->CommandLine.Buffer;
+
+ //keine commandline?!
+ if(uSize==0||pBaseAddress==NULL)
+ {
+ LocalFree(UserPool);
+ return FALSE;
+ }
+
+ buffer=(WCHAR*)new char[uSize];
+
+ rc = _ZwReadVirtualMemory(hProcess, pBaseAddress, buffer, uSize, NULL);
+
+ //in ansi umwandeln
+ int correctsize=WideCharToMultiByte(CP_OEMCP, 0, buffer, -1, NULL, 0, NULL, NULL);
+
+ if(correctsize==0)
+ {
+ LocalFree(UserPool);
+ return FALSE;
+ }
+
+ buffer2=new char[correctsize];
+ WideCharToMultiByte(CP_OEMCP, 0, buffer, -1, buffer2,correctsize,NULL,NULL);
+ buffer2[correctsize-1]=0;
+
+
+ for(unsigned int i=0;i<strlen(buffer2);i++)
+ {
+ buffer2[i]=tolower(buffer2[i]);
+ }
+
+ //lowercase mustcontain/mustnotcontain
+ if(mustcontain)
+ for(unsigned int i=0;i<strlen(mustcontain);i++)
+ {
+ mustcontain[i]=tolower(mustcontain[i]);
+ }
+ if(mustnotcontain)
+ for(unsigned int i=0;i<strlen(mustnotcontain);i++)
+ {
+ mustnotcontain[i]=tolower(mustnotcontain[i]);
+ }
+
+ string cmdline=buffer2;
+
+ if(mustcontain)
+ if(cmdline.find(mustcontain)!=string::npos)
+ {
+ delete[] buffer;
+ delete[] buffer2;
+ LocalFree(UserPool);
+ return TRUE;
+ }
+ else
+ {
+ delete[] buffer;
+ delete[] buffer2;
+ LocalFree(UserPool);
+ return FALSE;
+ }
+
+ int count=1;
+ if(mustnotcontain)
+ {
+ char*str=getItem(mustnotcontain,';',count);
+ do {
+ if(cmdline.find(str)!=string::npos)
+ {
+ delete[] buffer;
+ delete[] buffer2;
+ LocalFree(UserPool);
+ return FALSE;
+ }
+ count++;
+ str=getItem(mustnotcontain,';',count);
+ }
+ while(*str!=0);
+ }
+
+ //_ZwClose(hProcess);
+ LocalFree(UserPool);
+ delete[] buffer;
+ delete[] buffer2;
+
+ return TRUE;
+}
+
+#define RECV_BUFFER_SIZE 6144
+
+BOOL CheckWWWContent(char*address) {
+ Netlib_Logf(hNetlib,"Check Url %s ...",address);
+
+ //netlib request
+ NETLIBHTTPREQUEST nlhr={0},*nlhrReply;
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_HEAD;
+ nlhr.flags = NLHRF_NODUMP|NLHRF_GENERATEHOST|NLHRF_SMARTAUTHHEADER;
+ nlhr.szUrl = address;
+
+ nlhrReply=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,(WPARAM)hNetlib,(LPARAM)&nlhr);
+
+ if(nlhrReply) {
+ //nicht auf dem server
+ Netlib_Logf(hNetlib,"Resultcode %d ...",nlhrReply->resultCode);
+ if (nlhrReply->resultCode != 200) {
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ return FALSE;
+ }
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ }
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+
+BOOL GetWWWContent2(char*address,char*filename,BOOL dontoverwrite,char**tobuf,unsigned int* size) {
+ if(dontoverwrite==TRUE)
+ {
+ if(GetFileAttributes(filename)!=0xFFFFFFFF)
+ {
+ Netlib_Logf(hNetlib,"%s already exists, no overwrite.",filename);
+ return TRUE;
+ }
+ }
+ Netlib_Logf(hNetlib,"Download Url %s ...",address);
+
+ //netlib request
+ NETLIBHTTPREQUEST nlhr={0},*nlhrReply;
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_GET;
+ nlhr.flags = NLHRF_NODUMP|NLHRF_GENERATEHOST|NLHRF_SMARTAUTHHEADER;
+ nlhr.szUrl = address;
+
+ nlhrReply=(NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION,(WPARAM)hNetlib,(LPARAM)&nlhr);
+
+ if(nlhrReply) {
+ //nicht auf dem server
+ if (nlhrReply->resultCode != 200) {
+ Netlib_Logf(hNetlib,"Bad statuscode: %d",nlhrReply->resultCode);
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ return FALSE;
+ }
+ //keine daten für mich
+ else if (nlhrReply->dataLength < 1 || nlhrReply->pData == NULL)
+ {
+ Netlib_Logf(hNetlib,"No data received.");
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ return FALSE;
+ }
+ else
+ {
+ if(tobuf==NULL)
+ {
+ FILE * f = fopen(filename,"wb");
+ if(f==NULL)
+ {
+ Netlib_Logf(hNetlib,"Cannot open %s for binary write mode.",filename);
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ return FALSE;
+ }
+ fwrite(nlhrReply->pData,nlhrReply->dataLength,1,f);
+ fclose(f);
+ }
+ else
+ {
+ if(*tobuf==NULL)
+ {
+ *tobuf=new char[nlhrReply->dataLength+1];
+ memcpy_s(*tobuf,nlhrReply->dataLength,nlhrReply->pData,nlhrReply->dataLength);
+ //0 terminieren
+ (*tobuf)[nlhrReply->dataLength]=0;
+ //größe zurückliefern, wenn gewollt
+ if(size)
+ *size=nlhrReply->dataLength+1;
+ }
+ }
+ }
+ CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT,0,(LPARAM)nlhrReply);
+ }
+ else
+ {
+ Netlib_Logf(hNetlib,"No valid Netlib Request.",filename);
+ return FALSE;
+ }
+ return TRUE;
+}
+//eigener www downloader, da winet exceptions erzeugt
+BOOL GetWWWContent(char*host,char* request,char*filename,BOOL dontoverwrite) {
+ char add[1024]="http://";
+ strcat(add,host);
+ strcat(add,request);
+
+ return GetWWWContent2(add,filename,dontoverwrite);
+}
+
+unsigned int getfilesize(char*path)
+{
+ FILE * f = NULL;
+ f=fopen(path,"rb");
+ if(f==NULL)
+ return 0;
+ fseek (f, 0, SEEK_END);
+ int size=ftell (f);
+ fclose (f);
+ return size;
+}
+
+//funktion soll erst in der userini suchen, danach in der xfire_games.ini
+DWORD xfire_GetPrivateProfileString(__in LPCTSTR lpAppName, __in LPCTSTR lpKeyName, __in LPCTSTR lpDefault, __out LPTSTR lpReturnedString, __in DWORD nSize, __in LPCTSTR lpFileName) {
+ //xfire_games.ini
+ int size=strlen(lpFileName);
+ if(size>15)
+ {
+ char*file=(char*)lpFileName;
+ int ret=0;
+ *(file+size-14)='u';
+ *(file+size-13)='s';
+ *(file+size-12)='e';
+ *(file+size-11)='r';
+ ret = GetPrivateProfileString( lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,lpFileName);
+ if(ret)
+ {
+ return ret;
+ }
+ else
+ {
+ *(file+size-14)='f';
+ *(file+size-13)='i';
+ *(file+size-12)='r';
+ *(file+size-11)='e';
+ return GetPrivateProfileString( lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,lpFileName);
+ }
+ }
+ return GetPrivateProfileString( lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,lpFileName);
+}
+
+
+BOOL mySleep(int ms,HANDLE evt) {
+ switch(WaitForSingleObject(evt,ms))
+ {
+ case WAIT_TIMEOUT:
+ return FALSE;
+ case WAIT_ABANDONED:
+ //MessageBox(NULL,"Abbruch","Abbruch",0);
+ return TRUE;
+ default:
+ return TRUE;
+ }
+
+ return FALSE;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/tools.h b/protocols/Xfire/src/tools.h new file mode 100644 index 0000000000..ca0b906179 --- /dev/null +++ b/protocols/Xfire/src/tools.h @@ -0,0 +1,99 @@ +
+#ifndef _TOOLS_H
+#define _TOOLS_H
+
+#include "baseProtocol.h"
+
+#include <m_popup.h>
+#include <string>
+using std::string;
+
+//****************************
+//get commandline header stuff
+//****************************
+typedef struct _UNICODE_STRING {
+USHORT Length;
+USHORT MaximumLength;
+PWSTR Buffer;
+} UNICODE_STRING;
+typedef UNICODE_STRING *PUNICODE_STRING;
+typedef enum _PROCESSINFOCLASS {
+ ProcessBasicInformation
+} PROCESSINFOCLASS;
+typedef struct _PEB_LDR_DATA {
+ BYTE Reserved1[8];
+ PVOID Reserved2[3];
+ LIST_ENTRY InMemoryOrderModuleList;
+} PEB_LDR_DATA,
+ *PPEB_LDR_DATA;
+typedef struct _RTL_USER_PROCESS_PARAMETERS {
+ BYTE Reserved1[16];
+ PVOID Reserved2[10];
+ UNICODE_STRING ImagePathName;
+ UNICODE_STRING CommandLine;
+} RTL_USER_PROCESS_PARAMETERS,
+ *PRTL_USER_PROCESS_PARAMETERS;
+typedef struct _PEB {
+ BYTE Reserved1[2];
+ BYTE BeingDebugged;
+ BYTE Reserved2[1];
+ PVOID Reserved3[2];
+ PPEB_LDR_DATA Ldr;
+ PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
+ BYTE Reserved4[104];
+ PVOID Reserved5[52];
+ void* PostProcessInitRoutine;
+ BYTE Reserved6[128];
+ PVOID Reserved7[1];
+ ULONG SessionId;
+} PEB,
+ *PPEB;
+typedef struct
+{
+ULONG AllocationSize;
+ULONG ActualSize;
+ULONG Flags;
+ULONG Unknown1;
+UNICODE_STRING Unknown2;
+HANDLE InputHandle;
+HANDLE OutputHandle;
+HANDLE ErrorHandle;
+UNICODE_STRING CurrentDirectory;
+HANDLE CurrentDirectoryHandle;
+UNICODE_STRING SearchPaths;
+UNICODE_STRING ApplicationName;
+UNICODE_STRING CommandLine;
+PVOID EnvironmentBlock;
+ULONG Unknown[9];
+UNICODE_STRING Unknown3;
+UNICODE_STRING Unknown4;
+UNICODE_STRING Unknown5;
+UNICODE_STRING Unknown6;
+} PROCESS_PARAMETERS, *PPROCESS_PARAMETERS;
+typedef struct _PROCESS_BASIC_INFORMATION {
+ PVOID Reserved1;
+ PPEB PebBaseAddress;
+ PVOID Reserved2[2];
+ ULONG_PTR UniqueProcessId;
+ PVOID Reserved3;
+} PROCESS_BASIC_INFORMATION;
+
+typedef ULONG (WINAPI *pZwQueryInformationProcess)(
+ IN HANDLE ProcessHandle,
+ IN PROCESSINFOCLASS ProcessInformationClass,
+ OUT PVOID ProcessInformation,
+ IN ULONG ProcessInformationLength,
+ OUT PULONG ReturnLength OPTIONAL
+);
+typedef ULONG (WINAPI *pZwClose)(
+ IN HANDLE Handle
+);
+typedef ULONG (WINAPI *pZwReadVirtualMemory)(
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress,
+ OUT PVOID Buffer,
+ IN ULONG BufferLength,
+ OUT PULONG ReturnLength OPTIONAL
+);
+
+#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/userdetails.cpp b/protocols/Xfire/src/userdetails.cpp new file mode 100644 index 0000000000..4ea28ffa98 --- /dev/null +++ b/protocols/Xfire/src/userdetails.cpp @@ -0,0 +1,449 @@ +/*
+ * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network.
+ *
+ * Copyright (C) 2010 by
+ * dufte <dufte@justmail.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Based on J. Lawler - BaseProtocol
+ * Herbert Poul/Beat Wolf - xfirelib
+ *
+ * Miranda ICQ: the free icq client for MS Windows
+ * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede
+ *
+ */
+
+#include "stdafx.h"
+
+#include "baseProtocol.h"
+#include "Xfire_gamelist.h"
+#include <string>
+
+HWND ghwndDlg=NULL;
+extern HANDLE XFireWorkingFolder;
+extern Xfire_gamelist xgamelist;
+
+
+//als funktion, damit es per thread geladen werden kann
+void LoadProfilStatus(LPVOID lparam) {
+ if(!lparam || !ghwndDlg)
+ return;
+
+ //dl
+ char url[255]="http://miniprofile.xfire.com/bg/sh/type/1/";
+ char* buf=NULL;
+ unsigned int size=0;
+ strcat_s(url,255,(char*)lparam);
+ strcat_s(url,255,".png");
+
+ //versuche das icon aus dem inet zulasen
+ if(GetWWWContent2(url,NULL,FALSE,&buf,&size))
+ {
+ //aus dem buffer ein hicon erzeugen
+ HBITMAP hbitmap=xgamelist.createHBITMAPfromdata(buf,size);
+ //speicher freigeben
+ delete[] buf;
+ SendMessage(GetDlgItem(ghwndDlg,IDC_PROFILIMG),STM_SETIMAGE,IMAGE_BITMAP,(LPARAM)hbitmap);
+ }
+ delete[] lparam;
+}
+
+void SetItemTxt(HWND hwndDlg,int feldid,char*feld,HANDLE hcontact,int type)
+{
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(hcontact,protocolname,feld,&dbv)) {
+ if(type==1)
+ {
+ char temp[255];
+ sprintf(temp,"%i",dbv.wVal);
+ SetDlgItemText(hwndDlg,feldid,temp);
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg,feldid,dbv.pszVal);
+ }
+ DBFreeVariant(&dbv);
+ EnableDlgItem(hwndDlg,feldid,TRUE);
+ }
+ else
+ {
+ SetDlgItemText(hwndDlg,feldid,Translate("<not specified>"));
+ EnableDlgItem(hwndDlg,feldid,FALSE);
+ }
+}
+
+static int GetIPPortUDetails(HANDLE wParam,char* feld1,char* feld2)
+{
+ char temp[255];
+ HGLOBAL clipbuffer;
+ char* buffer;
+
+ if(DBGetContactSettingWord((HANDLE)wParam, protocolname, feld2, -1)==0)
+ return 0;
+
+ DBVARIANT dbv;
+ if(DBGetContactSettingTString((HANDLE)wParam, protocolname, feld1,&dbv))
+ return 0;
+
+ sprintf(temp,"%s:%d",dbv.pszVal,DBGetContactSettingWord((HANDLE)wParam, protocolname, feld2, -1));
+
+ DBFreeVariant(&dbv);
+
+ if(OpenClipboard(NULL))
+ {
+ EmptyClipboard();
+
+ clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(temp)+1);
+ buffer = (char*)GlobalLock(clipbuffer);
+ strcpy(buffer, LPCSTR(temp));
+ GlobalUnlock(clipbuffer);
+
+ SetClipboardData(CF_TEXT, clipbuffer);
+ CloseClipboard();
+ }
+
+ return 0;
+}
+
+void addToList(HWND listbox,HANDLE hContact,char*key,char*val)
+{
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(hContact,protocolname,val,&dbv))
+ {
+ LVITEM lvitem;
+ memset(&lvitem,0,sizeof(lvitem));
+ lvitem.mask=LVIF_TEXT;
+ lvitem.cchTextMax=255;
+ lvitem.iItem=0;
+ lvitem.iSubItem=0;
+ lvitem.pszText=key;
+ SendMessageA(listbox,LVM_INSERTITEM,0,(LPARAM)&lvitem);
+ lvitem.iSubItem++;
+ lvitem.pszText=dbv.pszVal;
+ SendMessageA(listbox,LVM_SETITEM,0,(LPARAM)&lvitem);
+ DBFreeVariant(&dbv);
+ }
+}
+
+void setGameInfo(HWND listbox,char *mbuf)
+{
+ int ii=0;
+ char temp[255];
+ char mod=0;
+ char item=0;
+ char *mbuf2=(char*)mbuf;
+ LVITEM lvitem;
+ memset(&lvitem,0,sizeof(lvitem));
+ lvitem.mask=LVIF_TEXT;
+ lvitem.cchTextMax=255;
+
+ while(*mbuf2!=0)
+ {
+ if(*mbuf2==1&&mod==0)
+ {
+ temp[ii]=0;
+ mod=1;
+ lvitem.iItem=item;
+ lvitem.iSubItem=0;
+ lvitem.pszText=temp;
+ SendMessageA(listbox,LVM_INSERTITEM,0,(LPARAM)&lvitem);
+ item++;
+ ii=-1;
+ }
+ else if(*mbuf2==2&&mod==1)
+ {
+ temp[ii]=0;
+ mod=0;
+ lvitem.iSubItem++;
+ lvitem.pszText=temp;
+ SendMessageA(listbox,LVM_SETITEM,0,(LPARAM)&lvitem);
+ ii=-1;
+ }
+ else
+ temp[ii]=*mbuf2;
+ mbuf2++;
+ ii++;
+ }
+}
+
+static BOOL CALLBACK DlgProcUserDetails(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ static char path[XFIRE_MAX_STATIC_STRING_LEN]="";
+ static WCHAR wpath[256];
+ static HICON gameicon=0;
+ static HICON voiceicon=0;
+ static HANDLE uhandle=0;
+ static HWND listbox;
+ LVCOLUMN pcol;
+
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ TranslateDialogDefault(hwndDlg);
+
+ ghwndDlg=hwndDlg;
+
+ listbox=GetDlgItem(hwndDlg,IDC_GAMEINFOLIST);
+ pcol.mask=LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT;
+ pcol.pszText="Key";
+ pcol.cx=65;
+ pcol.fmt=LVCFMT_LEFT;
+ SendMessageA(listbox,LVM_INSERTCOLUMNA,1,(LPARAM)&pcol);
+ pcol.cx=80;
+ pcol.pszText="Value";
+ SendMessageA(listbox,LVM_INSERTCOLUMNA,2,(LPARAM)&pcol);
+
+ HFONT hFont;
+ LOGFONT lfFont;
+
+ memset(&lfFont, 0x00, sizeof(lfFont));
+ memcpy(lfFont.lfFaceName, TEXT("Arial"), 8);
+
+ lfFont.lfHeight = 13;
+ lfFont.lfWeight = FW_BOLD;
+ lfFont.lfCharSet = ANSI_CHARSET;
+ lfFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
+ lfFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ lfFont.lfQuality = DEFAULT_QUALITY;
+
+ // Create the font from the LOGFONT structure passed.
+ hFont = CreateFontIndirect (&lfFont);
+
+ SendMessageA(listbox,WM_SETFONT,(WPARAM)hFont,TRUE);
+
+ return TRUE;
+ }
+ case WM_CTLCOLORSTATIC:
+ {
+ break;
+ }
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->idFrom)
+ {
+
+ case 0:
+ {
+ switch (((LPNMHDR)lParam)->code)
+ {
+
+ case PSN_INFOCHANGED:
+ {
+ char* szProto;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+ uhandle=hContact; //handle sichern
+
+ if (hContact == NULL)
+ szProto = protocolname;
+ else
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+
+ if (szProto == NULL)
+ break;
+
+ //alle items aus der liste entfernen
+ SendMessage(listbox,LVM_DELETEALLITEMS,0,0);
+
+ if (hContact)
+ {
+ DBVARIANT dbv;
+ if(!DBGetContactSetting(hContact,protocolname,"Username",&dbv))
+ {
+ int usernamesize=strlen(dbv.pszVal)+1;
+ char* username=new char[usernamesize];
+ if(username)
+ {
+ strcpy_s(username,usernamesize,dbv.pszVal);
+ mir_forkthread(LoadProfilStatus,(LPVOID)username);
+ }
+ //LoadProfilStatus
+ DBFreeVariant(&dbv);
+ }
+
+ if(!DBGetContactSetting(hContact,protocolname,"GameInfo",&dbv))
+ {
+ setGameInfo(listbox,dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+
+ addToList(listbox,hContact,"Servername","ServerName");
+ addToList(listbox,hContact,"GameType","GameType");
+ addToList(listbox,hContact,"Map","Map");
+ addToList(listbox,hContact,"Players","Players");
+
+ SetItemTxt(hwndDlg,IDC_DNICK,"Nick",hContact,0);
+ SetItemTxt(hwndDlg,IDC_DUSERNAME,"Username",hContact,0);
+
+ SetItemTxt(hwndDlg,IDC_GIP,"ServerIP",hContact,0);
+ SetItemTxt(hwndDlg,IDC_VIP,"VServerIP",hContact,0);
+ SetItemTxt(hwndDlg,IDC_GPORT,"Port",hContact,1);
+ SetItemTxt(hwndDlg,IDC_VPORT,"VPort",hContact,1);
+
+ SetItemTxt(hwndDlg,IDC_GAME,"RGame",hContact,0);
+ SetItemTxt(hwndDlg,IDC_VNAME,"RVoice",hContact,0);
+
+ //render icons
+ {
+ DBVARIANT dbv;
+
+ if(!DBGetContactSetting(hContact,protocolname,"GameId",&dbv))
+ {
+ SendMessage(GetDlgItem(hwndDlg,IDC_GAMEICO),STM_SETICON,(WPARAM)xgamelist.iconmngr.getGameIcon(dbv.wVal),0);
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSetting(hContact,protocolname,"VoiceId",&dbv))
+ {
+ SendMessage(GetDlgItem(hwndDlg,IDC_VOICEICO),STM_SETICON,(WPARAM)xgamelist.iconmngr.getGameIcon(dbv.wVal),0);
+ DBFreeVariant(&dbv);
+ }
+
+ if(DBGetContactSetting(hContact,protocolname,"ServerIP",&dbv))
+ {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_COPYGAME),FALSE);
+ DBFreeVariant(&dbv);
+ }
+ if(DBGetContactSetting(hContact,protocolname,"VServerIP",&dbv))
+ {
+ EnableWindow(GetDlgItem(hwndDlg,IDC_COPYVOICE),FALSE);
+ DBFreeVariant(&dbv);
+ }
+
+ //ShowWindow(GetDlgItem(hwndDlg,IDC_VOICEICO),FALSE)
+ }
+ }
+ }
+ break;
+ }
+ }
+ break;
+ }
+ }
+ break;
+ case WM_COMMAND:
+ {
+ switch(wParam)
+ {
+ case IDC_COPYGAME:
+ GetIPPortUDetails(uhandle,"ServerIP","Port");
+ break;
+ case IDC_COPYVOICE:
+ GetIPPortUDetails(uhandle,"VServerIP","VPort");
+ break;
+ }
+ }
+ }
+ return FALSE;
+}
+
+/*static BOOL CALLBACK DlgProcUserDetails2(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ char profil[2056]="";
+ switch (msg)
+ {
+ case WM_INITDIALOG:
+ {
+ return TRUE;
+ }
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->idFrom)
+ {
+ case 0:
+ {
+ switch (((LPNMHDR)lParam)->code)
+ {
+ case PSN_INFOCHANGED:
+ {
+ char* szProto;
+ HANDLE hContact = (HANDLE)((LPPSHNOTIFY)lParam)->lParam;
+
+ if (hContact == NULL)
+ szProto = protocolname;
+ else
+ szProto = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0);
+
+ if (szProto == NULL)
+ break;
+
+ if (hContact) {
+ DBVARIANT dbv;
+
+ char img[256]="";
+ char username[256]="";
+ char nick[256]="";
+ char status[256]="";
+ char game[512]="";
+ if(!DBGetContactSetting(hContact,"ContactPhoto","File",&dbv))
+ {
+ snprintf(img,256,"<img src=\"%s\">",dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSetting(hContact,protocolname,"Username",&dbv))
+ {
+ snprintf(username,256,"<b>Username:</b> %s<br>",dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSetting(hContact,protocolname,"Nick",&dbv))
+ {
+ snprintf(nick,256,"<b>Nick:</b> %s<br>",dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSetting(hContact,protocolname,"XStatusMsg",&dbv))
+ {
+ snprintf(status,256,"<b>Status:</b> %s<br>",dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ if(!DBGetContactSetting(hContact,protocolname,"RGame",&dbv))
+ {
+ snprintf(game,512,"<fieldset style='border:1px solid #0091d5;background-color:#0d2c3e;margin-bottom:8px;'><legend>Spiel</legend><table><tr><td valign=top style='font-family:Arial;font-size:11px;color:#fff;'><b><u>%s</u></b></td></tr></table></fieldset>",dbv.pszVal);
+ DBFreeVariant(&dbv);
+ }
+ snprintf(profil,2056,"mshtml:<div style='position:absolute;top:0;left:0;border:1px solid #0091d5;background-color:#000;padding:6px;width:334px;height:249px'><table><tr><td valign=top>%s</td><td valign=top style='font-family:Arial;font-size:11px;color:#fff;'>%s%s%s</td></tr><tr><td valign=top colspan=\"2\" style='font-family:Arial;font-size:11px;color:#fff;'>%s%s</td></tr></table></div>",img,username,nick,status,game);
+ HWND hWnd = ::CreateWindow("AtlAxWin", profil,
+ WS_CHILD|WS_VISIBLE, 0, 0, 334, 249, hwndDlg, NULL,
+ ::GetModuleHandle(NULL), NULL);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return FALSE;
+}*/
+
+int OnDetailsInit(WPARAM wParam,LPARAM lParam)
+{
+ OPTIONSDIALOGPAGE odp = {0};
+
+ if (!IsXFireContact((HANDLE)lParam))
+ return 0;
+
+ odp.cbSize = sizeof(odp);
+ odp.hIcon = NULL;
+ odp.hInstance = hinstance;
+ odp.pfnDlgProc = DlgProcUserDetails;
+ odp.position = -1900000000;
+ odp.pszTemplate = MAKEINTRESOURCE(IDD_UD);
+ odp.pszTitle = Translate("XFire");
+ odp.pszGroup = NULL;
+
+ UserInfo_AddPage(wParam, &odp);
+
+ return 0;
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/variables.cpp b/protocols/Xfire/src/variables.cpp new file mode 100644 index 0000000000..d8479b7dc6 --- /dev/null +++ b/protocols/Xfire/src/variables.cpp @@ -0,0 +1,168 @@ +//fürs varaibles händling - dufte
+#include "stdafx.h"
+
+#include "variables.h"
+#include <string>
+
+using namespace std;
+
+char* Varxfiregame(ARGUMENTSINFO *ai)
+{
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ if(ai->fi->hContact==NULL)
+ {
+ //
+ }
+ else
+ {
+ char temp[256];
+ DBVARIANT dbv3; + if(!DBGetContactSetting(ai->fi->hContact,protocolname, "RGame",&dbv3))
+ {
+ strncpy(temp,dbv3.pszVal,255);
+ DBFreeVariant(&dbv3);
+ return mir_strdup(temp);
+ }
+ }
+
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+}
+
+char* Varmyxfiregame(ARGUMENTSINFO *ai)
+{
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ DBVARIANT dbv3; + if(!DBGetContactSetting(NULL,protocolname, "currentgamename",&dbv3))
+ {
+ char* ret=mir_strdup(dbv3.pszVal);
+ DBFreeVariant(&dbv3);
+ return ret;
+ }
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+}
+
+char* Varxfirevoice(ARGUMENTSINFO *ai)
+{
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ DBVARIANT dbv3; + if(!DBGetContactSetting(ai->fi->hContact,protocolname, "RVoice",&dbv3))
+ {
+ char* ret=mir_strdup(dbv3.pszVal);
+ DBFreeVariant(&dbv3);
+ return ret;
+ }
+
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+}
+
+
+char* Varmyxfirevoiceip(ARGUMENTSINFO *ai) {
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ DBVARIANT dbv3; + if(!DBGetContactSetting(NULL,protocolname, "VServerIP",&dbv3))
+ {
+ char* ret=mir_strdup(dbv3.pszVal);
+ DBFreeVariant(&dbv3);
+ return ret;
+ }
+
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+}
+
+char* Varmyxfireserverip(ARGUMENTSINFO *ai) {
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ DBVARIANT dbv3; + if(!DBGetContactSetting(NULL,protocolname, "ServerIP",&dbv3))
+ {
+ char* ret=mir_strdup(dbv3.pszVal);
+ DBFreeVariant(&dbv3);
+ return ret;
+ }
+
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+}
+
+char* Varxfireserverip(ARGUMENTSINFO *ai) {
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ if(ai->fi->hContact==NULL)
+ {
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+ }
+ else
+ {
+ char temp[24];
+ DBVARIANT dbv3; + if(!DBGetContactSetting(ai->fi->hContact,protocolname, "ServerIP",&dbv3))
+ {
+ sprintf(temp,"%s:%d",dbv3.pszVal,DBGetContactSettingWord(ai->fi->hContact,protocolname, "Port",0));
+ DBFreeVariant(&dbv3);
+ return mir_strdup(temp);
+ }
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+ }
+
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+}
+
+char* Varxfirevoiceip(ARGUMENTSINFO *ai) {
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ if(ai->fi->hContact==NULL)
+ {
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+ }
+ else
+ {
+ char temp[24];
+ DBVARIANT dbv3; + if(!DBGetContactSetting(ai->fi->hContact,protocolname, "VServerIP",&dbv3))
+ {
+ sprintf(temp,"%s:%d",dbv3.pszVal,DBGetContactSettingWord(ai->fi->hContact,protocolname, "VPort",0));
+ DBFreeVariant(&dbv3);
+ return mir_strdup(temp);
+ }
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+ }
+
+ ai->flags = AIF_FALSE;
+ return mir_strdup("");
+}
+
+char* Varmyxfirevoice(ARGUMENTSINFO *ai)
+{
+ if (ai->cbSize < sizeof(ARGUMENTSINFO))
+ return NULL;
+
+ DBVARIANT dbv3; + if(!DBGetContactSetting(NULL,protocolname, "currentvoicename",&dbv3))
+ {
+ char* ret=mir_strdup(dbv3.pszVal);
+ DBFreeVariant(&dbv3);
+ return ret;
+ }
+
+ return mir_strdup("");
+}
\ No newline at end of file diff --git a/protocols/Xfire/src/variables.h b/protocols/Xfire/src/variables.h new file mode 100644 index 0000000000..74a73b1176 --- /dev/null +++ b/protocols/Xfire/src/variables.h @@ -0,0 +1,11 @@ +#include "baseProtocol.h"
+#include "m_variables.h"
+
+char* Varxfiregame(ARGUMENTSINFO *ai);
+char* Varmyxfiregame(ARGUMENTSINFO *ai);
+char* Varmyxfirevoice(ARGUMENTSINFO *ai);
+char* Varxfireserverip(ARGUMENTSINFO *ai);
+char* Varxfirevoice(ARGUMENTSINFO *ai);
+char* Varxfirevoiceip(ARGUMENTSINFO *ai);
+char* Varmyxfirevoiceip(ARGUMENTSINFO *ai);
+char* Varmyxfireserverip(ARGUMENTSINFO *ai);
\ No newline at end of file diff --git a/protocols/Xfire/src/variablevalue.cpp b/protocols/Xfire/src/variablevalue.cpp new file mode 100644 index 0000000000..584f64412c --- /dev/null +++ b/protocols/Xfire/src/variablevalue.cpp @@ -0,0 +1,204 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include <string> +#include "variablevalue.h" +#include "xdebug.h" + +#include "math.h" // for pow(..) + +namespace xfirelib { + +using namespace std; + + VariableValue::VariableValue() { + value = 0; + } + VariableValue::~VariableValue() { + if(value) + delete[] value; + } + + void VariableValue::setName(std::string name){ + this->name = name; + } + + void VariableValue::setValueLength(int valueLength){ + this->valueLength = valueLength; + } + + void VariableValue::setValue( char * value) { + if(this->value) delete[] value; + this->value = value; + } + void VariableValue::setValue( std::string value ) { + const char *val = value.c_str(); + setValue( val, value.length() ); + } + void VariableValue::setValue( const char *value, int valueLength ) { + this->value = new char[valueLength]; + memcpy( this->value, value, valueLength ); + this->valueLength = valueLength; + } + void VariableValue::setValueFromLong( long value, int bytes ) { + this->valueLength = bytes; + this->value = new char[bytes]; + for(int i = 0 ; i < bytes ; i++) { + this->value[i] = value % 256; + value = value / 256; + } + } + + std::string VariableValue::getName(){ + return name; + } + + int VariableValue::getValueLength(){ + return valueLength; + } + + char* VariableValue::getValue(){ + return value; + } + + long VariableValue::getValueAsLong() { + long intVal = 0; + for(int i = 0 ; i < valueLength ; i++) { + intVal += ((unsigned char)value[i]) * myPow(256,i); + } + return intVal; + } + + long VariableValue::myPow(int x, int y) { + long r = 1; + for(int i = 0 ; i < y ; i++) r *= x; + return r; + } + + int VariableValue::readName(char *packet, int index) { + int read = 0; + int nameLength = packet[index]; + read++; + char* namestr=new char[nameLength+1]; + namestr[nameLength]=0; + memcpy(namestr,packet+index+read,nameLength); + name = string(namestr); + read+=nameLength; + return read; + } + + int VariableValue::readValue(char *packet, int index, int length,int ignoreZeroAfterLength) { + int read = 0; + valueLength = length; + if(valueLength < 0) { + valueLength = (unsigned char)packet[index+read];read++; + if(ignoreZeroAfterLength) read++; + } + + if(value) delete[] value; + value = new char[valueLength]; + memcpy(value,packet+index+read,valueLength); + read+=valueLength; + + return read; + } + +/*TODO: this cant work, attLength is always 0, needs to be fixed*/ +/* int VariableValue::readFixValue(char *packet, int index, int packetLength, int valueLength) { + VariableValue *value = this; + int nameLength = packet[index]; + + int i = 1; + int attLengthLength = 0; + int attLength = 0; + string name; + + for(; i <= nameLength;i++){ + name += packet[index+i]; + } + value->setName(name); + index += i; + index++; //ignore next value + + value->setValueLength(valueLength); + + char *att = new char[attLength]; + index += i+1; + for(i = 0; i < attLength;i++){ + att[i] = packet[index+i]; + } + index += i; + value->setValue(att); + return index; + }*/ + + + int VariableValue::readVariableValue(char *packet, int index, int packetLength){ + VariableValue *value = this; + int nameLength = packet[index]; + + int i = 1; + int attLengthLength = 0; + int attLength = 0; + string name; + + for(; i <= nameLength;i++){ + name += packet[index+i]; + } + value->setName(name); + + index += i; + attLengthLength = packet[index]; + index++; + + for(i = 0; i < attLengthLength;i++){ + attLength += (unsigned char)packet[index+i];/*todo: make it work if length is longer than 1 byte*/ + } + value->setValueLength(attLength); + + char *att = new char[attLength]; + index += i+1; + for(i = 0; i < attLength;i++){ + att[i] = packet[index+i]; + } + value->setValue(att); + index += i; + return index; + } + + + + + int VariableValue::writeName(char *buf, int index) { + int len = name.length(); + buf[index] = len; + memcpy(buf+index+1,name.c_str(),len); + return len+1; + } + int VariableValue::writeValue(char *buf, int index) { + memcpy(buf+index,value,valueLength); + return valueLength; + } + +}; diff --git a/protocols/Xfire/src/variablevalue.h b/protocols/Xfire/src/variablevalue.h new file mode 100644 index 0000000000..8282f47cbf --- /dev/null +++ b/protocols/Xfire/src/variablevalue.h @@ -0,0 +1,65 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <string> + +#ifndef __VARIABVLEVALUE_H +#define __VARIABVLEVALUE_H + +namespace xfirelib { + +class VariableValue { + public: + VariableValue(); + ~VariableValue(); + + void setName(std::string name); + void setValueLength(int valueLength); + void setValue( char * value ); + void setValue( std::string value ); + void setValue( const char *value, int valueLength ); + void setValueFromLong( long value, int bytes ); + std::string getName(); + int getValueLength(); + char* getValue(); + + int readName(char *packet, int index); + int readValue(char *packet, int index, int length = -1, int ignoreZeroAfterLength = 0); + int readVariableValue(char *packet, int index, int packetLength); + /*TODO: disabled because of a bug in this method*/ + //int VariableValue::readFixValue(char *packet, int index, int packetLength, int valueLength); + + int writeName(char *buf, int index); + int writeValue(char *buf, int index); + + long getValueAsLong(); + private: + long myPow(int x, int y); + + std::string name; + char *value; + int valueLength; +}; + +}; + +#endif diff --git a/protocols/Xfire/src/xdebug.h b/protocols/Xfire/src/xdebug.h new file mode 100644 index 0000000000..ffc17b8095 --- /dev/null +++ b/protocols/Xfire/src/xdebug.h @@ -0,0 +1,149 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#ifndef __XDEBUG_H +#define __XDEBUG_H + +#define RESET 0 + +#define BLACK 0 +#define RED 1 +#define GREEN 2 +#define YELLOW 3 +#define WHITE 7 +#include <stdio.h> +//#include <pthread.h> + +//#define XFIRELIBDEBUG + +#ifndef XFIRELIBDEBUG + +#define XDEBUGS(args); +#define XDEBUG(args) ; +#define XDEBUG2(args,args2) ; +#define XDEBUG3(args,args2,args3) ; +#define XDEBUG4(args,args2,args3,args4) ; +#define XDEBUG5(args,args2,args3,args4,args5) ; +#define XDEBUG6(args,args2,args3,args4,args5,args6) ; +#define DUMPPACKET(args) ; + +#define XINFO(args) ; +#define XINFO2(args,args2) ; +#define XINFO3(args,args2,args3) ; + +#define XERROR(args) ; +#define XERROR2(args,args2) ; +#define XERROR3(args,args2,args3) ; + +/*#define DUMP(args,args2) { FILE* errorfile=fopen("C:\\XFireDump.log","a"); \ + fprintf(errorfile,args,args2); \ + fprintf(errorfile,"\n",""); \ + fclose(errorfile); }\*/ + +/*#define XFireLog(args,args2) { FILE* errorfile=fopen("C:\\XFireDump.log","a"); \ + fprintf(errorfile,args,args2); \ + fprintf(errorfile,"\n",""); \ + fclose(errorfile); }\*/ + +/*#define XFireLog(args,args2) { \ + char temp[266]; \ + sprintf(temp,args,args2); \ + MessageBoxA(NULL,temp,temp,0); }\*/ + +#endif + +#ifdef XFIRELIBDEBUG + +#define XDEBUGS(args) { FILE* errorfile=fopen("XFire.log","wb"); \ + fprintf(errorfile,args); \ + fclose(errorfile); }\ + +#define DUMPPACKET(args) { FILE* dumpfile=fopen(args,"wb"); \ + fwrite(buf,length,1,dumpfile); \ + fclose(dumpfile); }\ + + +#define XDEBUG(args) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args); \ + fclose(errorfile); }\ + + #define XDEBUG2(args,args2) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2); \ + fclose(errorfile); } \ + + + #define XDEBUG3(args,args2,args3) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2,args3); \ + fclose(errorfile); } \ + + #define XDEBUG4(args,args2,args3,args4) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2,args3,args4); \ + fclose(errorfile); } \ + + #define XDEBUG5(args,args2,args3,args4,args5) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2,args3,args4,args5); \ + fclose(errorfile); } \ + + #define XDEBUG6(args,args2,args3,args4,args5,args6) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2,args3,args4,args5,args6); \ + fclose(errorfile); } \ + + +#define XINFO(args) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args); \ + fclose(errorfile); }\ + + #define XINFO2(args,args2) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2); \ + fclose(errorfile); } \ + + + #define XINFO3(args,args2,args3) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2,args3); \ + fclose(errorfile); } \ + + +#define XERROR(args) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args); \ + fclose(errorfile); }\ + + #define XERROR2(args,args2) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2); \ + fclose(errorfile); } \ + + + #define XERROR3(args,args2,args3) { FILE* errorfile=fopen("XFire.log","a"); \ + fprintf(errorfile,args,args2,args3); \ + fclose(errorfile); } \ + + + + + + + + + +#endif +#endif
\ No newline at end of file diff --git a/protocols/Xfire/src/xfireclanpacket.cpp b/protocols/Xfire/src/xfireclanpacket.cpp new file mode 100644 index 0000000000..c26577fae1 --- /dev/null +++ b/protocols/Xfire/src/xfireclanpacket.cpp @@ -0,0 +1,79 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xfireclanpacket.h" +#include "variablevalue.h" +#include <string> + +namespace xfirelib { + using namespace std; + + void XFireClanPacket::parseContent(char *buf, int nlength, int numberOfAtts) { + VariableValue val; + int index = 0; + int length = 0; + string stringvalue; + + index += 3; // ersten 5 bytes skippen + + this->count=(char)buf[index]; + + index += 2; + + for(int i=0;i<this->count;i++) + { + index += val.readValue(buf,index,2); //clanid lesen + this->clanid[i] = val.getValueAsLong(); + index += 2; + } + + index += 5; // 7 bytes skippen + + for(int i=0;i<this->count;i++) + { + length = (unsigned char)buf[index++]; //clannamen lesen + index++; + index += val.readValue(buf,index,length); + stringvalue = string(val.getValue(),length); + + this->name[i] = stringvalue; + } + + index += 5; // 5 skippen + + for(int i=0;i<this->count;i++) + { + length = (unsigned char)buf[index++]; //url anhängsel auslesen + index++; + index += val.readValue(buf,index,length); + stringvalue = string(val.getValue(),length); + + this->url[i] = stringvalue; + } + + } + +}; diff --git a/protocols/Xfire/src/xfireclanpacket.h b/protocols/Xfire/src/xfireclanpacket.h new file mode 100644 index 0000000000..7e5b1bc843 --- /dev/null +++ b/protocols/Xfire/src/xfireclanpacket.h @@ -0,0 +1,63 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XFIRECLANPACKET_H +#define __XFIRECLANPACKET_H + +#include <string> +#include "xfirerecvpacketcontent.h" + +#define XFIRE_CLAN_PACKET 158 + +namespace xfirelib { + using namespace std; + + /** + * beinhaltet, clanid, name und weburl-zusatz + * + */ + class XFireClanPacket : public XFireRecvPacketContent { + public: + XFirePacketContent* newPacket() { return new XFireClanPacket(); } + + + int getPacketId() { return XFIRE_CLAN_PACKET; } + int getPacketContent(char *buf) { return 0;} + int getPacketAttributeCount() { return 3; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + string name[10]; + string url[10]; + long clanid[10]; + int count; + + private: + }; + +}; + + +#endif + diff --git a/protocols/Xfire/src/xfirefoundbuddys.cpp b/protocols/Xfire/src/xfirefoundbuddys.cpp new file mode 100644 index 0000000000..dacae8f885 --- /dev/null +++ b/protocols/Xfire/src/xfirefoundbuddys.cpp @@ -0,0 +1,92 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include <vector> +#include <string> + +#include "xfirefoundbuddys.h" +#include "xfireparse.h" +#include "variablevalue.h" +#include "xdebug.h" + +namespace xfirelib { + using namespace std; + + XFireFoundBuddys::XFireFoundBuddys() { + usernames = 0; + fname = 0; + lname = 0; + } + XFireFoundBuddys::~XFireFoundBuddys() { + delete usernames; + delete fname; + delete lname; + } + + void XFireFoundBuddys::parseContent(char *buf, int length, int numberOfAtts) { + int index = 0; + + VariableValue bs; + + XDEBUG2( "Len: %ld\n", length ); + + XDEBUG2( "Byte1: %ld\n", (char)buf[index] ); + XDEBUG2( "Byte2: %ld\n", (char)buf[index+1] ); + XDEBUG2( "Byte3: %ld\n", (char)buf[index+2] ); + + usernames = new vector<string>; + index = readStrings(usernames,buf,index); + + fname = new vector<string>; + index = readStrings(fname,buf,index); + + lname = new vector<string>; + index = readStrings(lname,buf,index); + + } + + int XFireFoundBuddys::readStrings(vector<string> *strings, char *buf, int index) { + VariableValue friends; + index+=friends.readName(buf,index); + index ++; // Ignore 04 + index ++; // Ignore 01 + + index+=friends.readValue(buf,index,2); + + int numberOfStrings = friends.getValueAsLong(); + XDEBUG3( "name: %s numberOfStrings: %d\n", friends.getName().c_str(), numberOfStrings ); + for(int i = 0 ; i < numberOfStrings ; i++) { + XDEBUG2( "Index: %ld\n", index ); + int length = (unsigned char)buf[index++]; + index++; + index += friends.readValue(buf,index,length); + string stringvalue = string(friends.getValue(),length); + strings->push_back(stringvalue); + XDEBUG3( "String length: %2d : %s\n", length, stringvalue.c_str() ); + } + return index; + } + +}; diff --git a/protocols/Xfire/src/xfirefoundbuddys.h b/protocols/Xfire/src/xfirefoundbuddys.h new file mode 100644 index 0000000000..70d44f201b --- /dev/null +++ b/protocols/Xfire/src/xfirefoundbuddys.h @@ -0,0 +1,65 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +//packet wird empfangen, wenn man eine buddysuche gestartet hat + +#ifndef __XFIREFOUNDBUDDYS_H +#define __XFIREFOUNDBUDDYS_H + +#define XFIRE_FOUNDBUDDYS_ID 0x8f + +#include <vector> +#include <string> + +#include "xfirerecvpacketcontent.h" +#include "variablevalue.h" + + +namespace xfirelib { + using namespace std; + + class XFireFoundBuddys : public XFireRecvPacketContent { + public: + XFireFoundBuddys(); + virtual ~XFireFoundBuddys(); + + XFirePacketContent* newPacket() { return new XFireFoundBuddys(); } + + int getPacketId() { return XFIRE_FOUNDBUDDYS_ID; } + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; }; + int getPacketSize() { return 1024; }; + void parseContent(char *buf, int length, int numberOfAtts); + + //private: + int readStrings(vector<string> *strings, char *buf, int index); + + vector<string> *usernames; + vector<string> *fname; + vector<string> *lname; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/xfiregame.cpp b/protocols/Xfire/src/xfiregame.cpp new file mode 100644 index 0000000000..e9b0e869bf --- /dev/null +++ b/protocols/Xfire/src/xfiregame.cpp @@ -0,0 +1,27 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xfiregame.h" + + diff --git a/protocols/Xfire/src/xfiregame.h b/protocols/Xfire/src/xfiregame.h new file mode 100644 index 0000000000..b8293750ad --- /dev/null +++ b/protocols/Xfire/src/xfiregame.h @@ -0,0 +1,42 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef __XFIREGAME_H +#define __XFIREGAME_H + +#include <string> + +namespace xfirelib { + + class XFireGame { + public: + virtual ~XFireGame() { } + virtual int getGameId() = 0; + virtual std::string getGameName() = 0; + }; + + +}; + + +#endif diff --git a/protocols/Xfire/src/xfiregameresolver.cpp b/protocols/Xfire/src/xfiregameresolver.cpp new file mode 100644 index 0000000000..af7b67f799 --- /dev/null +++ b/protocols/Xfire/src/xfiregameresolver.cpp @@ -0,0 +1,27 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xfiregameresolver.h" + + diff --git a/protocols/Xfire/src/xfiregameresolver.h b/protocols/Xfire/src/xfiregameresolver.h new file mode 100644 index 0000000000..1215550009 --- /dev/null +++ b/protocols/Xfire/src/xfiregameresolver.h @@ -0,0 +1,52 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XFIREGAMERESOLVER_H +#define __XFIREGAMERESOLVER_H + +#include "buddylistgamespacket.h" +#include "xfiregame.h" +#include <string> + +namespace xfirelib { + /** + * This is a virtual class which users of the library can + * subclass so they can use their own gameid <-> XFireGame object + * resolver (Implementors might want to consider that their application + * also requires backward converting .. from game to gameid since + * SendGameStatusPacket requires a gameid. + */ + class XFireGameResolver { + public: + virtual ~XFireGameResolver() { } + + /** + * this method should resolve the gameid + * and return a new XFireGame object or NULL if it was not resolvable. + * (if more information is needed, it can be taken from packet->xxx[iterator]) + */ + virtual XFireGame *resolveGame(int gameid, int iterator, BuddyListGamesPacket *packet) = 0; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/xfirepacket.cpp b/protocols/Xfire/src/xfirepacket.cpp new file mode 100644 index 0000000000..955881863f --- /dev/null +++ b/protocols/Xfire/src/xfirepacket.cpp @@ -0,0 +1,145 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include <iostream> +#include <stdlib.h> +#include <string.h> +#include "xfirepacket.h" + +#include "xdebug.h" + +#include "socketexception.h" + +namespace xfirelib { + using namespace std; + + XFirePacket::XFirePacket(PacketReader *reader) { + this->reader = reader; + this->content = NULL; + } + XFirePacket::XFirePacket(XFirePacketContent *content) { + this->content = content; + this->reader = NULL; + } + + XFirePacket::~XFirePacket() { + } + + + void XFirePacket::recvPacket(Socket *socket) { + char buf[5]; + //char temp[255]; + int nlen=0; + //FILE* f2; + + if(socket==NULL) return; + + int r = socket->recv( buf, 5 ); + int missingbytes=5-r; + if(missingbytes != 0) { + XERROR3("Returned only %d bytes try last %d bytes again ?!: \n",r,missingbytes); + r+= socket->recv( &buf[r], missingbytes ); + } + if(r != 5) { + XERROR2("Returned less than 5 ?!: %d\n",r); + throw SocketException("Connection Closed ?"); + } + XDEBUG2("Read %d bytes ...\n", r ); + unsigned int len = ((unsigned char)buf[0]) + (((unsigned char)buf[1]) * 256); + + int packetid = buf[2]; + int numberOfAtts = (unsigned char)buf[4]; + + char* contentbuf=new char[len-5]; + XDEBUG2("calling socket->recv(contentbuf,%d)\n",len-5); + int r2 = socket->recv( contentbuf, len-5 ); + + + char* ncontentbuf=contentbuf+r2; + int nsize=len-5-r2; + int dummyi=0; + //packet solang auslesen, bis fertig - dufte + while(nsize>0) + { + dummyi++; + XDEBUG2("nsize: %d\n", nsize); + r2=socket->recv( ncontentbuf, nsize ); + ncontentbuf=ncontentbuf+r2; + nsize-=r2; + XDEBUG5("packetid: %d numberOfAtts: %d length: %d Got: %d\n", (unsigned char)packetid,numberOfAtts,len-5,len-5-nsize); + } + + XDEBUG5("packetid: %d numberOfAtts: %d length: %d Got: %d\n", (unsigned char)packetid,numberOfAtts,len-5,r2); + + if(r2 < 1) return; + + /*if((unsigned char)packetid==131) + { + sprintf(temp,"packet%d_%d.dmp",(unsigned char)packetid,rand()); + f2=fopen(temp,"wb"); + fwrite(contentbuf,1,len-5,f2); + fclose(f2); + }*/ + + XFirePacketContent *contentClass = reader->getPacketContentClass( (unsigned char)packetid ); + + //sprintf(temp,"packet%d.dmp",(unsigned char)packetid); + + if(contentClass == NULL) { + /*sprintf(temp,"packet%d.dmp",(unsigned char)packetid); + f2=fopen(temp,"wb"); + fwrite(contentbuf,1,len-5,f2); + fclose(f2);*/ + XERROR2("NO SUCH CONTENT PACKET (%d) :(\n", (unsigned char)packetid); + return; + } + XDEBUG(("Creating ContentClass Instance\n")); + content = contentClass->newPacket(); + + XDEBUG(("Parse Content\n")); + //statt r2 wird jetzt die komplette länge des packets genommen, also len-5 dufte + content->parseContent(contentbuf, len-5, numberOfAtts); + } + + void XFirePacket::sendPacket(Socket *socket) { + int size = content->getPacketSize(); + char *buf = (char*)malloc(size * sizeof(char)); + XDEBUG3("Allocated %d characters (%d)\n", size, sizeof(char)); + int rsize = content->getPacketContent( buf ); + XDEBUG2("Real Size: %d\n", rsize); + int realsize = rsize + 5; + char *sendbuf = (char*)malloc(realsize * sizeof(char)); + sendbuf[0] = realsize % 256; + sendbuf[1] = (int)realsize / 256; + sendbuf[2] = content->getPacketId(); + XDEBUG2("Send Content Id: %d\n", content->getPacketId()); + sendbuf[3] = 0; + sendbuf[4] = content->getPacketAttributeCount(); + memcpy( sendbuf + 5, buf, rsize ); + + socket->send( sendbuf, realsize ); + + free(buf); free(sendbuf); + } +}; diff --git a/protocols/Xfire/src/xfirepacket.h b/protocols/Xfire/src/xfirepacket.h new file mode 100644 index 0000000000..c7b938e2f9 --- /dev/null +++ b/protocols/Xfire/src/xfirepacket.h @@ -0,0 +1,53 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XFIREPACKET_H +#define __XFIREPACKET_H + +#include "packetreader.h" +#include "xfirepacketcontent.h" + +namespace xfirelib { + struct PacketReader; + struct XFirePacketContent; + + class XFirePacket { + public: + XFirePacket(PacketReader *reader); + XFirePacket(XFirePacketContent *content); + ~XFirePacket(); + + int getSendBuffer(void *buf); + void recvPacket(Socket *socket); + void sendPacket(Socket *socket); + void sendPacket2(Socket *socket); + + XFirePacketContent *getContent() { return content; } + private: + PacketReader *reader; + + XFirePacketContent *content; + }; +}; + + +#endif diff --git a/protocols/Xfire/src/xfirepacketcontent.cpp b/protocols/Xfire/src/xfirepacketcontent.cpp new file mode 100644 index 0000000000..87a7778357 --- /dev/null +++ b/protocols/Xfire/src/xfirepacketcontent.cpp @@ -0,0 +1,30 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "stdafx.h" + +#include "xfirepacketcontent.h" + +namespace xfirelib { + XFirePacketContent::XFirePacketContent() : MonitoredObj( ) { + } + +}; diff --git a/protocols/Xfire/src/xfirepacketcontent.h b/protocols/Xfire/src/xfirepacketcontent.h new file mode 100644 index 0000000000..abb894f5fc --- /dev/null +++ b/protocols/Xfire/src/xfirepacketcontent.h @@ -0,0 +1,47 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XFIREPACKETCONTENT_H +#define __XFIREPACKETCONTENT_H + +#include "monitoredobj.h" + +namespace xfirelib { + struct Client; + + class XFirePacketContent : public MonitoredObj { + public: + XFirePacketContent(); + virtual ~XFirePacketContent() { } + virtual XFirePacketContent* newPacket() = 0; + + virtual int getPacketContent(char *buf) = 0; + virtual int getPacketId() = 0; + virtual int getPacketAttributeCount() = 0; + virtual int getPacketSize() = 0; + virtual void parseContent(char *buf, int length, int numberOfAtts) = 0; + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/xfireparse.cpp b/protocols/Xfire/src/xfireparse.cpp new file mode 100644 index 0000000000..e286e14df0 --- /dev/null +++ b/protocols/Xfire/src/xfireparse.cpp @@ -0,0 +1,49 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xfireparse.h" +namespace xfirelib { + +using namespace std; + +XFireParse::XFireParse() { +} + + +/*void XFireParse::readVariableAttribut( char *value, char *packet, char *attr,int packet_length,int attr_length, int start,int max_length ) { +int length_index = findString2(packet,attr, packet_length,strlen(attr),start)+attr_length+1; + + unsigned int length = xfire_hex_to_intC(packet[length_index]); + + if(max_length >= length){ + memcpy(value,packet+length_index+2,length); + } + if(max_length > length){ + memset(value+length,0,1); + } + return length_index+2+length; +}*/ + + +}; diff --git a/protocols/Xfire/src/xfireparse.h b/protocols/Xfire/src/xfireparse.h new file mode 100644 index 0000000000..e03e814a6e --- /dev/null +++ b/protocols/Xfire/src/xfireparse.h @@ -0,0 +1,37 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +#ifndef __XFIREPARSE_H +#define __XFIREPARSE_H +#include "variablevalue.h" +namespace xfirelib { + +class XFireParse { + public: + XFireParse(); +}; + +}; + +#endif diff --git a/protocols/Xfire/src/xfireprefpacket.cpp b/protocols/Xfire/src/xfireprefpacket.cpp new file mode 100644 index 0000000000..6afc613fed --- /dev/null +++ b/protocols/Xfire/src/xfireprefpacket.cpp @@ -0,0 +1,50 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" +#include "xfireprefpacket.h" +#include <string.h> +#include <iostream> + +namespace xfirelib { + using namespace std; + + int XFirePrefPacket::getPacketContent(char *packet) { + int index = 0; + + VariableValue val; + val.setName( "prefs" ); + index += val.writeName( packet, index ); + packet[index++] = 0x09; + packet[index++] = 0x00; + + length = index; + return index; + } + + int XFirePrefPacket::getPacketAttributeCount() { + return 1; + } + +} diff --git a/protocols/Xfire/src/xfireprefpacket.h b/protocols/Xfire/src/xfireprefpacket.h new file mode 100644 index 0000000000..f4e1709357 --- /dev/null +++ b/protocols/Xfire/src/xfireprefpacket.h @@ -0,0 +1,52 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * dufte <dufte@justmail.de> + * + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +//prefrencespacket, steuert wohl die persönlichen einstellungen + +#ifndef __XFIREPREFPACKET_H +#define __XFIREPREFPACKET_H + +#include "xfiresendpacketcontent.h" +#include "variablevalue.h" + +#include <string> + +namespace xfirelib { + + class XFirePrefPacket : public XFireSendPacketContent { + public: + XFirePacketContent* newPacket() { return new XFirePrefPacket(); } + + int getPacketId() { return 10; } + int getPacketContent(char *buf); + int getPacketAttributeCount(); + int getPacketSize() { return 1000; }; + void parseContent(char *buf, int length, int numberOfAtts) { }; + private: + int length; + }; + +}; + +#endif diff --git a/protocols/Xfire/src/xfirerecvpacketcontent.cpp b/protocols/Xfire/src/xfirerecvpacketcontent.cpp new file mode 100644 index 0000000000..5abc70aa6b --- /dev/null +++ b/protocols/Xfire/src/xfirerecvpacketcontent.cpp @@ -0,0 +1,26 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xfirerecvpacketcontent.h" + diff --git a/protocols/Xfire/src/xfirerecvpacketcontent.h b/protocols/Xfire/src/xfirerecvpacketcontent.h new file mode 100644 index 0000000000..2ca2aca424 --- /dev/null +++ b/protocols/Xfire/src/xfirerecvpacketcontent.h @@ -0,0 +1,45 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef __XFIRERECVPACKETCONTENT_H +#define __XFIRERECVPACKETCONTENT_H + +#include "xfirepacketcontent.h" + +namespace xfirelib { + + class XFireRecvPacketContent : public XFirePacketContent { + public: + XFireRecvPacketContent() : XFirePacketContent() { } + virtual ~XFireRecvPacketContent() { } + + int getPacketContent(char *buf) { return 0; } + int getPacketAttributeCount() { return 0; } + int getPacketSize() { return 0; } + }; + +}; + + +#endif + diff --git a/protocols/Xfire/src/xfiresendpacketcontent.cpp b/protocols/Xfire/src/xfiresendpacketcontent.cpp new file mode 100644 index 0000000000..b743092973 --- /dev/null +++ b/protocols/Xfire/src/xfiresendpacketcontent.cpp @@ -0,0 +1,27 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xfiresendpacketcontent.h" + + diff --git a/protocols/Xfire/src/xfiresendpacketcontent.h b/protocols/Xfire/src/xfiresendpacketcontent.h new file mode 100644 index 0000000000..7ce106d295 --- /dev/null +++ b/protocols/Xfire/src/xfiresendpacketcontent.h @@ -0,0 +1,43 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef __XFIRESENDPACKETCONTENT_H +#define __XFIRESENDPACKETCONTENT_H + +#include "xfirepacketcontent.h" + +namespace xfirelib { + + class XFireSendPacketContent : public XFirePacketContent { + public: + /** + * This method is not needed for outgoing packets.. since this method is only + * used for parsing .. so return null + */ + XFirePacketContent *newPacket() { return 0; } + void parseContent(char *buf, int length, int numberOfAtts) { } + }; + +}; + + +#endif diff --git a/protocols/Xfire/src/xfireutils.cpp b/protocols/Xfire/src/xfireutils.cpp new file mode 100644 index 0000000000..5df7ba314b --- /dev/null +++ b/protocols/Xfire/src/xfireutils.cpp @@ -0,0 +1,44 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "stdafx.h" + +#include "xdebug.h" +#include <string.h> +#include <iostream> +#include "xfireutils.h" + + +namespace xfirelib { + +using namespace std; + + XFireUtils::XFireUtils() { + } + + int XFireUtils::addAttributName(char *packet,int packet_length, char *att){ + XDEBUG3( "Adding %d chars at position %d\n",strlen(att),packet_length); + packet[packet_length] = (char)strlen(att);//set att length + memcpy(packet+packet_length+1,att,strlen(att)); //set attname + return packet_length+1+strlen(att); + } +}; diff --git a/protocols/Xfire/src/xfireutils.h b/protocols/Xfire/src/xfireutils.h new file mode 100644 index 0000000000..a149b27a63 --- /dev/null +++ b/protocols/Xfire/src/xfireutils.h @@ -0,0 +1,40 @@ +/* + * xfirelib - C++ Library for the xfire protocol. + * Copyright (C) 2006 by + * Beat Wolf <asraniel@fryx.ch> / http://gfire.sf.net + * Herbert Poul <herbert.poul@gmail.com> / http://goim.us + * http://xfirelib.sphene.net + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef __XFIREUTILS_H +#define __XFIREUTILS_H + +namespace xfirelib { + +class XFireUtils { + public: + XFireUtils(); + /** + *Adds the name of a attribute with its length to the packet + */ + static int addAttributName(char *packet,int packet_length, char *att); +}; + +}; + +#endif |