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 : #include <svtools/htmlkywd.hxx>
21 :
22 : #include <rtl/tencinfo.h>
23 :
24 : #include <unotools/configmgr.hxx>
25 : #include <svl/urihelper.hxx>
26 : #include <tools/datetime.hxx>
27 :
28 : #include <sfx2/frmhtmlw.hxx>
29 : #include <sfx2/evntconf.hxx>
30 : #include <sfx2/frame.hxx>
31 : #include <sfx2/app.hxx>
32 : #include <sfx2/viewfrm.hxx>
33 : #include <sfx2/docfile.hxx>
34 : #include <sfx2/sfxresid.hxx>
35 : #include <sfx2/objsh.hxx>
36 : #include <sfx2/sfx.hrc>
37 : #include "bastyp.hrc"
38 :
39 : #include <comphelper/processfactory.hxx>
40 : #include <comphelper/string.hxx>
41 :
42 : #include <com/sun/star/script/Converter.hpp>
43 : #include <com/sun/star/document/XDocumentProperties.hpp>
44 :
45 : #include <rtl/bootstrap.hxx>
46 : #include <rtl/strbuf.hxx>
47 :
48 :
49 :
50 :
51 : using namespace ::com::sun::star;
52 :
53 : static sal_Char const sHTML_SC_yes[] = "YES";
54 : static sal_Char const sHTML_SC_no[] = "NO";
55 : static sal_Char const sHTML_MIME_text_html[] = "text/html; charset=";
56 :
57 0 : void SfxFrameHTMLWriter::OutMeta( SvStream& rStrm,
58 : const sal_Char *pIndent,
59 : const OUString& rName,
60 : const OUString& rContent,
61 : bool bHTTPEquiv,
62 : rtl_TextEncoding eDestEnc,
63 : OUString *pNonConvertableChars )
64 : {
65 0 : rStrm.WriteCharPtr( SAL_NEWLINE_STRING );
66 0 : if( pIndent )
67 0 : rStrm.WriteCharPtr( pIndent );
68 :
69 0 : OStringBuffer sOut;
70 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_meta).append(' ')
71 0 : .append(bHTTPEquiv ? OOO_STRING_SVTOOLS_HTML_O_httpequiv : OOO_STRING_SVTOOLS_HTML_O_name).append("=\"");
72 0 : rStrm.WriteCharPtr( sOut.makeStringAndClear().getStr() );
73 :
74 0 : HTMLOutFuncs::Out_String( rStrm, rName, eDestEnc, pNonConvertableChars );
75 :
76 0 : sOut.append("\" ").append(OOO_STRING_SVTOOLS_HTML_O_content).append("=\"");
77 0 : rStrm.WriteCharPtr( sOut.makeStringAndClear().getStr() );
78 :
79 0 : HTMLOutFuncs::Out_String( rStrm, rContent, eDestEnc, pNonConvertableChars ).WriteCharPtr( "\">" );
80 0 : }
81 :
82 0 : void SfxFrameHTMLWriter::Out_DocInfo( SvStream& rStrm, const OUString& rBaseURL,
83 : const uno::Reference<document::XDocumentProperties> & i_xDocProps,
84 : const sal_Char *pIndent,
85 : rtl_TextEncoding eDestEnc,
86 : OUString *pNonConvertableChars )
87 : {
88 : const sal_Char *pCharSet =
89 0 : rtl_getBestMimeCharsetFromTextEncoding( eDestEnc );
90 :
91 0 : if( pCharSet )
92 : {
93 0 : OUString aContentType(sHTML_MIME_text_html);
94 0 : aContentType += OUString(pCharSet, strlen(pCharSet), RTL_TEXTENCODING_UTF8);
95 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_content_type, aContentType, true,
96 0 : eDestEnc, pNonConvertableChars );
97 : }
98 :
99 : // Titel (auch wenn er leer ist)
100 0 : rStrm.WriteCharPtr( SAL_NEWLINE_STRING );
101 0 : if( pIndent )
102 0 : rStrm.WriteCharPtr( pIndent );
103 0 : HTMLOutFuncs::Out_AsciiTag( rStrm, OOO_STRING_SVTOOLS_HTML_title );
104 0 : if( i_xDocProps.is() )
105 : {
106 0 : const OUString& rTitle = i_xDocProps->getTitle();
107 0 : if( !rTitle.isEmpty() )
108 0 : HTMLOutFuncs::Out_String( rStrm, rTitle, eDestEnc, pNonConvertableChars );
109 : }
110 0 : HTMLOutFuncs::Out_AsciiTag( rStrm, OOO_STRING_SVTOOLS_HTML_title, false );
111 :
112 : // Target-Frame
113 0 : if( i_xDocProps.is() )
114 : {
115 0 : const OUString& rTarget = i_xDocProps->getDefaultTarget();
116 0 : if( !rTarget.isEmpty() )
117 : {
118 0 : rStrm.WriteCharPtr( SAL_NEWLINE_STRING );
119 0 : if( pIndent )
120 0 : rStrm.WriteCharPtr( pIndent );
121 :
122 0 : OStringBuffer sOut;
123 0 : sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_base).append(' ')
124 0 : .append(OOO_STRING_SVTOOLS_HTML_O_target).append("=\"");
125 0 : rStrm.WriteCharPtr( sOut.makeStringAndClear().getStr() );
126 0 : HTMLOutFuncs::Out_String( rStrm, rTarget, eDestEnc, pNonConvertableChars )
127 0 : .WriteCharPtr( "\">" );
128 0 : }
129 : }
130 :
131 : // Who we are
132 0 : OUString sGenerator( SfxResId(STR_HTML_GENERATOR).toString() );
133 0 : OUString os( "$_OS" );
134 0 : ::rtl::Bootstrap::expandMacros(os);
135 0 : sGenerator = sGenerator.replaceFirst( "%1", os );
136 0 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_generator, sGenerator, false, eDestEnc, pNonConvertableChars );
137 :
138 0 : if( i_xDocProps.is() )
139 : {
140 : // Reload
141 0 : if( (i_xDocProps->getAutoloadSecs() != 0) ||
142 0 : !i_xDocProps->getAutoloadURL().isEmpty() )
143 : {
144 : OUString sContent = OUString::number(
145 0 : i_xDocProps->getAutoloadSecs() );
146 :
147 0 : const OUString &rReloadURL = i_xDocProps->getAutoloadURL();
148 0 : if( !rReloadURL.isEmpty() )
149 : {
150 0 : sContent += ";URL=";
151 0 : sContent += URIHelper::simpleNormalizedMakeRelative(
152 0 : rBaseURL, rReloadURL);
153 : }
154 :
155 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_refresh, sContent, true,
156 0 : eDestEnc, pNonConvertableChars );
157 : }
158 :
159 : // Author
160 0 : const OUString& rAuthor = i_xDocProps->getAuthor();
161 0 : if( !rAuthor.isEmpty() )
162 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_author, rAuthor, false,
163 0 : eDestEnc, pNonConvertableChars );
164 :
165 : // created
166 0 : ::util::DateTime uDT = i_xDocProps->getCreationDate();
167 0 : Date aD(uDT.Day, uDT.Month, uDT.Year);
168 0 : Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds);
169 0 : OUString sOut = OUString::number(aD.GetDate());
170 0 : sOut += ";";
171 0 : sOut += OUString::number(aT.GetTime());
172 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_created, sOut, false,
173 0 : eDestEnc, pNonConvertableChars );
174 :
175 : // changedby
176 0 : const OUString& rChangedBy = i_xDocProps->getModifiedBy();
177 0 : if( !rChangedBy.isEmpty() )
178 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_changedby, rChangedBy, false,
179 0 : eDestEnc, pNonConvertableChars );
180 :
181 : // changed
182 0 : uDT = i_xDocProps->getModificationDate();
183 0 : Date aD2(uDT.Day, uDT.Month, uDT.Year);
184 0 : Time aT2(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.NanoSeconds);
185 0 : sOut = OUString::number(aD2.GetDate());
186 0 : sOut += ";";
187 0 : sOut += OUString::number(aT2.GetTime());
188 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_changed, sOut, false,
189 0 : eDestEnc, pNonConvertableChars );
190 :
191 : // Subject
192 0 : const OUString& rTheme = i_xDocProps->getSubject();
193 0 : if( !rTheme.isEmpty() )
194 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_classification, rTheme, false,
195 0 : eDestEnc, pNonConvertableChars );
196 :
197 : // Description
198 0 : const OUString& rComment = i_xDocProps->getDescription();
199 0 : if( !rComment.isEmpty() )
200 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_description, rComment, false,
201 0 : eDestEnc, pNonConvertableChars);
202 :
203 : // Keywords
204 : OUString Keywords = ::comphelper::string::convertCommaSeparated(
205 0 : i_xDocProps->getKeywords());
206 0 : if( !Keywords.isEmpty() )
207 : OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_keywords, Keywords, false,
208 0 : eDestEnc, pNonConvertableChars);
209 :
210 : uno::Reference < script::XTypeConverter > xConverter( script::Converter::create(
211 0 : ::comphelper::getProcessComponentContext() ) );
212 : uno::Reference<beans::XPropertySet> xUserDefinedProps(
213 0 : i_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
214 : DBG_ASSERT(xUserDefinedProps.is(), "UserDefinedProperties is null");
215 : uno::Reference<beans::XPropertySetInfo> xPropInfo =
216 0 : xUserDefinedProps->getPropertySetInfo();
217 : DBG_ASSERT(xPropInfo.is(), "UserDefinedProperties Info is null");
218 0 : uno::Sequence<beans::Property> props = xPropInfo->getProperties();
219 0 : for (sal_Int32 i = 0; i < props.getLength(); ++i)
220 : {
221 : try
222 : {
223 0 : OUString name = props[i].Name;
224 0 : uno::Any aStr = xConverter->convertToSimpleType(
225 0 : xUserDefinedProps->getPropertyValue(name),
226 0 : uno::TypeClass_STRING);
227 0 : OUString str;
228 0 : aStr >>= str;
229 0 : OUString valstr(comphelper::string::stripEnd(str, ' '));
230 : OutMeta( rStrm, pIndent, name, valstr, false,
231 0 : eDestEnc, pNonConvertableChars );
232 : }
233 0 : catch (const uno::Exception&)
234 : {
235 : // may happen with concurrent modification...
236 : DBG_WARNING("SfxFrameHTMLWriter::Out_DocInfo: exception");
237 : }
238 0 : }
239 0 : }
240 0 : }
241 :
242 0 : void SfxFrameHTMLWriter::Out_FrameDescriptor(
243 : SvStream& rOut, const OUString& rBaseURL, const uno::Reference < beans::XPropertySet >& xSet,
244 : rtl_TextEncoding eDestEnc, OUString *pNonConvertableChars )
245 : {
246 : try
247 : {
248 0 : OStringBuffer sOut;
249 0 : OUString aStr;
250 0 : uno::Any aAny = xSet->getPropertyValue("FrameURL");
251 0 : if ( (aAny >>= aStr) && !aStr.isEmpty() )
252 : {
253 0 : OUString aURL = INetURLObject( aStr ).GetMainURL( INetURLObject::DECODE_TO_IURI );
254 0 : if( !aURL.isEmpty() )
255 : {
256 0 : aURL = URIHelper::simpleNormalizedMakeRelative(
257 0 : rBaseURL, aURL );
258 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_src)
259 0 : .append("=\"");
260 0 : rOut.WriteCharPtr( sOut.makeStringAndClear().getStr() );
261 0 : HTMLOutFuncs::Out_String( rOut, aURL, eDestEnc, pNonConvertableChars );
262 0 : sOut.append('\"');
263 0 : }
264 : }
265 :
266 0 : aAny = xSet->getPropertyValue("FrameName");
267 0 : if ( (aAny >>= aStr) && !aStr.isEmpty() )
268 : {
269 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_name)
270 0 : .append("=\"");
271 0 : rOut.WriteCharPtr( sOut.makeStringAndClear().getStr() );
272 0 : HTMLOutFuncs::Out_String( rOut, aStr, eDestEnc, pNonConvertableChars );
273 0 : sOut.append('\"');
274 : }
275 :
276 0 : sal_Int32 nVal = SIZE_NOT_SET;
277 0 : aAny = xSet->getPropertyValue("FrameMarginWidth");
278 0 : if ( (aAny >>= nVal) && nVal != SIZE_NOT_SET )
279 : {
280 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_marginwidth)
281 0 : .append('=').append(nVal);
282 : }
283 0 : aAny = xSet->getPropertyValue("FrameMarginHeight");
284 0 : if ( (aAny >>= nVal) && nVal != SIZE_NOT_SET )
285 : {
286 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_marginheight)
287 0 : .append('=').append(nVal);
288 : }
289 :
290 0 : bool bVal = true;
291 0 : aAny = xSet->getPropertyValue("FrameIsAutoScroll");
292 0 : if ( (aAny >>= bVal) && !bVal )
293 : {
294 0 : aAny = xSet->getPropertyValue("FrameIsScrollingMode");
295 0 : if ( aAny >>= bVal )
296 : {
297 0 : const sal_Char *pStr = bVal ? sHTML_SC_yes : sHTML_SC_no;
298 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_scrolling)
299 0 : .append(pStr);
300 : }
301 : }
302 :
303 : // frame border (MS+Netscape-Extension)
304 0 : aAny = xSet->getPropertyValue("FrameIsAutoBorder");
305 0 : if ( (aAny >>= bVal) && !bVal )
306 : {
307 0 : aAny = xSet->getPropertyValue("FrameIsBorder");
308 0 : if ( aAny >>= bVal )
309 : {
310 0 : const char* pStr = bVal ? sHTML_SC_yes : sHTML_SC_no;
311 0 : sOut.append(' ').append(OOO_STRING_SVTOOLS_HTML_O_frameborder)
312 0 : .append('=').append(pStr);
313 : }
314 : }
315 0 : rOut.WriteCharPtr( sOut.getStr() );
316 : }
317 0 : catch (const uno::Exception&)
318 : {
319 : }
320 0 : }
321 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|