\file ResourcesContainer.cpp
ResourcesContainer implementation.
*/
#include <stdio.h>
#include "ResourcesContainer.h"
#include "ResourceItem.h"
namespace BPrivate {
namespace Storage {
ResourcesContainer::ResourcesContainer()
: fResources(),
fIsModified(false)
{
}
ResourcesContainer::~ResourcesContainer()
{
MakeEmpty();
}
bool
ResourcesContainer::AddResource(ResourceItem *item, int32 index,
bool replace)
{
bool result = false;
if (item) {
if (replace)
delete RemoveResource(IndexOf(item->Type(), item->ID()));
int32 count = CountResources();
if (index < 0 || index > count)
index = count;
result = fResources.AddItem(item, index);
SetModified(true);
}
return result;
}
ResourceItem*
ResourcesContainer::RemoveResource(int32 index)
{
ResourceItem* item = (ResourceItem*)fResources.RemoveItem(index);
if (item)
SetModified(true);
return item;
}
bool
ResourcesContainer::RemoveResource(ResourceItem *item)
{
return RemoveResource(IndexOf(item));
}
void
ResourcesContainer::MakeEmpty()
{
for (int32 i = 0; ResourceItem *item = ResourceAt(i); i++)
delete item;
fResources.MakeEmpty();
SetModified(false);
}
void
ResourcesContainer::AssimilateResources(ResourcesContainer &container)
{
int32 newCount = container.CountResources();
for (int32 i = 0; i < newCount; i++) {
ResourceItem *item = container.ResourceAt(i);
if (item->IsLoaded())
AddResource(item);
else {
delete item;
}
}
container.fResources.MakeEmpty();
container.SetModified(true);
SetModified(true);
}
int32
ResourcesContainer::IndexOf(ResourceItem *item) const
{
return fResources.IndexOf(item);
}
int32
ResourcesContainer::IndexOf(const void *data) const
{
int32 index = -1;
if (data) {
int32 count = CountResources();
for (int32 i = 0; index == -1 && i < count; i++) {
if (ResourceAt(i)->Data() == data)
index = i;
}
}
return index;
}
int32
ResourcesContainer::IndexOf(type_code type, int32 id) const
{
int32 index = -1;
int32 count = CountResources();
for (int32 i = 0; index == -1 && i < count; i++) {
ResourceItem *item = ResourceAt(i);
if (item->Type() == type && item->ID() == id)
index = i;
}
return index;
}
int32
ResourcesContainer::IndexOf(type_code type, const char *name) const
{
int32 index = -1;
int32 count = CountResources();
for (int32 i = 0; index == -1 && i < count; i++) {
ResourceItem *item = ResourceAt(i);
const char *itemName = item->Name();
if (item->Type() == type && ((name == NULL && itemName == NULL)
|| (name != NULL && itemName != NULL
&& strcmp(name, itemName) == 0))) {
index = i;
}
}
return index;
}
int32
ResourcesContainer::IndexOfType(type_code type, int32 typeIndex) const
{
int32 index = -1;
int32 count = CountResources();
for (int32 i = 0; index == -1 && i < count; i++) {
ResourceItem *item = ResourceAt(i);
if (item->Type() == type) {
if (typeIndex == 0)
index = i;
typeIndex--;
}
}
return index;
}
ResourceItem*
ResourcesContainer::ResourceAt(int32 index) const
{
return (ResourceItem*)fResources.ItemAt(index);
}
int32
ResourcesContainer::CountResources() const
{
return fResources.CountItems();
}
void
ResourcesContainer::SetModified(bool modified)
{
fIsModified = modified;
if (!modified) {
int32 count = CountResources();
for (int32 i = 0; i < count; i++)
ResourceAt(i)->SetModified(false);
}
}
bool
ResourcesContainer::IsModified() const
{
bool isModified = fIsModified;
int32 count = CountResources();
for (int32 i = 0; !isModified && i < count; i++)
isModified |= ResourceAt(i)->IsModified();
return isModified;
}
};
};