105 lines
1.9 KiB
C++
105 lines
1.9 KiB
C++
/*
|
|
* Copyright 2013-2014, Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*
|
|
* Authors:
|
|
* Ingo Weinhold <ingo_weinhold@gmx.de>
|
|
*/
|
|
|
|
|
|
#include "VolumeState.h"
|
|
|
|
#include <AutoDeleter.h>
|
|
#include <AutoLocker.h>
|
|
|
|
|
|
VolumeState::VolumeState()
|
|
:
|
|
fPackagesByFileName(),
|
|
fPackagesByNodeRef()
|
|
{
|
|
}
|
|
|
|
|
|
VolumeState::~VolumeState()
|
|
{
|
|
fPackagesByFileName.Clear();
|
|
|
|
Package* package = fPackagesByNodeRef.Clear(true);
|
|
while (package != NULL) {
|
|
Package* next = package->NodeRefHashTableNext();
|
|
delete package;
|
|
package = next;
|
|
}
|
|
}
|
|
|
|
|
|
bool
|
|
VolumeState::Init()
|
|
{
|
|
return fPackagesByFileName.Init() == B_OK
|
|
&& fPackagesByNodeRef.Init() == B_OK;
|
|
}
|
|
|
|
|
|
void
|
|
VolumeState::AddPackage(Package* package)
|
|
{
|
|
fPackagesByFileName.Insert(package);
|
|
fPackagesByNodeRef.Insert(package);
|
|
}
|
|
|
|
|
|
void
|
|
VolumeState::RemovePackage(Package* package)
|
|
{
|
|
fPackagesByFileName.Remove(package);
|
|
fPackagesByNodeRef.Remove(package);
|
|
}
|
|
|
|
|
|
void
|
|
VolumeState::SetPackageActive(Package* package, bool active)
|
|
{
|
|
package->SetActive(active);
|
|
}
|
|
|
|
|
|
void
|
|
VolumeState::ActivationChanged(const PackageSet& activatedPackage,
|
|
const PackageSet& deactivatePackages)
|
|
{
|
|
for (PackageSet::iterator it = activatedPackage.begin();
|
|
it != activatedPackage.end(); ++it) {
|
|
(*it)->SetActive(true);
|
|
}
|
|
|
|
for (PackageSet::iterator it = deactivatePackages.begin();
|
|
it != deactivatePackages.end(); ++it) {
|
|
Package* package = *it;
|
|
RemovePackage(package);
|
|
delete package;
|
|
}
|
|
}
|
|
|
|
|
|
VolumeState*
|
|
VolumeState::Clone() const
|
|
{
|
|
VolumeState* clone = new(std::nothrow) VolumeState;
|
|
if (clone == NULL)
|
|
return NULL;
|
|
ObjectDeleter<VolumeState> cloneDeleter(clone);
|
|
|
|
for (PackageFileNameHashTable::Iterator it
|
|
= fPackagesByFileName.GetIterator();
|
|
Package* package = it.Next();) {
|
|
Package* clonedPackage = package->Clone();
|
|
if (clonedPackage == NULL)
|
|
return NULL;
|
|
clone->AddPackage(clonedPackage);
|
|
}
|
|
|
|
return cloneDeleter.Detach();
|
|
}
|