bugfix with binary field and wizard
[openerp-client.git] / bin / tiny_socket.py
blob3e1ce1b47f7f0939d6036cd86d8ad921b981ec30
1 # -*- encoding: utf-8 -*-
2 ##############################################################################
4 # Copyright (c) 2004-2008 Tiny SPRL (http://tiny.be) All Rights Reserved.
6 # $Id$
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
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.
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.
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
33 DNS_CACHE = {}
35 class Myexception(Exception):
36 def __init__(self, faultCode, faultString):
37 self.faultCode = faultCode
38 self.faultString = faultString
39 self.args = (faultCode, faultString)
41 class mysocket:
42 def __init__(self, sock=None):
43 if sock is None:
44 self.sock = socket.socket(
45 socket.AF_INET, socket.SOCK_STREAM)
46 else:
47 self.sock = sock
48 self.sock.settimeout(120)
49 def connect(self, host, port=False):
50 if not port:
51 protocol, buf = host.split('//')
52 host, port = buf.split(':')
53 if host in DNS_CACHE:
54 host = DNS_CACHE[host]
55 self.sock.connect((host, int(port)))
56 DNS_CACHE[host], port = self.sock.getpeername()
57 def disconnect(self):
58 self.sock.shutdown(socket.SHUT_RDWR)
59 self.sock.close()
60 def mysend(self, msg, exception=False, traceback=None):
61 msg = cPickle.dumps([msg,traceback])
62 size = len(msg)
63 self.sock.send('%8d' % size)
64 self.sock.send(exception and "1" or "0")
65 totalsent = 0
66 while totalsent < size:
67 sent = self.sock.send(msg[totalsent:])
68 if sent == 0:
69 raise RuntimeError, "socket connection broken"
70 totalsent = totalsent + sent
71 def myreceive(self):
72 buf=''
73 while len(buf) < 8:
74 chunk = self.sock.recv(8 - len(buf))
75 if chunk == '':
76 raise RuntimeError, "socket connection broken"
77 buf += chunk
78 size = int(buf)
79 buf = self.sock.recv(1)
80 if buf != "0":
81 exception = buf
82 else:
83 exception = False
84 msg = ''
85 while len(msg) < size:
86 chunk = self.sock.recv(size-len(msg))
87 if chunk == '':
88 raise RuntimeError, "socket connection broken"
89 msg = msg + chunk
90 res = cPickle.loads(msg)
91 if isinstance(res[0],Exception):
92 if exception:
93 raise Myexception(str(res[0]), str(res[1]))
94 raise res[0]
95 else:
96 return res[0]
98 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: