[hbbtv] add channel change on hbbtv epg.
[vuplus_dvbapp] / lib / python / Plugins / Extensions / HbbTV / plugin.py
index b9ddd36..8b6fa06 100644 (file)
@@ -7,6 +7,7 @@ from Screens.MessageBox import MessageBox
 from Screens.InfoBarGenerics import InfoBarNotifications
 from Screens.VirtualKeyBoard import VirtualKeyBoard
 from Screens.HelpMenu import HelpableScreen
+from Screens.ChannelSelection import service_types_tv
 
 from Components.PluginComponent import plugins
 from Components.Button import Button
@@ -20,7 +21,7 @@ from Components.VolumeControl import VolumeControl
 from Components.Pixmap import Pixmap
 from Components.config import config, ConfigSubsection, ConfigPosition, getConfigListEntry, ConfigBoolean, ConfigInteger, ConfigText, ConfigSelection, configfile, getCharValue
 
-from enigma import eTimer, eConsoleAppContainer, getDesktop, eServiceReference, iPlayableService, iServiceInformation, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getPrevAsciiCode, eRCInput, fbClass
+from enigma import eTimer, eConsoleAppContainer, getDesktop, eServiceReference, iPlayableService, iServiceInformation, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER, RT_VALIGN_CENTER, getPrevAsciiCode, eRCInput, fbClass, eServiceCenter
 
 from bookmark import BookmarkManager, BookmarkData, CategoryData
 
@@ -31,6 +32,8 @@ strIsEmpty = lambda x: x is None or len(x) == 0
 HBBTVAPP_PATH = "/usr/local/hbb-browser"
 COMMAND_PATH = '/tmp/.sock.hbbtv.cmd'
 
+_g_helper = None
+
 class GlobalValues:
        command_util   = None
        command_server = None
@@ -189,6 +192,7 @@ class OpCodeSet:
                        ,"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
@@ -223,6 +227,7 @@ class OpCodeSet:
                        ,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"
@@ -441,6 +446,7 @@ class HandlerHbbTV(Handler):
                         0x0001 : self._cb_handleCloseHbbTVBrowser
                        ,0x0006 : self._cb_handleSetPageTitle
                        ,0x0009 : self._cb_handleHbbTVRetryOpen
+                       ,0x000A : self._cb_handleHbbTVChangeChannel
                        ,0x0101 : self._cb_handleGetChannelInfoForUrl
                        ,0x0102 : self._cb_handleGetChannelInfoForAIT
                        ,0x0103 : self._cb_handleGetChannelInfoList
@@ -504,8 +510,23 @@ class HandlerHbbTV(Handler):
                self._on_set_title_cb = None
                return self.doPack(opcode, params, reserved)
 
+       def _cb_handleHbbTVChangeChannel(self, opcode, data):
+               self._handle_dump(self._cb_handleHbbTVChangeChannel, opcode, data)
+               global _g_helper
+               if _g_helper is None: 
+                       return (0, "NOK")
+               dataItems = data.split(":")
+               sid  = dataItems[0]
+               tsid = dataItems[1]
+               if not _g_helper.doChangeChannel(sid, tsid):
+                       return (0, "NOK")
+
+
+               return (0, "OK")
+
        def _cb_handleBrowserMenuReq(self, opcode, data):
                self._handle_dump(self._cb_handleBrowserMenuReq, opcode, data)
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                browser = getPluginBrowser()
                if browser is not None:
@@ -546,11 +567,13 @@ class HandlerHbbTV(Handler):
                return (0, "OK")
 
        def _cb_virtualKeyboardClosed(self, data=None):
+               fbClass.getInstance().lock()
                eRCInput.getInstance().lock()
                command_util = getCommandUtil()
                command_util.sendCommand('OP_BROWSER_VKBD_RES', data)
        def _cb_handleShowVirtualKeyboard(self, opcode, data):
                self._handle_dump(self._cb_handleShowVirtualKeyboard, opcode, data)
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                if data == 0 or strIsEmpty(data):
                        data = ""
@@ -756,6 +779,7 @@ class HbbTVWindow(Screen, InfoBarNotifications):
                """
        def __init__(self, session, url=None, cbf=None, useAIT=False, profile=0):
                self._session = session
+               fbClass.getInstance().lock()
                eRCInput.getInstance().lock()
 
                Screen.__init__(self, session)
@@ -859,6 +883,7 @@ class HbbTVWindow(Screen, InfoBarNotifications):
                        if self._cb_closed_func is not None:
                                self._cb_closed_func()
                except: pass
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                self.close()
 
@@ -886,7 +911,7 @@ class HbbTVHelper(Screen):
                self._urls = None
                #self._stop_opera()
                #self._start_opera()
-               #self._restart_opera()
+               self._restart_opera()
 
                Screen.__init__(self, session)
                self._session = session
@@ -1048,6 +1073,35 @@ class HbbTVHelper(Screen):
                        print "Check Browser Running ERR :", ErrMsg
                return False
 
+       def doChangeChannel(self, _sid, _tsid):
+               root = eServiceReference(service_types_tv)
+               if root is None:
+                       return False
+               serviceList = eServiceCenter.getInstance().list(root)
+               if serviceList is None:
+                       return False    
+               while True:
+                       service = serviceList.getNext()
+                       if service is None or not service.valid():
+                               break
+
+                       #1:0:19:2840:3FB:1:C00000:0:0:0:
+                       serviceRef = service.toString()
+                       if strIsEmpty(serviceRef):
+                               continue
+                       serviceRefItems = serviceRef.split(":")
+                       if len(serviceRefItems) < 5:
+                               continue
+
+                       sid  = serviceRefItems[3]
+                       tsid = serviceRefItems[4]
+                       if sid == _sid and tsid == _tsid:
+                               self._session.nav.playService(eServiceReference(serviceRef))
+                               service = self._session.nav.getCurrentlyPlayingServiceReference()
+                               setBeforeService(service)
+                               return True
+               return False
+
 class OperaBrowserSetting:
        def __init__(self):
                self._settingFileName = '/usr/local/hbb-browser/home/setting.ini'
@@ -1189,7 +1243,7 @@ class BookmarkEditWindow(ConfigListScreen, Screen):
                self.mMode = _mode
                self.mType = _type
                self.mData = _data
-                self.session = session
+                self.mSession = session
                self.mBookmarkManager = _bm
 
                if _data is not None:
@@ -1215,25 +1269,60 @@ class BookmarkEditWindow(ConfigListScreen, Screen):
                self.menuItemUrl   = None
                self.menuItemName  = None
 
+               self.menuEntryName = None
+               self.menuEntryTitle = None
+               self.menuEntryUrl = None
+
                self.makeConfigList()
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
                self.setTitle('Bookmark ' + self.mMode)
+
+       def selectedItem(self):
+               currentPosition = self["config"].getCurrent()
+               if self.mType == BookmarkEditWindow.CATEGORY:
+                       return ("Name", self.menuItemName)
+               else:
+                       if currentPosition == self.menuEntryTitle:
+                               return ("Title", self.menuItemTitle)
+                       elif currentPosition == self.menuEntryUrl:
+                               return ("Url", self.menuItemUrl)
+               return None
+
+       def showMessageBox(self, text):
+               msg = "Invalid " + text + "!!(Empty)\nPlease, Input to the " + text + "."
+               self.mSession.openWithCallback(self.showVKeyWindow, MessageBox, msg, MessageBox.TYPE_INFO)
+               return False
+
+       def showVKeyWindow(self, data=None):
+               itemTitle = ""
+               itemValue = ""
+               selected = self.selectedItem()
+               if selected is not None:
+                       itemValue = selected[1].value
+                       if strIsEmpty(itemValue):
+                               itemValue = ""
+                       itemTitle = selected[0]
+
+               self.session.openWithCallback(self.cbVKeyWindow, VirtualKeyBoard, title=itemTitle, text=itemValue)
+
+       def cbVKeyWindow(self, data=None):
+               if data is not None:
+                       selected = self.selectedItem()
+                       if selected is not None:
+                               selected[1].setValue(data)
+
        def saveData(self):
                if self.mType == BookmarkEditWindow.CATEGORY:
                        if self.mMode == 'Add':
                                categoryName = self.menuItemName.value
                                if strIsEmpty(categoryName):
-                                       msg = "Invalid Category Name!!(Empty)\nPlease, Input to the Category Name."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
+                                       return self.showMessageBox("Category Name")
                                self.mBookmarkManager.addCategory(categoryName)
                        else:
                                if strIsEmpty(self.menuItemName.value):
-                                       msg = "Invalid Category Name!!(Empty)\nPlease, Input to the Category Name."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
+                                       return self.showMessageBox("Category Name")
                                self.mData.mName = self.menuItemName.value
                                self.mBookmarkManager.updateCategory(self.mData)
                else:
@@ -1241,19 +1330,24 @@ class BookmarkEditWindow(ConfigListScreen, Screen):
                                bookmarkTitle = self.menuItemTitle.value
                                bookmarkUrl   = self.menuItemUrl.value
                                if strIsEmpty(bookmarkTitle):
-                                       msg = "Invalid Bookmark Title!!(Empty)\nPlease input to the Bookmark Title."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
+                                       self["config"].setCurrentIndex(0)
+                                       return self.showMessageBox("Bookmark Title")
+                               if strIsEmpty(bookmarkUrl):
+                                       self["config"].setCurrentIndex(1)
+                                       return self.showMessageBox("Bookmark URL")
                                self.mBookmarkManager.addBookmark(bookmarkTitle, bookmarkUrl, self.mData.mParent)
                        else:
                                if strIsEmpty(self.menuItemTitle.value):
-                                       msg = "Invalid Bookmark Title!!(Empty)\nPlease input to the Bookmark Title."
-                                       self.mSession.open(MessageBox, msg, MessageBox.TYPE_INFO)
-                                       return False
+                                       self["config"].setCurrentIndex(0)
+                                       return self.showMessageBox("Bookmark Title")
+                               if strIsEmpty(self.menuItemUrl.value):
+                                       self["config"].setCurrentIndex(1)
+                                       return self.showMessageBox("Bookmark URL")
                                self.mData.mTitle = self.menuItemTitle.value
                                self.mData.mUrl   = self.menuItemUrl.value
                                self.mBookmarkManager.updateBookmark(self.mData)
                return True
+
        def keyGreen(self):
                if not self.saveData():
                        return
@@ -1269,15 +1363,19 @@ class BookmarkEditWindow(ConfigListScreen, Screen):
 
                if self.mType == BookmarkEditWindow.CATEGORY:
                        self.menuItemName = ConfigText(default=self.mData.mName, visible_width=65, fixed_size=False)
-                       menuEntryName  = getConfigListEntry(_("Name"), self.menuItemName)
-                       self.menulist.append(menuEntryName)
+
+                       self.menuEntryName  = getConfigListEntry(_("Name"), self.menuItemName)
+
+                       self.menulist.append(self.menuEntryName)
                else:
                        self.menuItemTitle = ConfigText(default=self.mData.mTitle, visible_width=65, fixed_size=False)
                        self.menuItemUrl   = ConfigText(default=self.mData.mUrl, visible_width=65, fixed_size=False)
-                       menuEntryTitle = getConfigListEntry(_("Title"), self.menuItemTitle)
-                       menuEntryUrl   = getConfigListEntry(_("Url"), self.menuItemUrl)
-                       self.menulist.append(menuEntryTitle)
-                       self.menulist.append(menuEntryUrl)
+
+                       self.menuEntryTitle = getConfigListEntry(_("Title"), self.menuItemTitle)
+                       self.menuEntryUrl   = getConfigListEntry(_("Url"), self.menuItemUrl)
+
+                       self.menulist.append(self.menuEntryTitle)
+                       self.menulist.append(self.menuEntryUrl)
                        
                self["config"].list = self.menulist
                self["config"].l.setList(self.menulist)
@@ -1346,16 +1444,20 @@ class OperaBrowserBookmarkWindow(Screen):
                self.updateBookmarkList()
        def getParentCategory(self):
                idx = self["bookmarklist"].getSelectedIndex()
-               while idx >= 0:
-                       data = self.mBookmarkList[idx][0].strip()
-                       if data[0] == '#':
-                               return self.mBookmarkList[idx][1]
-                       idx -= 1
+               try:
+                       while idx >= 0:
+                               data = self.mBookmarkList[idx][0].strip()
+                               if data[0] == '#':
+                                       return self.mBookmarkList[idx][1]
+                               idx -= 1
+               except: pass
                return None
        def isCategoryItem(self):
-               head = self["bookmarklist"].getCurrent()[0].strip()
-               if head[0] == '#':
-                       return True
+               try:
+                       head = self["bookmarklist"].getCurrent()[0].strip()
+                       if head[0] == '#':
+                               return True
+               except: pass
                return False
        def keyNumber(self):
                data = self["bookmarklist"].getCurrent()[1]
@@ -1537,7 +1639,6 @@ class BrowserHelpWindow(Screen, HelpableScreen):
        def keyBlue(self):
                self.setHelpModeActions(self.MODE_KEYBOARD)
 
-_g_helper = None
 class OperaBrowser(Screen):
        MENUBAR_ITEM_WIDTH  = 150
        MENUBAR_ITEM_HEIGHT = 30
@@ -1685,6 +1786,7 @@ class OperaBrowser(Screen):
                self._on_setPageTitle('Opera Browser')
                self.enableRCMouse(False)
                self.toggleMainScreen()
+               fbClass.getInstance().unlock()
                eRCInput.getInstance().unlock()
                self._terminatedBrowser = True
                self._enableKeyEvent = True
@@ -1711,6 +1813,7 @@ class OperaBrowser(Screen):
                        command_server.onHbbTVCloseCB.append(self._on_close_window)
                self.toggleMainScreen()
                self.enableRCMouse(True)
+               fbClass.getInstance().lock()
                eRCInput.getInstance().lock()
                command_util = getCommandUtil()
                command_util.sendCommand('OP_BROWSER_OPEN_URL', data)
@@ -1755,6 +1858,11 @@ class OperaBrowser(Screen):
                        url = ''
                self.session.open(OperaBrowserPreferenceWindow, url)
        def _cmd_on_OpenStartpage(self):
+               global _g_helper
+               if not _g_helper._is_browser_running():
+                       message = "Opera Browser was not running.\nPlease running browser using [File]>[Start/Stop] menu."
+                       self.session.open(MessageBox, message, MessageBox.TYPE_INFO)
+                       return
                start = 'http://vuplus.com'
                try:
                        start = OperaBrowserSetting().getData()['start']
@@ -1864,6 +1972,7 @@ class OperaBrowser(Screen):
        def keyCancel(self):
                if not self._terminatedBrowser:
                        #self._session.openWithCallback(self._cb_virtualKeyboardClosed, VirtualKeyBoard, title=("Please enter URL here"), text="")
+                       fbClass.getInstance().lock()
                        eRCInput.getInstance().lock()
                        if self.toggleListViewFlag:
                                self.toggleMainScreen()
@@ -1901,6 +2010,7 @@ def auto_start_main(reason, **kwargs):
                command_server.stop()
 
 def session_start_main(session, reason, **kwargs):
+       fbClass.getInstance().unlock()
        eRCInput.getInstance().unlock()
        global _g_helper
        _g_helper = session.open(HbbTVHelper)