Merge commit 'dm/experimental' into test branch
authorschon <schon@dev03-server>
Tue, 15 Mar 2011 07:05:31 +0000 (16:05 +0900)
committerschon <schon@dev03-server>
Tue, 15 Mar 2011 07:05:31 +0000 (16:05 +0900)
Conflicts:
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Screens/SleepTimerEdit.py

18 files changed:
1  2 
RecordTimer.py
data/keymap.xml
lib/dvb/dvb.cpp
lib/dvb/frontend.cpp
lib/python/Plugins/Extensions/DVDBurn/Process.py
lib/python/Plugins/Extensions/MediaPlayer/plugin.py
lib/python/Plugins/SystemPlugins/CommonInterfaceAssignment/plugin.py
lib/python/Plugins/SystemPlugins/CrashlogAutoSubmit/plugin.py
lib/python/Plugins/SystemPlugins/OldSoftwareUpdate/plugin.py
lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
lib/python/Plugins/SystemPlugins/SoftwareManager/plugin.py
lib/python/Plugins/SystemPlugins/Videomode/plugin.py
lib/python/Screens/AudioSelection.py
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBarGenerics.py
lib/python/Screens/PluginBrowser.py
lib/python/Screens/SleepTimerEdit.py
main/bsod.cpp

diff --combined RecordTimer.py
@@@ -297,13 -297,13 +297,13 @@@ class RecordTimerEntry(timer.TimerEntry
                                self.record_service = None
                        if self.afterEvent == AFTEREVENT.STANDBY:
                                if not Screens.Standby.inStandby: # not already in standby
 -                                      Notifications.AddNotificationWithCallback(self.sendStandbyNotification, MessageBox, _("A finished record timer wants to set your\nDreambox to standby. Do that now?"), timeout = 20)
 +                                      Notifications.AddNotificationWithCallback(self.sendStandbyNotification, MessageBox, _("A finished record timer wants to set your\nSTB to standby. Do that now?"), timeout = 20)
                        elif self.afterEvent == AFTEREVENT.DEEPSTANDBY:
                                if not Screens.Standby.inTryQuitMainloop: # not a shutdown messagebox is open
                                        if Screens.Standby.inStandby: # in standby
                                                RecordTimerEntry.TryQuitMainloop() # start shutdown handling without screen
                                        else:
 -                                              Notifications.AddNotificationWithCallback(self.sendTryQuitMainloopNotification, MessageBox, _("A finished record timer wants to shut down\nyour Dreambox. Shutdown now?"), timeout = 20)
 +                                              Notifications.AddNotificationWithCallback(self.sendTryQuitMainloopNotification, MessageBox, _("A finished record timer wants to shut down\nyour STB. Shutdown now?"), timeout = 20)
                        return True
  
        def setAutoincreaseEnd(self, entry = None):
                timersanitycheck = TimerSanityCheck(NavigationInstance.instance.RecordTimer.timer_list, dummyentry)
                if not timersanitycheck.check():
                        simulTimerList = timersanitycheck.getSimulTimerList()
-                       new_end = simulTimerList[1].begin
-                       del simulTimerList
-                       new_end -= 30                           # 30 Sekunden Prepare-Zeit lassen
-               del dummyentry
+                       if simulTimerList is not None and len(simulTimerList) > 1:
+                               new_end = simulTimerList[1].begin
+                               new_end -= 30                           # 30 Sekunden Prepare-Zeit lassen
                if new_end <= time():
                        return False
                self.end = new_end
                return True
-       
-       
        def sendStandbyNotification(self, answer):
                if answer:
                        Notifications.AddNotification(Screens.Standby.Standby)
diff --combined data/keymap.xml
@@@ -90,8 -90,6 +90,8 @@@
                        <key id="KEY_RECORD" mapto="instantRecord" flags="m" />
                </device>
                <device name="dreambox remote control (native)">
 +<!--  ikseong insert KEY_RECORD action        -->
 +                      <key id="KEY_RECORD" mapto="instantRecord" flags="m" />
                        <key id="KEY_RED" mapto="instantRecord" flags="b" />
                </device>
        </map>
        <map context="InputAsciiActions">
                <device name="Console">
                        <key id="KEY_ASCII" mapto="gotAsciiCode" flags="mr" />
+               </device>
+               <device name="SDL">
+                       <key id="KEY_ASCII" mapto="gotAsciiCode" flags="mr" />
                </device>
        </map>
  
                <key id="KEY_ENTER" mapto="ok" flags="m" />
                <key id="KEY_EXIT" mapto="back" flags="m" />
                <key id="KEY_ESC" mapto="back" flags="m" />
 +<!--  ikseong for factory test        -->
 +              <key id="KEY_SUBTITLE" mapto="test" flags="m" />
 +              <key id="KEY_RADIO" mapto="testexit" flags="m" />
 +              <key id="KEY_PAUSE" mapto="agingend" flags="m" />
 +              <key id="KEY_STOP" mapto="agingfinish" flags="m" />             
 +              <key id="KEY_GREEN" mapto="agingstart" flags="m" />
        </map>
        
        <map context="InfobarMenuActions">
                <key id="KEY_VIDEO" mapto="showMovies" flags="m" />
                <key id="KEY_RADIO" mapto="showRadio" flags="m" />
                <key id="KEY_TV" mapto="showTv" flags="m" />
 +<!--  ikseong insert KEY_SUBTITLE action for subtitle hotkey  -->
 +              <key id="KEY_SUBTITLE" mapto="showSubtitle" flags="m" />
        </map>
  
        <map context="InfobarAudioSelectionActions">
                        <key id="KEY_BLUE" mapto="seekFwd" flags="b" />
                        <key id="KEY_RED" mapto="seekBackManual" flags="l" />
                        <key id="KEY_BLUE" mapto="seekFwdManual" flags="l" />
 +<!--  ikseong insert KEY_PAUSE, KEY_PLAY, KEY_REWIND, KEY_FASTFORWARD -->
 +                      <key id="KEY_PAUSE" mapto="pauseService" flags="m" />
 +                      <key id="KEY_PLAY" mapto="playpauseService" flags="m" />
 +                      <key id="KEY_REWIND" mapto="seekBack" flags="b" />
 +                      <key id="KEY_FASTFORWARD" mapto="seekFwd" flags="b" />
 +                      <key id="KEY_REWIND" mapto="seekBackManual" flags="l" />
 +                      <key id="KEY_FASTFORWARD" mapto="seekFwdManual" flags="l" />
                </device>
                <device name="dreambox advanced remote control (native)">
                        <key id="KEY_PLAY" mapto="playpauseService" flags="m" />
                        <key id="KEY_BLUE" mapto="seekFwd" flags="b" />
                        <key id="KEY_RED" mapto="seekBackManual" flags="l" />
                        <key id="KEY_BLUE" mapto="seekFwdManual" flags="l" />
 +<!--  ikseong insert KEY_REWIND, KEY_FASTFORWARD      -->
 +                      <key id="KEY_REWIND" mapto="seekBack" flags="b" />
 +                      <key id="KEY_FASTFORWARD" mapto="seekFwd" flags="b" />
 +                      <key id="KEY_REWIND" mapto="seekBackManual" flags="l" />
 +                      <key id="KEY_FASTFORWARD" mapto="seekFwdManual" flags="l" />
                </device>
                <device name="dreambox advanced remote control (native)">
                        <key id="KEY_PREVIOUSSONG" mapto="seekBack" flags="b" />
                <device name="dreambox remote control (native)">
                        <key id="KEY_YELLOW" mapto="timeshiftStart" flags="b" />
                        <key id="KEY_TV" mapto="timeshiftStop" flags="m" />
 +<!--  ikseong insert KEY_PAUSE, KEY_PLAY, KEY_STOP    -->
 +                      <key id="KEY_PLAY" mapto="timeshiftStart" flags="m" />
 +                      <key id="KEY_PAUSE" mapto="timeshiftStart" flags="m" />
 +                      <key id="KEY_STOP" mapto="timeshiftStop" flags="m" />
                </device>
                <device name="dreambox advanced remote control (native)">
                        <key id="KEY_PLAY" mapto="timeshiftStart" flags="m" />
                <device name="dreambox remote control (native)">
                        <key id="KEY_RED" mapto="timeshiftActivateEnd" flags="b" />
                        <key id="KEY_YELLOW" mapto="timeshiftActivateEndAndPause" flags="b" />
 +<!--  ikseong insert KEY_PAUSE, KEY_PLAY, KEY_REWIND  -->
 +                      <key id="KEY_PLAY" mapto="timeshiftActivateEndAndPause" flags="m" />
 +                      <key id="KEY_REWIND" mapto="timeshiftActivateEnd" flags="m" />
 +                      <key id="KEY_PAUSE" mapto="timeshiftActivateEndAndPause" flags="m" />
                </device>
                <device name="dreambox advanced remote control (native)">
                        <key id="KEY_PREVIOUSSONG" mapto="timeshiftActivateEnd" flags="m" />
        <map context="MoviePlayerActions">
                <device name="dreambox remote control (native)">
                        <key id="KEY_TV" mapto="leavePlayer" flags="m" />
 +                      <key id="KEY_STOP" mapto="leavePlayer" flags="m" />
 +<!--  ikseong insert KEY_SUBTITLE action for subtitle hotkey  -->
 +                      <key id="KEY_SUBTITLE" mapto="showSubtitle" flags="m" />                
                </device>
                <device name="dreambox advanced remote control (native)">
                        <key id="KEY_TV" mapto="leavePlayer" flags="m" />
                        <key id="KEY_RADIO" mapto="shift_record" flags="l" />
                        <key id="KEY_PREVIOUS" mapto="previous" flags="m" />
                        <key id="KEY_NEXT" mapto="next" flags="m" />
 +<!--  ikseong insert KEY_PAUSE, KEY_PLAY, KEY_STOP, KEY_RECORD, KEY_REWIND, KEY_FASTFORWARD   -->
 +                      <key id="KEY_PAUSE" mapto="pause" flags="m" />
 +                      <key id="KEY_PLAY" mapto="play" flags="m" />
 +                      <key id="KEY_STOP" mapto="stop" flags="b" />
 +                      <key id="KEY_STOP" mapto="shift_stop" flags="l" />
 +                      <key id="KEY_RECORD" mapto="shift_record" flags="l" />
                </device>
                <device name="dreambox advanced remote control (native)">
                        <key id="KEY_PLAYPAUSE" mapto="pause" flags="m" />
diff --combined lib/dvb/dvb.cpp
index fbca6f3,6f9a67f..61924ad
mode 100755,100644..100755
@@@ -98,6 -98,8 +98,8 @@@ eDVBResourceManager::eDVBResourceManage
                m_boxtype = DM500HD;
        else if (!strncmp(tmp, "dm800se\n", rd))
                m_boxtype = DM800SE;
+       else if (!strncmp(tmp, "dm7020hd\n", rd))
+               m_boxtype = DM7020HD;
        else {
                eDebug("boxtype detection via /proc/stb/info not possible... use fallback via demux count!\n");
                if (m_demux.size() == 3)
@@@ -464,7 -466,7 +466,7 @@@ RESULT eDVBResourceManager::allocateDem
  
        ePtr<eDVBRegisteredDemux> unused;
  
-       if (m_boxtype == DM800 || m_boxtype == DM500HD || m_boxtype == DM800SE) // dm800 / 500hd
+       if (m_boxtype == DM800) // dm800
        {
                cap |= capHoldDecodeReference; // this is checked in eDVBChannel::getDemux
                for (; i != m_demux.end(); ++i, ++n)
                        }
                }
        }
-       else if (m_boxtype == DM8000)
+       else if (m_boxtype == DM8000 || m_boxtype == DM500HD || m_boxtype == DM800SE || m_boxtype == DM7020HD)
        {
                cap |= capHoldDecodeReference; // this is checked in eDVBChannel::getDemux
                for (; i != m_demux.end(); ++i, ++n)
@@@ -1184,22 -1186,8 +1186,22 @@@ void eDVBChannel::frontendStateChanged(
                }
        } else if (state == iDVBFrontend::stateFailed)
        {
 +#ifdef BUILD_VUPLUS /* ikseong  */
 +              if (m_current_frontend_parameters)
 +              {
 +                      eDebug("OURSTATE: lost lock, trying to retune");
 +                      ourstate = state_tuning;
 +                      m_frontend->get().tune(*m_current_frontend_parameters);
 +              } 
 +              else
 +              {
 +                      eDebug("OURSTATE: failed");
 +                      ourstate = state_failed;
 +              }
 +#else
                eDebug("OURSTATE: failed");
                ourstate = state_failed;
 +#endif                
        } else
                eFatal("state unknown");
  
@@@ -1804,14 -1792,28 +1806,28 @@@ RESULT eDVBChannel::playSource(ePtr<iTs
                /* (this codepath needs to be improved anyway.) */
  #if HAVE_DVB_API_VERSION < 3
                m_pvr_fd_dst = open("/dev/pvr", O_WRONLY);
- #else
-               m_pvr_fd_dst = open("/dev/misc/pvr", O_WRONLY);
- #endif
                if (m_pvr_fd_dst < 0)
                {
-                       eDebug("can't open /dev/misc/pvr - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved.
+                       eDebug("can't open /dev/pvr - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved.
+                       return -ENODEV;
+               }
+ #else
+               ePtr<eDVBAllocatedDemux> &demux = m_demux ? m_demux : m_decoder_demux;
+               if (demux)
+               {
+                       m_pvr_fd_dst = demux->get().openDVR(O_WRONLY);
+                       if (m_pvr_fd_dst < 0)
+                       {
+                               eDebug("can't open /dev/dvb/adapterX/dvrX - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved.
+                               return -ENODEV;
+                       }
+               }
+               else
+               {
+                       eDebug("no demux allocated yet.. so its not possible to open the dvr device!!");
                        return -ENODEV;
                }
+ #endif
        }
  
        m_pvr_thread = new eDVBChannelFilePush();
diff --combined lib/dvb/frontend.cpp
index 013e23b,b5de46c..47e1ab5
mode 100755,100644..100755
@@@ -490,11 -490,6 +490,11 @@@ void eDVBFrontend::reopenFrontend(
        openFrontend();
  }
  
 +#ifdef BUILD_VUPLUS /* ikseong */
 +int frontend0_fd;
 +int frontend1_fd;
 +#endif
 +
  int eDVBFrontend::openFrontend()
  {
        if (m_state != stateClosed)
                                eWarning("failed! (%s) %m", m_filename);
                                return -1;
                        }
 +#ifdef BUILD_VUPLUS /* ikseong */
 +                      else
 +                      {                               
 +                              if (m_dvbid==0)
 +                                      frontend0_fd = m_fd;
 +                              else if (m_dvbid==1)
 +                                      frontend1_fd = m_fd;
 +                      }
 +#endif
                }
        }
        else
@@@ -753,10 -739,6 +753,10 @@@ void eDVBFrontend::timeout(
        m_tuning = 0;
        if (m_state == stateTuning)
        {
 +#ifdef BUILD_VUPLUS /* ikseong  */
 +              eDVBFrontend *sec_fe = this;
 +              sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc
 +#endif
                m_state = stateFailed;
                m_stateChanged(this);
        }
@@@ -1878,11 -1860,11 +1878,11 @@@ int eDVBFrontend::tuneLoopInt()  // cal
                                                int slotid = sec_fe->m_slotid;
                                                // FIXMEEEEEE hardcoded i2c devices for dm7025 and dm8000
                                                if (slotid < 2)
-                                                       sprintf(dev, "/dev/i2c/%d", slotid);
+                                                       sprintf(dev, "/dev/i2c-%d", slotid);
                                                else if (slotid == 2)
-                                                       sprintf(dev, "/dev/i2c/2"); // first nim socket on DM8000 use /dev/i2c/2
+                                                       sprintf(dev, "/dev/i2c-2"); // first nim socket on DM8000 use /dev/i2c-2
                                                else if (slotid == 3)
-                                                       sprintf(dev, "/dev/i2c/4"); // second nim socket on DM8000 use /dev/i2c/4
+                                                       sprintf(dev, "/dev/i2c-4"); // second nim socket on DM8000 use /dev/i2c-4
                                                int fd = ::open(dev, O_RDWR);
  
                                                unsigned char data[2];
index f1f5e73,a928ae2..816551c
mode 100755,100644..100755
@@@ -85,7 -85,7 +85,7 @@@ class DemuxTask(Task)
                title = job.project.titles[job.i]
                self.global_preconditions.append(DiskspacePrecondition(title.estimatedDiskspace))
                self.setTool("projectx")
-               self.args += [inputfile, "-demux", "-out", self.job.workspace ]
+               self.args += [inputfile, "-demux", "-set", "ExportPanel.Streamtype.Subpicture=0", "-set", "ExportPanel.Streamtype.Teletext=0", "-out", self.job.workspace ]
                self.end = 300
                self.prog_state = 0
                self.weighting = 1000
                print "[DemuxTask::cleanup]"
                self.mplex_streamfiles = [ self.mplex_videofile ]
                for pid in self.relevantAudioPIDs:
-                       self.mplex_streamfiles.append(self.mplex_audiofiles[pid])
+                       if pid in self.mplex_audiofiles:
+                               self.mplex_streamfiles.append(self.mplex_audiofiles[pid])
                print self.mplex_streamfiles
  
                if failed:
@@@ -901,7 -902,7 +902,7 @@@ class DVDJob(Job)
                                tool = "genisoimage"
                                isopathfile = getISOfilename(self.project.settings.isopath.getValue(), volName)
                                burnargs = [ "-o", isopathfile ]
 -                      burnargs += [ "-dvd-video", "-publisher", "Dreambox", "-V", volName, self.workspace + "/dvd" ]
 +                      burnargs += [ "-dvd-video", "-publisher", "STB", "-V", volName, self.workspace + "/dvd" ]
                        BurnTask(self, burnargs, tool)
                RemoveDVDFolder(self)
  
@@@ -947,7 -948,7 +948,7 @@@ class DVDdataJob(Job)
                        burnargs += ["-iso-level", "4", "-allow-limited-size" ]
                elif self.project.settings.dataformat.getValue() == "udf":
                        burnargs += ["-udf", "-allow-limited-size" ]
 -              burnargs += [ "-publisher", "Dreambox", "-V", volName, "-follow-links", self.workspace ]
 +              burnargs += [ "-publisher", "STB", "-V", volName, "-follow-links", self.workspace ]
                BurnTask(self, burnargs, tool)
                RemoveDVDFolder(self)
  
@@@ -968,6 -969,6 +969,6 @@@ class DVDisoJob(Job)
                        burnargs = [ "-Z", "/dev/" + harddiskmanager.getCD(), "-dvd-compat" ]
                        if getSize(imagepath)/(1024*1024) > self.project.MAX_SL:
                                burnargs += [ "-use-the-force-luke=4gms", "-speed=1", "-R" ]
 -                      burnargs += [ "-dvd-video", "-publisher", "Dreambox", "-V", volName, imagepath ]
 +                      burnargs += [ "-dvd-video", "-publisher", "STB", "-V", volName, imagepath ]
                tool = "growisofs"
                BurnTask(self, burnargs, tool)
index 13599a0,6ff1c5a..75fba2d
mode 100755,100644..100644
@@@ -137,9 -137,8 +137,9 @@@ class MediaPlayer(Screen, InfoBarBase, 
  
                self.seek_target = None
  
 -              from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier
 -              hotplugNotifier.append(self.hotplugCB)
 +#     ikseong
 +#             from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier
 +#             hotplugNotifier.append(self.hotplugCB)
  
                class MoviePlayerActionMap(NumberActionMap):
                        def __init__(self, player, contexts = [ ], actions = { }, prio=0):
                                "prevBouquet": (self.switchToPlayList, _("switch to playlist")),
                                "nextBouquet": (self.switchToFileList, _("switch to filelist")),
                                "delete": (self.deletePlaylistEntry, _("delete playlist entry")),
 -                              "shift_stop": (self.clear_playlist, _("clear playlist")),
 -                              "shift_record": (self.playlist.PlayListShuffle, _("shuffle playlist")),
 +#ikseong                              
 +#                             "shift_stop": (self.clear_playlist, _("clear playlist")),
 +#                             "shift_record": (self.playlist.PlayListShuffle, _("shuffle playlist")),
 +                              "shift_stop": self.clear_playlist,
 +                              "shift_record": self.playlist.PlayListShuffle,
                                "subtitles": (self.subtitleSelection, _("Subtitle selection")),
                        }, -2)
  
                if config.mediaplayer.saveDirOnExit.getValue():
                        config.mediaplayer.defaultDir.setValue(self.filelist.getCurrentDirectory())
                        config.mediaplayer.defaultDir.save()
 -              from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier
 -              hotplugNotifier.remove(self.hotplugCB)
 +#     ikseong                 
 +#     from Plugins.SystemPlugins.Hotplug.plugin import hotplugNotifier
 +#     hotplugNotifier.remove(self.hotplugCB)
                del self["coverArt"].picload
                self.close()
  
                currPlay = self.session.nav.getCurrentService()
                sTagAudioCodec = currPlay.info().getInfoString(iServiceInformation.sTagAudioCodec)
                print "[__evAudioDecodeError] audio-codec %s can't be decoded by hardware" % (sTagAudioCodec)
 -              self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sTagAudioCodec, type = MessageBox.TYPE_INFO,timeout = 20 )
 +              self.session.open(MessageBox, _("This STB can't decode %s streams!") % sTagAudioCodec, type = MessageBox.TYPE_INFO,timeout = 20 )
  
        def __evVideoDecodeError(self):
                currPlay = self.session.nav.getCurrentService()
                sTagVideoCodec = currPlay.info().getInfoString(iServiceInformation.sTagVideoCodec)
                print "[__evVideoDecodeError] video-codec %s can't be decoded by hardware" % (sTagVideoCodec)
 -              self.session.open(MessageBox, _("This Dreambox can't decode %s streams!") % sTagVideoCodec, type = MessageBox.TYPE_INFO,timeout = 20 )
 +              self.session.open(MessageBox, _("This STB can't decode %s streams!") % sTagVideoCodec, type = MessageBox.TYPE_INFO,timeout = 20 )
  
        def __evPluginError(self):
                currPlay = self.session.nav.getCurrentService()
@@@ -1046,6 -1041,6 +1046,6 @@@ def filescan(**kwargs)
  from Plugins.Plugin import PluginDescriptor
  def Plugins(**kwargs):
        return [
-               PluginDescriptor(name = "MediaPlayer", description = "Play back media files", where = PluginDescriptor.WHERE_MENU, fnc = menu),
-               PluginDescriptor(name = "MediaPlayer", where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)
+               PluginDescriptor(name = "MediaPlayer", description = "Play back media files", where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc = menu),
+               PluginDescriptor(name = "MediaPlayer", where = PluginDescriptor.WHERE_FILESCAN, needsRestart = False, fnc = filescan)
        ]
index 38ed1d2,b345428..5f2f82a
mode 100755,100644..100644
@@@ -57,10 -57,6 +57,10 @@@ class CIselectMainMenu(Screen)
                                        appname = _("Slot %d") %(slot+1) + " - " + _("init modules")
                                elif state == 2:
                                        appname = _("Slot %d") %(slot+1) + " - " + eDVBCI_UI.getInstance().getAppName(slot)
 +                              #       ikseong                                 
 +                              else :
 +                                      appname = _("Slot %d") %(slot+1) + " - " + _("no module found")
 +                              #
                                self.list.append( (appname, ConfigNothing(), 0, slot) )
                else:
                        self.list.append( (_("no CI slots found") , ConfigNothing(), 1, -1) )
@@@ -640,10 -636,10 +640,10 @@@ def menu(menuid, **kwargs)
  
  def Plugins(**kwargs):
        if config.usage.setup_level.index > 1:
-               return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart ),
-                               PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart ),
-                               PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers/caids to common interface modules"), where = PluginDescriptor.WHERE_MENU, fnc = menu )]
+               return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = False, fnc = sessionstart ),
+                               PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = False, fnc = autostart ),
+                               PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers/caids to common interface modules"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc = menu )]
        else:
-               return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, fnc = sessionstart ),
-                               PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, fnc = autostart ),
-                               PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers to common interface modules"), where = PluginDescriptor.WHERE_MENU, fnc = menu )]
+               return [PluginDescriptor( where = PluginDescriptor.WHERE_SESSIONSTART, needsRestart = False, fnc = sessionstart ),
+                               PluginDescriptor( where = PluginDescriptor.WHERE_AUTOSTART, needsRestart = False, fnc = autostart ),
+                               PluginDescriptor( name = "CommonInterfaceAssignment", description = _("a gui to assign services/providers to common interface modules"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc = menu )]
index 6eb09f3,ab74de4..25a06eb
mode 100755,100644..100644
@@@ -176,7 -176,7 +176,7 @@@ class CrashlogAutoSubmitConfiguration(S
                        self.enableVKeyIcon()
                        self.showKeypad()
                elif current == self.AnonCrashlogEntry:
 -                      self["status"].setText(_("Adds enigma2 settings and dreambox model informations like SN, rev... if enabled."))
 +                      self["status"].setText(_("Adds enigma2 settings and STB model informations like SN, rev... if enabled."))
                        self.disableVKeyIcon()
                elif current == self.NetworkEntry:
                        self["status"].setText(_("Adds network configuration if enabled."))
@@@ -333,16 -333,15 +333,16 @@@ def mxServerFound(mxServer,session)
                if crashlog.startswith("enigma2_crash_") and crashlog.endswith(".log"):
                        print "[CrashlogAutoSubmit] - found crashlog: ",os.path.basename(crashlog)
                        crashLogFilelist.append('/media/hdd/' + crashlog)
 -
 -      if len(crashLogFilelist):
 -              if config.plugins.crashlogautosubmit.sendmail.value == "send":
 -                      Notifications.AddNotificationWithCallback(handleAnswer, ChoiceBox, title=_("Crashlogs found!\nSend them to Dream Multimedia?"), list = list)
 -              elif config.plugins.crashlogautosubmit.sendmail.value == "send_always":
 -                      send_mail()
 -      else:
 -              print "[CrashlogAutoSubmit] - no crashlogs found."
 -
 +#     ikseong
 +#     if len(crashLogFilelist):
 +#             if config.plugins.crashlogautosubmit.sendmail.value == "send":
 +#                     session.openWithCallback(handleAnswer, ChoiceBox, title=_("Crashlogs found!\nSend them to Dream Multimedia ?"), list = list)
 +#             elif config.plugins.crashlogautosubmit.sendmail.value == "send_always":
 +#                     send_mail()
 +#     else:   
 +#             print "[CrashlogAutoSubmit] - no crashlogs found."
 +#
 +      print "block to handle Crashlogs "
  
  def getMailExchange(host):
        print "[CrashlogAutoSubmit] - getMailExchange"
@@@ -422,6 -421,6 +422,6 @@@ def selSetup(menuid, **kwargs)
  
  
  def Plugins(**kwargs):
-       return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart),
-               PluginDescriptor(name=_("CrashlogAutoSubmit"), description=_("CrashlogAutoSubmit settings"),where=PluginDescriptor.WHERE_MENU, fnc=selSetup)]
+       return [PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], needsRestart = False, fnc = autostart),
+               PluginDescriptor(name=_("CrashlogAutoSubmit"), description=_("CrashlogAutoSubmit settings"),where=PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=selSetup)]
  
index b0c52c8,22e5436..8f9757f
mode 100755,100644..100755
@@@ -10,7 -10,7 +10,7 @@@ from os import pope
  
  class Upgrade(Screen):
        skin = """
-               <screen position="100,100" size="550,400" title="IPKG upgrade..." >
+               <screen position="100,100" size="550,400" title="opkg upgrade..." >
                        <widget name="text" position="0,0" size="550,400" font="Regular;15" />
                </screen>"""
                
                
        def go(self):
                if self.update:
 -                      self.session.openWithCallback(self.doUpdate, MessageBox, _("Do you want to update your Dreambox?\nAfter pressing OK, please wait!"))            
 +                      self.session.openWithCallback(self.doUpdate, MessageBox, _("Do you want to update your STB?\nAfter pressing OK, please wait!"))         
                else:
                        self.close()
        
        def doUpdateDelay(self):
-               lines = popen("ipkg update && ipkg upgrade -force-defaults -force-overwrite", "r").readlines()
+               lines = popen("opkg update && opkg upgrade -force-defaults -force-overwrite", "r").readlines()
                string = ""
                for x in lines:
                        string += x
@@@ -87,7 -87,7 +87,7 @@@ class PacketList(GUIComponent)
  
  class Ipkg(Screen):
        skin = """
-               <screen position="100,100" size="550,400" title="IPKG upgrade..." >
+               <screen position="100,100" size="550,400" title="opkg upgrade..." >
                        <widget name="list" position="0,0" size="550,400" scrollbarMode="showOnDemand" />
                </screen>"""
                
                
  
        def fillPacketList(self):
-               lines = popen("ipkg list", "r").readlines()
+               lines = popen("opkg list", "r").readlines()
                packetlist = []
                for x in lines:
                        split = x.split(' - ')
                        packetlist.append([split[0].strip(), split[1].strip()])
                
-               lines = popen("ipkg list_installed", "r").readlines()
+               lines = popen("opkg list_installed", "r").readlines()
                
                installedlist = {}
                for x in lines:
                
        def go(self):
                if self.update:
 -                      self.session.openWithCallback(self.doUpdate, MessageBox, _("Do you want to update your Dreambox?\nAfter pressing OK, please wait!"))            
 +                      self.session.openWithCallback(self.doUpdate, MessageBox, _("Do you want to update your STB?\nAfter pressing OK, please wait!"))         
                else:
                        self.close()
        
        def doUpdateDelay(self):
-               lines = popen("ipkg update && ipkg upgrade", "r").readlines()
+               lines = popen("opkg update && opkg upgrade", "r").readlines()
                string = ""
                for x in lines:
                        string += x
@@@ -161,4 -161,4 +161,4 @@@ def IpkgMain(session, **kwargs)
  
  def Plugins(**kwargs):
        return [PluginDescriptor(name="Old Softwareupdate", description="Updates your receiver's software", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain),
-                       PluginDescriptor(name="IPKG", description="IPKG frontend", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=IpkgMain)]
+                       PluginDescriptor(name="opkg", description="opkg frontend", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=IpkgMain)]
@@@ -101,7 -101,7 +101,7 @@@ class SoftwareTools(DreamInfoHandler)
  
        def getUpdates(self, callback = None):
                if self.lastDownloadDate is None:
 -                      if  self.hardware_info.device_name != "dm7025":
 +                      if  self.hardware_info.device_name != "dm500hd":
                                etpm = eTPM()
                                l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
                                if l2cert is None:
                                        return
                                val = etpm.challenge(rnd)
                                result = decrypt_block(val, l3key)
 -                      if self.hardware_info.device_name == "dm7025" or result[80:88] == rnd:
 +                      if self.hardware_info.device_name == "dm500hd" or result[80:88] == rnd:
                                if self.NetworkConnectionAvailable == True:
                                        self.lastDownloadDate = time()
                                        if self.list_updating is False and callback is None:
                                        self.NotifierCallback = callback
                        else:
                                if self.list_updating and callback is not None:
 -                                      if  self.hardware_info.device_name != "dm7025":
 +                                      if  self.hardware_info.device_name != "dm500hd":
                                                etpm = eTPM()
                                                l2cert = etpm.getCert(eTPM.TPMD_DT_LEVEL2_CERT)
                                                if l2cert is None:
                                                        return
                                                val = etpm.challenge(rnd)
                                                result = decrypt_block(val, l3key)
 -                                      if self.hardware_info.device_name == "dm7025" or result[80:88] == rnd:
 +                                      if self.hardware_info.device_name == "dm500hd" or result[80:88] == rnd:
                                                self.NotifierCallback = callback
                                                self.startIpkgListAvailable()
                                else:   
                if self.list_updating:
                        if not self.UpdateConsole:
                                self.UpdateConsole = Console()
-                       cmd = "ipkg list"
+                       cmd = "opkg list"
                        self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback)
  
        def IpkgListAvailableCB(self, result, retval, extra_args = None):
                        if self.NetworkConnectionAvailable == True:
                                if not self.UpdateConsole:
                                        self.UpdateConsole = Console()
-                               cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta"
+                               cmd = "opkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta"
                                self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback)
                        else:
                                self.InstallMetaPackageCB(True)
                                                callback(False)
  
        def startIpkgListInstalled(self, callback = None):
-               print "STARTIPKGLISTINSTALLED"
                if callback is not None:
                        self.list_updating = True
                if self.list_updating:
                        if not self.UpdateConsole:
                                self.UpdateConsole = Console()
-                       cmd = "ipkg list_installed"
+                       cmd = "opkg list-installed"
                        self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback)
  
        def IpkgListInstalledCB(self, result, retval, extra_args = None):
        def startIpkgUpdate(self, callback = None):
                if not self.Console:
                        self.Console = Console()
-               cmd = "ipkg update"
+               cmd = "opkg update"
                self.Console.ePopen(cmd, self.IpkgUpdateCB, callback)
  
        def IpkgUpdateCB(self, result, retval, extra_args = None):
                                                callback = None
  
        def cleanupSoftwareTools(self):
+               self.list_updating = False
                if self.NotifierCallback is not None:
                        self.NotifierCallback = None
                self.ipkg.stop()
index b968d79,b3a0a17..dce5179
mode 100755,100644..100644
@@@ -125,11 -125,11 +125,11 @@@ class UpdatePluginMenu(Screen)
                self.backupdirs = ' '.join( config.plugins.configurationbackup.backupdirs.value )
                if self.menu == 0:
                        print "building menu entries"
 -                      self.list.append(("install-extensions", _("Manage extensions"), _("\nManage extensions or plugins for your Dreambox" ) + self.oktext, None))
 -                      self.list.append(("software-update", _("Software update"), _("\nOnline update of your Dreambox software." ) + self.oktext, None))
 -                      self.list.append(("software-restore", _("Software restore"), _("\nRestore your Dreambox with a new firmware." ) + self.oktext, None))
 -                      self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your Dreambox settings." ) + self.oktext + "\n\n" + self.infotext, None))
 -                      self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your Dreambox settings." ) + self.oktext, None))
 +                      self.list.append(("install-extensions", _("Manage extensions"), _("\nManage extensions or plugins for your STB" ) + self.oktext, None))
 +                      self.list.append(("software-update", _("Software update"), _("\nOnline update of your STB software." ) + self.oktext, None))
 +                      self.list.append(("software-restore", _("Software restore"), _("\nRestore your STB with a new firmware." ) + self.oktext, None))
 +                      self.list.append(("system-backup", _("Backup system settings"), _("\nBackup your STB settings." ) + self.oktext + "\n\n" + self.infotext, None))
 +                      self.list.append(("system-restore",_("Restore system settings"), _("\nRestore your STB settings." ) + self.oktext, None))
                        self.list.append(("ipkg-install", _("Install local extension"),  _("\nScan for local extensions and install them." ) + self.oktext, None))
                        for p in plugins.getPlugins(PluginDescriptor.WHERE_SOFTWAREMANAGER):
                                if p.__call__.has_key("SoftwareSupported"):
                        currentEntry = current[0]
                        if self.menu == 0:
                                if (currentEntry == "software-update"):
 -                                      self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your Dreambox?")+"\n"+_("\nAfter pressing OK, please wait!"))
 +                                      self.session.openWithCallback(self.runUpgrade, MessageBox, _("Do you want to update your STB?")+"\n"+_("\nAfter pressing OK, please wait!"))
                                elif (currentEntry == "software-restore"):
                                        self.session.open(ImageWizard)
                                elif (currentEntry == "install-extensions"):
@@@ -809,6 -809,8 +809,8 @@@ class PluginManager(Screen, DreamInfoHa
                                name = x[0].strip()
                                details = x[1].strip()
                                description = x[2].strip()
+                               if description == "":
+                                       description = "No description available."
                                packagename = x[3].strip()
                                selectState = self.getSelectionState(details)
                                if iSoftwareTools.installed_packetlist.has_key(packagename):
                        self.close()
  
        def runExecuteFinished(self):
-               self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
-       def ExecuteReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
-                       self.reloadPluginlist()
+               self.reloadPluginlist()
+               restartRequired = plugins.restartRequired
+               if restartRequired:
 -                      self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
++                      self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
+               else:
                        self.selectedFiles = []
                        self.detailsClosed(True)
+       def ExecuteReboot(self, result):
                if result:
                        quitMainloop(3)
+               else:
+                       self.selectedFiles = []
+                       self.detailsClosed(True)
  
        def reloadPluginlist(self):
                plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
@@@ -1006,7 -1011,7 +1011,7 @@@ class PluginManagerInfo(Screen)
                                elif cmd == 2:
                                        info = args['package']
                                else:
 -                                      info = _("Dreambox software because updates are available.")
 +                                      info = _("STB software because updates are available.")
  
                                self.list.append(self.buildEntryComponent(action,info))
                        self['list'].setList(self.list)
@@@ -1287,30 -1292,24 +1292,24 @@@ class PluginDetails(Screen, DreamInfoHa
                        self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
  
        def runUpgradeFinished(self):
-               self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
-       def UpgradeReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
+               self.reloadPluginlist()
+               restartRequired = plugins.restartRequired
+               if restartRequired:
 -                      self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
++                      self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Installation finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
+               else:
                        self.close(True)
+       def UpgradeReboot(self, result):
                if result:
                        quitMainloop(3)
+               else:
+                       self.close(True)
  
        def runRemove(self, result):
                if result:
                        self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList)
  
        def runRemoveFinished(self):
-               self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
-       def RemoveReboot(self, result):
-               if result is None:
-                       return
-               if result is False:
-                       self.close(True)
-               if result:
-                       quitMainloop(3)
+               self.close(True)
  
        def reloadPluginlist(self):
                plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
@@@ -1375,7 -1374,7 +1374,7 @@@ class UpdatePlugin(Screen)
                                self.updating = True
                                self.activityTimer.start(100, False)
                                self.package.setText(_("Package list update"))
--                              self.status.setText(_("Upgrading Dreambox... Please wait"))
++                              self.status.setText(_("Upgrading STB... Please wait"))
                                self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
                        else:
                                self.package.setText(_("Your network is not working. Please try again."))
                        else:
                                self.activityTimer.stop()
                                self.activityslider.setValue(0)
 -                              error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.")
 +                              error = _("your STB might be unusable now. Please consult the manual for further assistance before rebooting your STB.")
                                if self.packages == 0:
                                        error = _("No packages were upgraded yet. So you can check your network and try again.")
                                if self.updating:
 -                                      error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.")
 +                                      error = _("Your STB isn't connected to the internet properly. Please check it and try again.")
                                self.status.setText(_("Error") +  " - " + error)
                #print event, "-", param
                pass
        def exit(self):
                if not self.ipkg.isRunning():
                        if self.packages != 0 and self.error == 0:
 -                              self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"))
 +                              self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your STB?"))
                        else:
                                self.close()
                else:
@@@ -1517,7 -1516,7 +1516,7 @@@ class IPKGMenu(Screen)
  
        def fill_list(self):
                self.flist = []
-               self.path = '/etc/ipkg/'
+               self.path = '/etc/opkg/'
                if (os_path.exists(self.path) == False):
                        self.entry = False
                        return
@@@ -1708,7 -1707,6 +1707,6 @@@ class PacketManager(Screen, NumericalTe
                self.cache_file = eEnv.resolve('${libdir}/enigma2/python/Plugins/SystemPlugins/SoftwareManager/packetmanager.cache') #Path to cache directory
                self.oktext = _("\nAfter pressing OK, please wait!")
                self.unwanted_extensions = ('-dbg', '-dev', '-doc', 'busybox')
-               self.opkgAvail = fileExists('/usr/bin/opkg')
  
                self.ipkg = IpkgComponent()
                self.ipkg.addCallback(self.ipkgCallback)
                        self.session.openWithCallback(self.runRemoveFinished, Ipkg, cmdList = self.cmdList)
  
        def runRemoveFinished(self):
 -              self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
 +              self.session.openWithCallback(self.RemoveReboot, MessageBox, _("Remove finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
  
        def RemoveReboot(self, result):
                if result is None:
                        self.session.openWithCallback(self.runUpgradeFinished, Ipkg, cmdList = self.cmdList)
  
        def runUpgradeFinished(self):
 -              self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
 +              self.session.openWithCallback(self.UpgradeReboot, MessageBox, _("Upgrade finished.") +" "+_("Do you want to reboot your STB?"), MessageBox.TYPE_YESNO)
                
        def UpgradeReboot(self, result):
                if result is None:
                                self.list_updating = False
                                if not self.Console:
                                        self.Console = Console()
-                               cmd = "ipkg list"
+                               cmd = "opkg list"
                                self.Console.ePopen(cmd, self.IpkgList_Finished)
                #print event, "-", param
                pass
  
                if not self.Console:
                        self.Console = Console()
-               cmd = "ipkg list_installed"
+               cmd = "opkg list-installed"
                self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
  
        def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
                                        l = len(tokens)
                                        version = l > 1 and tokens[1].strip() or ""
                                        self.installed_packetlist[name] = version
-               if self.opkgAvail:
-                       if not self.Console:
-                               self.Console = Console()
-                       cmd = "opkg list-upgradable"
-                       self.Console.ePopen(cmd, self.OpkgListUpgradeable_Finished)
-               else:
-                       self.buildPacketList()
+               if not self.Console:
+                       self.Console = Console()
+               cmd = "opkg list-upgradable"
+               self.Console.ePopen(cmd, self.OpkgListUpgradeable_Finished)
  
        def OpkgListUpgradeable_Finished(self, result, retval, extra_args = None):
                if result:
        
        def buildEntryComponent(self, name, version, description, state):
                divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+               if description == "":
+                       description = "No description available."
                if state == 'installed':
                        installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
                        return((name, version, _(description), state, installedpng, divpng))    
                        for x in self.packetlist:
                                status = ""
                                if self.installed_packetlist.has_key(x[0]):
-                                       if self.opkgAvail:
-                                               if self.upgradeable_packages.has_key(x[0]):
-                                                       status = "upgradeable"
-                                               else:
-                                                       status = "installed"
+                                       if self.upgradeable_packages.has_key(x[0]):
+                                               status = "upgradeable"
                                        else:
-                                               if self.installed_packetlist[x[0]] == x[1]:
-                                                       status = "installed"
-                                               else:
-                                                       status = "upgradeable"
+                                               status = "installed"
                                else:
                                        status = "installable"
                                self.list.append(self.buildEntryComponent(x[0], x[1], x[2], status))    
@@@ -2042,9 -2033,9 +2033,9 @@@ def Plugins(path, **kwargs)
        global plugin_path
        plugin_path = path
        list = [
-               PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup),
-               PluginDescriptor(name=_("Ipkg"), where = PluginDescriptor.WHERE_FILESCAN, fnc = filescan)
+               PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=startSetup),
+               PluginDescriptor(name=_("Ipkg"), where = PluginDescriptor.WHERE_FILESCAN, needsRestart = False, fnc = filescan)
        ]
        if config.usage.setup_level.index >= 2: # expert+
-               list.append(PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=UpgradeMain))
+               list.append(PluginDescriptor(name=_("Software management"), description=_("Manage your receiver's software"), where = PluginDescriptor.WHERE_EXTENSIONSMENU, needsRestart = False, fnc=UpgradeMain))
        return list
index 085f2e6,7396534..e7805fc
mode 100755,100644..100644
@@@ -95,11 -95,11 +95,11 @@@ class VideoSetup(Screen, ConfigListScre
                                        self.list.append(getConfigListEntry(_("Auto scart switching"), config.av.vcrswitch))
  
                if level >= 1:
 -                      self.list.append(getConfigListEntry(_("AC3 default"), config.av.defaultac3))
 +                      self.list.append(getConfigListEntry(_("Dolby Digital default"), config.av.defaultac3))
                        if SystemInfo["CanDownmixAC3"]:
 -                              self.list.append(getConfigListEntry(_("AC3 downmix"), config.av.downmix_ac3))
 +                              self.list.append(getConfigListEntry(_("Dolby Digital downmix"), config.av.downmix_ac3))
                        self.list.extend((
 -                              getConfigListEntry(_("General AC3 Delay"), config.av.generalAC3delay),
 +                              getConfigListEntry(_("General Dolby Digital Delay"), config.av.generalAC3delay),
                                getConfigListEntry(_("General PCM Delay"), config.av.generalPCMdelay)
                        ))
  
@@@ -227,8 -227,8 +227,8 @@@ def VideoWizard(*args, **kwargs)
  def Plugins(**kwargs):
        list = [
  #             PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart),
-               PluginDescriptor(name=_("Video Setup"), description=_("Advanced Video Setup"), where = PluginDescriptor.WHERE_MENU, fnc=startSetup) 
+               PluginDescriptor(name=_("Video Setup"), description=_("Advanced Video Setup"), where = PluginDescriptor.WHERE_MENU, needsRestart = False, fnc=startSetup) 
        ]
        if config.misc.videowizardenabled.value:
-               list.append(PluginDescriptor(name=_("Video Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=(0, VideoWizard)))
+               list.append(PluginDescriptor(name=_("Video Wizard"), where = PluginDescriptor.WHERE_WIZARD, needsRestart = False, fnc=(0, VideoWizard)))
        return list
@@@ -71,16 -71,20 +71,20 @@@ class AudioSelection(Screen, ConfigList
                        if SystemInfo["CanDownmixAC3"]:
                                self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
                                self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
 -                              conflist.append(getConfigListEntry(_("AC3 downmix"), self.settings.downmix))
 +                              conflist.append(getConfigListEntry(_("Dolby Digital downmix"), self.settings.downmix))
                                self["key_red"].setBoolean(True)
  
                        if n > 0:
                                self.audioChannel = service.audioChannel()
-                               choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))]
-                               self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel()))
-                               self.settings.channelmode.addNotifier(self.changeMode, initial_call = False)
-                               conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode))
-                               self["key_green"].setBoolean(True)
+                               if self.audioChannel:
+                                       choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))]
+                                       self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel()))
+                                       self.settings.channelmode.addNotifier(self.changeMode, initial_call = False)
+                                       conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode))
+                                       self["key_green"].setBoolean(True)
+                               else:
+                                       conflist.append(('',))
+                                       self["key_green"].setBoolean(False)
                                selectedAudio = self.audioTracks.getCurrentTrack()
                                for x in range(n):
                                        number = str(x)
                                        language = _("<unknown>")
                                        selected = ""
  
-                                       if sel and x[:4] == sel[:4]:
+                                       if sel and x == sel:
                                                selected = _("Running")
                                                selectedidx = idx
                                        
                config.av.downmix_ac3.save()
  
        def changeMode(self, mode):
-               if mode is not None:
+               if mode is not None and self.audioChannel:
                        self.audioChannel.selectChannel(int(mode.getValue()))
  
        def changeAudio(self, audio):
index c07e349,912d678..912d678
mode 100755,100644..100755
@@@ -65,6 -65,24 +65,24 @@@ class BouquetSelector(Screen)
        def cancelClick(self):
                self.close(False)
  
+ class SilentBouquetSelector:
+       def __init__(self, bouquets, enableWrapAround=False, current=0):
+               self.bouquets = [b[1] for b in bouquets]
+               self.pos = current
+               self.count = len(bouquets)
+               self.enableWrapAround = enableWrapAround
+       def up(self):
+               if self.pos > 0 or self.enableWrapAround:
+                       self.pos = (self.pos - 1) % self.count
+       def down(self):
+               if self.pos < (self.count - 1) or self.enableWrapAround:
+                       self.pos = (self.pos + 1) % self.count
+       def getCurrent(self):
+               return self.bouquets[self.pos]
  # csel.bouquet_mark_edit values
  OFF = 0
  EDIT_BOUQUET = 1
index 0432930,1a7d145..d55e661
mode 100755,100644..100755
@@@ -1,4 -1,4 +1,4 @@@
- from ChannelSelection import ChannelSelection, BouquetSelector
+ from ChannelSelection import ChannelSelection, BouquetSelector, SilentBouquetSelector
  
  from Components.ActionMap import ActionMap, HelpableActionMap
  from Components.ActionMap import NumberActionMap
@@@ -555,18 -555,15 +555,15 @@@ class InfoBarEPG
  
        def openMultiServiceEPG(self, withCallback=True):
                bouquets = self.servicelist.getBouquetList()
+               root = self.servicelist.getRoot()
                if bouquets is None:
                        cnt = 0
                else:
                        cnt = len(bouquets)
-               if cnt > 1: # show bouquet list
-                       if withCallback:
-                               self.bouquetSel = self.session.openWithCallback(self.closed, BouquetSelector, bouquets, self.openBouquetEPG, enableWrapAround=True)
-                               self.dlg_stack.append(self.bouquetSel)
-                       else:
-                               self.bouquetSel = self.session.open(BouquetSelector, bouquets, self.openBouquetEPG, enableWrapAround=True)
-               elif cnt == 1:
-                       self.openBouquetEPG(bouquets[0][1], withCallback)
+               if cnt > 1: # create bouquet list for bouq+/-
+                       self.bouquetSel = SilentBouquetSelector(bouquets, True, self.servicelist.getBouquetNumOffset(root))
+               if cnt >= 1:
+                       self.openBouquetEPG(root, withCallback)
  
        def changeServiceCB(self, direction, epg):
                if self.serviceSel:
@@@ -1353,6 -1350,7 +1350,7 @@@ class InfoBarExtensions
                        answer[1][1]()
  
  from Tools.BoundFunction import boundFunction
+ import inspect
  
  # depends on InfoBarExtensions
  
@@@ -1364,9 -1362,13 +1362,13 @@@ class InfoBarPlugins
                return name
  
        def getPluginList(self):
-               list = [((boundFunction(self.getPluginName, p.name), boundFunction(self.runPlugin, p), lambda: True), None, p.name) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EXTENSIONSMENU)]
-               list.sort(key = lambda e: e[2]) # sort by name
-               return list
+               l = []
+               for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EXTENSIONSMENU):
+                 args = inspect.getargspec(p.__call__)[0]
+                 if len(args) == 1 or len(args) == 2 and isinstance(self, InfoBarChannelSelection):
+                         l.append(((boundFunction(self.getPluginName, p.name), boundFunction(self.runPlugin, p), lambda: True), None, p.name))
+               l.sort(key = lambda e: e[2]) # sort by name
+               return l
  
        def runPlugin(self, plugin):
                if isinstance(self, InfoBarChannelSelection):
@@@ -1524,28 -1526,30 +1526,30 @@@ class InfoBarInstantRecord
  
                recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = preferredInstantRecordPath())
                recording.dontSave = True
-               
                if event is None or limitEvent == False:
                        recording.autoincrease = True
-                       if recording.setAutoincreaseEnd():
-                               self.session.nav.RecordTimer.record(recording)
-                               self.recording.append(recording)
+                       recording.setAutoincreaseEnd()
+               simulTimerList = self.session.nav.RecordTimer.record(recording)
+               if simulTimerList is None:      # no conflict
+                       self.recording.append(recording)
                else:
-                               simulTimerList = self.session.nav.RecordTimer.record(recording)
-                               if simulTimerList is not None:  # conflict with other recording
-                                       name = simulTimerList[1].name
-                                       name_date = ' '.join((name, strftime('%c', localtime(simulTimerList[1].begin))))
-                                       print "[TIMER] conflicts with", name_date
-                                       recording.autoincrease = True   # start with max available length, then increment
-                                       if recording.setAutoincreaseEnd():
-                                               self.session.nav.RecordTimer.record(recording)
-                                               self.recording.append(recording)
-                                               self.session.open(MessageBox, _("Record time limited due to conflicting timer %s") % name_date, MessageBox.TYPE_INFO)
-                                       else:
-                                               self.session.open(MessageBox, _("Couldn't record due to conflicting timer %s") % name, MessageBox.TYPE_INFO)
-                                       recording.autoincrease = False
-                               else:
+                       if len(simulTimerList) > 1: # with other recording
+                               name = simulTimerList[1].name
+                               name_date = ' '.join((name, strftime('%c', localtime(simulTimerList[1].begin))))
+                               print "[TIMER] conflicts with", name_date
+                               recording.autoincrease = True   # start with max available length, then increment
+                               if recording.setAutoincreaseEnd():
+                                       self.session.nav.RecordTimer.record(recording)
                                        self.recording.append(recording)
+                                       self.session.open(MessageBox, _("Record time limited due to conflicting timer %s") % name_date, MessageBox.TYPE_INFO)
+                               else:
+                                       self.session.open(MessageBox, _("Couldn't record due to conflicting timer %s") % name, MessageBox.TYPE_INFO)
+                       else:
+                               self.session.open(MessageBox, _("Couldn't record due to invalid service %s") % serviceref, MessageBox.TYPE_INFO)
+                       recording.autoincrease = False
  
        def isInstantRecordRunning(self):
                print "self.recording:", self.recording
                dir = preferredInstantRecordPath()
                if not dir or not fileExists(dir, 'w'):
                        dir = defaultMoviePath()
 +#     ikseong
 +              if not fileExists("/hdd", 0):
 +                      print "not found /hdd"
 +                      system("ln -s /media/hdd /hdd")
 +#
                try:
                        stat = os_stat(dir)
                except:
@@@ -155,9 -155,9 +155,9 @@@ class PluginDownloadBrowser(Screen)
        def runInstall(self, val):
                if val:
                        if self.type == self.DOWNLOAD:
-                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg install " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
+                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["opkg install " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
                        elif self.type == self.REMOVE:
-                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["ipkg remove " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
+                               self.session.openWithCallback(self.installFinished, Console, cmdlist = ["opkg remove " + "enigma2-plugin-" + self["list"].l.getCurrentSelection()[0].name])
  
        def setWindowTitle(self):
                if self.type == self.DOWNLOAD:
                        self.setTitle(_("Remove plugins"))
  
        def startIpkgListInstalled(self):
-               self.container.execute("ipkg list_installed enigma2-plugin-*")
+               self.container.execute("opkg list_installed enigma2-plugin-*")
  
        def startIpkgListAvailable(self):
-               self.container.execute("ipkg list enigma2-plugin-*")
+               self.container.execute("opkg list enigma2-plugin-*")
  
        def startRun(self):
                self["list"].instance.hide()
                if self.type == self.DOWNLOAD:
                        if not PluginDownloadBrowser.lastDownloadDate or (time() - PluginDownloadBrowser.lastDownloadDate) > 3600:
                                # Only update from internet once per hour
-                               self.container.execute("ipkg update")
+                               self.container.execute("opkg update")
                                PluginDownloadBrowser.lastDownloadDate = time()
                        else:
                                self.startIpkgListAvailable()
                        self.remainingdata = ""
  
                for x in lines:
 -                      plugin = x.split(" - ", 2)
 -                      if len(plugin) == 3:
 +                      plugin = x.split(" - ")
 +                      if len(plugin) >= 2:
                                if self.run == 1 and self.type == self.DOWNLOAD:
                                        if plugin[0] not in self.installedplugins:
                                                self.installedplugins.append(plugin[0])
                
                self.plugins = {}
                for x in self.pluginlist:
 +                      if len(x) < 4:
 +                              split = x[0].split('-',3)
 +                              if not self.plugins.has_key(split[2]):
 +                                      self.plugins[split[2]] = []
 +                              self.plugins[split[2]].append((PluginDescriptor(name = x[2], description = " ", icon = verticallineIcon), split[3]))
 +                              continue
 +
                        split = x[3].split('-', 1)
                        if len(split) < 2:
                                continue
index e5c9260,61440d4..1305b62
mode 100755,100644..100755
@@@ -40,7 -40,7 +40,7 @@@ class SleepTimerEdit(Screen)
                self.status = True
                self.updateColors()
                
 -              self["pretext"] = Label(_("Shutdown Dreambox after"))
 +              self["pretext"] = Label(_("Shutdown STB after"))
                self["aftertext"] = Label(_("minutes"))
                
                self["actions"] = NumberActionMap(["SleepTimerEditorActions", "TextEntryActions", "KeyboardInputActions"], 
  
        def select(self):
                if self.status:
 -                      time = int(self["input"].getText())
 -                      config.SleepTimer.defaulttime.setValue(time)
 -                      config.SleepTimer.defaulttime.save()
 -                      config.SleepTimer.action.save()
 -                      config.SleepTimer.ask.save()
 -                      self.session.nav.SleepTimer.setSleepTime(time)
 -                      self.session.openWithCallback(self.close, MessageBox, _("The sleep timer has been activated."), MessageBox.TYPE_INFO)
 +#     ikseong
 +                      if self["input"].getText()=='':
 +                              self.session.nav.SleepTimer.clear()
 +                              self.session.openWithCallback(self.close, MessageBox, _("The sleep timer is invalid."), MessageBox.TYPE_INFO)
 +                      else:                           
 +                              time = int(self["input"].getText())
 +                              config.SleepTimer.defaulttime.setValue(time)
 +                              config.SleepTimer.defaulttime.save()
 +                              config.SleepTimer.action.save()
++                              config.SleepTimer.ask.save()
 +                              self.session.nav.SleepTimer.setSleepTime(time)
 +                              self.session.openWithCallback(self.close, MessageBox, _("The sleep timer has been activated."), MessageBox.TYPE_INFO)
                else:
                        self.session.nav.SleepTimer.clear()
                        self.session.openWithCallback(self.close, MessageBox, _("The sleep timer has been disabled."), MessageBox.TYPE_INFO)
  
        def keyNumberGlobal(self, number):
 -              self["input"].number(number)
 +#     ikseong
 +              if self["input"].getText() == '' :
 +                      inputtime=0
 +              else:
 +                      inputtime= int(self["input"].getText())*10 +number
 +              if inputtime < 10000 :
 +                      self["input"].number(number)
  
        def selectLeft(self):
                self["input"].left()
diff --combined main/bsod.cpp
  
  /************************************************/
  
 +#ifdef BUILD_VUPLUS /* ikseong  */
 +#define CRASH_EMAILADDR "crashlog"
 +#else
  #define CRASH_EMAILADDR "crashlog@dream-multimedia-tv.de"
 +#endif
  #define INFOFILE "/maintainer.info"
  
  #define RINGBUFFER_SIZE 16384
@@@ -204,9 -200,9 +204,9 @@@ void bsodFatal(const char *component
                xml.close();
  
                xml.open("software");
-               xml.cDataFromCmd("enigma2software", "ipkg list_installed | grep enigma2");
-               xml.cDataFromCmd("dreamboxsoftware", "ipkg list_installed | grep dream");
-               xml.cDataFromCmd("gstreamersoftware", "ipkg list_installed | grep gst");
+               xml.cDataFromCmd("enigma2software", "opkg list_installed | grep enigma2");
+               xml.cDataFromCmd("dreamboxsoftware", "opkg list_installed | grep dream");
+               xml.cDataFromCmd("gstreamersoftware", "opkg list_installed | grep gst");
                xml.close();
  
                xml.open("crashlogs");
  
        ePtr<gMainDC> my_dc;
        gMainDC::getInstance(my_dc);
 -      
 +    
        gPainter p(my_dc);
        p.resetOffset();
        p.resetClip(eRect(ePoint(0, 0), my_dc->size()));
        p.clear();
  
        eRect usable_area = eRect(100, 70, my_dc->size().width() - 150, 100);
 -      
 -      std::string text("We are really sorry. Your Dreambox encountered "
 +    
 +      std::string text("We are really sorry. Your STB encountered "
                "a software problem, and needs to be restarted. "
                "Please send the logfile created in /hdd/ to " + crash_emailaddr + ".\n"
 -              "Your Dreambox restarts in 10 seconds!\n"
 +              "Your STB restarts in 10 seconds!\n"
                "Component: " + crash_component);
  
        p.renderText(usable_area, text.c_str(), gPainter::RT_WRAP|gPainter::RT_HALIGN_LEFT);