00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "Python.h"
00032 #include "structmember.h"
00033
00034 #include "SampleApp.h"
00035 #include "Manager.h"
00036 #include "pydtn/WrapNode.h"
00037 #include "pydtn/parsers.h"
00038 #include "simlpy/interpreter_hooks.h"
00039 #include "simlpy/Clock.h"
00040
00041 #include <iostream>
00042 #include <fstream>
00043
00053 #ifndef PyMODINIT_FUNC
00056 #define PyMODINIT_FUNC extern "C" void
00057 #endif
00058
00060 static SampleAppNS::Manager manager;
00061
00065 static char sampleapp_attach_doc[] = "Add an application instance to a node.\n\
00066 \n\
00067 Calling syntax:\n\
00068 \n\
00069 pydtn.sampleapp.attach(<n>)\n\
00070 \n\
00071 <n> is a node to which we want to add an instance.\n";
00072
00079 static PyObject*
00080 sampleapp_attach( PyObject* self, PyObject* args )
00081 {
00082 if ( ! PyTuple_Check( args ) )
00083 {
00084 PyErr_SetString(PyExc_TypeError,"attach expects a list of arguments");
00085 return 0;
00086 }
00087 if ( 0 == PyTuple_Size( args ) )
00088 {
00089 PyErr_SetString(PyExc_TypeError,
00090 "attach expects a non-empty argument list");
00091 return 0;
00092 }
00093
00094 WrapNode* wn = parse_node( PyTuple_GetItem( args, 0 ) );
00095 if ( 0 == wn ) return 0;
00096
00097 SampleAppNS::SampleApp* app = new SampleAppNS::SampleApp(&manager);
00098 wn->addApplication( app );
00099 manager.add(app,wn);
00100 Py_INCREF(Py_None);
00101 return Py_None;
00102 }
00103
00107 static char sampleapp_send_doc[] = "Send application data.\n\
00108 \n\
00109 Calling syntax:\n\
00110 \n\
00111 pydtn.sampleapp.send(<from>,<to>,<data>,<when>)\n\
00112 \n\
00113 <from> is the node that will send the data. It must have\n\
00114 an instance of the application.\n\
00115 \n\
00116 <to> is the node that will receive the data. It need not\n\
00117 have an instance of the application, but if it does it will\n\
00118 print a message for each application bundle received.\n\
00119 \n\
00120 <data> is the actual data to be sent. See emit(<t>,'data',...)\n\
00121 from pydtn's sim.Entity('node') for details.\n\
00122 \n\
00123 <when> is the time at which the application data bundle will\n\
00124 be scheduled, given as a list:\n\
00125 [ seconds , microseconds ]\n";
00126
00132 static PyObject*
00133 sampleapp_send( PyObject* self, PyObject* args )
00134 {
00135 if ( ! PyTuple_Check( args ) )
00136 {
00137 PyErr_SetString(PyExc_TypeError,"send expects a list of arguments");
00138 return 0;
00139 }
00140 if ( 4 > PyTuple_Size( args ) )
00141 {
00142 PyErr_SetString(PyExc_TypeError,
00143 "send expects a non-empty argument list");
00144 return 0;
00145 }
00146
00147 ItemWrapper item;
00148
00149 WrapNode* from = parse_node( PyTuple_GetItem( args, 0 ) );
00150 WrapNode* to = parse_node( PyTuple_GetItem( args, 1 ) );
00151
00152 std::string dataString = parse_string( PyTuple_GetItem( args, 2 ) );
00153 DTN::ByteString data;
00154 for ( unsigned int i = 0 ; i < dataString.length() ; ++i )
00155 {
00156 data += dataString[i];
00157 }
00158
00159 Time when( parse_time( PyTuple_GetItem( args, 3 ) ) );
00160
00161 SampleAppNS::SampleApp* app = manager.lookup(from);
00162 if ( 0 != app )
00163 {
00164 app->send(to->addr(),data,when);
00165 }
00166
00167 Py_INCREF(Py_None);
00168 return Py_None;
00169 }
00170
00173 static PyMethodDef ExampleMethods[] =
00174 {
00175 {"attach",sampleapp_attach,METH_VARARGS,sampleapp_attach_doc},
00176 {"send",sampleapp_send,METH_VARARGS,sampleapp_send_doc},
00177 {0,0,0,0}
00178 };
00179
00183 PyMODINIT_FUNC
00184 init_sampleapp(void)
00185 {
00186 (void) Py_InitModule("_sampleapp",ExampleMethods);
00187 }
00188