xref: /aoo4110/main/sfx2/source/bastyp/sfxhtml.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sfx2.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
30*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
31*b1cdbd2cSJim Jagielski #include "openflag.hxx"
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <svtools/htmlkywd.hxx>
34*b1cdbd2cSJim Jagielski #include <svtools/htmltokn.h>
35*b1cdbd2cSJim Jagielski #include <svtools/imap.hxx>
36*b1cdbd2cSJim Jagielski #include <svtools/imapcirc.hxx>
37*b1cdbd2cSJim Jagielski #include <svtools/imapobj.hxx>
38*b1cdbd2cSJim Jagielski #include <svtools/imappoly.hxx>
39*b1cdbd2cSJim Jagielski #include <svtools/imaprect.hxx>
40*b1cdbd2cSJim Jagielski #ifndef _SVSTDARR_ULONGS_DECL
41*b1cdbd2cSJim Jagielski #define _SVSTDARR_ULONGS
42*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
43*b1cdbd2cSJim Jagielski #endif
44*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
45*b1cdbd2cSJim Jagielski #include <rtl/tencinfo.h>
46*b1cdbd2cSJim Jagielski #include <tools/tenccvt.hxx>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include <sfx2/sfxhtml.hxx>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertyContainer.hpp>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski sal_Char __FAR_DATA sHTML_MIME_text[] = "text/";
57*b1cdbd2cSJim Jagielski sal_Char __FAR_DATA sHTML_MIME_application[] = "application/";
58*b1cdbd2cSJim Jagielski sal_Char __FAR_DATA sHTML_MIME_experimental[] = "x-";
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski // <INPUT TYPE=xxx>
61*b1cdbd2cSJim Jagielski static HTMLOptionEnum __READONLY_DATA aAreaShapeOptEnums[] =
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski 	{ OOO_STRING_SVTOOLS_HTML_SH_rect,		IMAP_OBJ_RECTANGLE	},
64*b1cdbd2cSJim Jagielski 	{ OOO_STRING_SVTOOLS_HTML_SH_rectangle,	IMAP_OBJ_RECTANGLE	},
65*b1cdbd2cSJim Jagielski 	{ OOO_STRING_SVTOOLS_HTML_SH_circ,		IMAP_OBJ_CIRCLE		},
66*b1cdbd2cSJim Jagielski 	{ OOO_STRING_SVTOOLS_HTML_SH_circle,   	IMAP_OBJ_CIRCLE		},
67*b1cdbd2cSJim Jagielski 	{ OOO_STRING_SVTOOLS_HTML_SH_poly,   		IMAP_OBJ_POLYGON	},
68*b1cdbd2cSJim Jagielski 	{ OOO_STRING_SVTOOLS_HTML_SH_polygon,		IMAP_OBJ_POLYGON	},
69*b1cdbd2cSJim Jagielski 	{ 0,					0					}
70*b1cdbd2cSJim Jagielski };
71*b1cdbd2cSJim Jagielski 
SfxHTMLParser(SvStream & rStream,sal_Bool bIsNewDoc,SfxMedium * pMed)72*b1cdbd2cSJim Jagielski SfxHTMLParser::SfxHTMLParser( SvStream& rStream, sal_Bool bIsNewDoc,
73*b1cdbd2cSJim Jagielski 							  SfxMedium *pMed ) :
74*b1cdbd2cSJim Jagielski 	HTMLParser( rStream, bIsNewDoc ),
75*b1cdbd2cSJim Jagielski 	pMedium( pMed ), pDLMedium( 0 ),
76*b1cdbd2cSJim Jagielski 	nMetaTags( 0 )
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski 	DBG_ASSERT( RTL_TEXTENCODING_DONTKNOW == GetSrcEncoding( ),
79*b1cdbd2cSJim Jagielski 				"SfxHTMLParser::SfxHTMLParser: Wo kommt der ZS her?" );
80*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !IsSwitchToUCS2(),
81*b1cdbd2cSJim Jagielski 				"SfxHTMLParser::SfxHTMLParser: Switch to UCS2?" );
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 	// Altough the real default encoding is ISO8859-1, we use MS-1252
84*b1cdbd2cSJim Jagielski 	// als default encoding.
85*b1cdbd2cSJim Jagielski 	SetSrcEncoding( GetExtendedCompatibilityTextEncoding(  RTL_TEXTENCODING_ISO_8859_1 ) );
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 	// If the file starts with a BOM, switch to UCS2.
88*b1cdbd2cSJim Jagielski 	SetSwitchToUCS2( sal_True );
89*b1cdbd2cSJim Jagielski }
90*b1cdbd2cSJim Jagielski 
~SfxHTMLParser()91*b1cdbd2cSJim Jagielski __EXPORT SfxHTMLParser::~SfxHTMLParser()
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !pDLMedium, "Da ist ein File-Download stehengeblieben" );
94*b1cdbd2cSJim Jagielski 	delete pDLMedium;
95*b1cdbd2cSJim Jagielski }
96*b1cdbd2cSJim Jagielski 
ParseMapOptions(ImageMap * pImageMap,const HTMLOptions * pOptions)97*b1cdbd2cSJim Jagielski sal_Bool SfxHTMLParser::ParseMapOptions(ImageMap * pImageMap,
98*b1cdbd2cSJim Jagielski 									const HTMLOptions * pOptions)
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pImageMap, "ParseMapOptions: keine Image-Map" );
101*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pOptions, "ParseMapOptions: keine Optionen" );
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 	String aName;
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i=pOptions->Count(); i; )
106*b1cdbd2cSJim Jagielski 	{
107*b1cdbd2cSJim Jagielski 		const HTMLOption *pOption = (*pOptions)[--i];
108*b1cdbd2cSJim Jagielski 		switch( pOption->GetToken() )
109*b1cdbd2cSJim Jagielski 		{
110*b1cdbd2cSJim Jagielski 		case HTML_O_NAME:
111*b1cdbd2cSJim Jagielski 			aName = pOption->GetString();
112*b1cdbd2cSJim Jagielski 			break;
113*b1cdbd2cSJim Jagielski 		}
114*b1cdbd2cSJim Jagielski 	}
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 	if( aName.Len() )
117*b1cdbd2cSJim Jagielski 		pImageMap->SetName( aName );
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 	return aName.Len() > 0;
120*b1cdbd2cSJim Jagielski }
121*b1cdbd2cSJim Jagielski 
ParseAreaOptions(ImageMap * pImageMap,const String & rBaseURL,const HTMLOptions * pOptions,sal_uInt16 nEventMouseOver,sal_uInt16 nEventMouseOut)122*b1cdbd2cSJim Jagielski sal_Bool SfxHTMLParser::ParseAreaOptions(ImageMap * pImageMap, const String& rBaseURL,
123*b1cdbd2cSJim Jagielski 									 const HTMLOptions * pOptions,
124*b1cdbd2cSJim Jagielski 									 sal_uInt16 nEventMouseOver,
125*b1cdbd2cSJim Jagielski 									 sal_uInt16 nEventMouseOut )
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pImageMap, "ParseAreaOptions: keine Image-Map" );
128*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pOptions, "ParseAreaOptions: keine Optionen" );
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	sal_uInt16 nShape = IMAP_OBJ_RECTANGLE;
131*b1cdbd2cSJim Jagielski 	SvULongs aCoords;
132*b1cdbd2cSJim Jagielski 	String aName, aHRef, aAlt, aTarget, sEmpty;
133*b1cdbd2cSJim Jagielski 	sal_Bool bNoHRef = sal_False;
134*b1cdbd2cSJim Jagielski 	SvxMacroTableDtor aMacroTbl;
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i=pOptions->Count(); i; )
137*b1cdbd2cSJim Jagielski 	{
138*b1cdbd2cSJim Jagielski 		sal_uInt16 nEvent = 0;
139*b1cdbd2cSJim Jagielski 		ScriptType eScrpType = STARBASIC;
140*b1cdbd2cSJim Jagielski 		const HTMLOption *pOption = (*pOptions)[--i];
141*b1cdbd2cSJim Jagielski 		switch( pOption->GetToken() )
142*b1cdbd2cSJim Jagielski 		{
143*b1cdbd2cSJim Jagielski 		case HTML_O_NAME:
144*b1cdbd2cSJim Jagielski 			aName = pOption->GetString();
145*b1cdbd2cSJim Jagielski 			break;
146*b1cdbd2cSJim Jagielski 		case HTML_O_SHAPE:
147*b1cdbd2cSJim Jagielski 			pOption->GetEnum( nShape, aAreaShapeOptEnums );
148*b1cdbd2cSJim Jagielski 			break;
149*b1cdbd2cSJim Jagielski 		case HTML_O_COORDS:
150*b1cdbd2cSJim Jagielski 			pOption->GetNumbers( aCoords, sal_True );
151*b1cdbd2cSJim Jagielski 			break;
152*b1cdbd2cSJim Jagielski 		case HTML_O_HREF:
153*b1cdbd2cSJim Jagielski             aHRef = INetURLObject::GetAbsURL( rBaseURL, pOption->GetString() );
154*b1cdbd2cSJim Jagielski 			break;
155*b1cdbd2cSJim Jagielski 		case HTML_O_NOHREF:
156*b1cdbd2cSJim Jagielski 			bNoHRef = sal_True;
157*b1cdbd2cSJim Jagielski 			break;
158*b1cdbd2cSJim Jagielski 		case HTML_O_ALT:
159*b1cdbd2cSJim Jagielski 			aAlt = pOption->GetString();
160*b1cdbd2cSJim Jagielski 			break;
161*b1cdbd2cSJim Jagielski 		case HTML_O_TARGET:
162*b1cdbd2cSJim Jagielski 			aTarget = pOption->GetString();
163*b1cdbd2cSJim Jagielski 			break;
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski 		case HTML_O_ONMOUSEOVER:
166*b1cdbd2cSJim Jagielski 			eScrpType = JAVASCRIPT;
167*b1cdbd2cSJim Jagielski 		case HTML_O_SDONMOUSEOVER:
168*b1cdbd2cSJim Jagielski 			nEvent = nEventMouseOver;
169*b1cdbd2cSJim Jagielski 			goto IMAPOBJ_SETEVENT;
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 		case HTML_O_ONMOUSEOUT:
172*b1cdbd2cSJim Jagielski 			eScrpType = JAVASCRIPT;
173*b1cdbd2cSJim Jagielski 		case HTML_O_SDONMOUSEOUT:
174*b1cdbd2cSJim Jagielski 			nEvent = nEventMouseOut;
175*b1cdbd2cSJim Jagielski 			goto IMAPOBJ_SETEVENT;
176*b1cdbd2cSJim Jagielski IMAPOBJ_SETEVENT:
177*b1cdbd2cSJim Jagielski 			if( nEvent )
178*b1cdbd2cSJim Jagielski 			{
179*b1cdbd2cSJim Jagielski 				String sTmp( pOption->GetString() );
180*b1cdbd2cSJim Jagielski 				if( sTmp.Len() )
181*b1cdbd2cSJim Jagielski 				{
182*b1cdbd2cSJim Jagielski 					sTmp.ConvertLineEnd();
183*b1cdbd2cSJim Jagielski 					aMacroTbl.Insert( nEvent,
184*b1cdbd2cSJim Jagielski 						new SvxMacro( sTmp, sEmpty, eScrpType ));
185*b1cdbd2cSJim Jagielski 				}
186*b1cdbd2cSJim Jagielski 			}
187*b1cdbd2cSJim Jagielski 			break;
188*b1cdbd2cSJim Jagielski 		}
189*b1cdbd2cSJim Jagielski 	}
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski 	if( bNoHRef )
192*b1cdbd2cSJim Jagielski 		aHRef.Erase();
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 	sal_Bool bNewArea = sal_True;
195*b1cdbd2cSJim Jagielski 	switch( nShape )
196*b1cdbd2cSJim Jagielski 	{
197*b1cdbd2cSJim Jagielski 	case IMAP_OBJ_RECTANGLE:
198*b1cdbd2cSJim Jagielski 		if( aCoords.Count() >=4 )
199*b1cdbd2cSJim Jagielski 		{
200*b1cdbd2cSJim Jagielski 			Rectangle aRec( aCoords[0], aCoords[1],
201*b1cdbd2cSJim Jagielski 							aCoords[2], aCoords[3] );
202*b1cdbd2cSJim Jagielski 			IMapRectangleObject aMapRObj( aRec, aHRef, aAlt, String(), aTarget, aName,
203*b1cdbd2cSJim Jagielski 										  !bNoHRef );
204*b1cdbd2cSJim Jagielski 			if( aMacroTbl.Count() )
205*b1cdbd2cSJim Jagielski 				aMapRObj.SetMacroTable( aMacroTbl );
206*b1cdbd2cSJim Jagielski 			pImageMap->InsertIMapObject( aMapRObj );
207*b1cdbd2cSJim Jagielski 		}
208*b1cdbd2cSJim Jagielski 		break;
209*b1cdbd2cSJim Jagielski 	case IMAP_OBJ_CIRCLE:
210*b1cdbd2cSJim Jagielski 		if( aCoords.Count() >=3 )
211*b1cdbd2cSJim Jagielski 		{
212*b1cdbd2cSJim Jagielski 			Point aPoint( aCoords[0], aCoords[1] );
213*b1cdbd2cSJim Jagielski 			IMapCircleObject aMapCObj( aPoint, aCoords[2],aHRef, aAlt, String(),
214*b1cdbd2cSJim Jagielski 									   aTarget, aName, !bNoHRef );
215*b1cdbd2cSJim Jagielski 			if( aMacroTbl.Count() )
216*b1cdbd2cSJim Jagielski 				aMapCObj.SetMacroTable( aMacroTbl );
217*b1cdbd2cSJim Jagielski 			pImageMap->InsertIMapObject( aMapCObj );
218*b1cdbd2cSJim Jagielski 		}
219*b1cdbd2cSJim Jagielski 		break;
220*b1cdbd2cSJim Jagielski 	case IMAP_OBJ_POLYGON:
221*b1cdbd2cSJim Jagielski 		if( aCoords.Count() >=6 )
222*b1cdbd2cSJim Jagielski 		{
223*b1cdbd2cSJim Jagielski 			sal_uInt16 nCount = aCoords.Count() / 2;
224*b1cdbd2cSJim Jagielski 			Polygon aPoly( nCount );
225*b1cdbd2cSJim Jagielski 			for( sal_uInt16 i=0; i<nCount; i++ )
226*b1cdbd2cSJim Jagielski 				aPoly[i] = Point( aCoords[2*i], aCoords[2*i+1] );
227*b1cdbd2cSJim Jagielski 			IMapPolygonObject aMapPObj( aPoly, aHRef, aAlt, String(), aTarget, aName,
228*b1cdbd2cSJim Jagielski 										!bNoHRef );
229*b1cdbd2cSJim Jagielski 			if( aMacroTbl.Count() )
230*b1cdbd2cSJim Jagielski 				aMapPObj.SetMacroTable( aMacroTbl );
231*b1cdbd2cSJim Jagielski 			pImageMap->InsertIMapObject( aMapPObj );
232*b1cdbd2cSJim Jagielski 		}
233*b1cdbd2cSJim Jagielski 		break;
234*b1cdbd2cSJim Jagielski 	default:
235*b1cdbd2cSJim Jagielski 		bNewArea = sal_False;
236*b1cdbd2cSJim Jagielski 	}
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski 	return bNewArea;
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 
StartFileDownload(const String & rURL,int nToken,SfxObjectShell * pSh)242*b1cdbd2cSJim Jagielski void SfxHTMLParser::StartFileDownload( const String& rURL, int nToken,
243*b1cdbd2cSJim Jagielski 									   SfxObjectShell *pSh )
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !pDLMedium, "StartFileDwonload bei aktivem Download" );
246*b1cdbd2cSJim Jagielski 	if( pDLMedium )
247*b1cdbd2cSJim Jagielski 		return;
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	pDLMedium = new SfxMedium( rURL, SFX_STREAM_READONLY, sal_False );
250*b1cdbd2cSJim Jagielski 	if( pSh )
251*b1cdbd2cSJim Jagielski 	{
252*b1cdbd2cSJim Jagielski 		// Medium registrieren, damit abgebrochen werden kann
253*b1cdbd2cSJim Jagielski 		pSh->RegisterTransfer( *pDLMedium );
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 		// Target-Frame uebertragen, damit auch javascript:-URLs
256*b1cdbd2cSJim Jagielski 		// "geladen" werden koennen.
257*b1cdbd2cSJim Jagielski 		//const SfxMedium *pShMedium = pSh->GetMedium();
258*b1cdbd2cSJim Jagielski 		//if( pShMedium )
259*b1cdbd2cSJim Jagielski 		//	pDLMedium->SetLoadTargetFrame( pShMedium->GetLoadTargetFrame() );
260*b1cdbd2cSJim Jagielski 	}
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	// Download anstossen (Achtung: Kann auch synchron sein).
263*b1cdbd2cSJim Jagielski     if ( sal_True /*pMedium->GetDoneLink() == Link()*/ )
264*b1cdbd2cSJim Jagielski         pDLMedium->DownLoad();
265*b1cdbd2cSJim Jagielski     else
266*b1cdbd2cSJim Jagielski     {
267*b1cdbd2cSJim Jagielski         // Downloading-Flag auf sal_True setzen. Es werden dann auch
268*b1cdbd2cSJim Jagielski         // Data-Available-Links, wenn wir in den Pending-Staus gelangen.
269*b1cdbd2cSJim Jagielski         SetDownloadingFile( sal_True );
270*b1cdbd2cSJim Jagielski         pDLMedium->DownLoad( STATIC_LINK( this, SfxHTMLParser, FileDownloadDone ) );
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski         // Wenn das Dowsnloading-Flag noch gesetzt ist erfolgt der Download
273*b1cdbd2cSJim Jagielski         // asynchron. Wir gehen dann in den Pedning-Staus und warten dort.
274*b1cdbd2cSJim Jagielski         // Solange sind alle Aufrufe des Data-Avaialble-Link gesperrt.
275*b1cdbd2cSJim Jagielski         if( IsDownloadingFile() )
276*b1cdbd2cSJim Jagielski         {
277*b1cdbd2cSJim Jagielski             // Den aktuellen Zustand einfrieren und in den Pending-Status gehen.
278*b1cdbd2cSJim Jagielski             // Wenn der Download beendet oder abgebrochen wurde, wird ueber
279*b1cdbd2cSJim Jagielski             // NewDataRead ein Continue mit dem uebergeben Token angesteossen.
280*b1cdbd2cSJim Jagielski             SaveState( nToken );
281*b1cdbd2cSJim Jagielski             eState = SVPAR_PENDING;
282*b1cdbd2cSJim Jagielski         }
283*b1cdbd2cSJim Jagielski     }
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski 
GetFileDownloadMIME(String & rMIME)286*b1cdbd2cSJim Jagielski sal_Bool SfxHTMLParser::GetFileDownloadMIME( String& rMIME )
287*b1cdbd2cSJim Jagielski {
288*b1cdbd2cSJim Jagielski 	return pDLMedium && pDLMedium->GetErrorCode()==0 &&
289*b1cdbd2cSJim Jagielski 		   pDLMedium->GetMIMEAndRedirect(rMIME)==0;
290*b1cdbd2cSJim Jagielski }
291*b1cdbd2cSJim Jagielski 
FinishFileDownload(String & rStr)292*b1cdbd2cSJim Jagielski sal_Bool SfxHTMLParser::FinishFileDownload( String& rStr )
293*b1cdbd2cSJim Jagielski {
294*b1cdbd2cSJim Jagielski 	String aStr;
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski 	sal_Bool bOK = pDLMedium && pDLMedium->GetErrorCode()==0;
297*b1cdbd2cSJim Jagielski 	if( bOK )
298*b1cdbd2cSJim Jagielski 	{
299*b1cdbd2cSJim Jagielski 		SvStream* pStream = pDLMedium->GetInStream();
300*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pStream, "Kein In-Stream vom Medium erhalten" );
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski 		SvMemoryStream aStream;
303*b1cdbd2cSJim Jagielski 		if( pStream )	// HACK wegen #65563#
304*b1cdbd2cSJim Jagielski 			aStream << *pStream;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 		aStream.Seek( STREAM_SEEK_TO_END );
307*b1cdbd2cSJim Jagielski 		DBG_ASSERT( aStream.Tell() < STRING_MAXLEN,
308*b1cdbd2cSJim Jagielski 					"File zu lang fuer einen String, Ende abgeschnitten" );
309*b1cdbd2cSJim Jagielski 		xub_StrLen nLen = aStream.Tell() < STRING_MAXLEN
310*b1cdbd2cSJim Jagielski 						? (xub_StrLen)aStream.Tell()
311*b1cdbd2cSJim Jagielski 						: STRING_MAXLEN;
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski         // TODO: untested!!!
314*b1cdbd2cSJim Jagielski 		rtl_TextEncoding eEnc =
315*b1cdbd2cSJim Jagielski 			GetExtendedCompatibilityTextEncoding( RTL_TEXTENCODING_ISO_8859_1 );
316*b1cdbd2cSJim Jagielski 		String sMime;
317*b1cdbd2cSJim Jagielski 		if( pDLMedium->GetMIMEAndRedirect( sMime ) == 0 )
318*b1cdbd2cSJim Jagielski 		{
319*b1cdbd2cSJim Jagielski 			rtl_TextEncoding eMimeEnc = GetEncodingByMIME( sMime );
320*b1cdbd2cSJim Jagielski 			if( RTL_TEXTENCODING_DONTKNOW != eMimeEnc )
321*b1cdbd2cSJim Jagielski 				eEnc = eMimeEnc;
322*b1cdbd2cSJim Jagielski 		}
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 		ByteString sBuffer;
325*b1cdbd2cSJim Jagielski 		sal_Char* pBuffer = sBuffer.AllocBuffer(nLen);
326*b1cdbd2cSJim Jagielski 		aStream.Seek( 0 );
327*b1cdbd2cSJim Jagielski 		aStream.Read((void*)pBuffer, nLen);
328*b1cdbd2cSJim Jagielski 		rStr = String( pBuffer, RTL_TEXTENCODING_UTF8);
329*b1cdbd2cSJim Jagielski 	}
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 	delete pDLMedium;
332*b1cdbd2cSJim Jagielski 	pDLMedium = 0;
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 	return bOK;
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski 
IMPL_STATIC_LINK(SfxHTMLParser,FileDownloadDone,void *,EMPTYARG)337*b1cdbd2cSJim Jagielski IMPL_STATIC_LINK( SfxHTMLParser, FileDownloadDone, void*, EMPTYARG )
338*b1cdbd2cSJim Jagielski {
339*b1cdbd2cSJim Jagielski 	// Der Download ist jetzt abgeschlossen. Ausserdem muss/darf der
340*b1cdbd2cSJim Jagielski 	// Data-Available-Link wieder durchgelassen werden.
341*b1cdbd2cSJim Jagielski 	pThis->SetDownloadingFile( sal_False );
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski 	// ... und einmal aufrufen, damit weitergelesen wird.
344*b1cdbd2cSJim Jagielski 	pThis->CallAsyncCallLink();
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	return 0;
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski 
GetScriptType_Impl(SvKeyValueIterator * pHTTPHeader)349*b1cdbd2cSJim Jagielski void SfxHTMLParser::GetScriptType_Impl( SvKeyValueIterator *pHTTPHeader )
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski 	aScriptType = DEFINE_CONST_UNICODE(SVX_MACRO_LANGUAGE_JAVASCRIPT);
352*b1cdbd2cSJim Jagielski 	eScriptType = JAVASCRIPT;
353*b1cdbd2cSJim Jagielski 	if( pHTTPHeader )
354*b1cdbd2cSJim Jagielski 	{
355*b1cdbd2cSJim Jagielski 		SvKeyValue aKV;
356*b1cdbd2cSJim Jagielski 		for( sal_Bool bCont = pHTTPHeader->GetFirst( aKV ); bCont;
357*b1cdbd2cSJim Jagielski 			 bCont = pHTTPHeader->GetNext( aKV ) )
358*b1cdbd2cSJim Jagielski 		{
359*b1cdbd2cSJim Jagielski 			if( aKV.GetKey().EqualsIgnoreCaseAscii(
360*b1cdbd2cSJim Jagielski 									OOO_STRING_SVTOOLS_HTML_META_content_script_type ) )
361*b1cdbd2cSJim Jagielski 			{
362*b1cdbd2cSJim Jagielski 				if( aKV.GetValue().Len() )
363*b1cdbd2cSJim Jagielski 				{
364*b1cdbd2cSJim Jagielski 					String aTmp( aKV.GetValue() );
365*b1cdbd2cSJim Jagielski 					if( aTmp.EqualsIgnoreCaseAscii( sHTML_MIME_text, 0, 5 ) )
366*b1cdbd2cSJim Jagielski 						aTmp.Erase( 0, 5 );
367*b1cdbd2cSJim Jagielski 					else if( aTmp.EqualsIgnoreCaseAscii( sHTML_MIME_application,
368*b1cdbd2cSJim Jagielski 														 0, 12 ) )
369*b1cdbd2cSJim Jagielski 						aTmp.Erase( 0, 12 );
370*b1cdbd2cSJim Jagielski 					else
371*b1cdbd2cSJim Jagielski 						break;
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski 					if( aTmp.EqualsIgnoreCaseAscii( sHTML_MIME_experimental, 0,
374*b1cdbd2cSJim Jagielski 													2 ) )
375*b1cdbd2cSJim Jagielski 					{
376*b1cdbd2cSJim Jagielski 						aTmp.Erase( 0, 2 );
377*b1cdbd2cSJim Jagielski 					}
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 					if( aTmp.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_LG_starbasic ) )
380*b1cdbd2cSJim Jagielski 					{
381*b1cdbd2cSJim Jagielski 						eScriptType = STARBASIC;
382*b1cdbd2cSJim Jagielski 						aScriptType = DEFINE_CONST_UNICODE(SVX_MACRO_LANGUAGE_STARBASIC);
383*b1cdbd2cSJim Jagielski 					}
384*b1cdbd2cSJim Jagielski 					if( !aTmp.EqualsIgnoreCaseAscii( OOO_STRING_SVTOOLS_HTML_LG_javascript ) )
385*b1cdbd2cSJim Jagielski 					{
386*b1cdbd2cSJim Jagielski 						eScriptType = EXTENDED_STYPE;
387*b1cdbd2cSJim Jagielski 						aScriptType = aTmp;
388*b1cdbd2cSJim Jagielski 					}
389*b1cdbd2cSJim Jagielski 				}
390*b1cdbd2cSJim Jagielski 				break;
391*b1cdbd2cSJim Jagielski 			}
392*b1cdbd2cSJim Jagielski 		}
393*b1cdbd2cSJim Jagielski 	}
394*b1cdbd2cSJim Jagielski }
395*b1cdbd2cSJim Jagielski 
GetScriptType(SvKeyValueIterator * pHTTPHeader) const396*b1cdbd2cSJim Jagielski ScriptType SfxHTMLParser::GetScriptType( SvKeyValueIterator *pHTTPHeader ) const
397*b1cdbd2cSJim Jagielski {
398*b1cdbd2cSJim Jagielski 	if( !aScriptType.Len() )
399*b1cdbd2cSJim Jagielski 		((SfxHTMLParser *)this)->GetScriptType_Impl( pHTTPHeader );
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski 	return eScriptType;
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
GetScriptTypeString(SvKeyValueIterator * pHTTPHeader) const404*b1cdbd2cSJim Jagielski const String& SfxHTMLParser::GetScriptTypeString(
405*b1cdbd2cSJim Jagielski 									SvKeyValueIterator *pHTTPHeader ) const
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski 	if( !aScriptType.Len() )
408*b1cdbd2cSJim Jagielski 		((SfxHTMLParser *)this)->GetScriptType_Impl( pHTTPHeader );
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski 	return aScriptType;
411*b1cdbd2cSJim Jagielski }
412*b1cdbd2cSJim Jagielski 
GetTableDataOptionsValNum(sal_uInt32 & nNumForm,LanguageType & eNumLang,const String & aValStr,const String & aNumStr,SvNumberFormatter & rFormatter)413*b1cdbd2cSJim Jagielski double SfxHTMLParser::GetTableDataOptionsValNum( sal_uInt32& nNumForm,
414*b1cdbd2cSJim Jagielski 		LanguageType& eNumLang, const String& aValStr, const String& aNumStr,
415*b1cdbd2cSJim Jagielski 		SvNumberFormatter& rFormatter )
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski 	LanguageType eParseLang = (LanguageType )aNumStr.ToInt32();
418*b1cdbd2cSJim Jagielski 	sal_uInt32 nParseForm =
419*b1cdbd2cSJim Jagielski 		rFormatter.GetFormatForLanguageIfBuiltIn( 0, eParseLang );
420*b1cdbd2cSJim Jagielski 	double fVal;
421*b1cdbd2cSJim Jagielski 	rFormatter.IsNumberFormat( aValStr, nParseForm, fVal );
422*b1cdbd2cSJim Jagielski 	if ( aNumStr.GetTokenCount( ';' ) > 2 )
423*b1cdbd2cSJim Jagielski 	{
424*b1cdbd2cSJim Jagielski 		eNumLang = (LanguageType)aNumStr.GetToken( 1, ';' ).ToInt32();
425*b1cdbd2cSJim Jagielski 		xub_StrLen nPos = aNumStr.Search( ';' );
426*b1cdbd2cSJim Jagielski 		nPos = aNumStr.Search( ';', nPos + 1 );
427*b1cdbd2cSJim Jagielski 		String aFormat( aNumStr.Copy( nPos + 1 ) );
428*b1cdbd2cSJim Jagielski 		xub_StrLen nCheckPos;
429*b1cdbd2cSJim Jagielski 		short nType;
430*b1cdbd2cSJim Jagielski 		if ( eNumLang != LANGUAGE_SYSTEM )
431*b1cdbd2cSJim Jagielski 			rFormatter.PutEntry( aFormat, nCheckPos, nType, nNumForm, eNumLang );
432*b1cdbd2cSJim Jagielski 		else
433*b1cdbd2cSJim Jagielski 			rFormatter.PutandConvertEntry( aFormat, nCheckPos, nType, nNumForm,
434*b1cdbd2cSJim Jagielski 				eParseLang, eNumLang );
435*b1cdbd2cSJim Jagielski 	}
436*b1cdbd2cSJim Jagielski 	else
437*b1cdbd2cSJim Jagielski 	{
438*b1cdbd2cSJim Jagielski 		eNumLang = LANGUAGE_SYSTEM;
439*b1cdbd2cSJim Jagielski 		nNumForm = rFormatter.GetFormatForLanguageIfBuiltIn( 0, eNumLang );
440*b1cdbd2cSJim Jagielski 	}
441*b1cdbd2cSJim Jagielski 	return fVal;
442*b1cdbd2cSJim Jagielski }
443*b1cdbd2cSJim Jagielski 
444