CMake/Source/CPack/WiX/cmWIXRichTextFormatWriter.cxx

138 lines
2.8 KiB
C++
Raw Normal View History

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