xref: /aoo4110/main/basic/source/sbx/sbxbase.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_basic.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <tools/shl.hxx>
29*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <basic/sbx.hxx>
32*b1cdbd2cSJim Jagielski #include <basic/sbxfac.hxx>
33*b1cdbd2cSJim Jagielski #include <basic/sbxbase.hxx>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski // AppData-Struktur fuer SBX:
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR(SbxParams,SbxParamInfo*);
38*b1cdbd2cSJim Jagielski SV_IMPL_PTRARR(SbxFacs,SbxFactory*);
39*b1cdbd2cSJim Jagielski 
TYPEINIT0(SbxBase)40*b1cdbd2cSJim Jagielski TYPEINIT0(SbxBase)
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski // SBX-Daten anfordern oder ggf. anlegen
43*b1cdbd2cSJim Jagielski // wir legen den Bereich einfach an und verzichten auf die Freigabe!
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski SbxAppData* GetSbxData_Impl()
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski 	SbxAppData** ppData = (SbxAppData**) ::GetAppData( SHL_SBX );
48*b1cdbd2cSJim Jagielski 	SbxAppData* p = *ppData;
49*b1cdbd2cSJim Jagielski 	if( !p )
50*b1cdbd2cSJim Jagielski 		p = *ppData  = new SbxAppData;
51*b1cdbd2cSJim Jagielski 	return p;
52*b1cdbd2cSJim Jagielski }
53*b1cdbd2cSJim Jagielski 
~SbxAppData()54*b1cdbd2cSJim Jagielski SbxAppData::~SbxAppData()
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski 	if( pBasicFormater )
57*b1cdbd2cSJim Jagielski 		delete pBasicFormater;
58*b1cdbd2cSJim Jagielski }
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski //////////////////////////////// SbxBase /////////////////////////////////
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski DBG_NAME(SbxBase);
64*b1cdbd2cSJim Jagielski 
SbxBase()65*b1cdbd2cSJim Jagielski SbxBase::SbxBase()
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski 	DBG_CTOR( SbxBase, 0 );
68*b1cdbd2cSJim Jagielski 	nFlags  = SBX_READWRITE;
69*b1cdbd2cSJim Jagielski }
70*b1cdbd2cSJim Jagielski 
SbxBase(const SbxBase & r)71*b1cdbd2cSJim Jagielski SbxBase::SbxBase( const SbxBase& r )
72*b1cdbd2cSJim Jagielski     : SvRefBase( r )
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 	DBG_CTOR( SbxBase, 0 );
75*b1cdbd2cSJim Jagielski 	nFlags  = r.nFlags;
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski 
~SbxBase()78*b1cdbd2cSJim Jagielski SbxBase::~SbxBase()
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski 	DBG_DTOR(SbxBase,0);
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski 
operator =(const SbxBase & r)83*b1cdbd2cSJim Jagielski SbxBase& SbxBase::operator=( const SbxBase& r )
84*b1cdbd2cSJim Jagielski {
85*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
86*b1cdbd2cSJim Jagielski 	nFlags = r.nFlags;
87*b1cdbd2cSJim Jagielski 	return *this;
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski 
GetType() const90*b1cdbd2cSJim Jagielski SbxDataType SbxBase::GetType() const
91*b1cdbd2cSJim Jagielski {
92*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
93*b1cdbd2cSJim Jagielski 	return SbxEMPTY;
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
GetClass() const96*b1cdbd2cSJim Jagielski SbxClassType SbxBase::GetClass() const
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
99*b1cdbd2cSJim Jagielski 	return SbxCLASS_DONTCARE;
100*b1cdbd2cSJim Jagielski }
101*b1cdbd2cSJim Jagielski 
Clear()102*b1cdbd2cSJim Jagielski void SbxBase::Clear()
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
105*b1cdbd2cSJim Jagielski }
106*b1cdbd2cSJim Jagielski 
IsFixed() const107*b1cdbd2cSJim Jagielski sal_Bool SbxBase::IsFixed() const
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
110*b1cdbd2cSJim Jagielski 	return IsSet( SBX_FIXED );
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
SetModified(sal_Bool b)113*b1cdbd2cSJim Jagielski void SbxBase::SetModified( sal_Bool b )
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
116*b1cdbd2cSJim Jagielski 	if( IsSet( SBX_NO_MODIFY ) )
117*b1cdbd2cSJim Jagielski 		return;
118*b1cdbd2cSJim Jagielski 	if( b )
119*b1cdbd2cSJim Jagielski 		SetFlag( SBX_MODIFIED );
120*b1cdbd2cSJim Jagielski 	else
121*b1cdbd2cSJim Jagielski 		ResetFlag( SBX_MODIFIED );
122*b1cdbd2cSJim Jagielski }
123*b1cdbd2cSJim Jagielski 
GetError()124*b1cdbd2cSJim Jagielski SbxError SbxBase::GetError()
125*b1cdbd2cSJim Jagielski {
126*b1cdbd2cSJim Jagielski 	return GetSbxData_Impl()->eSbxError;
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
SetError(SbxError e)129*b1cdbd2cSJim Jagielski void SbxBase::SetError( SbxError e )
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski 	SbxAppData* p = GetSbxData_Impl();
132*b1cdbd2cSJim Jagielski 	if( e && p->eSbxError == SbxERR_OK )
133*b1cdbd2cSJim Jagielski 		p->eSbxError = e;
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski 
IsError()136*b1cdbd2cSJim Jagielski sal_Bool SbxBase::IsError()
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski 	return sal_Bool( GetSbxData_Impl()->eSbxError != SbxERR_OK );
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
ResetError()141*b1cdbd2cSJim Jagielski void SbxBase::ResetError()
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski 	GetSbxData_Impl()->eSbxError = SbxERR_OK;
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
AddFactory(SbxFactory * pFac)146*b1cdbd2cSJim Jagielski void SbxBase::AddFactory( SbxFactory* pFac )
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski 	SbxAppData* p = GetSbxData_Impl();
149*b1cdbd2cSJim Jagielski 	const SbxFactory* pTemp = pFac;
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 	// AB, 6.3.96: HandleLast-Flag beruecksichtigen
152*b1cdbd2cSJim Jagielski 	sal_uInt16 nPos = p->aFacs.Count();		// Einfuege-Position
153*b1cdbd2cSJim Jagielski 	if( !pFac->IsHandleLast() )			// Nur, wenn nicht selbst HandleLast
154*b1cdbd2cSJim Jagielski 	{
155*b1cdbd2cSJim Jagielski 		// Neue Factory vor Factories mit HandleLast einordnen
156*b1cdbd2cSJim Jagielski 		while( nPos > 0 &&
157*b1cdbd2cSJim Jagielski 				(static_cast<SbxFactory*>(p->aFacs.GetObject( nPos-1 )))->IsHandleLast() )
158*b1cdbd2cSJim Jagielski 			nPos--;
159*b1cdbd2cSJim Jagielski 	}
160*b1cdbd2cSJim Jagielski 	p->aFacs.Insert( pTemp, nPos );
161*b1cdbd2cSJim Jagielski }
162*b1cdbd2cSJim Jagielski 
RemoveFactory(SbxFactory * pFac)163*b1cdbd2cSJim Jagielski void SbxBase::RemoveFactory( SbxFactory* pFac )
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	SbxAppData* p = GetSbxData_Impl();
166*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i = 0; i < p->aFacs.Count(); i++ )
167*b1cdbd2cSJim Jagielski 	{
168*b1cdbd2cSJim Jagielski 		if( p->aFacs.GetObject( i ) == pFac )
169*b1cdbd2cSJim Jagielski 		{
170*b1cdbd2cSJim Jagielski 			p->aFacs.Remove( i, 1 ); break;
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 	}
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 
Create(sal_uInt16 nSbxId,sal_uInt32 nCreator)176*b1cdbd2cSJim Jagielski SbxBase* SbxBase::Create( sal_uInt16 nSbxId, sal_uInt32 nCreator )
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski     // #91626: Hack to skip old Basic dialogs
179*b1cdbd2cSJim Jagielski     // Problem: There does not exist a factory any more,
180*b1cdbd2cSJim Jagielski     // so we have to create a dummy SbxVariable instead
181*b1cdbd2cSJim Jagielski 	if( nSbxId == 0x65 )    // Dialog Id
182*b1cdbd2cSJim Jagielski         return new SbxVariable;
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski 	XubString aEmptyStr;
185*b1cdbd2cSJim Jagielski 	if( nCreator == SBXCR_SBX )
186*b1cdbd2cSJim Jagielski 	  switch( nSbxId )
187*b1cdbd2cSJim Jagielski 	{
188*b1cdbd2cSJim Jagielski 		case SBXID_VALUE:		return new SbxValue;
189*b1cdbd2cSJim Jagielski 		case SBXID_VARIABLE:	return new SbxVariable;
190*b1cdbd2cSJim Jagielski 		case SBXID_ARRAY:  		return new SbxArray;
191*b1cdbd2cSJim Jagielski 		case SBXID_DIMARRAY:	return new SbxDimArray;
192*b1cdbd2cSJim Jagielski 		case SBXID_OBJECT:		return new SbxObject( aEmptyStr );
193*b1cdbd2cSJim Jagielski 		case SBXID_COLLECTION:	return new SbxCollection( aEmptyStr );
194*b1cdbd2cSJim Jagielski 		case SBXID_FIXCOLLECTION:
195*b1cdbd2cSJim Jagielski 								return new SbxStdCollection( aEmptyStr, aEmptyStr );
196*b1cdbd2cSJim Jagielski 		case SBXID_METHOD:		return new SbxMethod( aEmptyStr, SbxEMPTY );
197*b1cdbd2cSJim Jagielski 		case SBXID_PROPERTY:	return new SbxProperty( aEmptyStr, SbxEMPTY );
198*b1cdbd2cSJim Jagielski 	}
199*b1cdbd2cSJim Jagielski 	// Unbekanter Typ: �ber die Factories gehen!
200*b1cdbd2cSJim Jagielski 	SbxAppData* p = GetSbxData_Impl();
201*b1cdbd2cSJim Jagielski 	SbxBase* pNew = NULL;
202*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i = 0; i < p->aFacs.Count(); i++ )
203*b1cdbd2cSJim Jagielski 	{
204*b1cdbd2cSJim Jagielski 		SbxFactory* pFac = p->aFacs.GetObject( i );
205*b1cdbd2cSJim Jagielski 		pNew = pFac->Create( nSbxId, nCreator );
206*b1cdbd2cSJim Jagielski 		if( pNew )
207*b1cdbd2cSJim Jagielski 			break;
208*b1cdbd2cSJim Jagielski 	}
209*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
210*b1cdbd2cSJim Jagielski 	if( !pNew )
211*b1cdbd2cSJim Jagielski 	{
212*b1cdbd2cSJim Jagielski 		ByteString aMsg( "SBX: Keine Factory fuer SBX-ID " );
213*b1cdbd2cSJim Jagielski 		aMsg += ByteString::CreateFromInt32(nSbxId);
214*b1cdbd2cSJim Jagielski 		DbgError( aMsg.GetBuffer() );
215*b1cdbd2cSJim Jagielski 	}
216*b1cdbd2cSJim Jagielski #endif
217*b1cdbd2cSJim Jagielski 	return pNew;
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski 
CreateObject(const XubString & rClass)220*b1cdbd2cSJim Jagielski SbxObject* SbxBase::CreateObject( const XubString& rClass )
221*b1cdbd2cSJim Jagielski {
222*b1cdbd2cSJim Jagielski 	SbxAppData* p = GetSbxData_Impl();
223*b1cdbd2cSJim Jagielski 	SbxObject* pNew = NULL;
224*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i = 0; i < p->aFacs.Count(); i++ )
225*b1cdbd2cSJim Jagielski 	{
226*b1cdbd2cSJim Jagielski 		pNew = p->aFacs.GetObject( i )->CreateObject( rClass );
227*b1cdbd2cSJim Jagielski 		if( pNew )
228*b1cdbd2cSJim Jagielski 			break;
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
231*b1cdbd2cSJim Jagielski 	if( !pNew )
232*b1cdbd2cSJim Jagielski 	{
233*b1cdbd2cSJim Jagielski 		ByteString aMsg( "SBX: Keine Factory fuer Objektklasse " );
234*b1cdbd2cSJim Jagielski 		ByteString aClassStr( (const UniString&)rClass, RTL_TEXTENCODING_ASCII_US );
235*b1cdbd2cSJim Jagielski 		aMsg += aClassStr;
236*b1cdbd2cSJim Jagielski 		DbgError( (const char*)aMsg.GetBuffer() );
237*b1cdbd2cSJim Jagielski 	}
238*b1cdbd2cSJim Jagielski #endif
239*b1cdbd2cSJim Jagielski 	return pNew;
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski static sal_Bool bStaticEnableBroadcasting = sal_True;
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski // Sbx-Loesung als Ersatz fuer SfxBroadcaster::Enable()
StaticEnableBroadcasting(sal_Bool bEnable)245*b1cdbd2cSJim Jagielski void SbxBase::StaticEnableBroadcasting( sal_Bool bEnable )
246*b1cdbd2cSJim Jagielski {
247*b1cdbd2cSJim Jagielski 	bStaticEnableBroadcasting = bEnable;
248*b1cdbd2cSJim Jagielski }
249*b1cdbd2cSJim Jagielski 
StaticIsEnabledBroadcasting(void)250*b1cdbd2cSJim Jagielski sal_Bool SbxBase::StaticIsEnabledBroadcasting( void )
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski 	return bStaticEnableBroadcasting;
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 
Load(SvStream & rStrm)256*b1cdbd2cSJim Jagielski SbxBase* SbxBase::Load( SvStream& rStrm )
257*b1cdbd2cSJim Jagielski {
258*b1cdbd2cSJim Jagielski 	sal_uInt16 nSbxId, nFlags, nVer;
259*b1cdbd2cSJim Jagielski 	sal_uInt32 nCreator, nSize;
260*b1cdbd2cSJim Jagielski 	rStrm >> nCreator >> nSbxId >> nFlags >> nVer;
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	// Eine Dummheit meinerseits korrigieren:
263*b1cdbd2cSJim Jagielski 	if( nFlags & SBX_RESERVED )
264*b1cdbd2cSJim Jagielski 		nFlags = ( nFlags & ~SBX_RESERVED ) | SBX_GBLSEARCH;
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	sal_uIntPtr nOldPos = rStrm.Tell();
267*b1cdbd2cSJim Jagielski 	rStrm >> nSize;
268*b1cdbd2cSJim Jagielski 	SbxBase* p = Create( nSbxId, nCreator );
269*b1cdbd2cSJim Jagielski 	if( p )
270*b1cdbd2cSJim Jagielski 	{
271*b1cdbd2cSJim Jagielski 		p->nFlags = nFlags;
272*b1cdbd2cSJim Jagielski 		if( p->LoadData( rStrm, nVer ) )
273*b1cdbd2cSJim Jagielski 		{
274*b1cdbd2cSJim Jagielski 			sal_uIntPtr nNewPos = rStrm.Tell();
275*b1cdbd2cSJim Jagielski 			nOldPos += nSize;
276*b1cdbd2cSJim Jagielski 			DBG_ASSERT( nOldPos >= nNewPos, "SBX: Zu viele Daten eingelesen" );
277*b1cdbd2cSJim Jagielski 			if( nOldPos != nNewPos )
278*b1cdbd2cSJim Jagielski 				rStrm.Seek( nOldPos );
279*b1cdbd2cSJim Jagielski 			if( !p->LoadCompleted() )
280*b1cdbd2cSJim Jagielski 			{
281*b1cdbd2cSJim Jagielski 				// Loeschen des Objekts
282*b1cdbd2cSJim Jagielski 				SbxBaseRef aRef( p );
283*b1cdbd2cSJim Jagielski 				p = NULL;
284*b1cdbd2cSJim Jagielski 			}
285*b1cdbd2cSJim Jagielski 		}
286*b1cdbd2cSJim Jagielski 		else
287*b1cdbd2cSJim Jagielski 		{
288*b1cdbd2cSJim Jagielski 			rStrm.SetError( SVSTREAM_FILEFORMAT_ERROR );
289*b1cdbd2cSJim Jagielski 			// Loeschen des Objekts
290*b1cdbd2cSJim Jagielski 			SbxBaseRef aRef( p );
291*b1cdbd2cSJim Jagielski 			p = NULL;
292*b1cdbd2cSJim Jagielski 		}
293*b1cdbd2cSJim Jagielski 	}
294*b1cdbd2cSJim Jagielski 	else
295*b1cdbd2cSJim Jagielski 		rStrm.SetError( SVSTREAM_FILEFORMAT_ERROR );
296*b1cdbd2cSJim Jagielski 	return p;
297*b1cdbd2cSJim Jagielski }
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski // Sbx-Objekt im Stream ueberspringen
Skip(SvStream & rStrm)300*b1cdbd2cSJim Jagielski void SbxBase::Skip( SvStream& rStrm )
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski 	sal_uInt16 nSbxId, nFlags, nVer;
303*b1cdbd2cSJim Jagielski 	sal_uInt32 nCreator, nSize;
304*b1cdbd2cSJim Jagielski 	rStrm >> nCreator >> nSbxId >> nFlags >> nVer;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 	sal_uIntPtr nStartPos = rStrm.Tell();
307*b1cdbd2cSJim Jagielski 	rStrm >> nSize;
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski 	rStrm.Seek( nStartPos + nSize );
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
Store(SvStream & rStrm)312*b1cdbd2cSJim Jagielski sal_Bool SbxBase::Store( SvStream& rStrm )
313*b1cdbd2cSJim Jagielski {
314*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
315*b1cdbd2cSJim Jagielski 	if( !( nFlags & SBX_DONTSTORE ) )
316*b1cdbd2cSJim Jagielski 	{
317*b1cdbd2cSJim Jagielski 		rStrm << (sal_uInt32) GetCreator()
318*b1cdbd2cSJim Jagielski 			  << (sal_uInt16) GetSbxId()
319*b1cdbd2cSJim Jagielski 			  << (sal_uInt16) GetFlags()
320*b1cdbd2cSJim Jagielski 			  << (sal_uInt16) GetVersion();
321*b1cdbd2cSJim Jagielski 		sal_uIntPtr nOldPos = rStrm.Tell();
322*b1cdbd2cSJim Jagielski 		rStrm << (sal_uInt32) 0L;
323*b1cdbd2cSJim Jagielski 		sal_Bool bRes = StoreData( rStrm );
324*b1cdbd2cSJim Jagielski 		sal_uIntPtr nNewPos = rStrm.Tell();
325*b1cdbd2cSJim Jagielski 		rStrm.Seek( nOldPos );
326*b1cdbd2cSJim Jagielski 		rStrm << (sal_uInt32) ( nNewPos - nOldPos );
327*b1cdbd2cSJim Jagielski 		rStrm.Seek( nNewPos );
328*b1cdbd2cSJim Jagielski 		if( rStrm.GetError() != SVSTREAM_OK )
329*b1cdbd2cSJim Jagielski 			bRes = sal_False;
330*b1cdbd2cSJim Jagielski 		if( bRes )
331*b1cdbd2cSJim Jagielski 			bRes = StoreCompleted();
332*b1cdbd2cSJim Jagielski 		return bRes;
333*b1cdbd2cSJim Jagielski 	}
334*b1cdbd2cSJim Jagielski 	else
335*b1cdbd2cSJim Jagielski 		return sal_True;
336*b1cdbd2cSJim Jagielski }
337*b1cdbd2cSJim Jagielski 
LoadData(SvStream &,sal_uInt16)338*b1cdbd2cSJim Jagielski sal_Bool SbxBase::LoadData( SvStream&, sal_uInt16 )
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
341*b1cdbd2cSJim Jagielski 	return sal_False;
342*b1cdbd2cSJim Jagielski }
343*b1cdbd2cSJim Jagielski 
StoreData(SvStream &) const344*b1cdbd2cSJim Jagielski sal_Bool SbxBase::StoreData( SvStream& ) const
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
347*b1cdbd2cSJim Jagielski 	return sal_False;
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
LoadPrivateData(SvStream &,sal_uInt16)350*b1cdbd2cSJim Jagielski sal_Bool SbxBase::LoadPrivateData( SvStream&, sal_uInt16 )
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
353*b1cdbd2cSJim Jagielski 	return sal_True;
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski 
StorePrivateData(SvStream &) const356*b1cdbd2cSJim Jagielski sal_Bool SbxBase::StorePrivateData( SvStream& ) const
357*b1cdbd2cSJim Jagielski {
358*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
359*b1cdbd2cSJim Jagielski 	return sal_True;
360*b1cdbd2cSJim Jagielski }
361*b1cdbd2cSJim Jagielski 
LoadCompleted()362*b1cdbd2cSJim Jagielski sal_Bool SbxBase::LoadCompleted()
363*b1cdbd2cSJim Jagielski {
364*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
365*b1cdbd2cSJim Jagielski 	return sal_True;
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski 
StoreCompleted()368*b1cdbd2cSJim Jagielski sal_Bool SbxBase::StoreCompleted()
369*b1cdbd2cSJim Jagielski {
370*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS( SbxBase, 0 );
371*b1cdbd2cSJim Jagielski 	return sal_True;
372*b1cdbd2cSJim Jagielski }
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski //////////////////////////////// SbxFactory ////////////////////////////////
375*b1cdbd2cSJim Jagielski 
Create(sal_uInt16,sal_uInt32)376*b1cdbd2cSJim Jagielski SbxBase* SbxFactory::Create( sal_uInt16, sal_uInt32 )
377*b1cdbd2cSJim Jagielski {
378*b1cdbd2cSJim Jagielski 	return NULL;
379*b1cdbd2cSJim Jagielski }
380*b1cdbd2cSJim Jagielski 
CreateObject(const XubString &)381*b1cdbd2cSJim Jagielski SbxObject* SbxFactory::CreateObject( const XubString& )
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski 	return NULL;
384*b1cdbd2cSJim Jagielski }
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski ///////////////////////////////// SbxInfo //////////////////////////////////
387*b1cdbd2cSJim Jagielski 
~SbxInfo()388*b1cdbd2cSJim Jagielski SbxInfo::~SbxInfo()
389*b1cdbd2cSJim Jagielski {}
390*b1cdbd2cSJim Jagielski 
AddParam(const XubString & rName,SbxDataType eType,sal_uInt16 nFlags)391*b1cdbd2cSJim Jagielski void SbxInfo::AddParam
392*b1cdbd2cSJim Jagielski 		( const XubString& rName, SbxDataType eType, sal_uInt16 nFlags )
393*b1cdbd2cSJim Jagielski {
394*b1cdbd2cSJim Jagielski 	const SbxParamInfo* p = new SbxParamInfo( rName, eType, nFlags );
395*b1cdbd2cSJim Jagielski 	aParams.Insert( p, aParams.Count() );
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski 
AddParam(const SbxParamInfo & r)398*b1cdbd2cSJim Jagielski void SbxInfo::AddParam( const SbxParamInfo& r )
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski 	const SbxParamInfo* p = new SbxParamInfo
401*b1cdbd2cSJim Jagielski 		( r.aName, r.eType, r.nFlags, r.aTypeRef );
402*b1cdbd2cSJim Jagielski 	aParams.Insert( p, aParams.Count() );
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski 
GetParam(sal_uInt16 n) const405*b1cdbd2cSJim Jagielski const SbxParamInfo* SbxInfo::GetParam( sal_uInt16 n ) const
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski 	if( n < 1 || n > aParams.Count() )
408*b1cdbd2cSJim Jagielski 		return NULL;
409*b1cdbd2cSJim Jagielski 	else
410*b1cdbd2cSJim Jagielski 		return aParams.GetObject( n-1 );
411*b1cdbd2cSJim Jagielski }
412*b1cdbd2cSJim Jagielski 
LoadData(SvStream & rStrm,sal_uInt16 nVer)413*b1cdbd2cSJim Jagielski sal_Bool SbxInfo::LoadData( SvStream& rStrm, sal_uInt16 nVer )
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski 	aParams.Remove( 0, aParams.Count() );
416*b1cdbd2cSJim Jagielski 	sal_uInt16 nParam;
417*b1cdbd2cSJim Jagielski 	rStrm.ReadByteString( aComment, RTL_TEXTENCODING_ASCII_US );
418*b1cdbd2cSJim Jagielski 	rStrm.ReadByteString( aHelpFile, RTL_TEXTENCODING_ASCII_US );
419*b1cdbd2cSJim Jagielski 	rStrm >> nHelpId >> nParam;
420*b1cdbd2cSJim Jagielski 	while( nParam-- )
421*b1cdbd2cSJim Jagielski 	{
422*b1cdbd2cSJim Jagielski 		XubString aName;
423*b1cdbd2cSJim Jagielski 		sal_uInt16 nType, nFlags;
424*b1cdbd2cSJim Jagielski 		sal_uInt32 nUserData = 0;
425*b1cdbd2cSJim Jagielski 		rStrm.ReadByteString( aName, RTL_TEXTENCODING_ASCII_US );
426*b1cdbd2cSJim Jagielski 		rStrm >> nType >> nFlags;
427*b1cdbd2cSJim Jagielski 		if( nVer > 1 )
428*b1cdbd2cSJim Jagielski 			rStrm >> nUserData;
429*b1cdbd2cSJim Jagielski 		AddParam( aName, (SbxDataType) nType, nFlags );
430*b1cdbd2cSJim Jagielski 		SbxParamInfo* p = aParams.GetObject( aParams.Count() - 1 );
431*b1cdbd2cSJim Jagielski 		p->nUserData = nUserData;
432*b1cdbd2cSJim Jagielski 	}
433*b1cdbd2cSJim Jagielski 	return sal_True;
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
StoreData(SvStream & rStrm) const436*b1cdbd2cSJim Jagielski sal_Bool SbxInfo::StoreData( SvStream& rStrm ) const
437*b1cdbd2cSJim Jagielski {
438*b1cdbd2cSJim Jagielski 	rStrm.WriteByteString( aComment, RTL_TEXTENCODING_ASCII_US );
439*b1cdbd2cSJim Jagielski 	rStrm.WriteByteString( aHelpFile, RTL_TEXTENCODING_ASCII_US );
440*b1cdbd2cSJim Jagielski 	rStrm << nHelpId << aParams.Count();
441*b1cdbd2cSJim Jagielski 	for( sal_uInt16 i = 0; i < aParams.Count(); i++ )
442*b1cdbd2cSJim Jagielski 	{
443*b1cdbd2cSJim Jagielski 		SbxParamInfo* p = aParams.GetObject( i );
444*b1cdbd2cSJim Jagielski 		rStrm.WriteByteString( p->aName, RTL_TEXTENCODING_ASCII_US );
445*b1cdbd2cSJim Jagielski 		rStrm << (sal_uInt16) p->eType
446*b1cdbd2cSJim Jagielski 			  << (sal_uInt16) p->nFlags
447*b1cdbd2cSJim Jagielski 			  << (sal_uInt32) p->nUserData;
448*b1cdbd2cSJim Jagielski 	}
449*b1cdbd2cSJim Jagielski 	return sal_True;
450*b1cdbd2cSJim Jagielski }
451*b1cdbd2cSJim Jagielski 
452