home *** CD-ROM | disk | FTP | other *** search
/ linuxmafia.com 2016 / linuxmafia.com.tar / linuxmafia.com / pub / palmos / pippy-0.6beta-src.tar.gz / pippy-0.6beta-src.tar / pippy-0.6beta-src / src / Modules / palmnetmodule.c < prev    next >
C/C++ Source or Header  |  2000-12-27  |  6KB  |  263 lines

  1. /*
  2.   palmnet module
  3.  
  4.   This module provides an interface to the PalmOS NetLib networking
  5.   library.  It is used for starting and stopping TCP/IP networking,
  6.   setting the interface (ppp, etc.), and debugging.
  7.  
  8. */
  9. #include "kludge.h"
  10. #include "_palmutils.h"
  11.  
  12. static PyObject *palmnet_error;
  13. extern UInt16 AppNetRefnum;
  14. extern Int32 AppNetTimeout;
  15.  
  16. /* AppNetOpen is non-zero when the Net library has been opened */
  17. UInt16 AppNetOpen = 0;
  18.  
  19.  
  20. static PyObject *palmnet_Err(UInt16 err) SEG_PALMNETMODULE_C;
  21. static PyObject *palmnet_ErrFromErrno() SEG_PALMNETMODULE_C;
  22. static PyObject *palmnet_settimeout(PyObject *self, PyObject *args) SEG_PALMNETMODULE_C;
  23. static PyObject *palmnet_gettimeout(PyObject *self, PyObject *args) SEG_PALMNETMODULE_C;
  24. static PyObject *palmnet_isopen(PyObject *self, PyObject *args) SEG_PALMNETMODULE_C;
  25. static PyObject *palmnet_open(PyObject *self, PyObject *args) SEG_PALMNETMODULE_C;
  26. static PyObject *palmnet_close(PyObject *self, PyObject *args) SEG_PALMNETMODULE_C;
  27. static PyObject *init_helper() SEG_PALMNETMODULE_C;
  28. static PyObject *palmnet_refnum(PyObject *self, PyObject *args) SEG_PALMNETMODULE_C;
  29. static PyObject *palmnet_refcount(PyObject *self, PyObject *args) SEG_PALMNETMODULE_C;
  30. static int init_syslib() SEG_PALMNETMODULE_C;
  31. static void palmnet_fini(void) SEG_PALMNETMODULE_C;
  32. static void _close(void) SEG_PALMNETMODULE_C;
  33. PyObject *Palm_InitNetwork() SEG_PALMNETMODULE_C;
  34. int PalmNet_EnsureOpen() SEG_PALMNETMODULE_C;
  35. int PalmNet_IsOpen(void) SEG_PALMNETMODULE_C;
  36. void initpalmnet(void) SEG_PALMNETMODULE_C;
  37.  
  38.  
  39.  
  40. static PyObject *
  41. palmnet_Err(UInt16 err)
  42. {
  43.     PyObject *v;
  44.  
  45.     v = palmutil_buildErrObject(errno);
  46.     if (v != NULL) {
  47.         PyErr_SetObject(palmnet_error, v);
  48.         Py_DECREF(v);
  49.     }
  50.  
  51.     return NULL;
  52. }
  53.     
  54.  
  55. static PyObject *
  56. palmnet_ErrFromErrno()
  57. {
  58.     return palmnet_Err(errno);
  59. }
  60.  
  61. static PyObject *palmnet_settimeout(PyObject *self, PyObject *args)
  62. {
  63.  
  64.     /*  Set the timeout in seconds.  This value represents the
  65.         maximum number of system ticks to wait before a net library call
  66.         expires.
  67.     */
  68.     
  69.     int timeout;
  70.  
  71.     if (PyArg_ParseTuple(args, "i:timeout", &timeout)) { 
  72.         AppNetTimeout = SysTicksPerSecond() * timeout;
  73.     }
  74.  
  75.     Py_INCREF(Py_None);
  76.     return Py_None;
  77.  
  78. }
  79.  
  80. static PyObject *palmnet_gettimeout(PyObject *self, PyObject *args) 
  81. {
  82.  
  83.     /*  Get the timeout in seconds.  This value represents the
  84.         maximum number of system ticks to wait before a net library call
  85.         expires.
  86.     */
  87.     return PyInt_FromLong( (long) (AppNetTimeout / SysTicksPerSecond()) );
  88. }
  89.  
  90. static void _close(void){
  91.     if (AppNetOpen) {
  92.         NetLibClose(AppNetRefnum, false);
  93.         AppNetOpen = 0;
  94.     }
  95. }
  96.  
  97. static PyObject *palmnet_close(PyObject *self, PyObject *args)
  98. {
  99.     if (!PyArg_ParseTuple(args, ""))
  100.         return NULL;
  101.  
  102.     _close();
  103.     Py_INCREF(Py_None);
  104.     return Py_None;
  105. }
  106.  
  107.  
  108. static void palmnet_fini(void){
  109.     /* Close the Palmos Network Library.
  110.  
  111.        This function is registered in the list of functions
  112.        to be called when the python interpreter is exited.
  113.  
  114.      */
  115.  
  116.     _close();
  117.  
  118. }
  119.  
  120.  
  121. static PyObject *palmnet_refcount(PyObject *self, PyObject *args) {
  122.     UInt16 count;
  123.     if (!PyArg_ParseTuple(args, ""))
  124.         return NULL;
  125.     if (!AppNetRefnum && !init_syslib())
  126.         return NULL;
  127.     NetLibOpenCount (AppNetRefnum, &count);
  128.     return PyInt_FromLong((long) count);
  129. }
  130.  
  131. static PyObject *palmnet_refnum(PyObject *self, PyObject *args) {
  132.     
  133.     if (!PyArg_ParseTuple(args, ""))
  134.         return NULL;
  135.     
  136.     return PyInt_FromLong((long) AppNetRefnum);
  137. }
  138.  
  139.  
  140. static int init_syslib() {
  141.     int ret = 0;
  142.     Err err;
  143.  
  144.     err = SysLibFind("Net.lib", &AppNetRefnum);
  145.     if (!AppNetRefnum){
  146.         PyErr_SetString(palmnet_error,"Net.lib cannot be found - this is bad!");
  147.         goto fail;
  148.     }
  149.     if (err == sysErrLibNotFound) {
  150.         PyErr_SetString(palmnet_error, "Palm Net Library is not present.");
  151.         goto fail;
  152.     }
  153.     else if (err) {
  154.         PyErr_SetString(palmnet_error, "Problem loading Palm Net Library");
  155.         goto fail;
  156.     }
  157.  
  158.     ret = 1;
  159.   fail:
  160.     return ret;
  161.  
  162. }
  163.  
  164.     
  165. static PyObject *init_helper(){
  166.     /* 
  167.        Initialize the connection by opening the PalmOS Network Library.
  168.        On success, AppNetRefnum is set to a non-zero number and
  169.        Py_None is returned;  otherwise, raise an exception.
  170.     */
  171.     Err err;
  172.     UInt16 ifErrs;
  173.     
  174.     if (!AppNetRefnum && !init_syslib())
  175.         return NULL;
  176.     
  177.     if (AppNetOpen){
  178.         Py_INCREF(Py_None);
  179.         return Py_None;
  180.     }
  181.  
  182.     /* Open the net library */
  183.     err = NetLibOpen(AppNetRefnum, &ifErrs); 
  184.     
  185.     switch (err) {
  186.     case 0: break;
  187.     case netErrAlreadyOpen:
  188.         /* Net already open - ref count on net lib will be 
  189.            incremented automatically by PalmOS */
  190.         break;
  191.     default:
  192.         return palmnet_Err(err);
  193.     }
  194.     
  195.     /* check for network interface-related errors */
  196.     if (ifErrs)
  197.         return palmnet_Err(ifErrs);
  198.  
  199.     AppNetOpen=1;
  200.     Py_INCREF(Py_None);
  201.     return Py_None;
  202.     
  203.     }
  204.  
  205. static PyObject *palmnet_open(PyObject *self, PyObject *args) {
  206.     return init_helper();
  207. }
  208.  
  209. static PyObject *palmnet_isopen(PyObject *self, PyObject *args) {
  210.     return Py_BuildValue( "i", (AppNetOpen != 0));
  211. }
  212.  
  213. int PalmNet_IsOpen(void) {
  214.     return (AppNetOpen != 0);
  215. }
  216. int PalmNet_EnsureOpen(){
  217.     if (!AppNetOpen) {
  218.       PyErr_SetString(palmnet_error, "Net Library has not been opened");
  219.         return -1;
  220.     }
  221.     return 0;
  222. }
  223.  
  224.  
  225. PyObject *Palm_InitNetwork() {
  226.     /* exported interface */
  227.     return init_helper();
  228. }
  229.  
  230.  
  231. static PyMethodDef palmnet_methods[] = {
  232.     {"settimeout",        (PyCFunction)palmnet_settimeout, METH_VARARGS},
  233.     {"gettimeout",        (PyCFunction)palmnet_gettimeout, METH_VARARGS},
  234.     {"open",                (PyCFunction)palmnet_open, METH_VARARGS},
  235.     {"isopen",              (PyCFunction)palmnet_isopen, METH_VARARGS},
  236.     {"refnum",              (PyCFunction)palmnet_refnum, METH_VARARGS},
  237.     {"refcount",            (PyCFunction)palmnet_refcount, METH_VARARGS},
  238.     {"close",               (PyCFunction)palmnet_close, METH_VARARGS},
  239.     {NULL, NULL} };
  240.  
  241.  
  242. void initpalmnet(void) {
  243.     PyObject *m, *d;
  244.  
  245.     m = Py_InitModule3("palmnet", palmnet_methods, NULL);
  246.     d = PyModule_GetDict(m);
  247.     palmnet_error = PyErr_NewException("palmnet.error", NULL, NULL);
  248.     if (palmnet_error == NULL)
  249.         return;
  250.  
  251.     PyDict_SetItemString(d, "error", palmnet_error);
  252.  
  253.     /* Try to obtain the AppNetRefnum, and ignore the errors if it
  254.        fails.  Another attempt will be made in the "open" global 
  255.        routine, */
  256.     init_syslib();
  257.     if (PyErr_Occurred)
  258.         PyErr_Clear();
  259.  
  260.     Py_AtExit(palmnet_fini);
  261.  
  262. }
  263.