summaryrefslogtreecommitdiff
path: root/sfx2/source/bastyp/frmhtmlw.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sfx2/source/bastyp/frmhtmlw.cxx')
-rw-r--r--sfx2/source/bastyp/frmhtmlw.cxx381
1 files changed, 381 insertions, 0 deletions
diff --git a/sfx2/source/bastyp/frmhtmlw.cxx b/sfx2/source/bastyp/frmhtmlw.cxx
new file mode 100644
index 000000000000..df81eb3f4039
--- /dev/null
+++ b/sfx2/source/bastyp/frmhtmlw.cxx
@@ -0,0 +1,381 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sfx2.hxx"
+
+#ifndef _INETDEF_HXX
+#include <svl/inetdef.hxx>
+#endif
+#include "svtools/htmlkywd.hxx"
+
+//!(dv) #include <chaos2/cntapi.hxx>
+#include <rtl/tencinfo.h>
+
+#include <unotools/configmgr.hxx>
+#include "svl/urihelper.hxx"
+#include <tools/datetime.hxx>
+
+#include <sfx2/frmhtmlw.hxx>
+#include <sfx2/evntconf.hxx>
+#include <sfx2/frame.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/docfile.hxx>
+#include "sfxresid.hxx"
+#include <sfx2/objsh.hxx>
+#include <sfx2/sfx.hrc>
+#include "bastyp.hrc"
+
+#include <comphelper/string.hxx>
+#include <comphelper/processfactory.hxx>
+
+#include <com/sun/star/script/XTypeConverter.hpp>
+#include <com/sun/star/document/XDocumentProperties.hpp>
+
+
+// -----------------------------------------------------------------------
+
+using namespace ::com::sun::star;
+
+static sal_Char __READONLY_DATA sHTML_SC_yes[] = "YES";
+static sal_Char __READONLY_DATA sHTML_SC_no[] = "NO";
+static sal_Char __READONLY_DATA sHTML_SC_auto[] = "AUTO";
+static sal_Char __READONLY_DATA sHTML_MIME_text_html[] = "text/html; charset=";
+
+/* not used anymore?
+static HTMLOutEvent __FAR_DATA aFrameSetEventTable[] =
+{
+ { sHTML_O_SDonload, sHTML_O_onload, SFX_EVENT_OPENDOC },
+ { sHTML_O_SDonunload, sHTML_O_onunload, SFX_EVENT_PREPARECLOSEDOC },
+ { sHTML_O_SDonfocus, sHTML_O_onfocus, SFX_EVENT_ACTIVATEDOC },
+ { sHTML_O_SDonblur, sHTML_O_onblur, SFX_EVENT_DEACTIVATEDOC },
+ { 0, 0, 0 }
+};
+*/
+
+#if defined(UNX)
+const sal_Char SfxFrameHTMLWriter::sNewLine[] = "\012";
+#else
+const sal_Char __FAR_DATA SfxFrameHTMLWriter::sNewLine[] = "\015\012";
+#endif
+
+void SfxFrameHTMLWriter::OutMeta( SvStream& rStrm,
+ const sal_Char *pIndent,
+ const String& rName,
+ const String& rContent, BOOL bHTTPEquiv,
+ rtl_TextEncoding eDestEnc,
+ String *pNonConvertableChars )
+{
+ rStrm << sNewLine;
+ if( pIndent )
+ rStrm << pIndent;
+
+ ByteString sOut( '<' );
+ (((sOut += OOO_STRING_SVTOOLS_HTML_meta) += ' ')
+ += (bHTTPEquiv ? OOO_STRING_SVTOOLS_HTML_O_httpequiv : OOO_STRING_SVTOOLS_HTML_O_name)) += "=\"";
+ rStrm << sOut.GetBuffer();
+
+ HTMLOutFuncs::Out_String( rStrm, rName, eDestEnc, pNonConvertableChars );
+
+ ((sOut = "\" ") += OOO_STRING_SVTOOLS_HTML_O_content) += "=\"";
+ rStrm << sOut.GetBuffer();
+
+ HTMLOutFuncs::Out_String( rStrm, rContent, eDestEnc, pNonConvertableChars ) << "\">";
+}
+
+void SfxFrameHTMLWriter::Out_DocInfo( SvStream& rStrm, const String& rBaseURL,
+ const uno::Reference<document::XDocumentProperties> & i_xDocProps,
+ const sal_Char *pIndent,
+ rtl_TextEncoding eDestEnc,
+ String *pNonConvertableChars )
+{
+ const sal_Char *pCharSet =
+ rtl_getBestMimeCharsetFromTextEncoding( eDestEnc );
+
+ if( pCharSet )
+ {
+ String aContentType = String::CreateFromAscii( sHTML_MIME_text_html );
+ aContentType.AppendAscii( pCharSet );
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_content_type, aContentType, TRUE,
+ eDestEnc, pNonConvertableChars );
+ }
+
+ // Titel (auch wenn er leer ist)
+ rStrm << sNewLine;
+ if( pIndent )
+ rStrm << pIndent;
+ HTMLOutFuncs::Out_AsciiTag( rStrm, OOO_STRING_SVTOOLS_HTML_title );
+ if( i_xDocProps.is() )
+ {
+ const String& rTitle = i_xDocProps->getTitle();
+ if( rTitle.Len() )
+ HTMLOutFuncs::Out_String( rStrm, rTitle, eDestEnc, pNonConvertableChars );
+ }
+ HTMLOutFuncs::Out_AsciiTag( rStrm, OOO_STRING_SVTOOLS_HTML_title, FALSE );
+
+ // Target-Frame
+ if( i_xDocProps.is() )
+ {
+ const String& rTarget = i_xDocProps->getDefaultTarget();
+ if( rTarget.Len() )
+ {
+ rStrm << sNewLine;
+ if( pIndent )
+ rStrm << pIndent;
+
+ ByteString sOut( '<' );
+ (((sOut += OOO_STRING_SVTOOLS_HTML_base) += ' ') += OOO_STRING_SVTOOLS_HTML_O_target) += "=\"";
+ rStrm << sOut.GetBuffer();
+ HTMLOutFuncs::Out_String( rStrm, rTarget, eDestEnc, pNonConvertableChars )
+ << "\">";
+ }
+ }
+
+ // Who we are
+ String sGenerator( SfxResId( STR_HTML_GENERATOR ) );
+ sGenerator.SearchAndReplaceAscii( "%1", String( DEFINE_CONST_UNICODE( TOOLS_INETDEF_OS ) ) );
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_generator, sGenerator, FALSE, eDestEnc, pNonConvertableChars );
+
+ if( i_xDocProps.is() )
+ {
+ // Reload
+ if( (i_xDocProps->getAutoloadSecs() != 0) ||
+ !i_xDocProps->getAutoloadURL().equalsAscii("") )
+ {
+ String sContent = String::CreateFromInt32(
+ i_xDocProps->getAutoloadSecs() );
+
+ const String &rReloadURL = i_xDocProps->getAutoloadURL();
+ if( rReloadURL.Len() )
+ {
+ sContent.AppendAscii( ";URL=" );
+ sContent += String(
+ URIHelper::simpleNormalizedMakeRelative(
+ rBaseURL, rReloadURL));
+ }
+
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_refresh, sContent, TRUE,
+ eDestEnc, pNonConvertableChars );
+ }
+
+ // Author
+ const String& rAuthor = i_xDocProps->getAuthor();
+ if( rAuthor.Len() )
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_author, rAuthor, FALSE,
+ eDestEnc, pNonConvertableChars );
+
+ // created
+ ::util::DateTime uDT = i_xDocProps->getCreationDate();
+ Date aD(uDT.Day, uDT.Month, uDT.Year);
+ Time aT(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
+ String sOut = String::CreateFromInt32(aD.GetDate());
+ sOut += ';';
+ sOut += String::CreateFromInt32(aT.GetTime());
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_created, sOut, FALSE,
+ eDestEnc, pNonConvertableChars );
+
+ // changedby
+ const String& rChangedBy = i_xDocProps->getModifiedBy();
+ if( rChangedBy.Len() )
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_changedby, rChangedBy, FALSE,
+ eDestEnc, pNonConvertableChars );
+
+ // changed
+ uDT = i_xDocProps->getModificationDate();
+ Date aD2(uDT.Day, uDT.Month, uDT.Year);
+ Time aT2(uDT.Hours, uDT.Minutes, uDT.Seconds, uDT.HundredthSeconds);
+ sOut = String::CreateFromInt32(aD2.GetDate());
+ sOut += ';';
+ sOut += String::CreateFromInt32(aT2.GetTime());
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_changed, sOut, FALSE,
+ eDestEnc, pNonConvertableChars );
+
+ // Subject
+ const String& rTheme = i_xDocProps->getSubject();
+ if( rTheme.Len() )
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_classification, rTheme, FALSE,
+ eDestEnc, pNonConvertableChars );
+
+ // Description
+ const String& rComment = i_xDocProps->getDescription();
+ if( rComment.Len() )
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_description, rComment, FALSE,
+ eDestEnc, pNonConvertableChars);
+
+ // Keywords
+ String Keywords = ::comphelper::string::convertCommaSeparated(
+ i_xDocProps->getKeywords());
+ if( Keywords.Len() )
+ OutMeta( rStrm, pIndent, OOO_STRING_SVTOOLS_HTML_META_keywords, Keywords, FALSE,
+ eDestEnc, pNonConvertableChars);
+
+ uno::Reference < script::XTypeConverter > xConverter(
+ ::comphelper::getProcessServiceFactory()->createInstance(
+ ::rtl::OUString::createFromAscii("com.sun.star.script.Converter")),
+ uno::UNO_QUERY_THROW );
+ uno::Reference<beans::XPropertySet> xUserDefinedProps(
+ i_xDocProps->getUserDefinedProperties(), uno::UNO_QUERY_THROW);
+ DBG_ASSERT(xUserDefinedProps.is(), "UserDefinedProperties is null");
+ uno::Reference<beans::XPropertySetInfo> xPropInfo =
+ xUserDefinedProps->getPropertySetInfo();
+ DBG_ASSERT(xPropInfo.is(), "UserDefinedProperties Info is null");
+ uno::Sequence<beans::Property> props = xPropInfo->getProperties();
+ for (sal_Int32 i = 0; i < props.getLength(); ++i) {
+ try {
+ ::rtl::OUString name = props[i].Name;
+ ::rtl::OUString str;
+ uno::Any aStr = xConverter->convertToSimpleType(
+ xUserDefinedProps->getPropertyValue(name),
+ uno::TypeClass_STRING);
+ aStr >>= str;
+ String valstr(str);
+ valstr.EraseTrailingChars();
+ OutMeta( rStrm, pIndent, name, valstr, FALSE,
+ eDestEnc, pNonConvertableChars );
+ } catch (uno::Exception &) {
+ // may happen with concurrent modification...
+ DBG_WARNING("SfxFrameHTMLWriter::Out_DocInfo: exception");
+ }
+ }
+ }
+}
+/*
+void SfxFrameHTMLWriter::OutHeader( rtl_TextEncoding eDestEnc )
+{
+ // <HTML>
+ // <HEAD>
+ // <TITLE>Titel</TITLE>
+ // </HEAD>
+ HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_html ) << sNewLine;
+ HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_head );
+
+ Out_DocInfo( Strm(), &pDoc->GetDocInfo(), "\t", eDestEnc );
+ Strm() << sNewLine;
+ HTMLOutFuncs::Out_AsciiTag( Strm(), sHTML_head, FALSE ) << sNewLine;
+
+//! OutScript(); // Hier fehlen noch die Scripten im Header
+}
+*/
+
+void SfxFrameHTMLWriter::Out_FrameDescriptor(
+ SvStream& rOut, const String& rBaseURL, const uno::Reference < beans::XPropertySet >& xSet,
+ rtl_TextEncoding eDestEnc, String *pNonConvertableChars )
+{
+ try
+ {
+ ByteString sOut;
+ ::rtl::OUString aStr;
+ uno::Any aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameURL") );
+ if ( (aAny >>= aStr) && aStr.getLength() )
+ {
+ String aURL = INetURLObject( aStr ).GetMainURL( INetURLObject::DECODE_TO_IURI );
+ if( aURL.Len() )
+ {
+ aURL = URIHelper::simpleNormalizedMakeRelative(
+ rBaseURL, aURL );
+ ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_src) += "=\"";
+ rOut << sOut.GetBuffer();
+ HTMLOutFuncs::Out_String( rOut, aURL, eDestEnc, pNonConvertableChars );
+ sOut = '\"';
+ }
+ }
+
+ aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameName") );
+ if ( (aAny >>= aStr) && aStr.getLength() )
+ {
+ ((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_name) += "=\"";
+ rOut << sOut.GetBuffer();
+ HTMLOutFuncs::Out_String( rOut, aStr, eDestEnc, pNonConvertableChars );
+ sOut = '\"';
+ }
+
+ sal_Int32 nVal = SIZE_NOT_SET;
+ aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginWidth") );
+ if ( (aAny >>= nVal) && nVal != SIZE_NOT_SET )
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_marginwidth) += '=') += ByteString::CreateFromInt32( nVal );
+ aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameMarginHeight") );
+ if ( (aAny >>= nVal) && nVal != SIZE_NOT_SET )
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_marginheight) += '=') += ByteString::CreateFromInt32( nVal );
+
+ sal_Bool bVal = sal_True;
+ aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoScroll") );
+ if ( (aAny >>= bVal) && !bVal )
+ {
+ aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsScrollingMode") );
+ if ( aAny >>= bVal )
+ {
+ const sal_Char *pStr = bVal ? sHTML_SC_yes : sHTML_SC_no;
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_scrolling) += '=') += pStr;
+ }
+ }
+
+ // frame border (MS+Netscape-Erweiterung)
+ aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsAutoBorder") );
+ if ( (aAny >>= bVal) && !bVal )
+ {
+ aAny = xSet->getPropertyValue( ::rtl::OUString::createFromAscii("FrameIsBorder") );
+ if ( aAny >>= bVal )
+ {
+ const char* pStr = bVal ? sHTML_SC_yes : sHTML_SC_no;
+ (((sOut += ' ') += OOO_STRING_SVTOOLS_HTML_O_frameborder) += '=') += pStr;
+ }
+ }
+
+ // TODO/LATER: currently not supported attributes
+ // resize
+ //if( !pFrame->IsResizable() )
+ // (sOut += ' ') += sHTML_O_noresize;
+ //
+ //if ( pFrame->GetWallpaper() )
+ //{
+ // ((sOut += ' ') += sHTML_O_bordercolor) += '=';
+ // rOut << sOut.GetBuffer();
+ // HTMLOutFuncs::Out_Color( rOut, pFrame->GetWallpaper()->GetColor(), eDestEnc );
+ //}
+ //else
+ rOut << sOut.GetBuffer();
+ }
+ catch ( uno::Exception& )
+ {
+ }
+}
+
+String SfxFrameHTMLWriter::CreateURL( SfxFrame* pFrame )
+{
+ String aRet;
+ SfxObjectShell* pShell = pFrame->GetCurrentDocument();
+ if( !aRet.Len() && pShell )
+ {
+ aRet = pShell->GetMedium()->GetName();
+//!(dv) CntAnchor::ToPresentationURL( aRet );
+ }
+
+ return aRet;
+}
+
+