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 vbcfg.setPosition(vbcfg.g_position)
50 fbClass.getInstance().unlock()
51 eRCInput.getInstance().unlock()
54 if cmd_fd is not None:
58 class VBServerThread(threading.Thread):
60 threading.Thread.__init__(self)
65 def open(self, timeout = 5):
66 addr = vbcfg.SOCKETFILE
67 self.mTimeout = timeout
72 if os.path.exists(addr):
75 self.mSock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
76 self.mSock.settimeout(self.mTimeout)
77 self.mSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
82 def parse(self, data):
83 hlen = struct.calcsize('ibi')
85 opcode, result, length = struct.unpack('ibi', data[:hlen])
86 #vbcfg.DEBUG("%s %s %d" % (opcode, result, length))
88 packet = data[hlen:hlen+length]
89 return [opcode, result, packet]
91 def assamble(self, opcode, result, packet):
94 header = struct.pack('ibi', opcode, (result and 1 or 0), len(packet))
95 return header + packet
97 def process(self, conn, addr):
98 read_data = conn.recv(_BUFSIZE)
99 request = self.parse(read_data)
100 opcode, result, read_packet = request[0], request[1], request[2]
101 result, send_packet = False,None
103 result, send_packet = GetHandler(opcode)(result, read_packet)
104 except Exception, ErrMsg:
106 send_data = self.assamble(opcode, result, send_packet)
107 conn.sendall(send_data)
110 if self.mSock is None:
116 readable, writable, errored = select.select([self.mSock], [], [], self.mTimeout)
119 conn, addr = None, None
121 conn, addr = self.mSock.accept()
122 self.process(conn, addr)
123 except Exception, err:
124 vbcfg.ERR("VBSServerThread: %s" % err)
133 def __init__(self, opcode_list, szcbh):
135 for opcode_str in opcode_list:
136 if opcode_str is None and len(opcode_str) == 0:
138 _OPCODE[opcode_str] = [opcode, None]
142 for fname in dir(self):
144 if not fname.startswith(szcbh):
146 fref = getattr(self, fname)
149 opcodestr = fname[len(szcbh):]
150 vbcfg.DEBUG("registrated at %s" % opcodestr)
151 SetHandler(opcodestr, fref)
154 vbcfg.DEBUG("%d registreated" % registreted_idx)