1 from enigma import fbClass, eRCInput
2 import os, threading, time, socket, select, struct
8 def SetHandler(opcode, handler):
10 _OPCODE[opcode][1] = handler
12 vbcfg.ERR("Fail to set handler (unknown opcode): %s" % opcode)
16 def GetHandler(opcode):
17 for key, value in _OPCODE.items():
18 if value[0] == opcode:
19 vbcfg.DEBUG("recv socket: [%s]" % key)
23 def GetOpcode(opcode):
25 return _OPCODE[opcode][0]
30 def assamble(opcodestr, data):
31 opcode = _OPCODE[opcodestr][0]
32 header = struct.pack('i', opcode)
36 def command(opcodestr, data = ""):
38 vbcfg.DEBUG("send ipc: [%s]" % opcodestr)
40 send_data = VBController.assamble(opcodestr, data)
41 if not os.path.exists(vbcfg.CONTROLFILE):
42 raise Exception("no found controller file.")
43 cmd_fd = os.open(vbcfg.CONTROLFILE, os.O_WRONLY)
45 raise Exception("fail to open controller file.")
46 os.write(cmd_fd, send_data)
47 except Exception, err:
48 vbcfg.ERR("VBHController: %s" % err)
49 fbClass.getInstance().unlock()
50 eRCInput.getInstance().unlock()
53 if cmd_fd is not None:
57 class VBServerThread(threading.Thread):
59 threading.Thread.__init__(self)
64 def open(self, timeout = 5):
65 addr = vbcfg.SOCKETFILE
66 self.mTimeout = timeout
71 if os.path.exists(addr):
74 self.mSock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
75 self.mSock.settimeout(self.mTimeout)
76 self.mSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
81 def parse(self, data):
82 hlen = struct.calcsize('ibi')
84 opcode, result, length = struct.unpack('ibi', data[:hlen])
85 #vbcfg.DEBUG("%s %s %d" % (opcode, result, length))
87 packet = data[hlen:hlen+length]
88 return [opcode, result, packet]
90 def assamble(self, opcode, result, packet):
93 header = struct.pack('ibi', opcode, (result and 1 or 0), len(packet))
94 return header + packet
96 def process(self, conn, addr):
97 read_data = conn.recv(_BUFSIZE)
98 request = self.parse(read_data)
99 opcode, result, read_packet = request[0], request[1], request[2]
100 result, send_packet = False,None
102 result, send_packet = GetHandler(opcode)(result, read_packet)
103 except Exception, ErrMsg:
105 send_data = self.assamble(opcode, result, send_packet)
106 conn.sendall(send_data)
109 if self.mSock is None:
115 readable, writable, errored = select.select([self.mSock], [], [], self.mTimeout)
118 conn, addr = None, None
120 conn, addr = self.mSock.accept()
121 self.process(conn, addr)
122 except Exception, err:
123 vbcfg.ERR("VBSServerThread: %s" % err)
132 def __init__(self, opcode_list, szcbh):
134 for opcode_str in opcode_list:
135 if opcode_str is None and len(opcode_str) == 0:
137 _OPCODE[opcode_str] = [opcode, None]
141 for fname in dir(self):
143 if not fname.startswith(szcbh):
145 fref = getattr(self, fname)
148 opcodestr = fname[len(szcbh):]
149 vbcfg.DEBUG("registrated at %s" % opcodestr)
150 SetHandler(opcodestr, fref)
153 vbcfg.DEBUG("%d registreated" % registreted_idx)