blob: 805ff03a7a8517b7e8430f06f8dc337ca3f2df25 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_idl.hxx"
#include <tools/debug.hxx>
#include <limits.h>
#include <ctype.h>
#include <bastype.hxx>
#include <lex.hxx>
#include <globals.hxx>
#include <hash.hxx>
#include <database.hxx>
#ifdef IDL_COMPILER
/************************************************************************/
static sal_Bool ReadRangeSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm,
sal_uLong nMin, sal_uLong nMax, sal_uLong* pValue )
{
sal_uInt32 nTokPos = rInStm.Tell();
SvToken * pTok = rInStm.GetToken_Next();
if( pTok->Is( pName ) )
{
sal_Bool bOk = sal_False;
if( rInStm.Read( '=' ) )
{
pTok = rInStm.GetToken_Next();
if( pTok->IsInteger() )
{
sal_uLong n = pTok->GetNumber();
if ( n >= nMin && n <= nMax )
{
*pValue = n;
bOk = sal_True;
}
}
}
if( bOk )
return sal_True;
}
rInStm.Seek( nTokPos );
return sal_False;
}
#endif
/*************************************************************************
|*
|* SvUINT32::Read()
|* SvUINT32::Write()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_uInt32 SvUINT32::Read( SvStream & rStm )
{
return SvPersistStream::ReadCompressed( rStm );
}
void SvUINT32::Write( SvStream & rStm, sal_uInt32 nVal )
{
SvPersistStream::WriteCompressed( rStm, nVal );
}
/*************************************************************************
|*
|* SvStream& operator << ( SvBOOL )
|* SvStream& operator >> ( SvBOOL )
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
SvStream& operator << (SvStream & rStm, const SvBOOL & rb )
{
sal_uInt8 n = rb.nVal;
if( rb.bSet )
n |= 0x02;
rStm << n;
return rStm;
}
SvStream& operator >> (SvStream & rStm, SvBOOL & rb )
{
sal_uInt8 n;
rStm >> n;
rb.nVal = (n & 0x01) ? sal_True : sal_False;
rb.bSet = (n & 0x02) ? sal_True : sal_False;
if( n & ~0x03 )
{
rStm.SetError( SVSTREAM_FILEFORMAT_ERROR );
DBG_ERROR( "format error" );
}
return rStm;
}
/*************************************************************************
|*
|* SvStream& operator << ( SvVersion )
|* SvStream& operator >> ( SvVersion )
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
SvStream& operator << (SvStream & rStm, const SvVersion & r )
{
if( (r.GetMajorVersion() || r.GetMinorVersion())
&& r.GetMajorVersion() <= 0x0F && r.GetMinorVersion() <= 0x0F )
{ // Versionsnummer in 1 Byte komprimieren
// Format 4 Bit fuer Major, dann 4 Bit fuer Minor.
// 0.0 wird nicht komprimiert
int n = r.GetMajorVersion() << 4;
n |= r.GetMinorVersion();
rStm << (sal_uInt8)n;
}
else
{
rStm << (sal_uInt8)0;
rStm << r.GetMajorVersion();
rStm << r.GetMinorVersion();
}
return rStm;
}
SvStream& operator >> (SvStream & rStm, SvVersion & r )
{
sal_uInt8 n;
rStm >> n;
if( n == 0 )
{ // nicht komprimiert
rStm >> r.nMajorVersion;
rStm >> r.nMinorVersion;
}
else
{ // komprimiert
r.nMajorVersion = (n >> 4) & 0x0F;
r.nMinorVersion = n & 0x0F;
}
return rStm;
}
#ifdef IDL_COMPILER
/************************************************************************/
/*************************************************************************
|*
|* SvBOOL::ReadSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvBOOL::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
{
sal_uInt32 nTokPos = rInStm.Tell();
SvToken * pTok = rInStm.GetToken_Next();
if( pTok->Is( pName ) )
{
sal_Bool bOk = sal_True;
sal_Bool bBraket = rInStm.Read( '(' );
if( bBraket || rInStm.Read( '=' ) )
{
pTok = rInStm.GetToken();
if( pTok->IsBool() )
{
*this = pTok->GetBool();
rInStm.GetToken_Next();
}
if( bOk && bBraket )
bOk = rInStm.Read( ')' );
}
else
*this = sal_True; //Defaultaktion ist auf sal_True setzen
if( bOk )
return sal_True;
}
rInStm.Seek( nTokPos );
return sal_False;
}
/*************************************************************************
|*
|* SvBOOL::WriteSvIdl()
|*
|* Beschreibung
|*
*************************************************************************/
sal_Bool SvBOOL::WriteSvIdl( SvStringHashEntry * pName, SvStream & rOutStm )
{
if( nVal )
rOutStm << pName->GetName().GetBuffer();
else
rOutStm << pName->GetName().GetBuffer() << "(FALSE)";
return sal_True;
}
/*************************************************************************
|*
|* SvBOOL::WriteSvIdl()
|*
|* Beschreibung
|*
*************************************************************************/
ByteString SvBOOL::GetSvIdlString( SvStringHashEntry * pName )
{
if( nVal )
return pName->GetName();
else
{
ByteString aTmp( pName->GetName() );
aTmp += "(FALSE)";
return aTmp;
}
}
/************************************************************************/
/*************************************************************************
|*
|* SvIdentifier::ReadSvIdl()
|*
|* Beschreibung
|*
*************************************************************************/
sal_Bool SvIdentifier::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
{
sal_uInt32 nTokPos = rInStm.Tell();
SvToken * pTok = rInStm.GetToken_Next();
if( pTok->Is( pName ) )
{
sal_Bool bOk = sal_True;
sal_Bool bBraket = rInStm.Read( '(' );
if( bBraket || rInStm.Read( '=' ) )
{
pTok = rInStm.GetToken();
if( pTok->IsIdentifier() )
{
*(ByteString *)this = pTok->GetString();
rInStm.GetToken_Next();
}
if( bOk && bBraket )
bOk = rInStm.Read( ')' );
}
if( bOk )
return sal_True;
}
rInStm.Seek( nTokPos );
return sal_False;
}
/*************************************************************************
|*
|* SvIdentifier::WriteSvIdl()
|*
|* Beschreibung
|*
*************************************************************************/
sal_Bool SvIdentifier::WriteSvIdl( SvStringHashEntry * pName,
SvStream & rOutStm,
sal_uInt16 /*nTab */ )
{
rOutStm << pName->GetName().GetBuffer() << '(';
rOutStm << GetBuffer() << ')';
return sal_True;
}
SvStream& operator << (SvStream & rStm, const SvIdentifier & r )
{
rStm.WriteByteString( r );
return rStm;
}
SvStream& operator >> (SvStream & rStm, SvIdentifier & r )
{
rStm.ReadByteString( r );
return rStm;
}
/************************************************************************/
/*************************************************************************
|*
|* SvNumberIdentifier::ReadSvIdl()
|*
|* Beschreibung
|*
*************************************************************************/
sal_Bool SvNumberIdentifier::ReadSvIdl( SvIdlDataBase & rBase,
SvStringHashEntry * pName,
SvTokenStream & rInStm )
{
if( SvIdentifier::ReadSvIdl( pName, rInStm ) )
{
sal_uLong n;
if( rBase.FindId( *this, &n ) )
{
nValue = n;
return sal_True;
}
else
{
ByteString aStr ("no value for identifier <");
aStr += *this;
aStr += "> ";
rBase.SetError( aStr, rInStm.GetToken() );
rBase.WriteError( rInStm );
}
}
return sal_False;
}
/*************************************************************************
|*
|* SvNumberIdentifier::ReadSvIdl()
|*
|* Beschreibung
|*
*************************************************************************/
sal_Bool SvNumberIdentifier::ReadSvIdl( SvIdlDataBase & rBase,
SvTokenStream & rInStm )
{
sal_uInt32 nTokPos = rInStm.Tell();
SvToken * pTok = rInStm.GetToken_Next();
if( pTok->IsIdentifier() )
{
sal_uLong n;
if( rBase.FindId( pTok->GetString(), &n ) )
{
*(ByteString *)this = pTok->GetString();
nValue = n;
return sal_True;
}
else
{
ByteString aStr ("no value for identifier <");
aStr += *this;
aStr += "> ";
rBase.SetError( aStr, rInStm.GetToken() );
rBase.WriteError( rInStm );
}
}
rInStm.Seek( nTokPos );
return sal_False;
}
/*************************************************************************
|*
|* SvStream& operator << ( SvNumberIdentifier )
|* SvStream& operator >> ( SvNumberIdentifier )
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
SvStream& operator << (SvStream & rStm, const SvNumberIdentifier & r )
{
rStm << (SvIdentifier &)r;
SvPersistStream::WriteCompressed( rStm, r.nValue );
return rStm;
}
SvStream& operator >> (SvStream & rStm, SvNumberIdentifier & r )
{
rStm >> (SvIdentifier &)r;
r.nValue = SvPersistStream::ReadCompressed( rStm );
return rStm;
}
/************************************************************************/
/*************************************************************************
|*
|* SvString::ReadSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvString::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )
{
sal_uInt32 nTokPos = rInStm.Tell();
SvToken * pTok = rInStm.GetToken_Next();
if( pTok->Is( pName ) )
{
sal_Bool bOk = sal_True;
sal_Bool bBraket = rInStm.Read( '(' );
if( bBraket || rInStm.Read( '=' ) )
{
pTok = rInStm.GetToken();
if( pTok->IsString() )
{
*(ByteString *)this = pTok->GetString();
rInStm.GetToken_Next();
}
if( bOk && bBraket )
bOk = rInStm.Read( ')' );
}
if( bOk )
return sal_True;
}
rInStm.Seek( nTokPos );
return sal_False;
}
/*************************************************************************
|*
|* SvString::WriteSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvString::WriteSvIdl( SvStringHashEntry * pName, SvStream & rOutStm,
sal_uInt16 /*nTab */ )
{
rOutStm << pName->GetName().GetBuffer() << "(\"";
rOutStm << GetBuffer() << "\")";
return sal_True;
}
SvStream& operator << (SvStream & rStm, const SvString & r )
{
rStm.WriteByteString( r );
return rStm;
}
SvStream& operator >> (SvStream & rStm, SvString & r )
{
rStm.ReadByteString( r );
return rStm;
}
/*************************************************************************
|*
|* SvHelpText::ReadSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvHelpText::ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm )
{
return SvString::ReadSvIdl( SvHash_HelpText(), rInStm );
}
/*************************************************************************
|*
|* SvHelpText::WriteSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvHelpText::WriteSvIdl( SvIdlDataBase &, SvStream & rOutStm, sal_uInt16 nTab )
{
return SvString::WriteSvIdl( SvHash_HelpText(), rOutStm, nTab );
}
/************************************************************************/
/*************************************************************************
|*
|* SvUUId::ReadSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvUUId::ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm )
{
sal_uInt32 nTokPos = rInStm.Tell();
SvToken * pTok = rInStm.GetToken_Next();
if( pTok->Is( SvHash_uuid() ) )
{
sal_Bool bOk = sal_True;
sal_Bool bBraket = rInStm.Read( '(' );
if( bBraket || rInStm.Read( '=' ) )
{
pTok = rInStm.GetToken();
if( pTok->IsString() )
{
pTok = rInStm.GetToken_Next();
bOk = MakeId( String::CreateFromAscii( pTok->GetString().GetBuffer() ) );
}
if( bOk && bBraket )
bOk = rInStm.Read( ')' );
}
if( bOk )
return sal_True;
}
rInStm.Seek( nTokPos );
return sal_False;
}
/*************************************************************************
|*
|* SvMetaObject::WriteSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvUUId::WriteSvIdl( SvStream & rOutStm )
{
// Global Id schreiben
rOutStm << SvHash_uuid()->GetName().GetBuffer() << "(\"";
rOutStm << ByteString( GetHexName(), RTL_TEXTENCODING_UTF8 ).GetBuffer() << "\")";
return sal_True;
}
/************************************************************************/
/*************************************************************************
|*
|* SvVersion::ReadSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvVersion::ReadSvIdl( SvTokenStream & rInStm )
{
sal_uLong n = 0;
sal_uInt32 nTokPos = rInStm.Tell();
if( ReadRangeSvIdl( SvHash_Version(), rInStm, 0 , 0xFFFF, &n ) )
{
nMajorVersion = (sal_uInt16)n;
if( rInStm.Read( '.' ) )
{
SvToken * pTok = rInStm.GetToken_Next();
if( pTok->IsInteger() && pTok->GetNumber() <= 0xFFFF )
{
nMinorVersion = (sal_uInt16)pTok->GetNumber();
return sal_True;
}
}
else
return sal_True;
}
rInStm.Seek( nTokPos );
return sal_False;
}
/*************************************************************************
|*
|* SvVersion::WriteSvIdl()
|*
|* Beschreibung
|* Ersterstellung MM 12.12.94
|* Letzte Aenderung MM 12.12.94
|*
*************************************************************************/
sal_Bool SvVersion::WriteSvIdl( SvStream & rOutStm )
{
rOutStm << SvHash_Version()->GetName().GetBuffer() << '('
<< ByteString::CreateFromInt32( nMajorVersion ).GetBuffer() << '.'
<< ByteString::CreateFromInt32( nMinorVersion ).GetBuffer() << ')';
return sal_True;
}
#endif //IDL_COMPILER