xref: /AOO41X/main/sfx2/source/bastyp/frmhtmlw.cxx (revision d119d52d53d0b2180f2ae51341d882123be2af2b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sfx2.hxx"
26 
27 #ifndef _INETDEF_HXX
28 #include <svl/inetdef.hxx>
29 #endif
30 #include "svtools/htmlkywd.hxx"
31 
32 //!(dv) #include <chaos2/cntapi.hxx>
33 #include <rtl/tencinfo.h>
34 
35 #include <unotools/configmgr.hxx>
36 #include "svl/urihelper.hxx"
37 #include <tools/datetime.hxx>
38 
39 #include <sfx2/frmhtmlw.hxx>
40 #include <sfx2/evntconf.hxx>
41 #include <sfx2/frame.hxx>
42 #include <sfx2/app.hxx>
43 #include <sfx2/viewfrm.hxx>
44 #include <sfx2/docfile.hxx>
45 #include "sfx2/sfxresid.hxx"
46 #include <sfx2/objsh.hxx>
47 #include <sfx2/sfx.hrc>
48 #include "bastyp.hrc"
49 
50 #include <comphelper/string.hxx>
51 #include <comphelper/processfactory.hxx>
52 
53 #include <com/sun/star/script/XTypeConverter.hpp>
54 #include <com/sun/star/document/XDocumentProperties.hpp>
55 
56 
57 // -----------------------------------------------------------------------
58 
59 using namespace ::com::sun::star;
60 
61 static sal_Char __READONLY_DATA sHTML_SC_yes[] =    "YES";
62 static sal_Char __READONLY_DATA sHTML_SC_no[] =     "NO";
63 static sal_Char __READONLY_DATA sHTML_SC_auto[] =   "AUTO";
64 static sal_Char __READONLY_DATA sHTML_MIME_text_html[] =    "text/html; charset=";
65 
66 /* not used anymore?
67 static HTMLOutEvent __FAR_DATA aFrameSetEventTable[] =
68 {
69     { sHTML_O_SDonload,     sHTML_O_onload,     SFX_EVENT_OPENDOC   },
70     { sHTML_O_SDonunload,   sHTML_O_onunload,   SFX_EVENT_PREPARECLOSEDOC   },
71     { sHTML_O_SDonfocus,    sHTML_O_onfocus,    SFX_EVENT_ACTIVATEDOC   },
72     { sHTML_O_SDonblur,     sHTML_O_onblur,     SFX_EVENT_DEACTIVATEDOC },
73     { 0,                    0,                  0                   }
74 };
75 */
76 
77 #if defined(UNX)
78 const sal_Char SfxFrameHTMLWriter::sNewLine[] = "\012";
79 #else
80 const sal_Char __FAR_DATA SfxFrameHTMLWriter::sNewLine[] = "\015\012";
81 #endif
82 
OutMeta(SvStream & rStrm,const sal_Char * pIndent,const String & rName,const String & rContent,sal_Bool bHTTPEquiv,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)83 void SfxFrameHTMLWriter::OutMeta( SvStream& rStrm,
84                                   const sal_Char *pIndent,
85                                   const String& rName,
86                                   const String& rContent, sal_Bool bHTTPEquiv,
87                                   rtl_TextEncoding eDestEnc,
88                                   String *pNonConvertableChars  )
89 {
90     rStrm << sNewLine;
91     if( pIndent )
92         rStrm << pIndent;
93 
94     ByteString sOut( '<' );
95     (((sOut += OOO_STRING_SVTOOLS_HTML_meta) += ' ')
96         += (bHTTPEquiv ? OOO_STRING_SVTOOLS_HTML_O_httpequiv : OOO_STRING_SVTOOLS_HTML_O_name)) += "=\"";
97     rStrm << sOut.GetBuffer();
98 
99     HTMLOutFuncs::Out_String( rStrm, rName, eDestEnc, pNonConvertableChars );
100 
101     ((sOut = "\" ") += OOO_STRING_SVTOOLS_HTML_O_content) += "=\"";
102     rStrm << sOut.GetBuffer();
103 
104     HTMLOutFuncs::Out_String( rStrm, rContent, eDestEnc, pNonConvertableChars ) << "\">";
105 }
106 
Out_DocInfo(SvStream & rStrm,const String & rBaseURL,const uno::Reference<document::XDocumentProperties> & i_xDocProps,const sal_Char * pIndent,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)107 void SfxFrameHTMLWriter::Out_DocInfo( SvStream& rStrm, const String& rBaseURL,
108         const uno::Reference<document::XDocumentProperties> & i_xDocProps,
109         const sal_Char *pIndent,
110         rtl_TextEncoding eDestEnc,
111         String *pNonConvertableChars    )
112 {
113     const sal_Char *pCharSet =
114                 rtl_getBestMimeCharsetFromTextEncoding( eDestEnc );
115 
116     if( pCharSet )
117     {
118         String aContentType = String::CreateFromAscii( sHTML_MIME_text_html );
119         aContentType.AppendAscii( pCharSet );
120         OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_content_type, aContentType, sal_True,
121                  eDestEnc, pNonConvertableChars );
122     }
123 
124     // Titel (auch wenn er leer ist)
125     rStrm << sNewLine;
126     if( pIndent )
127         rStrm << pIndent;
128     HTMLOutFuncs::Out_AsciiTag( rStrm, OOO_STRING_SVTOOLS_HTML_title );
129     if( i_xDocProps.is() )
130     {
131         const String& rTitle = i_xDocProps->getTitle();
132         if( rTitle.Len() )
133             HTMLOutFuncs::Out_String( rStrm, rTitle, eDestEnc, pNonConvertableChars );
134     }
135     HTMLOutFuncs::Out_AsciiTag( rStrm, OOO_STRING_SVTOOLS_HTML_title, sal_False );
136 
137     // Target-Frame
138     if( i_xDocProps.is() )
139     {
140         const String& rTarget = i_xDocProps->getDefaultTarget();
141         if( rTarget.Len() )
142         {
143             rStrm << sNewLine;
144             if( pIndent )
145                 rStrm << pIndent;
146 
147             ByteString sOut( '<' );
148             (((sOut += OOO_STRING_SVTOOLS_HTML_base) += ' ') += OOO_STRING_SVTOOLS_HTML_O_target) += "=\"";
149             rStrm << sOut.GetBuffer();
150             HTMLOutFuncs::Out_String( rStrm, rTarget, eDestEnc, pNonConvertableChars )
151                 << "\">";
152         }
153     }
154 
155     // Who we are
156     String sGenerator( SfxResId( STR_HTML_GENERATOR ) );
157     sGenerator.SearchAndReplaceAscii( "%1", String( DEFINE_CONST_UNICODE( TOOLS_INETDEF_OS ) ) );
158     OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_generator, sGenerator, sal_False, eDestEnc, pNonConvertableChars );
159 
160     if( i_xDocProps.is() )
161     {
162         // Reload
163         if( (i_xDocProps->getAutoloadSecs() != 0) ||
164             !i_xDocProps->getAutoloadURL().equalsAscii("") )
165         {
166             String sContent = String::CreateFromInt32(
167                                 i_xDocProps->getAutoloadSecs() );
168 
169             const String &rReloadURL = i_xDocProps->getAutoloadURL();
170             if( rReloadURL.Len() )
171             {
172                 sContent.AppendAscii( ";URL=" );
173                 sContent += String(
174                     URIHelper::simpleNormalizedMakeRelative(
175                         rBaseURL, rReloadURL));
176             }
177 
178             OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_refresh, sContent, sal_True,
179                      eDestEnc, pNonConvertableChars );
180         }
181 
182         // Author
183         const String& rAuthor = i_xDocProps->getAuthor();
184         if( rAuthor.Len() )
185             OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_author, rAuthor, sal_False,
186                      eDestEnc, pNonConvertableChars );
187 
188         // created
189         ::util::DateTime uDT = i_xDocProps->getCreationDate();
190         Date aD(uDT.Day, uDT.Month, uDT.Year);
191         Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
192         String sOut = String::CreateFromInt32(aD.GetDate());
193         sOut += ';';
194         sOut += String::CreateFromInt32(aT.GetTime());
195         OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_created, sOut, sal_False,
196                  eDestEnc, pNonConvertableChars );
197 
198         // changedby
199         const String& rChangedBy = i_xDocProps->getModifiedBy();
200         if( rChangedBy.Len() )
201             OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_changedby, rChangedBy, sal_False,
202                      eDestEnc, pNonConvertableChars );
203 
204         // changed
205         uDT = i_xDocProps->getModificationDate();
206         Date aD2(uDT.Day, uDT.Month, uDT.Year);
207         Time aT2(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
208         sOut = String::CreateFromInt32(aD2.GetDate());
209         sOut += ';';
210         sOut += String::CreateFromInt32(aT2.GetTime());
211         OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_changed, sOut, sal_False,
212                  eDestEnc, pNonConvertableChars );
213 
214         // Subject
215         const String& rTheme = i_xDocProps->getSubject();
216         if( rTheme.Len() )
217             OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_classification, rTheme, sal_False,
218                      eDestEnc, pNonConvertableChars );
219 
220         // Description
221         const String& rComment = i_xDocProps->getDescription();
222         if( rComment.Len() )
223             OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_description, rComment, sal_False,
224                      eDestEnc, pNonConvertableChars);
225 
226         // Keywords
227         String Keywords = ::comphelper::string::convertCommaSeparated(
228             i_xDocProps->getKeywords());
229         if( Keywords.Len() )
230             OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_keywords, Keywords, sal_False,
231                      eDestEnc, pNonConvertableChars);
232 
233         uno::Reference < script::XTypeConverter > xConverter(
234             ::comphelper::getProcessServiceFactory()->createInstance(
235                 ::rtl::OUString::createFromAscii("com.sun.star.script.Converter")),
236                 uno::UNO_QUERY_THROW );
237         uno::Reference<beans::XPropertySet> xUserDefinedProps(
238             i_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
239         DBG_ASSERT(xUserDefinedProps.is(), "UserDefinedProperties is null");
240         uno::Reference<beans::XPropertySetInfo> xPropInfo =
241             xUserDefinedProps->getPropertySetInfo();
242         DBG_ASSERT(xPropInfo.is(), "UserDefinedProperties Info is null");
243         uno::Sequence<beans::Property> props = xPropInfo->getProperties();
244         for (sal_Int32 i = 0; i < props.getLength(); ++i) {
245             try {
246                 ::rtl::OUString name = props[i].Name;
247                 ::rtl::OUString str;
248                 uno::Any aStr = xConverter->convertToSimpleType(
249                         xUserDefinedProps->getPropertyValue(name),
250                         uno::TypeClass_STRING);
251                 aStr >>= str;
252                 String valstr(str);
253                 valstr.EraseTrailingChars();
254                 OutMeta( rStrm, pIndent, name, valstr, sal_False,
255                          eDestEnc, pNonConvertableChars );
256             } catch (uno::Exception &) {
257                 // may happen with concurrent modification...
258                 DBG_WARNING("SfxFrameHTMLWriter::Out_DocInfo: exception");
259             }
260         }
261     }
262 }
263 /*
264 void SfxFrameHTMLWriter::OutHeader( rtl_TextEncoding eDestEnc )
265 {
266     // <HTML>
267     // <HEAD>
268     // <TITLE>Titel</TITLE>
269     // </HEAD>
270     HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_html ) << sNewLine;
271     HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_head );
272 
273     Out_DocInfo( Strm(), &pDoc->GetDocInfo(), "\t", eDestEnc );
274     Strm() << sNewLine;
275     HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_head, sal_False ) << sNewLine;
276 
277 //! OutScript();            // Hier fehlen noch die Scripten im Header
278 }
279 */
280 
Out_FrameDescriptor(SvStream & rOut,const String & rBaseURL,const uno::Reference<beans::XPropertySet> & xSet,rtl_TextEncoding eDestEnc,String * pNonConvertableChars)281 void SfxFrameHTMLWriter::Out_FrameDescriptor(
282     SvStream& rOut, const String& rBaseURL, const uno::Reference < beans::XPropertySet >& xSet,
283     rtl_TextEncoding eDestEnc, String *pNonConvertableChars )
284 {
285     try
286     {
287         ByteString sOut;
288         ::rtl::OUString aStr;
289         uno::Any aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameURL") );
290         if ( (aAny >>= aStr) && aStr.getLength() )
291         {
292             String aURL = INetURLObject( aStr ).GetMainURL( INetURLObject::DECODE_TO_IURI );
293             if( aURL.Len() )
294             {
295                 aURL = URIHelper::simpleNormalizedMakeRelative(
296                     rBaseURL, aURL );
297                 ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_src) += "=\"";
298                 rOut << sOut.GetBuffer();
299                 HTMLOutFuncs::Out_String( rOut, aURL, eDestEnc, pNonConvertableChars );
300                 sOut = '\"';
301             }
302         }
303 
304         aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameName") );
305         if ( (aAny >>= aStr) && aStr.getLength() )
306         {
307             ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"";
308             rOut << sOut.GetBuffer();
309             HTMLOutFuncs::Out_String( rOut, aStr, eDestEnc, pNonConvertableChars );
310             sOut = '\"';
311         }
312 
313         sal_Int32 nVal = SIZE_NOT_SET;
314         aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginWidth") );
315         if ( (aAny >>= nVal) && nVal != SIZE_NOT_SET )
316             (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_marginwidth) += '=') += ByteString::CreateFromInt32( nVal );
317         aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginHeight") );
318         if ( (aAny >>= nVal) && nVal != SIZE_NOT_SET )
319             (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_marginheight) += '=') += ByteString::CreateFromInt32( nVal );
320 
321         sal_Bool bVal = sal_True;
322         aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoScroll") );
323         if ( (aAny >>= bVal) && !bVal )
324         {
325             aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsScrollingMode") );
326             if ( aAny >>= bVal )
327             {
328                 const sal_Char *pStr = bVal ? sHTML_SC_yes : sHTML_SC_no;
329                 (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_scrolling) += '=') += pStr;
330             }
331         }
332 
333         // frame border (MS+Netscape-Erweiterung)
334         aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoBorder") );
335         if ( (aAny >>= bVal) && !bVal )
336         {
337             aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsBorder") );
338             if ( aAny >>= bVal )
339             {
340                 const char* pStr = bVal ? sHTML_SC_yes : sHTML_SC_no;
341                 (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_frameborder) += '=') += pStr;
342             }
343         }
344 
345         // TODO/LATER: currently not supported attributes
346         // resize
347         //if( !pFrame->IsResizable() )
348         //    (sOut += ' ') += sHTML_O_noresize;
349         //
350         //if ( pFrame->GetWallpaper() )
351         //{
352         //    ((sOut += ' ') += sHTML_O_bordercolor) += '=';
353         //    rOut << sOut.GetBuffer();
354         //    HTMLOutFuncs::Out_Color( rOut, pFrame->GetWallpaper()->GetColor(), eDestEnc );
355         //}
356         //else
357             rOut << sOut.GetBuffer();
358     }
359     catch ( uno::Exception& )
360     {
361     }
362 }
363 
CreateURL(SfxFrame * pFrame)364 String SfxFrameHTMLWriter::CreateURL( SfxFrame* pFrame )
365 {
366     String aRet;
367     SfxObjectShell* pShell = pFrame->GetCurrentDocument();
368     if( !aRet.Len() && pShell )
369     {
370         aRet = pShell->GetMedium()->GetName();
371 //!(dv)     CntAnchor::ToPresentationURL( aRet );
372     }
373 
374     return aRet;
375 }
376 
377 
378