107 lines
1.9 KiB
C++
107 lines
1.9 KiB
C++
/*
|
|
* Copyright 2014, Ingo Weinhold, ingo_weinhold@gmx.de.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
|
|
#include "PackageFileManager.h"
|
|
|
|
#include <Locker.h>
|
|
|
|
#include <AutoLocker.h>
|
|
|
|
#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<BLocker> 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<PackageFile> 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<BLocker> locker(fLock);
|
|
|
|
fFilesByEntryRef.Remove(file);
|
|
file->SetDirectoryRef(newDirectory);
|
|
fFilesByEntryRef.Insert(file);
|
|
}
|
|
|
|
|
|
void
|
|
PackageFileManager::RemovePackageFile(PackageFile* file)
|
|
{
|
|
AutoLocker<BLocker> locker(fLock);
|
|
|
|
fFilesByEntryRef.Remove(file);
|
|
}
|