1 /* 2 * Copyright 2020-2021, Andrew Lindesay <apl@lindesay.co.nz>. 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5 #ifndef PACKAGE_ICON_TAR_REPOSITORY_H 6 #define PACKAGE_ICON_TAR_REPOSITORY_H 7 8 9 #include <DataIO.h> 10 #include <HashMap.h> 11 #include <HashString.h> 12 #include <Locker.h> 13 #include <Path.h> 14 #include <Referenceable.h> 15 16 #include "IconTarPtr.h" 17 #include "LRUCache.h" 18 #include "PackageIconRepository.h" 19 20 typedef BReference<IconTarPtr> IconTarPtrRef; 21 22 23 class PackageIconTarRepository : public PackageIconRepository { 24 public: 25 PackageIconTarRepository(); 26 virtual ~PackageIconTarRepository(); 27 28 status_t Init(BPath& tarPath); 29 30 void AddIconTarPtr(const BString& pkgName, 31 BitmapSize size, off_t offset); 32 virtual status_t GetIcon(const BString& pkgName, BitmapSize size, 33 BitmapRef& bitmap); 34 virtual bool HasAnyIcon(const BString& pkgName); 35 virtual void Clear(); 36 37 static void CleanupDefaultIcon(); 38 39 private: 40 void _Close(); 41 42 const char* _ToIconCacheKeySuffix(BitmapSize size); 43 const HashString _ToIconCacheKey(const BString& pkgName, 44 BitmapSize size); 45 46 IconTarPtrRef _GetOrCreateIconTarPtr(const BString& pkgName); 47 IconTarPtrRef _GetIconTarPtr(const BString& pkgName) const; 48 49 status_t _CreateIconFromTarOffset(off_t offset, 50 BitmapRef& bitmap); 51 52 static off_t _OffsetToBestRepresentation( 53 const IconTarPtrRef iconTarPtrRef, 54 BitmapSize desiredSize, 55 BitmapSize* actualSize); 56 57 private: 58 BLocker fLock; 59 BPositionIO* fTarIo; 60 LRUCache<HashString, BitmapRef> 61 fIconCache; 62 HashMap<HashString, IconTarPtrRef> 63 fIconTarPtrs; 64 65 static BitmapRef sDefaultIcon; 66 }; 67 68 #endif // PACKAGE_ICON_TAR_REPOSITORY_H 69