summaryrefslogtreecommitdiff
path: root/protocols/Xfire/src/Xfire_icon_mng.cpp
blob: b469e44595fedd055b2b70a0f9fa8eb14dd252ad (plain)
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
#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 = LoadLibraryA(path);
	}

	//dll konnte geladen werden
	if (hIconDll) {
		char resourcename[255];
		//kurznamen des spiels uppercasen und .ICO anhängen
		mir_snprintf(resourcename, SIZEOF(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;
}