| /*============================================================================ |
| 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 <cmVersion.h> |
| |
| 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('}'); |
| } |