1/*
2 * Copyright 2006, Haiku. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Stephan A��mus <superstippi@gmx.de>
7 */
8
9#include "RDefExporter.h"
10
11#include <stdio.h>
12#include <string.h>
13
14#include <DataIO.h>
15
16// constructor
17RDefExporter::RDefExporter()
18	: FlatIconExporter()
19{
20}
21
22// destructor
23RDefExporter::~RDefExporter()
24{
25}
26
27// Export
28status_t
29RDefExporter::Export(const Icon* icon, BPositionIO* stream)
30{
31	BMallocIO buffer;
32	status_t ret = FlatIconExporter::Export(icon, &buffer);
33	if (ret < B_OK)
34		return ret;
35
36	return _Export((const uint8*)buffer.Buffer(), buffer.BufferLength(), stream);
37}
38
39// #pragma mark -
40
41// _Export
42status_t
43RDefExporter::_Export(const uint8* source, size_t sourceSize, BPositionIO* stream) const
44{
45	char buffer[2048];
46	// write header
47	sprintf(buffer, "\nresource(<your resource id here>) #'VICN' array {\n");
48	size_t size = strlen(buffer);
49
50	ssize_t written = stream->Write(buffer, size);
51	if (written < 0)
52		return (status_t)written;
53	if (written < (ssize_t)size)
54		return B_ERROR;
55
56	status_t ret = B_OK;
57	const uint8* b = source;
58
59	// print one line (32 values)
60	while (sourceSize >= 32) {
61		sprintf(buffer, "	$\"%.2X%.2X%.2X%.2X"
62						"%.2X%.2X%.2X%.2X"
63						"%.2X%.2X%.2X%.2X"
64						"%.2X%.2X%.2X%.2X"
65						"%.2X%.2X%.2X%.2X"
66						"%.2X%.2X%.2X%.2X"
67						"%.2X%.2X%.2X%.2X"
68						"%.2X%.2X%.2X%.2X\"\n",
69						b[0], b[1], b[2], b[3],
70						b[4], b[5], b[6], b[7],
71						b[8], b[9], b[10], b[11],
72						b[12], b[13], b[14], b[15],
73						b[16], b[17], b[18], b[19],
74						b[20], b[21], b[22], b[23],
75						b[24], b[25], b[26], b[27],
76						b[28], b[29], b[30], b[31]);
77
78		size = strlen(buffer);
79		written = stream->Write(buffer, size);
80		if (written != (ssize_t)size) {
81			if (written >= 0)
82				ret = B_ERROR;
83			else
84				ret = (status_t)written;
85			break;
86		}
87
88		sourceSize -= 32;
89		b += 32;
90	}
91	// beginning of last line
92	if (ret >= B_OK && sourceSize > 0) {
93		sprintf(buffer, "	$\"");
94		size = strlen(buffer);
95		written = stream->Write(buffer, size);
96		if (written != (ssize_t)size) {
97			if (written >= 0)
98				ret = B_ERROR;
99			else
100				ret = (status_t)written;
101		}
102	}
103	// last line (up to 32 values)
104	bool endQuotes = sourceSize > 0;
105	if (ret >= B_OK && sourceSize > 0) {
106		for (size_t i = 0; i < sourceSize; i++) {
107			sprintf(buffer, "%.2X", b[i]);
108			size = strlen(buffer);
109			written = stream->Write(buffer, size);
110			if (written != (ssize_t)size) {
111				if (written >= 0)
112					ret = B_ERROR;
113				else
114					ret = (status_t)written;
115				break;
116			}
117		}
118	}
119	if (ret >= B_OK) {
120		// finish
121		sprintf(buffer, endQuotes ? "\"\n};\n" : "};\n");
122		size = strlen(buffer);
123		written = stream->Write(buffer, size);
124		if (written != (ssize_t)size) {
125			if (written >= 0)
126				ret = B_ERROR;
127			else
128				ret = (status_t)written;
129		}
130	}
131
132	return ret;
133}
134
135