-HBBTVAPP_PATH = "/usr/local/hbb-browser"
-COMMAND_PATH = '/tmp/.sock.hbbtv.cmd'
-
-_g_helper = None
-
-class GlobalValues:
- command_util = None
- command_server = None
-
- before_service = None
-
- channel_info_sid = None
- channel_info_onid = None
- channel_info_tsid = None
- channel_info_name = None
- channel_info_orgid = None
-
- hbbtv_handelr = None
-
- packet_m = 0xBBADBEE
- packet_h = '!IIII'
- packet_hl = struct.calcsize(packet_h)
-
- need_restart = False
- plugin_browser = None
-__gval__ = GlobalValues()
-
-def setPluginBrowser(browser=None):
- global __gval__
- __gval__.plugin_browser = browser
-def getPluginBrowser():
- global __gval__
- return __gval__.plugin_browser
-
-def getPacketHeaders():
- global __gval__
- return (__gval__.packet_m, __gval__.packet_h, __gval__.packet_hl)
-
-def setChannelInfo(sid, onid, tsid, name, orgid):
- if sid is None: sid = 0;
- if onid is None: onid = 0;
- if tsid is None: tsid = 0;
- if name is None: name = "";
- if orgid is None: orgid = 0;
- global __gval__
- __gval__.channel_info_sid = sid
- __gval__.channel_info_onid = onid
- __gval__.channel_info_tsid = tsid
- __gval__.channel_info_name = name
- __gval__.channel_info_orgid = orgid
- print "Set Channel Info >> sid : %X, onid : %X, tsid : %X, name : %s, orgid : %d " % (sid, onid, tsid, name, orgid)
-def getChannelInfos():
- global __gval__
- print "Get Channel Info >> sid : %X, onid : %X, tsid : %X, name : %s, orgid : %d " % (__gval__.channel_info_sid,
- __gval__.channel_info_onid, __gval__.channel_info_tsid, __gval__.channel_info_name, __gval__.channel_info_orgid)
- return (__gval__.channel_info_sid,
- __gval__.channel_info_onid,
- __gval__.channel_info_tsid,
- __gval__.channel_info_name,
- __gval__.channel_info_orgid)
-
-def isNeedRestart():
- global __gval__
- print "Need Restart(GET) : ", __gval__.need_restart
- return __gval__.need_restart
-def setNeedRestart(n):
- global __gval__
- __gval__.need_restart = n
- print "Need Restart(SET) : ", __gval__.need_restart
-
-def getCommandUtil():
- global __gval__
- return __gval__.command_util
-def getCommandServer():
- global __gval__
- return __gval__.command_server
-
-def setBeforeService(s):
- global __gval__
- __gval__.before_service = s
-def getBeforeService():
- global __gval__
- return __gval__.before_service
-
-def _unpack(packed_data):
- (mg, h, hlen) = getPacketHeaders()
-
- if strIsEmpty(packed_data):
- return None
- (m, o, l, s) = struct.unpack(h, packed_data[:hlen])
- if m != mg:
- return None
- d = 0
- if l > 0:
- d = packed_data[hlen:hlen+l]
- return (o,d,s)
-
-def _pack(opcode, params=None, reserved=0):
- (m, h, hlen) = getPacketHeaders()
- if strIsEmpty(params):
- params = ''
- packed_data = struct.pack(h, m, opcode, len(params), reserved)
- return packed_data + params
-
-class MMSStreamURL:
- headers = [
- 'GET %s HTTP/1.0'
- ,'Accept: */* '
- ,'User-Agent: NSPlayer/7.10.0.3059 '
- ,'Host: %s '
- ,'Connection: Close '
- ]
-
- def __init__(self):
- self.sendmsg = ''
- for m in self.headers:
- self.sendmsg += m + '\n'
- self.sendmsg += '\n\n'
-
- def request(self, host, port=80, location='/'):
- sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- sock.connect((host, port))
- sock.send(self.sendmsg%(location, host))
- print "Request."
- print self.sendmsg%(location, host)
- fullydata = ''
- while 1:
- res = sock.recv(1024)
- if res == '': break
- fullydata += res
- sock.close()
- return fullydata
-
- def parse(self, data):
- for d in data.splitlines():
- if d.startswith('Location: '):
- return d[9:]
- return None
-
- def getLocationData(self, url):
- url_list,host,location = None,None,None
- try:
- url = url[url.find(':')+3:]
- url_list = url.split('/')
- host = url_list[0]
- location = url[len(url_list[0]):]
- except Exception, err_msg:
- print err_msg
- return None
- html = self.request(host=host, location=location)
- return self.parse(html)
-
-class OpCodeSet:
- def __init__(self):
- self._opcode_ = {
- "OP_UNKNOWN" : 0x0000
- ,"OP_HBBTV_EXIT" : 0x0001
- ,"OP_HBBTV_OPEN_URL" : 0x0002
- ,"OP_HBBTV_LOAD_AIT" : 0x0003
- ,"OP_HBBTV_UNLOAD_AIT" : 0x0004
- ,"OP_HBBTV_FULLSCREEN" : 0x0005
- ,"OP_HBBTV_TITLE" : 0x0006
- ,"OP_HBBTV_RETRY_OPEN_URL" : 0x0009
- ,"OP_HBBTV_CHANGE_CHANNEL" : 0x000A
- ,"OP_OIPF_GET_CHANNEL_INFO_URL" : 0x0101
- ,"OP_OIPF_GET_CHANNEL_INFO_AIT" : 0x0102
- ,"OP_OIPF_GET_CHANNEL_INFO_LIST": 0x0103
- ,"OP_VOD_URI" : 0x0201
- ,"OP_VOD_PLAY" : 0x0202
- ,"OP_VOD_STOP" : 0x0203
- ,"OP_VOD_PAUSE" : 0x0204
- ,"OP_VOD_STATUS" : 0x0205
- ,"OP_VOD_FORBIDDEN" : 0x0206
- ,"OP_VOD_STOPED" : 0x0207
- ,"OP_VOD_SPEED_CTRL" : 0x0208
- ,"OP_VOD_SEEK_CTRL" : 0x0209
- ,"OP_BROWSER_OPEN_URL" : 0x0301
- ,"OP_BROWSER_VKBD_REQ" : 0x0309
- ,"OP_BROWSER_VKBD_RES" : 0x030A
- ,"OP_BROWSER_VKBD_PASTE_REQ" : 0x030B
- ,"OP_BROWSER_VKBD_PASTE_KEY" : 0x030C
- ,"OP_BROWSER_VKBD_PASTE_MOUSE" : 0x030D
- ,"OP_BROWSER_MENU_REQ" : 0x030E
- ,"OP_BROWSER_MENU_RES" : 0x030F
- ,"OP_DVBAPP_VOL_UP" : 0x0401
- ,"OP_DVBAPP_VOL_DOWN" : 0x0402
- ,"OP_SYSTEM_OUT_OF_MEMORY" : 0x0501
- ,"OP_SYSTEM_NOTIFY_MY_PID" : 0x0502
- }
- self._opstr_ = {
- 0x0000 : "OP_UNKNOWN"
- ,0x0001 : "OP_HBBTV_EXIT"
- ,0x0002 : "OP_HBBTV_OPEN_URL"
- ,0x0003 : "OP_HBBTV_LOAD_AIT"
- ,0x0004 : "OP_HBBTV_UNLOAD_AIT"
- ,0x0005 : "OP_HBBTV_FULLSCREEN"
- ,0x0006 : "OP_HBBTV_TITLE"
- ,0x0009 : "OP_HBBTV_RETRY_OPEN_URL"
- ,0x000A : "OP_HBBTV_CHANGE_CHANNEL"
- ,0x0101 : "OP_OIPF_GET_CHANNEL_INFO_URL"
- ,0x0102 : "OP_OIPF_GET_CHANNEL_INFO_AIT"
- ,0x0103 : "OP_OIPF_GET_CHANNEL_INFO_LIST"
- ,0x0201 : "OP_VOD_URI"
- ,0x0202 : "OP_VOD_PLAY"
- ,0x0203 : "OP_VOD_STOP"
- ,0x0204 : "OP_VOD_PAUSE"
- ,0x0205 : "OP_VOD_STATUS"
- ,0x0206 : "OP_VOD_FORBIDDEN"
- ,0x0207 : "OP_VOD_STOPED"
- ,0x0208 : "OP_VOD_SPEED_CTRL"
- ,0x0209 : "OP_VOD_SEEK_CTRL"
- ,0x0301 : "OP_BROWSER_OPEN_URL"
- ,0x0309 : "OP_BROWSER_VKBD_REQ"
- ,0x030A : "OP_BROWSER_VKBD_RES"
- ,0x030B : "OP_BROWSER_VKBD_PASTE_REQ"
- ,0x030C : "OP_BROWSER_VKBD_PASTE_KEY"
- ,0x030D : "OP_BROWSER_VKBD_PASTE_MOUSE"
- ,0x030E : "OP_BROWSER_MENU_REQ"
- ,0x030F : "OP_BROWSER_MENU_RES"
- ,0x0401 : "OP_DVBAPP_VOL_UP"
- ,0x0402 : "OP_DVBAPP_VOL_DOWN"
- ,0x0501 : "OP_SYSTEM_OUT_OF_MEMORY"
- ,0x0502 : "OP_SYSTEM_NOTIFY_MY_PID"
- }
-
- def get(self, opstr):
- try:
- return self._opcode_[opstr]
- except: pass
- return self._opcode_["OP_UNKNOWN"]
-
- def what(self, opcode):
- try:
- return self._opstr_[opcode]
- except: pass
- return self._opstr_["0x0000"]
-
-class SocketParams:
- def __init__(self):
- self.protocol = None
- self.type = None
- self.addr = None
- self.buf_size = 4096
- self.handler = None
- self.timeout = 5
- self.destroy = None
-
-class StreamServer:
- def __init__(self, params):
- self._protocol = params.protocol
- self._type = params.type
- self._addr = params.addr
- self._buf_size = params.buf_size
- self._handler = params.handler
- self._timeout = params.timeout
- self._destroy = params.destroy
-
- self._terminated = False
- self._server_thread = None
-
- self.onHbbTVCloseCB = []
- self.onSetPageTitleCB = []
-
- def __del__(self):
- if self._destroy is not None:
- self._destroy(self._addr)
-
- def stop(self):
- self._terminated = True
- if self._server_thread is not None:
- self._server_thread.join()
- self._server_thread = None
-
- def start(self):
- self._socket = socket.socket(self._protocol, self._type)
- self._socket.settimeout(self._timeout)
- self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- self._socket.bind(self._addr)
- self._socket.listen(True)
-
- self._server_thread = threading.Thread(target=self._listen)
- self._server_thread.start()
-
- def _listen(self):
- select_list = [self._socket]
- def _accept():
- try:
- conn, addr = self._socket.accept()
- self._client(conn, addr)
- except Exception, ErrMsg:
- print "ServerSocket Error >>", ErrMsg
- pass
-
- while not self._terminated:
- readable, writable, errored = select.select(select_list, [], [], self._timeout)
- for s in readable:
- if s is self._socket:
- _accept()
-
- def _client(self, conn, addr):
- try:
- send_data = ''
- received_data = conn.recv(self._buf_size)
- if self._handler is not None and not strIsEmpty(received_data):
- send_data = self._handler.doHandle(received_data, self.onHbbTVCloseCB, self.onSetPageTitleCB)
- self._send(conn, send_data)
- except Exception, ErrMsg:
- try: conn.close()
- except:pass
- if self._handler is not None:
- self._handler.printError(ErrMsg)
- def _send(self, conn, data) :
- conn.send(data)
- conn.close()
-
-class ServerFactory:
- def doListenUnixTCP(self, name, handler):
- def destroy(name):
- if os.path.exists(name):
- os.unlink(name)
- print "Removed ", name
- destroy(name)
-
- params = SocketParams()
- params.protocol = socket.AF_UNIX
- params.type = socket.SOCK_STREAM
- params.addr = name
- params.handler = handler
- params.destroy = destroy
-
- streamServer = StreamServer(params)
- streamServer.start()
- return streamServer
-
- def doListenInetTCP(self, ip, port, handler):
- print "Not implemented yet!!"
- def doListenUnixDGRAM(self, name, handler):
- print "Not implemented yet!!"
- def doListenInetDGRAM(self, ip, port, handler):
- print "Not implemented yet!!"
-
-class Handler:
- def doUnpack(self, data):
- return _unpack(data)
-
- def doPack(self, opcode, params, reserved=0):
- return _pack(opcode, params, reserved)
-
- def doHandle(self, data, onCloseCB):
- opcode, params = 0x0, 'Invalid Request!!'
- return _pack(opcode, params)
-
- def printError(self, reason):
- print reason
-
-class BrowserCommandUtil(OpCodeSet):
- def __init__(self):
- self._fd = None
- OpCodeSet.__init__(self)
-
- def isConnected(self):
- if self._fd is None:
- return False
- return True
-
- def doConnect(self, filename):
- if not os.path.exists(filename):
- print "File not exists :", filename
- return False
- try:
- self._fd = os.open(filename, os.O_WRONLY|os.O_NONBLOCK)
- if self._fd is None:
- print "Fail to open file :", filename
- return False
- except Exception, ErrMsg:
- print ErrMsg
- self._fd = None
- return False
- return True
-
- def doDisconnect(self):
- if self._fd is None:
- return
- os.close(self._fd)
- self._fd = None
-
- def doSend(self, command, params=None, reserved=0):
- if self._fd is None:
- print "No found pipe!!"
- return False
- data = ''
- try:
- data = _pack(self.get(command), params, reserved)
- if data is None:
- return False
- os.write(self._fd, data)
- print "Send OK!! :", command
- except: return False
- return True
-
- def sendCommand(self, command, params=None, reserved=0):
- if not self.isConnected():
- global COMMAND_PATH
- self.doConnect(COMMAND_PATH)
- result = self.doSend(command, params, reserved)
- self.doDisconnect()
- return result