2 * Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
7 #include "PackageFileManager.h"
11 #include <AutoLocker.h>
13 #include "DebugSupport.h"
17 PackageFileManager::PackageFileManager(BLocker
& lock
)
25 PackageFileManager::~PackageFileManager()
31 PackageFileManager::Init()
33 return fFilesByEntryRef
.Init();
38 PackageFileManager::GetPackageFile(const entry_ref
& entryRef
,
41 AutoLocker
<BLocker
> locker(fLock
);
43 PackageFile
* file
= fFilesByEntryRef
.Lookup(entryRef
);
45 if (file
->AcquireReference() > 0) {
50 // File already full dereferenced. It is about to be deleted.
51 fFilesByEntryRef
.Remove(file
);
54 file
= new(std::nothrow
) PackageFile
;
56 RETURN_ERROR(B_NO_MEMORY
);
58 status_t error
= file
->Init(entryRef
, this);
64 fFilesByEntryRef
.Insert(file
);
72 PackageFileManager::CreatePackage(const entry_ref
& entryRef
, Package
*& _package
)
74 PackageFile
* packageFile
;
75 status_t error
= GetPackageFile(entryRef
, packageFile
);
78 BReference
<PackageFile
> packageFileReference(packageFile
, true);
80 _package
= new(std::nothrow
) Package(packageFile
);
81 RETURN_ERROR(_package
!= NULL
? B_OK
: B_NO_MEMORY
);
86 PackageFileManager::PackageFileMoved(PackageFile
* file
,
87 const node_ref
& newDirectory
)
89 if (newDirectory
== file
->DirectoryRef())
92 AutoLocker
<BLocker
> locker(fLock
);
94 fFilesByEntryRef
.Remove(file
);
95 file
->SetDirectoryRef(newDirectory
);
96 fFilesByEntryRef
.Insert(file
);
101 PackageFileManager::RemovePackageFile(PackageFile
* file
)
103 AutoLocker
<BLocker
> locker(fLock
);
105 fFilesByEntryRef
.Remove(file
);