00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "nel/ai/nl_ai.h"
00026 #include "nel/ai/agent/agent_script.h"
00027 #include "nel/ai/agent/agent_manager.h"
00028 #include "nel/ai/agent/agent_local_mailer.h"
00029 #include "nel/ai/script/interpret_object_agent.h"
00030 #include "nel/ai/script/codage.h"
00031 #include "nel/ai/script/type_def.h"
00032 #include "nel/ai/script/object_unknown.h"
00033 #include "nel/ai/agent/agent_method_def.h"
00034 #include "nel/ai/agent/message_script.h"
00035 #include "nel/ai/script/interpret_object_message.h"
00036 #include "nel/ai/script/interpret_message_action.h"
00037 #include "nel/ai/script/interpret_message_getvalue.h"
00038 #include "nel/ai/script/interpret_message_setvalue.h"
00039 #include "nel/ai/script/interpret_object_agent.h"
00040 #include "nel/ai/agent/agent_nombre.h"
00041 #include "nel/ai/agent/performative.h"
00042 #include "nel/ai/agent/msg_notify.h"
00043 #include "nel/ai/agent/msg_goal.h"
00044 #include "nel/ai/agent/msg_fact.h"
00045 #include "nel/ai/agent/msg_setvalue.h"
00046 #include "nel/ai/logic/factbase.h"
00047 #include "nel/ai/logic/goal.h"
00048 #include "nel/ai/agent/key_agent.h"
00049 #include "nel/ai/agent/list_manager.h"
00050 #include "nel/ai/logic/fact.h"
00051 #include "nel/ai/agent/msg_fact.h"
00052 #include "nel/ai/script/libcode.h"
00053
00054
00055 #ifdef PROFILE
00056 #include "nel/misc/time_nl.h"
00057 #endif
00058
00059
00060 namespace NLAIAGENT
00061 {
00062 NLAISCRIPT::COperandSimpleListOr *CAgentScript::msgType = NULL;
00063 NLAISCRIPT::COperandSimpleListOr *CAgentScript::msgPerf = NULL;
00064 NLAISCRIPT::CParam *CAgentScript::SendParamMessageScript = NULL;
00065 NLAISCRIPT::CParam *CAgentScript::SendCompParamMessageScript = NULL;
00066 NLAISCRIPT::COperandSimple *CAgentScript::IdMsgNotifyParentClass = NULL;
00067 NLAISCRIPT::COperandSimpleListOr *CAgentScript::IdMsgNotifyParent = NULL;
00068 NLAISCRIPT::CParam *CAgentScript::ParamRunParentNotify = NULL;
00069 CAgentScript::CMethodCall **CAgentScript::StaticMethod = NULL;
00070 NLAISCRIPT::COperandSimpleListOr *CAgentScript::ParamIdGetValueMsg = NULL;
00071 NLAISCRIPT::CParam *CAgentScript::ParamGetValueMsg = NULL;
00072 NLAISCRIPT::COperandSimpleListOr *CAgentScript::ParamIdSetValueMsg = NULL;
00073 NLAISCRIPT::CParam *CAgentScript::ParamSetValueMsg = NULL;
00074 NLAISCRIPT::COperandSimpleListOr *CAgentScript::ParamIdTellComponentMsg = NULL;
00075 NLAISCRIPT::CParam *CAgentScript::ParamTellComponentMsg = NULL;
00076 NLAISCRIPT::COperandSimpleListOr *CAgentScript::ParamIdInitComponentMsg = NULL;
00077 NLAISCRIPT::CParam *CAgentScript::ParamInitComponentMsg = NULL;
00078
00079 const NLAIAGENT::IVarName *CAgentScript::getClassName() const
00080 {
00081 const NLAIAGENT::IVarName *classname;
00082 if ( _AgentClass != NULL )
00083 {
00084 classname = _AgentClass->getClassName();
00085 }
00086 else
00087 classname = new CStringVarName("<unknown>");
00088
00089 return classname;
00090 }
00091
00092 void CAgentScript::initAgentScript()
00093 {
00094
00095 std::string msgStr;
00096 std::string scriptName("MsgAgentScript");
00097 msgStr = std::string("From Message : Define MsgTellComponent\n{");
00098 msgStr += std::string("Component:\n");
00099 msgStr += std::string("\tString<'CompomentName'>;\n");
00100 msgStr += std::string("\tMessage<'MsgType'>;\n");
00101 msgStr += std::string("End\n");
00102
00103
00104 msgStr += std::string("Constructor(String i; Message msg)\n");
00105 msgStr += std::string("\tCompomentName = i;\n");
00106 msgStr += std::string("\tMsgType = msg;\n");
00107 msgStr += std::string("End\n");
00108 msgStr += std::string("}\n");
00109
00110
00111 msgStr += std::string("From Message : Define MsgInitCompoment\n{");
00112 msgStr += std::string("Component:\n");
00113 msgStr += std::string("End\n}\n");
00114
00115 NLAILINK::buildScript(msgStr,scriptName);
00116
00117 static NLAIC::CIdentType idMsgTellComponentType ("MsgTellComponent");
00118 static NLAIC::CIdentType idMsgInitComponentType ("MsgInitCompoment");
00119
00120 msgType = new NLAISCRIPT::COperandSimpleListOr(3,
00121 new NLAIC::CIdentType(CMessageList::IdMessage),
00122 new NLAIC::CIdentType(CMessageVector::IdMessageVector),
00123 new NLAIC::CIdentType(NLAISCRIPT::CMessageClass::IdMessageClass));
00124
00125 msgPerf = new NLAISCRIPT::COperandSimpleListOr(7,
00126 new NLAIC::CIdentType(CPExec::IdPExec),
00127 new NLAIC::CIdentType(CPAchieve::IdPAchieve),
00128 new NLAIC::CIdentType(CPAsk::IdPAsk),
00129 new NLAIC::CIdentType(CPBreak::IdPBreak),
00130 new NLAIC::CIdentType(CPTell::IdPTell),
00131 new NLAIC::CIdentType(CPKill::IdPKill),
00132 new NLAIC::CIdentType(CPError::IdPError));
00133
00134
00135 SendParamMessageScript = new NLAISCRIPT::CParam(2,msgPerf, msgType);
00136
00137 msgPerf->incRef();
00138 msgType->incRef();
00139
00140 SendCompParamMessageScript = new NLAISCRIPT::CParam(3,new NLAISCRIPT::COperandSimple(new NLAIC::CIdentType(CStringType::IdStringType)),
00141 msgPerf, msgType);
00142
00143 IdMsgNotifyParentClass = new NLAISCRIPT::COperandSimple(new NLAIC::CIdentType(NLAISCRIPT::CMsgNotifyParentClass::IdMsgNotifyParentClass));
00144
00145 IdMsgNotifyParent = new NLAISCRIPT::COperandSimpleListOr(2,
00146 new NLAIC::CIdentType(NLAISCRIPT::CMsgNotifyParentClass::IdMsgNotifyParentClass),
00147 new NLAIC::CIdentType(CNotifyParentScript::IdNotifyParentScript));
00148
00149 ParamRunParentNotify = new NLAISCRIPT::CParam(1,IdMsgNotifyParent);
00150
00151 NLAISCRIPT::COperandSimple *idMsgTellComponent = new NLAISCRIPT::COperandSimple(new NLAIC::CIdentType(idMsgTellComponentType));
00152 NLAISCRIPT::CParam *ParamTellComponentMsg = new NLAISCRIPT::CParam(1,idMsgTellComponent);
00153
00154 CAgentScript::ParamIdGetValueMsg = new NLAISCRIPT::COperandSimpleListOr(2,
00155 new NLAIC::CIdentType(NLAIAGENT::CGetValueMsg::IdGetValueMsg),
00156 new NLAIC::CIdentType(NLAISCRIPT::CGetValueMsgClass::IdGetValueMsgClass) );
00157
00158 CAgentScript::ParamGetValueMsg = new NLAISCRIPT::CParam(1,ParamIdGetValueMsg);
00159
00160 CAgentScript::ParamIdSetValueMsg = new NLAISCRIPT::COperandSimpleListOr(2,
00161 new NLAIC::CIdentType(NLAIAGENT::CSetValueMsg::IdSetValueMsg),
00162 new NLAIC::CIdentType(NLAISCRIPT::CSetValueMsgClass::IdSetValueMsgClass) );
00163
00164 CAgentScript::ParamSetValueMsg = new NLAISCRIPT::CParam(1,ParamIdSetValueMsg);
00165
00167 CAgentScript::ParamIdInitComponentMsg = new NLAISCRIPT::COperandSimpleListOr(2,
00168 new NLAIC::CIdentType(idMsgInitComponentType),
00169 new NLAIC::CIdentType(idMsgInitComponentType) );
00170
00171 CAgentScript::ParamInitComponentMsg = new NLAISCRIPT::CParam(1,ParamIdInitComponentMsg);
00173
00174 StaticMethod = new CAgentScript::CMethodCall *[CAgentScript::TLastM];
00175
00176 StaticMethod[CAgentScript::TRunAskParentNotify] = new CAgentScript::CMethodCall( _RUNASK_,
00177 CAgentScript::TRunAskParentNotify, ParamRunParentNotify,
00178 CAgentScript::CheckAll,
00179 1,
00180 new NLAISCRIPT::CObjectUnknown(IdMsgNotifyParentClass));
00181
00182 IdMsgNotifyParentClass->incRef();
00183 ParamRunParentNotify->incRef();
00184 StaticMethod[CAgentScript::TRunTellParentNotify] = new CAgentScript::CMethodCall( _RUNTEL_,
00185 CAgentScript::TRunTellParentNotify, ParamRunParentNotify,
00186 CAgentScript::CheckAll,
00187 1,
00188 new NLAISCRIPT::CObjectUnknown(IdMsgNotifyParentClass));
00189
00190 idMsgTellComponent->incRef();
00191 StaticMethod[CAgentScript::TRunTellComponent] = new CAgentScript::CMethodCall( _RUNTEL_,
00192 CAgentScript::TRunTellComponent, ParamTellComponentMsg,
00193 CAgentScript::CheckAll,
00194 1,
00195 new NLAISCRIPT::CObjectUnknown(idMsgTellComponent));
00196
00197 ParamTellComponentMsg->incRef();
00198 idMsgTellComponent->incRef();
00199 StaticMethod[CAgentScript::TRunAskComponent] = new CAgentScript::CMethodCall( _RUNASK_,
00200 CAgentScript::TRunAskComponent, ParamTellComponentMsg,
00201 CAgentScript::CheckAll,
00202 1,
00203 new NLAISCRIPT::CObjectUnknown(idMsgTellComponent));
00204
00205 StaticMethod[CAgentScript::TSend] = new CAgentScript::CMethodCall( _SEND_,
00206 CAgentScript::TSend, SendParamMessageScript,
00207 CAgentScript::CheckAll,
00208 2,
00209 new NLAISCRIPT::CObjectUnknown(new NLAISCRIPT::COperandVoid));
00210
00211 StaticMethod[CAgentScript::TSendComponent] = new CAgentScript::CMethodCall( _SEND_,
00212 CAgentScript::TSendComponent,
00213 SendCompParamMessageScript,CAgentScript::CheckAll,
00214 3,
00215 new NLAISCRIPT::CObjectUnknown(new NLAISCRIPT::COperandVoid));
00216
00217 StaticMethod[CAgentScript::TGetChildTag] = new CAgentScript::CMethodCall( _GETCHILD_,
00218 CAgentScript::TGetChildTag,
00219 NULL,
00220 CAgentScript::CheckCount,
00221 1,
00222 new NLAISCRIPT::CObjectUnknown(new
00223 NLAISCRIPT::COperandSimple(
00224 new NLAIC::CIdentType(CVectorGroupManager::IdVectorGroupManager))));
00225
00226 StaticMethod[CAgentScript::TAddChildTag] = new CAgentScript::CMethodCall( _ADDCHILD_,
00227 CAgentScript::TAddChildTag,
00228 NULL,CAgentScript::DoNotCheck,
00229 2,
00230 new NLAISCRIPT::CObjectUnknown(
00231 new NLAISCRIPT::COperandSimple(
00232 new NLAIC::CIdentType(DigitalType::IdDigitalType))));
00233
00234 StaticMethod[CAgentScript::TFather] = new CAgentScript::CMethodCall( _FATHER_,
00235 CAgentScript::TFather,
00236 NULL,CAgentScript::CheckCount,
00237 0,
00238 new NLAISCRIPT::CObjectUnknown(
00239 new NLAISCRIPT::COperandSimple(
00240
00241 new NLAIC::CIdentType(*IAgent::IdAgent))));
00242
00243
00244 StaticMethod[CAgentScript::TSelf] = new CAgentScript::CMethodCall( _SELF_,
00245 CAgentScript::TSelf,
00246 NULL,CAgentScript::CheckCount,
00247 0,
00248 new NLAISCRIPT::CObjectUnknown( new NLAISCRIPT::COperandSimple(
00249 new NLAIC::CIdentType(CAgentScript::IdAgentScript))));
00250
00251 StaticMethod[CAgentScript::TGetName] = new CAgentScript::CMethodCall( _GETNAME_,
00252 CAgentScript::TGetName,
00253 NULL,CAgentScript::CheckCount,
00254 0,
00255 new NLAISCRIPT::CObjectUnknown(
00256 new NLAISCRIPT::COperandSimple(
00257 new NLAIC::CIdentType(CStringType::IdStringType))));
00258
00259 StaticMethod[CAgentScript::TGetClassName] = new CAgentScript::CMethodCall( "GetClassName",
00260 CAgentScript::TGetClassName,
00261 NULL,CAgentScript::CheckCount,
00262 0,
00263 new NLAISCRIPT::CObjectUnknown(
00264 new NLAISCRIPT::COperandSimple(
00265 new NLAIC::CIdentType(CStringType::IdStringType))));
00266
00267 StaticMethod[CAgentScript::TIsInherited] = new CAgentScript::CMethodCall( "IsInherited",
00268 CAgentScript::TIsInherited,
00269 NULL,CAgentScript::CheckCount,
00270 1,
00271 new NLAISCRIPT::CObjectUnknown(
00272 new NLAISCRIPT::COperandSimple(
00273 new NLAIC::CIdentType(NLAILOGIC::CBoolType::IdBoolType))));
00274
00275 StaticMethod[CAgentScript::TRemoveChild] = new CAgentScript::CMethodCall( _REMOVECHILD_,
00276 CAgentScript::TRemoveChild,
00277 NULL,CAgentScript::CheckCount,
00278 0,
00279 new NLAISCRIPT::CObjectUnknown(
00280 new NLAISCRIPT::COperandSimple(
00281 new NLAIC::CIdentType(DigitalType::IdDigitalType))));
00282
00283 StaticMethod[CAgentScript::TSetStatic] = new CAgentScript::CMethodCall( _SETSTATIC_,
00284 CAgentScript::TSetStatic, NULL,
00285 CAgentScript::CheckCount,
00286 2,
00287 new NLAISCRIPT::CObjectUnknown(new NLAISCRIPT::COperandVoid)) ;
00288
00289
00290 StaticMethod[CAgentScript::TGetValue] = new CAgentScript::CMethodCall( _RUNASK_,
00291 CAgentScript::TGetValue, ParamGetValueMsg,
00292 CAgentScript::CheckAll,
00293 1,
00294 new NLAISCRIPT::CObjectUnknown(new NLAISCRIPT::COperandVoid)) ;
00295
00296 StaticMethod[CAgentScript::TSetValue] = new CAgentScript::CMethodCall( _RUNTEL_,
00297 CAgentScript::TSetValue, ParamSetValueMsg,
00298 CAgentScript::CheckAll,
00299 1,
00300 new NLAISCRIPT::CObjectUnknown(new NLAISCRIPT::COperandVoid)) ;
00301
00302 ParamIdInitComponentMsg->incRef();
00303 StaticMethod[CAgentScript::TInitComponent] = new CAgentScript::CMethodCall( _RUNTEL_,
00304 CAgentScript::TInitComponent, ParamInitComponentMsg,
00305 CAgentScript::CheckAll,
00306 1,
00307 new NLAISCRIPT::CObjectUnknown(ParamIdInitComponentMsg)) ;
00308
00309 NLAISCRIPT::CParam *ParamString = new NLAISCRIPT::CParam(1,new NLAISCRIPT::COperandSimple(new NLAIC::CIdentType(CStringType::IdStringType)));
00310 StaticMethod[CAgentScript::TIsEUU] = new CAgentScript::CMethodCall( _ISA_,
00311 CAgentScript::TIsEUU,
00312 ParamString,CAgentScript::CheckAll,
00313 0, new NLAISCRIPT::CObjectUnknown( new NLAISCRIPT::COperandSimple(
00314 new NLAIC::CIdentType(NLAIAGENT::UInt32Type::IdUInt32Type))));
00315 ParamString->incRef();
00316 StaticMethod[CAgentScript::TAddSet] = new CAgentScript::CMethodCall(_ADD_SET_,
00317 CAgentScript::TAddSet,
00318 ParamString,CAgentScript::CheckAll,
00319 0, new NLAISCRIPT::CObjectUnknown(new NLAISCRIPT::COperandVoid));
00320
00321
00322 StaticMethod[CAgentScript::TDeflautProccessMsg] = new CAgentScript::CMethodCall("DeflautProccessMsg",
00323 CAgentScript::TDeflautProccessMsg, NULL,
00324 CAgentScript::CheckCount,
00325 1,
00326 new NLAISCRIPT::CObjectUnknown(new NLAISCRIPT::COperandVoid));
00327
00328 }
00329
00330
00331 void CAgentScript::releaseAgentScript()
00332 {
00333
00334
00336
00337
00338
00339
00340
00342
00343
00344
00345 sint i;
00346 for(i = 0; i < CAgentScript::TLastM; i++)
00347 {
00348 delete StaticMethod[i];
00349 }
00350 delete StaticMethod;
00351 }
00352
00353 CAgentScript::CAgentScript(const CAgentScript &a): IAgentManager(a)
00354 {
00355 _iComponents = 0;
00356
00357 _AgentClass = a._AgentClass;
00358
00359
00360
00361
00362
00363 _NbComponents = a._NbComponents;
00364 if ( _NbComponents != 0 )
00365 {
00366 _Components = new IObjectIA *[ _NbComponents ];
00367
00368
00369 for ( int i = 0; i < _NbComponents; i++ )
00370 {
00371 _Components[i] = (IObjectIA *)a._Components[i]->clone();
00372
00373 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tAgent;
00374 const NLAIC::CTypeOfObject &t = (const NLAIC::CTypeOfObject &)_Components[i]->getType();
00375 if( (t.getValue() & b ) == b)
00376 {
00377 ((CAgentScript *)_Components[i])->setParent( (const IWordNumRef *) *this);
00378 }
00379 }
00380 }
00381 else
00382 _Components = NULL;
00383
00384 _AgentManager = a._AgentManager;
00385
00386 mapSet = a.mapSet;
00387
00388
00389
00390
00391
00392
00393
00394
00395 }
00396
00397 CAgentScript::CAgentScript(IAgentManager *manager) : IAgentManager( NULL ), _AgentClass( NULL )
00398 {
00399 _iComponents = 0;
00400 _Components = NULL;
00401 _NbComponents = 0;
00402 _AgentManager = manager;
00403 }
00404
00405 CAgentScript::CAgentScript(IAgentManager *manager, IBasicAgent *father,
00406 std::list<IObjectIA *> &components,
00407 NLAISCRIPT::CAgentClass *agent_class )
00408
00409 : IAgentManager(father), _AgentClass( agent_class )
00410 {
00411
00412
00413
00414 _iComponents = 0;
00415
00416 _AgentManager = manager;
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449 createComponents( components );
00450 }
00451
00452 CAgentScript::~CAgentScript()
00453 {
00454 Kill();
00455
00456
00457
00458
00459 if(_Components != NULL)
00460 {
00461 for ( int i = 0; i < _NbComponents; i++ )
00462 {
00463 #ifdef NL_DEBUG
00464 const IObjectIA *o = _Components[i];
00465 #endif
00466 _Components[i]->release();
00467 }
00468 delete[] _Components;
00469 }
00470 }
00471
00472 void CAgentScript::setAgentManager(IAgentManager *manager)
00473 {
00474
00475 _AgentManager = manager;
00476 for ( int i = 0; i < _NbComponents; i++ )
00477 {
00478
00479 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tAgent;
00480 const NLAIC::CTypeOfObject &t = (const NLAIC::CTypeOfObject &)_Components[i]->getType();
00481 if( (t.getValue() & b ) == b)
00482 {
00483 ((CAgentScript *)_Components[i])->setAgentManager(_AgentManager);
00484 }
00485 }
00486 }
00487
00488 sint32 CAgentScript::getChildMessageIndex(const IMessageBase *msg, sint32 child_index )
00489 {
00490 return _AgentClass->getChildMessageIndex( msg, child_index );
00491 }
00492
00493 bool CAgentScript::setStaticMember(sint32 index,IObjectIA *op)
00494 {
00495 #ifdef NL_DEBUG
00496 if ( index >= _NbComponents )
00497 {
00498 throw NLAIE::CExceptionIndexError();
00499 }
00500 #endif
00501 IObjectIA *old_comp = _Components[ index ];
00502 _Components[ index ] = op;
00503
00504 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tAgent;
00505 const NLAIC::CTypeOfObject &t = op->getType();
00506 if((t.getValue() & b) == b)
00507 {
00508 ((CAgentScript *)op)->setParent( (const IWordNumRef *) *this);
00509 }
00510 if(op != old_comp)
00511 {
00512 old_comp->release();
00513 return false;
00514 }
00515 return true;
00516 }
00517
00518 sint32 CAgentScript::getStaticMemberSize() const
00519 {
00520 return _NbComponents;
00521 }
00522
00523 const IObjectIA *CAgentScript::getStaticMember(sint32 index) const
00524 {
00525 #ifdef NL_DEBUG
00526 if ( index >= _NbComponents )
00527 {
00528 throw NLAIE::CExceptionIndexError();
00529 }
00530 #endif
00531 return _Components[ index ];
00532 }
00533
00534 NLAISCRIPT::IOpCode *CAgentScript::getMethode(sint32 inheritance,sint32 index)
00535 {
00536 #ifdef NL_DEBUG
00537 if ( index >= _AgentClass->getMethodIndexSize())
00538 {
00539 throw NLAIE::CExceptionIndexError();
00540 }
00541
00542 if ( inheritance >= _AgentClass->sizeVTable())
00543 {
00544 throw NLAIE::CExceptionIndexError();
00545 }
00546 #endif
00547 return (NLAISCRIPT::IOpCode *)_AgentClass->getBrancheCode(inheritance,index).getCode();
00548 }
00549
00550 NLAISCRIPT::IOpCode *CAgentScript::getMethode(sint32 index)
00551 {
00552 if ( _AgentClass != NULL )
00553 {
00554 #ifdef NL_DEBUG
00555 const char *dbg_class_name = (const char *) getType();
00556 const char *dbg_base_class_name = (const char *) _AgentClass->getType();
00557
00558 if ( index >= _AgentClass->getMethodIndexSize())
00559 {
00560 throw NLAIE::CExceptionIndexError();
00561 }
00562 #endif
00563 return (NLAISCRIPT::IOpCode *)_AgentClass->getBrancheCode(index).getCode();
00564 }
00565 else
00566 return NULL;
00567 }
00568
00569 void CAgentScript::save(NLMISC::IStream &os)
00570 {
00571 IBasicAgent::save(os);
00572 sint32 size = _NbComponents;
00573 os.serial( size );
00574 for ( int i = 0; i < _NbComponents; i++ )
00575 {
00576 os.serial( (NLAIC::CIdentType &) _Components[i]->getType() );
00577 _Components[i]->save(os);
00578 }
00579 }
00580
00581 void CAgentScript::load(NLMISC::IStream &is)
00582 {
00583 IBasicAgent::load(is);
00584
00585
00586 sint32 size;
00587 is.serial( size );
00588 _NbComponents = size;
00589
00590 if(_Components)
00591 {
00592 for ( int i = 0; i < _NbComponents; i++ )
00593 _Components[i]->release();
00594 delete[] _Components;
00595 }
00596 _Components = new IObjectIA *[ _NbComponents ];
00597
00598 for ( int i = 0; i < _NbComponents; i++ )
00599 {
00600 NLAIC::CIdentTypeAlloc id;
00601 is.serial( id );
00602 IObjectIA *tmp_c = (IObjectIA *)id.allocClass();
00603 tmp_c->load(is);
00604 _Components[i] = tmp_c;
00605 }
00606 }
00607
00608 sint32 CAgentScript::getMethodIndexSize() const
00609 {
00610
00611
00612
00613
00614
00615 {
00616 return IAgent::getMethodIndexSize() + TLastM;
00617 }
00618 }
00619
00620 const NLAIC::IBasicType *CAgentScript::clone() const
00621 {
00622 CAgentScript *result = new CAgentScript(*this);
00623 return result;
00624 }
00625
00626 const NLAIC::IBasicType *CAgentScript::newInstance() const
00627 {
00628 CAgentScript *instance;
00629 if ( _AgentClass )
00630 {
00631 instance = (CAgentScript *) _AgentClass->buildNewInstance();
00632 }
00633 else
00634 {
00635 instance = new CAgentScript(NULL);
00636 }
00637 return instance;
00638 }
00639
00640 void CAgentScript::getDebugString(std::string &t) const
00641 {
00642
00643 if( _AgentManager != NULL)
00644 {
00645 const NLAISCRIPT::CParam p;
00646 static CStringVarName debugStringF("GetDebugString");
00647
00648 tQueue r = isMember(NULL,&debugStringF,p);
00649 if(r.size())
00650 {
00651 NLAISCRIPT::CCodeContext *c = (NLAISCRIPT::CCodeContext *)_AgentManager->getAgentContext()->clone();
00652 NLAIAGENT::CIdMethod m = r.top();
00653
00654 c->Self = this;
00655
00656 IBaseGroupType *param = new CGroupType();
00657 (*c).Stack ++;
00658 (*c).Stack[(int)(*c).Stack] = param;
00659 NLAISCRIPT::IMethodContext *methodContex = new NLAISCRIPT::CMethodContext();
00660 NLAISCRIPT::CCallMethod opCall(methodContex,0,m.Index);
00661 opCall.runOpCode(*c);
00662 const NLAIAGENT::CStringType *returnMsg = (const NLAIAGENT::CStringType *)c->Stack[(int)(*c).Stack];
00663 t += returnMsg->getStr().getString();
00664 (*c).Stack--;
00665 c->release();
00666 return;
00667 }
00668 }
00669
00670 t += NLAIC::stringGetBuild("class type <%s> ",(const char *)getType());
00671 if ( _AgentClass )
00672 t += NLAIC::stringGetBuild("<%s> (scripted) -StaticComponents:\n",(const char *)_AgentClass->getType());
00673 else
00674 t += "<undefined_class> (scripted) -StaticComponents:\n";
00675 for (int i = 0; i < _NbComponents; i++ )
00676 {
00677 std::string buf;
00678 t += "\t\t";
00679 if ( _AgentClass->getComponentName(i) )
00680 {
00681 t += _AgentClass->getComponentName(i);
00682 }
00683 else
00684 t += "<unnamed>";
00685
00686 t += "\t\t";
00687 _Components[i]->getDebugString(buf);
00688 t += "[ ";
00689 t += buf;
00690 t += " ]";
00691 if(i != (_NbComponents-1)) t += "\n";
00692 }
00693
00694 }
00695
00696 bool CAgentScript::isEqual(const IBasicObjectIA &a) const
00697 {
00698 return false;
00699 }
00700
00701 void CAgentScript::onKill(IConnectIA *a)
00702 {
00703 tsetDefNameAgent::iterator iter = _DynamicAgentName.begin();
00704 while( iter != _DynamicAgentName.end() )
00705 {
00706 if((*(*iter).Itr) == a)
00707 {
00708 _DynamicAgentName.erase(iter);
00709 break;
00710 }
00711 iter++;
00712 }
00713 IAgent::onKill(a);
00714 }
00715
00717 bool CAgentScript::isa(const std::string &s) const
00718 {
00719 std::set<std::string>::iterator it = mapSet.find(s);
00720 if(it != mapSet.end()) return true;
00721 else
00722 if(isClassInheritedFrom(CStringVarName(s.c_str())) >= 0)
00723 return true;
00724 else
00725 if(s == (const char *) getType())
00726 return true;
00727
00728 return false;
00729 }
00730
00732 void CAgentScript::addSet(const std::string &s)
00733 {
00734 mapSet.insert(s);
00735 }
00736
00737 IObjectIA::CProcessResult CAgentScript::addDynamicAgent(IBaseGroupType *g)
00738 {
00739 CIteratorContener i = g->getIterator();
00740 CStringType &s = (CStringType &)*i++;
00741 IBasicAgent *a = (IBasicAgent *)i++;
00742 IBasicAgent *o = a;
00743 sint n = 1;
00744
00745 #ifdef NL_DEBUG
00746 std::string name;
00747 const char *type;
00748 s.getDebugString(name);
00749
00750 type = (const char *)a->getType();
00751 const char *tname = name.c_str();
00752 #endif
00753 if(!i.isInEnd())
00754 {
00755 n = (sint)((NLAIAGENT::INombreDefine *)i++)->getNumber();
00756 }
00757
00758 IObjectIA::CProcessResult r;
00759 r.ResultState = IObjectIA::ProcessIdle;
00760
00761 while(n --)
00762 {
00763 o->setParent( (const IWordNumRef *) *this );
00764 CNotifyParentScript *m = new CNotifyParentScript(this);
00765
00766 m->setSender(this);
00767 m->setPerformatif(IMessageBase::PTell);
00768 ((IObjectIA *)o)->sendMessage(m);
00769
00770 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tAgent;
00771 const NLAIC::CTypeOfObject &t = o->getType();
00772
00773 if((t.getValue() & b) == b)
00774 {
00775 ((CAgentScript *)o)->setAgentManager(this);
00776 }
00777
00778 _DynamicAgentName.insert(CKeyAgent(s,addChild(o)));
00779 if(n) o = (IBasicAgent *)a->clone();
00780 }
00781
00782 r.Result = NULL;
00783
00784 return r;
00785 }
00786
00787 IObjectIA::CProcessResult CAgentScript::addDynamicAgent(CStringType &name, IBasicAgent *agent)
00788 {
00789 #ifdef NL_DEBUG
00790 std::string dbg_name;
00791 const char *type;
00792 name.getDebugString( dbg_name );
00793 type = (const char *)agent->getType();
00794 const char *tname = dbg_name.c_str();
00795 #endif
00796 IObjectIA::CProcessResult r;
00797 r.ResultState = IObjectIA::ProcessIdle;
00798
00799 agent->setParent( (const IWordNumRef *) *this );
00800 CNotifyParentScript *m = new CNotifyParentScript(this);
00801 m->setSender(this);
00802 m->setPerformatif(IMessageBase::PTell);
00803 ((IObjectIA *) agent )->sendMessage(m);
00804 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tAgent;
00805 const NLAIC::CTypeOfObject &t = agent->getType();
00806 if((t.getValue() & b) == b)
00807 {
00808 ((CAgentScript *) agent )->setAgentManager(this);
00809 }
00810 _DynamicAgentName.insert(CKeyAgent(name,addChild( agent )));
00811
00812 r.Result = NULL;
00813 return r;
00814 }
00815
00816 IObjectIA::CProcessResult CAgentScript::removeDynamic(NLAIAGENT::IBaseGroupType *g)
00817 {
00818 CStringType *s = (CStringType *)g->getFront();
00819 IObjectIA::CProcessResult r;
00820 r.ResultState = IObjectIA::ProcessIdle;
00821 std::pair<tsetDefNameAgent::iterator,tsetDefNameAgent::iterator> p = _DynamicAgentName.equal_range(CKeyAgent(*s));
00822
00823 if(p.first != p.second)
00824 {
00825 while(p.first != p.second)
00826 {
00827 tsetDefNameAgent::iterator iTmp = p.first;
00828 p.first ++;
00829
00830 NLAIAGENT::IBasicAgent *o = *iTmp->Itr;
00831 _DynamicAgentName.erase(iTmp);
00832 removeChild(o);
00833 }
00834 r.Result = new DigitalType(1.0);
00835 return r;
00836 }
00837 r.Result = &DigitalType::NullOperator;
00838 r.Result->incRef();
00839 return r;
00840 }
00841
00842
00843 void CAgentScript::removeDynamic(NLAIAGENT::IBasicAgent *ag)
00844 {
00845
00846 tsetDefNameAgent::iterator p = _DynamicAgentName.begin();
00847
00848 while(p != _DynamicAgentName.end())
00849 {
00850 if((*(*p).Itr) == ag)
00851 {
00852 _DynamicAgentName.erase(p);
00853 removeChild(ag);
00854 break;
00855 }
00856 p ++;
00857 }
00858 }
00859
00860 IObjectIA::CProcessResult CAgentScript::getDynamicAgent(IBaseGroupType *g)
00861 {
00862 CStringType *s = (CStringType *)g->get();
00863 IObjectIA::CProcessResult r;
00864 r.ResultState = IObjectIA::ProcessIdle;
00865 std::pair<tsetDefNameAgent::iterator,tsetDefNameAgent::iterator> p = _DynamicAgentName.equal_range(CKeyAgent(*s));
00866
00867 if(p.first != p.second)
00868 {
00869 sint size = _DynamicAgentName.count(CKeyAgent(*s));
00870 sint n = 0;
00871 CVectorGroupManager *x;
00872 x = new CVectorGroupManager(size);
00873 while(p.first != p.second)
00874 {
00875 (*p.first->Itr)->incRef();
00876 x->set(n++, *p.first->Itr);
00877 p.first++;
00878 }
00879
00880 r.Result = x;
00881 return r;
00882
00883 }
00884 r.Result = new CVectorGroupManager();
00885 return r;
00886 }
00887
00888 IObjectIA::CProcessResult CAgentScript::runAskParentNotify(IBaseGroupType *g)
00889 {
00890 CNotifyParentScript *m = new CNotifyParentScript((IBasicAgent *)getParent());
00891 m->setPerformatif(IMessageBase::PTell);
00892
00893 m->setSender(this);
00894 IObjectIA::CProcessResult r;
00895 r.Result = m;
00896 return r;
00897 }
00898
00899 IObjectIA::CProcessResult CAgentScript::runTellParentNotify(IBaseGroupType *g)
00900 {
00901 sint i;
00902
00903 #ifdef NL_DEBUG
00904 const char *text = (const char *)getType();
00905 const char *textP = (const char *)getParent()->getType();
00906 #endif
00907 CNotifyParentScript *m = new CNotifyParentScript(this);
00908 m->setPerformatif(IMessageBase::PTell);
00909 m->setSender(this);
00910
00911 for(i = 0; i < _NbComponents; i++)
00912 {
00913 if(_Components[i] != NULL)
00914 {
00915 CNotifyParentScript *msg = (CNotifyParentScript *)m->clone();
00916 try
00917 {
00918 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tAgent;
00919 const NLAIC::CTypeOfObject &t = _Components[i]->getType();
00920
00921 if((t.getValue() & b) == b)
00922 _Components[i]->sendMessage(msg);
00923 }
00924 catch(NLAIE::IException &)
00925 {
00926 msg->release();
00927 }
00928 }
00929 }
00930 IObjectIA::CProcessResult r;
00931 r.Result = m;
00932 return r;
00933 }
00934
00935 IObjectIA::CProcessResult CAgentScript::runTellComponent(IBaseGroupType *g)
00936 {
00937 NLAIAGENT::IMessageBase &mOriginal = (NLAIAGENT::IMessageBase &)*g->get();
00938 CStringType *c = (CStringType *)mOriginal[(sint32)0];
00939 NLAIAGENT::IMessageBase *m = (NLAIAGENT::IMessageBase *)mOriginal[(sint32)1];
00940 m->incRef();
00941 m->setSender((IObjectIA *)mOriginal.getSender());
00942 m->setPerformatif(mOriginal.getPerformatif());
00943 sendMessage(c->getStr(), (IObjectIA *)m);
00944
00945 IObjectIA::CProcessResult r;
00946
00947 m->incRef();
00948 r.Result = m;
00949 return r;
00950 }
00951
00952 IObjectIA::CProcessResult CAgentScript::runAskGetValue(IBaseGroupType *g)
00953 {
00954 NLAIAGENT::IMessageBase &msg_result = (NLAIAGENT::IMessageBase &)*g->get();
00955 msg_result.incRef();
00956
00957 CStringType *comp_name = (CStringType *)msg_result[(sint32)0];
00958
00959 msg_result.setPerformatif(IMessageBase::PTell);
00960 msg_result.setMethodIndex(-1,-1);
00961 msg_result.setContinuation( (IObjectIA *) msg_result.getSender() );
00962
00963 sint32 index = _AgentClass->getInheritedStaticMemberIndex( comp_name->getStr() );
00964 if ( index != -1 )
00965 {
00966 msg_result.set( 1, _Components[ index ] );
00967 }
00968 else
00969 {
00970
00971 }
00972
00973 IObjectIA::CProcessResult r;
00974 r.Result = &msg_result;
00975 return r;
00976 }
00977
00978 IObjectIA::CProcessResult CAgentScript::runTellSetValue(IBaseGroupType *g)
00979 {
00980 NLAIAGENT::IMessageBase &msg_result = (NLAIAGENT::IMessageBase &)*g->get();
00981 msg_result.incRef();
00982
00983 while ( msg_result.size() )
00984 {
00985 CStringType *comp_name = (CStringType *) msg_result[ (sint32) 0 ];
00986 IObjectIA *comp_val = (IObjectIA *) msg_result[ (sint32) 1 ];
00987
00988 sint32 index = getStaticMemberIndex( comp_name->getStr() );
00989 if ( index != -1 )
00990 {
00991
00992 setStaticMember( index, comp_val );
00993 }
00994 else
00995 {
00996
00997
00998 }
00999 }
01000 IObjectIA::CProcessResult r;
01001 msg_result.incRef();
01002 r.Result = &msg_result;
01003 return r;
01004 }
01005
01006 IObjectIA::CProcessResult CAgentScript::runInitComponent(IBaseGroupType *g)
01007 {
01008 NLAIAGENT::IMessageBase &msg_result = (NLAIAGENT::IMessageBase &)*g->get();
01009 msg_result.incRef();
01010
01011
01012
01013 if ( _Components != NULL )
01014 {
01015 for ( int i = 0; i < _NbComponents; i++ )
01016 _Components[i]->release();
01017 }
01018
01019
01020 _NbComponents = (sint32) msg_result.size() / 3;
01021 _Components = new IObjectIA *[ _NbComponents ];
01022
01023 int test = 0;
01024
01025 for ( int i = 0; i < msg_result.size() ; i += 3 )
01026 {
01027 CStringType *comp_name = (CStringType *) msg_result[ (sint32) i ];
01028 IObjectIA *comp_val = (IObjectIA *) msg_result[ (sint32) (i + 2) ];
01029
01030 sint32 index = getStaticMemberIndex( comp_name->getStr() );
01031 if ( index != -1 )
01032 {
01033
01034 setStaticMember( index, comp_val );
01035 }
01036 else
01037 {
01038 setStaticMember( (sint32) (i / 3) , comp_val );
01039 }
01040 test++;
01041 }
01042
01043 IObjectIA::CProcessResult r;
01044 msg_result.incRef();
01045 r.Result = &msg_result;
01046 return r;
01047 }
01048
01049 IObjectIA::CProcessResult CAgentScript::runInitClass(IBaseGroupType *g)
01050 {
01051 const char * class_name = ((NLAIAGENT::CStringVarName *)g->get())->getString();
01052 NLAIC::CIdentType id_class( class_name );
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093 IObjectIA::CProcessResult r;
01094 r.Result = NULL;
01095 return r;
01096 }
01097
01098
01099
01100
01101 IObjectIA::CProcessResult CAgentScript::getDynamicName(NLAIAGENT::IBaseGroupType *g)
01102 {
01103
01104 IObjectIA::CProcessResult r;
01105 const IObjectIA *o = ((CLocalAgentMail *)g->get())->getHost();
01106 tsetDefNameAgent::iterator i = _DynamicAgentName.begin();
01107
01108 while(i != _DynamicAgentName.end())
01109 {
01110 CKeyAgent key = *i;
01111 if( o == *key.Itr )
01112 {
01113 CStringType *s = new CStringType(key.Name);
01114 r.Result = s;
01115 return r;
01116 }
01117 i ++;
01118 }
01119 r.Result = new CStringType(CStringVarName("Unknown"));
01120 return r;
01121 }
01122
01123 IObjectIA::CProcessResult CAgentScript::sendMethod(IObjectIA *param)
01124 {
01125 INombreDefine *p = (INombreDefine *)((IBaseGroupType *)param)->popFront();
01126 IMessageBase *msg = (IMessageBase *)((IBaseGroupType *)param)->popFront();
01127 msg->setPerformatif((IMessageBase::TPerformatif)(sint)p->getNumber());
01128 p->release();
01129 return sendMessage(msg);
01130 }
01131
01132 IObjectIA::CProcessResult CAgentScript::sendMethodCompoment(IObjectIA *param)
01133 {
01134 NLAIAGENT::CIteratorContener It = ((IBaseGroupType *)param)->getIterator();
01135 const CStringType *n = (const CStringType *)It++;
01136 INombreDefine *p = (INombreDefine *)((IBaseGroupType *)It++);
01137 IMessageBase *msg = (IMessageBase *)((IBaseGroupType *)It++);
01138 msg->setPerformatif((IMessageBase::TPerformatif)(sint)p->getNumber());
01139 msg->incRef();
01140 return sendMessage(n->getStr(),msg);
01141 }
01142
01143 IObjectIA::CProcessResult CAgentScript::sendBroadCast(IObjectIA *m)
01144 {
01145 tsetDefNameAgent::iterator i = _DynamicAgentName.begin();
01146
01147 if(i != _DynamicAgentName.end())
01148 {
01149 ((IObjectIA *)(*(*(i)).Itr))->sendMessage(m);
01150 i ++;
01151
01152 while(i != _DynamicAgentName.end())
01153 {
01154 m->incRef();
01155 IObjectIA *o = ((IObjectIA *)(*(*(i)).Itr));
01156 o->sendMessage(m);
01157 i++;
01158 }
01159 }
01160
01161 return IObjectIA::CProcessResult();
01162 }
01163
01164 IObjectIA::CProcessResult CAgentScript::sendMessageToDynmaicChild(const IVarName &compName,IObjectIA *msg)
01165 {
01166
01167 std::pair<tsetDefNameAgent::iterator,tsetDefNameAgent::iterator> p = _DynamicAgentName.equal_range(CKeyAgent(CStringType(compName)));
01168
01169 #ifdef NL_DEBUG
01170 const char *txt = (const char *)msg->getType();
01171 std::string txtName;
01172 compName.getDebugString(txtName);
01173 #endif
01174
01175 IObjectIA::CProcessResult r;
01176
01177 if(p.first != p.second)
01178 {
01179 while(p.first != p.second)
01180 {
01181 CAgentScript *o = (CAgentScript *)*((*(p.first)).Itr);
01182 o->sendMessage(msg);
01183 p.first ++;
01184 if(p.first != p.second) msg = (IObjectIA *)msg->clone();
01185 }
01186 }
01187 else
01188 {
01189 r.ResultState = processError;
01190 r.Result = NULL;
01191 }
01192
01193 return r;
01194 }
01195
01196 IObjectIA::CProcessResult CAgentScript::sendMessage(const IVarName &compName,IObjectIA *msg)
01197 {
01198 #ifdef NL_DEBUG
01199 const char *txt = (const char *)msg->getType();
01200 const char *compNameDb = (const char *)compName.getString();
01201
01202 #endif
01203 if(_AgentClass != NULL)
01204 {
01205 int i = getStaticMemberIndex(compName);
01206 if(i >= 0)
01207 {
01208 IObjectIA *comp = (IObjectIA *)getStaticMember(i);
01209 if(comp != NULL)
01210 {
01211 comp->sendMessage(msg);
01212 }
01213 else
01214 {
01215 if(sendMessageToDynmaicChild(compName,msg).ResultState == processError) msg->release();
01216 }
01217 }
01218 else
01219 {
01220 if(sendMessageToDynmaicChild(compName,msg).ResultState == processError) msg->release();
01221 }
01222 }
01223 else
01224 {
01225 if(sendMessageToDynmaicChild(compName,msg).ResultState == processError) msg->release();
01226 }
01227 return IObjectIA::CProcessResult();
01228 }
01229
01230 IObjectIA::CProcessResult CAgentScript::sendMessage(IObjectIA *m)
01231 {
01232 #ifdef NL_DEBUG
01233 const char *txt = (const char *)m->getType();
01234 const char *classBase = (const char *)getType();
01235
01236 #endif
01237 IMessageBase *msg = (IMessageBase *)m;
01238
01239 msg->setReceiver(this);
01240 if(msg->getMethodIndex() < 0)
01241 {
01242 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tMessage;
01243 const NLAIC::CTypeOfObject &t = m->getType();
01244
01245 if((t.getValue() & b) == b)
01246 {
01247
01248
01249 static CStringVarName sRunTell("RunTell");
01250 static CStringVarName sRunAchieve("RunAchieve");
01251 static CStringVarName sRunAsk("RunAsk");
01252 static CStringVarName sRunExec("RunExec");
01253 static CStringVarName sRunBreak("RunBreak");
01254 static CStringVarName sRunKill("RunKill");
01255 static CStringVarName sRunError("RunError");
01256
01257 CStringVarName *runMsg = NULL;
01258
01259 switch(msg->getPerformatif())
01260 {
01261 case IMessageBase::PExec:
01262
01263 runMsg = &sRunExec;
01264 break;
01265 case IMessageBase::PAchieve:
01266
01267 runMsg = &sRunAchieve;
01268 break;
01269 case IMessageBase::PAsk:
01270
01271 runMsg = &sRunAsk;
01272 break;
01273 case IMessageBase::PTell:
01274
01275 runMsg = &sRunTell;
01276 break;
01277 case IMessageBase::PBreak:
01278 runMsg = &sRunBreak;
01279 break;
01280 case IMessageBase::PKill:
01281 runMsg = &sRunKill;
01282 break;
01283 case IMessageBase::PError:
01284 runMsg = &sRunError;
01285 break;
01286
01287 default:
01288 throw;
01289 break;
01290 }
01291
01292 CStringVarName &tmp_name = *runMsg;
01293
01294 NLAISCRIPT::COperandSimple *t = new NLAISCRIPT::COperandSimple(new NLAIC::CIdentType(m->getType()));
01295 NLAISCRIPT::CParam p(1,t);
01296
01297 tQueue r = isMember(NULL,&tmp_name,p);
01298 if(r.size())
01299 {
01300 NLAIAGENT::CIdMethod m = r.top();
01301 msg->setMethodIndex(0,m.Index);
01302 }
01303 }
01304 }
01305
01306 IObjectIA::CProcessResult r = IAgent::sendMessage(msg);
01307
01308
01309
01310 #ifdef PROFILE
01311 time = NLMISC::CTime::getPerformanceTime() - time;
01312
01313 {
01314 TimeSend += time;
01315 NbSend ++;
01316 }
01317 #endif
01318
01319 return r;
01320
01321 }
01322
01323 void CAgentScript::runChildren()
01324 {
01325 #ifdef NL_DEBUG
01326 const char *classBase = (const char *)getType();
01327 #endif
01328
01329 int i = _NbComponents;
01330
01331 IObjectIA **com = _Components;
01332
01333 while(i --)
01334 (*com ++)->run();
01335
01336
01337 IAgent::runChildren();
01338 }
01339
01340 bool CAgentScript::runChildrenStepByStep()
01341 {
01342 if(_iComponents == _NbComponents)
01343 {
01344 if(IAgent::runChildrenStepByStep())
01345 {
01346 _iComponents = 0;
01347 return true;
01348 }
01349 else return false;
01350 }
01351
01352 IObjectIA *o = _Components[_iComponents ++];
01353 o->run();
01354
01355 return false;
01356 }
01357
01358 void CAgentScript::processMessages(IMessageBase *msg,IObjectIA *c)
01359 {
01360 #ifdef NL_DEBUG
01361 const char *txt = (const char *)msg->getType();
01362 bool dbugB = false;
01363 #endif
01364 NLAISCRIPT::CCodeContext &context = (NLAISCRIPT::CCodeContext &)*c;
01365 IBaseGroupType *param = new CGroupType();
01366 msg->incRef();
01367 param->push(msg);
01368 context.Stack ++;
01369 context.Stack[(int)context.Stack] = param;
01370
01371 int indexM = msg->getMethodIndex() - getBaseMethodCount();
01372 if(indexM >= 0)
01373 {
01374 IObjectIA *code = getMethode(indexM);
01375 if(code == NULL)
01376 {
01377 getMail()->popMessage();
01378 return;
01379 }
01380 }
01381
01382 NLAISCRIPT::IMethodContext *methodContex;
01383
01384 if (context.ContextDebug.Active)
01385 {
01386
01387
01388 methodContex = new NLAISCRIPT::CMethodContextDebug();
01389 }
01390 else
01391 {
01392 methodContex = new NLAISCRIPT::CMethodContext();
01393 }
01394 const IObjectIA *self = context.Self;
01395 context.Self = this;
01396 NLAISCRIPT::CCallMethod opCall(methodContex,msg->getHeritanceIndex(),msg->getMethodIndex());
01397 opCall.runOpCode(context);
01398 context.Self = self;
01399 IMessageBase *returnMsg = (IMessageBase *)context.Stack[(int)context.Stack];
01400 returnMsg->incRef();
01401 context.Stack--;
01402 processContinuation(msg, returnMsg);
01403
01404 returnMsg->release();
01405 }
01406
01407 void CAgentScript::processContinuation(IMessageBase *msg, IMessageBase *returnMsg)
01408 {
01409 switch(msg->getPerformatif())
01410 {
01411 case IMessageBase::PExec:
01412 if(msg->getContinuation() != NULL)
01413 {
01414 IMessageBase *o = (IMessageBase *)returnMsg->clone();
01415 o->setMethodIndex(-1,-1);
01416
01417 o->setSender(this);
01418
01419 o->setReceiver((IObjectIA *)msg->getContinuation());
01420 ((IObjectIA *)msg->getContinuation())->sendMessage(o);
01421 }
01422 break;
01423 case IMessageBase::PAchieve:
01424 if(msg->getContinuation() != NULL)
01425 {
01426 IMessageBase *o = (IMessageBase *)returnMsg->clone();
01427 o->setMethodIndex(-1,-1);
01428
01429 o->setSender(this);
01430
01431 o->setReceiver((IObjectIA *)msg->getContinuation());
01432 ((IObjectIA *)msg->getContinuation())->sendMessage(o);
01433 }
01434 break;
01435 case IMessageBase::PAsk:
01436 {
01437 IMessageBase *o = (IMessageBase *)returnMsg->clone();
01438 o->setMethodIndex(-1,-1);
01439
01440 o->setSender(this);
01441 o->setPerformatif(IMessageBase::PTell);
01442
01443 o->setReceiver((IObjectIA *)returnMsg->getSender());
01444 ((IObjectIA *)msg->getSender())->sendMessage(o);
01445
01446
01447 if(msg->getContinuation() != NULL)
01448 {
01449 IMessageBase *o = (IMessageBase *)returnMsg->clone();
01450 o->setMethodIndex(-1,-1);
01451
01452 o->setSender(this);
01453
01454 o->setReceiver((IObjectIA *)msg->getContinuation());
01455 o->setPerformatif(IMessageBase::PTell);
01456 ((IObjectIA *)msg->getContinuation())->sendMessage(o);
01457 }
01458 }
01459 break;
01460 case IMessageBase::PTell:
01461 if(msg->getContinuation() != NULL)
01462 {
01463 IMessageBase *o = (IMessageBase *)returnMsg->clone();
01464 o->setMethodIndex(-1,-1);
01465
01466 o->setSender(this);
01467
01468 o->setReceiver((IObjectIA *)msg->getContinuation());
01469 ((IObjectIA *)msg->getContinuation())->sendMessage(o);
01470 }
01471 break;
01472 case IMessageBase::PBreak:
01473 if(msg->getContinuation() != NULL)
01474 {
01475 IMessageBase *o = (IMessageBase *)returnMsg->clone();
01476 o->setMethodIndex(-1,-1);
01477
01478 o->setSender(this);
01479
01480 o->setReceiver((IObjectIA *)msg->getContinuation());
01481 ((IObjectIA *)msg->getContinuation())->sendMessage(o);
01482 }
01483 break;
01484 case IMessageBase::PKill:
01485 if(msg->getContinuation() != NULL)
01486 {
01487 IMessageBase *o = (IMessageBase *)returnMsg->clone();
01488 o->setMethodIndex(-1,-1);
01489
01490 o->setSender(this);
01491
01492 o->setReceiver((IObjectIA *)msg->getContinuation());
01493 ((IObjectIA *)msg->getContinuation())->sendMessage(o);
01494 }
01495 break;
01496 default: break;
01497 }
01498 }
01499
01500 void CAgentScript::processMessages()
01501 {
01502 IObjectIA *c = NULL;
01503 if( _AgentManager != NULL)
01504 c = (IObjectIA *)_AgentManager->getAgentContext();
01505 else
01506 c = NULL;
01507
01508 IMailBox *mail = getMail();
01509
01510
01511
01512 sint n = mail->size();
01513
01514 while(n--)
01515 {
01516 IMessageBase &msg = (IMessageBase &)mail->getMessage();
01517 #ifdef NL_DEBUG
01518 const char *dbg_this = (const char *) getType();
01519 const char *dbg_msg = (const char *) msg.getType();
01520 #endif
01521
01522 if(msg.getMethodIndex() >= 0 && c != NULL)
01523 {
01524 sint indexM = msg.getMethodIndex() - IAgent::getMethodIndexSize();
01525 IObjectIA *o;
01526 if(indexM != CAgentScript::TDeflautProccessMsg) processMessages(&msg,c);
01527 else
01528 {
01529 o = IBasicAgent::run( msg );
01530 if(o != NULL) o->release();
01531 }
01532 if ( mail->size() != 0 )
01533 mail->popMessage();
01534 }
01535 else
01536 {
01537 try
01538 {
01539 IObjectIA *o = IBasicAgent::run( msg );
01540 if (o != NULL)
01541 o->release();
01542 mail->popMessage();
01543 }
01544 catch(NLAIE::CExceptionNotImplemented &e)
01545 {
01546 mail->popMessage();
01547 throw NLAIE::CExceptionNotImplemented(e.what());
01548 }
01549 }
01550 }
01551 }
01552
01553 IObjectIA::CProcessResult CAgentScript::runActivity()
01554 {
01555
01556 NLAISCRIPT::CCodeContext *context = (NLAISCRIPT::CCodeContext *)_AgentManager->getAgentContext();
01557 context->Self = this;
01558 if(_AgentClass->getRunMethod() >= 0) runMethodeMember(_AgentClass->getRunMethod(), context);
01559
01560 return ProcessRun;
01561 }
01562
01563 bool CAgentScript::haveActivity() const
01564 {
01565 return _AgentClass != NULL && (_AgentClass->getRunMethod() >= 0);
01566 }
01567
01568
01569 #ifdef PROFILE
01570 NLMISC::TTicks TimeRun = 0;
01571 NLMISC::TTicks NbRun = 0;
01572 #endif
01573
01574 const IObjectIA::CProcessResult &CAgentScript::run()
01575 {
01576
01577 #ifdef NL_DEBUG
01578 const char *dbg_class_name = (const char *) getType();
01579
01580 #endif
01581
01582 #ifdef PROFILE
01583 NLMISC::TTicks time = NLMISC::CTime::getPerformanceTime();
01584 #endif
01585
01586 const IObjectIA::CProcessResult &r = IAgentManager::run();
01587
01588 #ifdef PROFILE
01589 time = NLMISC::CTime::getPerformanceTime() - time;
01590
01591 {
01592 TimeRun = time;
01593 NbRun = 1;
01594 }
01595 #endif
01596
01597 return r;
01598
01599 }
01600
01601 const IObjectIA::CProcessResult &CAgentScript::runStep()
01602 {
01603
01604 #ifdef NL_DEBUG
01605 const char *dbg_class_name = (const char *) getType();
01606
01607 #endif
01608
01609 return IAgentManager::runStep();
01610
01611 }
01612
01613 void CAgentScript::addOperator(NLAILOGIC::IBaseOperator *op)
01614 {
01615
01616 }
01617
01618 void CAgentScript::remOperator(NLAILOGIC::IBaseOperator *op)
01619 {
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634 }
01635
01636 const NLAIC::CIdentType &CAgentScript::getType() const
01637 {
01638 if ( _AgentClass )
01639 return _AgentClass->getType();
01640 else
01641 return IdAgentScript;
01642 }
01643
01644 IObjectIA::CProcessResult CAgentScript::runMethodBase(int heritance, int index,IObjectIA *o)
01645 {
01646 switch(index - IAgent::getMethodIndexSize())
01647 {
01648 case TSend:
01649 {
01650 return sendMethod(o);
01651 }
01652
01653 case TSendComponent:
01654 {
01655 return sendMethodCompoment(o);
01656 }
01657
01658 case TGetChildTag:
01659 {
01660 return getDynamicAgent((IBaseGroupType *)o);
01661 }
01662
01663 case TAddChildTag:
01664 {
01665 return addDynamicAgent((IBaseGroupType *)o);
01666 }
01667
01668 case TFather:
01669 {
01670 IObjectIA::CProcessResult a;
01671 a.Result = (IObjectIA *)getParent();
01672 a.Result->incRef();
01673 return a;
01674 }
01675
01676 case TSelf:
01677 {
01678 IObjectIA::CProcessResult a;
01679 a.Result = new CLocalAgentMail(this);
01680 return a;
01681 }
01682
01683 case TGetName:
01684 {
01685 IObjectIA::CProcessResult r;
01686 const CAgentScript *p = (CAgentScript *)getParent();
01687 tsetDefNameAgent::iterator i = p->_DynamicAgentName.begin();
01688
01689 while(i != p->_DynamicAgentName.end())
01690 {
01691 CKeyAgent key = *i;
01692 if( this == *key.Itr )
01693 {
01694 CStringType *s = new CStringType(key.Name);
01695 r.Result = s;
01696 return r;
01697 }
01698 i ++;
01699 }
01700 r.Result = new CStringType(CStringVarName("Unknown"));
01701
01702 return r;
01703 }
01704
01705 case TGetClassName:
01706 {
01707 IObjectIA::CProcessResult r;
01708 if ( _AgentClass != NULL )
01709 {
01710 const NLAIAGENT::IVarName *classname = getClassName();
01711 r.Result = new CStringType( *classname );
01712 }
01713 else
01714 r.Result = new CStringType( CStringVarName("<unknown>"));
01715 return r;
01716 }
01717
01718 case TIsInherited:
01719 {
01720 IObjectIA::CProcessResult r;
01721 if ( _AgentClass != NULL )
01722 {
01723 CGroupType *param = (CGroupType *) o;
01724 CStringType *comp_name = (CStringType *)((IBaseGroupType *)param)->popFront();
01725 if ( isClassInheritedFrom( comp_name->getStr() ) != -1 )
01726 r.Result = new NLAILOGIC::CBoolType( true );
01727 else
01728 r.Result = new NLAILOGIC::CBoolType( false );
01729 }
01730 else
01731 r.Result = new NLAILOGIC::CBoolType( false );
01732
01733 return r;
01734 }
01735
01736 case TRemoveChild:
01737 {
01738 return removeDynamic((IBaseGroupType *)o);
01739 }
01740
01741 case TRunAskParentNotify:
01742 {
01743 return runAskParentNotify((IBaseGroupType *)o);
01744 }
01745
01746 case TRunTellParentNotify:
01747 {
01748 return runTellParentNotify((IBaseGroupType *)o);
01749 }
01750
01751 case TRunAskComponent:
01752 case TRunTellComponent:
01753 {
01754 return runTellComponent((IBaseGroupType *)o);
01755 }
01756
01757
01758 case TSetStatic:
01759 {
01760 CGroupType *param = (CGroupType *) o;
01761 CStringType *comp_name = (CStringType *)((IBaseGroupType *)param)->popFront();
01762 IObjectIA *value = (IObjectIA *)((IBaseGroupType *)param)->popFront();
01763 int index = _AgentClass->getComponentIndex( comp_name->getStr() );
01764 _AgentClass->updateStaticMember(index, value);
01765 return IObjectIA::CProcessResult();
01766 }
01767
01768 case TGetValue:
01769 {
01770 return runAskGetValue( (IBaseGroupType *) o );
01771 }
01772
01773 case TSetValue:
01774 {
01775 return runTellSetValue( (IBaseGroupType *) o );
01776 }
01777
01778 case TInitComponent:
01779 {
01780 return runInitComponent( (IBaseGroupType *) o );
01781 }
01782
01783
01784 default:
01785 return IAgent::runMethodeMember(index,o);
01786
01787 }
01788 }
01789
01790 IObjectIA::CProcessResult CAgentScript::runMethodBase(int index,IObjectIA *o)
01791 {
01792 switch(index - IAgent::getMethodIndexSize())
01793 {
01794 case TSend:
01795 {
01796 return sendMethod(o);
01797 }
01798
01799 case TSendComponent:
01800 {
01801 return sendMethodCompoment(o);
01802 }
01803
01804 case TGetChildTag:
01805 {
01806 return getDynamicAgent((IBaseGroupType *)o);
01807 }
01808
01809 case TAddChildTag:
01810 {
01811 return addDynamicAgent((IBaseGroupType *)o);
01812 }
01813 case TFather:
01814 {
01815 IObjectIA::CProcessResult a;
01816 a.Result = (IObjectIA *)getParent();
01817
01818 a.Result->incRef();
01819 return a;
01820 }
01821
01822 case TSelf:
01823 {
01824 IObjectIA::CProcessResult a;
01825 a.Result = new CLocalAgentMail(this);
01826 return a;
01827 }
01828 case TGetName:
01829 {
01830 IObjectIA::CProcessResult r;
01831 const CAgentScript *p = (CAgentScript *)getParent();
01832 tsetDefNameAgent::iterator i = p->_DynamicAgentName.begin();
01833
01834 while(i != p->_DynamicAgentName.end())
01835 {
01836 CKeyAgent key = *i;
01837 if( this == *key.Itr )
01838 {
01839 CStringType *s = new CStringType(key.Name);
01840 r.Result = s;
01841 return r;
01842 }
01843 i ++;
01844 }
01845 r.Result = new CStringType(CStringVarName("Unknown"));
01846 return r;
01847 }
01848
01849 case TGetClassName:
01850 {
01851 IObjectIA::CProcessResult r;
01852 const NLAIAGENT::IVarName *classname = getClassName();
01853 r.Result = new CStringType( *classname );
01854
01855 r.Result->incRef();
01856 return r;
01857 }
01858
01859 case TIsInherited:
01860 {
01861 IObjectIA::CProcessResult r;
01862 if ( _AgentClass != NULL )
01863 {
01864 CGroupType *param = (CGroupType *) o;
01865 CStringType *comp_name = (CStringType *)((IBaseGroupType *)param)->popFront();
01866 if ( isClassInheritedFrom( comp_name->getStr() ) != -1 )
01867 r.Result = new NLAILOGIC::CBoolType( true );
01868 else
01869 r.Result = new NLAILOGIC::CBoolType( false );
01870
01871 }
01872 else
01873 r.Result = new NLAILOGIC::CBoolType( false );
01874
01875 r.Result->incRef();
01876 return r;
01877 }
01878
01879 case TRunAskParentNotify:
01880 {
01881 return runAskParentNotify((IBaseGroupType *)o);
01882 }
01883
01884 case TRunTellParentNotify:
01885 {
01886 return runTellParentNotify((IBaseGroupType *)o);
01887 }
01888
01889 case TRunAskComponent:
01890 case TRunTellComponent:
01891 {
01892 return runTellComponent((IBaseGroupType *)o);
01893 }
01894 case TSetStatic:
01895 {
01896 CGroupType *param = (CGroupType *) o;
01897 CStringType *comp_name = (CStringType *)((IBaseGroupType *)param)->popFront();
01898 IObjectIA *value = (IObjectIA *)((IBaseGroupType *)param)->popFront();
01899 int index = _AgentClass->getInheritedStaticMemberIndex( comp_name->getStr() );
01900 _AgentClass->updateStaticMember(index, value);
01901 IObjectIA::CProcessResult a;
01902 a.Result = NULL;
01903 return a;
01904 }
01905
01906 case TGetValue:
01907 {
01908 return runAskGetValue( (IBaseGroupType *) o );
01909 }
01910
01911 case TSetValue:
01912 {
01913 return runTellSetValue( (IBaseGroupType *) o );
01914 }
01915
01916 case TInitComponent:
01917 {
01918 return runInitComponent( (IBaseGroupType *) o );
01919 }
01920
01921 case TIsEUU:
01922 {
01923 CGroupType *param = (CGroupType *) o;
01924 std::string s(((NLAIAGENT::CStringType *)param->get())->getStr().getString());
01925 NLAIAGENT::IObjectIA::CProcessResult r;
01926
01927 if(isa(s))
01928 r.Result = new NLAIAGENT::DigitalType(1.0);
01929 else
01930 r.Result = new NLAIAGENT::DigitalType(0.0);
01931 return r;
01932 }
01933
01934 case TAddSet:
01935 {
01936 CGroupType *param = (CGroupType *) o;
01937 std::string s(((NLAIAGENT::CStringType *)param->get())->getStr().getString());
01938 addSet(s);
01939
01940 return NLAIAGENT::IObjectIA::CProcessResult();
01941 }
01942
01943 default:
01944 return IAgent::runMethodeMember(index,o);
01945 }
01946 }
01947
01948 std::string CAgentScript::getMethodeMemberDebugString(sint32 h, sint32 id) const
01949 {
01950 int i = id - getBaseMethodCount();
01951 if(i >= 0)
01952 {
01953 std::string name;
01954 if(h)
01955 {
01956 _AgentClass->getBrancheCode(h,i).getName().getDebugString(name);
01957 _AgentClass->getBrancheCode(h,i).getParam().getDebugString(name);
01958 }
01959 else
01960 {
01961 _AgentClass->getBrancheCode(i).getName().getDebugString(name);
01962 _AgentClass->getBrancheCode(i).getParam().getDebugString(name);
01963 }
01964 return name;
01965 }
01966
01967 switch(id - IAgent::getMethodIndexSize())
01968 {
01969 case TSend:
01970 {
01971 return std::string("CAgentScript::sendMessage(IMessage)");
01972 }
01973
01974 case TSendComponent:
01975 {
01976 return std::string("CAgentScript::sendMessage(String,IMessage)");
01977 }
01978
01979 case TGetChildTag:
01980 {
01981 return std::string("CAgentScript::getDynamicAgent(String)");
01982 }
01983
01984 case TAddChildTag:
01985 {
01986 return std::string("CAgentScript::addDynamicAgent(String,IAgent)");
01987 }
01988 case TFather:
01989 {
01990 return std::string("CAgentScript::Father()");
01991 }
01992
01993 case TSelf:
01994 {
01995 return std::string("CAgentScript::Self()");
01996 }
01997 case TGetName:
01998 {
01999 return std::string("CAgentScript::GetAgentName()");
02000 }
02001
02002 case TRunAskParentNotify:
02003 {
02004 return std::string("CAgentScript::runAskParentNotify(CNotifyParent)");
02005 }
02006
02007 case TRunTellParentNotify:
02008 {
02009 return std::string("CAgentScript::runTellarentNotify(CNotifyParent)");
02010 }
02011
02012 case TRunAskComponent:
02013 case TRunTellComponent:
02014 {
02015 return std::string("CAgentScript::runTell/AskCompoment(MsgTellCompoment)");
02016 }
02017 case TSetStatic:
02018 {
02019 return std::string("CAgentScript::updateStaticMember(String, IObjectIA *)");
02020 }
02021
02022 case TGetValue:
02023 {
02024 return std::string("CAgentScript::runAskGetValue(MsgGetValue)");
02025 }
02026
02027 case TSetValue:
02028 {
02029 return std::string("CAgentScript::runTellSetValue(MsgGetValue)");
02030 }
02031
02032 case TInitComponent:
02033 {
02034 return std::string("CAgentScript::runInitComponent(MsgGetValue)");
02035 }
02036
02037
02038 default:
02039 return IAgentManager::getMethodeMemberDebugString(h,id);
02040 }
02041 }
02042
02043 int CAgentScript::getBaseMethodCount() const
02044 {
02045 return IAgentManager::getBaseMethodCount() + CAgentScript::TLastM;
02046 }
02047
02048 IObjectIA::CProcessResult CAgentScript::runMethodeMember(sint32 inheritance, sint32 index, IObjectIA *c)
02049 {
02050
02051 if(c->getType() != NLAISCRIPT::CCodeContext::IdCodeContext)
02052 {
02053 return IAgent::runMethodeMember(inheritance,index, c);
02054 }
02055
02056 NLAISCRIPT::IOpCode *opPtr = NULL;
02057 NLAISCRIPT::CCodeContext &context = (NLAISCRIPT::CCodeContext &)*c;
02058
02059 int i = index - getBaseMethodCount();
02060 if(i < 0)
02061 {
02062
02063
02064
02065
02066
02067
02068 IObjectIA::CProcessResult r = runMethodBase(index,(IObjectIA *)context.Param.back());
02069 if(r.Result != NULL)
02070 {
02071 context.Stack++;
02072 context.Stack[(int)context.Stack] = r.Result;
02073 }
02074 r.Result = NULL;
02075 return r;
02076 }
02077 else
02078 {
02079 opPtr = getMethode(inheritance,i);
02080 }
02081
02082 IObjectIA::CProcessResult r;
02083 if(opPtr != NULL)
02084 {
02085 #ifdef NL_DEBUG
02086 std::string nameDbg;
02087 _AgentClass->getBrancheCode(inheritance,i).getName().getDebugString(nameDbg);
02088 _AgentClass->getBrancheCode(inheritance,i).getParam().getDebugString(nameDbg);
02089 #endif
02090 NLAISCRIPT::IOpCode &op = *opPtr;
02091 NLAISCRIPT::CCodeBrancheRun *opTmp = context.Code;
02092 int ip = (uint32)*context.Code;
02093 context.Code = (NLAISCRIPT::CCodeBrancheRun *)&op;
02094 *context.Code = 0;
02095
02096 r = ((NLAISCRIPT::ICodeBranche *)opPtr)->run(context);
02097
02098 if (context.ContextDebug.Active)
02099 {
02100 context.ContextDebug.callStackPop();
02101 }
02102 *context.Code = ip;
02103 context.Code = opTmp;
02104 }
02105 return r;
02106 }
02107
02108 IObjectIA::CProcessResult CAgentScript::runMethodeMember(sint32 index, IObjectIA *c)
02109 {
02110 if(c->getType() != NLAISCRIPT::CCodeContext::IdCodeContext)
02111 {
02112 return IAgent::runMethodeMember(index, c);
02113 }
02114
02115 NLAISCRIPT::IOpCode *opPtr = NULL;
02116 NLAISCRIPT::CCodeContext &context = (NLAISCRIPT::CCodeContext &)*c;
02117
02118 int i = index - getBaseMethodCount();
02119 if(i < 0)
02120 {
02121
02122
02123
02124
02125
02126
02127 IObjectIA::CProcessResult r = runMethodBase(index,(IObjectIA *)context.Param.back());
02128 if(r.Result != NULL)
02129 {
02130 context.Stack++;
02131 context.Stack[(int)context.Stack] = r.Result;
02132 }
02133 r.Result = NULL;
02134 return r;
02135 }
02136 else
02137 {
02138 opPtr = getMethode(i);
02139 }
02140 IObjectIA::CProcessResult r;
02141 if(opPtr != NULL)
02142 {
02143 NLAISCRIPT::CCodeBrancheRun *opTmp = context.Code;
02144 int ip;
02145 if(context.Code != NULL) ip = (uint32)*context.Code;
02146 else ip =0;
02147 context.Code = (NLAISCRIPT::CCodeBrancheRun *)opPtr;
02148 *context.Code = 0;
02149
02150 r = ((NLAISCRIPT::ICodeBranche *)opPtr)->run(context);
02151
02152
02153 if (context.ContextDebug.Active)
02154 {
02155 context.ContextDebug.callStackPop();
02156 }
02157
02158 *context.Code = ip;
02159 context.Code = opTmp;
02160 }
02161 return r;
02162 }
02163
02164 tQueue CAgentScript::getPrivateMember(const IVarName *className,const IVarName *methodName,const IObjectIA ¶m) const
02165 {
02166
02167 #ifdef NL_DEBUG
02168 const char *dgb_meth_name = methodName->getString();
02169 #endif
02170 return isTemplateMember(CAgentScript::StaticMethod,CAgentScript::TLastM,IAgent::getMethodIndexSize(),className,methodName,param);
02171 }
02172
02173 tQueue CAgentScript::isMember(const IVarName *className,const IVarName *methodName,const IObjectIA ¶m) const
02174 {
02175
02176
02177 if(className == NULL)
02178 {
02179
02180 tQueue r;
02181 if(_AgentClass != NULL)
02182 r = _AgentClass->getPrivateMember(className,methodName,param);
02183
02184 if(r.size())
02185 return r;
02186 else
02187 {
02188 r = getPrivateMember(className,methodName,param);
02189 if(r.size()) return r;
02190 else
02191 {
02192 r = IAgent::isMember(className,methodName,param);
02193 if(r.size())
02194 return r;
02195 else
02196 return isDeflautProccessMsg(className,methodName,param);
02197 }
02198 }
02199
02200 }
02201 else
02202 if(*className == CStringVarName("Agent"))
02203 {
02204 tQueue r;
02205 r = getPrivateMember(className,methodName,param);
02206 if(r.size())
02207 return r;
02208 else
02209 {
02210 r = _AgentClass->getPrivateMember(className,methodName,param);
02211
02212 if ( r.size() )
02213 return r;
02214 else
02215 {
02216 r = IAgent::isMember(className,methodName,param);
02217 if(r.size())
02218 return r;
02219 else
02220 return isDeflautProccessMsg(className,methodName,param);
02221 }
02222 }
02223
02224 }
02225 return tQueue();
02226 }
02227
02228 tQueue CAgentScript::isDeflautProccessMsg(const IVarName *className,const IVarName *methodName,const IObjectIA ¶m) const
02229 {
02230 const char *name = methodName->getString();
02231 if(name[0] == 'R' && name[1] == 'u' && name[2] == 'n')
02232 {
02233 static CStringVarName runMsgName[7] = {"RunTell", "RunAchieve", "RunAsk", "RunExec", "RunBreak", "RunKill", "RunError"};
02234 sint i;
02235 for(i = 0; i < 7; i ++)
02236 {
02237 if(*methodName == runMsgName[i])
02238 {
02239 tQueue r;
02240 CObjectType *c = new CObjectType(new NLAIC::CIdentType(NLAIC::CIdentType::VoidType));
02241 r.push(CIdMethod(TDeflautProccessMsg + IAgent::getMethodIndexSize(),0.0,NULL,c));
02242 return r;
02243 }
02244 }
02245 }
02246
02247 return tQueue();
02248 }
02249
02250 sint32 CAgentScript::isClassInheritedFrom(const IVarName &name) const
02251 {
02252 return _AgentClass->isClassInheritedFrom( name );
02253 }
02254
02255 sint32 CAgentScript::getStaticMemberIndex(const IVarName &name) const
02256 {
02257 return _AgentClass->getInheritedStaticMemberIndex(name);
02258 }
02259
02260 NLAIAGENT::tQueue isTemplateMember( CAgentScript::CMethodCall **StaticMethod,int count,int shift,
02261 const NLAIAGENT::IVarName *className,
02262 const NLAIAGENT::IVarName *methodName,
02263 const NLAIAGENT::IObjectIA ¶m)
02264 {
02265 int index = count;
02266 int i;
02267
02268 for(i = 0; i < count; i ++)
02269 {
02270 if(StaticMethod[i]->MethodName == *methodName)
02271 {
02272 index = StaticMethod[i]->Index;
02273 switch(StaticMethod[i]->CheckArgType)
02274 {
02275 case CAgentScript::CheckAll:
02276 {
02277 double d = ((NLAISCRIPT::CParam &)*StaticMethod[i]->ArgType).eval((NLAISCRIPT::CParam &)param);
02278 if(d >= 0.0)
02279 {
02280 NLAIAGENT::tQueue r;
02281 StaticMethod[i]->ReturnValue->incRef();
02282 r.push(NLAIAGENT::CIdMethod( (shift + StaticMethod[i]->Index),
02283 0.0,
02284 NULL,
02285 StaticMethod[i]->ReturnValue));
02286 return r;
02287 }
02288 }
02289 index = count;
02290 break;
02291
02292
02293 case CAgentScript::CheckCount:
02294 {
02295 if(((NLAISCRIPT::CParam &)param).size() == StaticMethod[i]->ArgCount)
02296 {
02297 NLAIAGENT::tQueue r;
02298 StaticMethod[i]->ReturnValue->incRef();
02299 r.push(NLAIAGENT::CIdMethod( (shift + StaticMethod[i]->Index),
02300 0.0,
02301 NULL,
02302 StaticMethod[i]->ReturnValue ));
02303 return r;
02304 }
02305 }
02306 index = count;
02307 break;
02308
02309 case CAgentScript::DoNotCheck:
02310 {
02311 NLAIAGENT::tQueue r;
02312 StaticMethod[i]->ReturnValue->incRef();
02313 r.push(NLAIAGENT::CIdMethod( (shift + StaticMethod[i]->Index),
02314 0.0,
02315 NULL,
02316 StaticMethod[i]->ReturnValue));
02317 return r;
02318 }
02319 index = count;
02320 break;
02321 }
02322 }
02323 }
02324 return NLAIAGENT::tQueue();
02325 }
02326
02327 void CAgentScript::createComponents(std::list<IObjectIA *> &components)
02328 {
02329 _NbComponents = components.size();
02330 if ( _NbComponents )
02331 {
02332 _Components = new IObjectIA *[ _NbComponents ];
02333 std::list<IObjectIA *>::iterator it_c = components.begin();
02334 int id_c = 0;
02335 while ( it_c != components.end() )
02336 {
02337 IObjectIA *o = (IObjectIA *)*it_c;
02338 _Components[id_c] = o;
02339
02340 uint b = NLAIC::CTypeOfObject::tInterpret | NLAIC::CTypeOfObject::tAgent;
02341 const NLAIC::CTypeOfObject &t = o->getType();
02342
02343 if((t.getValue() & b) == b)
02344 {
02345 ((CAgentScript *)o)->setParent( (const IWordNumRef *) *this);
02346 }
02347
02348 it_c++;
02349 id_c++;
02350 }
02351 }
02352 else
02353 _Components = NULL;
02354 }
02355
02356 void CAgentScript::callConstructor()
02357 {
02358 NLAIAGENT::CStringVarName constructor_func_name("Constructor");
02359 sint32 id_func = getClass()->findMethod( constructor_func_name, NLAISCRIPT::CParam() );
02360
02361 #ifdef NL_DEBUG
02362
02363 const char * ttt = (const char *) getType();
02364 #endif
02365 if ( id_func != -1 )
02366 {
02367 NLAISCRIPT::CStackPointer stack;
02368 NLAISCRIPT::CStackPointer heap;
02369 NLAISCRIPT::CCodeContext codeContext(stack, heap, NULL, this, NLAISCRIPT::CCallPrint::inputOutput);
02370 codeContext.Self = this;
02371 NLAISCRIPT::CCodeBrancheRun *o = (NLAISCRIPT::CCodeBrancheRun *) getClass()->getBrancheCode( id_func ).getCode();
02372 codeContext.Code = o;
02373 int ip;
02374 if(codeContext.Code != NULL) ip = (uint32)*codeContext.Code;
02375 else ip =0;
02376
02377 *codeContext.Code = 0;
02378
02379 (void)o->run(codeContext);
02380
02381 *codeContext.Code = ip;
02382
02383 }
02384 }
02385
02386 void CAgentScript::callFunction(std::string &f_name, NLAIAGENT::IObjectIA *p)
02387 {
02388 NLAIAGENT::CStringVarName func_name( f_name.c_str() );
02389 sint32 id_func = getClass()->findMethod( func_name, NLAISCRIPT::CParam() );
02390
02391 #ifdef NL_DEBUG
02392 const char * ttt = (const char *) getType();
02393 #endif
02394 if ( id_func != -1 )
02395 {
02396 NLAISCRIPT::CStackPointer stack;
02397 NLAISCRIPT::CStackPointer heap;
02398 NLAISCRIPT::CCodeContext codeContext(stack, heap, NULL, this, NLAISCRIPT::CCallPrint::inputOutput);
02399 codeContext.Self = this;
02400 NLAISCRIPT::CCodeBrancheRun *o = (NLAISCRIPT::CCodeBrancheRun *) getClass()->getBrancheCode( id_func ).getCode();
02401 codeContext.Code = o;
02402 int ip;
02403 if(codeContext.Code != NULL) ip = (uint32)*codeContext.Code;
02404 else ip =0;
02405
02406 *codeContext.Code = 0;
02407
02408 (void)o->run(codeContext);
02409
02410 *codeContext.Code = ip;
02411
02412 }
02413 }
02414 }