/* * Copyright 2025, Andrew Lindesay . * All rights reserved. Distributed under the terms of the MIT License. */ #include "PackageIconDefaultRepository.h" #include #include "Logger.h" static const int32 kCacheLimit = 50; PackageIconDefaultRepository::PackageIconDefaultRepository() : fVectorData(NULL), fVectorDataSize(0), fCache(kCacheLimit) { _InitDefaultVectorIcon(); } PackageIconDefaultRepository::~PackageIconDefaultRepository() { delete fVectorData; } status_t PackageIconDefaultRepository::GetIcon(const BString& pkgName, uint32 size, BitmapHolderRef& bitmapHolderRef) { if (fVectorData == NULL) return B_NOT_INITIALIZED; bitmapHolderRef.Unset(); status_t status = B_OK; HashString key(BString() << size); if (!fCache.ContainsKey(key)) { BBitmap* bitmap = NULL; if (status == B_OK) { bitmap = new BBitmap(BRect(0, 0, size - 1, size - 1), 0, B_RGBA32); status = bitmap->InitCheck(); } if (status == B_OK) status = BIconUtils::GetVectorIcon(fVectorData, fVectorDataSize, bitmap); if (status == B_OK) { HDINFO("did create default package icon size %" B_PRId32, size); BitmapHolderRef bitmapHolder(new(std::nothrow) BitmapHolder(bitmap), true); fCache.Put(key, bitmapHolder); } else { delete bitmap; bitmap = NULL; } } if (status == B_OK) bitmapHolderRef.SetTo(fCache.Get(key).Get()); else HDERROR("failed to create default package icon size %" B_PRId32, size); return status; } void PackageIconDefaultRepository::_InitDefaultVectorIcon() { if (fVectorData != NULL) { delete fVectorData; fVectorData = NULL; } fVectorDataSize = 0; BMimeType mimeType("application/x-vnd.haiku-package"); status_t status = mimeType.InitCheck(); if (status != B_OK) return; uint8* data; size_t dataSize; if (mimeType.GetIcon(&data, &dataSize) != B_OK) debugger("the default icon was unable to be acquired"); fVectorData = new(std::nothrow) uint8[dataSize]; if (fVectorData == NULL) HDFATAL("unable to allocate memory for the default icon"); memcpy(fVectorData, data, dataSize); fVectorDataSize = dataSize; }