* Removed group_admin
[odoo/odoo.git] / bin / tiny_socket.py
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
3 #
4 # Copyright (c) 2004-2008 Tiny SPRL (http://tiny.be) All Rights Reserved.
5 #
6 # $Id$
7 #
8 # WARNING: This program as such is intended to be used by professional
9 # programmers who take the whole responsability of assessing all potential
10 # consequences resulting from its eventual inadequacies and bugs
11 # End users who are looking for a ready-to-use solution with commercial
12 # garantees and support are strongly adviced to contract a Free Software
13 # Service Company
14 #
15 # This program is Free Software; you can redistribute it and/or
16 # modify it under the terms of the GNU General Public License
17 # as published by the Free Software Foundation; either version 2
18 # of the License, or (at your option) any later version.
19 #
20 # This program is distributed in the hope that it will be useful,
21 # but WITHOUT ANY WARRANTY; without even the implied warranty of
22 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 # GNU General Public License for more details.
24 #
25 # You should have received a copy of the GNU General Public License
26 # along with this program; if not, write to the Free Software
27 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
28 ###############################################################################
29 import socket
30 import cPickle
31 import marshal
32
33 class Myexception(Exception):
34     def __init__(self, faultCode, faultString):
35         self.faultCode = faultCode
36         self.faultString = faultString
37         self.args = (faultCode, faultString)
38
39 class mysocket:
40     def __init__(self, sock=None):
41         if sock is None:
42             self.sock = socket.socket(
43             socket.AF_INET, socket.SOCK_STREAM)
44         else:
45             self.sock = sock
46         self.sock.settimeout(120)
47     def connect(self, host, port=False):
48         if not port:
49             protocol, buf = host.split('//')
50             host, port = buf.split(':')
51         self.sock.connect((host, int(port)))
52     def disconnect(self):
53         self.sock.shutdown(socket.SHUT_RDWR)
54         self.sock.close()
55     def mysend(self, msg, exception=False, traceback=None):
56         msg = cPickle.dumps([msg,traceback])
57         size = len(msg)
58         self.sock.send('%8d' % size)
59         self.sock.send(exception and "1" or "0")
60         totalsent = 0
61         while totalsent < size:
62             sent = self.sock.send(msg[totalsent:])
63             if sent == 0:
64                 raise RuntimeError, "socket connection broken"
65             totalsent = totalsent + sent
66     def myreceive(self):
67         buf=''
68         while len(buf) < 8:
69             chunk = self.sock.recv(8 - len(buf))
70             if chunk == '':
71                 raise RuntimeError, "socket connection broken"
72             buf += chunk
73         size = int(buf)
74         buf = self.sock.recv(1)
75         if buf != "0":
76             exception = buf
77         else:
78             exception = False
79         msg = ''
80         while len(msg) < size:
81             chunk = self.sock.recv(size-len(msg))
82             if chunk == '':
83                 raise RuntimeError, "socket connection broken"
84             msg = msg + chunk
85         res = cPickle.loads(msg)
86         if isinstance(res[0],Exception):
87             if exception:
88                 raise Myexception(str(res[0]), str(res[1]))
89             raise res[0]
90         else:
91             return res[0]
92
93 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
94