Make UEFI boot-platform build again
[haiku.git] / src / servers / package / PackageFileManager.cpp
blob04a430192cd3245b114868d28df77e7983387f0d
1 /*
2 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
7 #include "PackageFileManager.h"
9 #include <Locker.h>
11 #include <AutoLocker.h>
13 #include "DebugSupport.h"
14 #include "Package.h"
17 PackageFileManager::PackageFileManager(BLocker& lock)
19 fLock(lock),
20 fFilesByEntryRef()
25 PackageFileManager::~PackageFileManager()
30 status_t
31 PackageFileManager::Init()
33 return fFilesByEntryRef.Init();
37 status_t
38 PackageFileManager::GetPackageFile(const entry_ref& entryRef,
39 PackageFile*& _file)
41 AutoLocker<BLocker> locker(fLock);
43 PackageFile* file = fFilesByEntryRef.Lookup(entryRef);
44 if (file != NULL) {
45 if (file->AcquireReference() > 0) {
46 _file = file;
47 return B_OK;
50 // File already full dereferenced. It is about to be deleted.
51 fFilesByEntryRef.Remove(file);
54 file = new(std::nothrow) PackageFile;
55 if (file == NULL)
56 RETURN_ERROR(B_NO_MEMORY);
58 status_t error = file->Init(entryRef, this);
59 if (error != B_OK) {
60 delete file;
61 return error;
64 fFilesByEntryRef.Insert(file);
66 _file = file;
67 return B_OK;
71 status_t
72 PackageFileManager::CreatePackage(const entry_ref& entryRef, Package*& _package)
74 PackageFile* packageFile;
75 status_t error = GetPackageFile(entryRef, packageFile);
76 if (error != B_OK)
77 RETURN_ERROR(error);
78 BReference<PackageFile> packageFileReference(packageFile, true);
80 _package = new(std::nothrow) Package(packageFile);
81 RETURN_ERROR(_package != NULL ? B_OK : B_NO_MEMORY);
85 void
86 PackageFileManager::PackageFileMoved(PackageFile* file,
87 const node_ref& newDirectory)
89 if (newDirectory == file->DirectoryRef())
90 return;
92 AutoLocker<BLocker> locker(fLock);
94 fFilesByEntryRef.Remove(file);
95 file->SetDirectoryRef(newDirectory);
96 fFilesByEntryRef.Insert(file);
100 void
101 PackageFileManager::RemovePackageFile(PackageFile* file)
103 AutoLocker<BLocker> locker(fLock);
105 fFilesByEntryRef.Remove(file);