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