167 lines
2.7 KiB
C++
167 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2005-2010, Haiku, Inc.
|
|
* Distributed under the terms of the MIT license.
|
|
*
|
|
* Author:
|
|
* DarkWyrm <darkwyrm@gmail.com>
|
|
*/
|
|
#include "ResourceData.h"
|
|
#include "ResFields.h"
|
|
#include <stdlib.h>
|
|
|
|
ResourceData::ResourceData(void)
|
|
: fType(0),
|
|
fTypeString("Invalid"),
|
|
fID(-1),
|
|
fIDString("Invalid"),
|
|
fName(""),
|
|
fData(NULL),
|
|
fLength(0),
|
|
fAttr(false)
|
|
{
|
|
}
|
|
|
|
|
|
ResourceData::ResourceData(const type_code &code, const int32 &id,
|
|
const char *name, char *data,
|
|
const size_t &length)
|
|
: fType(code),
|
|
fID(id),
|
|
fName(name),
|
|
fData(data),
|
|
fLength(length),
|
|
fAttr(false)
|
|
{
|
|
fIDString = "";
|
|
fIDString << fID;
|
|
fTypeString = MakeTypeString(code);
|
|
}
|
|
|
|
|
|
ResourceData::ResourceData(const ResourceData &data)
|
|
{
|
|
*this = data;
|
|
}
|
|
|
|
|
|
ResourceData::~ResourceData(void)
|
|
{
|
|
free(fData);
|
|
}
|
|
|
|
|
|
ResourceData &
|
|
ResourceData::operator=(const ResourceData &data)
|
|
{
|
|
fType = data.fType;
|
|
fTypeString = data.fTypeString;
|
|
fID = data.fID;
|
|
fIDString = data.fIDString;
|
|
fName = data.fName;
|
|
fAttr = data.fAttr;
|
|
SetData(data.fData, data.fLength);
|
|
|
|
return *this;
|
|
}
|
|
|
|
bool
|
|
ResourceData::SetFromResource(const int32 &index, BResources &res)
|
|
{
|
|
char *name;
|
|
if (!res.GetResourceInfo(index, (type_code*)&fType, &fID,
|
|
(const char **)&name, &fLength)) {
|
|
*this = ResourceData();
|
|
return false;
|
|
}
|
|
fName = name;
|
|
fTypeString = MakeTypeString(fType);
|
|
fIDString = "";
|
|
fIDString << fID;
|
|
fAttr = false;
|
|
char *data = (char *)res.LoadResource(fType, fID, &fLength);
|
|
SetData(data, fLength);
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
bool
|
|
ResourceData::SetFromAttribute(const char *name, BNode &node)
|
|
{
|
|
attr_info info;
|
|
if (node.GetAttrInfo(name, &info) != B_OK) {
|
|
*this = ResourceData();
|
|
return false;
|
|
}
|
|
|
|
fType = info.type;
|
|
fID = -1;
|
|
fIDString = "(attr)";
|
|
fName = name;
|
|
fLength = info.size;
|
|
fAttr = true;
|
|
|
|
fTypeString = MakeTypeString(fType);
|
|
|
|
fData = (char *)malloc(fLength);
|
|
if (fData) {
|
|
ssize_t size = node.ReadAttr(name, info.type, 0, (void*)fData, fLength);
|
|
if (size >= 0) {
|
|
fLength = (size_t) size;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
*this = ResourceData();
|
|
return false;
|
|
}
|
|
|
|
|
|
void
|
|
ResourceData::SetTo(const type_code &code, const int32 &id,
|
|
const char *name, char *data, const size_t &length)
|
|
{
|
|
fType = code;
|
|
fTypeString = MakeTypeString(code);
|
|
fID = id;
|
|
fIDString = "";
|
|
fIDString << fID;
|
|
fName = name;
|
|
SetData(data, length);
|
|
|
|
}
|
|
|
|
|
|
void
|
|
ResourceData::SetType(const type_code &code)
|
|
{
|
|
fType = code;
|
|
fTypeString = MakeTypeString(code);
|
|
}
|
|
|
|
|
|
void
|
|
ResourceData::SetID(const int32 &id)
|
|
{
|
|
fID = id;
|
|
fIDString = "";
|
|
fIDString << fID;
|
|
}
|
|
|
|
|
|
void
|
|
ResourceData::SetData(const char *data, const size_t &size)
|
|
{
|
|
free(fData);
|
|
|
|
fLength = size;
|
|
|
|
if (size > 0) {
|
|
fData = (char *)malloc(size);
|
|
memcpy(fData, data, size);
|
|
}
|
|
else
|
|
fData = NULL;
|
|
}
|
|
|