00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CENVIR_H
00021 #define __CENVIR_H
00022
00023 #include <sstream>
00024 #include <iostream>
00025 #include "defs.h"
00026
00027 class cObject;
00028 class cMessage;
00029 class cGate;
00030 class cModule;
00031 class cSimpleModule;
00032 class cStatistic;
00033 class cRNG;
00034 class cConfiguration;
00035 class cXMLElement;
00036 class TOmnetApp;
00037 class cEnvir;
00038
00039 using std::endl;
00040
00041
00042
00043
00044
00045
00046 template <class E, class T = std::char_traits<E> >
00047 class basic_evbuf : public std::basic_stringbuf<E,T> {
00048 public:
00049 basic_evbuf(cEnvir *ev) : _ev(ev) {}
00050
00051 bool isempty() {return this->pptr()==this->pbase();}
00052 protected:
00053 virtual int sync();
00054 virtual std::streamsize xsputn(const E *s, std::streamsize n) {
00055 #if !defined(_MSC_VER) || _MSC_VER>1200
00056 std::streamsize r = std::basic_stringbuf<E,T>::xsputn(s,n);
00057 #else
00058
00059
00060
00061
00062 const E *_S = s;
00063 std::streamsize _N = n;
00064 std::streamsize _M, _Ns;
00065 for (_Ns = 0; 0 < _N; )
00066 if (pptr() != 0 && 0 < (_M = epptr() - pptr()))
00067 {if (_N < _M)
00068 _M = _N;
00069 T::copy(pptr(), _S, _M);
00070 _S += _M, _Ns += _M, _N -= _M, pbump(_M); }
00071 else if (T::eq_int_type(T::eof(),
00072 overflow(T::to_int_type(*_S))))
00073 break;
00074 else
00075 ++_S, ++_Ns, --_N;
00076 std::streamsize r = _Ns;
00077 #endif
00078 for(;n>0;n--,s++)
00079 if (*s=='\n')
00080 {sync();break;}
00081 return r;
00082 }
00083 cEnvir *_ev;
00084 };
00085
00086 typedef basic_evbuf<char> evbuf;
00087
00088
00107 ENVIR_API extern cEnvir ev;
00108
00109 ENVIR_API bool memoryIsLow();
00110
00111
00112
00143 class ENVIR_API cEnvir : public std::ostream
00144 {
00145 public:
00146
00147 TOmnetApp *app;
00148 bool disable_tracing;
00149 bool debug_on_errors;
00150 private:
00151
00152 evbuf ev_buf;
00153 bool isgui;
00154
00155 public:
00156
00157
00158
00159 void sputn(const char *s, int n);
00160
00161
00162
00163 void flushlastline() {if (!ev_buf.isempty()) ev_buf.sputn("\n",1);}
00164
00165 public:
00171
00175 cEnvir();
00176
00180 ~cEnvir();
00182
00185
00190 void setup(int ac, char *av[]);
00191
00197 int run();
00198
00202 void shutdown();
00204
00207
00214 void objectDeleted(cObject *object);
00215
00229 void messageSent(cMessage *msg, cGate *directToGate=NULL);
00230
00234 void moduleReparented(cModule *module, cModule *oldparent);
00235
00243 void messageDelivered(cMessage *msg);
00244
00249 void breakpointHit(const char *lbl, cSimpleModule *mod);
00250
00256 void moduleMethodCalled(cModule *from, cModule *to, const char *method);
00257
00263 void moduleCreated(cModule *newmodule);
00264
00276 void moduleDeleted(cModule *module);
00277
00282 void connectionCreated(cGate *srcgate);
00283
00288 void connectionRemoved(cGate *srcgate);
00289
00294 void displayStringChanged(cGate *gate);
00295
00299
00300 void displayStringChanged(cModule *submodule);
00301
00305 void backgroundDisplayStringChanged(cModule *parentmodule);
00306
00311 void undisposedObject(cObject *obj);
00313
00316
00322 std::string getParameter(int run_no, const char *parname);
00323
00328 bool getParameterUseDefault(int run_no, const char *parname);
00329
00339 bool isModuleLocal(cModule *parentmod, const char *modname, int index);
00340
00362 cXMLElement *getXMLDocument(const char *filename, const char *path=NULL);
00363
00368 unsigned extraStackForEnvir();
00369
00377 cConfiguration *config();
00379
00382
00388 bool isGUI() {return isgui;}
00389
00406 bool disabled() {return disable_tracing;}
00407
00411 void bubble(cModule *mod, const char *text);
00412
00417 void printfmsg(const char *fmt,...);
00418
00426 void printf(const char *fmt="\n",...);
00427
00432 void puts(const char *s);
00433
00440 cEnvir& flush();
00441
00446 std::string gets(const char *prompt, const char *defaultreply=NULL);
00447
00451 bool gets(const char *prompt, char *buf, int len=255);
00452
00458 bool askYesNo(const char *msgfmt,...);
00460
00463
00468 int numRNGs();
00469
00473 cRNG *rng(int k);
00474
00479 void getRNGMappingFor(cModule *mod);
00481
00491
00498 void *registerOutputVector(const char *modulename, const char *vectorname, int tuple);
00499
00503 void deregisterOutputVector(void *vechandle);
00504
00510 bool recordInOutputVector(void *vechandle, simtime_t t, double value);
00511
00517 bool recordInOutputVector(void *vechandle, simtime_t t, double value1, double value2);
00519
00529
00533 void recordScalar(cModule *module, const char *name, double value);
00535
00543
00547 std::ostream *getStreamForSnapshot();
00548
00552 void releaseStreamForSnapshot(std::ostream *os);
00554
00560 int argCount();
00561
00565 char **argVector();
00566
00570 int getParsimProcId();
00571
00576 int getParsimNumPartitions();
00577
00581 unsigned long getUniqueNumber();
00582
00596 bool idle();
00598 };
00599
00600 template <class E, class T>
00601 int basic_evbuf<E,T>::sync() {
00602 _ev->sputn(this->pbase(), this->pptr()-this->pbase());
00603 setp(this->pbase(),this->epptr());
00604 return 0;
00605 }
00606
00607 #endif