1/* 2 * Copyright 2006-2007, 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 "SourceExporter.h" 10 11#include <stdio.h> 12#include <string.h> 13 14#include <DataIO.h> 15 16// constructor 17SourceExporter::SourceExporter() 18 : FlatIconExporter() 19{ 20} 21 22// destructor 23SourceExporter::~SourceExporter() 24{ 25} 26 27// Export 28status_t 29SourceExporter::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(), 37 stream); 38} 39 40// #pragma mark - 41 42// _Export 43status_t 44SourceExporter::_Export(const uint8* source, size_t sourceSize, 45 BPositionIO* stream) const 46{ 47 char buffer[2048]; 48 // write header 49 sprintf(buffer, "\nconst unsigned char kIconName[] = {\n"); 50 size_t size = strlen(buffer); 51 52 ssize_t written = stream->Write(buffer, size); 53 if (written < 0) 54 return (status_t)written; 55 if (written < (ssize_t)size) 56 return B_ERROR; 57 58 status_t ret = B_OK; 59 const uint8* b = source; 60 61 // print one line (12 values) 62 while (sourceSize > 12) { 63 sprintf(buffer, " 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x" 64 ", 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x" 65 ", 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,\n", 66 b[0], b[1], b[2], b[3], 67 b[4], b[5], b[6], b[7], 68 b[8], b[9], b[10], b[11]); 69 70 size = strlen(buffer); 71 written = stream->Write(buffer, size); 72 if (written != (ssize_t)size) { 73 if (written >= 0) 74 ret = B_ERROR; 75 else 76 ret = (status_t)written; 77 break; 78 } 79 80 sourceSize -= 12; 81 b += 12; 82 } 83 // last line (up to 12 values) 84 if (ret >= B_OK && sourceSize > 0) { 85 for (size_t i = 0; i < sourceSize; i++) { 86 if (i == 0) 87 sprintf(buffer, " 0x%.2x", b[i]); 88 else 89 sprintf(buffer, ", 0x%.2x", b[i]); 90 size = strlen(buffer); 91 written = stream->Write(buffer, size); 92 if (written != (ssize_t)size) { 93 if (written >= 0) 94 ret = B_ERROR; 95 else 96 ret = (status_t)written; 97 break; 98 } 99 } 100 } 101 if (ret >= B_OK) { 102 // finish 103 sprintf(buffer, "\n};\n"); 104 size = strlen(buffer); 105 written = stream->Write(buffer, size); 106 if (written != (ssize_t)size) { 107 if (written >= 0) 108 ret = B_ERROR; 109 else 110 ret = (status_t)written; 111 } 112 } 113 114 return ret; 115} 116 117