This repository was archived by the owner on Jul 25, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathMetalinkWriter.cpp
More file actions
103 lines (92 loc) · 2.38 KB
/
MetalinkWriter.cpp
File metadata and controls
103 lines (92 loc) · 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#include "MetalinkWriter.hpp"
#include "config.h"
MetalinkWriter::~MetalinkWriter()
{
}
void MetalinkWriter::save(const wxString& filename)
{
using std::ofstream;
out_.open(filename.mb_str(wxConvFile),
ofstream::out | ofstream::binary | ofstream::trunc);
indent_ = 0;
write_metalink();
}
wxString MetalinkWriter::get_generator()
{
return wxString("MetalinkEditor/" METALINKEDITOR_VERSION, wxConvUTF8);
}
void MetalinkWriter::write_text(const wxString& data, bool indent)
{
if(indent) {
for(int i = 0; i < indent_; i++) {
out_ << " ";
}
}
out_ << data.mb_str(wxConvUTF8);
}
void MetalinkWriter::start(const wxString& element)
{
write_text(wxT("<"));
write_text(element, false);
}
void MetalinkWriter::close_start()
{
write_text(wxT(">\n"), false);
indent_++;
}
namespace {
// Escapes characters not allowed in XML documents and returns new
// escaped string.
wxString xml_escape(const wxString& src)
{
wxString dest;
for(wxString::const_iterator i = src.begin(), eoi = src.end();
i != eoi; ++i) {
const wxChar ch = *i;
if(ch == wxT('<')) {
dest += wxT("<");
} else if(ch == wxT('>')) {
dest += wxT(">");
} else if(ch == wxT('&')) {
dest += wxT("&");
} else if(ch == wxT('\'')) {
dest += wxT("'");
} else if(ch == wxT('"')) {
dest += wxT(""");
} else {
dest += ch;
}
}
return dest;
}
}
void MetalinkWriter::end(const wxString& element, const wxString& value)
{
write_text(wxT(">"), false);
write_text(xml_escape(value), false);
write_text(wxT("</"), false);
write_text(element, false);
write_text(wxT(">\n"), false);
}
void MetalinkWriter::end(const wxString& element)
{
indent_--;
write_text(wxT("</"));
write_text(element, false);
write_text(wxT(">\n"), false);
}
void MetalinkWriter::add_element(const wxString& element,
const wxString& value)
{
if(value.empty()) return;
start(element);
end(element, value);
}
void MetalinkWriter::add_attr(const wxString& name, const wxString& value)
{
write_text(wxT(" "), false);
write_text(name, false);
write_text(wxT("=\""), false);
write_text(xml_escape(value), false);
write_text(wxT("\""), false);
}