lib Library API Documentation

koscript_struct.cc

00001 /* This file is part of the KDE project
00002    Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org>
00003 
00004    This library is free software; you can redistribute it and/or
00005    modify it under the terms of the GNU Library General Public
00006    License as published by the Free Software Foundation; either
00007    version 2 of the License, or (at your option) any later version.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00017    Boston, MA 02111-1307, USA.
00018 */
00019 
00020 #include "koscript_struct.h"
00021 #include "koscript_util.h"
00022 #include "koscript_property.h"
00023 #include "koscript_method.h"
00024 #include "koscript.h"
00025 
00026 #include <klocale.h>
00027 
00028 /***************************************************
00029  *
00030  * KSStructClass
00031  *
00032  ***************************************************/
00033 
00034 KSStructClass::KSStructClass( KSModule* m, const QString& name )
00035   : m_name( name ), m_module( m )
00036 {
00037   m_space.insert( "isA", new KSValue( &KSStruct::isA ) );
00038 }
00039 
00040 bool KSStructClass::constructor( KSContext& context )
00041 {
00042   context.setValue( new KSValue( constructor() ) );
00043 
00044   return true;
00045 }
00046 
00047 KSStruct* KSStructClass::constructor()
00048 {
00049   return new KSStruct( this );
00050 }
00051 
00052 KSValue::Ptr KSStructClass::member( KSContext& context, const QString& name )
00053 {
00054   KSNamespace::Iterator it = m_space.find( name );
00055   if ( it == m_space.end() )
00056   {
00057     QString tmp( i18n("Unknown symbol '%1' in struct of type %2 of module '%3'") );
00058     context.setException( new KSException( "UnknownName", tmp.arg( name ).arg( m_name ).arg( module()->name() ) ) );
00059     return 0;
00060   }
00061 
00062   return it.data();
00063 }
00064 
00065 QString KSStructClass::fullName() const
00066 {
00067     return ( m_module->name() + ":" + m_name );
00068 }
00069 
00070 /***************************************************
00071  *
00072  * KSStruct
00073  *
00074  ***************************************************/
00075 
00076 bool KSStruct::isA( KSContext& context )
00077 {
00078   if ( !KSUtil::checkArgumentsCount( context, 0, "Struct::isA" ) )
00079     return false;
00080 
00081   context.setValue( new KSValue( m_class->name() ) );
00082 
00083   return true;
00084 }
00085 
00086 KSValue::Ptr KSStruct::member( KSContext& context, const QString& name )
00087 {
00088   if ( context.leftExpr() )
00089   {
00090     this->ref();
00091     KSValue::Ptr ptr( new KSValue( new KSProperty( this, name ) ) );
00092     ptr->setMode( KSValue::LeftExpr );
00093     return ptr;
00094   }
00095 
00096   KSNamespace::Iterator it = m_space.find( name );
00097   if ( it != m_space.end() )
00098     return it.data();
00099 
00100   it = m_class->nameSpace()->find( name );
00101   if ( it != m_class->nameSpace()->end() )
00102     return it.data();
00103 
00104   QString tmp( i18n("Unknown symbol '%1' in object of struct '%2'") );
00105   context.setException( new KSException( "UnknownName", tmp.arg( name ).arg( getClass()->name() ) ) );
00106   return 0;
00107 }
00108 
00109 bool KSStruct::setMember( KSContext& context, const QString& name, const KSValue::Ptr& v )
00110 {
00111   if ( !m_class->vars().contains( name ) )
00112   {
00113     QString tmp( i18n("Unknown symbol '%1' in object of struct '%2'") );
00114     context.setException( new KSException( "UnknownName", tmp.arg( name ).arg( getClass()->name() ) ) );
00115     return false;
00116   }
00117 
00118   m_space.insert( name, v );
00119 
00120   return true;
00121 }
00122 
00123 bool KSBuiltinStructClass::hasMethod( const QString& name ) const
00124 {
00125     return m_methods.contains( name );
00126 }
00127 
00128 /***************************************************
00129  *
00130  * KSBuiltinStructClass
00131  *
00132  ***************************************************/
00133 
00134 KSBuiltinStructClass::KSBuiltinStructClass( KSModule* module, const QString& name )
00135     : KSStructClass( module, name )
00136 {
00137 }
00138 
00139 void KSBuiltinStructClass::addMethod( const QString& name, KSBuiltinStructClass::MethodPtr m, const QCString& signature )
00140 {
00141     Method s;
00142     s.m_method = m;
00143     s.m_signature = signature;
00144     m_methods[ name ] = s;
00145 }
00146 
00147 bool KSBuiltinStructClass::call( void* object, KSContext& context, const QString& name )
00148 {
00149     QMap<QString,Method>::Iterator it = m_methods.find( name );
00150     Q_ASSERT( it != m_methods.end() );
00151 
00152     if ( !it.data().m_signature.isNull() )
00153     if ( !KSUtil::checkArgs( context, it.data().m_signature, name, TRUE ) )
00154         return FALSE;
00155 
00156     return it.data().m_method( object, context, context.value()->listValue() );
00157 }
00158 
00159 /***************************************************
00160  *
00161  * KSBuiltinStruct
00162  *
00163  ***************************************************/
00164 
00165 KSBuiltinStruct::KSBuiltinStruct( KSStructClass* c, void* object )
00166     : KSStruct( c )
00167 {
00168     m_object = object;
00169 }
00170 
00171 KSBuiltinStruct::~KSBuiltinStruct()
00172 {
00173     ((KSBuiltinStructClass*)getClass())->destructor( m_object );
00174 }
00175 
00176 KSValue::Ptr KSBuiltinStruct::member( KSContext& context, const QString& name )
00177 {
00178     if ( context.leftExpr() )
00179     {
00180     this->ref();
00181     KSValue::Ptr ptr( new KSValue( new KSProperty( this, name ) ) );
00182     ptr->setMode( KSValue::LeftExpr );
00183     return ptr;
00184     }
00185 
00186     // Is it a method ?
00187     if ( ((KSBuiltinStructClass*)getClass())->hasMethod( name ) )
00188     return ( new KSValue( (KSStructBuiltinMethod)&KSBuiltinStruct::call ) );
00189 
00190     // Look in the KSStructClass namespace
00191     KSNamespace::Iterator it = getClass()->nameSpace()->find( name );
00192     if ( it != getClass()->nameSpace()->end() )
00193     return it.data();
00194 
00195     // Is it a variable ?
00196     if ( getClass()->hasVariable( name ) )
00197     return( ((KSBuiltinStructClass*)getClass())->property( context, m_object, name ) );
00198 
00199     QString tmp( i18n("Unknown symbol '%1' in object of struct '%2'") );
00200     context.setException( new KSException( "UnknownName", tmp.arg( name ).arg( getClass()->name() ) ) );
00201     return 0;
00202 }
00203 
00204 bool KSBuiltinStruct::setMember( KSContext& context, const QString& name, const KSValue::Ptr& v )
00205 {
00206     if ( !getClass()->vars().contains( name ) )
00207     {
00208     QString tmp( i18n("Unknown variable '%1' in object of struct '%2'") );
00209     context.setException( new KSException( "UnknownName", tmp.arg( name ).arg( getClass()->name() ) ) );
00210     return FALSE;
00211     }
00212 
00213     bool b = ((KSBuiltinStructClass*)getClass())->setProperty( context, m_object, name, v );
00214 
00215     // Some exception ? -> return
00216     if ( !b && context.exception() )
00217     return FALSE;
00218     // Standard error: The variable is readonly
00219     if ( !b )
00220     {
00221     QString tmp( i18n("The variable '%1' in object of struct '%2' is readonly") );
00222     context.setException( new KSException( "ReadOnly", tmp.arg( name ).arg( getClass()->name() ) ) );
00223     return FALSE;
00224     }
00225 
00226     return TRUE;
00227 }
00228 
00229 bool KSBuiltinStruct::call( KSContext& context, const QString& name )
00230 {
00231     return ((KSBuiltinStructClass*)getClass())->call( m_object, context, name );
00232 }
00233 
00234 KSStruct* KSBuiltinStruct::clone()
00235 {
00236     return ((KSBuiltinStructClass*)getClass())->clone( this );
00237 }
00238 
00239 void* KSBuiltinStruct::object()
00240 {
00241     return m_object;
00242 }
00243 
00244 const void* KSBuiltinStruct::object() const
00245 {
00246     return m_object;
00247 }
KDE Logo
This file is part of the documentation for lib Library Version 1.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Feb 13 09:40:07 2006 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003