1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski #ifndef _LOCALE_NODE_
24*b1cdbd2cSJim Jagielski #define _LOCALE_NODE_
25*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XParser.hpp>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <vector>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <com/sun/star/registry/XImplementationRegistration.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/SAXParseException.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XParser.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XOutputStream.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSource.hpp>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <cppuhelper/servicefactory.hxx>
41*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
42*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase3.hxx>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski using namespace ::rtl;
45*b1cdbd2cSJim Jagielski using namespace ::std;
46*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::xml::sax;
47*b1cdbd2cSJim Jagielski using namespace ::cppu;
48*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::registry;
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::xml::sax;
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::io;
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski class OFileWriter
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski public:
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski OFileWriter(const char *pcFile, const char *locale );
59*b1cdbd2cSJim Jagielski virtual ~OFileWriter();
60*b1cdbd2cSJim Jagielski     virtual void  writeStringCharacters(const ::rtl::OUString& str) const;
61*b1cdbd2cSJim Jagielski     virtual void  writeAsciiString(const char *str)const ;
62*b1cdbd2cSJim Jagielski     virtual void  writeInt(sal_Int16 nb) const;
63*b1cdbd2cSJim Jagielski     virtual void  writeFunction(const char *func, const char *count, const char *array) const;
64*b1cdbd2cSJim Jagielski     virtual void  writeRefFunction(const char *func, const ::rtl::OUString& useLocale) const;
65*b1cdbd2cSJim Jagielski     virtual void  writeFunction(const char *func, const char *count, const char *array, const char *from, const char *to) const;
66*b1cdbd2cSJim Jagielski     virtual void  writeRefFunction(const char *func, const ::rtl::OUString& useLocale, const char *to) const;
67*b1cdbd2cSJim Jagielski     virtual void  writeFunction2(const char *func, const char *style, const char* attr, const char *array) const;
68*b1cdbd2cSJim Jagielski     virtual void  writeRefFunction2(const char *func, const ::rtl::OUString& useLocale) const;
69*b1cdbd2cSJim Jagielski     virtual void  writeFunction3(const char *func, const char *style, const char* levels, const char* attr, const char *array) const;
70*b1cdbd2cSJim Jagielski     virtual void  writeRefFunction3(const char *func, const ::rtl::OUString& useLocale) const;
71*b1cdbd2cSJim Jagielski     virtual void  writeIntParameter(const sal_Char* pAsciiStr, const sal_Int16 count, sal_Int16 val) const;
72*b1cdbd2cSJim Jagielski     virtual bool  writeDefaultParameter(const sal_Char* pAsciiStr, const ::rtl::OUString& str, sal_Int16 count) const;
73*b1cdbd2cSJim Jagielski     virtual bool  writeDefaultParameter(const sal_Char* pAsciiStr, const ::rtl::OUString& str) const;
74*b1cdbd2cSJim Jagielski     virtual void  writeParameter(const sal_Char* pAsciiStr, const ::rtl::OUString& aChars) const;
75*b1cdbd2cSJim Jagielski     virtual void  writeParameter(const sal_Char* pAsciiStr, const ::rtl::OUString& aChars, sal_Int16 count) const;
76*b1cdbd2cSJim Jagielski     virtual void  writeParameter(const sal_Char* pAsciiStr, const ::rtl::OUString& aChars, sal_Int16 count0, sal_Int16 count1) const;
77*b1cdbd2cSJim Jagielski     virtual void  writeParameter(const sal_Char* pTagStr, const sal_Char* pAsciiStr, const ::rtl::OUString& aChars, const sal_Int16 count) const;
78*b1cdbd2cSJim Jagielski     virtual void  writeParameter(const sal_Char* pTagStr, const sal_Char* pAsciiStr, const ::rtl::OUString& aChars) const;
79*b1cdbd2cSJim Jagielski     virtual void  writeParameter(const sal_Char* pTagStr, const sal_Char* pAsciiStr, const ::rtl::OUString& aChars, sal_Int16 count0, sal_Int16 count1) const;
80*b1cdbd2cSJim Jagielski     virtual void  flush(void) const ;
81*b1cdbd2cSJim Jagielski     virtual void  closeOutput(void) const;
82*b1cdbd2cSJim Jagielski     /// Return the locale string, something like en_US or de_DE
getLocale() const83*b1cdbd2cSJim Jagielski     const char * getLocale() const { return theLocale; }
84*b1cdbd2cSJim Jagielski private:
85*b1cdbd2cSJim Jagielski     char m_pcFile[1024];
86*b1cdbd2cSJim Jagielski     char theLocale[50];
87*b1cdbd2cSJim Jagielski 	FILE *m_f;
88*b1cdbd2cSJim Jagielski };
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski class Attr {
91*b1cdbd2cSJim Jagielski 	Sequence <OUString> name;
92*b1cdbd2cSJim Jagielski 	Sequence <OUString> value;
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski public:
95*b1cdbd2cSJim Jagielski 	Attr (const Reference< XAttributeList > & attr);
96*b1cdbd2cSJim Jagielski 	const OUString& getValueByName (const sal_Char *str) const;
97*b1cdbd2cSJim Jagielski 	sal_Int32 getLength() const;
98*b1cdbd2cSJim Jagielski 	const OUString& getTypeByIndex (sal_Int32 idx) const;
99*b1cdbd2cSJim Jagielski 	const OUString& getValueByIndex (sal_Int32 idx) const ;
100*b1cdbd2cSJim Jagielski };
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski class LocaleNode
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	OUString aName;
105*b1cdbd2cSJim Jagielski 	OUString aValue;
106*b1cdbd2cSJim Jagielski 	Attr * xAttribs;
107*b1cdbd2cSJim Jagielski 	LocaleNode * parent;
108*b1cdbd2cSJim Jagielski 	LocaleNode* * children;
109*b1cdbd2cSJim Jagielski 	sal_Int32 nChildren;
110*b1cdbd2cSJim Jagielski 	sal_Int32 childArrSize;
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	void setParent ( LocaleNode*  node);
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski protected:
115*b1cdbd2cSJim Jagielski     mutable int nError;
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski public:
118*b1cdbd2cSJim Jagielski 	LocaleNode (const OUString& name, const Reference< XAttributeList > & attr);
setValue(const OUString & oValue)119*b1cdbd2cSJim Jagielski 	inline void setValue(const OUString &oValue) { aValue += oValue; };
getName() const120*b1cdbd2cSJim Jagielski 	inline const OUString& getName() const { return aName; };
getValue() const121*b1cdbd2cSJim Jagielski 	inline const OUString& getValue() const { return aValue; };
getAttr() const122*b1cdbd2cSJim Jagielski 	inline const Attr* getAttr() const { return xAttribs; };
getNumberOfChildren() const123*b1cdbd2cSJim Jagielski 	inline sal_Int32 getNumberOfChildren () const { return nChildren; };
getChildAt(sal_Int32 idx) const124*b1cdbd2cSJim Jagielski 	inline  LocaleNode * getChildAt (sal_Int32 idx) const { return children[idx] ; };
125*b1cdbd2cSJim Jagielski 	const LocaleNode * findNode ( const sal_Char *name) const;
126*b1cdbd2cSJim Jagielski 	void print () const;
127*b1cdbd2cSJim Jagielski 	void printR () const;
128*b1cdbd2cSJim Jagielski     virtual ~LocaleNode();
129*b1cdbd2cSJim Jagielski 	void addChild (  LocaleNode * node);
getParent() const130*b1cdbd2cSJim Jagielski     const LocaleNode* getParent() const { return parent; };
131*b1cdbd2cSJim Jagielski     const LocaleNode* getRoot() const;
132*b1cdbd2cSJim Jagielski     int getError() const;
133*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
134*b1cdbd2cSJim Jagielski     // MUST >= nMinLen
135*b1cdbd2cSJim Jagielski     // nMinLen <= 0 : no error
136*b1cdbd2cSJim Jagielski     // nMinLen >  0 : error if less than nMinLen characters
137*b1cdbd2cSJim Jagielski     // SHOULD NOT > nMaxLen
138*b1cdbd2cSJim Jagielski     // nMaxLen <  0 : any length
139*b1cdbd2cSJim Jagielski     // nMaxLen >= 0 : warning if more than nMaxLen characters
140*b1cdbd2cSJim Jagielski     OUString writeParameterCheckLen( const OFileWriter &of, const char* pParameterName, const LocaleNode* pNode, sal_Int32 nMinLen, sal_Int32 nMaxLen ) const;
141*b1cdbd2cSJim Jagielski     OUString writeParameterCheckLen( const OFileWriter &of, const char* pNodeName, const char* pParameterName, sal_Int32 nMinLen, sal_Int32 nMaxLen ) const;
142*b1cdbd2cSJim Jagielski     // ++nError with output to stderr
143*b1cdbd2cSJim Jagielski     void incError( const char* pStr ) const;
144*b1cdbd2cSJim Jagielski     // ++nError with output to stderr
145*b1cdbd2cSJim Jagielski     void incError( const ::rtl::OUString& rStr ) const;
146*b1cdbd2cSJim Jagielski     // ++nError with output to stderr, pStr should contain "%d", otherwise appended
147*b1cdbd2cSJim Jagielski     void incErrorInt( const char* pStr, int nVal ) const;
148*b1cdbd2cSJim Jagielski     // ++nError with output to stderr, pStr should contain "%s", otherwise appended
149*b1cdbd2cSJim Jagielski     void incErrorStr( const char* pStr, const ::rtl::OUString& rVal ) const;
150*b1cdbd2cSJim Jagielski     // used by incError...(), returns a pointer to a static buffer,
151*b1cdbd2cSJim Jagielski     // pDefaultConversion is appended if pFormat doesn't contain a %
152*b1cdbd2cSJim Jagielski     // specification and should be something like ": %d" or ": %s" or similar.
153*b1cdbd2cSJim Jagielski     char* prepareErrorFormat( const char* pFormat, const char* pDefaultConversion ) const;
154*b1cdbd2cSJim Jagielski 	static LocaleNode* createNode (const OUString& name,const Reference< XAttributeList > & attr);
155*b1cdbd2cSJim Jagielski };
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski class LCInfoNode : public LocaleNode {
158*b1cdbd2cSJim Jagielski public:
LCInfoNode(const OUString & name,const Reference<XAttributeList> & attr)159*b1cdbd2cSJim Jagielski 	inline LCInfoNode (const OUString& name,
160*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
161*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
162*b1cdbd2cSJim Jagielski };
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski class LCCTYPENode : public LocaleNode {
166*b1cdbd2cSJim Jagielski public:
LCCTYPENode(const OUString & name,const Reference<XAttributeList> & attr)167*b1cdbd2cSJim Jagielski 	inline LCCTYPENode (const OUString& name,
168*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
171*b1cdbd2cSJim Jagielski };
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski class LCFormatNode : public LocaleNode {
174*b1cdbd2cSJim Jagielski     static sal_Int16 mnSection;
175*b1cdbd2cSJim Jagielski     static sal_Int16 mnFormats;
176*b1cdbd2cSJim Jagielski public:
LCFormatNode(const OUString & name,const Reference<XAttributeList> & attr)177*b1cdbd2cSJim Jagielski 	inline LCFormatNode (const OUString& name,
178*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
181*b1cdbd2cSJim Jagielski };
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski class LCCollationNode : public LocaleNode {
184*b1cdbd2cSJim Jagielski public:
LCCollationNode(const OUString & name,const Reference<XAttributeList> & attr)185*b1cdbd2cSJim Jagielski 	inline LCCollationNode (const OUString& name,
186*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
189*b1cdbd2cSJim Jagielski };
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski class LCIndexNode : public LocaleNode {
192*b1cdbd2cSJim Jagielski public:
LCIndexNode(const OUString & name,const Reference<XAttributeList> & attr)193*b1cdbd2cSJim Jagielski 	inline LCIndexNode (const OUString& name,
194*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
197*b1cdbd2cSJim Jagielski };
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski class LCSearchNode : public LocaleNode {
200*b1cdbd2cSJim Jagielski public:
LCSearchNode(const OUString & name,const Reference<XAttributeList> & attr)201*b1cdbd2cSJim Jagielski 	inline LCSearchNode (const OUString& name,
202*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
205*b1cdbd2cSJim Jagielski };
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski class LCCalendarNode : public LocaleNode {
208*b1cdbd2cSJim Jagielski public:
LCCalendarNode(const OUString & name,const Reference<XAttributeList> & attr)209*b1cdbd2cSJim Jagielski 	inline LCCalendarNode (const OUString& name,
210*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
213*b1cdbd2cSJim Jagielski };
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski class LCCurrencyNode : public LocaleNode {
216*b1cdbd2cSJim Jagielski public:
LCCurrencyNode(const OUString & name,const Reference<XAttributeList> & attr)217*b1cdbd2cSJim Jagielski 	inline LCCurrencyNode (const OUString& name,
218*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
221*b1cdbd2cSJim Jagielski };
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski class LCTransliterationNode : public LocaleNode {
224*b1cdbd2cSJim Jagielski public:
LCTransliterationNode(const OUString & name,const Reference<XAttributeList> & attr)225*b1cdbd2cSJim Jagielski 	inline LCTransliterationNode (const OUString& name,
226*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
229*b1cdbd2cSJim Jagielski };
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski class LCMiscNode : public LocaleNode {
232*b1cdbd2cSJim Jagielski public:
LCMiscNode(const OUString & name,const Reference<XAttributeList> & attr)233*b1cdbd2cSJim Jagielski 	inline LCMiscNode (const OUString& name,
234*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
237*b1cdbd2cSJim Jagielski };
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski class LCNumberingLevelNode : public LocaleNode {
240*b1cdbd2cSJim Jagielski public:
LCNumberingLevelNode(const OUString & name,const Reference<XAttributeList> & attr)241*b1cdbd2cSJim Jagielski 	inline LCNumberingLevelNode (const OUString& name,
242*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
245*b1cdbd2cSJim Jagielski };
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski class LCOutlineNumberingLevelNode : public LocaleNode {
248*b1cdbd2cSJim Jagielski public:
LCOutlineNumberingLevelNode(const OUString & name,const Reference<XAttributeList> & attr)249*b1cdbd2cSJim Jagielski 	inline LCOutlineNumberingLevelNode (const OUString& name,
250*b1cdbd2cSJim Jagielski 				const Reference< XAttributeList > & attr) : LocaleNode (name, attr) { ; };
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski 	virtual void generateCode (const OFileWriter &of) const;
253*b1cdbd2cSJim Jagielski };
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski #endif
256