xref: /haiku/src/apps/resedit/ResourceData.cpp (revision 7749d0bb0c358a3279b1b9cc76d8376e900130a5)
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