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