python_init.cc

00001 // Copyright 2008 Michael Marsh, University of Maryland.
00002 //
00003 // This file is part of pydtn.
00004 //
00005 // pydtn is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // pydtn is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with pydtn.  If not, see <http://www.gnu.org/licenses/>.
00017 //
00018 // The views and conclusions contained in the software and documentation
00019 // are those of the authors and should not be interpreted as representing
00020 // official policies, either expressed or implied, of the University
00021 // of Maryland.
00022 //
00023 // pydtn extends and embeds the Python interpreter, which is
00024 // Copyright 2001-2006 Python Software Foundation, All Rights Reserved,
00025 // and is released under the PSF License Agreement.
00026 //
00027 // RANLUX random number generation uses the Boost library,
00028 // Copyright 1994-2006 by various authors (details in individual files),
00029 // which is released under the Boost Software License, Version 1.0.
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} // sentinel
00178 };
00179 
00183 PyMODINIT_FUNC
00184 init_sampleapp(void)
00185 {
00186    (void) Py_InitModule("_sampleapp",ExampleMethods);
00187 }
00188 

Generated on Mon Mar 24 11:15:45 2008 for Pydtn Simulator by  doxygen 1.5.4