1 /* 2 * Copyright (c) 2005-2010, Haiku, Inc. 3 * Distributed under the terms of the MIT license. 4 * 5 * Author: 6 * DarkWyrm <darkwyrm@gmail.com> 7 */ 8 #include "ResourceData.h" 9 #include "ResFields.h" 10 #include <stdlib.h> 11 12 ResourceData::ResourceData(void) 13 : fType(0), 14 fTypeString("Invalid"), 15 fID(-1), 16 fIDString("Invalid"), 17 fName(""), 18 fData(NULL), 19 fLength(0), 20 fAttr(false) 21 { 22 } 23 24 25 ResourceData::ResourceData(const type_code &code, const int32 &id, 26 const char *name, char *data, 27 const size_t &length) 28 : fType(code), 29 fID(id), 30 fName(name), 31 fData(data), 32 fLength(length), 33 fAttr(false) 34 { 35 fIDString = ""; 36 fIDString << fID; 37 fTypeString = MakeTypeString(code); 38 } 39 40 41 ResourceData::ResourceData(const ResourceData &data) 42 { 43 *this = data; 44 } 45 46 47 ResourceData::~ResourceData(void) 48 { 49 free(fData); 50 } 51 52 53 ResourceData & 54 ResourceData::operator=(const ResourceData &data) 55 { 56 fType = data.fType; 57 fTypeString = data.fTypeString; 58 fID = data.fID; 59 fIDString = data.fIDString; 60 fName = data.fName; 61 fAttr = data.fAttr; 62 SetData(data.fData, data.fLength); 63 64 return *this; 65 } 66 67 bool 68 ResourceData::SetFromResource(const int32 &index, BResources &res) 69 { 70 char *name; 71 if (!res.GetResourceInfo(index, (type_code*)&fType, &fID, 72 (const char **)&name, &fLength)) { 73 *this = ResourceData(); 74 return false; 75 } 76 fName = name; 77 fTypeString = MakeTypeString(fType); 78 fIDString = ""; 79 fIDString << fID; 80 fAttr = false; 81 char *data = (char *)res.LoadResource(fType, fID, &fLength); 82 SetData(data, fLength); 83 84 return true; 85 } 86 87 88 bool 89 ResourceData::SetFromAttribute(const char *name, BNode &node) 90 { 91 attr_info info; 92 if (node.GetAttrInfo(name, &info) != B_OK) { 93 *this = ResourceData(); 94 return false; 95 } 96 97 fType = info.type; 98 fID = -1; 99 fIDString = "(attr)"; 100 fName = name; 101 fLength = info.size; 102 fAttr = true; 103 104 fTypeString = MakeTypeString(fType); 105 106 fData = (char *)malloc(fLength); 107 if (fData) { 108 ssize_t size = node.ReadAttr(name, info.type, 0, (void*)fData, fLength); 109 if (size >= 0) { 110 fLength = (size_t) size; 111 return true; 112 } 113 } 114 115 *this = ResourceData(); 116 return false; 117 } 118 119 120 void 121 ResourceData::SetTo(const type_code &code, const int32 &id, 122 const char *name, char *data, const size_t &length) 123 { 124 fType = code; 125 fTypeString = MakeTypeString(code); 126 fID = id; 127 fIDString = ""; 128 fIDString << fID; 129 fName = name; 130 SetData(data, length); 131 132 } 133 134 135 void 136 ResourceData::SetType(const type_code &code) 137 { 138 fType = code; 139 fTypeString = MakeTypeString(code); 140 } 141 142 143 void 144 ResourceData::SetID(const int32 &id) 145 { 146 fID = id; 147 fIDString = ""; 148 fIDString << fID; 149 } 150 151 152 void 153 ResourceData::SetData(const char *data, const size_t &size) 154 { 155 free(fData); 156 157 fLength = size; 158 159 if (size > 0) { 160 fData = (char *)malloc(size); 161 memcpy(fData, data, size); 162 } 163 else 164 fData = NULL; 165 } 166 167