/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2000-2012 Kitware, Inc. Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #include "cmWIXRichTextFormatWriter.h" #include cmWIXRichTextFormatWriter::cmWIXRichTextFormatWriter( const std::string& filename): file(filename.c_str(), std::ios::binary) { StartGroup(); WriteHeader(); WriteDocumentPrefix(); } cmWIXRichTextFormatWriter::~cmWIXRichTextFormatWriter() { EndGroup(); /* I haven't seen this in the RTF spec but * wordpad terminates its RTF like this */ file << "\r\n"; file.put(0); } void cmWIXRichTextFormatWriter::AddText(const std::string& text) { typedef unsigned char rtf_byte_t; for(size_t i = 0; i < text.size(); ++i) { rtf_byte_t c = rtf_byte_t(text[i]); switch(c) { case '\\': file << "\\\\"; break; case '{': file << "\\{"; break; case '}': file << "\\}"; break; case '\n': file << "\\par\r\n"; break; case '\r': continue; default: { if(c <= 0x7F) { file << c; } else { file << "[NON-ASCII-" << int(c) << "]"; } } break; } } } void cmWIXRichTextFormatWriter::WriteHeader() { ControlWord("rtf1"); ControlWord("ansi"); ControlWord("ansicpg1252"); ControlWord("deff0"); ControlWord("deflang1031"); WriteFontTable(); WriteGenerator(); } void cmWIXRichTextFormatWriter::WriteFontTable() { StartGroup(); ControlWord("fonttbl"); StartGroup(); ControlWord("f0"); ControlWord("fswiss"); ControlWord("fcharset0 Arial;"); EndGroup(); EndGroup(); } void cmWIXRichTextFormatWriter::WriteGenerator() { StartGroup(); NewControlWord("generator"); file << " CPack WiX Generator (" << cmVersion::GetCMakeVersion() << ");"; EndGroup(); } void cmWIXRichTextFormatWriter::WriteDocumentPrefix() { ControlWord("viewkind4"); ControlWord("uc1"); ControlWord("pard"); ControlWord("f0"); ControlWord("fs20"); } void cmWIXRichTextFormatWriter::ControlWord(const std::string& keyword) { file << "\\" << keyword; } void cmWIXRichTextFormatWriter::NewControlWord(const std::string& keyword) { file << "\\*\\" << keyword; } void cmWIXRichTextFormatWriter::StartGroup() { file.put('{'); } void cmWIXRichTextFormatWriter::EndGroup() { file.put('}'); }