Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef _CFG_MERGE_HXX
21 : #define _CFG_MERGE_HXX
22 :
23 : #include "sal/config.h"
24 :
25 : #include <fstream>
26 : #include <vector>
27 :
28 : #include "boost/unordered_map.hpp"
29 :
30 : typedef boost::unordered_map<rtl::OString, rtl::OString, rtl::OStringHash> OStringHashMap;
31 :
32 :
33 : //
34 : // class CfgStackData
35 : //
36 :
37 0 : class CfgStackData
38 : {
39 : friend class CfgParser;
40 : friend class CfgExport;
41 : friend class CfgMerge;
42 : private:
43 : rtl::OString sTagType;
44 : rtl::OString sIdentifier;
45 :
46 : rtl::OString sResTyp;
47 :
48 : rtl::OString sTextTag;
49 : rtl::OString sEndTextTag;
50 :
51 : OStringHashMap sText;
52 : public:
53 0 : CfgStackData(const rtl::OString &rTag, const rtl::OString &rId)
54 0 : : sTagType( rTag ), sIdentifier( rId )
55 0 : {}
56 :
57 0 : const rtl::OString &GetTagType() { return sTagType; }
58 0 : const rtl::OString &GetIdentifier() { return sIdentifier; }
59 :
60 : };
61 :
62 : //
63 : // class CfgStack
64 : //
65 :
66 : typedef std::vector< CfgStackData* > CfgStackList;
67 :
68 : class CfgStack
69 : {
70 : private:
71 : CfgStackList maList;
72 :
73 : public:
74 0 : CfgStack() {}
75 : ~CfgStack();
76 :
77 : CfgStackData *Push(const rtl::OString &rTag, const rtl::OString &rId);
78 0 : CfgStackData *Pop()
79 : {
80 0 : if (maList.empty())
81 0 : return NULL;
82 0 : CfgStackData* temp = maList.back();
83 0 : maList.pop_back();
84 0 : return temp;
85 : }
86 :
87 : CfgStackData *GetStackData();
88 :
89 : rtl::OString GetAccessPath( size_t nPos );
90 :
91 0 : size_t size() const { return maList.size(); }
92 : };
93 :
94 : //
95 : // class CfgParser
96 : //
97 :
98 : class CfgParser
99 : {
100 : protected:
101 : rtl::OString sCurrentResTyp;
102 : rtl::OString sCurrentIsoLang;
103 : rtl::OString sCurrentText;
104 :
105 : rtl::OString sLastWhitespace;
106 :
107 : CfgStack aStack;
108 : CfgStackData *pStackData;
109 :
110 : sal_Bool bLocalize;
111 :
112 : virtual void WorkOnText(
113 : rtl::OString &rText,
114 : const rtl::OString &rLangIndex )=0;
115 :
116 : virtual void WorkOnResourceEnd()=0;
117 :
118 : virtual void Output(const rtl::OString & rOutput)=0;
119 :
120 : void Error(const rtl::OString &rError);
121 :
122 : private:
123 : int ExecuteAnalyzedToken( int nToken, char *pToken );
124 : std::vector<rtl::OString> aLanguages;
125 : void AddText(
126 : rtl::OString &rText,
127 : const rtl::OString &rIsoLang,
128 : const rtl::OString &rResTyp );
129 :
130 : sal_Bool IsTokenClosed(const rtl::OString &rToken);
131 :
132 : public:
133 : CfgParser();
134 : virtual ~CfgParser();
135 :
136 : int Execute( int nToken, char * pToken );
137 : };
138 :
139 : //
140 : // class CfgOutputParser
141 : //
142 :
143 : class CfgOutputParser : public CfgParser
144 : {
145 : protected:
146 : std::ofstream pOutputStream;
147 : public:
148 : CfgOutputParser(const rtl::OString &rOutputFile);
149 : virtual ~CfgOutputParser();
150 : };
151 :
152 : //
153 : // class CfgExport
154 : //
155 :
156 : class CfgExport : public CfgOutputParser
157 : {
158 : private:
159 : rtl::OString sPrj;
160 : rtl::OString sPath;
161 : std::vector<rtl::OString> aLanguages;
162 : protected:
163 : virtual void WorkOnText(
164 : rtl::OString &rText,
165 : const rtl::OString &rIsoLang
166 : );
167 :
168 : void WorkOnResourceEnd();
169 : void Output(const rtl::OString& rOutput);
170 : public:
171 : CfgExport(
172 : const rtl::OString &rOutputFile,
173 : const rtl::OString &rProject,
174 : const rtl::OString &rFilePath
175 : );
176 : ~CfgExport();
177 : };
178 :
179 : //
180 : // class CfgMerge
181 : //
182 :
183 : class CfgMerge : public CfgOutputParser
184 : {
185 : private:
186 : MergeDataFile *pMergeDataFile;
187 : std::vector<rtl::OString> aLanguages;
188 : ResData *pResData;
189 :
190 : rtl::OString sFilename;
191 : sal_Bool bEnglish;
192 :
193 : protected:
194 : virtual void WorkOnText(rtl::OString &rText, const rtl::OString &rLangIndex);
195 :
196 : void WorkOnResourceEnd();
197 :
198 : void Output(const rtl::OString& rOutput);
199 : public:
200 : CfgMerge(const rtl::OString &rMergeSource,
201 : const rtl::OString &rOutputFile, const rtl::OString &rFilename);
202 : ~CfgMerge();
203 : };
204 :
205 : #endif
206 :
207 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|