00001 /// 00002 /// \file cod.h 00003 /// COD file API 00004 /// 00005 00006 /* 00007 Copyright (C) 2009-2011, Net Direct Inc. (http://www.netdirect.ca/) 00008 00009 This program is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; either version 2 of the License, or 00012 (at your option) any later version. 00013 00014 This program is distributed in the hope that it will be useful, 00015 but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00017 00018 See the GNU General Public License in the COPYING file at the 00019 root directory of this project for more details. 00020 */ 00021 00022 #ifndef __BARRY_COD_H__ 00023 #define __BARRY_COD_H__ 00024 00025 #include "dll.h" 00026 #include "data.h" 00027 #include <sys/types.h> 00028 #include <stdint.h> 00029 #include <iostream> 00030 #include <sstream> 00031 00032 namespace Barry { 00033 00034 00035 // 00036 // SeekNextCod 00037 // 00038 /// Seeks the input stream to the next packed sibling .cod file and returns 00039 /// the packed .cod file size. When all siblings have been read, zero is 00040 /// returned. 00041 /// 00042 /// When input stream does not contain the signature for a packed .cod file, 00043 /// it's assumed the entire stream is the .cod file. 00044 /// 00045 /// \param input stream to read from 00046 /// 00047 /// \return size of next packed .cod file, or 0 finished reading .cod files 00048 /// 00049 size_t SeekNextCod(std::istream &input); 00050 00051 00052 /// 00053 /// The CodFileBuilder class is used to assemble multiple .cod files into 00054 /// a single packed .cod file using the pkzip file format. 00055 /// 00056 class BXEXPORT CodFileBuilder 00057 { 00058 std::string m_module_name; 00059 00060 size_t m_module_count; 00061 unsigned int m_current_module; 00062 00063 std::ostringstream m_directory; 00064 00065 public: 00066 CodFileBuilder(const std::string &module_name, size_t module_count = 1); 00067 00068 ~CodFileBuilder(); 00069 00070 /// 00071 /// Writes packed .cod file header to the output stream, and appends 00072 /// an entry to the central directory. If the module count used to 00073 /// create CodFileBuilder is equal to one, the call is ignored. 00074 /// 00075 /// Note: it is the caller's responsibility to write the actual 00076 /// COD file data after calling this function. 00077 /// 00078 /// \param output stream to write to 00079 /// 00080 /// \param buffer buffered .cod file data, input to CRC-32 function 00081 /// 00082 /// \param module_size total size of .cod file data 00083 /// 00084 void WriteNextHeader(std::ostream &output, const uint8_t* buffer, 00085 uint32_t module_size); 00086 00087 /// 00088 /// Write the central directory and central directory ending indicator 00089 /// to the output stream. 00090 /// 00091 /// \param output stream to write to 00092 /// 00093 void WriteFooter(std::ostream &output); 00094 }; 00095 00096 } 00097 00098 #endif 00099