summaryrefslogtreecommitdiff
path: root/src/mgr/encfiltmgr.cpp
blob: 24938bcd630f2a1506535989c6c80b44a79bf941 (plain)
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/******************************************************************************
 *
 *  encfiltmgr.cpp -	implementaion of class EncodingFilterMgr, subclass of
 *			SWFilterMgr, used to transcode all module text to a
 *			requested encoding
 *
 * $Id: encfiltmgr.cpp 2980 2013-09-14 21:51:47Z scribe $
 *
 * Copyright 2001-2013 CrossWire Bible Society (http://www.crosswire.org)
 *	CrossWire Bible Society
 *	P. O. Box 2528
 *	Tempe, AZ  85280-2528
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation version 2.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 */

#include <encfiltmgr.h>
#include <utilstr.h>

#include <scsuutf8.h>
#include <latin1utf8.h>

#include <unicodertf.h>
#include <utf8latin1.h>
#include <utf8utf16.h>
#include <utf8html.h>
#include <swmodule.h>

#include <swmgr.h>


SWORD_NAMESPACE_START


/******************************************************************************
 * EncodingFilterMgr Constructor - initializes instance of EncodingFilterMgr
 *
 * ENT:
 *      enc - Encoding format to emit
 */
EncodingFilterMgr::EncodingFilterMgr(char enc)
		: SWFilterMgr() {

	scsuutf8   = new SCSUUTF8();
	latin1utf8 = new Latin1UTF8();

	encoding = enc;

	switch (encoding) {
		case ENC_LATIN1: targetenc = new UTF8Latin1(); break;
		case ENC_UTF16:  targetenc = new UTF8UTF16();  break;
		case ENC_RTF:    targetenc = new UnicodeRTF(); break;
		case ENC_HTML:   targetenc = new UTF8HTML();   break;
		default: // i.e. case ENC_UTF8
			targetenc = NULL;
	}
}


/******************************************************************************
 * EncodingFilterMgr Destructor - Cleans up instance of EncodingFilterMgr
 */
EncodingFilterMgr::~EncodingFilterMgr() {
	delete scsuutf8;
	delete latin1utf8;
	delete targetenc;
}


void EncodingFilterMgr::AddRawFilters(SWModule *module, ConfigEntMap &section) {

	ConfigEntMap::iterator entry;

	SWBuf encoding = ((entry = section.find("Encoding")) != section.end()) ? (*entry).second : (SWBuf)"";
	if (!encoding.length() || !stricmp(encoding.c_str(), "Latin-1")) {
                module->addRawFilter(latin1utf8);
	}
	else if (!stricmp(encoding.c_str(), "SCSU")) {
		module->addRawFilter(scsuutf8);
	}
}


void EncodingFilterMgr::AddEncodingFilters(SWModule *module, ConfigEntMap &section) {
	if (targetenc)
		module->addEncodingFilter(targetenc);
}


/******************************************************************************
 * EncodingFilterMgr::Encoding	- sets/gets encoding
 *
 * ENT:	enc	- new encoding or 0 to simply get the current encoding
 *
 * RET: encoding
 */
char EncodingFilterMgr::Encoding(char enc) {
	if (enc && enc != encoding) {
		encoding = enc;
		SWFilter *oldfilter = targetenc;

		switch (encoding) {
			case ENC_LATIN1: targetenc = new UTF8Latin1(); break;
			case ENC_UTF16:  targetenc = new UTF8UTF16();  break;
			case ENC_RTF:    targetenc = new UnicodeRTF(); break;
			case ENC_HTML:   targetenc = new UTF8HTML();   break;
			default: // i.e. case ENC_UTF8
				targetenc = NULL;
		}

		ModMap::const_iterator module;

		if (oldfilter != targetenc) {
			if (oldfilter) {
				if (!targetenc) {
					for (module = getParentMgr()->Modules.begin(); module != getParentMgr()->Modules.end(); module++)
						module->second->removeRenderFilter(oldfilter);
					}
				else {
					for (module = getParentMgr()->Modules.begin(); module != getParentMgr()->Modules.end(); module++)
						module->second->replaceRenderFilter(oldfilter, targetenc);
				}
				delete oldfilter;
			}
			else if (targetenc) {
				for (module = getParentMgr()->Modules.begin(); module != getParentMgr()->Modules.end(); module++)
					module->second->addRenderFilter(targetenc);
			}
		}
	}
	return encoding;
}


SWORD_NAMESPACE_END