/* * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #include "PackageFileManager.h" #include #include #include "DebugSupport.h" #include "Package.h" PackageFileManager::PackageFileManager(BLocker& lock) : fLock(lock), fFilesByEntryRef() { } PackageFileManager::~PackageFileManager() { } status_t PackageFileManager::Init() { return fFilesByEntryRef.Init(); } status_t PackageFileManager::GetPackageFile(const entry_ref& entryRef, PackageFile*& _file) { AutoLocker locker(fLock); PackageFile* file = fFilesByEntryRef.Lookup(entryRef); if (file != NULL) { if (file->AcquireReference() > 0) { _file = file; return B_OK; } // File already full dereferenced. It is about to be deleted. fFilesByEntryRef.Remove(file); } file = new(std::nothrow) PackageFile; if (file == NULL) RETURN_ERROR(B_NO_MEMORY); status_t error = file->Init(entryRef, this); if (error != B_OK) { delete file; return error; } fFilesByEntryRef.Insert(file); _file = file; return B_OK; } status_t PackageFileManager::CreatePackage(const entry_ref& entryRef, Package*& _package) { PackageFile* packageFile; status_t error = GetPackageFile(entryRef, packageFile); if (error != B_OK) RETURN_ERROR(error); BReference packageFileReference(packageFile, true); _package = new(std::nothrow) Package(packageFile); RETURN_ERROR(_package != NULL ? B_OK : B_NO_MEMORY); } void PackageFileManager::PackageFileMoved(PackageFile* file, const node_ref& newDirectory) { if (newDirectory == file->DirectoryRef()) return; AutoLocker locker(fLock); fFilesByEntryRef.Remove(file); file->SetDirectoryRef(newDirectory); fFilesByEntryRef.Insert(file); } void PackageFileManager::RemovePackageFile(PackageFile* file) { AutoLocker locker(fLock); fFilesByEntryRef.Remove(file); }