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