eServiceReference, iRecordableService, quitMainloop
from Components.config import config
+from Components.UsageConfig import defaultMoviePath
from Components.TimerSanityCheck import TimerSanityCheck
from Screens.MessageBox import MessageBox
if config.recording.ascii_filenames.value:
filename = ASCIItranslit.legacyEncode(filename)
- if self.dirname and not Directories.fileExists(self.dirname, 'w'):
- self.dirnameHadToFallback = True
- self.Filename = Directories.getRecordingFilename(filename, None)
+ if not self.dirname or not Directories.fileExists(self.dirname, 'w'):
+ if self.dirname:
+ self.dirnameHadToFallback = True
+ dirname = defaultMoviePath()
else:
- self.Filename = Directories.getRecordingFilename(filename, self.dirname)
+ dirname = self.dirname
+ self.Filename = Directories.getRecordingFilename(filename, dirname)
self.log(0, "Filename calculated as: '%s'" % self.Filename)
#begin_date + " - " + service_name + description)
lib/python/Plugins/SystemPlugins/Hotplug/Makefile
lib/python/Plugins/SystemPlugins/Hotplug/meta/Makefile
lib/python/Plugins/SystemPlugins/Makefile
+lib/python/Plugins/SystemPlugins/NetworkWizard/Makefile
+lib/python/Plugins/SystemPlugins/NetworkWizard/meta/Makefile
lib/python/Plugins/SystemPlugins/NFIFlash/Makefile
lib/python/Plugins/SystemPlugins/NFIFlash/meta/Makefile
lib/python/Plugins/SystemPlugins/PositionerSetup/Makefile
lib/python/Plugins/SystemPlugins/VideoTune/meta/Makefile
lib/python/Plugins/SystemPlugins/Videomode/Makefile
lib/python/Plugins/SystemPlugins/Videomode/meta/Makefile
+lib/python/Plugins/SystemPlugins/WirelessLan/Makefile
lib/python/Tools/Makefile
lib/service/Makefile
lib/components/Makefile
<item level="1" text="Device Setup..." entryID="device_setup"><screen module="NetworkSetup" screen="NetworkAdapterSelection"/></item>
<item level="1" text="Nameserver Setup..." entryID="dns_setup"><screen module="NetworkSetup" screen="NameserverSetup"/></item>
</menu>-->
- <item level="2" text="Timeshift path..." entryId="timeshift_path"><screen module="LocationBox" screen="TimeshiftLocationBox" /></item>
+ <item level="2" text="Recording paths..." entryId="RecordPaths"><screen module="RecordPaths" screen="RecordPathsSettings" /></item>
</menu>
<item weight="10" level="1" text="Common Interface" entryID="ci_setup" requires="CommonInterface"><screen module="Ci" screen="CiSelection" /></item>
<item weight="15" level="0" text="Parental control" entryID="parental_setup"><screen module="ParentalControlSetup" screen="ParentalControlSetup" /></item>
<item level="0" text="TV System">config.av.tvsystem</item>
<item level="1" text="WSS on 4:3">config.av.wss</item>
<item level="1" text="AC3 default">config.av.defaultac3</item>
- <item level="1" text="General AC3 delay">config.av.generalAC3delay</item>
- <item level="1" text="General PCM delay">config.av.generalPCMdelay</item>
+ <item level="1" text="General AC3 delay (ms)">config.av.generalAC3delay</item>
+ <item level="1" text="General PCM delay (ms)">config.av.generalPCMdelay</item>
<item level="1" text="AC3 downmix" requires="CanDownmixAC3">config.av.downmix_ac3</item>
<item level="1" text="Auto scart switching" requires="ScartSwitch">config.av.vcrswitch</item>
</setup>
int eTSMPEGDecoder::m_pcm_delay=-1,
eTSMPEGDecoder::m_ac3_delay=-1;
-RESULT eTSMPEGDecoder::setPCMDelay(int delay)
+RESULT eTSMPEGDecoder::setHwPCMDelay(int delay)
{
- if (m_decoder == 0 && delay != m_pcm_delay )
+ if (delay != m_pcm_delay )
{
FILE *fp = fopen("/proc/stb/audio/audio_delay_pcm", "w");
if (fp)
return -1;
}
-RESULT eTSMPEGDecoder::setAC3Delay(int delay)
+RESULT eTSMPEGDecoder::setHwAC3Delay(int delay)
{
- if ( m_decoder == 0 && delay != m_ac3_delay )
+ if ( delay != m_ac3_delay )
{
FILE *fp = fopen("/proc/stb/audio/audio_delay_bitstream", "w");
if (fp)
return -1;
}
+
+RESULT eTSMPEGDecoder::setPCMDelay(int delay)
+{
+ return m_decoder == 0 ? setHwPCMDelay(delay) : -1;
+}
+
+RESULT eTSMPEGDecoder::setAC3Delay(int delay)
+{
+ return m_decoder == 0 ? setHwAC3Delay(delay) : -1;
+}
+
eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder)
: m_demux(demux),
m_vpid(-1), m_vtype(-1), m_apid(-1), m_atype(-1), m_pcrpid(-1), m_textpid(-1),
int getVideoProgressive();
int getVideoFrameRate();
int getVideoAspect();
+ static RESULT setHwPCMDelay(int delay);
+ static RESULT setHwAC3Delay(int delay);
};
#endif
continue;
}
- size_t iframe_len;
- /* try to align to iframe */
- int direction = pts < 0 ? -1 : 1;
- m_tstools.findFrame(offset, iframe_len, direction);
-
- eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx (skipped additional %d frames due to iframe re-align)", relative, pts, offset, direction);
+ eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx", relative, pts, offset);
current_offset = align(offset, blocksize); /* in case tstools return non-aligned offset */
}
off_t last = 0;
off_t last2 = 0;
pts_t lastc = 0;
+ ts += 1; // Add rounding error margin
for (std::map<off_t, pts_t>::const_iterator i(m_access_points.begin()); i != m_access_points.end(); ++i)
{
pts_t delta = getDelta(i->first);
int eDVBTSTools::findNextPicture(off_t &offset, size_t &len, int &distance, int frame_types)
{
- int nr_frames = 0;
+ int nr_frames, direction;
// eDebug("trying to move %d frames at %llx", distance, offset);
frame_types = frametypeI; /* TODO: intelligent "allow IP frames when not crossing an I-Frame */
- int direction = distance > 0 ? 0 : -1;
- distance = abs(distance);
-
off_t new_offset = offset;
size_t new_len = len;
int first = 1;
+ if (distance > 0) {
+ direction = 0;
+ nr_frames = 0;
+ } else {
+ direction = -1;
+ nr_frames = -1;
+ distance = -distance+1;
+ }
while (distance > 0)
{
int dir = direction;
// eDebug("we moved %d, %d to go frames (now at %llx)", dir, distance, new_offset);
- if (distance >= 0 || first)
+ if (distance >= 0 || direction == 0)
{
first = 0;
offset = new_offset;
len = new_len;
nr_frames += abs(dir);
+ }
+ else if (first) {
+ first = 0;
+ offset = new_offset;
+ len = new_len;
+ nr_frames += abs(dir) + distance; // never jump forward during rewind
}
}
from config import config, ConfigSlider, ConfigSelection, ConfigYesNo, \
- ConfigEnableDisable, ConfigSubsection, ConfigBoolean, ConfigNumber, ConfigNothing, NoSave
+ ConfigEnableDisable, ConfigSubsection, ConfigBoolean, ConfigSelectionNumber, ConfigNothing, NoSave
from enigma import eAVSwitch, getDesktop
from SystemInfo import SystemInfo
from os import path as os_path
config.av.tvsystem = ConfigSelection(choices = {"pal": _("PAL"), "ntsc": _("NTSC"), "multinorm": _("multinorm")}, default="pal")
config.av.wss = ConfigEnableDisable(default = True)
config.av.defaultac3 = ConfigYesNo(default = False)
- config.av.generalAC3delay = ConfigNumber(default = 0)
- config.av.generalPCMdelay = ConfigNumber(default = 0)
+ config.av.generalAC3delay = ConfigSelectionNumber(-1000, 1000, 25, default = 0)
+ config.av.generalPCMdelay = ConfigSelectionNumber(-1000, 1000, 25, default = 0)
config.av.vcrswitch = ConfigEnableDisable(default = False)
iAVSwitch = AVSwitch()
from MenuList import MenuList
from Components.Harddisk import harddiskmanager
-from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename
+from Tools.Directories import SCOPE_SKIN_IMAGE, resolveFilename, fileExists
from enigma import RT_HALIGN_LEFT, eListboxPythonMultiContent, \
eServiceReference, eServiceCenter, gFont
"ts": "movie",
"avi": "movie",
"divx": "movie",
+ "m4v": "movie",
"mpg": "movie",
"mpeg": "movie",
"mkv": "movie",
directories.sort()
files.sort()
else:
- if os_path.exists(directory):
- files = listdir(directory)
+ if fileExists(directory):
+ try:
+ files = listdir(directory)
+ except:
+ files = []
files.sort()
tmpfiles = files[:]
for x in tmpfiles:
directories.sort()
files.sort()
else:
- if os_path.exists(directory):
- files = listdir(directory)
+ if fileExists(directory):
+ try:
+ files = listdir(directory)
+ except:
+ files = []
files.sort()
tmpfiles = files[:]
for x in tmpfiles:
# any access has been made to the disc. If there has been no access over a specifed time,
# we set the hdd into standby.
def readStats(self):
- l = readFile("/sys/block/%s/stat" % self.device)
+ try:
+ l = open("/sys/block/%s/stat" % self.device).read()
+ except IOError:
+ return -1,-1
(nr_read, _, _, _, nr_write) = l.split()[:5]
return int(nr_read), int(nr_write)
l = sum(stats)
print "sum", l, "prev_sum", self.last_stat
- if l != self.last_stat: # access
+ if l != self.last_stat and l >= 0: # access
print "hdd was accessed since previous check!"
self.last_stat = l
self.last_access = t
lnb_choices = {
"universal_lnb": _("Universal LNB"),
-# "unicable": _("Unicable"),
+ "unicable": _("Unicable"),
"c_band": _("C-Band"),
"user_defined": _("User defined")}
from Components.Harddisk import harddiskmanager
from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet, ConfigLocations
+from Tools.Directories import resolveFilename, SCOPE_HDD
from enigma import Misc_Options, setTunerTypePriorityOrder;
from SystemInfo import SystemInfo
import os
("standard", _("standard")), ("swap", _("swap PiP and main picture")),
("swapstop", _("move PiP to main picture")), ("stop", _("stop PiP")) ])
+ config.usage.default_path = ConfigText(default = resolveFilename(SCOPE_HDD))
+ config.usage.timer_path = ConfigText(default = "<default>")
+ config.usage.instantrec_path = ConfigText(default = "<default>")
+ config.usage.timeshift_path = ConfigText(default = "/media/hdd/")
config.usage.allowed_timeshift_paths = ConfigLocations(default = ["/media/hdd/"])
- config.usage.timeshift_path = ConfigText(default = "/media/hdd")
config.usage.on_movie_start = ConfigSelection(default = "ask", choices = [
("ask", _("Ask user")), ("resume", _("Resume from last position")), ("beginning", _("Start from the beginning")) ])
def TunerTypePriorityOrderChanged(configElement):
setTunerTypePriorityOrder(int(configElement.value))
- config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged)
+ config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged, immediate_feedback=False)
def setHDDStandby(configElement):
for hdd in harddiskmanager.HDDList():
hdd[1].setIdleTime(int(configElement.value))
- config.usage.hdd_standby.addNotifier(setHDDStandby)
+ config.usage.hdd_standby.addNotifier(setHDDStandby, immediate_feedback=False)
def set12VOutput(configElement):
if configElement.value == "on":
Misc_Options.getInstance().set_12V_output(1)
elif configElement.value == "off":
Misc_Options.getInstance().set_12V_output(0)
- config.usage.output_12V.addNotifier(set12VOutput)
+ config.usage.output_12V.addNotifier(set12VOutput, immediate_feedback=False)
SystemInfo["12V_Output"] = Misc_Options.getInstance().detected_12V_output()
defval = str(x)
break
sel.setChoices(map(str, choices), defval)
+
+def preferredPath(path):
+ if config.usage.setup_level.index < 2 or path == "<default>":
+ return None # config.usage.default_path.value, but delay lookup until usage
+ elif path == "<current>":
+ return config.movielist.last_videodir.value
+ elif path == "<timer>":
+ return config.movielist.last_timer_videodir.value
+ else:
+ return path
+
+def preferredTimerPath():
+ return preferredPath(config.usage.timer_path.value)
+
+def preferredInstantRecordPath():
+ return preferredPath(config.usage.instantrec_path.value)
+
+def defaultMoviePath():
+ return config.usage.default_path.value
+
from enigma import getPrevAsciiCode
from Tools.NumericalTextInput import NumericalTextInput
-from Tools.Directories import resolveFilename, SCOPE_CONFIG
+from Tools.Directories import resolveFilename, SCOPE_CONFIG, fileExists
from Components.Harddisk import harddiskmanager
from copy import copy as copy_copy
from os import path as os_path
ConfigText.onDeselect(self, session)
self.hidden = True
+# lets the user select between [min, min+stepwidth, min+(stepwidth*2)..., maxval] with maxval <= max depending
+# on the stepwidth
+# min, max, stepwidth, default are int values
+# wraparound: pressing RIGHT key at max value brings you to min value and vice versa if set to True
+class ConfigSelectionNumber(ConfigSelection):
+ def __init__(self, min, max, stepwidth, default = None, wraparound = False):
+ self.wraparound = wraparound
+ if default is None:
+ default = min
+ default = str(default)
+ choices = []
+ step = min
+ while step <= max:
+ choices.append(str(step))
+ step += stepwidth
+
+ ConfigSelection.__init__(self, choices, default)
+
+ def getValue(self):
+ return int(self.text)
+
+ def setValue(self, val):
+ self.text = str(val)
+
+ def handleKey(self, key):
+ if not self.wraparound:
+ if key == KEY_RIGHT:
+ if len(self.choices) == (self.choices.index(self.value) + 1):
+ return
+ if key == KEY_LEFT:
+ if self.choices.index(self.value) == 0:
+ return
+ ConfigSelection.handleKey(self, key)
+
+
+
class ConfigNumber(ConfigText):
def __init__(self, default = 0):
ConfigText.__init__(self, str(default), fixed_size = False)
self.default = default
self.locations = []
self.mountpoints = []
- harddiskmanager.on_partition_list_change.append(self.mountpointsChanged)
self.value = default[:]
def setValue(self, value):
locations = [[x, None, False, False] for x in tmp]
self.refreshMountpoints()
for x in locations:
- if os_path.exists(x[0]):
+ if fileExists(x[0]):
x[1] = self.getMountpoint(x[0])
x[2] = True
self.locations = locations
return False
return self.tostring([x[0] for x in locations]) != sv
- def mountpointsChanged(self, action, dev):
- print "Mounts changed: ", action, dev
- mp = dev.mountpoint+"/"
- if action == "add":
- self.addedMount(mp)
- elif action == "remove":
- self.removedMount(mp)
- self.refreshMountpoints()
-
def addedMount(self, mp):
for x in self.locations:
if x[1] == mp:
x[2] = True
- elif x[1] == None and os_path.exists(x[0]):
+ elif x[1] == None and fileExists(x[0]):
x[1] = self.getMountpoint(x[0])
x[2] = True
x[2] = False
def refreshMountpoints(self):
- self.mountpoints = [p.mountpoint + "/" for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
+ self.mountpoints = [p.mountpoint for p in harddiskmanager.getMountedPartitions() if p.mountpoint != "/"]
self.mountpoints.sort(key = lambda x: -len(x))
def checkChangedMountpoints(self):
from Components.MultiContent import MultiContentEntryText
from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
from Components.VideoWindow import VideoWindow
+from Components.Label import Label
from Screens.InfoBarGenerics import InfoBarSeek, InfoBarCueSheetSupport
from Components.GUIComponent import GUIComponent
from enigma import eListboxPythonMultiContent, eListbox, gFont, iPlayableService, RT_HALIGN_RIGHT
<widget source="session.CurrentService" render="Label" position="135,405" size="450,50" font="Regular;22" halign="center" valign="center">
<convert type="ServiceName">Name</convert>
</widget>
- <widget source="session.CurrentService" render="Label" position="50,450" zPosition="1" size="620,25" font="Regular;20" halign="center" valign="center">
+ <widget source="session.CurrentService" render="Label" position="320,450" zPosition="1" size="420,25" font="Regular;20" halign="left" valign="center">
<convert type="ServicePosition">Position,Detailed</convert>
</widget>
- <eLabel position="62,98" size="179,274" backgroundColor="#505555" />
- <eLabel position="64,100" size="175,270" backgroundColor="#000000" />
- <widget source="cutlist" position="64,100" zPosition="1" size="175,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" >
+ <widget name="SeekState" position="210,450" zPosition="1" size="100,25" halign="right" font="Regular;20" valign="center" />
+ <eLabel position="48,98" size="204,274" backgroundColor="#505555" />
+ <eLabel position="50,100" size="200,270" backgroundColor="#000000" />
+ <widget source="cutlist" position="50,100" zPosition="1" size="200,270" scrollbarMode="showOnDemand" transparent="1" render="Listbox" >
<convert type="TemplatedMultiContent">
{"template": [
MultiContentEntryText(size=(125, 20), text = 1, backcolor = MultiContentTemplateColor(3)),
self["Timeline"] = ServicePositionGauge(self.session.nav)
self["cutlist"] = List(self.getCutlist())
self["cutlist"].onSelectionChanged.append(self.selectionChanged)
+ self["SeekState"] = Label()
+ self.onPlayStateChanged.append(self.updateStateLabel)
+ self.updateStateLabel(self.seekstate)
self["Video"] = VideoWindow(decoder = 0)
})
# to track new entries we save the last version of the cutlist
- self.last_cuts = [ ]
+ self.last_cuts = self.getCutlist()
self.cut_start = None
+ self.inhibit_seek = False
self.onClose.append(self.__onClose)
def __onClose(self):
self.session.nav.playService(self.old_service)
+ def updateStateLabel(self, state):
+ self["SeekState"].setText(state[3].strip())
+
def showTutorial(self):
if not self.tutorial_seen:
self.tutorial_seen = True
return r
def selectionChanged(self):
- where = self["cutlist"].getCurrent()
- if where is None:
- print "no selection"
- return
- pts = where[0][0]
- seek = self.getSeek()
- if seek is None:
- print "no seek"
- return
- seek.seekTo(pts)
+ if not self.inhibit_seek:
+ where = self["cutlist"].getCurrent()
+ if where is None:
+ print "no selection"
+ return
+ pts = where[0][0]
+ seek = self.getSeek()
+ if seek is None:
+ print "no seek"
+ return
+ seek.seekTo(pts)
def refillList(self):
print "cue sheet changed, refilling"
self.downloadCuesheet()
- # get the first changed entry, and select it
+ # get the first changed entry, counted from the end, and select it
new_list = self.getCutlist()
self["cutlist"].list = new_list
- for i in range(min(len(new_list), len(self.last_cuts))):
- if new_list[i] != self.last_cuts[i]:
- self["cutlist"].setIndex(i)
+ l1 = len(new_list)
+ l2 = len(self.last_cuts)
+ for i in range(min(l1, l2)):
+ if new_list[l1-i-1] != self.last_cuts[l2-i-1]:
+ self["cutlist"].setIndex(l1-i-1)
break
self.last_cuts = new_list
def getStateForPosition(self, pos):
- state = 0 # in
-
- # when first point is "in", the beginning is "out"
- if len(self.cut_list) and self.cut_list[0][1] == 0:
- state = 1
-
+ state = -1
for (where, what) in self.cut_list:
- if where < pos:
- if what == 0: # in
- state = 0
- elif what == 1: # out
+ if what in [0, 1]:
+ if where < pos:
+ state = what
+ elif where == pos:
state = 1
+ elif state == -1:
+ state = 1 - what
+ if state == -1:
+ state = 0
return state
def showMenu(self):
in_after = None
for (where, what) in self.cut_list:
- if what == 1 and where < self.context_position: # out
+ if what == 1 and where <= self.context_position: # out
out_before = (where, what)
elif what == 0 and where < self.context_position: # in, before out
out_before = None
- elif what == 0 and where > self.context_position and in_after is None:
+ elif what == 0 and where >= self.context_position and in_after is None:
in_after = (where, what)
if out_before is not None:
if in_after is not None:
self.cut_list.remove(in_after)
+ self.inhibit_seek = True
self.uploadCuesheet()
+ self.inhibit_seek = False
elif result == CutListContextMenu.RET_MARK:
self.__addMark()
elif result == CutListContextMenu.RET_DELETEMARK:
self.cut_list.remove(self.context_nearest_mark)
+ self.inhibit_seek = True
self.uploadCuesheet()
+ self.inhibit_seek = False
elif result == CutListContextMenu.RET_REMOVEBEFORE:
# remove in/out marks before current position
for (where, what) in self.cut_list[:]:
self.cut_list.remove((where, what))
# add 'in' point
bisect.insort(self.cut_list, (self.context_position, 0))
+ self.inhibit_seek = True
self.uploadCuesheet()
+ self.inhibit_seek = False
elif result == CutListContextMenu.RET_REMOVEAFTER:
# remove in/out marks after current position
for (where, what) in self.cut_list[:]:
self.cut_list.remove((where, what))
# add 'out' point
bisect.insort(self.cut_list, (self.context_position, 1))
+ self.inhibit_seek = True
self.uploadCuesheet()
+ self.inhibit_seek = False
elif result == CutListContextMenu.RET_GRABFRAME:
self.grabFrame()
# 'None' is magic to start at the list of mountpoints
defaultDir = config.mediaplayer.defaultDir.getValue()
- self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
+ self.filelist = FileList(defaultDir, matchingPattern = "(?i)^.*\.(mp2|mp3|ogg|ts|m2ts|wav|wave|m3u|pls|e2pls|mpg|vob|avi|divx|m4v|mkv|mp4|m4a|dat|flac|mov)", useServiceRef = True, additionalExtensions = "4098:m3u 4098:e2pls 4098:pls")
self["filelist"] = self.filelist
self.playlist = MyPlayList()
SUBDIRS = SoftwareManager FrontprocessorUpgrade PositionerSetup Satfinder \
SkinSelector SatelliteEquipmentControl Videomode VideoTune Hotplug \
DefaultServicesScanner NFIFlash DiseqcTester CommonInterfaceAssignment \
- CrashlogAutoSubmit CleanupWizard VideoEnhancement
+ CrashlogAutoSubmit CleanupWizard VideoEnhancement WirelessLan NetworkWizard
install_PYTHON = \
__init__.py
--- /dev/null
+This plugin is licensed under the Creative Commons
+Attribution-NonCommercial-ShareAlike 3.0 Unported
+License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+
+Alternatively, this plugin may be distributed and executed on hardware which
+is licensed by Dream Multimedia GmbH.
+
+This plugin is NOT free software. It is open source, you are allowed to
+modify it (if you keep the license), but it may not be commercially
+distributed other than under the conditions noted above.
--- /dev/null
+installdir = $(pkglibdir)/python/Plugins/SystemPlugins/NetworkWizard\r
+\r
+SUBDIRS = meta\r
+\r
+install_PYTHON = \\r
+ __init__.py \\r
+ NetworkWizard.py \\r
+ plugin.py\r
+\r
+dist_install_DATA = \\r
+ LICENSE \\r
+ networkwizard.xml
\ No newline at end of file
--- /dev/null
+from Screens.Wizard import wizardManager, WizardSummary
+from Screens.WizardLanguage import WizardLanguage
+from Screens.Rc import Rc
+from Screens.MessageBox import MessageBox
+
+from Components.Pixmap import Pixmap, MovingPixmap, MultiPixmap
+from Components.config import config, ConfigBoolean, configfile, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, getConfigListEntry, ConfigSelection, ConfigPassword
+from Components.Network import iNetwork
+
+#from Components.Label import Label
+#from Components.MenuList import MenuList
+#from Components.PluginComponent import plugins
+#from Plugins.Plugin import PluginDescriptor
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+#import time, os, re
+
+
+config.misc.firstrun = ConfigBoolean(default = True)
+list = []
+list.append("WEP")
+list.append("WPA")
+list.append("WPA2")
+list.append("WPA/WPA2")
+
+weplist = []
+weplist.append("ASCII")
+weplist.append("HEX")
+
+config.plugins.wlan = ConfigSubsection()
+config.plugins.wlan.essid = NoSave(ConfigText(default = "home", fixed_size = False))
+config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = "home", fixed_size = False))
+
+config.plugins.wlan.encryption = ConfigSubsection()
+config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = False))
+config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = "WPA/WPA2" ))
+config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII"))
+config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewlan", fixed_size = False))
+
+class NetworkWizard(WizardLanguage, Rc):
+ skin = """
+ <screen position="0,0" size="720,576" title="Welcome..." flags="wfNoBorder" >
+ <widget name="text" position="153,40" size="340,330" font="Regular;22" />
+ <widget source="list" render="Listbox" position="53,340" size="440,180" scrollbarMode="showOnDemand" >
+ <convert type="StringList" />
+ </widget>
+ <widget name="config" position="53,340" zPosition="1" size="440,180" transparent="1" scrollbarMode="showOnDemand" />
+ <ePixmap pixmap="skin_default/buttons/button_red.png" position="40,225" zPosition="0" size="15,16" transparent="1" alphatest="on" />
+ <widget name="languagetext" position="55,225" size="95,30" font="Regular;18" />
+ <widget name="wizard" pixmap="skin_default/wizard.png" position="40,50" zPosition="10" size="110,174" alphatest="on" />
+ <widget name="rc" pixmaps="skin_default/rc.png,skin_default/rcold.png" position="500,50" zPosition="10" size="154,500" alphatest="on" />
+ <widget name="arrowdown" pixmap="skin_default/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ <widget name="arrowdown2" pixmap="skin_default/arrowdown.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ <widget name="arrowup" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ <widget name="arrowup2" pixmap="skin_default/arrowup.png" position="-100,-100" zPosition="11" size="37,70" alphatest="on" />
+ </screen>"""
+ def __init__(self, session):
+ self.xmlfile = resolveFilename(SCOPE_PLUGINS, "SystemPlugins/NetworkWizard/networkwizard.xml")
+ WizardLanguage.__init__(self, session, showSteps = False, showStepSlider = False)
+ Rc.__init__(self)
+ self.session = session
+ self["wizard"] = Pixmap()
+
+ self.InterfaceState = None
+ self.isInterfaceUp = None
+ self.WlanPluginInstalled = None
+ self.ap = None
+ self.selectedInterface = None
+ self.NextStep = None
+ self.myref = None
+ self.checkRef = None
+ self.AdapterRef = None
+ self.WlanList = None
+ self.isWlanPluginInstalled()
+
+ def listInterfaces(self):
+ list = [(iNetwork.getFriendlyAdapterName(x),x) for x in iNetwork.getAdapterList()]
+ list.append((_("Exit network wizard"), "end"))
+ return list
+
+ def InterfaceSelectionMade(self, index):
+ self.selectedInterface = index
+ self.InterfaceSelect(index)
+
+ def InterfaceSelect(self, index):
+ if index == 'end':
+ self.NextStep = 'end'
+ elif index == 'eth0':
+ self.NextStep = 'nwconfig'
+ else:
+ self.NextStep = 'scanwlan'
+
+ def InterfaceSelectionMoved(self):
+ self.InterfaceSelect(self.selection)
+
+ def checkInterface(self,iface):
+ self.Adapterlist = iNetwork.getAdapterList()
+ if self.NextStep is not 'end':
+ if len(self.Adapterlist) == 0:
+ #Reset Network to defaults if network broken
+ iNetwork.resetNetworkConfig('lan', self.checkInterfaceCB)
+ self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
+ if iface == 'eth0':
+ if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1:
+ if iNetwork.getAdapterAttribute(iface, 'up') is True:
+ self.isInterfaceUp = True
+ else:
+ self.isInterfaceUp = False
+ self.resetfinishedCB(False)
+ else:
+ iNetwork.resetNetworkConfig('lan',self.checkInterfaceCB)
+ self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
+ elif iface == 'wlan0':
+ if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1:
+ if iNetwork.getAdapterAttribute(iface, 'up') is True:
+ self.isInterfaceUp = True
+ else:
+ self.isInterfaceUp = False
+ self.resetfinishedCB(False)
+ else:
+ iNetwork.resetNetworkConfig('wlan',self.checkInterfaceCB)
+ self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
+ elif iface == 'ath0':
+ if iface in iNetwork.configuredNetworkAdapters and len(iNetwork.configuredNetworkAdapters) == 1:
+ if iNetwork.getAdapterAttribute(iface, 'up') is True:
+ self.isInterfaceUp = True
+ else:
+ self.isInterfaceUp = False
+ self.resetfinishedCB(False)
+ else:
+ iNetwork.resetNetworkConfig('wlan-mpci',self.checkInterfaceCB)
+ self.myref = self.session.openWithCallback(self.resetfinishedCB, MessageBox, _("Please wait while we prepare your network interfaces..."), type = MessageBox.TYPE_INFO, enable_input = False)
+ else:
+ self.resetfinishedCB(False)
+
+ def resetfinishedCB(self,data):
+ if data is True:
+ self.currStep = self.getStepWithID(self.NextStep)
+ self.afterAsyncCode()
+ else:
+ self.currStep = self.getStepWithID(self.NextStep)
+ self.afterAsyncCode()
+
+ def checkInterfaceCB(self,callback,iface):
+ if callback is not None:
+ if callback is True:
+ iNetwork.getInterfaces(self.getInterfacesDataAvail)
+
+
+ def getInterfacesDataAvail(self, data):
+ if data is True:
+ if iNetwork.getAdapterAttribute(self.selectedInterface, 'up') is True:
+ self.isInterfaceUp = True
+ else:
+ self.isInterfaceUp = False
+ self.myref.close(True)
+
+ def AdapterSetupEnd(self, iface):
+ if iNetwork.getAdapterAttribute(iface, "dhcp") is True:
+ iNetwork.checkNetworkState(self.AdapterSetupEndFinished)
+ self.AdapterRef = self.session.openWithCallback(self.AdapterSetupEndCB, MessageBox, _("Please wait while we test your network..."), type = MessageBox.TYPE_INFO, enable_input = False)
+
+ else:
+ self.currStep = self.getStepWithID("confdns")
+ self.afterAsyncCode()
+
+ def AdapterSetupEndCB(self,data):
+ if data is True:
+ self.currStep = self.getStepWithID("checklanstatusend")
+ self.afterAsyncCode()
+
+ def AdapterSetupEndFinished(self,data):
+ if data <= 2:
+ self.InterfaceState = True
+ else:
+ self.InterfaceState = False
+ self.AdapterRef.close(True)
+
+ def checkNetwork(self):
+ iNetwork.checkNetworkState(self.checkNetworkStateFinished)
+ self.checkRef = self.session.openWithCallback(self.checkNetworkCB, MessageBox, _("Please wait while we test your network..."), type = MessageBox.TYPE_INFO, enable_input = False)
+
+ def checkNetworkCB(self,data):
+ if data is True:
+ self.currStep = self.getStepWithID("checklanstatusend")
+ self.afterAsyncCode()
+
+ def checkNetworkStateFinished(self,data):
+ if data <= 2:
+ self.InterfaceState = True
+ else:
+ self.InterfaceState = False
+ self.checkRef.close(True)
+
+ def markDone(self):
+ pass
+
+ def listModes(self):
+ list = []
+ self.WlanList = []
+ try:
+ from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan
+ except ImportError:
+ list.append( ( _("No networks found"),_("unavailable") ) )
+ self.WlanList.append(_("No networks found"))
+ return list
+ else:
+ self.w = Wlan(self.selectedInterface)
+ aps = self.w.getNetworkList()
+ if aps is not None:
+ print "[NetworkWizard.py] got Accespoints!"
+ for ap in aps:
+ a = aps[ap]
+ if a['active']:
+ if a['essid'] != "":
+ #a['essid'] = a['bssid']
+ list.append( (a['essid'], a['essid']) )
+ self.WlanList.append(a['essid'])
+ if "hidden..." not in list:
+ list.append( ( _("enter hidden network SSID"),_("hidden...") ) )
+ self.WlanList.append(_("hidden..."))
+ return list
+
+ def modeSelectionMade(self, index):
+ self.modeSelect(index)
+
+ def modeSelectionMoved(self):
+ self.modeSelect(self.selection)
+
+ def modeSelect(self, mode):
+ self.ap = mode
+ print "ModeSelected:", mode
+
+ def restartNetwork(self):
+ iNetwork.restartNetwork()
+ self.checkNetwork()
+
+ def isWlanPluginInstalled(self):
+ try:
+ from Plugins.SystemPlugins.WirelessLan.Wlan import Wlan
+ except ImportError:
+ self.WlanPluginInstalled = False
+ else:
+ self.WlanPluginInstalled = True
+
--- /dev/null
+installdir = $(datadir)/meta/
+
+dist_install_DATA = plugin_networkwizard.xml
--- /dev/null
+<default>
+ <prerequisites>
+ <tag type="System" />
+ </prerequisites>
+ <info language="en">
+ <author>Dream Multimedia</author>
+ <name>NetworkWizard</name>
+ <packagename>enigma2-plugin-systemplugins-networkwizard</packagename>
+ <shortdescription>Step by step network configuration</shortdescription>
+ <description>With the NetworkWizard you can easy configure your network step by step.
+ </description>
+ </info>
+ <info language="de">
+ <author>Dream Multimedia</author>
+ <name>NetzwerkWizard</name>
+ <packagename>enigma2-plugin-systemplugins-networkwizard</packagename>
+ <shortdescription>Schritt für Schritt Netzwerk konfiguration</shortdescription>
+ <description>Mit dem NetzwerkWizard können Sie Ihr Netzwerk konfigurieren. Sie werden Schritt
+ für Schritt durch die Konfiguration geleitet.
+ </description>
+ </info>
+ <files type="package"> <!-- without version, without .ipk -->
+ <file type="package" name="enigma2-plugin-systemplugins-networkwizard" />
+ </files>
+</default>
--- /dev/null
+<wizard>
+ <step id="welcome" nextstep="selectinterface">
+ <text value="Welcome.\n\nIf you want to connect your Dreambox to the Internet, this wizard will guide you through the basic network setup of your Dreambox.\n\nPress OK to start configuring your network" />
+ <displaytext value="Network Wizard" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+ </code>
+ </step>
+
+ <step id="selectinterface">
+ <text value="Please select the network interface that you want to use for your internet connection.\n\nPlease press OK to continue." />
+ <displaytext value="Select interface" />
+ <list type="dynamic" source="listInterfaces" evaluation="InterfaceSelectionMade" onselect="InterfaceSelectionMoved" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+ </code>
+ <code pos="after" async="yes">
+self.checkInterface(self.selectedInterface)
+ </code>
+ </step>
+
+ <step id="nwconfig">
+ <text value="Please configure your internet connection by filling out the required values.\nWhen you are ready press OK to continue." />
+ <displaytext value="Configure interface" />
+ <config screen="AdapterSetup" module="NetworkSetup" args="self.selectedInterface" type="ConfigList" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+self.selectKey("LEFT")
+self.selectKey("RIGHT")
+ </code>
+ <code pos="after" async="yes">
+self.AdapterSetupEnd(self.selectedInterface)
+ </code>
+ </step>
+
+ <step id="confdns" nextstep="checklanstatusend">
+ <text value="Please configure or verify your Nameservers by filling out the required values.\nWhen you are ready press OK to continue." />
+ <displaytext value="Configure nameservers" />
+ <config screen="NameserverSetup" module="NetworkSetup" type="ConfigList" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+ </code>
+ <code pos="after" async="yes">
+self.checkNetwork()
+ </code>
+ </step>
+
+ <step id="checklanstatusend" nextstep="end">
+ <condition>
+self.condition = (self.InterfaceState == True )
+ </condition>
+ <text value="Your Dreambox is now ready to use.\n\nYour internet connection is working now.\n\nPlease press OK to continue." />
+ <displaytext value="Please follow the instructions on the TV" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+ </code>
+ <code pos="after">
+currStep = self.numSteps
+self.wizard[currStep]["nextstep"] = None
+self.markDone()
+self.close()
+ </code>
+ </step>
+
+ <step id="checklanstatusend">
+ <condition>
+self.condition = (self.InterfaceState == False )
+ </condition>
+ <text value="Your internet connection is not working!\nPlease choose what you want to do next." />
+ <displaytext value="Please follow the instructions on the TV" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+ </code>
+ <list>
+ <listentry caption="Configure your network again" step="selectinterface" />
+ <listentry caption="Exit network wizard" step="end" />
+ </list>
+ </step>
+
+ <step id="scanwlan" nextstep="wlanconfig">
+ <condition>
+self.condition = (self.isInterfaceUp == True and self.WlanPluginInstalled == True)
+ </condition>
+ <text value="Please select the wireless network that you want to connect to.\n\nPlease press OK to continue." />
+ <displaytext value="Select wireless network" />
+ <list type="dynamic" source="listModes" evaluation="modeSelectionMade" onselect="modeSelectionMoved" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+self.selectKey("LEFT")
+self.selectKey("RIGHT")
+ </code>
+ </step>
+
+ <step id="scanwlan">
+ <condition>
+self.condition = (self.isInterfaceUp == False and self.WlanPluginInstalled == True)
+ </condition>
+ <text value="Your wireless LAN internet connection could not be started!\nHave you attached your USB WLAN Stick?\n\nPlease choose what you want to do next." />
+ <displaytext value="Please follow the instructions on the TV" />
+ <list>
+ <listentry caption="Configure your wireless LAN again" step="scanwlan" />
+ <listentry caption="Configure your internal LAN" step="selectinterface" />
+ <listentry caption="Exit network wizard" step="end" />
+ </list>
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+ </code>
+ </step>
+
+ <step id="scanwlan">
+ <condition>
+self.condition = (self.isInterfaceUp == True and self.WlanPluginInstalled == False)
+ </condition>
+ <text value="The wireless LAN plugin is not installed!\nPlease install it and choose what you want to do next." />
+ <displaytext value="Please follow the instructions on the TV" />
+ <list>
+ <listentry caption="Configure your internal LAN" step="selectinterface" />
+ <listentry caption="Exit network wizard" step="end" />
+ </list>
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+ </code>
+ </step>
+
+ <step id="wlanconfig">
+ <text value="Please configure your internet connection by filling out the required values.\nWhen you are ready press OK to continue." />
+ <displaytext value="Configure interface" />
+ <config screen="AdapterSetup" module="NetworkSetup" args="(self.selectedInterface,self.ap,self.WlanList)" type="ConfigList" />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+self.selectKey("UP")
+self.selectKey("DOWN")
+self.selectKey("LEFT")
+self.selectKey("RIGHT")
+ </code>
+ <code pos="after" async="yes">
+self.AdapterSetupEnd(self.selectedInterface)
+ </code>
+ </step>
+
+ <step id="end">
+ <text value="Thank you for using the wizard.\nPlease press OK to continue." />
+ <code>
+self.clearSelectedKeys()
+self.selectKey("OK")
+ </code>
+ </step>
+</wizard>
+
+
--- /dev/null
+from Screens.Screen import Screen
+from Plugins.Plugin import PluginDescriptor
+from Components.config import getConfigListEntry, config
+
+def NetworkWizardMain(session, **kwargs):
+ session.open(NetworkWizard)
+
+def startSetup(menuid):
+ if menuid != "system":
+ return [ ]
+
+ return [(_("Network Wizard") + "...", NetworkWizardMain, "nw_wizard", 40)]
+
+def NetworkWizard(*args, **kwargs):
+ from NetworkWizard import NetworkWizard
+ return NetworkWizard(*args, **kwargs)
+
+def Plugins(**kwargs):
+ list = []
+ if config.misc.firstrun.value:
+ list.append(PluginDescriptor(name=_("Network Wizard"), where = PluginDescriptor.WHERE_WIZARD, fnc=(25, NetworkWizard)))
+ return list
--- /dev/null
+This plugin is licensed under the Creative Commons
+Attribution-NonCommercial-ShareAlike 3.0 Unported
+License. To view a copy of this license, visit
+http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
+Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
+
+Alternatively, this plugin may be distributed and executed on hardware which
+is licensed by Dream Multimedia GmbH.
+
+This plugin is NOT free software. It is open source, you are allowed to
+modify it (if you keep the license), but it may not be commercially
+distributed other than under the conditions noted above.
--- /dev/null
+installdir = $(pkglibdir)/python/Plugins/SystemPlugins/WirelessLan
+
+#SUBDIRS = meta
+
+install_PYTHON = \
+ __init__.py \
+ flags.py \
+ iwlibs.py \
+ plugin.py \
+ Wlan.py
+
+dist_install_DATA = \
+ LICENSE
--- /dev/null
+from enigma import eListboxPythonMultiContent, eListbox, gFont, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, RT_HALIGN_CENTER
+from Components.MultiContent import MultiContentEntryText
+from Components.GUIComponent import GUIComponent
+from Components.HTMLComponent import HTMLComponent
+from Components.config import config, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
+from Components.Console import Console
+
+from os import system
+from string import maketrans, strip
+import sys
+import types
+from re import compile as re_compile, search as re_search
+from iwlibs import getNICnames, Wireless, Iwfreq
+
+list = []
+list.append("WEP")
+list.append("WPA")
+list.append("WPA2")
+list.append("WPA/WPA2")
+
+weplist = []
+weplist.append("ASCII")
+weplist.append("HEX")
+
+config.plugins.wlan = ConfigSubsection()
+config.plugins.wlan.essid = NoSave(ConfigText(default = "home", fixed_size = False))
+config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = "home", fixed_size = False))
+
+config.plugins.wlan.encryption = ConfigSubsection()
+config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = True))
+config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = "WPA/WPA2"))
+config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII"))
+config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewlan", fixed_size = False))
+
+class Wlan:
+ def __init__(self, iface):
+ a = ''; b = ''
+
+ for i in range(0, 255):
+ a = a + chr(i)
+ if i < 32 or i > 127:
+ b = b + ' '
+ else:
+ b = b + chr(i)
+
+ self.iface = iface
+ self.wlaniface = {}
+ self.WlanConsole = Console()
+ self.asciitrans = maketrans(a, b)
+
+ def stopWlanConsole(self):
+ if self.WlanConsole is not None:
+ print "killing self.WlanConsole"
+ self.WlanConsole = None
+ del self.WlanConsole
+
+ def getDataForInterface(self, callback = None):
+ #get ip out of ip addr, as avahi sometimes overrides it in ifconfig.
+ print "self.iface im getDataForInterface",self.iface
+ if len(self.WlanConsole.appContainers) == 0:
+ self.WlanConsole = Console()
+ cmd = "iwconfig " + self.iface
+ self.WlanConsole.ePopen(cmd, self.iwconfigFinished, callback)
+
+ def iwconfigFinished(self, result, retval, extra_args):
+ print "self.iface im iwconfigFinished",self.iface
+ callback = extra_args
+ data = { 'essid': False, 'frequency': False, 'acesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False }
+ #print "result im iwconfigFinished",result
+
+ for line in result.splitlines():
+ #print "line",line
+ line = line.strip()
+ if "ESSID" in line:
+ if "off/any" in line:
+ ssid = _("No Connection")
+ else:
+ tmpssid=(line[line.index('ESSID')+7:len(line)-1])
+ if tmpssid == '':
+ ssid = _("Hidden networkname")
+ elif tmpssid ==' ':
+ ssid = _("Hidden networkname")
+ else:
+ ssid = tmpssid
+ #print "SSID->",ssid
+ if ssid is not None:
+ data['essid'] = ssid
+ if 'Frequency' in line:
+ frequency = line[line.index('Frequency')+10 :line.index(' GHz')]
+ #print "Frequency",frequency
+ if frequency is not None:
+ data['frequency'] = frequency
+ if "Access Point" in line:
+ ap=line[line.index('Access Point')+14:len(line)-1]
+ #print "AP",ap
+ if ap is not None:
+ data['acesspoint'] = ap
+ if "Bit Rate" in line:
+ br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')]
+ #print "Bitrate",br
+ if br is not None:
+ data['bitrate'] = br
+ if 'Encryption key' in line:
+ if ":off" in line:
+ enc = _("Disabled")
+ else:
+ enc = line[line.index('Encryption key')+15 :line.index(' Security')]
+ #print "Encryption key",enc
+ if enc is not None:
+ data['encryption'] = _("Enabled")
+ if 'Quality' in line:
+ if "/100" in line:
+ qual = line[line.index('Quality')+8:line.index('/100')]
+ else:
+ qual = line[line.index('Quality')+8:line.index('Sig')]
+ #print "Quality",qual
+ if qual is not None:
+ data['quality'] = qual
+ if 'Signal level' in line:
+ signal = line[line.index('Signal level')+14 :line.index(' dBm')]
+ #print "Signal level",signal
+ if signal is not None:
+ data['signal'] = signal
+
+ self.wlaniface[self.iface] = data
+
+ if len(self.WlanConsole.appContainers) == 0:
+ print "self.wlaniface after loading:", self.wlaniface
+ self.WlanConsole = None
+ if callback is not None:
+ callback(True,self.wlaniface)
+
+ def getAdapterAttribute(self, attribute):
+ print "im getAdapterAttribute"
+ if self.wlaniface.has_key(self.iface):
+ print "self.wlaniface.has_key",self.iface
+ if self.wlaniface[self.iface].has_key(attribute):
+ return self.wlaniface[self.iface][attribute]
+ return None
+
+ def asciify(self, str):
+ return str.translate(self.asciitrans)
+
+
+ def getWirelessInterfaces(self):
+ iwifaces = None
+ try:
+ iwifaces = getNICnames()
+ except:
+ print "[Wlan.py] No Wireless Networkcards could be found"
+
+ return iwifaces
+
+
+ def getNetworkList(self):
+ system("ifconfig "+self.iface+" up")
+ ifobj = Wireless(self.iface) # a Wireless NIC Object
+
+ #Association mappings
+ stats, quality, discard, missed_beacon = ifobj.getStatistics()
+ snr = quality.signallevel - quality.noiselevel
+
+ try:
+ scanresults = ifobj.scan()
+ except:
+ scanresults = None
+ print "[Wlan.py] No Wireless Networks could be found"
+
+ if scanresults is not None:
+ aps = {}
+ for result in scanresults:
+
+ bssid = result.bssid
+
+ encryption = map(lambda x: hex(ord(x)), result.encode)
+
+ if encryption[-1] == "0x8":
+ encryption = True
+ else:
+ encryption = False
+
+ extra = []
+ for element in result.custom:
+ element = element.encode()
+ extra.append( strip(self.asciify(element)) )
+
+ if result.quality.sl is 0 and len(extra) > 0:
+ begin = extra[0].find('SignalStrength=')+15
+
+ done = False
+ end = begin+1
+
+ while not done:
+ if extra[0][begin:end].isdigit():
+ end += 1
+ else:
+ done = True
+ end -= 1
+
+ signal = extra[0][begin:end]
+ #print "[Wlan.py] signal is:" + str(signal)
+
+ else:
+ signal = str(result.quality.sl)
+
+ aps[bssid] = {
+ 'active' : True,
+ 'bssid': result.bssid,
+ 'channel': result.frequency.getChannel(result.frequency.getFrequency()),
+ 'encrypted': encryption,
+ 'essid': strip(self.asciify(result.essid)),
+ 'iface': self.iface,
+ 'maxrate' : result.rate[-1],
+ 'noise' : result.quality.getNoiselevel(),
+ 'quality' : str(result.quality.quality),
+ 'signal' : signal,
+ 'custom' : extra,
+ }
+ print aps[bssid]
+ return aps
+
+
+ def getStatus(self):
+ ifobj = Wireless(self.iface)
+ fq = Iwfreq()
+ try:
+ self.channel = str(fq.getChannel(str(ifobj.getFrequency()[0:-3])))
+ except:
+ self.channel = 0
+ #print ifobj.getStatistics()
+ status = {
+ 'BSSID': str(ifobj.getAPaddr()),
+ 'ESSID': str(ifobj.getEssid()),
+ 'quality': str(ifobj.getStatistics()[1].quality),
+ 'signal': str(ifobj.getStatistics()[1].sl),
+ 'bitrate': str(ifobj.getBitrate()),
+ 'channel': str(self.channel),
+ #'channel': str(fq.getChannel(str(ifobj.getFrequency()[0:-3]))),
+ }
+
+ for (key, item) in status.items():
+ if item is "None" or item is "":
+ status[key] = _("N/A")
+
+ return status
+
+
+
+class WlanList(HTMLComponent, GUIComponent):
+ def __init__(self, session, iface):
+
+ GUIComponent.__init__(self)
+ self.w = Wlan(iface)
+ self.iface = iface
+
+ self.length = 0
+ self.aplist = None
+ self.list = None
+ self.oldlist = None
+ self.l = None
+ self.l = eListboxPythonMultiContent()
+
+ self.l.setFont(0, gFont("Regular", 32))
+ self.l.setFont(1, gFont("Regular", 18))
+ self.l.setFont(2, gFont("Regular", 16))
+ self.l.setBuildFunc(self.buildWlanListEntry)
+
+ self.reload()
+
+ def buildWlanListEntry(self, essid, bssid, encrypted, iface, maxrate, signal):
+
+ res = [ (essid, encrypted, iface) ]
+
+ if essid == "":
+ essid = bssid
+
+ e = encrypted and _("Yes") or _("No")
+ res.append( MultiContentEntryText(pos=(0, 0), size=(470, 35), font=0, flags=RT_HALIGN_LEFT, text=essid) )
+ res.append( MultiContentEntryText(pos=(425, 0), size=(60, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Signal: ")))
+ res.append( MultiContentEntryText(pos=(480, 0), size=(70, 35), font=0, flags=RT_HALIGN_RIGHT, text="%s" %signal))
+ res.append( MultiContentEntryText(pos=(0, 40), size=(180, 20), font=1, flags=RT_HALIGN_LEFT, text=_("Max. Bitrate: %s") %maxrate ))
+ res.append( MultiContentEntryText(pos=(190, 40), size=(180, 20), font=1, flags=RT_HALIGN_CENTER, text=_("Encrypted: %s") %e ))
+ res.append( MultiContentEntryText(pos=(345, 40), size=(190, 20), font=1, flags=RT_HALIGN_RIGHT, text=_("Interface: %s") %iface ))
+ return res
+
+
+ def reload(self):
+ aps = self.w.getNetworkList()
+
+ self.list = []
+ self.aplist = []
+ if aps is not None:
+ print "[Wlan.py] got Accespoints!"
+ for ap in aps:
+ a = aps[ap]
+ if a['active']:
+ if a['essid'] != '':
+ # a['essid'] = a['bssid']
+ self.list.append( (a['essid'], a['bssid'], a['encrypted'], a['iface'], a['maxrate'], a['signal']) )
+ #self.aplist.append( a['essid'])
+ if self.oldlist is not None:
+ for entry in self.oldlist:
+ if entry not in self.list:
+ self.list.append(entry)
+
+ if len(self.list):
+ for entry in self.list:
+ self.aplist.append( entry[0])
+ self.length = len(self.list)
+ self.oldlist = self.list
+ self.l.setList([])
+ self.l.setList(self.list)
+
+ GUI_WIDGET = eListbox
+
+
+ def getCurrent(self):
+ return self.l.getCurrentSelection()
+
+
+ def postWidgetCreate(self, instance):
+ instance.setContent(self.l)
+ instance.setItemHeight(60)
+
+
+ def getLength(self):
+ return self.length
+
+ def getList(self):
+ return self.aplist
+
+
+class wpaSupplicant:
+ def __init__(self):
+ pass
+
+
+ def writeConfig(self):
+
+ essid = config.plugins.wlan.essid.value
+ hiddenessid = config.plugins.wlan.hiddenessid.value
+ encrypted = config.plugins.wlan.encryption.enabled.value
+ encryption = config.plugins.wlan.encryption.type.value
+ wepkeytype = config.plugins.wlan.encryption.wepkeytype.value
+ psk = config.plugins.wlan.encryption.psk.value
+ fp = file('/etc/wpa_supplicant.conf', 'w')
+ fp.write('#WPA Supplicant Configuration by enigma2\n')
+ fp.write('ctrl_interface=/var/run/wpa_supplicant\n')
+ fp.write('eapol_version=1\n')
+ fp.write('fast_reauth=1\n')
+ if essid == 'hidden...':
+ fp.write('ap_scan=2\n')
+ else:
+ fp.write('ap_scan=1\n')
+ fp.write('network={\n')
+ if essid == 'hidden...':
+ fp.write('\tssid="'+hiddenessid+'"\n')
+ else:
+ fp.write('\tssid="'+essid+'"\n')
+ fp.write('\tscan_ssid=0\n')
+ if encrypted:
+ if encryption == 'WPA' or encryption == 'WPA2' or encryption == 'WPA/WPA2' :
+ fp.write('\tkey_mgmt=WPA-PSK\n')
+
+ if encryption == 'WPA':
+ fp.write('\tproto=WPA\n')
+ fp.write('\tpairwise=TKIP\n')
+ fp.write('\tgroup=TKIP\n')
+ elif encryption == 'WPA2':
+ fp.write('\tproto=WPA RSN\n')
+ fp.write('\tpairwise=CCMP TKIP\n')
+ fp.write('\tgroup=CCMP TKIP\n')
+ else:
+ fp.write('\tproto=WPA WPA2\n')
+ fp.write('\tpairwise=CCMP\n')
+ fp.write('\tgroup=TKIP\n')
+ fp.write('\tpsk="'+psk+'"\n')
+
+ elif encryption == 'WEP':
+ fp.write('\tkey_mgmt=NONE\n')
+ if wepkeytype == 'ASCII':
+ fp.write('\twep_key0="'+psk+'"\n')
+ else:
+ fp.write('\twep_key0='+psk+'\n')
+ else:
+ fp.write('\tkey_mgmt=NONE\n')
+ fp.write('}')
+ fp.write('\n')
+ fp.close()
+ system("cat /etc/wpa_supplicant.conf")
+
+ def loadConfig(self):
+ try:
+ #parse the wpasupplicant configfile
+ fp = file('/etc/wpa_supplicant.conf', 'r')
+ supplicant = fp.readlines()
+ fp.close()
+ ap_scan = False
+ essid = None
+
+ for s in supplicant:
+ split = s.strip().split('=',1)
+ if split[0] == 'ap_scan':
+ print "[Wlan.py] Got Hidden SSID Scan Value "+split[1]
+ if split[1] == '2':
+ ap_scan = True
+ else:
+ ap_scan = False
+
+ elif split[0] == 'ssid':
+ print "[Wlan.py] Got SSID "+split[1][1:-1]
+ essid = split[1][1:-1]
+
+ elif split[0] == 'proto':
+ print "split[1]",split[1]
+ config.plugins.wlan.encryption.enabled.value = True
+ if split[1] == "WPA" :
+ mode = 'WPA'
+ if split[1] == "WPA WPA2" :
+ mode = 'WPA/WPA2'
+ if split[1] == "WPA RSN" :
+ mode = 'WPA2'
+ config.plugins.wlan.encryption.type.value = mode
+ print "[Wlan.py] Got Encryption: "+mode
+
+ #currently unused !
+ #elif split[0] == 'key_mgmt':
+ # print "split[1]",split[1]
+ # if split[1] == "WPA-PSK" :
+ # config.plugins.wlan.encryption.enabled.value = True
+ # config.plugins.wlan.encryption.type.value = "WPA/WPA2"
+ # print "[Wlan.py] Got Encryption: "+ config.plugins.wlan.encryption.type.value
+
+ elif split[0] == 'wep_key0':
+ config.plugins.wlan.encryption.enabled.value = True
+ config.plugins.wlan.encryption.type.value = 'WEP'
+ if split[1].startswith('"') and split[1].endswith('"'):
+ config.plugins.wlan.encryption.wepkeytype.value = 'ASCII'
+ config.plugins.wlan.encryption.psk.value = split[1][1:-1]
+ else:
+ config.plugins.wlan.encryption.wepkeytype.value = 'HEX'
+ config.plugins.wlan.encryption.psk.value = split[1]
+ print "[Wlan.py] Got Encryption: WEP - keytype is: "+config.plugins.wlan.encryption.wepkeytype.value
+ print "[Wlan.py] Got Encryption: WEP - key0 is: "+config.plugins.wlan.encryption.psk.value
+
+ elif split[0] == 'psk':
+ config.plugins.wlan.encryption.psk.value = split[1][1:-1]
+ print "[Wlan.py] Got PSK: "+split[1][1:-1]
+ else:
+ pass
+
+ if ap_scan is True:
+ config.plugins.wlan.hiddenessid.value = essid
+ config.plugins.wlan.essid.value = 'hidden...'
+ else:
+ config.plugins.wlan.hiddenessid.value = essid
+ config.plugins.wlan.essid.value = essid
+ wsconfig = {
+ 'hiddenessid': config.plugins.wlan.hiddenessid.value,
+ 'ssid': config.plugins.wlan.essid.value,
+ 'encryption': config.plugins.wlan.encryption.enabled.value,
+ 'encryption_type': config.plugins.wlan.encryption.type.value,
+ 'encryption_wepkeytype': config.plugins.wlan.encryption.wepkeytype.value,
+ 'key': config.plugins.wlan.encryption.psk.value,
+ }
+
+ for (key, item) in wsconfig.items():
+ if item is "None" or item is "":
+ if key == 'hiddenessid':
+ wsconfig['hiddenessid'] = "home"
+ if key == 'ssid':
+ wsconfig['ssid'] = "home"
+ if key == 'encryption':
+ wsconfig['encryption'] = True
+ if key == 'encryption':
+ wsconfig['encryption_type'] = "WPA/WPA2"
+ if key == 'encryption':
+ wsconfig['encryption_wepkeytype'] = "ASCII"
+ if key == 'encryption':
+ wsconfig['key'] = "mysecurewlan"
+
+ except:
+ print "[Wlan.py] Error parsing /etc/wpa_supplicant.conf"
+ wsconfig = {
+ 'hiddenessid': "home",
+ 'ssid': "home",
+ 'encryption': True,
+ 'encryption_type': "WPA/WPA2",
+ 'encryption_wepkeytype': "ASCII",
+ 'key': "mysecurewlan",
+ }
+ print "[Wlan.py] WS-CONFIG-->",wsconfig
+ return wsconfig
+
+
+ def restart(self, iface):
+ system("start-stop-daemon -K -x /usr/sbin/wpa_supplicant")
+ system("start-stop-daemon -S -x /usr/sbin/wpa_supplicant -- -B -i"+iface+" -c/etc/wpa_supplicant.conf")
+
+class Status:
+ def __init__(self):
+ self.wlaniface = {}
+ self.backupwlaniface = {}
+ self.WlanConsole = Console()
+
+ def stopWlanConsole(self):
+ if self.WlanConsole is not None:
+ print "killing self.WlanConsole"
+ self.WlanConsole = None
+
+ def getDataForInterface(self, iface, callback = None):
+ self.WlanConsole = Console()
+ cmd = "iwconfig " + iface
+ self.WlanConsole.ePopen(cmd, self.iwconfigFinished, [iface, callback])
+
+ def iwconfigFinished(self, result, retval, extra_args):
+ (iface, callback) = extra_args
+ data = { 'essid': False, 'frequency': False, 'acesspoint': False, 'bitrate': False, 'encryption': False, 'quality': False, 'signal': False }
+ for line in result.splitlines():
+ line = line.strip()
+ if "ESSID" in line:
+ if "off/any" in line:
+ ssid = _("No Connection")
+ else:
+ tmpssid=(line[line.index('ESSID')+7:len(line)-1])
+ if tmpssid == '':
+ ssid = _("Hidden networkname")
+ elif tmpssid ==' ':
+ ssid = _("Hidden networkname")
+ else:
+ ssid = tmpssid
+ #print "SSID->",ssid
+ if ssid is not None:
+ data['essid'] = ssid
+ if 'Frequency' in line:
+ frequency = line[line.index('Frequency')+10 :line.index(' GHz')]
+ #print "Frequency",frequency
+ if frequency is not None:
+ data['frequency'] = frequency
+ if "Access Point" in line:
+ ap=line[line.index('Access Point')+14:len(line)]
+ #print "AP",ap
+ if ap is not None:
+ data['acesspoint'] = ap
+ if ap == "Not-Associated":
+ data['essid'] = _("No Connection")
+ if "Bit Rate" in line:
+ if "kb" in line:
+ br = line[line.index('Bit Rate')+9 :line.index(' kb/s')]
+ if br == '0':
+ br = _("Unsupported")
+ else:
+ br += " Mb/s"
+ else:
+ br = line[line.index('Bit Rate')+9 :line.index(' Mb/s')] + " Mb/s"
+ #print "Bitrate",br
+ if br is not None:
+ data['bitrate'] = br
+ if 'Encryption key' in line:
+ if ":off" in line:
+ if data['acesspoint'] is not "Not-Associated":
+ enc = _("Unsupported")
+ else:
+ enc = _("Disabled")
+ else:
+ enc = line[line.index('Encryption key')+15 :line.index(' Security')]
+ if enc is not None:
+ enc = _("Enabled")
+ #print "Encryption key",enc
+ if enc is not None:
+ data['encryption'] = enc
+ if 'Quality' in line:
+ if "/100" in line:
+ qual = line[line.index('Quality')+8:line.index('/100')]
+ else:
+ qual = line[line.index('Quality')+8:line.index('Sig')]
+ #print "Quality",qual
+ if qual is not None:
+ data['quality'] = qual
+ if 'Signal level' in line:
+ if "dBm" in line:
+ signal = line[line.index('Signal level')+14 :line.index(' dBm')]
+ signal += " dBm"
+ elif "/100" in line:
+ signal = line[line.index('Signal level')+13:line.index('/100 Noise')]
+ signal += "%"
+ else:
+ signal = line[line.index('Signal level')+13:line.index(' Noise')]
+ signal += "%"
+ #print "Signal level",signal
+ if signal is not None:
+ data['signal'] = signal
+
+ self.wlaniface[iface] = data
+ self.backupwlaniface = self.wlaniface
+
+ if self.WlanConsole is not None:
+ if len(self.WlanConsole.appContainers) == 0:
+ print "self.wlaniface after loading:", self.wlaniface
+ if callback is not None:
+ callback(True,self.wlaniface)
+
+ def getAdapterAttribute(self, iface, attribute):
+ print "im getAdapterAttribute"
+ self.iface = iface
+ if self.wlaniface.has_key(self.iface):
+ print "self.wlaniface.has_key",self.iface
+ if self.wlaniface[self.iface].has_key(attribute):
+ return self.wlaniface[self.iface][attribute]
+ return None
+
+iStatus = Status()
\ No newline at end of file
--- /dev/null
+# -*- coding: ISO-8859-1 -*-
+# python-wifi -- a wireless library to access wireless cards via python
+# Copyright (C) 2004, 2005, 2006 Róman Joost
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+
+modes = ['Auto',
+ 'Ad-Hoc',
+ 'Managed',
+ 'Master',
+ 'Repeat',
+ 'Second',
+ 'Monitor']
+
+IFNAMSIZE = 16
+IW_ESSID_MAX_SIZE = 16
+
+KILO = 10**3
+MEGA = 10**6
+GIGA = 10**9
+
+# ioctl calls for the Linux/i386 kernel
+SIOCIWFIRST = 0x8B00 # FIRST ioctl identifier
+SIOCGIFCONF = 0x8912 # ifconf struct
+SIOCGIWNAME = 0x8B01 # get name == wireless protocol
+SIOCGIWFREQ = 0x8B05 # get channel/frequency
+SIOCSIWMODE = 0x8B06 # set the operation mode
+SIOCGIWMODE = 0x8B07 # get operation mode
+SIOCGIWSENS = 0x8B09 # get sensitivity
+SIOCGIWAP = 0x8B15 # get AP MAC address
+SIOCSIWSCAN = 0x8B18 # set scanning off
+SIOCGIWSCAN = 0x8B19 # get scanning results
+SIOCGIWRATE = 0x8B21 # get default bit rate
+SIOCGIWRTS = 0x8B23 # get rts/cts threshold
+SIOCGIWFRAG = 0x8B25 # get fragmention thrh
+SIOCGIWTXPOW = 0x8B27 # get transmit power (dBm)
+SIOCGIWRETRY = 0x8B29 # get retry limit
+SIOCGIWRANGE = 0x8B0B # range
+SIOCGIWSTATS = 0x8B0F # get wireless statistics
+SIOCSIWESSID = 0x8B1A # set essid
+SIOCGIWESSID = 0x8B1B # get essid
+SIOCGIWPOWER = 0x8B2D # get power managment settings
+SIOCGIWENCODE = 0x8B2B # get encryption information
+SIOCIWLAST = 0x8BFF # LAST ioctl identifier
+
+# Power management flags
+IW_POWER_ON = 0x0000 # No details ...
+IW_POWER_TYPE = 0xF000 # Type of parameter
+IW_POWER_PERIOD = 0x1000 # Value is a period/duration of
+IW_POWER_TIMEOUT = 0x2000 # Value is a timeout
+IW_POWER_MODE = 0x0F00 # Power management mode
+IW_POWER_MIN = 0x0001 # Value is a minimum
+IW_POWER_MAX = 0x0002 # Value is a maximum
+IW_POWER_RELATIVE = 0x0004 # Value is not in seconds/ms/us
+
+# Retry limits
+IW_RETRY_TYPE = 0xF000 # Type of parameter
+
+# encoding stuff
+IW_ENCODE_DISABLED = 0x8000 # encoding is disabled
+IW_ENCODE_NOKEY = 0x0800 # key is write only, not present
+
+# constants responsible for scanning
+IW_SCAN_MAX_DATA = 4096
+
+IW_EV_LCP_LEN = 4
+IW_EV_CHAR_LEN = IW_EV_LCP_LEN + IFNAMSIZE
+IW_EV_UINT_LEN = IW_EV_LCP_LEN + 4
+IW_EV_FREQ_LEN = IW_EV_LCP_LEN + 8
+IW_EV_ADDR_LEN = IW_EV_LCP_LEN + 16
+IW_EV_POINT_LEN = IW_EV_LCP_LEN + 4
+IW_EV_PARAM_LEN = IW_EV_LCP_LEN + 8
+IW_EV_QUAL_LEN = IW_EV_LCP_LEN + 4
+
+EPERM = 1
+E2BIG = 7
+EAGAIN = 11
+
+IWHT_NULL = 0
+IWHT_CHAR = 2
+IWHT_UINT = 4
+IWHT_FREQ = 5
+IWHT_ADDR = 6
+IWHT_POINT = 8
+IWHT_PARAM = 9
+IWHT_QUAL = 10
+
+IWEVFIRST = 0x8C00 # FIRST event identifier
+IWEVQUAL = 0x8C01 # Quality statistics from scan
+IWEVCUSTOM = 0x8C02 # Custom Ascii string from Driver
+IWEVLAST = 0x8C0A # LAST event identifier
--- /dev/null
+# -*- coding: ISO-8859-1 -*-
+# python-wifi -- a wireless library to access wireless cards via python
+# Copyright (C) 2004, 2005, 2006 Róman Joost
+#
+# Contributions from:
+# Mike Auty <m.auty@softhome.net> (Iwscanresult, Iwscan)
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1 of
+# the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+
+from struct import pack as struct_pack, \
+ unpack as struct_unpack, \
+ calcsize as struct_calcsize
+
+from array import array
+from math import ceil, log10
+from fcntl import ioctl
+from socket import AF_INET, SOCK_DGRAM, socket
+from time import sleep
+from re import compile
+
+from flags import *
+
+def getNICnames():
+ """ extract wireless device names of /proc/net/wireless
+
+ returns empty list if no devices are present
+
+ >>> getNICnames()
+ ['eth1', 'wifi0']
+ """
+ device = compile('[a-z]+[0-9]+')
+ ifnames = []
+
+ f = open('/proc/net/wireless', 'r')
+ data = f.readlines()
+ for line in data:
+ try:
+ ifnames.append(device.search(line).group())
+ except AttributeError:
+ pass
+ # if we couldn't lookup the devices, try to ask the kernel
+ if ifnames == []:
+ ifnames = getConfiguredNICnames()
+
+ return ifnames
+
+def getConfiguredNICnames():
+ """get the *configured* ifnames by a systemcall
+
+ >>> getConfiguredNICnames()
+ []
+ """
+ iwstruct = Iwstruct()
+ ifnames = []
+ buff = array('c', '\0'*1024)
+ caddr_t, length = buff.buffer_info()
+ s = iwstruct.pack('iP', length, caddr_t)
+ try:
+ result = iwstruct._fcntl(SIOCGIFCONF, s)
+ except IOError, (i, e):
+ return i, e
+
+ # get the interface names out of the buffer
+ for i in range(0, 1024, 32):
+ ifname = buff.tostring()[i:i+32]
+ ifname = struct_unpack('32s', ifname)[0]
+ ifname = ifname.split('\0', 1)[0]
+ if ifname:
+ # verify if ifnames are really wifi devices
+ wifi = Wireless(ifname)
+ result = wifi.getAPaddr()
+ if result[0] == 0:
+ ifnames.append(ifname)
+
+ return ifnames
+
+def makedict(**kwargs):
+ return kwargs
+
+
+class Wireless(object):
+ """Access to wireless interfaces"""
+
+ def __init__(self, ifname):
+ self.sockfd = socket(AF_INET, SOCK_DGRAM)
+ self.ifname = ifname
+ self.iwstruct = Iwstruct()
+
+ def getAPaddr(self):
+ """ returns accesspoint mac address
+
+ >>> from iwlibs import Wireless, getNICnames
+ >>> ifnames = getNICnames()
+ >>> ifnames
+ ['eth1', 'wifi0']
+ >>> wifi = Wireless(ifnames[0])
+ >>> wifi.getAPaddr()
+ '00:0D:88:8E:4E:93'
+
+ Test with non-wifi card:
+ >>> wifi = Wireless('eth0')
+ >>> wifi.getAPaddr()
+ (95, 'Operation not supported')
+
+ Test with non-existant card:
+ >>> wifi = Wireless('eth2')
+ >>> wifi.getAPaddr()
+ (19, 'No such device')
+ """
+ buff, s = self.iwstruct.pack_wrq(32)
+ i, result = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWAP,
+ data=s)
+ if i > 0:
+ return result
+
+ return self.iwstruct.getMAC(result)
+
+ def getBitrate(self):
+ """returns device currently set bit rate
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getBitrate()
+ '11 Mb/s'
+ """
+ i, result = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWRATE)
+ if i > 0:
+ return result
+ iwfreq = Iwfreq(result)
+ return iwfreq.getBitrate()
+
+ def getBitrates(self):
+ """returns the number of available bitrates for the device
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> num, rates = wifi.getBitrates()
+ >>> num == len(rates)
+ True
+ """
+ range = Iwrange(self.ifname)
+ if range.errorflag:
+ return (range.errorflag, range.error)
+ return (range.num_bitrates, range.bitrates)
+
+ def getChannelInfo(self):
+ """returns the number of channels and available frequency for
+ the device
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> num, rates = wifi.getChannelInfo()
+ >>> num == len(rates)
+ True
+ """
+ range = Iwrange(self.ifname)
+ if range.errorflag:
+ return (range.errorflag, range.error)
+ return (range.num_channels, range.frequencies)
+
+ def getEssid(self):
+ """get essid information
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getEssid()
+ 'romanofski'
+ """
+ essid = ""
+ buff, s = self.iwstruct.pack_wrq(32)
+ i, result = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWESSID,
+ data=s)
+ if i > 0:
+ return result
+ str = buff.tostring()
+ return str.strip('\x00')
+
+ def setEssid(self, essid):
+ """set essid """
+ raise NotImplementedError
+ if len(essid) > IW_ESSID_MAX_SIZE:
+ return "essid to big"
+ buff, s = self.iwstruct.pack_test(essid, 32)
+ i, result = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCSIWESSID,
+ data=s)
+ if i > 0:
+ return result
+
+ def getEncryption(self):
+ """get encryption information which is probably a string of '*',
+ 'open', 'private'
+
+ as a normal user, you will get a 'Operation not permitted'
+ error:
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getEncryption()
+ (1, 'Operation not permitted')
+ """
+ iwpoint = Iwpoint(self.ifname)
+ if iwpoint.errorflag:
+ return (iwpoint.errorflag, iwpoint.error)
+ return iwpoint.getEncryptionKey()
+
+ def getFragmentation(self):
+ """returns fragmentation threshold
+
+ It depends on what the driver says. If you have fragmentation
+ threshold turned on, you'll get an int. If it's turned of
+ you'll get a string: 'off'.
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getFragmentation()
+ 'off'
+ """
+ iwparam = Iwparam(self.ifname, SIOCGIWFRAG)
+ if iwparam.errorflag:
+ return (iwparam.errorflag, iwparam.error)
+ return iwparam.getValue()
+
+ def getFrequency(self):
+ """returns currently set frequency of the card
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getFrequency()
+ '2.417GHz'
+ """
+ i, r = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWFREQ)
+ if i > 0:
+ return (i, r)
+ iwfreq = Iwfreq(r)
+ return iwfreq.getFrequency()
+
+
+ def getMode(self):
+ """returns currently set operation mode
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getMode()
+ 'Managed'
+ """
+ i, result = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWMODE)
+ if i > 0:
+ return result
+ mode = self.iwstruct.unpack('i', result[:4])[0]
+ return modes[mode]
+
+ def setMode(self, mode):
+ """sets the operation mode """
+ try:
+ this_modes = [x.lower() for x in modes]
+ mode = mode.lower()
+ wifimode = this_modes.index(mode)
+ except ValueError:
+ return "Invalid operation mode!"
+
+ s = self.iwstruct.pack('I', wifimode)
+ i, result = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCSIWMODE,
+ data=s)
+ if i > 0:
+ return result
+
+ def getWirelessName(self):
+ """ returns wireless name
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getWirelessName()
+ 'IEEE 802.11-DS'
+ """
+ i, result = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWNAME)
+ if i > 0:
+ return result
+ return result.split('\0')[0]
+
+ def getPowermanagement(self):
+ """returns power management settings
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getPowermanagement()
+ 'off'
+ """
+ iwparam = Iwparam(self.ifname, SIOCGIWPOWER)
+ if iwparam.errorflag:
+ return (iwparam.errorflag, iwparam.error)
+ return iwparam.getValue()
+
+
+ def getRetrylimit(self):
+ """returns limit retry/lifetime
+
+ man iwconfig:
+ Most cards have MAC retransmissions, and some allow to set
+ the behaviour of the retry mechanism.
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getRetrylimit()
+ 16
+ """
+ iwparam = Iwparam(self.ifname, SIOCGIWRETRY)
+ if iwparam.errorflag:
+ return (iwparam.errorflag, iwparam.error)
+ return iwparam.getValue()
+
+ def getRTS(self):
+ """returns rts threshold
+
+ returns int, 'auto', 'fixed', 'off'
+
+ man iwconfig:
+ RTS/CTS adds a handshake before each packet transmission to
+ make sure that the channel is clear. This adds overhead, but
+ increases performance in case of hidden nodes or a large
+ number of active nodes. This parameter sets the size of the
+ smallest packet for which the node sends RTS; a value equal
+ to the maximum packet size disable the mechanism.
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getRTS()
+ 'off'
+ """
+ iwparam = Iwparam(self.ifname, SIOCGIWRTS)
+ if iwparam.errorflag:
+ return (iwparam.errorflag, iwparam.error)
+ return iwparam.getValue()
+
+ def getSensitivity(self):
+ """returns sensitivity information
+
+ man iwconfig:
+ This is the lowest signal level for which the hardware
+ attempt packet reception, signals weaker than this are
+ ignored. This is used to avoid receiving background noise,
+ so you should set it according to the average noise
+ level. Positive values are assumed to be the raw value used
+ by the hardware or a percentage, negative values are
+ assumed to be dBm.
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getSensitivity()
+ 'off'
+
+ """
+ iwparam = Iwparam(self.ifname, SIOCGIWSENS)
+ if iwparam.errorflag:
+ return (iwparam.errorflag, iwparam.error)
+ return iwparam.getValue()
+
+ def getTXPower(self):
+ """returns transmit power in dBm
+
+ >>> from iwlibs import Wireless
+ >>> wifi = Wireless('eth1')
+ >>> wifi.getTXPower()
+ '17 dBm'
+ """
+ i, r = self.iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWTXPOW)
+ if i > 0:
+ return (i, r)
+ iwfreq = Iwfreq(r)
+ return iwfreq.getTransmitPower()
+
+ def getStatistics(self):
+ """returns statistics information which can also be found in
+ /proc/net/wireless
+ """
+ iwstats = Iwstats(self.ifname)
+ if iwstats.errorflag > 0:
+ return (iwstats.errorflag, iwstats.error)
+ return [iwstats.status, iwstats.qual, iwstats.discard,
+ iwstats.missed_beacon]
+
+ def scan(self):
+ """returns Iwscanresult objects, after a successful scan"""
+ iwscan = Iwscan(self.ifname)
+ return iwscan.scan()
+
+
+class Iwstruct(object):
+ """basic class to handle iwstruct data """
+
+ def __init__(self):
+ self.idx = 0
+ self.sockfd = socket(AF_INET, SOCK_DGRAM)
+
+ def parse_data(self, fmt, data):
+ """ unpacks raw C data """
+ size = struct_calcsize(fmt)
+ idx = self.idx
+
+ str = data[idx:idx + size]
+ self.idx = idx+size
+ value = struct_unpack(fmt, str)
+
+ # take care of a tuple like (int, )
+ if len(value) == 1:
+ return value[0]
+ else:
+ return value
+
+ def pack(self, fmt, *args):
+ """ calls struct_pack and returns the result """
+ return struct_pack(fmt, *args)
+
+ def pack_wrq(self, buffsize):
+ """ packs wireless request data for sending it to the kernel """
+ # Prepare a buffer
+ # We need the address of our buffer and the size for it. The
+ # ioctl itself looks for the pointer to the address in our
+ # memory and the size of it.
+ # Dont change the order how the structure is packed!!!
+ buff = array('c', '\0'*buffsize)
+ caddr_t, length = buff.buffer_info()
+ s = struct_pack('Pi', caddr_t, length)
+ return buff, s
+
+ def pack_test(self, string, buffsize):
+ """ packs wireless request data for sending it to the kernel """
+ buffsize = buffsize - len(string)
+ buff = array('c', string+'\0'*buffsize)
+ caddr_t, length = buff.buffer_info()
+ s = struct_pack('Pii', caddr_t, length, 1)
+ return buff, s
+
+ def unpack(self, fmt, packed_data):
+ """ unpacks data with given format """
+ return struct_unpack(fmt, packed_data)
+
+ def _fcntl(self, request, args):
+ return ioctl(self.sockfd.fileno(), request, args)
+
+ def iw_get_ext(self, ifname, request, data=None):
+ """ read information from ifname """
+ # put some additional data behind the interface name
+ if data is not None:
+ buff = IFNAMSIZE-len(ifname)
+ ifreq = ifname + '\0'*buff
+ ifreq = ifreq + data
+ else:
+ ifreq = (ifname + '\0'*32)
+
+ try:
+ result = self._fcntl(request, ifreq)
+ except IOError, (i, e):
+ return i, e
+
+ return (0, result[16:])
+
+ def getMAC(self, packed_data):
+ """ extracts mac addr from packed data and returns it as str """
+ mac_addr = struct_unpack('xxBBBBBB', packed_data[:8])
+ return "%02X:%02X:%02X:%02X:%02X:%02X" % mac_addr
+
+class Iwparam(object):
+ """class to hold iwparam data """
+
+ def __init__(self, ifname, ioctl):
+ # (i) value, (b) fixed, (b) disabled, (b) flags
+ self.fmt = "ibbH"
+ self.value = 0
+ self.fixed = 0
+ self.disabled = 0
+ self.flags = 0
+ self.errorflag = 0
+ self.error = ""
+ self.ioctl = ioctl
+ self.ifname = ifname
+ self.update()
+
+ def getValue(self):
+ """returns the value if not disabled """
+
+ if self.disabled:
+ return 'off'
+ if self.flags & IW_RETRY_TYPE == 0:
+ return self.getRLAttributes()
+ else:
+ return self.getPMAttributes()
+
+ def getRLAttributes(self):
+ """returns a string with attributes determined by self.flags
+ """
+ return self.value
+
+ def getPMAttributes(self):
+ """returns a string with attributes determined by self.flags
+ and IW_POWER*
+ """
+ result = ""
+
+ # Modifiers
+ if self.flags & IW_POWER_MIN == 0:
+ result = " min"
+ if self.flags & IW_POWER_MAX == 0:
+ result = " max"
+
+ # Type
+ if self.flags & IW_POWER_TIMEOUT == 0:
+ result = " period:"
+ else:
+ result = " timeout:"
+ # Value with or without units
+ # IW_POWER_RELATIVE - value is *not* in s/ms/us
+ if self.flags & IW_POWER_RELATIVE:
+ result += "%f" %(float(self.value)/MEGA)
+ else:
+ if self.value >= MEGA:
+ result += "%fs" %(float(self.value)/MEGA)
+ elif self.value >= KILO:
+ result += "%fms" %(float(self.value)/KILO)
+ else:
+ result += "%dus" % self.value
+
+ return result
+
+ def update(self):
+ iwstruct = Iwstruct()
+ i, r = iwstruct.iw_get_ext(self.ifname,
+ self.ioctl)
+ if i > 0:
+ self.errorflag = i
+ self.error = r
+ self._parse(r)
+
+ def _parse(self, data):
+ """ unpacks iwparam data """
+ iwstruct = Iwstruct()
+ self.value, self.fixed, self.disabled, self.flags =\
+ iwstruct.parse_data(self.fmt, data)
+
+class Iwfreq(object):
+ """ class to hold iwfreq data
+ delegates to Iwstruct class
+ """
+
+ def __init__(self, data=None):
+ self.fmt = "ihbb"
+ if data is not None:
+ self.frequency = self.parse(data)
+ else:
+ self.frequency = 0
+ self.iwstruct = Iwstruct()
+
+ def __getattr__(self, attr):
+ return getattr(self.iwstruct, attr)
+
+ def parse(self, data):
+ """ unpacks iwparam"""
+
+ size = struct_calcsize(self.fmt)
+ m, e, i, pad = struct_unpack(self.fmt, data[:size])
+ # XXX well, its not *the* frequency - we need a better name
+ if e == 0:
+ return m
+ else:
+ return float(m)*10**e
+
+ def getFrequency(self):
+ """returns Frequency (str)
+
+ data - binary data returned by systemcall (iw_get_ext())
+ """
+ freq = self.frequency
+
+ if freq >= GIGA:
+ return "%0.3fGHz" %(freq/GIGA)
+
+ if freq >= MEGA:
+ return "%0.3fMHZ" %(freq/MEGA)
+
+ if freq >= KILO:
+ return "%0.3fKHz" %(freq/KILO)
+
+ def getBitrate(self):
+ """ returns Bitrate in Mbit
+
+ data - binary data returned by systemcall (iw_get_ext())
+ """
+ bitrate = self.frequency
+
+ if bitrate >= GIGA:
+ return "%i Gb/s" %(bitrate/GIGA)
+
+ if bitrate >= MEGA:
+ return "%i Mb/s" %(bitrate/MEGA)
+
+ if bitrate >= KILO:
+ return "%i Kb/s" %(bitrate/KILO)
+
+ def getTransmitPower(self):
+ """ returns transmit power in dbm """
+ # XXX something flaky is going on with m and e
+ # eg. m = 50 and e should than be 0, because the number is stored in
+ # m and don't needs to be recalculated
+ return "%i dBm" %self.mw2dbm(self.frequency/10)
+
+ def getChannel(self, freq):
+ """returns channel information given by frequency
+
+ returns None if frequency can't be converted
+ freq = frequency to convert (int)
+ iwrange = Iwrange object
+ """
+
+ try:
+ freq = float(freq)
+ except:
+ return None
+
+ lut = {}
+ #13 Channels beginning at 2.412GHz and inreasing by 0,005 GHz steps
+ for i in range(0,12):
+ cur = float( 2.412 + ( i * 0.005 ) )
+ lut[str(cur)] = i+1
+ # Channel 14 need special actions ;)
+ lut['2.484'] = 14
+
+
+ if str(freq) in lut.keys():
+ return lut[str(freq)]
+
+ return None
+
+
+ def mw2dbm(self, mwatt):
+ """ converts mw to dbm(float) """
+ return ceil(10.0 * log10(mwatt))
+
+ def _setFrequency(self, list):
+ """sets self.frequency by given list
+
+ currently only used by Iwrange
+ """
+ assert len(list) == 4
+ m, e, i, pad = list
+ if e == 0:
+ self.frequency = m
+ else:
+ self.frequency = m #float(m)*10**e
+
+class Iwstats(object):
+ """ class to hold iwstat data """
+
+ def __init__(self, ifname):
+ # (2B) status, 4B iw_quality, 6i iw_discarded
+ self.fmt = "2B4B6i"
+ self.status = 0
+ self.qual = Iwquality()
+ self.discard = {}
+ self.missed_beacon = 0
+ self.ifname = ifname
+ self.errorflag = 0
+ self.error = ""
+ self.update()
+
+ def update(self):
+ iwstruct = Iwstruct()
+ buff, s = iwstruct.pack_wrq(32)
+ i, result = iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWSTATS,
+ data=s)
+ if i > 0:
+ self.error = result
+ self.errorflag = i
+ self._parse(buff.tostring())
+
+ def _parse(self, data):
+ """ unpacks iwstruct data """
+ struct = Iwstruct()
+ iwqual = Iwquality()
+ iwstats_data = struct.parse_data(self.fmt, data)
+
+ self.status = iwstats_data[0:2]
+ self.qual.quality, self.qual.sl, self.qual.nl,\
+ self.qual.flags = iwstats_data[2:6]
+ nwid, code, frag, retries, flags = iwstats_data[6:11]
+ self.missed_beacon = iwstats_data[11:12][0]
+ self.discard = makedict(nwid=nwid, code=code,
+ fragment=frag, retries=retries, misc=flags)
+
+class Iwquality(object):
+ """ class to hold iwquality data """
+
+ def __init__(self):
+ self.quality = 0
+ self.sl = 0
+ self.nl = 0
+ self.updated = 0
+ self.fmt = "4B"
+
+ def parse(self, data):
+ """ unpacks iwquality data """
+ struct = Iwstruct()
+ qual, sl, nl, flags = struct.parse_data(self.fmt, data)
+
+ # compute signal and noise level
+ self.signal_level = sl
+ self.noise_level = nl
+
+ # asign the other values
+ self.quality = qual
+ self.updated = flags
+
+ def setValues(self, list):
+ """ assigns values given by a list to our attributes """
+ attributes = ["quality", "signallevel", "noise_level",
+ "updated"]
+ assert len(list) == 4
+
+ for i in range(len(list)):
+ setattr(self, attributes[i], list[i])
+
+ def getSignallevel(self):
+ """ returns signal level """
+ return self.sl-0x100
+
+ def setSignallevel(self, sl):
+ """ sets signal level """
+ self.sl = sl
+ signallevel = property(getSignallevel, setSignallevel)
+
+ def getNoiselevel(self):
+ """ returns noise level """
+ return self.nl - 0x100
+
+ def setNoiselevel(self):
+ raise NotImplementedError
+ self.nl = nl
+ noiselevel = property(getNoiselevel, setNoiselevel)
+
+class Iwpoint(object):
+ """ class to hold iwpoint data """
+
+ def __init__(self, ifname):
+ self.key = [0,0,0,0]
+ self.fields = 0
+ self.flags = 0
+ # (4B) pointer to data, H length, H flags
+ self.fmt = "4BHH"
+ self.errorflag = 0
+ self.error = ""
+ self.ifname = ifname
+ self.update()
+
+ def __getattr__(self, attr):
+ return getattr(self.iwstruct, attr)
+
+ def update(self):
+ iwstruct = Iwstruct()
+ buff, s = iwstruct.pack_wrq(32)
+ i, result = iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWENCODE,
+ data=s)
+ if i > 0:
+ self.errorflag = i
+ self.error = result
+ self._parse(result)
+
+ def getEncryptionKey(self):
+ """ returns encryption key as '**' or 'off' as str """
+ if self.flags & IW_ENCODE_DISABLED != 0:
+ return 'off'
+ elif self.flags & IW_ENCODE_NOKEY != 0:
+ # a key is set, so print it
+ return '**' * self.fields
+
+ def _parse(self, data):
+ """ unpacks iwpoint data
+ """
+ iwstruct = Iwstruct()
+ ptr, ptr, ptr, ptr, self.fields, self.flags =\
+ iwstruct.parse_data(self.fmt, data)
+ self.key = [ptr, ptr, ptr, ptr]
+
+class Iwrange(object):
+ """holds iwrange struct """
+ IW_MAX_FREQUENCIES = 32
+
+ def __init__(self, ifname):
+ self.fmt = "iiihb6ii4B4Bi32i2i2i2i2i3h8h2b2bhi8i2b3h2i2ihB17x"\
+ + self.IW_MAX_FREQUENCIES*"ihbb"
+
+ self.ifname = ifname
+ self.errorflag = 0
+ self.error = ""
+
+ # informative stuff
+ self.throughput = 0
+
+ # nwid (or domain id)
+ self.min_nwid = self.max_nwid = 0
+
+ # frequency for backward compatibility
+ self.old_num_channels = self.old_num_frequency = self.old_freq = 0
+
+ # signal level threshold
+ self.sensitivity = 0
+
+ # link quality
+ self.max_qual = Iwquality()
+ self.avg_qual = Iwquality()
+
+ # rates
+ self.num_bitrates = 0
+ self.bitrates = []
+
+ # rts threshold
+ self.min_rts = self.max_rts = 0
+
+ # fragmention threshold
+ self.min_frag = self.max_frag = 0
+
+ # power managment
+ self.min_pmp = self.max_pmp = 0
+ self.min_pmt = self.max_pmt = 0
+ self.pmp_flags = self.pmt_flags = self.pm_capa = 0
+
+ # encoder stuff
+ self.encoding_size = 0
+ self.num_encoding_sizes = self.max_encoding_tokens = 0
+ self.encoding_login_index = 0
+
+ # transmit power
+ self.txpower_capa = self.num_txpower = self.txpower = 0
+
+ # wireless extension version info
+ self.we_vers_compiled = self.we_vers_src = 0
+
+ # retry limits and lifetime
+ self.retry_capa = self.retry_flags = self.r_time_flags = 0
+ self.min_retry = self.max_retry = 0
+ self.min_r_time = self.max_r_time = 0
+
+ # frequency
+ self.num_channels = self.num_frequency = 0
+ self.frequencies = []
+ self.update()
+
+ def update(self):
+ """updates Iwrange object by a system call to the kernel
+ and updates internal attributes
+ """
+ iwstruct = Iwstruct()
+ buff, s = iwstruct.pack_wrq(640)
+ i, result = iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWRANGE,
+ data=s)
+ if i > 0:
+ self.errorflag = i
+ self.error = result
+ data = buff.tostring()
+ self._parse(data)
+
+ def _parse(self, data):
+ struct = Iwstruct()
+ result = struct.parse_data(self.fmt, data)
+
+ # XXX there is maybe a much more elegant way to do this
+ self.throughput, self.min_nwid, self.max_nwid = result[0:3]
+ self.old_num_channels, self.old_num_frequency = result[3:5]
+ self.old_freq = result[5:11]
+ self.sensitivity = result[11]
+ self.max_qual.setValues(result[12:16])
+ self.avg_qual.setValues(result[16:20])
+ self.num_bitrates = result[20] # <- XXX
+ raw_bitrates = result[21:53]
+ for rate in raw_bitrates:
+ iwfreq = Iwfreq()
+ iwfreq.frequency = rate
+ br = iwfreq.getBitrate()
+ if br is not None:
+ self.bitrates.append(br)
+
+ self.min_rts, self.max_rts = result[53:55]
+ self.min_frag, self.max_frag = result[55:57]
+ self.min_pmp, self.max_pmp = result[57:59]
+ self.min_pmt, self.max_pmt = result[59:61]
+ self.pmp_flags, self.pmt_flags, self.pm_capa = result[61:64]
+ self.encoding_size = result[64:72]
+ self.num_encoding_sizes, self.max_encoding_tokens = result[72:74]
+ self.encoding_login_index = result[74:76]
+ self.txpower_capa, self.num_txpower = result[76:78]
+ self.txpower = result[78:86]
+ self.we_vers_compiled, self.we_vers_src = result[86:88]
+ self.retry_capa, self.retry_flags, self.r_time_flags = result[88:91]
+ self.min_retry, self.max_retry = result[91:93]
+ self.min_r_time, self.max_r_time = result[93:95]
+ self.num_channels = result[95]
+ self.num_frequency = result[96]
+ freq = result[97:]
+
+ i = self.num_frequency
+ for x in range(0, len(freq), 4):
+ iwfreq = Iwfreq()
+ iwfreq._setFrequency(freq[x:x+4])
+ fq = iwfreq.getFrequency()
+ if fq is not None:
+ self.frequencies.append(fq)
+ i -= 1
+ if i <= 0:
+ break
+
+class Iwscan(object):
+ """class to handle AP scanning"""
+
+ def __init__(self, ifname):
+ self.ifname = ifname
+ self.range = Iwrange(ifname)
+ self.errorflag = 0
+ self.error = ""
+ self.stream = None
+ self.aplist = None
+
+ def scan(self, fullscan=True):
+ """Completes a scan for available access points,
+ and returns them in Iwscanresult format
+
+ fullscan: If False, data is read from a cache of the last scan
+ If True, a scan is conducted, and then the data is read
+ """
+ # By default everything is fine, do not wait
+ result = 1
+ if fullscan:
+ self.setScan()
+ if self.errorflag > EPERM:
+ raise RuntimeError, 'setScan failure ' + str(self.errorflag) + " " + str(self.error)
+ return None
+ elif self.errorflag < EPERM:
+ # Permission was NOT denied, therefore we must WAIT to get results
+ result = 250
+
+ while (result > 0):
+ sleep(result/1000)
+ result = self.getScan()
+
+ if result < 0 or self.errorflag != 0:
+ raise RuntimeError, 'getScan failure ' + str(self.errorflag) + " " + str(self.error)
+
+ return self.aplist
+
+
+ def setScan(self):
+ """Triggers the scan, if we have permission
+ """
+ iwstruct = Iwstruct()
+ s = iwstruct.pack('Pii', 0, 0, 0)
+ i, result = iwstruct.iw_get_ext(self.ifname,
+ SIOCSIWSCAN,s)
+ if i > 0:
+ self.errorflag = i
+ self.error = result
+ return result
+
+ def getScan(self):
+ """Retreives results, stored from the most recent scan
+ Returns 0 if successful, a delay if the data isn't ready yet
+ or -1 if something really nasty happened
+ """
+ iwstruct = Iwstruct()
+ i = E2BIG
+ bufflen = IW_SCAN_MAX_DATA
+
+ # Keep resizing the buffer until it's large enough to hold the scan
+ while (i == E2BIG):
+ buff, s = iwstruct.pack_wrq(bufflen)
+ i, result = iwstruct.iw_get_ext(self.ifname,
+ SIOCGIWSCAN,
+ data=s)
+ if i == E2BIG:
+ pbuff, newlen = iwstruct.unpack('Pi', s)
+ if bufflen < newlen:
+ bufflen = newlen
+ else:
+ bufflen = bufflen * 2
+
+ if i == EAGAIN:
+ return 100
+ if i > 0:
+ self.errorflag = i
+ self.error = result
+ return -1
+
+ pbuff, reslen = iwstruct.unpack('Pi', s)
+ if reslen > 0:
+ # Initialize the stream, and turn it into an enumerator
+ self.aplist = self._parse(buff.tostring())
+ return 0
+
+ def _parse(self, data):
+ """Parse the event stream, and return a list of Iwscanresult objects
+ """
+ iwstruct = Iwstruct()
+ scanresult = None
+ aplist = []
+
+ # Run through the stream, until broken
+ while 1:
+ # If we're the stream doesn't have enough space left for a header, break
+ if len(data) < IW_EV_LCP_LEN:
+ break;
+
+ # Unpack the header
+ length, cmd = iwstruct.unpack('HH', data[:4])
+ # If the header says the following data is shorter than the header, then break
+ if length < IW_EV_LCP_LEN:
+ break;
+
+ # Put the events into their respective result data
+ if cmd == SIOCGIWAP:
+ if scanresult is not None:
+ aplist.append(scanresult)
+ scanresult = Iwscanresult(data[IW_EV_LCP_LEN:length], self.range)
+ elif scanresult is None:
+ raise RuntimeError, 'Attempting to add an event without AP data'
+ else:
+ scanresult.addEvent(cmd, data[IW_EV_LCP_LEN:length])
+
+ # We're finished with the preveious event
+ data = data[length:]
+
+ # Don't forgset the final result
+ if scanresult.bssid != "00:00:00:00:00:00":
+ aplist.append(scanresult)
+ else:
+ raise RuntimeError, 'Attempting to add an AP without a bssid'
+ return aplist
+
+class Iwscanresult(object):
+ """An object to contain all the events associated with a single scanned AP
+ """
+
+ def __init__(self, data, range):
+ """Initialize the scan result with the access point data"""
+ self.iwstruct = Iwstruct()
+ self.range = range
+ self.bssid = "%02X:%02X:%02X:%02X:%02X:%02X" % struct_unpack('BBBBBB', data[2:8])
+ self.essid = None
+ self.mode = None
+ self.rate = []
+ self.quality = Iwquality()
+ self.frequency = None
+ self.encode = None
+ self.custom = []
+ self.protocol = None
+
+ def addEvent(self, cmd, data):
+ """Attempts to add the data from an event to a scanresult
+ Only certain data is accept, in which case the result is True
+ If the event data is invalid, None is returned
+ If the data is valid but unused, False is returned
+ """
+ if cmd <= SIOCIWLAST:
+ if cmd < SIOCIWFIRST:
+ return None
+ elif cmd >= IWEVFIRST:
+ if cmd > IWEVLAST:
+ return None
+ else:
+ return None
+
+ if cmd == SIOCGIWESSID:
+ self.essid = data[4:]
+ elif cmd == SIOCGIWMODE:
+ self.mode = modes[self.iwstruct.unpack('i', data[:4])[0]]
+ elif cmd == SIOCGIWRATE:
+ # TODO, deal with multiple rates, or at least the highest rate
+ freqsize = struct_calcsize("ihbb")
+ while len(data) >= freqsize:
+ iwfreq = Iwfreq(data)
+ self.rate.append(iwfreq.getBitrate())
+ data = data[freqsize:]
+ elif cmd == IWEVQUAL:
+ self.quality.parse(data)
+ elif cmd == SIOCGIWFREQ:
+ self.frequency = Iwfreq(data)
+ elif cmd == SIOCGIWENCODE:
+ self.encode = data
+ elif cmd == IWEVCUSTOM:
+ self.custom.append(data[1:])
+ elif cmd == SIOCGIWNAME:
+ self.protocol = data[:len(data)-2]
+ else:
+ #print "Cmd:", cmd
+ return False
+ return True
\ No newline at end of file
--- /dev/null
+from enigma import eTimer
+from Screens.Screen import Screen
+from Components.ActionMap import ActionMap, NumberActionMap
+from Components.Pixmap import Pixmap,MultiPixmap
+from Components.Label import Label
+from Components.Sources.StaticText import StaticText
+from Components.MenuList import MenuList
+from Components.config import config, getConfigListEntry, ConfigYesNo, NoSave, ConfigSubsection, ConfigText, ConfigSelection, ConfigPassword
+from Components.ConfigList import ConfigListScreen
+from Components.Network import Network, iNetwork
+from Components.Console import Console
+from Plugins.Plugin import PluginDescriptor
+from os import system, path as os_path, listdir
+from Wlan import Wlan, WlanList, wpaSupplicant
+from Wlan import Status, iStatus
+
+plugin_path = "/usr/lib/enigma2/python/Plugins/SystemPlugins/WirelessLan"
+
+list = []
+list.append("WEP")
+list.append("WPA")
+list.append("WPA2")
+list.append("WPA/WPA2")
+
+weplist = []
+weplist.append("ASCII")
+weplist.append("HEX")
+
+config.plugins.wlan = ConfigSubsection()
+config.plugins.wlan.essid = NoSave(ConfigText(default = "home", fixed_size = False))
+config.plugins.wlan.hiddenessid = NoSave(ConfigText(default = "home", fixed_size = False))
+
+config.plugins.wlan.encryption = ConfigSubsection()
+config.plugins.wlan.encryption.enabled = NoSave(ConfigYesNo(default = False))
+config.plugins.wlan.encryption.type = NoSave(ConfigSelection(list, default = "WPA/WPA2" ))
+config.plugins.wlan.encryption.wepkeytype = NoSave(ConfigSelection(weplist, default = "ASCII"))
+config.plugins.wlan.encryption.psk = NoSave(ConfigPassword(default = "mysecurewlan", fixed_size = False))
+
+
+class WlanStatus(Screen):
+ skin = """
+ <screen position="center,center" size="560,400" title="Wireless Network State" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+
+ <widget source="LabelBSSID" render="Label" position="10,60" size="250,25" valign="left" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelESSID" render="Label" position="10,100" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelQuality" render="Label" position="10,140" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelSignal" render="Label" position="10,180" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelBitrate" render="Label" position="10,220" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="LabelEnc" render="Label" position="10,260" size="250,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+
+ <widget source="BSSID" render="Label" position="320,60" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="ESSID" render="Label" position="320,100" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="quality" render="Label" position="320,140" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="signal" render="Label" position="320,180" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="bitrate" render="Label" position="320,220" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+ <widget source="enc" render="Label" position="320,260" size="180,25" valign="center" font="Regular;20" transparent="1" foregroundColor="#FFFFFF" />
+
+ <ePixmap pixmap="skin_default/div-h.png" position="0,350" zPosition="1" size="560,2" />
+ <widget source="IFtext" render="Label" position="10,355" size="120,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
+ <widget source="IF" render="Label" position="120,355" size="400,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1" />
+ <widget source="Statustext" render="Label" position="10,375" size="115,21" zPosition="10" font="Regular;20" halign="left" backgroundColor="#25062748" transparent="1"/>
+ <widget name="statuspic" pixmaps="skin_default/buttons/button_green.png,skin_default/buttons/button_green_off.png" position="130,380" zPosition="10" size="15,16" transparent="1" alphatest="on"/>
+ </screen>
+ """
+
+ def __init__(self, session, iface):
+ Screen.__init__(self, session)
+ self.session = session
+ self.iface = iface
+ self.skin = WlanStatus.skin
+
+ self["LabelBSSID"] = StaticText(_('Accesspoint:'))
+ self["LabelESSID"] = StaticText(_('SSID:'))
+ self["LabelQuality"] = StaticText(_('Link Quality:'))
+ self["LabelSignal"] = StaticText(_('Signal Strength:'))
+ self["LabelBitrate"] = StaticText(_('Bitrate:'))
+ self["LabelEnc"] = StaticText(_('Encryption:'))
+
+ self["BSSID"] = StaticText()
+ self["ESSID"] = StaticText()
+ self["quality"] = StaticText()
+ self["signal"] = StaticText()
+ self["bitrate"] = StaticText()
+ self["enc"] = StaticText()
+
+ self["IFtext"] = StaticText()
+ self["IF"] = StaticText()
+ self["Statustext"] = StaticText()
+ self["statuspic"] = MultiPixmap()
+ self["statuspic"].hide()
+ self["key_red"] = StaticText(_("Close"))
+
+ self.resetList()
+ self.updateStatusbar()
+
+ self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions", "ShortcutActions"],
+ {
+ "ok": self.exit,
+ "back": self.exit,
+ "red": self.exit,
+ }, -1)
+ self.timer = eTimer()
+ self.timer.timeout.get().append(self.resetList)
+ self.onShown.append(lambda: self.timer.start(5000))
+ self.onLayoutFinish.append(self.layoutFinished)
+ self.onClose.append(self.cleanup)
+
+ def cleanup(self):
+ iStatus.stopWlanConsole()
+
+ def layoutFinished(self):
+ self.setTitle(_("Wireless Network State"))
+
+ def resetList(self):
+ print "self.iface im resetlist",self.iface
+ iStatus.getDataForInterface(self.iface,self.getInfoCB)
+
+ def getInfoCB(self,data,status):
+ if data is not None:
+ if data is True:
+ if status is not None:
+ self["BSSID"].setText(status[self.iface]["acesspoint"])
+ self["ESSID"].setText(status[self.iface]["essid"])
+ self["quality"].setText(status[self.iface]["quality"]+"%")
+ self["signal"].setText(status[self.iface]["signal"])
+ self["bitrate"].setText(status[self.iface]["bitrate"])
+ self["enc"].setText(status[self.iface]["encryption"])
+ self.updateStatusLink(status)
+
+ def exit(self):
+ self.timer.stop()
+ self.close()
+
+ def updateStatusbar(self):
+ print "self.iface im updateStatusbar",self.iface
+ self["BSSID"].setText(_("Please wait..."))
+ self["ESSID"].setText(_("Please wait..."))
+ self["quality"].setText(_("Please wait..."))
+ self["signal"].setText(_("Please wait..."))
+ self["bitrate"].setText(_("Please wait..."))
+ self["enc"].setText(_("Please wait..."))
+ self["IFtext"].setText(_("Network:"))
+ self["IF"].setText(iNetwork.getFriendlyAdapterName(self.iface))
+ self["Statustext"].setText(_("Link:"))
+
+ def updateStatusLink(self,status):
+ if status is not None:
+ if status[self.iface]["acesspoint"] == "No Connection" or status[self.iface]["acesspoint"] == "Not-Associated" or status[self.iface]["acesspoint"] == False:
+ self["statuspic"].setPixmapNum(1)
+ else:
+ self["statuspic"].setPixmapNum(0)
+ self["statuspic"].show()
+
+class WlanScan(Screen):
+ skin = """
+ <screen position="center,center" size="560,400" title="Choose a Wireless Network" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#a08500" transparent="1" />
+ <widget name="list" position="5,50" size="550,280" scrollbarMode="showOnDemand" />
+ <ePixmap pixmap="skin_default/div-h.png" position="0,340" zPosition="1" size="560,2" />
+ <widget source="info" render="Label" position="0,350" size="560,50" font="Regular;24" halign="center" valign="center" backgroundColor="#25062748" transparent="1" />
+ </screen>
+ """
+
+ def __init__(self, session, iface):
+ Screen.__init__(self, session)
+ self.session = session
+ self.iface = iface
+ self.skin = WlanScan.skin
+ self.skin_path = plugin_path
+ self.oldInterfaceState = iNetwork.getAdapterAttribute(self.iface, "up")
+
+ self["info"] = StaticText()
+
+ self.list = []
+ self["list"] = WlanList(self.session, self.iface)
+
+ self.setInfo()
+
+ self["key_red"] = StaticText(_("Close"))
+ self["key_green"] = StaticText(_("Connect"))
+ self["key_yellow"] = StaticText(_("Refresh"))
+
+ self["actions"] = NumberActionMap(["WizardActions", "InputActions", "EPGSelectActions"],
+ {
+ "ok": self.select,
+ "back": self.cancel,
+ }, -1)
+
+ self["shortcuts"] = ActionMap(["ShortcutActions"],
+ {
+ "red": self.cancel,
+ "green": self.select,
+ "yellow": self.rescan,
+ })
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ def layoutFinished(self):
+ self.setTitle(_("Choose a wireless network"))
+
+ def select(self):
+ cur = self["list"].getCurrent()
+ #print "CURRENT",cur
+ if cur is not None:
+ if cur[1] is not None:
+ essid = cur[0]
+ if essid == '':
+ essid = cur[1]
+ encrypted = cur[2]
+ self.close(essid,self["list"].getList())
+ else:
+ self.close(None,None)
+ else:
+ self.close(None,None)
+
+ def WlanSetupClosed(self, *ret):
+ if ret[0] == 2:
+ self.close(None)
+
+ def rescan(self):
+ self["list"].reload()
+ self.setInfo()
+
+ def cancel(self):
+ if self.oldInterfaceState is False:
+ iNetwork.deactivateInterface(self.iface,self.deactivateInterfaceCB)
+ else:
+ self.close(None)
+
+ def deactivateInterfaceCB(self,data):
+ if data is not None:
+ if data is True:
+ iNetwork.getInterfaces(self.cancelCB)
+
+ def cancelCB(self,data):
+ if data is not None:
+ if data is True:
+ self.close(None)
+
+ def setInfo(self):
+ length = self["list"].getLength()
+
+ if length == 0:
+ self["info"].setText(_("No wireless networks found! Please refresh."))
+ elif length == 1:
+ self["info"].setText(_("1 wireless network found!"))
+ else:
+ self["info"].setText(str(length)+_(" wireless networks found!"))
+
+
+def WlanStatusScreenMain(session, iface):
+ session.open(WlanStatus, iface)
+
+
+def callFunction(iface):
+
+ w = Wlan(iface)
+ i = w.getWirelessInterfaces()
+ if i:
+ if iface in i:
+ return WlanStatusScreenMain
+
+ return None
+
+
+def configStrings(iface):
+ driver = iNetwork.detectWlanModule()
+ print "WLAN-MODULE",driver
+ if driver == 'ralink':
+ return " pre-up /usr/sbin/wpa_supplicant -i"+iface+" -c/etc/wpa_supplicant.conf -B -Dralink\n post-down wpa_cli terminate"
+ if driver == 'madwifi':
+ if config.plugins.wlan.essid.value == "hidden...":
+ return " pre-up iwconfig "+iface+" essid "+config.plugins.wlan.hiddenessid.value+"\n pre-up /usr/sbin/wpa_supplicant -i"+iface+" -c/etc/wpa_supplicant.conf -B -dd -Dmadwifi\n post-down wpa_cli terminate"
+ return " pre-up iwconfig "+iface+" essid "+config.plugins.wlan.essid.value+"\n pre-up /usr/sbin/wpa_supplicant -i"+iface+" -c/etc/wpa_supplicant.conf -B -dd -Dmadwifi\n post-down wpa_cli terminate"
+ if driver == 'zydas':
+ return " pre-up /usr/sbin/wpa_supplicant -i"+iface+" -c/etc/wpa_supplicant.conf -B -dd -Dzydas\n post-down wpa_cli terminate"
+
+def Plugins(**kwargs):
+ return PluginDescriptor(name=_("Wireless LAN"), description=_("Connect to a Wireless Network"), where = PluginDescriptor.WHERE_NETWORKSETUP, fnc={"ifaceSupported": callFunction, "configStrings": configStrings, "WlanPluginEntry": lambda x: "Wireless Network Configuartion..."})
+
\ No newline at end of file
from Components.EpgList import EPGList, EPG_TYPE_SINGLE, EPG_TYPE_SIMILAR, EPG_TYPE_MULTI
from Components.ActionMap import ActionMap
from Components.TimerSanityCheck import TimerSanityCheck
+from Components.UsageConfig import preferredTimerPath
from Components.Sources.ServiceEvent import ServiceEvent
from Components.Sources.Event import Event
from Screens.TimerEdit import TimerSanityConflict
self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
break
else:
- newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, *parseEvent(event))
+ newEntry = RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(event))
self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
def finishedAdd(self, answer):
from Components.Label import Label
from Components.ScrollLabel import ScrollLabel
from Components.TimerList import TimerList
+from Components.UsageConfig import preferredTimerPath
from enigma import eEPGCache, eTimer, eServiceReference
from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
from TimerEntry import TimerEntry
self.session.openWithCallback(cb_func, MessageBox, _("Do you really want to delete %s?") % event.getEventName())
break
else:
- newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, *parseEvent(self.event))
+ newEntry = RecordTimerEntry(self.currentService, checkOldTimers = True, dirname = preferredTimerPath(), *parseEvent(self.event))
self.session.openWithCallback(self.finishedAdd, TimerEntry, newEntry)
def finishedAdd(self, answer):
return
if answer in ("quit", "quitanddeleteconfirmed"):
- config.movielist.last_videodir.cancel()
self.close()
elif answer == "movielist":
ref = self.session.nav.getCurrentlyPlayingServiceReference()
from Components.Sources.Boolean import Boolean
from Components.config import config, ConfigBoolean, ConfigClock
from Components.SystemInfo import SystemInfo
+from Components.UsageConfig import preferredInstantRecordPath, defaultMoviePath
from EpgSelection import EPGSelection
from Plugins.Plugin import PluginDescriptor
from ServiceReference import ServiceReference
from Tools import Notifications
-from Tools.Directories import SCOPE_HDD, resolveFilename, fileExists
+from Tools.Directories import fileExists
from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \
iPlayableService, eServiceReference, eEPGCache
iPlayableService.evSOF: self.__evSOF,
})
- self.minSpeedBackward = useSeekBackHack and 16 or 0
-
class InfoBarSeekActionMap(HelpableActionMap):
def __init__(self, screen, *args, **kwargs):
HelpableActionMap.__init__(self, screen, *args, **kwargs)
self.__seekableStatusChanged()
def makeStateForward(self, n):
- minspeed = config.seek.stepwise_minspeed.value
- repeat = int(config.seek.stepwise_repeat.value)
- if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
- return (0, n * repeat, repeat, ">> %dx" % n)
- else:
+# minspeed = config.seek.stepwise_minspeed.value
+# repeat = int(config.seek.stepwise_repeat.value)
+# if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
+# return (0, n * repeat, repeat, ">> %dx" % n)
+# else:
return (0, n, 0, ">> %dx" % n)
def makeStateBackward(self, n):
- minspeed = config.seek.stepwise_minspeed.value
- repeat = int(config.seek.stepwise_repeat.value)
- if self.minSpeedBackward and n < self.minSpeedBackward:
- r = (self.minSpeedBackward - 1)/ n + 1
- if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
- r = max(r, repeat)
- return (0, -n * r, r, "<< %dx" % n)
- elif minspeed != "Never" and n >= int(minspeed) and repeat > 1:
- return (0, -n * repeat, repeat, "<< %dx" % n)
- else:
+# minspeed = config.seek.stepwise_minspeed.value
+# repeat = int(config.seek.stepwise_repeat.value)
+# if minspeed != "Never" and n >= int(minspeed) and repeat > 1:
+# return (0, -n * repeat, repeat, "<< %dx" % n)
+# else:
return (0, -n, 0, "<< %dx" % n)
def makeStateSlowMotion(self, n):
if config.seek.on_pause.value == "play":
self.unPauseService()
elif config.seek.on_pause.value == "step":
- self.doSeekRelative(0)
+ self.doSeekRelative(1)
elif config.seek.on_pause.value == "last":
self.setSeekState(self.lastseekstate)
self.lastseekstate = self.SEEK_STATE_PLAY
self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value)))
self.doSeekRelative(-6)
elif seekstate == self.SEEK_STATE_PAUSE:
- self.doSeekRelative(-3)
+ self.doSeekRelative(-1)
elif self.isStateForward(seekstate):
speed = seekstate[1]
if seekstate[2]:
if isinstance(serviceref, eServiceReference):
serviceref = ServiceReference(serviceref)
- recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = config.movielist.last_videodir.value)
+ recording = RecordTimerEntry(serviceref, begin, end, name, description, eventid, dirname = preferredInstantRecordPath())
recording.dontSave = True
if event is None or limitEvent == False:
self.session.nav.RecordTimer.timeChanged(entry)
def instantRecord(self):
- dir = config.movielist.last_videodir.value
- if not fileExists(dir, 'w'):
- dir = resolveFilename(SCOPE_HDD)
+ dir = preferredInstantRecordPath()
+ if not dir or not fileExists(dir, 'w'):
+ dir = defaultMoviePath()
try:
stat = os_stat(dir)
except:
else:
self["filelist"].refresh()
self.removeBookmark(name, True)
+ val = self.realBookmarks and self.realBookmarks.value
+ if val and name in val:
+ val.remove(name)
+ self.realBookmarks.value = val
+ self.realBookmarks.save()
def up(self):
self[self.currList].up()
SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
SleepTimerEdit.py Ipkg.py RdsDisplay.py Globals.py DefaultWizard.py \
SessionGlobals.py LocationBox.py WizardLanguage.py TaskView.py Rc.py VirtualKeyBoard.py \
- TextBox.py FactoryReset.py
+ TextBox.py FactoryReset.py RecordPaths.py
from Components.Pixmap import Pixmap
from Components.Label import Label
from Components.PluginComponent import plugins
-from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations
+from Components.config import config, ConfigSubsection, ConfigText, ConfigInteger, ConfigLocations, ConfigSet
from Components.Sources.ServiceEvent import ServiceEvent
+from Components.UsageConfig import defaultMoviePath
from Plugins.Plugin import PluginDescriptor
config.movielist.videodirs = ConfigLocations(default=[resolveFilename(SCOPE_HDD)])
config.movielist.first_tags = ConfigText(default="")
config.movielist.second_tags = ConfigText(default="")
+config.movielist.last_selected_tags = ConfigSet([], default=[])
def setPreferredTagEditor(te):
HelpableScreen.__init__(self)
self.tags = [ ]
- self.selected_tags = None
+ if selectedmovie:
+ self.selected_tags = config.movielist.last_selected_tags.value
+ else:
+ self.selected_tags = None
self.selected_tags_ele = None
self.movemode = False
self["DescriptionBorder"] = Pixmap()
self["DescriptionBorder"].hide()
- if not pathExists(config.movielist.last_videodir.value):
- config.movielist.last_videodir.value = resolveFilename(SCOPE_HDD)
+ if not fileExists(config.movielist.last_videodir.value):
+ config.movielist.last_videodir.value = defaultMoviePath()
config.movielist.last_videodir.save()
self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + config.movielist.last_videodir.value)
self.close(None)
def saveconfig(self):
+ config.movielist.last_selected_tags.value = self.selected_tags
config.movielist.moviesort.save()
config.movielist.listtype.save()
config.movielist.description.save()
self["list"].setSortType(type)
def reloadList(self, sel = None, home = False):
- if not pathExists(config.movielist.last_videodir.value):
- path = resolveFilename(SCOPE_HDD)
+ if not fileExists(config.movielist.last_videodir.value):
+ path = defaultMoviePath()
config.movielist.last_videodir.value = path
config.movielist.last_videodir.save()
self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + path)
def gotFilename(self, res):
if res is not None and res is not config.movielist.last_videodir.value:
- if pathExists(res):
+ if fileExists(res):
config.movielist.last_videodir.value = res
config.movielist.last_videodir.save()
self.current_ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + res)
def showTagsN(self, tagele):
if not self.tags:
self.showTagWarning()
- elif not tagele or self.selected_tags_ele == tagele or not tagele.value in self.tags:
+ elif not tagele or tagele.value in self.selected_tags or not tagele.value in self.tags:
self.showTagsMenu(tagele)
else:
self.selected_tags_ele = tagele
--- /dev/null
+from Screens.Screen import Screen
+from Screens.LocationBox import MovieLocationBox, TimeshiftLocationBox
+from Screens.MessageBox import MessageBox
+from Components.Label import Label
+from Components.config import config, ConfigSelection, getConfigListEntry, configfile
+from Components.ConfigList import ConfigListScreen
+from Components.ActionMap import ActionMap
+from Tools.Directories import fileExists
+
+
+class RecordPathsSettings(Screen,ConfigListScreen):
+ skin = """
+ <screen name="RecordPathsSettings" position="160,150" size="450,200" title="Recording paths">
+ <ePixmap pixmap="skin_default/buttons/red.png" position="10,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="300,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="10,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="300,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget name="config" position="10,44" size="430,146" />
+ </screen>"""
+
+ def __init__(self, session):
+ from Components.Sources.StaticText import StaticText
+ Screen.__init__(self, session)
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("Save"))
+
+ ConfigListScreen.__init__(self, [])
+ self.initConfigList()
+
+ self["setupActions"] = ActionMap(["SetupActions", "ColorActions"],
+ {
+ "green": self.save,
+ "red": self.cancel,
+ "cancel": self.cancel,
+ "ok": self.ok,
+ }, -2)
+
+ def checkReadWriteDir(self, configele):
+ print "checkReadWrite: ", configele.value
+ if configele.value in [x[0] for x in self.styles] or fileExists(configele.value, "w"):
+ configele.last_value = configele.value
+ return True
+ else:
+ dir = configele.value
+ configele.value = configele.last_value
+ self.session.open(
+ MessageBox,
+ _("The directory %s is not writable.\nMake sure you select a writable directory instead.")%dir,
+ type = MessageBox.TYPE_ERROR
+ )
+ return False
+
+ def initConfigList(self):
+ self.styles = [ ("<default>", _("<Default movie location>")), ("<current>", _("<Current movielist location>")), ("<timer>", _("<Last timer location>")) ]
+ styles_keys = [x[0] for x in self.styles]
+ tmp = config.movielist.videodirs.value
+ default = config.usage.default_path.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "DefaultPath: ", default, tmp
+ self.default_dirname = ConfigSelection(default = default, choices = tmp)
+ tmp = config.movielist.videodirs.value
+ default = config.usage.timer_path.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "TimerPath: ", default, tmp
+ self.timer_dirname = ConfigSelection(default = default, choices = self.styles+tmp)
+ tmp = config.movielist.videodirs.value
+ default = config.usage.instantrec_path.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "InstantrecPath: ", default, tmp
+ self.instantrec_dirname = ConfigSelection(default = default, choices = self.styles+tmp)
+ default = config.usage.timeshift_path.value
+ tmp = config.usage.allowed_timeshift_paths.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ print "TimeshiftPath: ", default, tmp
+ self.timeshift_dirname = ConfigSelection(default = default, choices = tmp)
+ self.default_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+ self.timer_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+ self.instantrec_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+ self.timeshift_dirname.addNotifier(self.checkReadWriteDir, initial_call=False, immediate_feedback=False)
+
+ self.list = []
+ if config.usage.setup_level.index >= 2:
+ self.default_entry = getConfigListEntry(_("Default movie location"), self.default_dirname)
+ self.list.append(self.default_entry)
+ self.timer_entry = getConfigListEntry(_("Timer record location"), self.timer_dirname)
+ self.list.append(self.timer_entry)
+ self.instantrec_entry = getConfigListEntry(_("Instant record location"), self.instantrec_dirname)
+ self.list.append(self.instantrec_entry)
+ else:
+ self.default_entry = getConfigListEntry(_("Movie location"), self.default_dirname)
+ self.list.append(self.default_entry)
+ self.timeshift_entry = getConfigListEntry(_("Timeshift location"), self.timeshift_dirname)
+ self.list.append(self.timeshift_entry)
+ self["config"].setList(self.list)
+
+ def ok(self):
+ currentry = self["config"].getCurrent()
+ self.lastvideodirs = config.movielist.videodirs.value
+ self.lasttimeshiftdirs = config.usage.allowed_timeshift_paths.value
+ if config.usage.setup_level.index >= 2:
+ txt = _("Default movie location")
+ else:
+ txt = _("Movie location")
+ if currentry == self.default_entry:
+ self.entrydirname = self.default_dirname
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ MovieLocationBox,
+ txt,
+ self.default_dirname.value
+ )
+ elif currentry == self.timer_entry:
+ self.entrydirname = self.timer_dirname
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ MovieLocationBox,
+ _("Initial location in new timers"),
+ self.timer_dirname.value
+ )
+ elif currentry == self.instantrec_entry:
+ self.entrydirname = self.instantrec_dirname
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ MovieLocationBox,
+ _("Location for instant recordings"),
+ self.instantrec_dirname.value
+ )
+ elif currentry == self.timeshift_entry:
+ self.entrydirname = self.timeshift_dirname
+ config.usage.timeshift_path.value = self.timeshift_dirname.value
+ self.session.openWithCallback(
+ self.dirnameSelected,
+ TimeshiftLocationBox
+ )
+
+ def dirnameSelected(self, res):
+ if res is not None:
+ self.entrydirname.value = res
+ if config.movielist.videodirs.value != self.lastvideodirs:
+ styles_keys = [x[0] for x in self.styles]
+ tmp = config.movielist.videodirs.value
+ default = self.default_dirname.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.default_dirname.setChoices(tmp, default=default)
+ tmp = config.movielist.videodirs.value
+ default = self.timer_dirname.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.timer_dirname.setChoices(self.styles+tmp, default=default)
+ tmp = config.movielist.videodirs.value
+ default = self.instantrec_dirname.value
+ if default not in tmp and default not in styles_keys:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.instantrec_dirname.setChoices(self.styles+tmp, default=default)
+ self.entrydirname.value = res
+ if config.usage.allowed_timeshift_paths.value != self.lasttimeshiftdirs:
+ tmp = config.usage.allowed_timeshift_paths.value
+ default = self.instantrec_dirname.value
+ if default not in tmp:
+ tmp = tmp[:]
+ tmp.append(default)
+ self.timeshift_dirname.setChoices(tmp, default=default)
+ self.entrydirname.value = res
+ if self.entrydirname.last_value != res:
+ self.checkReadWriteDir(self.entrydirname)
+
+ def save(self):
+ currentry = self["config"].getCurrent()
+ if self.checkReadWriteDir(currentry[1]):
+ config.usage.default_path.value = self.default_dirname.value
+ config.usage.timer_path.value = self.timer_dirname.value
+ config.usage.instantrec_path.value = self.instantrec_dirname.value
+ config.usage.timeshift_path.value = self.timeshift_dirname.value
+ config.usage.default_path.save()
+ config.usage.timer_path.save()
+ config.usage.instantrec_path.save()
+ config.usage.timeshift_path.save()
+ self.close()
+
+ def cancel(self):
+ self.close()
+
from Components.MenuList import MenuList
from Components.TimerList import TimerList
from Components.TimerSanityCheck import TimerSanityCheck
+from Components.UsageConfig import preferredTimerPath
from RecordTimer import RecordTimerEntry, parseEvent, AFTEREVENT
from Screen import Screen
from Screens.ChoiceBox import ChoiceBox
else:
data = parseEvent(event, description = False)
- self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = config.movielist.last_timer_videodir.value, *data))
+ self.addTimer(RecordTimerEntry(serviceref, checkOldTimers = True, dirname = preferredTimerPath(), *data))
def addTimer(self, timer):
self.session.openWithCallback(self.finishedAdd, TimerEntry, timer)
from Components.Button import Button
from Components.Label import Label
from Components.Pixmap import Pixmap
+from Components.UsageConfig import defaultMoviePath
from Screens.MovieSelection import getPreferredTagEditor
from Screens.LocationBox import MovieLocationBox
from Screens.ChoiceBox import ChoiceBox
from RecordTimer import AFTEREVENT
-from Tools.Directories import resolveFilename, SCOPE_HDD
from enigma import eEPGCache
from time import localtime, mktime, time, strftime
from datetime import datetime
self.timerentry_starttime = ConfigClock(default = self.timer.begin)
self.timerentry_endtime = ConfigClock(default = self.timer.end)
- default = self.timer.dirname or resolveFilename(SCOPE_HDD)
+ default = self.timer.dirname or defaultMoviePath()
tmp = config.movielist.videodirs.value
if default not in tmp:
tmp.append(default)
self.timer.service_ref = self.timerentry_service_ref
self.timer.tags = self.timerentry_tags
- self.timer.dirname = self.timerentry_dirname.value
- config.movielist.last_timer_videodir.value = self.timer.dirname
- config.movielist.last_timer_videodir.save()
+ if self.timer.dirname or self.timerentry_dirname.value != defaultMoviePath():
+ self.timer.dirname = self.timerentry_dirname.value
+ config.movielist.last_timer_videodir.value = self.timer.dirname
+ config.movielist.last_timer_videodir.save()
if self.timerentry_type.value == "once":
self.timer.begin, self.timer.end = self.getBeginEnd()
/* note: this requires gstreamer 0.10.x and a big list of plugins. */
/* it's currently hardcoded to use a big-endian alsasink as sink. */
+#include <lib/base/ebase.h>
#include <lib/base/eerror.h>
+#include <lib/base/init_num.h>
+#include <lib/base/init.h>
+#include <lib/base/nconfig.h>
#include <lib/base/object.h>
-#include <lib/base/ebase.h>
-#include <string>
+#include <lib/dvb/decoder.h>
+#include <lib/components/file_eraser.h>
+#include <lib/gui/esubtitle.h>
#include <lib/service/servicemp3.h>
#include <lib/service/service.h>
-#include <lib/components/file_eraser.h>
-#include <lib/base/init_num.h>
-#include <lib/base/init.h>
+
+#include <string>
+
#include <gst/gst.h>
#include <gst/pbutils/missing-plugins.h>
#include <sys/stat.h>
-/* for subtitles */
-#include <lib/gui/esubtitle.h>
// eServiceFactoryMP3
extensions.push_back("vob");
extensions.push_back("wav");
extensions.push_back("wave");
+ extensions.push_back("m4v");
extensions.push_back("mkv");
extensions.push_back("avi");
extensions.push_back("divx");
extensions.push_back("mp4");
extensions.push_back("mov");
extensions.push_back("m4a");
+ extensions.push_back("m2ts");
sc->addServiceFactory(eServiceFactoryMP3::id, this, extensions);
}
}
// eServiceMP3
+int eServiceMP3::ac3_delay,
+ eServiceMP3::pcm_delay;
eServiceMP3::eServiceMP3(eServiceReference ref)
:m_ref(ref), m_pump(eApp, 1)
sourceinfo.containertype = ctAVI;
sourceinfo.is_video = TRUE;
}
- else if ( strcasecmp(ext, ".mp4") == 0 || strcasecmp(ext, ".mov") == 0)
+ else if ( strcasecmp(ext, ".mp4") == 0 || strcasecmp(ext, ".mov") == 0 || strcasecmp(ext, ".m4v") == 0)
{
sourceinfo.containertype = ctMP4;
sourceinfo.is_video = TRUE;
return 0;
}
-
int eServiceMP3::getInfo(int w)
{
const gchar *tag = 0;
return 0;
}
+RESULT eServiceMP3::audioDelay(ePtr<iAudioDelay> &ptr)
+{
+ ptr = this;
+ return 0;
+}
+
int eServiceMP3::getNumberOfTracks()
{
return m_audioStreams.size();
g_object_set (G_OBJECT (sink), "emit-signals", TRUE, NULL);
gst_object_unref(sink);
}
+ setAC3Delay(ac3_delay);
+ setPCMDelay(pcm_delay);
} break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
{
return 0;
}
+int eServiceMP3::getAC3Delay()
+{
+ return ac3_delay;
+}
+
+int eServiceMP3::getPCMDelay()
+{
+ return pcm_delay;
+}
+
+void eServiceMP3::setAC3Delay(int delay)
+{
+ if (!m_gst_playbin || m_state != stRunning)
+ return;
+ else
+ {
+ GstElement *sink;
+ std::string config_delay;
+ int config_delay_int = delay;
+ if(ePythonConfigQuery::getConfigValue("config.av.generalAC3delay", config_delay) == 0)
+ config_delay_int += atoi(config_delay.c_str());
+
+ g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+
+ if (!sink)
+ return;
+ else {
+ gchar *name = gst_element_get_name(sink);
+
+ if (strstr(name, "dvbaudiosink"))
+ eTSMPEGDecoder::setHwAC3Delay(config_delay_int);
+ g_free(name);
+ gst_object_unref(sink);
+ }
+ }
+}
+
+void eServiceMP3::setPCMDelay(int delay)
+{
+ if (!m_gst_playbin || m_state != stRunning)
+ return;
+ else
+ {
+ GstElement *sink;
+ std::string config_delay;
+ int config_delay_int = delay;
+ if(ePythonConfigQuery::getConfigValue("config.av.generalPCMdelay", config_delay) == 0)
+ config_delay_int += atoi(config_delay.c_str());
+
+ g_object_get (G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL);
+
+ if (!sink)
+ return;
+ else {
+ gchar *name = gst_element_get_name(sink);
+
+ if (strstr(name, "dvbaudiosink"))
+ eTSMPEGDecoder::setHwPCMDelay(config_delay_int);
+ else {
+ // this is realy untested..and not used yet
+ gint64 offset = config_delay_int;
+ offset *= 1000000; // milli to nano
+ g_object_set (G_OBJECT (m_gst_playbin), "ts-offset", offset, NULL);
+ }
+ g_free(name);
+ gst_object_unref(sink);
+ }
+ }
+}
#else
#warning gstreamer not available, not building media player
typedef enum { stPlainText, stSSA, stSRT } subtype_t;
typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t;
-class eServiceMP3: public iPlayableService, public iPauseableService,
- public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public iStreamedService, public Object
+class eServiceMP3: public iPlayableService, public iPauseableService,
+ public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection,
+ public iSubtitleOutput, public iStreamedService, public iAudioDelay, public Object
{
DECLARE_REF(eServiceMP3);
public:
RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
+ RESULT audioDelay(ePtr<iAudioDelay> &ptr);
// not implemented (yet)
RESULT frontendInfo(ePtr<iFrontendInformation> &ptr) { ptr = 0; return -1; }
RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
RESULT cueSheet(ePtr<iCueSheet> &ptr) { ptr = 0; return -1; }
- RESULT audioDelay(ePtr<iAudioDelay> &ptr) { ptr = 0; return -1; }
+
RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr) { ptr = 0; return -1; }
RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
PyObject *getBufferCharge();
int setBufferSize(int size);
+ // iAudioDelay
+ int getAC3Delay();
+ int getPCMDelay();
+ void setAC3Delay(int);
+ void setPCMDelay(int);
+
struct audioStream
{
GstPad* pad;
}
};
private:
+ static int pcm_delay;
+ static int ac3_delay;
int m_currentAudioStream;
int m_currentSubtitleStream;
int selectAudioStream(int i);
msgstr ""
"Project-Id-Version: tuxbox-enigma 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-09 13:06+0200\n"
+"POT-Creation-Date: 2009-11-05 18:09+0100\n"
"PO-Revision-Date: 2006-01-10 01:17+0300\n"
"Last-Translator: hazem <moustafagamal@hotmail.com>\n"
"Language-Team: Arabic <moustafagamal@hotmail.com>\n"
msgid ""
"\n"
+"System will restart after the restore!"
+msgstr ""
+
+msgid ""
+"\n"
"View, install and remove available or installed packages."
msgstr ""
msgid " updates available."
msgstr ""
+msgid " wireless networks found!"
+msgstr ""
+
msgid "#000000"
msgstr ""
msgid "1"
msgstr ""
+msgid "1 wireless network found!"
+msgstr ""
+
msgid "1.0"
msgstr ""
msgid "About..."
msgstr "عـن..."
+msgid "Accesspoint:"
+msgstr ""
+
msgid "Action on long powerbutton press"
msgstr ""
msgid "Behavior when a movie reaches the end"
msgstr ""
+msgid "Bitrate:"
+msgstr ""
+
msgid "Block noise reduction"
msgstr ""
msgid "Choose Tuner"
msgstr ""
+msgid "Choose a wireless network"
+msgstr ""
+
msgid "Choose backup files"
msgstr ""
msgid "Configuration Mode"
msgstr "وضع التهيئه"
+msgid "Configure interface"
+msgstr ""
+
+msgid "Configure nameservers"
+msgstr ""
+
+msgid "Configure your internal LAN"
+msgstr ""
+
+msgid "Configure your network again"
+msgstr ""
+
+msgid "Configure your wireless LAN again"
+msgstr ""
+
msgid "Configuring"
msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect to a Wireless Network"
+msgstr ""
+
msgid "Connected to"
msgstr ""
msgid ""
"Crashlogs found!\n"
+"Send them to Dream Multimedia ?"
+msgstr ""
+
+msgid ""
+"Crashlogs found!\n"
"Send them to Dream Multimedia?"
msgstr ""
msgid "DiSEqC repeats"
msgstr ""
+msgid "DiSEqC-Tester settings"
+msgstr ""
+
msgid "Dialing:"
msgstr ""
msgid "Directory %s nonexistent."
msgstr ""
+msgid "Directory browser"
+msgstr ""
+
msgid "Disable"
msgstr "إبطال"
msgid "Enabled"
msgstr ""
+#, python-format
+msgid "Encrypted: %s"
+msgstr ""
+
msgid "Encryption"
msgstr ""
msgid "Encryption Type"
msgstr ""
+msgid "Encryption:"
+msgstr ""
+
msgid "End time"
msgstr ""
"© 2006 - Stephan Reichholf"
msgstr ""
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: Note that "Enter" in the two strings below should *not*
-#. be interpreted as "Give speed as input". The intended meaning is
-#. instead "Initial speed when starting winding", i.e. the speed at
-#. which "winding mode" is entered when first pressing "rewind" or
-#. "fast forward".
msgid "Enter Fast Forward at speed"
msgstr ""
msgid "Exit editor"
msgstr ""
+msgid "Exit network wizard"
+msgstr ""
+
msgid "Exit the cleanup wizard"
msgstr ""
msgid "Hidden network SSID"
msgstr ""
+msgid "Hidden networkname"
+msgstr ""
+
msgid "Hierarchy Information"
msgstr ""
msgid "Integrated Wireless"
msgstr ""
+#, python-format
+msgid "Interface: %s"
+msgstr ""
+
msgid "Intermediate"
msgstr ""
msgid "Limits on"
msgstr ""
+msgid "Link Quality:"
+msgstr ""
+
msgid "Link:"
msgstr ""
msgid "Margin before record (minutes)"
msgstr ""
+#, python-format
+msgid "Max. Bitrate: %s"
+msgstr ""
+
msgid "Media player"
msgstr ""
msgid "Network Setup"
msgstr "ضبط الشبـكة"
+msgid "Network Wizard"
+msgstr ""
+
msgid "Network scan"
msgstr ""
msgid "No 50 Hz, sorry. :("
msgstr ""
+msgid "No Connection"
+msgstr ""
+
msgid "No HDD found or HDD not initialized!"
msgstr ""
"لا يوجد قرص صلب\n"
msgid "No free tuner!"
msgstr ""
+msgid "No networks found"
+msgstr ""
+
msgid ""
"No packages were upgraded yet. So you can check your network and try again."
msgstr ""
"When you say 'No' here the setup protection stay disabled!"
msgstr ""
+msgid "No wireless networks found! Please refresh."
+msgstr ""
+
msgid ""
"No working local network adapter found.\n"
"Please verify that you have attached a network cable and your network is "
msgstr ""
msgid ""
+"Please configure or verify your Nameservers by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
+"Please configure your internet connection by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
"Please disconnect all USB devices from your Dreambox and (re-)attach the "
"target USB stick (minimum size is 64 MB) now!"
msgstr ""
msgid "Please select the movie path..."
msgstr ""
+msgid ""
+"Please select the network interface that you want to use for your internet "
+"connection.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
+"Please select the wireless network that you want to connect to.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Please set up tuner B"
msgstr "من فضلك أضبط التيونر ب"
msgid "Please wait while we configure your network..."
msgstr ""
+msgid "Please wait while we prepare your network interfaces..."
+msgstr ""
+
+msgid "Please wait while we test your network..."
+msgstr ""
+
msgid "Please wait while your network is restarting..."
msgstr ""
msgid "Reenter new pin"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Refresh Rate"
msgstr ""
msgid "Removed successfully."
msgstr ""
-msgid "Removeing"
-msgstr ""
-
msgid "Removing"
msgstr ""
msgid "SNR:"
msgstr ""
+msgid "SSID:"
+msgstr ""
+
msgid "Sat"
msgstr ""
msgid "Select image"
msgstr ""
+msgid "Select interface"
+msgstr ""
+
msgid "Select package"
msgstr ""
msgid "Select video mode"
msgstr ""
+msgid "Select wireless network"
+msgstr ""
+
msgid "Selected source image"
msgstr ""
msgid "Shutdown Dreambox after"
msgstr ""
+msgid "Signal Strength:"
+msgstr ""
+
+msgid "Signal: "
+msgstr ""
+
msgid "Similar"
msgstr ""
msgstr ""
msgid ""
+"Thank you for using the wizard.\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
"Thank you for using the wizard. Your box is now ready to use.\n"
"Please press OK to start using your Dreambox."
msgstr ""
msgid ""
"The wireless LAN plugin is not installed!\n"
+"Please install it and choose what you want to do next."
+msgstr ""
+
+msgid ""
+"The wireless LAN plugin is not installed!\n"
"Please install it."
msgstr ""
"Remove"
msgstr ""
-msgid "Unicable"
-msgstr ""
-
msgid "Unicable LNB"
msgstr ""
msgid "Unmount failed"
msgstr ""
+msgid "Unsupported"
+msgstr ""
+
msgid "Update"
msgstr ""
msgid "Upgrade finished. Do you want to reboot your Dreambox?"
msgstr ""
-msgid "Upgradeing"
-msgstr ""
-
msgid "Upgrading"
msgstr ""
msgid "Use a gateway"
msgstr ""
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: The effect of "Non-smooth winding" is that rather
-#. than using ordinary "continuous" or "smooth" winding, a fast
-#. sequence of stills is shown when winding at high speeds. This
-#. makes it much easier too follow when almost each frame comes from
-#. a new scene. The effect is achieved by repeating each shown frame
-#. a couple of times. The settings control both at which speed this
-#. winding mode sets in, and how many times each frame should be
-#. repeated. This was previously called "Discontinuous playback"
-#. which was incomprehensible. "Non-smooth winding" may be a better
-#. term, but note that there is nothing irregular about it. Synonyms
-#. better suited for translation to other languages may be "stepwise
-#. winding/playback", or "winding/playback using stills".
msgid "Use non-smooth winding at speeds above"
msgstr ""
msgid "Use this video enhancement settings?"
msgstr ""
+msgid "Use time of currently running service"
+msgstr ""
+
msgid "Use usals for this sat"
msgstr "USALS für diesen Sat benutzen"
msgid "Video mode selection."
msgstr ""
-msgid "VideoSetup"
-msgstr ""
-
msgid "Videoenhancement Setup"
msgstr ""
msgid ""
"Welcome.\n"
"\n"
+"If you want to connect your Dreambox to the Internet, this wizard will guide "
+"you through the basic network setup of your Dreambox.\n"
+"\n"
+"Press OK to start configuring your network"
+msgstr ""
+
+msgid ""
+"Welcome.\n"
+"\n"
"This start wizard will guide you through the basic setup of your Dreambox.\n"
"Press the OK button on your remote control to move to the next step."
msgstr ""
msgid "Wireless"
msgstr ""
+msgid "Wireless LAN"
+msgstr ""
+
msgid "Wireless Network"
msgstr ""
+msgid "Wireless Network State"
+msgstr ""
+
msgid "Write error while recording. Disk full?\n"
msgstr ""
"Do you want to set the pin now?"
msgstr ""
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Your Dreambox will restart after pressing OK on your remote control."
msgstr ""
"Press OK to start upgrade."
msgstr ""
+msgid ""
+"Your internet connection is not working!\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Your name (optional):"
msgstr ""
"Do you want to disable the second network interface?"
msgstr ""
+msgid ""
+"Your wireless LAN internet connection could not be started!\n"
+"Have you attached your USB WLAN Stick?\n"
+"\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Zap back to service before positioner setup?"
msgstr ""
msgid "enigma2 and network"
msgstr ""
+msgid "enter hidden network SSID"
+msgstr ""
+
msgid "equal to"
msgstr ""
msgid "hidden network"
msgstr ""
+msgid "hidden..."
+msgstr ""
+
msgid "hide extended description"
msgstr ""
msgid "toggle time, chapter, audio, subtitle info"
msgstr ""
+msgid "unavailable"
+msgstr ""
+
msgid "unconfirmed"
msgstr ""
msgstr ""
"Project-Id-Version: ca\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-09 13:06+0200\n"
+"POT-Creation-Date: 2009-11-05 18:09+0100\n"
"PO-Revision-Date: 2007-08-14 10:23+0200\n"
"Last-Translator: Oriol Pellicer <oriol@elsud.org>\n"
"Language-Team: \n"
msgid ""
"\n"
+"System will restart after the restore!"
+msgstr ""
+
+msgid ""
+"\n"
"View, install and remove available or installed packages."
msgstr ""
msgid " updates available."
msgstr ""
+msgid " wireless networks found!"
+msgstr ""
+
msgid "#000000"
msgstr "#000000"
msgid "1"
msgstr "1"
+msgid "1 wireless network found!"
+msgstr ""
+
msgid "1.0"
msgstr "1.0"
msgid "About..."
msgstr "Quant a..."
+msgid "Accesspoint:"
+msgstr ""
+
msgid "Action on long powerbutton press"
msgstr ""
msgid "Behavior when a movie reaches the end"
msgstr ""
+msgid "Bitrate:"
+msgstr ""
+
msgid "Block noise reduction"
msgstr ""
msgid "Choose Tuner"
msgstr "Escull sintonitzador"
+msgid "Choose a wireless network"
+msgstr ""
+
msgid "Choose backup files"
msgstr ""
msgid "Configuration Mode"
msgstr "Mode configuració"
+msgid "Configure interface"
+msgstr ""
+
+msgid "Configure nameservers"
+msgstr ""
+
+msgid "Configure your internal LAN"
+msgstr ""
+
+msgid "Configure your network again"
+msgstr ""
+
+msgid "Configure your wireless LAN again"
+msgstr ""
+
msgid "Configuring"
msgstr "Configurant"
msgid "Connect"
msgstr ""
+msgid "Connect to a Wireless Network"
+msgstr ""
+
msgid "Connected to"
msgstr ""
msgid ""
"Crashlogs found!\n"
+"Send them to Dream Multimedia ?"
+msgstr ""
+
+msgid ""
+"Crashlogs found!\n"
"Send them to Dream Multimedia?"
msgstr ""
msgid "DiSEqC repeats"
msgstr "Repetir DiSEqC"
+msgid "DiSEqC-Tester settings"
+msgstr ""
+
msgid "Dialing:"
msgstr ""
msgid "Directory %s nonexistent."
msgstr ""
+msgid "Directory browser"
+msgstr ""
+
msgid "Disable"
msgstr "Deshabilitar"
msgid "Enabled"
msgstr "Activat"
+#, python-format
+msgid "Encrypted: %s"
+msgstr ""
+
msgid "Encryption"
msgstr ""
msgid "Encryption Type"
msgstr ""
+msgid "Encryption:"
+msgstr ""
+
msgid "End time"
msgstr "Hora final"
"\n"
"© 2006 - Stephan Reichholf"
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: Note that "Enter" in the two strings below should *not*
-#. be interpreted as "Give speed as input". The intended meaning is
-#. instead "Initial speed when starting winding", i.e. the speed at
-#. which "winding mode" is entered when first pressing "rewind" or
-#. "fast forward".
msgid "Enter Fast Forward at speed"
msgstr ""
msgid "Exit editor"
msgstr "Sortir de l'editor"
+msgid "Exit network wizard"
+msgstr ""
+
msgid "Exit the cleanup wizard"
msgstr ""
msgid "Hidden network SSID"
msgstr ""
+msgid "Hidden networkname"
+msgstr ""
+
msgid "Hierarchy Information"
msgstr "Informació jeràrquica"
msgid "Integrated Wireless"
msgstr ""
+#, python-format
+msgid "Interface: %s"
+msgstr ""
+
msgid "Intermediate"
msgstr ""
msgid "Limits on"
msgstr "Posar límits"
+msgid "Link Quality:"
+msgstr ""
+
msgid "Link:"
msgstr ""
msgid "Margin before record (minutes)"
msgstr "Marge abans de gravar (minuts)"
+#, python-format
+msgid "Max. Bitrate: %s"
+msgstr ""
+
msgid "Media player"
msgstr "Reproductor"
msgid "Network Setup"
msgstr "Config xarxa"
+msgid "Network Wizard"
+msgstr ""
+
msgid "Network scan"
msgstr "Escanejar xarxa"
msgid "No 50 Hz, sorry. :("
msgstr ""
+msgid "No Connection"
+msgstr ""
+
msgid "No HDD found or HDD not initialized!"
msgstr "No hi ha disc dur o no està inicialitzat!"
msgid "No free tuner!"
msgstr "No hi ha cap sintonitzador lliure!"
+msgid "No networks found"
+msgstr ""
+
msgid ""
"No packages were upgraded yet. So you can check your network and try again."
msgstr "No s'ha actualitzat cap paquet. Comprova la xarxa i torna-ho a provar."
"Vols canviar-lo ara?\n"
"Si contestes 'No' es deshabilitarà la protecció de la configuració!"
+msgid "No wireless networks found! Please refresh."
+msgstr ""
+
msgid ""
"No working local network adapter found.\n"
"Please verify that you have attached a network cable and your network is "
msgstr ""
msgid ""
+"Please configure or verify your Nameservers by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
+"Please configure your internet connection by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
"Please disconnect all USB devices from your Dreambox and (re-)attach the "
"target USB stick (minimum size is 64 MB) now!"
msgstr ""
msgid "Please select the movie path..."
msgstr ""
+msgid ""
+"Please select the network interface that you want to use for your internet "
+"connection.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
+"Please select the wireless network that you want to connect to.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Please set up tuner B"
msgstr "Configura el sintonitzador B"
msgid "Please wait while we configure your network..."
msgstr ""
+msgid "Please wait while we prepare your network interfaces..."
+msgstr ""
+
+msgid "Please wait while we test your network..."
+msgstr ""
+
msgid "Please wait while your network is restarting..."
msgstr ""
msgid "Reenter new pin"
msgstr "Torna a entrar el nou pin"
+msgid "Refresh"
+msgstr ""
+
msgid "Refresh Rate"
msgstr ""
msgid "Removed successfully."
msgstr ""
-msgid "Removeing"
-msgstr ""
-
msgid "Removing"
msgstr ""
msgid "SNR:"
msgstr ""
+msgid "SSID:"
+msgstr ""
+
msgid "Sat"
msgstr "Dis"
msgid "Select image"
msgstr ""
+msgid "Select interface"
+msgstr ""
+
msgid "Select package"
msgstr ""
msgid "Select video mode"
msgstr ""
+msgid "Select wireless network"
+msgstr ""
+
msgid "Selected source image"
msgstr ""
msgid "Shutdown Dreambox after"
msgstr "Apagar la Dreambox després de"
+msgid "Signal Strength:"
+msgstr ""
+
+msgid "Signal: "
+msgstr ""
+
msgid "Similar"
msgstr "Similar"
msgstr ""
msgid ""
+"Thank you for using the wizard.\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
"Thank you for using the wizard. Your box is now ready to use.\n"
"Please press OK to start using your Dreambox."
msgstr ""
msgid ""
"The wireless LAN plugin is not installed!\n"
+"Please install it and choose what you want to do next."
+msgstr ""
+
+msgid ""
+"The wireless LAN plugin is not installed!\n"
"Please install it."
msgstr ""
"Remove"
msgstr ""
-msgid "Unicable"
-msgstr ""
-
msgid "Unicable LNB"
msgstr ""
msgid "Unmount failed"
msgstr "Ha fallat la comanda unmount"
+msgid "Unsupported"
+msgstr ""
+
msgid "Update"
msgstr ""
msgid "Upgrade finished. Do you want to reboot your Dreambox?"
msgstr "S'ha acabat l'actualització. Vols tornar a arrancar la Dreambox?"
-msgid "Upgradeing"
-msgstr ""
-
msgid "Upgrading"
msgstr "Actualitzant"
msgid "Use a gateway"
msgstr "Utilitzar una porta d'enllaç"
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: The effect of "Non-smooth winding" is that rather
-#. than using ordinary "continuous" or "smooth" winding, a fast
-#. sequence of stills is shown when winding at high speeds. This
-#. makes it much easier too follow when almost each frame comes from
-#. a new scene. The effect is achieved by repeating each shown frame
-#. a couple of times. The settings control both at which speed this
-#. winding mode sets in, and how many times each frame should be
-#. repeated. This was previously called "Discontinuous playback"
-#. which was incomprehensible. "Non-smooth winding" may be a better
-#. term, but note that there is nothing irregular about it. Synonyms
-#. better suited for translation to other languages may be "stepwise
-#. winding/playback", or "winding/playback using stills".
msgid "Use non-smooth winding at speeds above"
msgstr ""
msgid "Use this video enhancement settings?"
msgstr ""
+msgid "Use time of currently running service"
+msgstr ""
+
msgid "Use usals for this sat"
msgstr "Utilitzar usals per a aquest sat"
msgid "Video mode selection."
msgstr ""
-msgid "VideoSetup"
-msgstr ""
-
msgid "Videoenhancement Setup"
msgstr ""
msgid ""
"Welcome.\n"
"\n"
+"If you want to connect your Dreambox to the Internet, this wizard will guide "
+"you through the basic network setup of your Dreambox.\n"
+"\n"
+"Press OK to start configuring your network"
+msgstr ""
+
+msgid ""
+"Welcome.\n"
+"\n"
"This start wizard will guide you through the basic setup of your Dreambox.\n"
"Press the OK button on your remote control to move to the next step."
msgstr ""
msgid "Wireless"
msgstr ""
+msgid "Wireless LAN"
+msgstr ""
+
msgid "Wireless Network"
msgstr ""
+msgid "Wireless Network State"
+msgstr ""
+
msgid "Write error while recording. Disk full?\n"
msgstr "Error d'escriptura durant la gravació. Disc ple?\n"
"\n"
"Vols entrar-lo ara?"
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Your Dreambox will restart after pressing OK on your remote control."
msgstr ""
"El firmware del frontprocessor ha de ser actualitzat.\n"
"Prem OK per a començar l'actualizació."
+msgid ""
+"Your internet connection is not working!\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Your name (optional):"
msgstr ""
"Do you want to disable the second network interface?"
msgstr ""
+msgid ""
+"Your wireless LAN internet connection could not be started!\n"
+"Have you attached your USB WLAN Stick?\n"
+"\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Zap back to service before positioner setup?"
msgstr "Tornar al canal abans de configurar el motor?"
msgid "enigma2 and network"
msgstr ""
+msgid "enter hidden network SSID"
+msgstr ""
+
msgid "equal to"
msgstr ""
msgid "hidden network"
msgstr ""
+msgid "hidden..."
+msgstr ""
+
msgid "hide extended description"
msgstr ""
msgid "toggle time, chapter, audio, subtitle info"
msgstr ""
+msgid "unavailable"
+msgstr ""
+
msgid "unconfirmed"
msgstr ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-09 13:06+0200\n"
+"POT-Creation-Date: 2009-11-05 18:09+0100\n"
"PO-Revision-Date: 2008-09-28 18:09+0100\n"
"Last-Translator: ws79 <ws79@centrum.cz>\n"
"Language-Team: \n"
msgid ""
"\n"
+"System will restart after the restore!"
+msgstr ""
+
+msgid ""
+"\n"
"View, install and remove available or installed packages."
msgstr ""
msgid " updates available."
msgstr ""
+msgid " wireless networks found!"
+msgstr ""
+
msgid "#000000"
msgstr "#000000"
msgid "1"
msgstr "1"
+msgid "1 wireless network found!"
+msgstr ""
+
msgid "1.0"
msgstr "1.0"
msgid "About..."
msgstr "O ..."
+msgid "Accesspoint:"
+msgstr ""
+
msgid "Action on long powerbutton press"
msgstr "Akce při delším podržení zapínacího tlačítka"
msgid "Behavior when a movie reaches the end"
msgstr "Režim když film dosáhne konce"
+msgid "Bitrate:"
+msgstr ""
+
msgid "Block noise reduction"
msgstr ""
msgid "Choose Tuner"
msgstr "Vyber tuner"
+msgid "Choose a wireless network"
+msgstr ""
+
msgid "Choose backup files"
msgstr ""
msgid "Configuration Mode"
msgstr "Konfigurační mód"
+msgid "Configure interface"
+msgstr ""
+
+msgid "Configure nameservers"
+msgstr ""
+
+msgid "Configure your internal LAN"
+msgstr "Konfigurovat vaši LAN"
+
+msgid "Configure your network again"
+msgstr ""
+
+msgid "Configure your wireless LAN again"
+msgstr "Znova konfigurovat vaši WLAN"
+
msgid "Configuring"
msgstr "Konfiguruji"
msgid "Connect"
msgstr ""
+msgid "Connect to a Wireless Network"
+msgstr ""
+
msgid "Connected to"
msgstr ""
msgid ""
"Crashlogs found!\n"
+"Send them to Dream Multimedia ?"
+msgstr ""
+
+msgid ""
+"Crashlogs found!\n"
"Send them to Dream Multimedia?"
msgstr ""
msgid "DiSEqC repeats"
msgstr "DiSEqC opakování"
+msgid "DiSEqC-Tester settings"
+msgstr ""
+
msgid "Dialing:"
msgstr ""
msgid "Directory %s nonexistent."
msgstr ""
+msgid "Directory browser"
+msgstr ""
+
msgid "Disable"
msgstr "Zakázat"
msgid "Enabled"
msgstr "Povoleno"
+#, python-format
+msgid "Encrypted: %s"
+msgstr ""
+
msgid "Encryption"
msgstr "Šifrování"
msgid "Encryption Type"
msgstr "Typ šifrování"
+msgid "Encryption:"
+msgstr ""
+
msgid "End time"
msgstr "Konečný čas"
"\n"
"© 2006 - Stephan Reichholf"
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: Note that "Enter" in the two strings below should *not*
-#. be interpreted as "Give speed as input". The intended meaning is
-#. instead "Initial speed when starting winding", i.e. the speed at
-#. which "winding mode" is entered when first pressing "rewind" or
-#. "fast forward".
msgid "Enter Fast Forward at speed"
msgstr "Začít přetáčení vpřed na rychlosti"
msgid "Exit editor"
msgstr "Ukončit editor"
+msgid "Exit network wizard"
+msgstr ""
+
msgid "Exit the cleanup wizard"
msgstr ""
msgid "Hidden network SSID"
msgstr ""
+msgid "Hidden networkname"
+msgstr ""
+
msgid "Hierarchy Information"
msgstr "Hierarchické informace"
msgid "Integrated Wireless"
msgstr ""
+#, python-format
+msgid "Interface: %s"
+msgstr ""
+
msgid "Intermediate"
msgstr "Střední"
msgid "Limits on"
msgstr "Zapnout limit"
+msgid "Link Quality:"
+msgstr ""
+
msgid "Link:"
msgstr "Odkaz:"
msgid "Margin before record (minutes)"
msgstr "Rezerva před nahráváním (minuty)"
+#, python-format
+msgid "Max. Bitrate: %s"
+msgstr ""
+
msgid "Media player"
msgstr "Přehrávač médií"
msgid "Network Setup"
msgstr "Nastavení sítě"
+msgid "Network Wizard"
+msgstr ""
+
msgid "Network scan"
msgstr "Prohledávání sítě"
msgid "No 50 Hz, sorry. :("
msgstr "Nelze nastavit 50 Hz"
+msgid "No Connection"
+msgstr ""
+
msgid "No HDD found or HDD not initialized!"
msgstr "HDD nebyl nalezen nebo HDD není inicializován!"
msgid "No free tuner!"
msgstr "Žádný volný tuner!"
+msgid "No networks found"
+msgstr ""
+
msgid ""
"No packages were upgraded yet. So you can check your network and try again."
msgstr ""
"Chcete nyní změnit PIN?\n"
"Pokud 'Ne' tak ochrana nastavení zůstane vypnuta!"
+msgid "No wireless networks found! Please refresh."
+msgstr ""
+
msgid ""
"No working local network adapter found.\n"
"Please verify that you have attached a network cable and your network is "
msgstr "Vyberte prosím setting, který chcete nainstalovat."
msgid ""
+"Please configure or verify your Nameservers by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
+"Please configure your internet connection by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
"Please disconnect all USB devices from your Dreambox and (re-)attach the "
"target USB stick (minimum size is 64 MB) now!"
msgstr ""
msgid "Please select the movie path..."
msgstr "Vyberte cestu k filmům..."
+msgid ""
+"Please select the network interface that you want to use for your internet "
+"connection.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
+"Please select the wireless network that you want to connect to.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Please set up tuner B"
msgstr "Prosím, nastav tuner B"
msgid "Please wait while we configure your network..."
msgstr ""
+msgid "Please wait while we prepare your network interfaces..."
+msgstr ""
+
+msgid "Please wait while we test your network..."
+msgstr ""
+
msgid "Please wait while your network is restarting..."
msgstr ""
msgid "Reenter new pin"
msgstr "Zadejte znova PIN"
+msgid "Refresh"
+msgstr ""
+
msgid "Refresh Rate"
msgstr "Obnovovací frekvence"
msgid "Removed successfully."
msgstr ""
-msgid "Removeing"
-msgstr ""
-
msgid "Removing"
msgstr ""
msgid "SNR:"
msgstr "SNR:"
+msgid "SSID:"
+msgstr ""
+
msgid "Sat"
msgstr "So"
msgid "Select image"
msgstr ""
+msgid "Select interface"
+msgstr ""
+
msgid "Select package"
msgstr ""
msgid "Select video mode"
msgstr "Vyberte video mód"
+msgid "Select wireless network"
+msgstr ""
+
msgid "Selected source image"
msgstr ""
msgid "Shutdown Dreambox after"
msgstr "Vypnout Dreambox po"
+msgid "Signal Strength:"
+msgstr ""
+
+msgid "Signal: "
+msgstr ""
+
msgid "Similar"
msgstr "Podobné"
msgstr "Vzkaz"
msgid ""
+"Thank you for using the wizard.\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
"Thank you for using the wizard. Your box is now ready to use.\n"
"Please press OK to start using your Dreambox."
msgstr ""
msgid ""
"The wireless LAN plugin is not installed!\n"
+"Please install it and choose what you want to do next."
+msgstr ""
+
+msgid ""
+"The wireless LAN plugin is not installed!\n"
"Please install it."
msgstr ""
"Remove"
msgstr ""
-msgid "Unicable"
-msgstr ""
-
msgid "Unicable LNB"
msgstr ""
msgid "Unmount failed"
msgstr "Unmount selhalo"
+msgid "Unsupported"
+msgstr ""
+
msgid "Update"
msgstr ""
msgid "Upgrade finished. Do you want to reboot your Dreambox?"
msgstr "Upgrade skončil. Chcete restartovat váš Dreambox?"
-msgid "Upgradeing"
-msgstr ""
-
msgid "Upgrading"
msgstr "Aktualizuji"
msgid "Use a gateway"
msgstr "Použít bránu (gateway)"
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: The effect of "Non-smooth winding" is that rather
-#. than using ordinary "continuous" or "smooth" winding, a fast
-#. sequence of stills is shown when winding at high speeds. This
-#. makes it much easier too follow when almost each frame comes from
-#. a new scene. The effect is achieved by repeating each shown frame
-#. a couple of times. The settings control both at which speed this
-#. winding mode sets in, and how many times each frame should be
-#. repeated. This was previously called "Discontinuous playback"
-#. which was incomprehensible. "Non-smooth winding" may be a better
-#. term, but note that there is nothing irregular about it. Synonyms
-#. better suited for translation to other languages may be "stepwise
-#. winding/playback", or "winding/playback using stills".
msgid "Use non-smooth winding at speeds above"
msgstr "Použít skokové přetáčení s rychlostmi uvedenými výše"
msgid "Use this video enhancement settings?"
msgstr ""
+msgid "Use time of currently running service"
+msgstr ""
+
msgid "Use usals for this sat"
msgstr "Použít USUALS pro tento satelit"
msgid "Video mode selection."
msgstr "Výběr video módu"
-msgid "VideoSetup"
-msgstr ""
-
msgid "Videoenhancement Setup"
msgstr ""
msgid ""
"Welcome.\n"
"\n"
+"If you want to connect your Dreambox to the Internet, this wizard will guide "
+"you through the basic network setup of your Dreambox.\n"
+"\n"
+"Press OK to start configuring your network"
+msgstr ""
+
+msgid ""
+"Welcome.\n"
+"\n"
"This start wizard will guide you through the basic setup of your Dreambox.\n"
"Press the OK button on your remote control to move to the next step."
msgstr ""
msgid "Wireless"
msgstr "Bezdrátové"
+msgid "Wireless LAN"
+msgstr ""
+
msgid "Wireless Network"
msgstr "Bezdrátová síť"
+msgid "Wireless Network State"
+msgstr ""
+
msgid "Write error while recording. Disk full?\n"
msgstr "Zapsat chybu při nahrávání. Disk plný?\n"
"\n"
"Chcete nyní nastavit PIN?"
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Your Dreambox will restart after pressing OK on your remote control."
msgstr "Váš Dreambox se restartuje po stisknutí OK na vašem dálkovém ovladači."
"Firmware vašeho frontprocesoru musí být aktualizován.\n"
"Stiskněte OK pro aktualizaci."
+msgid ""
+"Your internet connection is not working!\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Your name (optional):"
msgstr ""
"Do you want to disable the second network interface?"
msgstr ""
+msgid ""
+"Your wireless LAN internet connection could not be started!\n"
+"Have you attached your USB WLAN Stick?\n"
+"\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Zap back to service before positioner setup?"
msgstr "Přepnout zpět na program před nastavováním positioneru?"
msgid "enigma2 and network"
msgstr ""
+msgid "enter hidden network SSID"
+msgstr ""
+
msgid "equal to"
msgstr ""
msgid "hidden network"
msgstr ""
+msgid "hidden..."
+msgstr ""
+
msgid "hide extended description"
msgstr "skrýt rozšířený popis"
msgid "toggle time, chapter, audio, subtitle info"
msgstr "přepnout informace mezi časem, kapitolou, audiostopou, titulky"
+msgid "unavailable"
+msgstr ""
+
msgid "unconfirmed"
msgstr "nepotvrzeno"
#~ msgid "Choose Location"
#~ msgstr "Vyberte umístění"
-#~ msgid "Configure your internal LAN"
-#~ msgstr "Konfigurovat vaši LAN"
-
#~ msgid "Configure your internal LAN again"
#~ msgstr "Znova konfigurovat vaši LAN"
#~ msgid "Configure your wireless LAN"
#~ msgstr "Konfigurovat vaši WLAN"
-#~ msgid "Configure your wireless LAN again"
-#~ msgstr "Znova konfigurovat vaši WLAN"
-
#~ msgid "Confirm"
#~ msgstr "Potvrdit"
msgstr ""
"Project-Id-Version: Enigma2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-09 13:06+0200\n"
+"POT-Creation-Date: 2009-11-05 18:09+0100\n"
"PO-Revision-Date: 2009-09-04 07:50+0100\n"
"Last-Translator: Ingmar Jørgensen <dreambox@ingmar.dk>\n"
"Language-Team: jazzydane <dreambox@ingmar.dk>\n"
msgid ""
"\n"
+"System will restart after the restore!"
+msgstr ""
+"\n"
+"Systemet vil genstarte efter gendannelsen!"
+
+msgid ""
+"\n"
"View, install and remove available or installed packages."
msgstr ""
"\n"
msgid " updates available."
msgstr "opdateringer tilgængelig."
+msgid " wireless networks found!"
+msgstr ""
+
msgid "#000000"
msgstr "#000000"
msgid "1"
msgstr "1"
+msgid "1 wireless network found!"
+msgstr ""
+
msgid "1.0"
msgstr "1.0"
msgid "About..."
msgstr "Dreambox info"
+msgid "Accesspoint:"
+msgstr ""
+
msgid "Action on long powerbutton press"
msgstr "Aktion ved langt powerknap tryk"
msgid "Behavior when a movie reaches the end"
msgstr "Opførsel når filmen er næsten slut"
+msgid "Bitrate:"
+msgstr ""
+
msgid "Block noise reduction"
msgstr ""
msgid "Choose Tuner"
msgstr "Vælg Tuner"
+msgid "Choose a wireless network"
+msgstr ""
+
msgid "Choose backup files"
msgstr "Vælg backup filer"
msgid "Configuration Mode"
msgstr "Konfigurations Type"
+msgid "Configure interface"
+msgstr ""
+
+msgid "Configure nameservers"
+msgstr ""
+
+msgid "Configure your internal LAN"
+msgstr "Konfigurer dit interne LAN"
+
+msgid "Configure your network again"
+msgstr ""
+
+msgid "Configure your wireless LAN again"
+msgstr "Konfigurer dit trådløse LAN igen"
+
msgid "Configuring"
msgstr "Konfigurerer"
msgid "Connect"
msgstr "Forbind"
+msgid "Connect to a Wireless Network"
+msgstr ""
+
msgid "Connected to"
msgstr "Forbundet til"
msgid ""
"Crashlogs found!\n"
+"Send them to Dream Multimedia ?"
+msgstr ""
+"Der er fundet nedbrudslog!\n"
+"Vil du sende dem til Dream Multimedia ?"
+
+msgid ""
+"Crashlogs found!\n"
"Send them to Dream Multimedia?"
msgstr ""
msgid "DiSEqC repeats"
msgstr "DiSEqC gentagelser"
+msgid "DiSEqC-Tester settings"
+msgstr ""
+
msgid "Dialing:"
msgstr "Ringer op:"
msgid "Directory %s nonexistent."
msgstr "Mappen %s findes ikke."
+msgid "Directory browser"
+msgstr ""
+
msgid "Disable"
msgstr "Afbryd"
msgid "Enabled"
msgstr "Aktiveret"
+#, python-format
+msgid "Encrypted: %s"
+msgstr ""
+
msgid "Encryption"
msgstr "Kodning"
msgid "Encryption Type"
msgstr "Kodnings Type"
+msgid "Encryption:"
+msgstr ""
+
msgid "End time"
msgstr "Stop tid"
"\n"
"© 2006 - Stephan Reichholf"
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: Note that "Enter" in the two strings below should *not*
-#. be interpreted as "Give speed as input". The intended meaning is
-#. instead "Initial speed when starting winding", i.e. the speed at
-#. which "winding mode" is entered when first pressing "rewind" or
-#. "fast forward".
msgid "Enter Fast Forward at speed"
msgstr "Nuværende hastighed ved spoling"
msgid "Exit editor"
msgstr "Afslut editor"
+msgid "Exit network wizard"
+msgstr ""
+
msgid "Exit the cleanup wizard"
msgstr "Afslut oprydningsassistenten"
msgid "Hidden network SSID"
msgstr "Skjult netværks SSID"
+msgid "Hidden networkname"
+msgstr ""
+
msgid "Hierarchy Information"
msgstr "Hieraki information"
msgid "Integrated Wireless"
msgstr "Integreret trådløs"
+#, python-format
+msgid "Interface: %s"
+msgstr ""
+
msgid "Intermediate"
msgstr "Normal"
msgid "Limits on"
msgstr "Begrænsning til"
+msgid "Link Quality:"
+msgstr ""
+
msgid "Link:"
msgstr "Link:"
msgid "Margin before record (minutes)"
msgstr "Margin før optagelse (minutter)"
+#, python-format
+msgid "Max. Bitrate: %s"
+msgstr ""
+
msgid "Media player"
msgstr "Medie afspiller"
msgid "Network Setup"
msgstr "Netværks opsætning"
+msgid "Network Wizard"
+msgstr ""
+
msgid "Network scan"
msgstr "Netværks søgning"
msgid "No 50 Hz, sorry. :("
msgstr "Ingen 50 Hz, desværre. :("
+msgid "No Connection"
+msgstr ""
+
msgid "No HDD found or HDD not initialized!"
msgstr ""
"Ingen HDD fundet eller\n"
msgid "No free tuner!"
msgstr "Ingen fri tuner!"
+msgid "No networks found"
+msgstr ""
+
msgid ""
"No packages were upgraded yet. So you can check your network and try again."
msgstr ""
"Vil du gerne ændre PIN kode opsætning nu?\n"
"Siger du 'Nej' her vil opsætnings beskyttelsen ikke være tilsluttet!"
+msgid "No wireless networks found! Please refresh."
+msgstr ""
+
msgid ""
"No working local network adapter found.\n"
"Please verify that you have attached a network cable and your network is "
msgstr "Vælg venligst standard kanal lister som du ønsker at installere."
msgid ""
+"Please configure or verify your Nameservers by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
+"Please configure your internet connection by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+
+msgid ""
"Please disconnect all USB devices from your Dreambox and (re-)attach the "
"target USB stick (minimum size is 64 MB) now!"
msgstr ""
msgid "Please select the movie path..."
msgstr "Venligst vælg en film sti..."
+msgid ""
+"Please select the network interface that you want to use for your internet "
+"connection.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
+"Please select the wireless network that you want to connect to.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Please set up tuner B"
msgstr "Venligst indstil tuner B"
msgid "Please wait while we configure your network..."
msgstr "Vent venligst, mens vi opsætter dit netværk..."
+msgid "Please wait while we prepare your network interfaces..."
+msgstr ""
+
+msgid "Please wait while we test your network..."
+msgstr ""
+
msgid "Please wait while your network is restarting..."
msgstr "Vent venligst, mens dit netværk genstartes..."
msgid "Reenter new pin"
msgstr "Gentag ny kode"
+msgid "Refresh"
+msgstr ""
+
msgid "Refresh Rate"
msgstr "Opdateringsrate"
msgid "Removed successfully."
msgstr "Fjernelse gennemført."
-msgid "Removeing"
-msgstr ""
-
msgid "Removing"
msgstr "Sletter"
msgid "SNR:"
msgstr "SNR:"
+msgid "SSID:"
+msgstr ""
+
msgid "Sat"
msgstr "Lør"
msgid "Select image"
msgstr "Vælg image"
+msgid "Select interface"
+msgstr ""
+
msgid "Select package"
msgstr "Vælg pakke"
msgid "Select video mode"
msgstr "Vælg video type"
+msgid "Select wireless network"
+msgstr ""
+
msgid "Selected source image"
msgstr "Vælg kilde image"
msgid "Shutdown Dreambox after"
msgstr "Slukke Dreambox efter"
+msgid "Signal Strength:"
+msgstr ""
+
+msgid "Signal: "
+msgstr ""
+
msgid "Similar"
msgstr "Samme"
msgstr "Test-Beskedbox?"
msgid ""
+"Thank you for using the wizard.\n"
+"Please press OK to continue."
+msgstr ""
+
+msgid ""
"Thank you for using the wizard. Your box is now ready to use.\n"
"Please press OK to start using your Dreambox."
msgstr ""
msgid ""
"The wireless LAN plugin is not installed!\n"
+"Please install it and choose what you want to do next."
+msgstr ""
+
+msgid ""
+"The wireless LAN plugin is not installed!\n"
"Please install it."
msgstr ""
"Trådløs LAN plugin er ikke installeret!\n"
"Fortryd\n"
"Fjern"
-msgid "Unicable"
-msgstr "Unikabel"
-
msgid "Unicable LNB"
msgstr "Unikabel LNB"
msgid "Unmount failed"
msgstr "Unmount fejlede"
+msgid "Unsupported"
+msgstr ""
+
msgid "Update"
msgstr "Opdater"
msgid "Upgrade finished. Do you want to reboot your Dreambox?"
msgstr "Opgradering færdig. Vil du genstarte din DreamBox?"
-msgid "Upgradeing"
-msgstr ""
-
msgid "Upgrading"
msgstr "Opdaterer"
msgid "Use a gateway"
msgstr "Brug af Router"
-#. #-#-#-#-# enigma2.pot (PACKAGE VERSION) #-#-#-#-#
-#. TRANSLATORS: The effect of "Non-smooth winding" is that rather
-#. than using ordinary "continuous" or "smooth" winding, a fast
-#. sequence of stills is shown when winding at high speeds. This
-#. makes it much easier too follow when almost each frame comes from
-#. a new scene. The effect is achieved by repeating each shown frame
-#. a couple of times. The settings control both at which speed this
-#. winding mode sets in, and how many times each frame should be
-#. repeated. This was previously called "Discontinuous playback"
-#. which was incomprehensible. "Non-smooth winding" may be a better
-#. term, but note that there is nothing irregular about it. Synonyms
-#. better suited for translation to other languages may be "stepwise
-#. winding/playback", or "winding/playback using stills".
msgid "Use non-smooth winding at speeds above"
msgstr "Spoling/afspilning ved brug af stillbilleder"
msgid "Use this video enhancement settings?"
msgstr ""
+msgid "Use time of currently running service"
+msgstr ""
+
msgid "Use usals for this sat"
msgstr "Brug USALS til denne position"
msgid "Video mode selection."
msgstr "Video type vælger."
-msgid "VideoSetup"
-msgstr ""
-
msgid "Videoenhancement Setup"
msgstr ""
"cleaned up.\n"
"You can use this wizard to remove some extensions.\n"
msgstr ""
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+
+msgid ""
+"Welcome.\n"
+"\n"
+"If you want to connect your Dreambox to the Internet, this wizard will guide "
+"you through the basic network setup of your Dreambox.\n"
+"\n"
+"Press OK to start configuring your network"
+msgstr ""
msgid ""
"Welcome.\n"
msgid "Wireless"
msgstr "Trådløst"
+msgid "Wireless LAN"
+msgstr ""
+
msgid "Wireless Network"
msgstr "Trådløst netværk"
+msgid "Wireless Network State"
+msgstr ""
+
msgid "Write error while recording. Disk full?\n"
msgstr "Skrive fejl under optagelse. Disken fuld?\n"
"\n"
"Vil du opsætte pin kode nu?"
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+
msgid "Your Dreambox will restart after pressing OK on your remote control."
msgstr "Din Dreambox vil genstarte efter OK tryk på din fjernbetjening."
"Din frontprocessor skal opdateres.\n"
"Tryk OK for at starte opdateringen."
+msgid ""
+"Your internet connection is not working!\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Your name (optional):"
msgstr "Dit navn (valgfrit):"
"\n"
"Vil du deaktivere det andet netværks interface?"
+msgid ""
+"Your wireless LAN internet connection could not be started!\n"
+"Have you attached your USB WLAN Stick?\n"
+"\n"
+"Please choose what you want to do next."
+msgstr ""
+
msgid "Zap back to service before positioner setup?"
msgstr "Skift tilbage til kanal før motoropsætning?"
msgid "enigma2 and network"
msgstr "enigma2 og netværk"
+msgid "enter hidden network SSID"
+msgstr ""
+
msgid "equal to"
msgstr "svarende til"
msgid "hidden network"
msgstr "skjult netværk"
+msgid "hidden..."
+msgstr ""
+
msgid "hide extended description"
msgstr "Skjule udvidet beskrivelse"
msgid "toggle time, chapter, audio, subtitle info"
msgstr "skift mellem tid, kapitel, lyd, undertekst info"
+msgid "unavailable"
+msgstr ""
+
msgid "unconfirmed"
msgstr "ubekræftet"
#~ "\n"
#~ "Enigma2 vil genstarte efter gendannelse"
-#~ msgid ""
-#~ "\n"
-#~ "System will restart after the restore!"
-#~ msgstr ""
-#~ "\n"
-#~ "Systemet vil genstarte efter gendannelsen!"
-
#~ msgid "\"?"
#~ msgstr "\"?"
#~ msgid "Configuration for the CrashlogAutoSubmitter"
#~ msgstr "Opsætning for NedbrudsAutoUnderretning"
-#~ msgid "Configure your internal LAN"
-#~ msgstr "Konfigurer dit interne LAN"
-
#~ msgid "Configure your internal LAN again"
#~ msgstr "Konfigurer dit interne LAN igen"
#~ msgid "Configure your wireless LAN"
#~ msgstr "Konfigurer dit trådløse LAN"
-#~ msgid "Configure your wireless LAN again"
-#~ msgstr "Konfigurer dit trådløse LAN igen"
-
#~ msgid "Confirm"
#~ msgstr "Bekræft"
#~ msgid "CrashlogAutoSubmitConfiguration"
#~ msgstr "Opsætning af NedbrudslogAutoUnderretning"
-#~ msgid ""
-#~ "Crashlogs found!\n"
-#~ "Send them to Dream Multimedia ?"
-#~ msgstr ""
-#~ "Der er fundet nedbrudslog!\n"
-#~ "Vil du sende dem til Dream Multimedia ?"
-
#~ msgid "DVD ENTER key"
#~ msgstr "DVD ENTER tast"
#~ "Se venligst i manual.\n"
#~ "FEJL: "
+#~ msgid "Unicable"
+#~ msgstr "Unikabel"
+
#~ msgid "Upgrade"
#~ msgstr "Opgrader"
msgstr ""
"Project-Id-Version: tuxbox-enigma 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-12 12:40+0200\n"
+"POT-Creation-Date: 2009-11-05 18:09+0100\n"
"PO-Revision-Date: 2009-10-12 12:38+0100\n"
"Last-Translator: Stefan Pluecken <stefan.pluecken@multimedia-labs.de>\n"
"Language-Team: none\n"
msgid " updates available."
msgstr ""
+msgid " wireless networks found!"
+msgstr " Funk Netzwerke gefunden!"
+
msgid "#000000"
msgstr ""
msgid "1"
msgstr ""
+msgid "1 wireless network found!"
+msgstr "1 Funk Netzwerk gefunden!"
+
msgid "1.0"
msgstr "1.0"
msgid "About..."
msgstr "Über..."
+msgid "Accesspoint:"
+msgstr "Zugangspunkt:"
+
msgid "Action on long powerbutton press"
msgstr "Aktion beim langen Druck auf Power"
msgid "Behavior when a movie reaches the end"
msgstr "Verhalten beim Filmende"
+msgid "Bitrate:"
+msgstr ""
+
msgid "Block noise reduction"
msgstr ""
msgid "Choose Tuner"
msgstr "Tuner wählen"
+msgid "Choose a wireless network"
+msgstr "Wählen Sie ein Funk Netzwerk"
+
msgid "Choose backup files"
msgstr "Wählen Sie die zu sichernden Dateien"
msgstr "Aufräumen"
msgid "Cleanup Wizard"
-msgstr ""
+msgstr "Aufräumassistent"
msgid "Cleanup Wizard settings"
-msgstr ""
+msgstr "Aufräumassistent Einstellunge"
msgid "CleanupWizard"
-msgstr ""
+msgstr "Aufräumassistent"
msgid "Clear before scan"
msgstr "Vor der Suche löschen"
msgid "Configuration Mode"
msgstr "Konfiguration"
+msgid "Configure interface"
+msgstr "Netzwerkkarte konfigurieren"
+
+msgid "Configure nameservers"
+msgstr "DNS-Server konfigurieren"
+
+msgid "Configure your internal LAN"
+msgstr "Internes Netzwerk konfigurieren"
+
+msgid "Configure your network again"
+msgstr "Netzwerk erneut konfigurieren"
+
+msgid "Configure your wireless LAN again"
+msgstr "Funknetzwerk erneut konfigurieren"
+
msgid "Configuring"
msgstr "Konfiguriere"
msgstr "In Konflikt stehender Timer"
msgid "Connect"
-msgstr ""
+msgstr "Verbinden"
+
+msgid "Connect to a Wireless Network"
+msgstr "Mit Funknetzwerk verbinden"
msgid "Connected to"
msgstr "Verbunden mit"
msgstr "Mit Fritz!Box verbunden!"
msgid "Connected!"
-msgstr ""
+msgstr "Verbunden!"
msgid "Connecting to Fritz!Box..."
msgstr "Verbinde zur Fritz!Box..."
msgid "DiSEqC repeats"
msgstr "DiSEqC-Wiederholungen"
+msgid "DiSEqC-Tester settings"
+msgstr ""
+
msgid "Dialing:"
msgstr ""
msgid "Directory %s nonexistent."
msgstr "Verzeichnis %s existiert nicht."
+msgid "Directory browser"
+msgstr ""
+
msgid "Disable"
msgstr "Aus"
msgstr "5V für aktive Antenne"
msgid "Enable Cleanup Wizard?"
-msgstr ""
+msgstr "Aufräumassisten aktivieren?"
msgid "Enable multiple bouquets"
msgstr "Mehrere Bouquets erlauben"
msgid "Enabled"
msgstr "Eingeschaltet"
+#, python-format
+msgid "Encrypted: %s"
+msgstr "verschlüsselt: %s"
+
msgid "Encryption"
msgstr "Verschlüsselung"
msgid "Encryption Type"
msgstr "Verschlüssellungsart"
+msgid "Encryption:"
+msgstr "Verschlüsselung:"
+
msgid "End time"
msgstr "Endzeit"
msgid "Exit editor"
msgstr "Editor beenden"
+msgid "Exit network wizard"
+msgstr "Netzwerkassistent verlassen"
+
msgid "Exit the cleanup wizard"
msgstr ""
msgid "Hidden network SSID"
msgstr "Verstecke Netzwerk SSID"
+msgid "Hidden networkname"
+msgstr "versteckte SSID"
+
msgid "Hierarchy Information"
msgstr "Hierarchieinformationen"
msgid "Integrated Wireless"
msgstr "Integriertes WLAN"
+#, python-format
+msgid "Interface: %s"
+msgstr "Adapter: %s"
+
msgid "Intermediate"
msgstr "Fortgeschritten"
msgid "Limits on"
msgstr "Limits aktiviert"
+msgid "Link Quality:"
+msgstr "Qualität:"
+
msgid "Link:"
msgstr "Verbindung:"
msgid "Margin before record (minutes)"
msgstr "Vorlauf bei Aufnahme (in Minuten)"
+#, python-format
+msgid "Max. Bitrate: %s"
+msgstr ""
+
msgid "Media player"
msgstr "Media Player"
msgid "Network Setup"
msgstr "Netzwerkeinstellungen"
+msgid "Network Wizard"
+msgstr "Netzwerkassistent"
+
msgid "Network scan"
msgstr "Netzwerksuche"
msgid "No 50 Hz, sorry. :("
msgstr "50 Hz nicht möglich. :("
+msgid "No Connection"
+msgstr "Keine Verbindung"
+
msgid "No HDD found or HDD not initialized!"
msgstr ""
"Keine Festplatte gefunden oder\n"
msgid "No free tuner!"
msgstr "Kein freier Tuner"
+msgid "No networks found"
+msgstr ""
+
msgid ""
"No packages were upgraded yet. So you can check your network and try again."
msgstr ""
"Wollen Sie den Service-PIN jetzt ändern?\n"
"Wenn Sie 'NEIN' wählen, bleibt der Einstellungen-Schutz deaktiviert!"
+msgid "No wireless networks found! Please refresh."
+msgstr ""
+
msgid ""
"No working local network adapter found.\n"
"Please verify that you have attached a network cable and your network is "
"Bitte wählen Sie die Standard-Kanallisten, die Sie installieren wollen."
msgid ""
+"Please configure or verify your Nameservers by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+"Konfigurieren Sie Ihre DNS-Server durch Ausfüllen der entsprechenden Werte.\n"
+"Drücken Sie OK zum Fortfahren"
+
+msgid ""
+"Please configure your internet connection by filling out the required "
+"values.\n"
+"When you are ready press OK to continue."
+msgstr ""
+"Konfigurieren Sie Ihr Netzwerk durch Ausfüllen der entsprechenden Werte.\n"
+"Drücken Sie OK zum Fortfahren"
+
+msgid ""
"Please disconnect all USB devices from your Dreambox and (re-)attach the "
"target USB stick (minimum size is 64 MB) now!"
msgstr ""
msgid "Please select the movie path..."
msgstr "Bitte den Filmpfad angeben..."
+msgid ""
+"Please select the network interface that you want to use for your internet "
+"connection.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+"Bitte wählen Sie die Netzwerkschnittstelle welche Sie für Ihren "
+"Internetzugang nutzen möchten.\n"
+"\n"
+"Drücken Sie OK zum Fortfahren"
+
+msgid ""
+"Please select the wireless network that you want to connect to.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+"Bitte wählen Sie das Funknetzwerk zu welchem Sie sich verbinden möchten.\n"
+"\n"
+"Drücken Sie OK zum Fortfahren."
+
msgid "Please set up tuner B"
msgstr "Einstellungen für Tuner B."
msgid "Please wait while we configure your network..."
msgstr "Bitte warten während das Netzwerk konfiguriert wird..."
+msgid "Please wait while we prepare your network interfaces..."
+msgstr "Bitte warten während das Netzwerk konfiguriert wird..."
+
+msgid "Please wait while we test your network..."
+msgstr "Bitte warten während das Netzwerk überprüft wird..."
+
msgid "Please wait while your network is restarting..."
msgstr "Bitte warten während das Netzwerk neu startet..."
msgid "Reenter new pin"
msgstr "Nochmals den Pincode eingeben"
+msgid "Refresh"
+msgstr "Aktualisieren"
+
msgid "Refresh Rate"
msgstr "Bildwiederholrate"
msgstr "aktualisieren"
msgid "Remove"
-msgstr ""
+msgstr "Entfernen"
msgid "Remove Bookmark"
msgstr "Bookmark entfernen"
msgid "Removed successfully."
msgstr ""
-msgid "Removeing"
-msgstr ""
-
msgid "Removing"
msgstr "Entfernen"
msgid "SNR:"
msgstr ""
+msgid "SSID:"
+msgstr ""
+
msgid "Sat"
msgstr "Sa"
msgid "Select image"
msgstr "Wählen Sie ein Image"
+msgid "Select interface"
+msgstr "Netzwerkkarte auswählen"
+
msgid "Select package"
msgstr ""
msgid "Select video mode"
msgstr "Wählen Sie den Video-Modus"
+msgid "Select wireless network"
+msgstr "Funknetzwerk auswählen"
+
msgid "Selected source image"
msgstr "Wählen Sie ein Quell-Image"
msgid "Shutdown Dreambox after"
msgstr "Dreambox ausschalten nach"
+msgid "Signal Strength:"
+msgstr "Signal Stärke:"
+
+msgid "Signal: "
+msgstr "Signal: "
+
msgid "Similar"
msgstr "Ähnlich"
msgstr ""
msgid ""
+"Thank you for using the wizard.\n"
+"Please press OK to continue."
+msgstr ""
+"Vielen Dank, dass Sie den Assisten benutzt haben.\n"
+"Drücken Sie OK zum Fortfahren."
+
+msgid ""
"Thank you for using the wizard. Your box is now ready to use.\n"
"Please press OK to start using your Dreambox."
msgstr ""
msgid ""
"The wireless LAN plugin is not installed!\n"
+"Please install it and choose what you want to do next."
+msgstr ""
+"Das WirelessLan Plugin ist nicht instaliert!\n"
+"Bitte installieren Sie es und wählen Sie dann eine Option zum Fortfahren."
+
+msgid ""
+"The wireless LAN plugin is not installed!\n"
"Please install it."
msgstr ""
"das Wireless LAN plugin ist nicht installiert!\n"
"Remove"
msgstr ""
-msgid "Unicable"
-msgstr ""
-
msgid "Unicable LNB"
msgstr ""
msgid "Unmount failed"
msgstr "Unmounten fehlgeschlagen"
+msgid "Unsupported"
+msgstr "Nicht unterstützt"
+
msgid "Update"
-msgstr ""
+msgstr "Aktualisieren"
msgid "Updates your receiver's software"
msgstr "Aktualisiert die Software Ihres Receivers"
msgid "Upgrade finished. Do you want to reboot your Dreambox?"
msgstr "Aktualisierung beendet. Möchten Sie Ihre Dreambox nun neu starten?"
-msgid "Upgradeing"
-msgstr ""
-
msgid "Upgrading"
msgstr "Upgrade"
msgid "Video mode selection."
msgstr "Auswahl des Videomodus."
-msgid "VideoSetup"
-msgstr ""
-
msgid "Videoenhancement Setup"
msgstr ""
"cleaned up.\n"
"You can use this wizard to remove some extensions.\n"
msgstr ""
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
+
+msgid ""
+"Welcome.\n"
+"\n"
+"If you want to connect your Dreambox to the Internet, this wizard will guide "
+"you through the basic network setup of your Dreambox.\n"
+"\n"
+"Press OK to start configuring your network"
+msgstr ""
+"Willkommen.\n"
+"\n"
+"Wenn Sie Ihre Dreambox mit dem Internet verbinden möchten, wird Sie dieser "
+"Assistent durch die grundlegenden Netzwerkeinstellungen führen.\n"
+"\n"
+"Drücken Sie OK um Ihr Netzwerk zu konfigurieren"
msgid ""
"Welcome.\n"
msgid "Wireless"
msgstr "Funk"
+msgid "Wireless LAN"
+msgstr ""
+
msgid "Wireless Network"
msgstr "Funk Netzwerk"
+msgid "Wireless Network State"
+msgstr ""
+
msgid "Write error while recording. Disk full?\n"
msgstr "Schreibfehler bei der Aufnahme. Festplatte voll?\n"
"\n"
"Möchten Sie den Pincode nun setzen?"
+msgid ""
+"Your Dreambox is now ready to use.\n"
+"\n"
+"Your internet connection is working now.\n"
+"\n"
+"Please press OK to continue."
+msgstr ""
+"Ihre Dreambox ist nun konfiguriert.\n"
+"\n"
+"Ihre Internetverbindung funktioniert nun.\n"
+"\n"
+"Drücken Sie OK zum Fortfahren."
+
msgid "Your Dreambox will restart after pressing OK on your remote control."
msgstr ""
"Ihre Dreambox wird neu starten nachdem Sie OK auf Ihrer Fernbedienung "
"Ihre Frontprozessor-Firmware muss aktualisiert werden.\n"
"Drücken Sie OK, um das Upgrade zu starten."
+msgid ""
+"Your internet connection is not working!\n"
+"Please choose what you want to do next."
+msgstr ""
+"Ihre Internetverbindung funktioniert nicht!\n"
+"Bitte wählen Sie eine Option zum Fortfahren."
+
msgid "Your name (optional):"
msgstr ""
"\n"
"Wollen Sie den zweiten Netzwerkadapter deaktivieren?"
+msgid ""
+"Your wireless LAN internet connection could not be started!\n"
+"Have you attached your USB WLAN Stick?\n"
+"\n"
+"Please choose what you want to do next."
+msgstr ""
+"Ihre Funk-Internetverbindung konnte nicht gestartet werden!\n"
+"Ist Ihr USB WLAN Stick korrekt angeschlossen?\n"
+"\n"
+"Bitte wählen Sie eine Option zum Fortfahren."
+
msgid "Zap back to service before positioner setup?"
msgstr ""
"Zurückschalten zum Sender der vor dem\n"
msgid "enigma2 and network"
msgstr "Enigma2 und Netzwerk"
+msgid "enter hidden network SSID"
+msgstr "Verstecke Netzwerk SSID eingeben"
+
msgid "equal to"
msgstr "Gleich wie"
msgid "hidden network"
msgstr "verstecktes Netzwerk"
+msgid "hidden..."
+msgstr "hidden..."
+
msgid "hide extended description"
msgstr "erweiterte Beschreibung ausblenden"
msgid "toggle time, chapter, audio, subtitle info"
msgstr "Schalte zwischen Zeit-, Kapitel-, Audio- und Untertitel-Info um"
+msgid "unavailable"
+msgstr "nicht verfügbar"
+
msgid "unconfirmed"
msgstr "Nicht bestätigt"
msgid "unknown"
-msgstr ""
+msgstr "unbekannt"
msgid "unknown service"
msgstr "unbekannter Kanal"
msgstr "wartend"
msgid "was removed successfully"
-msgstr ""
+msgstr "wurde erfolgreich entfernt"
msgid "weekly"
msgstr "wöchentlich"
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-09 13:06+0200\n"
+"POT-Creation-Date: 2009-11-05 18:09+0100\n"
"PO-Revision-Date: 2008-07-17 12:13+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
msgid ""
"\n"
+"System will restart after the restore!"
+msgstr ""
+
+msgid ""
+"\n"
"View, install and remove available or installed packages."
msgstr ""
msgid " updates available."
msgstr ""
+msgid " wireless ne