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 HELPCOMPILER_HXX
21 : #define HELPCOMPILER_HXX
22 :
23 : #include <string>
24 : #ifndef HAVE_CXX0X
25 : #define BOOST_NO_0X_HDR_TYPEINDEX
26 : #endif
27 : #include <boost/unordered_map.hpp>
28 : #include <vector>
29 : #include <list>
30 : #include <fstream>
31 : #include <sstream>
32 : #include <algorithm>
33 : #include <ctype.h>
34 :
35 : #include <boost/shared_ptr.hpp>
36 :
37 : #include <libxml/xmlmemory.h>
38 : #include <libxml/debugXML.h>
39 : #include <libxml/HTMLtree.h>
40 : #include <libxml/xmlIO.h>
41 : #include <libxml/xinclude.h>
42 : #include <libxml/catalog.h>
43 :
44 : #include <rtl/ustring.hxx>
45 : #include <osl/thread.h>
46 : #include <osl/process.h>
47 : #include <osl/file.hxx>
48 :
49 : #include <helpcompiler/compilehelp.hxx>
50 :
51 : #if OSL_DEBUG_LEVEL > 2
52 : #include <iostream>
53 : #define HCDBG(foo) do { if (1) foo; } while(0)
54 : #else
55 : #define HCDBG(foo) do { } while(0)
56 : #endif
57 :
58 : namespace fs
59 : {
60 : rtl_TextEncoding getThreadTextEncoding( void );
61 :
62 : enum convert { native };
63 79984 : class path
64 : {
65 : public:
66 : ::rtl::OUString data;
67 : public:
68 8994 : path() {}
69 53015 : path(const path &rOther) : data(rOther.data) {}
70 8990 : path(const std::string &in, convert)
71 8990 : {
72 8990 : rtl::OUString sWorkingDir;
73 8990 : osl_getProcessWorkingDir(&sWorkingDir.pData);
74 :
75 8990 : rtl::OString tmp(in.c_str());
76 8990 : rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding()));
77 8990 : osl::File::getFileURLFromSystemPath(ustrSystemPath, data);
78 8990 : osl::File::getAbsoluteFileURL(sWorkingDir, data, data);
79 8990 : }
80 0 : path(const std::string &FileURL)
81 0 : {
82 0 : rtl::OString tmp(FileURL.c_str());
83 0 : data = rtl::OStringToOUString(tmp, getThreadTextEncoding());
84 0 : }
85 26242 : std::string native_file_string() const
86 : {
87 26242 : ::rtl::OUString ustrSystemPath;
88 26242 : osl::File::getSystemPathFromFileURL(data, ustrSystemPath);
89 26242 : rtl::OString tmp(rtl::OUStringToOString(ustrSystemPath, getThreadTextEncoding()));
90 : HCDBG(std::cerr << "native_file_string is " << tmp.getStr() << std::endl);
91 26242 : return std::string(tmp.getStr());
92 : }
93 : #ifdef WNT
94 : wchar_t const * native_file_string_w() const
95 : {
96 : ::rtl::OUString ustrSystemPath;
97 : osl::File::getSystemPathFromFileURL(data, ustrSystemPath);
98 : return (wchar_t const *) ustrSystemPath.getStr();
99 : }
100 : #endif
101 : std::string native_directory_string() const { return native_file_string(); }
102 8 : std::string toUTF8() const
103 : {
104 8 : rtl::OString tmp(rtl::OUStringToOString(data, RTL_TEXTENCODING_UTF8));
105 8 : return std::string(tmp.getStr());
106 : }
107 54 : bool empty() const { return data.isEmpty(); }
108 17358 : path operator/(const std::string &in) const
109 : {
110 17358 : path ret(*this);
111 : HCDBG(std::cerr << "orig was " <<
112 : rtl::OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl);
113 17358 : rtl::OString tmp(in.c_str());
114 17358 : rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding()));
115 17358 : ret.data += rtl::OUString(sal_Unicode('/'));
116 17358 : ret.data += ustrSystemPath;
117 : HCDBG(std::cerr << "final is " <<
118 : rtl::OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl);
119 17358 : return ret;
120 : }
121 8906 : void append(const char *in)
122 : {
123 8906 : rtl::OString tmp(in);
124 8906 : rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding()));
125 8906 : data = data + ustrSystemPath;
126 8906 : }
127 8906 : void append(const std::string &in) { append(in.c_str()); }
128 : };
129 :
130 : void create_directory(const fs::path indexDirName);
131 : void copy(const fs::path &src, const fs::path &dest);
132 : }
133 :
134 : struct joaat_hash
135 : {
136 65006 : size_t operator()(const std::string &str) const
137 : {
138 65006 : size_t hash = 0;
139 65006 : const char *key = str.data();
140 1969368 : for (size_t i = 0; i < str.size(); i++)
141 : {
142 1904362 : hash += key[i];
143 1904362 : hash += (hash << 10);
144 1904362 : hash ^= (hash >> 6);
145 : }
146 65006 : hash += (hash << 3);
147 65006 : hash ^= (hash >> 11);
148 65006 : hash += (hash << 15);
149 65006 : return hash;
150 : }
151 : };
152 :
153 : #define get16bits(d) ((((sal_uInt32)(((const sal_uInt8 *)(d))[1])) << 8)\
154 : +(sal_uInt32)(((const sal_uInt8 *)(d))[0]) )
155 :
156 : #define pref_hash joaat_hash
157 :
158 : typedef boost::unordered_map<std::string, std::string, pref_hash> Stringtable;
159 : typedef std::list<std::string> LinkedList;
160 : typedef std::vector<std::string> HashSet;
161 :
162 : typedef boost::unordered_map<std::string, LinkedList, pref_hash> Hashtable;
163 :
164 : class StreamTable
165 : {
166 : public:
167 : std::string document_id;
168 : std::string document_path;
169 : std::string document_module;
170 : std::string document_title;
171 :
172 : HashSet *appl_hidlist;
173 : Hashtable *appl_keywords;
174 : Stringtable *appl_helptexts;
175 : xmlDocPtr appl_doc;
176 :
177 : HashSet *default_hidlist;
178 : Hashtable *default_keywords;
179 : Stringtable *default_helptexts;
180 : xmlDocPtr default_doc;
181 :
182 8906 : StreamTable() :
183 : appl_hidlist(NULL), appl_keywords(NULL), appl_helptexts(NULL), appl_doc(NULL),
184 8906 : default_hidlist(NULL), default_keywords(NULL), default_helptexts(NULL), default_doc(NULL)
185 8906 : {}
186 8906 : void dropdefault()
187 : {
188 8906 : delete default_hidlist;
189 8906 : delete default_keywords;
190 8906 : delete default_helptexts;
191 8906 : if (default_doc) xmlFreeDoc(default_doc);
192 8906 : }
193 17812 : void dropappl()
194 : {
195 17812 : delete appl_hidlist;
196 17812 : delete appl_keywords;
197 17812 : delete appl_helptexts;
198 17812 : if (appl_doc) xmlFreeDoc(appl_doc);
199 17812 : }
200 8906 : ~StreamTable()
201 8906 : {
202 8906 : dropappl();
203 8906 : dropdefault();
204 8906 : }
205 : };
206 :
207 0 : struct HelpProcessingException
208 : {
209 : HelpProcessingErrorClass m_eErrorClass;
210 : std::string m_aErrorMsg;
211 : std::string m_aXMLParsingFile;
212 : int m_nXMLParsingLine;
213 :
214 0 : HelpProcessingException( HelpProcessingErrorClass eErrorClass, const std::string& aErrorMsg )
215 : : m_eErrorClass( eErrorClass )
216 : , m_aErrorMsg( aErrorMsg )
217 0 : , m_nXMLParsingLine( 0 )
218 0 : {}
219 0 : HelpProcessingException( const std::string& aErrorMsg, const std::string& aXMLParsingFile, int nXMLParsingLine )
220 : : m_eErrorClass( HELPPROCESSING_XMLPARSING_ERROR )
221 : , m_aErrorMsg( aErrorMsg )
222 : , m_aXMLParsingFile( aXMLParsingFile )
223 0 : , m_nXMLParsingLine( nXMLParsingLine )
224 0 : {}
225 : };
226 :
227 8906 : class HelpCompiler
228 : {
229 : public:
230 : HelpCompiler(StreamTable &streamTable,
231 : const fs::path &in_inputFile,
232 : const fs::path &in_src,
233 : const fs::path &in_resEmbStylesheet,
234 : const std::string &in_module,
235 : const std::string &in_lang,
236 : bool in_bExtensionMode);
237 : bool compile( void ) throw (HelpProcessingException);
238 : void addEntryToJarFile(const std::string &prefix,
239 : const std::string &entryName, const std::string &bytesToAdd);
240 : void addEntryToJarFile(const std::string &prefix,
241 : const std::string &entryName, const HashSet &bytesToAdd);
242 : void addEntryToJarFile(const std::string &prefix,
243 : const std::string &entryName, const Stringtable &bytesToAdd);
244 : void addEntryToJarFile(const std::string &prefix,
245 : const std::string &entryName, const Hashtable &bytesToAdd);
246 : private:
247 : xmlDocPtr getSourceDocument(const fs::path &filePath);
248 : xmlNodePtr clone(xmlNodePtr node, const std::string& appl);
249 : StreamTable &streamTable;
250 : const fs::path inputFile, src;
251 : const std::string module, lang;
252 : const fs::path resEmbStylesheet;
253 : bool bExtensionMode;
254 : std::string gui;
255 : };
256 :
257 56490 : inline char tocharlower(char c)
258 : {
259 56490 : return static_cast<char>(tolower(c));
260 : }
261 :
262 : #endif
263 :
264 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|