1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
|
#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 > 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 = LoadLibraryA(path);
}
//dll konnte geladen werden
if (hIconDll) {
char resourcename[255];
//kurznamen des spiels uppercasen und .ICO anhängen
mir_snprintf(resourcename, "XF_%s.ICO", shortname);
Xfire_base::strtoupper(resourcename);
//versuche die resource zufinden
HRSRC hrsrc = FindResourceA(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 (!db_get_b(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;
}
|