VDR Plugin 'sc' Revision History
--------------------------------
+02.09.2007: Version 0.8.2
+- Reworked Nagra2 EMM nano handling, key updates and map core (the latter is
+ partly based on Emunation 2.0.0 code).
+- Added Nagra2 0101 register 0x05,0x16 fix (not well tested).
+- Added Nagra2 0511,1101 MECM (same as 0501).
+- Added compatibility option for sasc-ng.
+- Added commandline option -c to select a config subdirectory.
+- Fixed FFdecsa to prevent CW change while key in use. Based on racepatch from
+ DVBN.
+- Fixed cardclient camd35 packet ID compare (short vs. int).
+- Fixed Nagra2 skipping expiry date in ECM.
+- Added support for VDR 1.5.7+ gettext sheme (most po-files need to be revised
+ by translators).
+
06.07.2007: Version 0.8.1
- Added Nagra2 7101 3DES support.
-- Added a setup option to force tranfermode with digital audio. Another common
+- Added a setup option to force transfermode with digital audio. Another common
used patched for the vdr-core is made unnecessary by this option.
- Fixed camd33 EMM packet processing.
- Fixed recording device allocation (1.4.x). You have to update the VDR core
### Allow user defined options to overwrite defaults:
-include $(VDRDIR)/Make.config
+-include Make.config
### The version number of VDR (taken from VDR's "config.h"):
OBJS = $(PLUGIN).o data.o filter.o system.o i18n.o misc.o cam.o \
smartcard.o network.o crypto.o system-common.o parse.o log.o
+### Internationalization (I18N):
+
+PODIR = po
+I18Npot = $(PODIR)/$(PLUGIN).pot
+I18Nmsgs = $(addprefix $(LOCALEDIR)/,$(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo,$(notdir $(foreach file, $(wildcard $(PODIR)/*.po), $(basename $(file))))))
+LOCALEDIR = $(VDRDIR)/locale
+
#
# generic stuff
#
FFDECSADIR = FFdecsa
FFDECSA = $(FFDECSADIR)/FFdecsa.o
+# SASC
+ifdef SASC
+DEFINES += -DSASC
+FFDECSA =
+endif
+
# export for system makefiles
export SCAPIVERS
export APIVERSION
export CXX
export CXXFLAGS
-### Implicit rules:
-
-%.o: %.c
- $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(INCLUDES) $<
-
# Dependencies:
MAKEDEP = g++ -MM -MG
BUILDTARGETS = $(LIBDIR)/libvdr-$(PLUGIN).so.$(APIVERSION) systems systems-pre
endif
+ifneq ($(shell grep -l 'Phrases' $(VDRDIR)/i18n.c),$(VDRDIR)/i18n.c)
+BUILDTARGETS += i18n
+endif
+
+default-target: all
all: $(BUILDTARGETS)
-.PHONY: systems systems-pre clean clean-core clean-systems clean-pre dist srcdist
+.PHONY: i18n systems systems-pre clean clean-core clean-systems clean-pre dist srcdist
+
+%.o: %.c
+ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(INCLUDES) $<
libvdr-$(PLUGIN).so: $(OBJS) $(FFDECSA)
$(CXX) $(CXXFLAGS) -shared $(OBJS) $(FFDECSA) $(LIBS) $(SHAREDLIBS) -o $@
$(FFDECSA): $(FFDECSADIR)/*.c $(FFDECSADIR)/*.h
@$(MAKE) COMPILER="$(CXX)" FLAGS="$(CSAFLAGS) -march=$(CPUOPT) -DPARALLEL_MODE=$(PARALLEL)" -C $(FFDECSADIR) all
+$(I18Npot): $(shell grep -rl '\(tr\|trNOOP\)(\".*\")' *.c $(SYSDIR))
+ xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<noone@nowhere.org>' -o $@ $^
+
+%.po: $(I18Npot)
+ msgmerge -U --no-wrap -F --backup=none -q $@ $<
+ @touch $@
+
+%.mo: %.po
+ msgfmt -c -o $@ $<
+
+$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
+ @mkdir -p $(dir $@)
+ cp $< $@
+
+i18n: $(I18Nmsgs)
+
systems:
@for i in `ls -A -I ".*" $(SYSDIR)`; do $(MAKE) -f ../../Makefile.system -C "$(SYSDIR)/$$i" all || exit 1; done
@-rm -f $(LIBDIR)/libsc-*-$(SCAPIVERS).so.$(APIVERSION)
@-rm -f $(LIBDIR)/libvdr-$(PLUGIN).a $(LIBDIR)/libsc-*.a
@-rm -f $(OBJS) $(DEPFILE) *.so *.tar.gz core* *~
+ @-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
clean-pre:
@-find "$(PREDIR)" -type f -not -iname "*-$(SCAPIVERS).so.*" | xargs rm -f
-include *.mk
-### Implicit rules:
-
-%.o: %.c
- $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(SINCLUDES) $<
-
# Dependencies:
MAKEDEP = g++ -MM -MG
all: $(BUILDTARGETS)
.PHONY: clean dist
+%.o: %.c
+ $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(SINCLUDES) $<
+
$(LIBSC): $(OBJS)
$(CXX) $(CXXFLAGS) -shared $(OBJS) $(LIBS) $(SHAREDLIBS) -o $@
$(clean-pre)
Note that some budget card drivers provide a CA device too. This might make VDR
and the plugin detect the card as a full-featured card, thus disabling FFdecsa.
You should use commandline option -B to force detection as a budget card in such
-a case.
+a case. This commandline option takes a device number as argument and may appear
+multiple times (compare VDR commandline option -D).
For testing purpose you should start VDR in foreground always. The plugin gives
a lot of additional information to the console. This may be helpful in case it
Additional files
----------------
-All config files must be located in a subdirectory (of your VDR config
-directory) called "plugins". The private plugin cache file is saved to this
-directory too. The keyfile must be named "SoftCam.Key".
+All config files must be located in the VDR plugin config directory. If you want
+to use a dedicated subdirectory for this plugin, you can use commandline option
+-c to name the subdirectory (e.g. -c sc). The private plugin cache file is saved
+to this directory too. The keyfile must be named "SoftCam.Key".
For Seca2 support you need binary files which contain the hash & mask tables.
The file format is the same as for Yankse. The files must be located in the
-"plugins/seca" subdirectory. The name sheme is s2_TTTT_XXXX.bin where TTTT is
+"seca" subdirectory. The name sheme is s2_TTTT_XXXX.bin where TTTT is
one of "hash","mt" and XXXX is the provider ID (e.g. s2_hash_0064.bin,
s2_mt_0070.bin). The hash file must be 1536 bytes long. The mt file is normaly
16384 bytes long, but this may differ for your provider. For advanced Seca2
providers you may need additional table files. At the moment these are
s2_sse.bin, s2_sse_XXXX.bin and s2_cw_XXXX.bin.
-Although there is support for Viaccess TPS AU, you still can provide a "tps.bin"
-file in the "plugins/viaccess" subdirectory in case AU doesn't work for your
-provider. Be aware that in most cases this file has to be updated on a daily
-basis.
-
Note, that for this @SHL implementation the key must be in Z 00 00 <key> format
(the V 000000 00 <key> format doesn't work).
to be named "ROMX.bin", "ROMXext.bin" or "eepX_Z.bin", where X is the ROM number
(decimal) and Z is the upper part of the provider ID (hexadecimal). The Eeprom
files may be updated from the EMM data, take care that the permissions are set
-right. The plugin searches for these files in the "plugins/nagra" subdirectory.
+right. The plugin searches for these files in the "nagra" subdirectory.
For Nagra2 AU some providers need binary Rom and Eeprom files. The files have to
be named "ROMxxx.bin" and "EEPyy_xxx.bin", where xxx is the ROM version (e.g.
102) and yy is the upper part of the provider ID (e.g. 08 for BEV). The files
must contain the joined contents of all Rom/Eeprom pages. The plugin searches
-for these files in the "plugins/nagra" subdirectory.
+for these files in the "nagra" subdirectory.
+Summary of commandline options
+------------------------------
+
+-c DIR --config=DIR search config files in subdir DIR
+ (default: none)
+-B N --budget=N forces DVB device N to budget mode (using FFdecsa)
+-I --inverse-cd use inverse CD detection for the next serial device
+-R --inverse-rst use inverse RESET for the next serial device
+-C FREQ --clock=FREQ use FREQ as clock for the card reader on the next
+ serial device (rather than 3.5712 MHz
+-s DEV --serial=DEV activate Phoenix ISO interface on serial device DEV
+ (default: none)
+-d CMD --dialup=CMD call CMD to start/stop dialup-network
+ (default: none)
+-t SECS --timeout=SECS shutdown timeout for dialup-network
+ (default: 60 secs)
+
+
+
SVDR interface
--------------
#include <dlfcn.h>
#include <linux/dvb/ca.h>
+#include <vdr/channels.h>
#include <vdr/ci.h>
#include <vdr/dvbdevice.h>
+#ifndef SASC
#if APIVERSNUM >= 10500
#include <vdr/dvbci.h>
#endif
-#include <vdr/channels.h>
#include <vdr/thread.h>
#include "FFdecsa/FFdecsa.h"
+#endif //SASC
#include "cam.h"
#include "scsetup.h"
return res;
}
-// -- cPrgPid ---------------------------------------------------------------------
-
-class cPrgPid : public cSimpleItem {
-private:
- int type;
- int pid;
- bool proc;
-public:
- cPrgPid(int Type, int Pid);
- int Pid(void) { return pid; }
- int Type(void) { return type; }
- bool Proc(void) { return proc; }
- void Proc(bool is) { proc=is; };
- };
-
-cPrgPid::cPrgPid(int Type, int Pid)
-{
- type=Type; pid=Pid;
- proc=false;
-}
-
-// -- cPrg ---------------------------------------------------------------------
-
-class cPrg : public cSimpleItem {
-private:
- int prg;
- bool isUpdate;
-public:
- cSimpleList<cPrgPid> pids;
- //
- cPrg(int Prg, bool IsUpdate);
- int Prg(void) { return prg; }
- bool IsUpdate(void) { return isUpdate; }
- };
-
-cPrg::cPrg(int Prg, bool IsUpdate)
-{
- prg=Prg; isUpdate=IsUpdate;
-}
-
// -- cEcmSys ------------------------------------------------------------------
class cEcmPri : public cSimpleItem {
memcpy(&last[0],&cw[0],8);
ca_descr.parity=0;
memcpy(ca_descr.cw,&cw[0],8);
- if(!device->SetCaDescr(&ca_descr))
+ if(!device->SetCaDescr(&ca_descr,force))
PRINTF(L_GEN_ERROR,"CA_SET_DESCR failed (%s). Expect a black screen.",strerror(errno));
}
memcpy(&last[8],&cw[8],8);
ca_descr.parity=1;
memcpy(ca_descr.cw,&cw[8],8);
- if(!device->SetCaDescr(&ca_descr))
+ if(!device->SetCaDescr(&ca_descr,force))
PRINTF(L_GEN_ERROR,"CA_SET_DESCR failed (%s). Expect a black screen.",strerror(errno));
}
}
indexMap[idx]=0;
}
+#ifndef SASC
+
// --- cChannelCaids -----------------------------------------------------------
#if APIVERSNUM >= 10500
#define MAX_CSA_PIDS 8192
#define MAX_CSA_IDX 16
-class cDeCSA : public cMutex {
+//#define DEBUG_CSA
+
+class cDeCSA {
private:
int cs;
unsigned char **range;
unsigned char pidmap[MAX_CSA_PIDS];
void *keys[MAX_CSA_IDX];
+ unsigned int even_odd[MAX_CSA_IDX];
+ cMutex mutex;
+ cCondVar wait;
+ bool active;
+ int cardindex;
//
bool GetKeyStruct(int idx);
public:
- cDeCSA(void);
+ cDeCSA(int CardIndex);
~cDeCSA();
bool Decrypt(unsigned char *data, int len, bool force);
- bool SetDescr(ca_descr_t *ca_descr);
+ bool SetDescr(ca_descr_t *ca_descr, bool initial);
bool SetCaPid(ca_pid_t *ca_pid);
+ void SetActive(bool on);
};
-cDeCSA::cDeCSA(void)
+cDeCSA::cDeCSA(int CardIndex)
{
+ cardindex=CardIndex;
cs=get_suggested_cluster_size();
- PRINTF(L_CORE_CSA,"clustersize=%d rangesize=%d",cs,cs*2+5);
+ PRINTF(L_CORE_CSA,"%d: clustersize=%d rangesize=%d",cardindex,cs,cs*2+5);
range=MALLOC(unsigned char *,(cs*2+5));
memset(keys,0,sizeof(keys));
+ memset(even_odd,0,sizeof(even_odd));
memset(pidmap,0,sizeof(pidmap));
}
free(range);
}
+void cDeCSA::SetActive(bool on)
+{
+ active=on;
+ PRINTF(L_CORE_CSA,"%d: set active %s",cardindex,active?"on":"off");
+}
+
bool cDeCSA::GetKeyStruct(int idx)
{
if(!keys[idx]) keys[idx]=get_key_struct();
return keys[idx]!=0;
}
-bool cDeCSA::SetDescr(ca_descr_t *ca_descr)
+bool cDeCSA::SetDescr(ca_descr_t *ca_descr, bool initial)
{
- cMutexLock lock(this);
+ cMutexLock lock(&mutex);
int idx=ca_descr->index;
if(idx<MAX_CSA_IDX && GetKeyStruct(idx)) {
- if(ca_descr->parity==0) { // even key
- set_even_control_word(keys[idx],ca_descr->cw);
- PRINTF(L_CORE_CSA,"even key set");
- }
- else { // odd key
- set_odd_control_word(keys[idx],ca_descr->cw);
- PRINTF(L_CORE_CSA,"odd key set");
+ if(!initial && active && ca_descr->parity==(even_odd[idx]&0x40)>>6) {
+ PRINTF(L_CORE_CSA,"%d.%d: %s key in use",cardindex,idx,ca_descr->parity?"odd":"even");
+ if(wait.TimedWait(mutex,100)) PRINTF(L_CORE_CSA,"%d.%d: successfully waited for release",cardindex,idx);
+ else PRINTF(L_CORE_CSA,"%d.%d: timed out. setting anyways",cardindex,idx);
}
+ PRINTF(L_CORE_CSA,"%d.%d: %s key set",cardindex,idx,ca_descr->parity?"odd":"even");
+ if(ca_descr->parity==0) set_even_control_word(keys[idx],ca_descr->cw);
+ else set_odd_control_word(keys[idx],ca_descr->cw);
}
return true;
}
bool cDeCSA::SetCaPid(ca_pid_t *ca_pid)
{
- cMutexLock lock(this);
+ cMutexLock lock(&mutex);
if(ca_pid->index<MAX_CSA_IDX && ca_pid->pid<MAX_CSA_PIDS) {
pidmap[ca_pid->pid]=ca_pid->index;
- PRINTF(L_CORE_CSA,"set pid %04x to index %d",ca_pid->pid,ca_pid->index);
+ PRINTF(L_CORE_CSA,"%d.%d: set pid %04x",cardindex,ca_pid->index,ca_pid->pid);
}
return true;
}
bool cDeCSA::Decrypt(unsigned char *data, int len, bool force)
{
- cMutexLock lock(this);
+ cMutexLock lock(&mutex);
int r=-2, ccs=0, currIdx=-1;
bool newRange=true;
range[0]=0;
len-=(TS_SIZE-1);
for(int l=0; l<len; l+=TS_SIZE) {
if(data[l]!=TS_SYNC_BYTE) { // let higher level cope with that
- PRINTF(L_CORE_CSA,"garbage in TS buffer");
+ PRINTF(L_CORE_CSA,"%d: garbage in TS buffer",cardindex);
break;
}
- if(data[l+3]&0xC0) { // encrypted
+ unsigned int ev_od=data[l+3]&0xC0;
+ if(ev_od==0x80 || ev_od==0xC0) { // encrypted
int idx=pidmap[((data[l+1]<<8)+data[l+2])&(MAX_CSA_PIDS-1)];
if(currIdx<0 || idx==currIdx) { // same or no index
currIdx=idx;
+ if(ccs==0 && ev_od!=even_odd[idx]) {
+ even_odd[idx]=ev_od;
+ wait.Broadcast();
+ PRINTF(L_CORE_CSA,"%d.%d: change to %s key",cardindex,idx,(ev_od&0x40)?"odd":"even");
+ }
if(newRange) {
r+=2; newRange=false;
range[r]=&data[l];
range[r+1]=&data[l+TS_SIZE];
if(++ccs>=cs) break;
}
- else { // other index, create hole
- PRINTF(L_CORE_CSA,"other index. current=%d idx=%d",currIdx,idx);
- newRange=true;
- }
+ else newRange=true; // other index, create hole
}
else { // unencrypted
// nothing, we don't create holes for unencrypted packets
}
}
- if(force) PRINTF(L_CORE_CSA,"forced");
- if(r>cs*2) PRINTF(L_CORE_CSA,"range overflow");
- if(r<0) PRINTF(L_CORE_CSA,"nothing to decrypt");
- if(r>=0 && (ccs>=cs || force) && GetKeyStruct(currIdx)) { // we have some range
- LBSTARTF(L_CORE_CSA);
- LBPUT("decrypting %3d packets (ccs=%3d cs=%3d %s)",ccs,ccs,cs,ccs>=cs?"OK ":"INC");
- int n=decrypt_packets(keys[currIdx],range);
- LBPUT(" -> %3d packets decrypted",n);
- if(n>0) return true;
- LBEND();
- }
- else {
- if(ccs<cs && !force)
- PRINTF(L_CORE_CSA,"incomplete cluster ccs=%3d cs=%3d",ccs,cs);
+ if(r>=0) { // we have some range
+ if(ccs>=cs || force) {
+ if(GetKeyStruct(currIdx)) {
+ int n=decrypt_packets(keys[currIdx],range);
+#ifdef DEBUG_CSA
+ PRINTF(L_CORE_CSA,"%d.%d: decrypting ccs=%3d cs=%3d %s -> %3d decrypted",cardindex,currIdx,ccs,cs,ccs>=cs?"OK ":"INC",n);
+#endif
+ if(n>0) return true;
+ }
+ }
+#ifdef DEBUG_CSA
+ else PRINTF(L_CORE_CSA,"%d.%d: incomplete cluster ccs=%3d cs=%3d",cardindex,currIdx,ccs,cs);
+#endif
}
return false;
}
lastP=0; lastCount=0;
ringBuffer=new cRingBufferLinear(Size,TS_SIZE,true,"FFdecsa-TS");
ringBuffer->SetTimeouts(100,100);
+ if(decsa) decsa->SetActive(true);
Start();
}
cDeCsaTSBuffer::~cDeCsaTSBuffer()
{
Cancel(3);
+ if(decsa) decsa->SetActive(false);
delete ringBuffer;
}
return NULL;
}
+#endif //SASC
+
// -- cScDvbDevice -------------------------------------------------------------
int cScDvbDevice::budget=0;
+#ifndef SASC
+
cScDvbDevice::cScDvbDevice(int n, int cafd)
:cDvbDevice(n)
{
#endif
if(softcsa) {
PRINTF(L_GEN_INFO,"Using software decryption on card %d",n);
- decsa=new cDeCSA;
+ decsa=new cDeCSA(n);
}
}
return false;
}
-bool cScDvbDevice::SetCaDescr(ca_descr_t *ca_descr)
+bool cScDvbDevice::SetCaDescr(ca_descr_t *ca_descr, bool initial)
{
if(!softcsa) {
cMutexLock lock(&cafdMutex);
return ioctl(fd_ca,CA_SET_DESCR,ca_descr)>=0;
}
- else if(decsa) return decsa->SetDescr(ca_descr);
+ else if(decsa) return decsa->SetDescr(ca_descr,initial);
return false;
}
}
}
}
+
+#else //SASC
+
+cScDvbDevice::cScDvbDevice(int n, int cafd)
+:cDvbDevice(n)
+{}
+
+cScDvbDevice::~cScDvbDevice()
+{}
+
+void cScDvbDevice::Shutdown(void)
+{}
+
+void cScDvbDevice::Startup(void)
+{}
+
+void cScDvbDevice::SetForceBudget(int n)
+{}
+
+bool cScDvbDevice::ForceBudget(int n)
+{
+ return true;
+}
+
+void cScDvbDevice::Capture(void)
+{}
+
+bool cScDvbDevice::Initialize(void)
+{
+ return true;
+}
+
+bool cScDvbDevice::GetPrgCaids(int source, int transponder, int prg, caid_t *c)
+{
+ return false;
+}
+
+bool cScDvbDevice::SetCaDescr(ca_descr_t *ca_descr, bool initial)
+{
+ return false;
+}
+
+bool cScDvbDevice::SetCaPid(ca_pid_t *ca_pid)
+{
+ return false;
+}
+
+void cScDvbDevice::DumpAV7110(void)
+{}
+
+#endif //SASC
// ----------------------------------------------------------------
+class cPrgPid : public cSimpleItem {
+private:
+ int type, pid;
+ bool proc;
+public:
+ cPrgPid(int Type, int Pid) { type=Type; pid=Pid; proc=false; }
+ int Pid(void) { return pid; }
+ int Type(void) { return type; }
+ bool Proc(void) { return proc; }
+ void Proc(bool is) { proc=is; };
+ };
+
+// ----------------------------------------------------------------
+
+class cPrg : public cSimpleItem {
+private:
+ int prg;
+ bool isUpdate;
+public:
+ cSimpleList<cPrgPid> pids;
+ //
+ cPrg(int Prg, bool IsUpdate) { prg=Prg; isUpdate=IsUpdate; }
+ int Prg(void) { return prg; }
+ bool IsUpdate(void) { return isUpdate; }
+ };
+
+// ----------------------------------------------------------------
+
#if APIVERSNUM >= 10500
typedef int caid_t;
#else
cMutex lruMutex;
static int budget;
//
+#ifndef SASC
void LateInit(void);
void EarlyShutdown(void);
int FindLRUPrg(int source, int transponder, int prg);
+#endif //SASC
protected:
+#ifndef SASC
#if APIVERSNUM >= 10500
virtual bool Ready(void);
#else
virtual bool OpenDvr(void);
virtual void CloseDvr(void);
virtual bool GetTSPacket(uchar *&Data);
+#endif //SASC
public:
cScDvbDevice(int n, int cafd);
~cScDvbDevice();
+#ifndef SASC
#if APIVERSNUM >= 10501
virtual bool HasCi(void);
#endif
#if APIVERSNUM < 10500
virtual int ProvidesCa(const cChannel *Channel) const;
#endif
+#endif //SASC
static void Capture(void);
static bool Initialize(void);
static void Startup(void);
static void Shutdown(void);
static void SetForceBudget(int n);
static bool ForceBudget(int n);
- bool SetCaDescr(ca_descr_t *ca_descr);
+ bool SetCaDescr(ca_descr_t *ca_descr, bool initial);
bool SetCaPid(ca_pid_t *ca_pid);
void DumpAV7110(void);
cCam *Cam(void) { return cam; }
#include "i18n.h"
+#if APIVERSNUM < 10507
+
const tI18nPhrase ScPhrases[] = {
{ "Update keys (AU)",
"Keys updaten (AU)",
"",
"¾ÑÝÞÒÛïâì ÚÛîçØ (AU)",
},
+ { "off",
+ "aus",
+ "",
+ "",
+ "uit",
+ "",
+ "off",
+ ""
+ "pois",
+ "wy³±cz",
+ "",
+ "",
+ "av",
+ "",
+ "",
+ "",
+ "ÒëÚÛ",
+ },
{ "active CAIDs",
"aktive CAIDs",
"",
"",
"¿ÐàÐÛÛÕÛìÝëÕ ßÞâÞÚØ FF",
},
+ { "Force TransferMode",
+ "Transfermodus erzwingen",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ },
{ "Prefer local systems",
"Lokale Systeme bevorzugen",
"",
"",
"´ÕÙáâÒØâÕÛìÝÞ áÑàÞáØâì ÜÞÔãÛì ßÞ ãÜÞÛçÐÝØî?",
},
+ { "Cardclient: connect immediately",
+ "Cardclient: sofort verbinden",
+ "",
+ "",
+ "Cardclient: direct contact maken",
+ "",
+ "Cardclient: connecter immediatement",
+ "",
+ "Korttiasiakas: yhdistä välittömästi",
+ "Klient karty: pod³±cz natychmiast",
+ "",
+ "",
+ "",
+ },
+ { "Nagra: min. ECM processing time",
+ "Nagra: min. ECM Bearbeitungszeit",
+ "",
+ "",
+ "Nagra: min. ECM bewerkingstijd",
+ "",
+ "Nagra: min. durée du processus ECM",
+ "",
+ "Nagra: Min. ECM-prosessointiaika",
+ "Nagra: min. czas przetwarzania ECM",
+ "",
+ "",
+ "",
+ },
+ { "SC-Cryptoworks: Parental rating",
+ "SC-Cryptoworks: Altersbeschränkung",
+ "",
+ "",
+ "SC-Cryptoworks: Leeftijdsadvies",
+ "",
+ "SC-Cryptoworks: Autorisation parentale",
+ "",
+ "SC-Cryptoworks: Ikäraja",
+ "SC-Cryptoworks: wska¼nik rodzica",
+ "",
+ "",
+ "",
+ },
+ { "don't touch",
+ "nicht ändern",
+ "",
+ "",
+ "niet wijzigen",
+ "",
+ "Ne pas modifier",
+ "",
+ "älä koske",
+ "nie dotykaj",
+ "",
+ "",
+ "",
+ },
+ { "disable",
+ "ausschalten",
+ "",
+ "",
+ "uitschakelen",
+ "",
+ "Désactiver",
+ "",
+ "poista",
+ "wy³±cz",
+ "",
+ "",
+ "",
+ },
+ { "SC-Seca: EMM updates",
+ "SC-Seca: EMM updates",
+ "",
+ "",
+ "SC-Seca: EMM updates",
+ "",
+ "SC-Seca: Mise à jour EMM",
+ "",
+ "SC-Seca: EMM-päivitykset",
+ "SC-Seca: aktualizacje EMM",
+ "",
+ "",
+ "",
+ },
+ { "allow ALL",
+ "alle erlauben",
+ "",
+ "",
+ "ALLES toestaan",
+ "",
+ "Permettre tous",
+ "",
+ "salli kaikki",
+ "dopu¶æ wszystkie",
+ "",
+ "",
+ "",
+ },
+ { "block UNIQUE",
+ "UNIQUE blocken",
+ "",
+ "",
+ "UNIEKE blokkeren",
+ "",
+ "Bloquer UNIQUE",
+ "",
+ "estä uniikit",
+ "blokuj unikaty",
+ "",
+ "",
+ "",
+ },
+ { "block SHARED",
+ "SHARED blocken",
+ "",
+ "",
+ "GEDEELDE blokkeren",
+ "",
+ "Bloquer PARTAGE",
+ "",
+ "estä jaetut",
+ "blokuj dzielone",
+ "",
+ "",
+ "",
+ },
+ { "block ALL",
+ "alle blocken",
+ "",
+ "",
+ "ALLES blokkeren",
+ "",
+ "Bloquer TOUS",
+ "",
+ "estä kaikki",
+ "blokuj wszystkie",
+ "",
+ "",
+ "",
+ },
+ { "SC-Seca: activate PPV",
+ "SC-Seca: PPV aktivieren",
+ "",
+ "",
+ "SC-Seca: activeer PPV",
+ "",
+ "SC-Seca: activer PPV",
+ "",
+ "SC-Seca: Aktivoi PPV",
+ "SC-Seca: aktywuj PPV",
+ "",
+ "",
+ "",
+ },
{ NULL }
};
+
+#endif
#include <vdr/i18n.h>
+#if APIVERSNUM < 10507
extern const tI18nPhrase ScPhrases[];
+#define trNOOP(s) (s)
+#endif
#endif //___I18N_H
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the VDR package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr "aus"
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "Aktuelle Keys:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr "Key update Status:"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr " [Gefundene Keys]"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [Neue Keys]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr "Smartcard"
+
+#: sc.c:598
+msgid "Reset card"
+msgstr "Karte reseten"
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr "Karte wirklich reseten?"
+
+#: sc.c:643
+msgid "Module config"
+msgstr "Modul Einstellungen"
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr "Modul auf Standard zurücksetzen"
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr "Wirklich Modul auf Standard zurücksetzen?"
+
+#: sc.c:721
+msgid "Module"
+msgstr "Modul"
+
+#: sc.c:736
+msgid "Message logging"
+msgstr "Meldungsprotokolierung"
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr "ALLE Module ausschalten"
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr "ALLE Module auf Standard zurücksetzen"
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr "Wirklich ALLE Module ausschalten?"
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr "Wirklich ALLE Module auf Standard zurücksetzen?"
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr "Cryptsystem Optionen"
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr "Cryptsystem Optionen..."
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr "Meldungsprotokolierung..."
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr "Smartcard Interface"
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(leer)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr "Status Informationen..."
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr "ECM Zwischenspeicher leeren"
+
+#: sc.c:871
+msgid "Reload files"
+msgstr "Dateien neu laden"
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr "ECM Zwischenspeicher wirklich leeren?"
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "Dateien wirklich neu laden?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "Aktiv! Kann Dateien jetzt nicht neu laden"
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(keiner)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr "aktive CAIDs"
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr "alle CAIDs"
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr "Keys updaten (AU)"
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr "Gleichzeitige FF Streams"
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr "Transfermodus erzwingen"
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr "Lokale Systeme bevorzugen"
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr "Aktiv auf DVB Karte"
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr "Ignoriere CAID"
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr "Meldungen auf Konsole"
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr "Meldungen in Datei"
+
+#: sc.c:1209
+msgid "Filename"
+msgstr "Dateiname"
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr "Meldungen in Syslog"
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr "Ein Software emuliertes CAM"
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr "unbekannter Key"
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr "Cardclient: sofort verbinden"
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr "Nagra: min. ECM Bearbeitungszeit"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr "nicht ändern"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr "ausschalten"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr "SC-Cryptoworks: Altersbeschränkung"
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr "alle erlauben"
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr "UNIQUE blocken"
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr "SHARED blocken"
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr "alle blocken"
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr "SC-Seca: EMM updates"
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr "SC-Seca: PPV aktivieren"
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the vdr-sc package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr "pois"
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "Nykyiset avaimet:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr "Tilausten päivitys:"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr " [Löydetyt päivitykset]"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [Uudet päivitykset]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr "Älykortti"
+
+#: sc.c:598
+msgid "Reset card"
+msgstr "Nollaa kortti"
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr "Nollataanko kortti?"
+
+#: sc.c:643
+msgid "Module config"
+msgstr "Moduulin asetukset"
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr "Nollaa moduuli oletusarvoihin"
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr "Nollataanko moduuli oletusarvoihin?"
+
+#: sc.c:721
+msgid "Module"
+msgstr "Moduuli"
+
+#: sc.c:736
+msgid "Message logging"
+msgstr "Viestien tulostus"
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr "Poista kaikki moduulit käytöstä"
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr "Nollaa kaikki moduulit oletusarvoihin"
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr "Poistetaanko kaikki moduulit käytöstä?"
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr "Nollataanko kaikki moduulit oletusarvoihin?"
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr "Salausjärjestelmien asetukset"
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr "Salausjärjestelmien asetukset..."
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr "Viestien tulostus..."
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr "Älykorttiliitäntä"
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(tyhjä)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr "Tilannetiedot..."
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr "Tyhjennä ECM-välimuisti"
+
+#: sc.c:871
+msgid "Reload files"
+msgstr "Lataa avaintiedostot uudelleen"
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr "Tyhjennetäänkö ECM-välimuisti?"
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "Ladataanko avaintiedostot uudelleen?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "Aktiivinen! Uudelleen lataus ei onnistu"
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(ei)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr "aktiiviset CAID:t"
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr "kaikki CAID:t"
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr "Tilausten päivitys (AU)"
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr "Yhtäaikainen salauksenpurku (FF)"
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr ""
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr "Suosi paikallista salauksenpurkua"
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr "Aktiivinen DVB-kortilla"
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr "Jätä huomioimatta CAID"
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr "Tulosta konsoliin"
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr "Tulosta tiedostoon"
+
+#: sc.c:1209
+msgid "Filename"
+msgstr "Tiedoston nimi"
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr "Tulosta systeemilokiin"
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr "Ohjelmistopohjainen salauksenpurku"
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr "tuntematon avain"
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr "Korttiasiakas: yhdistä välittömästi"
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr "Nagra: Min. ECM-prosessointiaika"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr "älä koske"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr "poista"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr "SC-Cryptoworks: Ikäraja"
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr "salli kaikki"
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr "estä uniikit"
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr "estä jaetut"
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr "estä kaikki"
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr "SC-Seca: EMM-päivitykset"
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr "SC-Seca: Aktivoi PPV"
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the vdr-sc package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr "off"
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "Clé courante:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr "Mise à jour des clés Statut:"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr " [Clés trouvées]"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [Nouvelles clés]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr "Smartcard"
+
+#: sc.c:598
+msgid "Reset card"
+msgstr "Réinitialiser la carte"
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr "Réinitialiser vraiment la carte?"
+
+#: sc.c:643
+msgid "Module config"
+msgstr ""
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr ""
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr ""
+
+#: sc.c:721
+msgid "Module"
+msgstr ""
+
+#: sc.c:736
+msgid "Message logging"
+msgstr ""
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr ""
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr ""
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr ""
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr ""
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr ""
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr ""
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr ""
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr "Interface Smartcard"
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(vide)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr "Statut information..."
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr ""
+
+#: sc.c:871
+msgid "Reload files"
+msgstr "Recharger les fichiers"
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr ""
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "Vraiment recharger les fichiers?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "Actif ! Je ne peux pas recharger maintenant"
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(aucune)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr "CAIDs actifs"
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr "tous les CAIDs"
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr "Mise à jour des Clés (AU)"
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr ""
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr ""
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr ""
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr "Actif sur la carte DVB"
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr ""
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr ""
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr ""
+
+#: sc.c:1209
+msgid "Filename"
+msgstr ""
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr ""
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr "Un logiciel emulateur de CAM"
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr "Clé non-révélée"
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr "Cardclient: connecter immediatement"
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr "Nagra: min. durée du processus ECM"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr "Ne pas modifier"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr "Désactiver"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr "SC-Cryptoworks: Autorisation parentale"
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr "Permettre tous"
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr "Bloquer UNIQUE"
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr "Bloquer PARTAGE"
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr "Bloquer TOUS"
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr "SC-Seca: Mise à jour EMM"
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr "SC-Seca: activer PPV"
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the vdr-sc package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr ""
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "Chiave in uso:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr ""
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr " [Chiavi trovate]"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [Nuove chiavi]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr ""
+
+#: sc.c:598
+msgid "Reset card"
+msgstr ""
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr ""
+
+#: sc.c:643
+msgid "Module config"
+msgstr ""
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr ""
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr ""
+
+#: sc.c:721
+msgid "Module"
+msgstr ""
+
+#: sc.c:736
+msgid "Message logging"
+msgstr ""
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr ""
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr ""
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr ""
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr ""
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr ""
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr ""
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr ""
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr ""
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(nessuna)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr ""
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr ""
+
+#: sc.c:871
+msgid "Reload files"
+msgstr ""
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr ""
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "Ricarica il file delle chiavi?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "Chiave in uso!"
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(nessuno)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr ""
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr ""
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr ""
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr ""
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr ""
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr ""
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr ""
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr ""
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr ""
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr ""
+
+#: sc.c:1209
+msgid "Filename"
+msgstr ""
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr ""
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr ""
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr ""
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr ""
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr ""
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the vdr-sc package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr "uit"
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "Huidige keys:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr "Key update status:"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr ""
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [Nieuwe keys]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr "Smartcard"
+
+#: sc.c:598
+msgid "Reset card"
+msgstr "Reset smartcard"
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr "Werkelijk smartcard resetten?"
+
+#: sc.c:643
+msgid "Module config"
+msgstr ""
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr ""
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr ""
+
+#: sc.c:721
+msgid "Module"
+msgstr ""
+
+#: sc.c:736
+msgid "Message logging"
+msgstr ""
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr ""
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr ""
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr ""
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr ""
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr ""
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr ""
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr ""
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr "Smartcard interface"
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(leeg)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr "Status informatie..."
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr ""
+
+#: sc.c:871
+msgid "Reload files"
+msgstr "Opnieuw laden bestanden?"
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr ""
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "Werkelijk opnieuw laden bestanden?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "Actief! Kan bestanden niet herladen"
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(geen)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr "actieve CAIDS"
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr "alle CAIDs"
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr "Keys updaten (AU)"
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr ""
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr ""
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr ""
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr "Actief op DVB kaart"
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr ""
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr ""
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr ""
+
+#: sc.c:1209
+msgid "Filename"
+msgstr ""
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr ""
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr "In software geëmuleerde CAM"
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr "onbekende key"
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr "Cardclient: direct contact maken"
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr "Nagra: min. ECM bewerkingstijd"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr "niet wijzigen"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr "uitschakelen"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr "SC-Cryptoworks: Leeftijdsadvies"
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr "ALLES toestaan"
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr "UNIEKE blokkeren"
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr "GEDEELDE blokkeren"
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr "ALLES blokkeren"
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr "SC-Seca: EMM updates"
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr "SC-Seca: activeer PPV"
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the vdr-sc package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr "wy³±cz"
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "Obecne klucze:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr "Stan aktualizacji kluczy:"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr " [widzianych kluczy]"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [nowych kluczy]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr "Smartcard"
+
+#: sc.c:598
+msgid "Reset card"
+msgstr "Resetuj kartê"
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr "Na pewno zrestartowaæ kartê?"
+
+#: sc.c:643
+msgid "Module config"
+msgstr ""
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr ""
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr ""
+
+#: sc.c:721
+msgid "Module"
+msgstr ""
+
+#: sc.c:736
+msgid "Message logging"
+msgstr ""
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr ""
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr ""
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr ""
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr ""
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr ""
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr ""
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr ""
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr "Interfejs Smartcard"
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(puste)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr "Informacje o stanie..."
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr ""
+
+#: sc.c:871
+msgid "Reload files"
+msgstr "Prze³aduj pliki"
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr ""
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "Na pewno prze³adowaæ klucze?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "Aktywny! Nie mo¿na teraz prze³adowaæ plików."
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(brak)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr "aktywne CAID"
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr "wszystkie CAID"
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr "Aktualizuj klucze (AU)"
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr ""
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr ""
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr ""
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr "Aktywny na karcie DVB"
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr ""
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr ""
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr ""
+
+#: sc.c:1209
+msgid "Filename"
+msgstr ""
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr ""
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr "Programowo emulowany CAM"
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr "niejawny klucz"
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr "Klient karty: pod³±cz natychmiast"
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr "Nagra: min. czas przetwarzania ECM"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr "nie dotykaj"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr "wy³±cz"
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr "SC-Cryptoworks: wska¼nik rodzica"
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr "dopu¶æ wszystkie"
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr "blokuj unikaty"
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr "blokuj dzielone"
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr "blokuj wszystkie"
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr "SC-Seca: aktualizacje EMM"
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr "SC-Seca: aktywuj PPV"
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the vdr-sc package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-5\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr "ÒëÚÛ"
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "¸áßÞÛì×ãÕÜëÕ ÚÛîçØ:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr "¾ÑÝÞÒÛÕÝØÕ ÚÛîçÕÙ:"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr " [ÚÛîçÕÙ ÝÐÙÔÕÝÞ]"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [ÝÞÒëå ÚÛîçÕÙ]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr "ºÐàâÞçÚÐ"
+
+#: sc.c:598
+msgid "Reset card"
+msgstr "ÁÑàÞáØâì ÚÐàâÞçÚã"
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr "´ÕÙáâÒØâÕÛìÝÞ áÑàÞáØâì ÚÐàâÞçÚã?"
+
+#: sc.c:643
+msgid "Module config"
+msgstr "½ÐáâàÞÙÚÐ ÜÞÔãÛï"
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr "ÁÑàÞá ÜÞÔãÛï ßÞ ãÜÞÛçÐÝØî"
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr "´ÕÙáâÒØâÕÛìÝÞ áÑàÞáØâì ÜÞÔãÛì ßÞ ãÜÞÛçÐÝØî?"
+
+#: sc.c:721
+msgid "Module"
+msgstr "¼ÞÔãÛì"
+
+#: sc.c:736
+msgid "Message logging"
+msgstr "¿àÞâÞÚÞÛØàÞÒÐÝØÕ áÞÞÑéÕÝØÙ"
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr "²ëÚÛîçØâì ÒáÕ ÜÞÔãÛØ"
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr "ÁÑàÞáØâì ÒáÕ ÜÞÔãÛØ ßÞ ãÜÞÛçÐÝØî"
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr "´ÕÙáâÒØâÕÛìÝÞ ÒëÚÛîçØâì ÒáÕ ÜÞÔãÛØ?"
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr "´ÕÙáâÒØâÕÛìÝÞ áÑàÞáØâì ÒáÕ ÜÞÔãÛØ ßÞ ãÜÞÛçÐÝØî?"
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr "¾ßæØØ ÚàØßâÞáØáâÕÜ"
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr "¾ßæØØ ÚàØßâÞáØáâÕÜ..."
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr "¿àÞâÞÚÞÛØàÞÒÐÝØÕ áÞÞÑéÕÝØÙ..."
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr "ºÐàâÞçÝëÙ ÜÞÔãÛì"
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(ßãáâÞ)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr "ÁÞáâÞïÝØÕ..."
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr "¾çØáâØâì Úíè ECM"
+
+#: sc.c:871
+msgid "Reload files"
+msgstr "¿ÕàÕ×ÐÓàãרâì äÐÙÛë"
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr "´ÕÙáâÒØâÕÛìÝÞ ÞçØáâØâì Úíè ECM?"
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "´ÕÙáâÒØâÕÛìÝÞ ßÕàÕ×ÐÓàãרâì äÐÙÛë?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "·ÐÝïâ! ½Õ ÜÞÓã ßÕàÕ×ÐÓàãרâì äÐÙÛë"
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(ÝÕâ)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr "ÐÚâØÒÝëÕ CAID"
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr "ÒáÕ CAID"
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr "¾ÑÝÞÒÛïâì ÚÛîçØ (AU)"
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr "¿ÐàÐÛÛÕÛìÝëÕ ßÞâÞÚØ FF"
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr ""
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr "¿àÕÔßÞçØâÐâì ÛÞÚÐÛìÝëÕ áØáâÕÜë"
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr "°ÚâØÒÝëÙ ÝÐ ßÛÐâÕ DVB"
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr "¸ÓÝÞàØàÞÒÐâì CAID"
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr "ÁÞÞÑéÕÝØï Ò ÚÞÝáÞÛÕ"
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr "ÁÞÞÑéÕÝØï Ò äÐÙÛ"
+
+#: sc.c:1209
+msgid "Filename"
+msgstr "½Ð×ÒÐÝØÕ äÐÙÛÐ"
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr "ÁÞÞÑéÕÝØï Ò Syslog"
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr "¿àÞÓàÐÜÝëÙ íÜãÛïâÞà CAM"
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr "ÝÕØ×ÒÕáâÝëÙ ÚÛîç"
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr ""
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr ""
--- /dev/null
+# VDR plugin language source file.
+# Copyright (C) 2007 somebody
+# This file is distributed under the same license as the vdr-sc package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: VDR 1.5.9\n"
+"Report-Msgid-Bugs-To: <noone@nowhere.org>\n"
+"POT-Creation-Date: 2007-08-27 14:30+0200\n"
+"PO-Revision-Date: 2007-08-27 12:45+0200\n"
+"Last-Translator: somebody\n"
+"Language-Team: somebody\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: sc.c:117 sc.c:1198
+msgid "off"
+msgstr "av"
+
+#: sc.c:546 sc.c:852
+msgid "SoftCAM"
+msgstr "SoftCAM"
+
+#: sc.c:548
+msgid "Current keys:"
+msgstr "Aktuell nyckel:"
+
+#: sc.c:563
+msgid "Key update status:"
+msgstr "Nyckeluppdateringsstatus:"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:567
+msgid " [Seen keys]"
+msgstr " [Påträffade nycklar]"
+
+#. TRANSLATORS: 2 leading spaces!
+#: sc.c:569
+msgid " [New keys]"
+msgstr " [Nya nycklar]"
+
+#: sc.c:593
+msgid "Smartcard"
+msgstr "Smartcard"
+
+#: sc.c:598
+msgid "Reset card"
+msgstr "Nollställ kortet"
+
+#: sc.c:604
+msgid "Really reset card?"
+msgstr "Bekräfta nollställning av kortet?"
+
+#: sc.c:643
+msgid "Module config"
+msgstr ""
+
+#: sc.c:646
+msgid "Reset module to default"
+msgstr ""
+
+#: sc.c:680
+msgid "Really reset module to default?"
+msgstr ""
+
+#: sc.c:721
+msgid "Module"
+msgstr ""
+
+#: sc.c:736
+msgid "Message logging"
+msgstr ""
+
+#: sc.c:739
+msgid "Disable ALL modules"
+msgstr ""
+
+#: sc.c:740
+msgid "Reset ALL modules to default"
+msgstr ""
+
+#: sc.c:763
+msgid "Really disable ALL modules?"
+msgstr ""
+
+#: sc.c:771
+msgid "Really reset ALL modules to default?"
+msgstr ""
+
+#: sc.c:801
+msgid "Cryptsystem options"
+msgstr ""
+
+#: sc.c:858
+msgid "Cryptsystem options..."
+msgstr ""
+
+#: sc.c:859
+msgid "Message logging..."
+msgstr ""
+
+#: sc.c:864
+msgid "Smartcard interface"
+msgstr "Smartcard-gränssnitt"
+
+#: sc.c:866
+msgid "(empty)"
+msgstr "(tom)"
+
+#: sc.c:869
+msgid "Status information..."
+msgstr "Statusinformation..."
+
+#: sc.c:870
+msgid "Flush ECM cache"
+msgstr ""
+
+#: sc.c:871
+msgid "Reload files"
+msgstr "Ladda om filer"
+
+#: sc.c:898
+msgid "Really flush ECM cache?"
+msgstr ""
+
+#: sc.c:917
+msgid "Really reload files?"
+msgstr "Bekräfta omladdning av filer?"
+
+#: sc.c:924
+msgid "Active! Can't reload files now"
+msgstr "Aktiv! Kan inte ladda om filer nu"
+
+#: sc.c:1033
+msgid "(none)"
+msgstr "(ingen)"
+
+#: sc.c:1198
+msgid "active CAIDs"
+msgstr "aktiva CAID"
+
+#: sc.c:1198
+msgid "all CAIDs"
+msgstr "alla CAID"
+
+#: sc.c:1200
+msgid "Update keys (AU)"
+msgstr "Nyckeluppdatering (AU)"
+
+#: sc.c:1201
+msgid "Concurrent FF streams"
+msgstr ""
+
+#: sc.c:1202
+msgid "Force TransferMode"
+msgstr ""
+
+#: sc.c:1203
+msgid "Prefer local systems"
+msgstr ""
+
+#: sc.c:1204
+msgid "Active on DVB card"
+msgstr "Aktiv på DVB-kort"
+
+#: sc.c:1205
+msgid "Ignore CAID"
+msgstr "Ignorera CAID"
+
+#: sc.c:1207
+msgid "Log to console"
+msgstr ""
+
+#: sc.c:1208
+msgid "Log to file"
+msgstr ""
+
+#: sc.c:1209
+msgid "Filename"
+msgstr ""
+
+#: sc.c:1210
+msgid "Log to syslog"
+msgstr ""
+
+#: sc.c:1280
+msgid "A software emulated CAM"
+msgstr "En mjukvaruemulerad CAM"
+
+#: system.c:250
+msgid "undisclosed key"
+msgstr "ej avslöjad nyckel"
+
+#: systems/cardclient/cc.c:241
+msgid "Cardclient: connect immediately"
+msgstr ""
+
+#: systems/nagra/nagra1.c:977
+msgid "Nagra: min. ECM processing time"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:81
+msgid "don't touch"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:82
+msgid "disable"
+msgstr ""
+
+#: systems/sc-cryptoworks/sc-cryptoworks.c:86
+msgid "SC-Cryptoworks: Parental rating"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:81
+msgid "allow ALL"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:82
+msgid "block UNIQUE"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:83
+msgid "block SHARED"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:84
+msgid "block ALL"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:100
+msgid "SC-Seca: EMM updates"
+msgstr ""
+
+#: systems/sc-seca/sc-seca.c:101
+msgid "SC-Seca: activate PPV"
+msgstr ""
#endif
// SC API version number for loading shared libraries
-#define SCAPIVERS 8
+#define SCAPIVERS 9
const char *ScVersion = SCVERSION;
static cPlugin *ScPlugin;
static cOpts *ScOpts, *LogOpts;
+static char *cfgsub=0;
static const struct LogModule lm_core = {
(LMOD_ENABLE|L_CORE_ALL)&LOPT_MASK,
Add(new cScInfoItem(tr("Key update status:")));
int fk, nk;
cSystem::KeyStats(fk,nk);
+ // TRANSLATORS: 2 leading spaces!
Add(new cScInfoItem(tr(" [Seen keys]"),fk));
+ // TRANSLATORS: 2 leading spaces!
Add(new cScInfoItem(tr(" [New keys]"), nk));
}
Display();
PRINTF(L_CORE_LOAD,"** Key updates (AU) are %s",AutoUpdate?(AutoUpdate==1?"enabled (active CAIDs)":"enabled (all CAIDs)"):"DISABLED");
PRINTF(L_CORE_LOAD,"** Local systems %stake priority over cached remote",LocalPriority?"":"DON'T ");
PRINTF(L_CORE_LOAD,"** Concurrent FF recordings are %sallowed",ConcurrentFF?"":"NOT ");
- PRINTF(L_CORE_LOAD,"** %sorce transfermode with digital auido",ForceTransfer?"F":"DON'T f");
+ PRINTF(L_CORE_LOAD,"** %sorce transfermode with digital audio",ForceTransfer?"F":"DON'T f");
LBSTART(L_CORE_LOAD);
LBPUT("** ScCaps are"); for(int i=0; i<MAXSCCAPS ; i++) LBPUT(" %d",ScCaps[i]);
LBFLUSH();
class cScPlugin : public cPlugin {
private:
- tI18nPhrase *phrases;
#ifndef STATICBUILD
cScDlls dlls;
#endif
cScPlugin::cScPlugin(void)
{
- static const char *logg[] = { "off","active CAIDs","all CAIDs" };
+ static const char *logg[] = { trNOOP("off"),trNOOP("active CAIDs"),trNOOP("all CAIDs") };
ScOpts=new cOpts(0,6);
- ScOpts->Add(new cOptSel ("AutoUpdate" ,"Update keys (AU)" ,&ScSetup.AutoUpdate,3,logg));
- ScOpts->Add(new cOptBool ("ConcurrentFF" ,"Concurrent FF streams",&ScSetup.ConcurrentFF));
- ScOpts->Add(new cOptBool ("ForceTranfer" ,"Force TransferMode" ,&ScSetup.ForceTransfer));
- ScOpts->Add(new cOptBool ("LocalPriority","Prefer local systems" ,&ScSetup.LocalPriority));
- ScOpts->Add(new cOptMInt ("ScCaps" ,"Active on DVB card" , ScSetup.ScCaps,MAXSCCAPS,0));
- ScOpts->Add(new cOptMInt ("CaIgnore" ,"Ignore CAID" , ScSetup.CaIgnore,MAXCAIGN,2));
+ ScOpts->Add(new cOptSel ("AutoUpdate" ,trNOOP("Update keys (AU)") ,&ScSetup.AutoUpdate,3,logg));
+ ScOpts->Add(new cOptBool ("ConcurrentFF" ,trNOOP("Concurrent FF streams"),&ScSetup.ConcurrentFF));
+ ScOpts->Add(new cOptBool ("ForceTranfer" ,trNOOP("Force TransferMode") ,&ScSetup.ForceTransfer));
+ ScOpts->Add(new cOptBool ("LocalPriority",trNOOP("Prefer local systems") ,&ScSetup.LocalPriority));
+ ScOpts->Add(new cOptMInt ("ScCaps" ,trNOOP("Active on DVB card") , ScSetup.ScCaps,MAXSCCAPS,0));
+ ScOpts->Add(new cOptMInt ("CaIgnore" ,trNOOP("Ignore CAID") , ScSetup.CaIgnore,MAXCAIGN,2));
LogOpts=new cOpts(0,4);
- LogOpts->Add(new cOptBool ("LogConsole" ,"Log to console" ,&logcfg.logCon));
- LogOpts->Add(new cOptBool ("LogFile" ,"Log to file" ,&logcfg.logFile));
- LogOpts->Add(new cOptStr ("LogFileName" ,"Filename" ,logcfg.logFilename,sizeof(logcfg.logFilename),FileNameChars));
- LogOpts->Add(new cOptBool ("LogSyslog" ,"Log to syslog" ,&logcfg.logSys));
- phrases=0;
+ LogOpts->Add(new cOptBool ("LogConsole" ,trNOOP("Log to console") ,&logcfg.logCon));
+ LogOpts->Add(new cOptBool ("LogFile" ,trNOOP("Log to file") ,&logcfg.logFile));
+ LogOpts->Add(new cOptStr ("LogFileName" ,trNOOP("Filename") ,logcfg.logFilename,sizeof(logcfg.logFilename),FileNameChars));
+ LogOpts->Add(new cOptBool ("LogSyslog" ,trNOOP("Log to syslog") ,&logcfg.logSys));
#ifndef STATICBUILD
dlls.Load();
#endif
}
ScPlugin=this;
- Feature.AddPhrases(ScPhrases);
- RegisterI18n((phrases=Feature.GetPhrases()));
- filemaps.SetCfgDir(ConfigDirectory());
+#if APIVERSNUM < 10507
+ RegisterI18n(ScPhrases);
+#endif
+ filemaps.SetCfgDir(ConfigDirectory(cfgsub));
ScSetup.Check();
- if(!cSoftCAM::Load(ConfigDirectory())) return false;
+ if(!cSoftCAM::Load(ConfigDirectory(cfgsub))) return false;
if(Feature.SmartCard()) {
#ifdef DEFAULT_PORT
smartcards.AddPort(DEFAULT_PORT);
cScDvbDevice::Shutdown();
LogStatsDown();
cSoftCAM::Shutdown();
- RegisterI18n(NULL); free(phrases);
+#if APIVERSNUM < 10507
+ RegisterI18n(NULL);
+#endif
PRINTF(L_GEN_DEBUG,"SC cleanup done");
}
static char *help_str=0;
free(help_str); // for easier orientation, this is column 80|
- asprintf(&help_str," -B N --budget=N forces DVB device N to budget mode (using FFdecsa)\n"
+ asprintf(&help_str," -c DIR --config=DIR search config files in subdir DIR\n"
+ " (default: %s)\n"
+ " -B N --budget=N forces DVB device N to budget mode (using FFdecsa)\n"
" -I --inverse-cd use inverse CD detection for the next serial device\n"
" -R --inverse-rst use inverse RESET for the next serial device\n"
" -C FREQ --clock=FREQ use FREQ as clock for the card reader on the next\n"
" serial device (rather than 3.5712 MHz\n"
- " -s DEV, --serial=DEV activate Phoenix ISO interface on serial device DEV\n"
+ " -s DEV --serial=DEV activate Phoenix ISO interface on serial device DEV\n"
" (default: %s)\n"
- " -d CMD, --dialup=CMD call CMD to start/stop dialup-network\n"
+ " -d CMD --dialup=CMD call CMD to start/stop dialup-network\n"
" (default: %s)\n"
- " -t SECS, --timeout=SECS shutdown timeout for dialup-network\n"
+ " -t SECS --timeout=SECS shutdown timeout for dialup-network\n"
" (default: %d secs)\n",
- "none","none",netTimeout/1000
+ cfgsub?cfgsub:"none","none","none",netTimeout/1000
);
return help_str;
}
{ "dialup", required_argument, NULL, 'd' },
{ "external-au", required_argument, NULL, 'E' },
{ "budget", required_argument, NULL, 'B' },
+ { "config", required_argument, NULL, 'c' },
{ NULL }
};
int c, option_index=0;
bool invCD=false, invRST=false;
int clock=0;
- while((c=getopt_long(argc,argv,"d:s:t:B:C:E:IR",long_options,&option_index))!=-1) {
+ while((c=getopt_long(argc,argv,"c:d:s:t:B:C:E:IR",long_options,&option_index))!=-1) {
switch (c) {
case 'I': invCD=true; break;
case 'R': invRST=true; break;
case 't': netTimeout=atoi(optarg)*1000; break;
case 'E': externalAU=optarg; break;
case 'B': cScDvbDevice::SetForceBudget(atoi(optarg)); break;
+ case 'c': cfgsub=optarg; break;
default: return false;
}
}
cMenuSetupPage *cScPlugin::SetupMenu(void)
{
- return new cMenuSetupSc(ConfigDirectory());
+ return new cMenuSetupSc(ConfigDirectory(cfgsub));
}
bool cScPlugin::SetupParse(const char *Name, const char *Value)
return "Softcam active. Can't reload files now";
}
else {
- if(cSoftCAM::Load(ConfigDirectory()))
+ if(cSoftCAM::Load(ConfigDirectory(cfgsub)))
return "Files reloaded successfully";
else {
ReplyCode=901;
NEED(Atr->histLen);
LBEND();
- LBSTART(L_CORE_SERIAL);
+ LBSTART(L_CORE_SC);
LBPUT("%d: historical:",id);
for(int i=0 ; i<Atr->histLen ; i++) LBPUT(" %02x",atr[len+i]);
LBFLUSH();
#include <unistd.h>
#include <vdr/tools.h>
-#include <vdr/i18n.h>
#include "sc.h"
#include "scsetup.h"
// --- cFeature ----------------------------------------------------------------
-#define MAX_PHRASES 10
-
cFeature Feature;
bool cFeature::keyfile=false;
bool cFeature::smartcard=false;
-bool cFeature::network=false;
-int cFeature::pcount=0;
-const tI18nPhrase *cFeature::phrases[MAX_PHRASES];
-
-void cFeature::AddPhrases(const tI18nPhrase * const Phrases)
-{
- if(pcount<MAX_PHRASES)
- phrases[pcount++]=Phrases;
- else
- PRINTF(L_GEN_ERROR,"feature: too many phrases");
-}
-
-tI18nPhrase *cFeature::GetPhrases(void)
-{
- int num=1;
- for(int i=0; i<pcount; i++) {
- const tI18nPhrase *p=phrases[i];
- for(; **p; p++) num++;
- }
- tI18nPhrase *all=MALLOC(tI18nPhrase,num);
- if(all) {
- tI18nPhrase *a=all;
- for(int i=0; i<pcount; i++) {
- const tI18nPhrase *p=phrases[i];
- while(**p) {
- memcpy(a,p,sizeof(tI18nPhrase));
- a++; p++;
- }
- }
- memset(a,0,sizeof(tI18nPhrase));
- }
- return all;
-}
void cFeature::NeedsKeyFile(void)
{
#include <ctype.h>
#include <vdr/tools.h>
-#include <vdr/i18n.h>
#include "data.h"
#include "misc.h"
#include "log-core.h"
+#include "i18n.h"
// ----------------------------------------------------------------
class cFeature {
private:
- static bool keyfile, smartcard, network;
- static int pcount;
- static const tI18nPhrase *phrases[];
+ static bool keyfile, smartcard;
public:
- void AddPhrases(const tI18nPhrase * const Phrases);
- tI18nPhrase *GetPhrases(void);
void NeedsKeyFile(void);
void NeedsSmartCard(void);
bool KeyFile(void) const { return keyfile; }
class cCardClientCamd35 : public cCardClient, public cAES, private cIdSet {
private:
- unsigned int ucrc, pinid;
+ unsigned int ucrc;
+ unsigned short pinid;
bool exclusive, emmCmd06;
cCondVar sleepCond;
cTimeMs time;
unsigned char buff[300];
memset(buff,0xff,sizeof(buff));
struct CmdBlock *cb=(struct CmdBlock *)buff;
- const unsigned int pid=pinid++;
+ const unsigned short pid=pinid++;
int n;
while((n=RecvBlock(cb,sizeof(buff),0))>0) {
if(cb->udp_header.cmd==0x01 || cb->udp_header.cmd==0x44)
// -- cSystemLinkCardClient -----------------------------------------------------------
-static const tI18nPhrase Phrases[] = {
- { "Cardclient: connect immediately",
- "Cardclient: sofort verbinden",
- "",
- "",
- "Cardclient: direct contact maken",
- "",
- "Cardclient: connecter immediatement",
- "",
- "Korttiasiakas: yhdistä välittömästi",
- "Klient karty: pod³±cz natychmiast",
- "",
- "",
- "",
- },
- { NULL }
- };
-
cSystemLinkCardClient::cSystemLinkCardClient(void)
:cSystemLink(SYSTEM_NAME,SYSTEM_PRI)
{
opts=new cOpts(SYSTEM_NAME,1);
- opts->Add(new cOptBool("Immediate","Cardclient: connect immediately",&immediate));
- Feature.AddPhrases(Phrases);
+ opts->Add(new cOptBool("Immediate",trNOOP("Cardclient: connect immediately"),&immediate));
}
cCardClient *cSystemLinkCardClient::FindBySysId(unsigned short id, cCardClient *cc)
// -- c6805 --------------------------------------------------------------------
-#define HILO(ea) ((Get(ea)<<8)+Get((ea)+1))
-#define HILOS(s,ea) ((Get((s),(ea))<<8)+Get((s),(ea)+1))
#define PAGEOFF(ea,s) (((ea)&0x8000) ? pageMap[s]:0)
c6805::c6805(void) {
cc.c=0; cc.z=0; cc.n=0; cc.i=0; cc.h=0; cc.v=1;
pc=0; a=0; x=0; y=0; cr=dr=0; sp=spHi=0x100; spLow=0xC0;
+ hasReadHandler=hasWriteHandler=false;
ClearBreakpoints();
InitMapper();
memset(stats,0,sizeof(stats));
void c6805::Set(unsigned short ea, unsigned char val)
{
+ if(hasWriteHandler) WriteHandler(cr,ea,val);
unsigned char mapId=mapMap[ea+PAGEOFF(ea,cr)];
if(!(mapId&0x80)) mapper[mapId&0x7f]->Set(ea,val);
}
void c6805::Set(unsigned char seg, unsigned short ea, unsigned char val)
{
+ if(hasWriteHandler) WriteHandler(seg,ea,val);
unsigned char mapId=mapMap[ea+PAGEOFF(ea,seg)];
if(!(mapId&0x80)) mapper[mapId&0x7f]->Set(ea,val);
}
// 2 - instruction counter exeeded
// 3 - unsupported instruction
+ bool disAsmHeader=false;
disAsmLogClass=L_SYS_DISASM;
if(LOG(L_SYS_DISASM)) doDisAsm=true;
else {
doDisAsm=false;
if(LOG(L_SYS_DISASM80)) disAsmLogClass=L_SYS_DISASM80;
}
- PRINTF(disAsmLogClass,"cr:-pc- aa xx yy dr -sp- VHINZC -mem@pc- -mem@sp-");
int count=0;
while (1) {
doDisAsm=flag;
}
+ if(doDisAsm && !disAsmHeader) {
+ PRINTF(disAsmLogClass,"cr:-pc- aa xx yy dr -sp- VHINZC -mem@pc- -mem@sp-");
+ disAsmHeader=true;
+ }
CCLOGLBPUT("%02x:%04x %02x %02x %02x %02x %04x %c%c%c%c%c%c %02x%02x%02x%02x %02x%02x%02x%02x ",
cr,pc,a,x,y,dr,sp,
cc.v?'V':'.',cc.h?'H':'.',cc.i?'I':'.',cc.n?'N':'.',cc.z?'Z':'.',cc.c?'C':'.',
case 0x0: // bit
case 0x1:
op=Get(pr,ea);
+ if(hasReadHandler) ReadHandler(cr,ea,op);
CCLOGLBPUT("{%02x} ",op);
break;
case 0xA: // immediate
#define bitset(d,bit) (((d)>>(bit))&1)
+#define HILO(ea) ((Get(ea)<<8)+Get((ea)+1))
+#define HILOS(s,ea) ((Get((s),(ea))<<8)+Get((s),(ea)+1))
+
class c6805 {
private:
unsigned short pc, sp, spHi, spLow;
protected:
unsigned char a, x, y, cr, dr;
struct CC { unsigned char c, z, n, i, h, v; } cc;
+ bool hasReadHandler, hasWriteHandler;
//
int Run(int max_count);
void AddBreakpoint(unsigned short addr);
void PopPc(void);
void PopCr(void);
virtual void Stepper(void)=0;
+ virtual void WriteHandler(unsigned char seg, unsigned short ea, unsigned char &op) {}
+ virtual void ReadHandler(unsigned char seg, unsigned short ea, unsigned char &op) {}
private:
unsigned int stats[256];
char addrBuff[32];
#define L_SYS_CPUSTATS LCLASS(L_SYS,L_SYS_LASTDEF<<4)
#define L_SYS_MAP LCLASS(L_SYS,L_SYS_LASTDEF<<5)
#define L_SYS_RAWEMM LCLASS(L_SYS,L_SYS_LASTDEF<<6)
-#define L_SYS_ALL LALL(L_SYS_RAWEMM)
+#define L_SYS_RAWECM LCLASS(L_SYS,L_SYS_LASTDEF<<7)
+#define L_SYS_ALL LALL(L_SYS_RAWECM)
#define bprint(a) {fprintf(stdout, #a "="); BN_print_fp(stdout,a); fprintf(stdout,"\n");}
(LMOD_ENABLE|L_SYS_ALL)&LOPT_MASK,
(LMOD_ENABLE|L_SYS_DEFDEF|L_SYS_EMU|L_SYS_DISASM80|L_SYS_MAP)&LOPT_MASK,
"nagra",
- { L_SYS_DEFNAMES,"emu","disasm","disasm80","cpuStats","map","rawemm" }
+ { L_SYS_DEFNAMES,"emu","disasm","disasm80","cpuStats","map","rawemm","rawecm" }
};
ADD_MODULE(L_SYS,lm_sys)
:cDualKey(Super,true)
{}
-bool cPlainKeyNagra::IsBNKey(void) const
+bool cPlainKeyNagra::IsBNKey(int kn)
{
- switch(keynr & C2MASK) {
+ switch(kn & C2MASK) {
// Nagra1
case MBC('M','1'):
case MBC('E','1'):
return false;
}
+bool cPlainKeyNagra::IsBNKey(void) const
+{
+ return IsBNKey(keynr);
+}
+
int cPlainKeyNagra::ParseTag(const char *tag, const char * &line)
{
int r=-1;
#define N2_EMM_SEL 0x40
#define N2_EMM_V 0x03
+#define MATCH_ID(x,y) ((((x)^(y))&~0x107)==0)
+
class cPlainKeyNagra : public cDualKey {
private:
int ParseTag(const char *tag, const char * &line);
public:
cPlainKeyNagra(bool Super);
virtual bool Parse(const char *line);
+ static bool IsBNKey(int kn);
};
// ----------------------------------------------------------------
// -- cSystemLinkNagra ---------------------------------------------------------
-static const tI18nPhrase Phrases[] = {
- { "Nagra: min. ECM processing time",
- "Nagra: min. ECM Bearbeitungszeit",
- "",
- "",
- "Nagra: min. ECM bewerkingstijd",
- "",
- "Nagra: min. durée du processus ECM",
- "",
- "Nagra: Min. ECM-prosessointiaika",
- "Nagra: min. czas przetwarzania ECM",
- "",
- "",
- "",
- },
- { NULL }
- };
-
class cSystemLinkNagra : public cSystemLink {
public:
cSystemLinkNagra(void);
:cSystemLink(SYSTEM_NAME,SYSTEM_PRI)
{
opts=new cOpts(SYSTEM_NAME,1);
- opts->Add(new cOptInt("MinEcmTime","Nagra: min. ECM processing time",&minEcmTime,0,5000));
+ opts->Add(new cOptInt("MinEcmTime",trNOOP("Nagra: min. ECM processing time"),&minEcmTime,0,5000));
Feature.NeedsKeyFile();
- Feature.AddPhrases(Phrases);
}
bool cSystemLinkNagra::CanHandle(unsigned short SysId)
// -- cN2Prov0101 ----------------------------------------------------------------
class cN2Prov0101 : public cN2Prov, public cN2Emu, private cMap0101 {
+private:
+ bool special05;
protected:
virtual bool Algo(int algo, const unsigned char *hd, unsigned char *hw);
virtual void Stepper(void);
+ virtual void WriteHandler(unsigned char seg, unsigned short ea, unsigned char &op);
+ virtual void ReadHandler(unsigned char seg, unsigned short ea, unsigned char &op);
public:
- cN2Prov0101(int Id, int Flags):cN2Prov(Id,Flags) {}
+ cN2Prov0101(int Id, int Flags);
virtual int ProcessBx(unsigned char *data, int len, int pos);
};
static cN2ProvLinkReg<cN2Prov0101,0x0101,N2FLAG_MECM|N2FLAG_Bx> staticPL0101;
+cN2Prov0101::cN2Prov0101(int Id, int Flags)
+:cN2Prov(Id,Flags)
+{
+ hasWriteHandler=hasReadHandler=true;
+ special05=false;
+}
+
bool cN2Prov0101::Algo(int algo, const unsigned char *hd, unsigned char *hw)
{
if(algo==0x40) {
memcpy(hw,hd,3);
ExpandInput(hw);
hw[0x18]|=1; hw[0x40]|=1;
- SetWordSize(2);
- ImportReg(IMPORT_A,hw,3);
- ImportReg(IMPORT_D,hw+24);
+ DoMap(SETSIZE,0,2);
+ DoMap(IMPORT_A,hw,3);
+ DoMap(IMPORT_D,hw+24);
DoMap(0x3b);
- ExportReg(EXPORT_C,hw);
- ImportReg(IMPORT_A,hw+40,3);
- ImportReg(IMPORT_D,hw+64);
+ DoMap(EXPORT_C,hw);
+ DoMap(IMPORT_A,hw+40,3);
+ DoMap(IMPORT_D,hw+64);
DoMap(0x3b);
- ExportReg(EXPORT_C,hw+40);
+ DoMap(EXPORT_C,hw+40);
DoMap(0x43);
DoMap(0x44,hw);
DoMap(0x44,hw+64);
memcpy(hw,hd,5);
ExpandInput(hw);
hw[127]|=0x80; hw[0]|=0x01;
- SetWordSize(16);
- ImportReg(IMPORT_A,hw);
+ DoMap(SETSIZE,0,16);
+ DoMap(IMPORT_A,hw);
DoMap(0x4d);
DoMap(0x4e);
- ExportReg(EXPORT_A,hw,16,true);
- ImportReg(IMPORT_A,hw);
+ DoMap(EXPORT_A,hw);
+ RotateBytes(hw,16);
+ DoMap(IMPORT_A,hw);
DoMap(0x4e);
- ExportReg(EXPORT_A,hw);
+ DoMap(EXPORT_A,hw);
DoMap(0x57,hw,128);
return true;
}
unsigned char tmp[size];
unsigned short addr=(Get(0x44)<<8)+Get(0x45);
switch(a) {
- case SETSIZE:
- SetWordSize(Get(0x48)); break;
- case IMPORT_A ... IMPORT_D:
- GetMem(addr,tmp,size,0); ImportReg(a,tmp); break;
- case EXPORT_A ... EXPORT_D:
- ExportReg(a,tmp); SetMem(addr,tmp,size,0); break;
- case 0x0F:
- {
- unsigned char tmp2[size];
- GetMem(addr,tmp2,size,0);
- ExportReg(EXPORT_A,tmp);
- ImportReg(IMPORT_A,tmp2);
- SetMem(addr,tmp,size,0);
- break;
- }
+ case 0x02:
+ DoMap(a,0,Get(0x48)); break;
+ case IMPORT_J ... IMPORT_LAST:
+ GetMem(addr,tmp,size,0); DoMap(a,tmp); break;
+ case EXPORT_J ... EXPORT_LAST:
+ DoMap(a,tmp); SetMem(addr,tmp,size,0); break;
+ case SWAP_A ... SWAP_D:
+ GetMem(addr,tmp,size,0); DoMap(a,tmp); SetMem(addr,tmp,size,0); break;
+ case CLEAR_A ... CLEAR_D:
+ case COPY_A_B ... COPY_D_C:
+ DoMap(a); break;
default:
PRINTF(L_SYS_EMM,"%04X: unrecognized map call %02x",id,a);
return -1;
return -1;
}
+void cN2Prov0101::WriteHandler(unsigned char seg, unsigned short ea, unsigned char &op)
+{
+ if(cr==0x00) {
+ if(ea==0x05) {
+ special05=(op&0x40)!=0;
+ }
+ else if(ea==0x16) {
+ unsigned char old=Get(ea);
+ if(old&2) op=(old&~0x02) | (op&0x02);
+ }
+ }
+}
+
+void cN2Prov0101::ReadHandler(unsigned char seg, unsigned short ea, unsigned char &op)
+{
+ if(special05) {
+ special05=false; // prevent loop
+ unsigned short start=Get(0x00,0x30C0);
+ unsigned short end=Get(0x00,0x30C1);
+ if(((ea>>8)>=start) && ((ea>>8)<=end)) op=0x00; // dataspace
+ else op=0x01; // codespace
+ special05=true;
+ }
+}
+
void cN2Prov0101::Stepper(void)
{
unsigned short pc=GetPc();
ExpandInput(hw);
hw[63]|=0x80;
hw[95]=hw[127]=hw[95]&0x7F;
- SetWordSize(4);
- ImportReg(IMPORT_J,hw+0x18);
- ImportReg(IMPORT_D,hw+0x20);
- ImportReg(IMPORT_A,hw+0x60);
+ DoMap(SETSIZE,0,4);
+ DoMap(IMPORT_J,hw+0x18);
+ DoMap(IMPORT_D,hw+0x20);
+ DoMap(IMPORT_A,hw+0x60);
DoMap(0x37,hw+0x40);
- ExportReg(EXPORT_C,hw);
+ DoMap(EXPORT_C,hw);
DoMap(0x3a);
- ExportReg(EXPORT_C,hw+0x20);
+ DoMap(EXPORT_C,hw+0x20);
DoMap(0x43);
DoMap(0x44,hw);
hw[0]&=7;
- ExportReg(EXPORT_B,hw+3);
+ DoMap(EXPORT_B,hw+3);
memset(hw+3+0x20,0,128-(3+0x20));
return true;
}
- PRINTF(L_SYS_ECM,"0501: unknown MECM algo %02x",algo);
+ PRINTF(L_SYS_ECM,"%04X: unknown MECM algo %02x",id,algo);
return false;
}
+// -- cN2Prov0511 ----------------------------------------------------------------
+
+/*
+class cN2Prov0511 : public cN2Prov0501 {
+public:
+ cN2Prov0511(int Id, int Flags):cN2Prov0501(Id,Flags) {}
+ };
+*/
+
+static cN2ProvLinkReg<cN2Prov0501,0x0511,N2FLAG_MECM|N2FLAG_INV> staticPL0511;
+
+// -- cN2Prov1101 ----------------------------------------------------------------
+
+/*
+class cN2Prov1101 : public cN2Prov0501 {
+public:
+ cN2Prov1101(int Id, int Flags):cN2Prov0501(Id,Flags) {}
+ };
+*/
+
+static cN2ProvLinkReg<cN2Prov0501,0x1101,N2FLAG_MECM|N2FLAG_INV> staticPL1101;
+
+++ /dev/null
-/*
- * Softcam plugin to VDR (C++)
- *
- * This code is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This code 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
- */
-
-// -- cN2Prov1101 ----------------------------------------------------------------
-
-class cN2Prov1101 : public cN2Prov {
-protected:
- virtual bool NeedsCwSwap(void) { return true; }
-public:
- cN2Prov1101(int Id, int Flags):cN2Prov(Id,Flags) {}
- };
-
-static cN2ProvLinkReg<cN2Prov1101,0x1101,N2FLAG_INV> staticPL1101;
// -- cN2Prov4101 ----------------------------------------------------------------
class cN2Prov4101 : public cN2Prov {
+protected:
public:
cN2Prov4101(int Id, int Flags):cN2Prov(Id,Flags) {}
virtual bool PostProcAU(int id, unsigned char *data);
}
return true;
}
+
+// -- cN2Prov7101 ----------------------------------------------------------------
+
+/*
+class cN2Prov7101 : public cN2Prov4101 {
+public:
+ cN2Prov7101(int Id, int Flags):cN2Prov4101(Id,Flags) {}
+ };
+*/
+
+static cN2ProvLinkReg<cN2Prov4101,0x7101,N2FLAG_POSTAU> staticPL7101;
+++ /dev/null
-/*
- * Softcam plugin to VDR (C++)
- *
- * This code is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This code 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
- */
-
-// -- cN2Prov7101 ----------------------------------------------------------------
-
-class cN2Prov7101 : public cN2Prov {
-public:
- cN2Prov7101(int Id, int Flags):cN2Prov(Id,Flags) {}
- virtual bool PostProcAU(int id, unsigned char *data);
- };
-
-static cN2ProvLinkReg<cN2Prov7101,0x7101,N2FLAG_POSTAU> staticPL7101;
-
-bool cN2Prov7101::PostProcAU(int id, unsigned char *data)
-{
- if(data[1]==0x01) {
- cPlainKey *pk;
- if(!(pk=keys.FindKey('N',id,MBC(N2_MAGIC,0x30),16))) {
- PRINTF(L_SYS_EMM,"missing %04x NN 30 3DES key (16 bytes)",id);
- return false;
- }
- unsigned char dkey[16];
- pk->Get(dkey);
- DES_key_schedule ks1, ks2;
- DES_key_sched((DES_cblock *)&dkey[0],&ks1);
- DES_key_sched((DES_cblock *)&dkey[8],&ks2);
- DES_ecb2_encrypt(DES_CAST(&data[7]),DES_CAST(&data[7]),&ks1,&ks2,DES_DECRYPT);
- DES_ecb2_encrypt(DES_CAST(&data[7+8]),DES_CAST(&data[7+8]),&ks1,&ks2,DES_DECRYPT);
- }
- return true;
-}
// ROM01 0x01:0x8000-0xffff
if(!AddMapper(new cMapRom(0x8000,buff,0x0C000),0x8000,0x8000,0x01)) return false;
// ROM02 0x02:0x8000-0xbfff
- if(!AddMapper(new cMapRom(0x8000,buff,0x14000),0x8000,0x4000,0x02)) return false;
+ if(!AddMapper(new cMapRom(0x8000,buff,0x14000),0x8000,romv==110?0x8000:0x4000,0x02)) return false;
snprintf(buff,sizeof(buff),"EEP%02X_%d.bin",(id>>8)&0xFF,romv);
// Eeprom00 0x00:0x3000-0x37ff OTP 0x80
// -- cMapCore -----------------------------------------------------------------
-#define SETSIZE 0x02
-#define IMPORT_J 0x03
-#define IMPORT_A 0x04
-#define IMPORT_B 0x05
-#define IMPORT_C 0x06
-#define IMPORT_D 0x07
-#define EXPORT_A 0x0A
-#define EXPORT_B 0x0B
-#define EXPORT_C 0x0C
-#define EXPORT_D 0x0D
+#define SETSIZE 0x02
+#define IMPORT_J 0x03
+#define IMPORT_A 0x04
+#define IMPORT_B 0x05
+#define IMPORT_C 0x06
+#define IMPORT_D 0x07
+#define IMPORT_LAST 0x08
+#define EXPORT_J 0x09
+#define EXPORT_A 0x0A
+#define EXPORT_B 0x0B
+#define EXPORT_C 0x0C
+#define EXPORT_D 0x0D
+#define EXPORT_LAST 0x0E
+#define SWAP_A 0x0F
+#define SWAP_B 0x10
+#define SWAP_C 0x11
+#define SWAP_D 0x12
+#define CLEAR_A 0x13
+#define CLEAR_B 0x14
+#define CLEAR_C 0x15
+#define CLEAR_D 0x16
+#define COPY_A_B 0x17
+#define COPY_B_A 0x18
+#define COPY_A_C 0x19
+#define COPY_C_A 0x1A
+#define COPY_C_D 0x1B
+#define COPY_D_C 0x1C
class cMapCore {
private:
cBN A, B, C, D, J;
cBN H, R;
cBNctx ctx;
- int wordsize;
+ int wordsize, last;
+ cBN *regs[5];
//
- void ImportReg(unsigned char reg, const unsigned char *data, int l=0);
- void ExportReg(unsigned char reg, unsigned char *data, int l=0, bool BE=false);
- void SetWordSize(int l) { wordsize=l; }
void MakeJ(void);
void MonMul(BIGNUM *o, BIGNUM *i1, BIGNUM *i2);
bool DoMap(int f, unsigned char *data=0, int l=0);
cMapCore::cMapCore(void)
{
- wordsize=4;
-}
-
-void cMapCore::ImportReg(unsigned char reg, const unsigned char *in, int l)
-{
- l=(l?l:wordsize)<<3;
- switch(reg) {
- case IMPORT_J: J.GetLE(in,8); break;
- case IMPORT_A: A.GetLE(in,l); break;
- case IMPORT_B: B.GetLE(in,l); break;
- case IMPORT_C: C.GetLE(in,l); break;
- case IMPORT_D: D.GetLE(in,l); break;
- default: PRINTF(L_GEN_DEBUG,"internal: nagramap import register not supported"); return;
- }
-}
-
-void cMapCore::ExportReg(unsigned char reg, unsigned char *out, int l, bool BE)
-{
- l=(l?l:wordsize)<<3;
- cBN *ptr;
- switch(reg) {
- case EXPORT_A: ptr=&A; break;
- case EXPORT_B: ptr=&B; break;
- case EXPORT_C: ptr=&C; break;
- case EXPORT_D: ptr=&D; break;
- default: PRINTF(L_GEN_DEBUG,"internal: nagramap export register not supported"); return;
- }
- if(!BE) ptr->PutLE(out,l);
- else ptr->Put(out,l);
+ wordsize=4; last=1;
+ regs[0]=&J; regs[1]=&A; regs[2]=&B; regs[3]=&C; regs[4]=&D;
}
void cMapCore::MakeJ(void)
bool cMapCore::DoMap(int f, unsigned char *data, int l)
{
+ int dl=(l?l:wordsize)<<3;
switch(f) {
+ case SETSIZE:
+ wordsize=l; break;
+
+ case IMPORT_J:
+ case IMPORT_A:
+ case IMPORT_B:
+ case IMPORT_C:
+ case IMPORT_D:
+ last=f-IMPORT_J;
+ // fall through
+ case IMPORT_LAST:
+ regs[last]->GetLE(data,last>0?dl:8);
+ break;
+
+ case EXPORT_J:
+ case EXPORT_A:
+ case EXPORT_B:
+ case EXPORT_C:
+ case EXPORT_D:
+ last=f-EXPORT_J;
+ // fall through
+ case EXPORT_LAST:
+ regs[last]->PutLE(data,last>0?dl:8);
+ break;
+
+ case SWAP_A:
+ case SWAP_B:
+ case SWAP_C:
+ case SWAP_D:
+ last=f-SWAP_A+1;
+ x.GetLE(data,dl);
+ regs[last]->PutLE(data,dl);
+ BN_copy(*regs[last],x);
+ break;
+
+ case CLEAR_A:
+ case CLEAR_B:
+ case CLEAR_C:
+ case CLEAR_D:
+ last=f-CLEAR_A+1; BN_zero(*regs[last]);
+ break;
+
+ case COPY_A_B:
+ last=2; BN_copy(B,A); break;
+ case COPY_B_A:
+ last=1; BN_copy(A,B); break;
+ case COPY_A_C:
+ last=3; BN_copy(C,A); break;
+ case COPY_C_A:
+ last=1; BN_copy(A,C); break;
+ case COPY_C_D:
+ last=4; BN_copy(D,C); break;
+ case COPY_D_C:
+ last=3; BN_copy(C,D); break;
+
case 0x43: // init SHA1
SHA1_Init(&sctx);
break;
// -- cN2Prov ------------------------------------------------------------------
+#define N2FLAG_NONE 0
+#define N2FLAG_MECM 1
+#define N2FLAG_Bx 2
+#define N2FLAG_POSTAU 4
+#define N2FLAG_INV 128
+
class cN2Prov {
private:
unsigned seed[5], cwkey[8];
void SwapCW(unsigned char *cw);
virtual int ProcessBx(unsigned char *data, int len, int pos) { return -1; }
virtual bool PostProcAU(int id, unsigned char *data) { return true; }
- bool CanHandle(int Id) { return ((Id^id)&~0x107)==0; }
+ bool CanHandle(int Id) { return MATCH_ID(Id,id); }
bool HasFlags(int Flags) { return (flags&Flags)==Flags; }
+ void PrintCaps(int c);
};
cN2Prov::cN2Prov(int Id, int Flags)
keyValid=false; id=Id; flags=Flags;
}
+void cN2Prov::PrintCaps(int c)
+{
+ PRINTF(c,"provider %04x capabilities%s%s%s%s",id,
+ HasFlags(N2FLAG_MECM) ?" MECM":"",
+ HasFlags(N2FLAG_Bx) ?" Bx":"",
+ HasFlags(N2FLAG_POSTAU) ?" POSTPROCAU":"",
+ HasFlags(N2FLAG_INV) ?" INVCW":"");
+}
+
void cN2Prov::ExpandInput(unsigned char *hw)
{
hw[0]^=(0xDE +(0xDE<<1)) & 0xFF;
// -- cN2ProvLink & cN2Providers -----------------------------------------------
-#define N2FLAG_NONE 0
-#define N2FLAG_MECM 1
-#define N2FLAG_Bx 2
-#define N2FLAG_POSTAU 4
-#define N2FLAG_INV 128
-
class cN2Providers;
class cN2ProvLink {
int id, flags;
//
virtual cN2Prov *Create(void)=0;
- bool CanHandle(int Id) { return ((Id^id)&~0x107)==0; }
+ bool CanHandle(int Id) { return MATCH_ID(Id,id); }
bool HasFlags(int Flags) { return (flags&Flags)==Flags; }
public:
cN2ProvLink(int Id, int Flags);
if((!ecmP && id!=lastEcmId) || (ecmP && !ecmP->CanHandle(id))) {
delete ecmP;
ecmP=cN2Providers::GetProv(id,N2FLAG_NONE);
- if(ecmP) PRINTF(L_SYS_ECM,"provider %04x capabilities%s%s%s%s",id,
- ecmP->HasFlags(N2FLAG_MECM) ?" MECM":"",
- ecmP->HasFlags(N2FLAG_Bx) ?" Bx":"",
- ecmP->HasFlags(N2FLAG_POSTAU) ?" POSTPROCAU":"",
- ecmP->HasFlags(N2FLAG_INV) ?" INVCW":"");
+ if(ecmP) ecmP->PrintCaps(L_SYS_ECM);
}
lastEcmId=id;
+ HEXDUMP(L_SYS_RAWECM,buff,cmdLen,"Nagra2 RAWECM");
int l=0, mecmAlgo=0;
LBSTARTF(L_SYS_ECM);
bool contFail=false;
- for(int i=16; i<cmdLen-10 && l!=3; ) {
+ for(int i=(buff[14]&0x10)?16:20; i<cmdLen-10 && l!=3; ) {
switch(buff[i]) {
case 0x10:
case 0x11:
break;
case 0x00:
i+=2; break;
- case 0x13 ... 0x17:
- i+=4; break;
case 0x30 ... 0x36:
case 0xB0:
i+=buff[i+1]+2;
int keyset=(buffer[12]&0x03);
int sel=(buffer[12]&0x10)<<2;
- int rsasel=(id==0x4101 || id==0x4001) ? 0:sel; // D+ hack
+ int rsasel=(MATCH_ID(id,0x4101) || MATCH_ID(id,0x7101)) ? 0:sel; // D+ hack
int sigsel=(buffer[13]&0x80)>>1;
cPlainKey *pk;
cBN n;
if((!emmP && id!=lastEmmId) || (emmP && !emmP->CanHandle(id))) {
delete emmP;
emmP=cN2Providers::GetProv(id,N2FLAG_NONE);
- if(emmP) PRINTF(L_SYS_EMM,"provider %04x capabilities%s%s%s%s",id,
- emmP->HasFlags(N2FLAG_MECM) ?" MECM":"",
- emmP->HasFlags(N2FLAG_Bx) ?" Bx":"",
- emmP->HasFlags(N2FLAG_POSTAU) ?" POSTPROCAU":"",
- emmP->HasFlags(N2FLAG_INV) ?" INVCW":"");
+ if(emmP) emmP->PrintCaps(L_SYS_EMM);
}
lastEmmId=id;
for(int i=8+2+4+4; i<cmdLen-22; ) {
switch(emmdata[i]) {
case 0x42: // plain Key update
- if(emmdata[i+2]==0x10 && (emmdata[i+3]&0xBF)==0x06 &&
- (emmdata[i+4]&0xF8)==0x08 && emmdata[i+5]==0x00 && emmdata[i+6]==0x10) {
- if(!emmP || emmP->PostProcAU(id,&emmdata[i])) {
- FoundKey();
- if(keys.NewKey('N',id,(emmdata[i+3]&0x40)>>6,&emmdata[i+7],16)) NewKey();
- cLoaders::SaveCache();
+ if((((emmdata[i+3]|0xF3)+1)&0xFF) != 0) {
+ int len=emmdata[i+2];
+ int off=emmdata[i+5];
+ int ulen=emmdata[i+6];
+ if(len>0 && ulen>0 && off+ulen<=len) {
+ int ks=emmdata[i+3], kn;
+ if(ks==0x06 || ks==0x46) kn=(ks>>6)&1; else kn=MBC(N2_MAGIC,ks);
+ unsigned char key[256];
+ memset(key,0,sizeof(key));
+ if((pk=keys.FindKey('N',id,kn,len))) {
+ if(cPlainKeyNagra::IsBNKey(kn)) { pk->Get(n); n.PutLE(key,len); }
+ else pk->Get(key);
+ }
+ bool ok=false;
+ if((emmdata[i+1]&0x7F)==0) ok=true;
+ else {
+ if(emmP && emmP->HasFlags(N2FLAG_POSTAU)) {
+ if(emmP->PostProcAU(id,&emmdata[i])) ok=true;
+ }
+ else PRINTF(L_SYS_EMM,"POSTAU for provider %04x not supported",id);
+ }
+ if(ok) {
+ memcpy(&key[off],&emmdata[i+7],ulen);
+ FoundKey();
+ if(cPlainKeyNagra::IsBNKey(kn)) {
+ n.GetLE(key,len);
+ if(keys.NewKey('N',id,kn,n,len)) NewKey();
+ }
+ else {
+ if(keys.NewKey('N',id,kn,key,len)) NewKey();
+ }
+ cLoaders::SaveCache();
+ }
+ i+=ulen;
}
+ else PRINTF(L_SYS_EMM,"nano42 key size mismatch len=%d off=%d ulen=%d",len,off,ulen);
}
- i+=23;
+ else PRINTF(L_SYS_EMM,"nano42 0xf3 status exceeded");
+ i+=7;
break;
case 0xE0: // DN key update
if(emmdata[i+1]==0x25) {
if(keys.NewKey('N',id,(emmdata[i+16]&0x40)>>6,&emmdata[i+23],16)) NewKey();
cLoaders::SaveCache();
}
- i+=39;
+ i+=emmdata[i+1]+2;
break;
case 0x83: // change data prov. id
id=(emmdata[i+1]<<8)|emmdata[i+2];
i+=3;
break;
- case 0xA4: // conditional (always no match assumed for now)
- i+=emmdata[i+1]+2+4;
- break;
- case 0xA6:
- i+=15;
- break;
- case 0xAE:
- i+=11;
- break;
- case 0x13 ... 0x17: // Date
- i+=4;
- break;
case 0xB0 ... 0xBF: // Update with ROM CPU code
{
int bx=emmdata[i]&15;
}
break;
}
- case 0xE3: // Eeprom update
- i+=emmdata[i+4]+4;
- break;
+ case 0xA4: i+=emmdata[i+1]+2+4; break; // conditional (always no match assumed for now)
+ case 0xA6: i+=15; break;
+ case 0xAA: i+=emmdata[i+1]+5; break;
+ case 0xAD: i+=emmdata[i+1]+2; break;
+ case 0xA2:
+ case 0xAE: i+=11;break;
+ case 0x12: i+=emmdata[i+1]+2; break; // create tier
+ case 0x20: i+=19; break; // modify tier
+// case 0x13 ... 0x17: i+=4; break; // Date
+ case 0xE3: i+=emmdata[i+4]+5; break; // Eeprom update
case 0xE1:
case 0xE2:
- case 0x00: // end of processing
- i=cmdLen;
- break;
+ case 0x00: i=cmdLen; break; // end of processing
default:
if(!contFail) LBPUT("unknown EMM nano");
LBPUT(" %02x",emmdata[i]);
// -- cSystemLinkScCryptoworks --------------------------------------------------------
-static const tI18nPhrase Phrases[] = {
- { "SC-Cryptoworks: Parental rating",
- "SC-Cryptoworks: Altersbeschränkung",
- "",
- "",
- "SC-Cryptoworks: Leeftijdsadvies",
- "",
- "SC-Cryptoworks: Autorisation parentale",
- "",
- "SC-Cryptoworks: Ikäraja",
- "SC-Cryptoworks: wska¼nik rodzica",
- "",
- "",
- "",
- },
- { "don't touch",
- "nicht ändern",
- "",
- "",
- "niet wijzigen",
- "",
- "Ne pas modifier",
- "",
- "älä koske",
- "nie dotykaj",
- "",
- "",
- "",
- },
- { "disable",
- "ausschalten",
- "",
- "",
- "uitschakelen",
- "",
- "Désactiver",
- "",
- "poista",
- "wy³±cz",
- "",
- "",
- "",
- },
- { NULL }
- };
-
class cSystemLinkScCryptoworks : public cSystemLink {
public:
cSystemLinkScCryptoworks(void);
:cSystemLink(SYSTEM_NAME,SYSTEM_PRI)
{
static const char *rat[] = {
- "don't touch",
- "disable"
+ trNOOP("don't touch"),
+ trNOOP("disable")
};
opts=new cOpts(SYSTEM_NAME,1);
- opts->Add(new cOptSel("DisableParental","SC-Cryptoworks: Parental rating",&disableParental,sizeof(rat)/sizeof(char *),rat));
+ opts->Add(new cOptSel("DisableParental",trNOOP("SC-Cryptoworks: Parental rating"),&disableParental,sizeof(rat)/sizeof(char *),rat));
Feature.NeedsSmartCard();
- Feature.AddPhrases(Phrases);
}
bool cSystemLinkScCryptoworks::CanHandle(unsigned short SysId)
cmd[5]=dataLen+ADDRLEN;
memset(cmd+sizeof(emmCmd),0,ADDRLEN);
memcpy(cmd+sizeof(emmCmd),&data[3],len);
-// if(data[len+3]==0x01 && data[len+4]==0x00) {
- memcpy(cmd+sizeof(emmCmd)+ADDRLEN,&data[len+5],dataLen);
- if(DoCmd(cmd,0x0000)>0 && Status()) return true;
-// }
-// else d(printf("smartcardirdeto: bad EMM format, 0x0100 marker is 0x%02x%02x\n",data[len+3],data[len+4]))
+ memcpy(cmd+sizeof(emmCmd)+ADDRLEN,&data[len+5],dataLen);
+ if(DoCmd(cmd,0x0000)>0 && Status()) return true;
}
}
else PRINTF(L_SC_ERROR,"addrlen %d > %d",len,ADDRLEN);
// -- cSystemLinkScSeca --------------------------------------------------------
-static const tI18nPhrase Phrases[] = {
- { "SC-Seca: EMM updates",
- "SC-Seca: EMM updates",
- "",
- "",
- "SC-Seca: EMM updates",
- "",
- "SC-Seca: Mise à jour EMM",
- "",
- "SC-Seca: EMM-päivitykset",
- "SC-Seca: aktualizacje EMM",
- "",
- "",
- "",
- },
- { "allow ALL",
- "alle erlauben",
- "",
- "",
- "ALLES toestaan",
- "",
- "Permettre tous",
- "",
- "salli kaikki",
- "dopu¶æ wszystkie",
- "",
- "",
- "",
- },
- { "block UNIQUE",
- "UNIQUE blocken",
- "",
- "",
- "UNIEKE blokkeren",
- "",
- "Bloquer UNIQUE",
- "",
- "estä uniikit",
- "blokuj unikaty",
- "",
- "",
- "",
- },
- { "block SHARED",
- "SHARED blocken",
- "",
- "",
- "GEDEELDE blokkeren",
- "",
- "Bloquer PARTAGE",
- "",
- "estä jaetut",
- "blokuj dzielone",
- "",
- "",
- "",
- },
- { "block ALL",
- "alle blocken",
- "",
- "",
- "ALLES blokkeren",
- "",
- "Bloquer TOUS",
- "",
- "estä kaikki",
- "blokuj wszystkie",
- "",
- "",
- "",
- },
- { "SC-Seca: activate PPV",
- "SC-Seca: PPV aktivieren",
- "",
- "",
- "SC-Seca: activeer PPV",
- "",
- "SC-Seca: activer PPV",
- "",
- "SC-Seca: Aktivoi PPV",
- "SC-Seca: aktywuj PPV",
- "",
- "",
- "",
- },
- { NULL }
- };
-
static const char *block[] = {
- "allow ALL",
- "block UNIQUE",
- "block SHARED",
- "block ALL"
+ trNOOP("allow ALL"),
+ trNOOP("block UNIQUE"),
+ trNOOP("block SHARED"),
+ trNOOP("block ALL")
};
class cSystemLinkScSeca : public cSystemLink {
:cSystemLink(SYSTEM_NAME,SYSTEM_PRI)
{
opts=new cOpts(SYSTEM_NAME,2);
- opts->Add(new cOptSel("Blocker","SC-Seca: EMM updates",&blocker,sizeof(block)/sizeof(char *),block));
- cOpt *opt=new cOptBool("Ppv","SC-Seca: activate PPV",&ppv);
+ opts->Add(new cOptSel("Blocker",trNOOP("SC-Seca: EMM updates"),&blocker,sizeof(block)/sizeof(char *),block));
+ cOpt *opt=new cOptBool("Ppv",trNOOP("SC-Seca: activate PPV"),&ppv);
if(opt) opt->Persistant(false);
opts->Add(opt);
Feature.NeedsSmartCard();
- Feature.AddPhrases(Phrases);
}
bool cSystemLinkScSeca::CanHandle(unsigned short SysId)
#define ___VERSION_H
// all release versions must end with 0xFF !!
-#define SCVERSNUM 0x000801FF
-#define SCVERSION "0.8.1"
+#define SCVERSNUM 0x000802FF
+#define SCVERSION "0.8.2"
extern const char *ScVersion;