xref: /haiku/src/apps/pairs/Pairs.cpp (revision 97e1b053b63ba10e037388a4e21bcb93a3220210)
169e62e48SStephan Aßmus /*
24c587adeSStephan Aßmus  * Copyright 2008 Ralf Schülke, ralf.schuelke@googlemail.com.
3c6b0a589SJohn Scipione  * Copyright 2014 Haiku, Inc. All rights reserved.
4c6b0a589SJohn Scipione  *
5c6b0a589SJohn Scipione  * Distributed under the terms of the MIT License.
6c6b0a589SJohn Scipione  *
7c6b0a589SJohn Scipione  * Authors:
8c6b0a589SJohn Scipione  *		John Scipione, jscipione@gmail.com
969e62e48SStephan Aßmus  */
1069e62e48SStephan Aßmus 
11c6b0a589SJohn Scipione 
12c6b0a589SJohn Scipione #include "Pairs.h"
13c6b0a589SJohn Scipione 
1469e62e48SStephan Aßmus #include <stdlib.h>
1569e62e48SStephan Aßmus 
16*97e1b053SJohn Scipione #include <Alert.h>
1784df7867SAdrien Destugues #include <Catalog.h>
18*97e1b053SJohn Scipione #include <MimeType.h>
1969e62e48SStephan Aßmus 
2069e62e48SStephan Aßmus #include "PairsWindow.h"
2169e62e48SStephan Aßmus 
22c6b0a589SJohn Scipione 
23*97e1b053SJohn Scipione #undef B_TRANSLATION_CONTEXT
24*97e1b053SJohn Scipione #define B_TRANSLATION_CONTEXT "Pairs"
25*97e1b053SJohn Scipione 
26*97e1b053SJohn Scipione 
27f3f9e93aSRyan Leavengood const char* kSignature = "application/x-vnd.Haiku-Pairs";
2869e62e48SStephan Aßmus 
29*97e1b053SJohn Scipione static const size_t kMinIconCount = 64;
30*97e1b053SJohn Scipione static const size_t kMaxIconCount = 384;
31*97e1b053SJohn Scipione 
3269e62e48SStephan Aßmus 
33c6b0a589SJohn Scipione //	#pragma mark - Pairs
34c6b0a589SJohn Scipione 
35c6b0a589SJohn Scipione 
3669e62e48SStephan Aßmus Pairs::Pairs()
374c587adeSStephan Aßmus 	:
384c587adeSStephan Aßmus 	BApplication(kSignature),
3969e62e48SStephan Aßmus 	fWindow(NULL)
4069e62e48SStephan Aßmus {
41*97e1b053SJohn Scipione 	_GetVectorIcons();
4269e62e48SStephan Aßmus }
4369e62e48SStephan Aßmus 
4469e62e48SStephan Aßmus 
4569e62e48SStephan Aßmus Pairs::~Pairs()
4669e62e48SStephan Aßmus {
4769e62e48SStephan Aßmus }
4869e62e48SStephan Aßmus 
4969e62e48SStephan Aßmus 
5069e62e48SStephan Aßmus void
5169e62e48SStephan Aßmus Pairs::ReadyToRun()
5269e62e48SStephan Aßmus {
5369e62e48SStephan Aßmus 	fWindow = new PairsWindow();
5469e62e48SStephan Aßmus 	fWindow->Show();
5569e62e48SStephan Aßmus }
5669e62e48SStephan Aßmus 
5769e62e48SStephan Aßmus 
5869e62e48SStephan Aßmus void
5969e62e48SStephan Aßmus Pairs::RefsReceived(BMessage* message)
6069e62e48SStephan Aßmus {
6169e62e48SStephan Aßmus 	fWindow->PostMessage(message);
6269e62e48SStephan Aßmus }
6369e62e48SStephan Aßmus 
6469e62e48SStephan Aßmus 
6569e62e48SStephan Aßmus void
6669e62e48SStephan Aßmus Pairs::MessageReceived(BMessage* message)
6769e62e48SStephan Aßmus {
6869e62e48SStephan Aßmus 	BApplication::MessageReceived(message);
6969e62e48SStephan Aßmus }
7069e62e48SStephan Aßmus 
7169e62e48SStephan Aßmus 
72*97e1b053SJohn Scipione bool
73*97e1b053SJohn Scipione Pairs::QuitRequested()
74*97e1b053SJohn Scipione {
75*97e1b053SJohn Scipione 	// delete vector icons
76*97e1b053SJohn Scipione 	for (IconMap::iterator iter = fIconMap.begin(); iter != fIconMap.end();
77*97e1b053SJohn Scipione 			++iter) {
78*97e1b053SJohn Scipione 		delete fIconMap[iter->first];
79*97e1b053SJohn Scipione 	}
80*97e1b053SJohn Scipione 
81*97e1b053SJohn Scipione 	return true;
82*97e1b053SJohn Scipione }
83*97e1b053SJohn Scipione 
84*97e1b053SJohn Scipione 
85*97e1b053SJohn Scipione //	#pragma mark - Pairs private methods
86*97e1b053SJohn Scipione 
87*97e1b053SJohn Scipione 
88*97e1b053SJohn Scipione void
89*97e1b053SJohn Scipione Pairs::_GetVectorIcons()
90*97e1b053SJohn Scipione {
91*97e1b053SJohn Scipione 	// Load vector icons from the MIME type database and add a pointer to them
92*97e1b053SJohn Scipione 	// into a std::map keyed by a generated hash.
93*97e1b053SJohn Scipione 
94*97e1b053SJohn Scipione 	BMessage types;
95*97e1b053SJohn Scipione 	if (BMimeType::GetInstalledTypes("application", &types) != B_OK)
96*97e1b053SJohn Scipione 		return;
97*97e1b053SJohn Scipione 
98*97e1b053SJohn Scipione 	const char* type;
99*97e1b053SJohn Scipione 	for (int32 i = 0; types.FindString("types", i, &type) == B_OK; i++) {
100*97e1b053SJohn Scipione 		BMimeType mimeType(type);
101*97e1b053SJohn Scipione 		if (mimeType.InitCheck() != B_OK)
102*97e1b053SJohn Scipione 			continue;
103*97e1b053SJohn Scipione 
104*97e1b053SJohn Scipione 		uint8* data;
105*97e1b053SJohn Scipione 		size_t size;
106*97e1b053SJohn Scipione 
107*97e1b053SJohn Scipione 		if (mimeType.GetIcon(&data, &size) != B_OK) {
108*97e1b053SJohn Scipione 			// didn't find an icon
109*97e1b053SJohn Scipione 			continue;
110*97e1b053SJohn Scipione 		}
111*97e1b053SJohn Scipione 
112*97e1b053SJohn Scipione 		size_t hash = 0xdeadbeef;
113*97e1b053SJohn Scipione 		for (size_t i = 0; i < size; i++)
114*97e1b053SJohn Scipione 			hash = 31 * hash + data[i];
115*97e1b053SJohn Scipione 
116*97e1b053SJohn Scipione 		if (fIconMap.find(hash) != fIconMap.end()) {
117*97e1b053SJohn Scipione 			// key has already been added to the map
118*97e1b053SJohn Scipione 			delete[] data;
119*97e1b053SJohn Scipione 			continue;
120*97e1b053SJohn Scipione 		}
121*97e1b053SJohn Scipione 
122*97e1b053SJohn Scipione 		vector_icon* icon = (vector_icon*)malloc(sizeof(vector_icon));
123*97e1b053SJohn Scipione 		if (icon == NULL) {
124*97e1b053SJohn Scipione 			delete[] data;
125*97e1b053SJohn Scipione 			free(icon);
126*97e1b053SJohn Scipione 			continue;
127*97e1b053SJohn Scipione 		}
128*97e1b053SJohn Scipione 
129*97e1b053SJohn Scipione 		icon->data = data;
130*97e1b053SJohn Scipione 		icon->size = size;
131*97e1b053SJohn Scipione 
132*97e1b053SJohn Scipione 		// found a vector icon, add it to the list
133*97e1b053SJohn Scipione 		fIconMap[hash] = icon;
134*97e1b053SJohn Scipione 		if (fIconMap.size() >= kMaxIconCount) {
135*97e1b053SJohn Scipione 			// this is enough to choose from, stop eating memory...
136*97e1b053SJohn Scipione 			return;
137*97e1b053SJohn Scipione 		}
138*97e1b053SJohn Scipione 	}
139*97e1b053SJohn Scipione 
140*97e1b053SJohn Scipione 	if (fIconMap.size() < kMinIconCount) {
141*97e1b053SJohn Scipione 		char buffer[512];
142*97e1b053SJohn Scipione 		snprintf(buffer, sizeof(buffer),
143*97e1b053SJohn Scipione 			B_TRANSLATE_COMMENT("Pairs did not find enough vector icons "
144*97e1b053SJohn Scipione 			"to start; it needs at least %zu, found %zu.\n",
145*97e1b053SJohn Scipione 			"Don't translate \"%zu\", but make sure to keep them."),
146*97e1b053SJohn Scipione 			kMinIconCount, fIconMap.size());
147*97e1b053SJohn Scipione 		BString messageString(buffer);
148*97e1b053SJohn Scipione 		BAlert* alert = new BAlert("Fatal", messageString.String(),
149*97e1b053SJohn Scipione 			B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_FROM_WIDEST,
150*97e1b053SJohn Scipione 			B_STOP_ALERT);
151*97e1b053SJohn Scipione 		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
152*97e1b053SJohn Scipione 		alert->Go();
153*97e1b053SJohn Scipione 		exit(1);
154*97e1b053SJohn Scipione 	}
155*97e1b053SJohn Scipione }
156*97e1b053SJohn Scipione 
157*97e1b053SJohn Scipione 
158c6b0a589SJohn Scipione //	#pragma mark - main
159c6b0a589SJohn Scipione 
160c6b0a589SJohn Scipione 
16169e62e48SStephan Aßmus int
16269e62e48SStephan Aßmus main(void)
16369e62e48SStephan Aßmus {
16469e62e48SStephan Aßmus 	Pairs pairs;
16569e62e48SStephan Aßmus 	pairs.Run();
16669e62e48SStephan Aßmus 
16769e62e48SStephan Aßmus 	return 0;
16869e62e48SStephan Aßmus }
169