]> www.vanbest.org Git - sasc-ng.git/commitdiff
release 0.8.2 0.8.2
authorleslie <unknown>
Thu, 27 Dec 2007 21:00:51 +0000 (22:00 +0100)
committerleslie <unknown>
Thu, 27 Dec 2007 21:00:51 +0000 (22:00 +0100)
38 files changed:
HISTORY
Makefile
Makefile.system
README
cam.c
cam.h
i18n.c
i18n.h
po/de_DE.po [new file with mode: 0644]
po/fi_FI.po [new file with mode: 0644]
po/fr_FR.po [new file with mode: 0644]
po/it_IT.po [new file with mode: 0644]
po/nl_NL.po [new file with mode: 0644]
po/pl_PL.po [new file with mode: 0644]
po/ru_RU.po [new file with mode: 0644]
po/sv_SE.po [new file with mode: 0644]
sc.c
smartcard.c
system.c
system.h
systems/cardclient/camd.c
systems/cardclient/cc.c
systems/nagra/cpu.c
systems/nagra/cpu.h
systems/nagra/log-nagra.h
systems/nagra/nagra.c
systems/nagra/nagra.h
systems/nagra/nagra1.c
systems/nagra/nagra2-0101.c
systems/nagra/nagra2-0501.c
systems/nagra/nagra2-1101.c [deleted file]
systems/nagra/nagra2-4101.c
systems/nagra/nagra2-7101.c [deleted file]
systems/nagra/nagra2.c
systems/sc-cryptoworks/sc-cryptoworks.c
systems/sc-irdeto/sc-irdeto.c
systems/sc-seca/sc-seca.c
version.h

diff --git a/HISTORY b/HISTORY
index 8e55d656a7a5865d27cf002bf1dfd8bcbf5920b2..c17ca68feb07c1d0348a17b3a8fc506d3ec1b500 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,9 +1,23 @@
 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
index facf6ed7fe31f637384d60d327cd0d1dcabd028c..14522aac8d5fc56a27e7bcbfa4ddf8087f064456 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -51,6 +51,7 @@ SHAREDLIBS    =
 ### 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"):
 
@@ -75,6 +76,13 @@ PACKAGE = vdr-$(ARCHIVE)
 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
 #
@@ -102,6 +110,12 @@ CSAFLAGS   ?= -Wall -fPIC -g -O3 -mmmx -fomit-frame-pointer -fexpensive-optimiza
 FFDECSADIR  = FFdecsa
 FFDECSA     = $(FFDECSADIR)/FFdecsa.o
 
+# SASC
+ifdef SASC
+DEFINES += -DSASC
+FFDECSA =
+endif
+
 # export for system makefiles
 export SCAPIVERS
 export APIVERSION
@@ -111,11 +125,6 @@ export SHAREDLIBS
 export CXX
 export CXXFLAGS
 
-### Implicit rules:
-
-%.o: %.c
-       $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(INCLUDES) $<
-
 # Dependencies:
 
 MAKEDEP = g++ -MM -MG
@@ -134,8 +143,16 @@ else
 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 $@
@@ -149,6 +166,22 @@ $(LIBDIR)/libvdr-$(PLUGIN).a: $(OBJS)
 $(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
 
@@ -164,6 +197,7 @@ clean-core:
        @-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
index 9d4ec619a45fdc73e52f0d8da9ae0e70f9f4501f..36a192eb018d4a1d10b50b3b980f40814b280fdf 100644 (file)
@@ -28,11 +28,6 @@ SINCLUDES += $(shell echo "$(INCLUDES)" | sed -e 's+-I *+-I+g' | sed -e 's+-I\([
 
 -include *.mk
 
-### Implicit rules:
-
-%.o: %.c
-       $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(SINCLUDES) $<
-
 # Dependencies:
 
 MAKEDEP = g++ -MM -MG
@@ -66,6 +61,9 @@ endef
 all: $(BUILDTARGETS)
 .PHONY: clean dist
 
+%.o: %.c
+       $(CXX) $(CXXFLAGS) -c $(DEFINES) $(SHAREDDEFINES) $(SINCLUDES) $<
+
 $(LIBSC): $(OBJS)
        $(CXX) $(CXXFLAGS) -shared $(OBJS) $(LIBS) $(SHAREDLIBS) -o $@
        $(clean-pre)
diff --git a/README b/README
index ee0222e83620169315453a6e3a76748ba64bf38c..61384821c19a42b8bec4bb7460260191b0458fa7 100644 (file)
--- a/README
+++ b/README
@@ -95,7 +95,8 @@ device numbering inside VDR.
 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
@@ -193,24 +194,20 @@ core control all aspects of operation, there is no way to enforce a limit
 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).
 
@@ -222,13 +219,13 @@ For Nagra1 AU you need appropriate binary Rom and Eeprom files. The files have
 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.
 
 
 
@@ -320,6 +317,25 @@ earlier releases.
 
 
 
+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
 --------------
 
diff --git a/cam.c b/cam.c
index cb4321ecca25e64cff03e336960d27ae9976b499..c8b3e2af86dda9173042cab7a08c885963969a3e 100644 (file)
--- a/cam.c
+++ b/cam.c
 #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"
@@ -721,46 +723,6 @@ bool cEcmCache::ParseLine(const char *line, bool fromCache)
   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 {
@@ -1538,7 +1500,7 @@ void cCam::WriteCW(int index, unsigned char *cw, bool force)
       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));
       }
 
@@ -1546,7 +1508,7 @@ void cCam::WriteCW(int index, unsigned char *cw, bool force)
       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));
       }
     }
@@ -1675,6 +1637,8 @@ void cCam::RemHandler(cEcmHandler *handler)
   indexMap[idx]=0;
 }
 
+#ifndef SASC
+
 // --- cChannelCaids -----------------------------------------------------------
 
 #if APIVERSNUM >= 10500
@@ -2314,28 +2278,38 @@ bool cScCiAdapter::Assign(cDevice *Device, bool Query)
 #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));
 }
 
@@ -2346,55 +2320,67 @@ cDeCSA::~cDeCSA()
   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];
@@ -2403,29 +2389,25 @@ bool cDeCSA::Decrypt(unsigned char *data, int len, bool force)
         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;
 }
@@ -2459,12 +2441,14 @@ cDeCsaTSBuffer::cDeCsaTSBuffer(int File, int Size, int CardIndex, cDeCSA *DeCsa,
   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;
 }
 
@@ -2519,10 +2503,14 @@ uchar *cDeCsaTSBuffer::Get(void)
   return NULL;
 }
 
+#endif //SASC
+
 // -- cScDvbDevice -------------------------------------------------------------
 
 int cScDvbDevice::budget=0;
 
+#ifndef SASC
+
 cScDvbDevice::cScDvbDevice(int n, int cafd)
 :cDvbDevice(n)
 {
@@ -2584,7 +2572,7 @@ void cScDvbDevice::LateInit(void)
 #endif
   if(softcsa) {
     PRINTF(L_GEN_INFO,"Using software decryption on card %d",n);
-    decsa=new cDeCSA;
+    decsa=new cDeCSA(n);
     }
 }
 
@@ -2809,13 +2797,13 @@ bool cScDvbDevice::GetTSPacket(uchar *&Data)
   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;
 }
 
@@ -2905,3 +2893,54 @@ void cScDvbDevice::DumpAV7110(void)
       }
     }
 }
+
+#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
diff --git a/cam.h b/cam.h
index 752a64e62d7b5aac90039440d9e3f8f395015b31..f2d3d350382787873145220242d7b73224f1585f 100644 (file)
--- a/cam.h
+++ b/cam.h
@@ -59,6 +59,34 @@ extern cEcmCache ecmcache;
 
 // ----------------------------------------------------------------
 
+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
@@ -138,10 +166,13 @@ private:
   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
@@ -153,22 +184,25 @@ protected:
   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; }
diff --git a/i18n.c b/i18n.c
index 6c2bd39b265c189eb3e35e9f86a28e383bd3a75e..0b8b491f01aca679da517bf45562609fa7eec10f 100644 (file)
--- a/i18n.c
+++ b/i18n.c
@@ -19,6 +19,8 @@
 
 #include "i18n.h"
 
+#if APIVERSNUM < 10507
+
 const tI18nPhrase ScPhrases[] = {
   { "Update keys (AU)",
     "Keys updaten (AU)",
@@ -38,6 +40,24 @@ const tI18nPhrase ScPhrases[] = {
     "",
     "¾ÑÝÞÒÛïâì ÚÛîçØ (AU)",
   },
+  { "off",
+    "aus",
+    "",
+    "",
+    "uit",
+    "",
+    "off",
+    ""
+    "pois",
+    "wy³±cz",
+    "",
+    "",
+    "av",
+    "",
+    "",
+    "",
+    "ÒëÚÛ",
+  },
   { "active CAIDs",
     "aktive CAIDs",
     "",
@@ -110,6 +130,24 @@ const tI18nPhrase ScPhrases[] = {
     "",
     "¿ÐàÐÛÛÕÛìÝëÕ ßÞâÞÚØ FF",
   },
+  { "Force TransferMode",
+    "Transfermodus erzwingen",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+    "",
+  },
   { "Prefer local systems",
     "Lokale Systeme bevorzugen",
     "",
@@ -776,5 +814,161 @@ const tI18nPhrase ScPhrases[] = {
     "",
     "´ÕÙáâÒØâÕÛìÝÞ áÑàÞáØâì ÜÞÔãÛì ßÞ ãÜÞÛçÐÝØî?",
   },
+  { "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
diff --git a/i18n.h b/i18n.h
index b39b4b7b378e49911d2d70ae5f85c3a467a436b4..151afb168fac5251126064b21686b739542d25e1 100644 (file)
--- a/i18n.h
+++ b/i18n.h
@@ -22,6 +22,9 @@
 
 #include <vdr/i18n.h>
 
+#if APIVERSNUM < 10507
 extern const tI18nPhrase ScPhrases[];
+#define trNOOP(s) (s)
+#endif
 
 #endif //___I18N_H
diff --git a/po/de_DE.po b/po/de_DE.po
new file mode 100644 (file)
index 0000000..80d8ade
--- /dev/null
@@ -0,0 +1,237 @@
+# 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"
diff --git a/po/fi_FI.po b/po/fi_FI.po
new file mode 100644 (file)
index 0000000..0d37daa
--- /dev/null
@@ -0,0 +1,237 @@
+# 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"
diff --git a/po/fr_FR.po b/po/fr_FR.po
new file mode 100644 (file)
index 0000000..64bab21
--- /dev/null
@@ -0,0 +1,237 @@
+# 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"
diff --git a/po/it_IT.po b/po/it_IT.po
new file mode 100644 (file)
index 0000000..95f98f2
--- /dev/null
@@ -0,0 +1,237 @@
+# 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 ""
diff --git a/po/nl_NL.po b/po/nl_NL.po
new file mode 100644 (file)
index 0000000..e7ed5fa
--- /dev/null
@@ -0,0 +1,237 @@
+# 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"
diff --git a/po/pl_PL.po b/po/pl_PL.po
new file mode 100644 (file)
index 0000000..4653f39
--- /dev/null
@@ -0,0 +1,237 @@
+# 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"
diff --git a/po/ru_RU.po b/po/ru_RU.po
new file mode 100644 (file)
index 0000000..6f493b9
--- /dev/null
@@ -0,0 +1,237 @@
+# 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 ""
diff --git a/po/sv_SE.po b/po/sv_SE.po
new file mode 100644 (file)
index 0000000..7a96db4
--- /dev/null
@@ -0,0 +1,237 @@
+# 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 ""
diff --git a/sc.c b/sc.c
index 382dcc243c5c297e12afc77ec4cbd655d2ca62ce..7f05483d9fc5af76436752989b03b5d18bac4b0f 100644 (file)
--- a/sc.c
+++ b/sc.c
 #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,
@@ -562,7 +563,9 @@ cMenuInfoSc::cMenuInfoSc(void)
     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();
@@ -968,7 +971,7 @@ void cScSetup::Check(void)
   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();
@@ -1170,7 +1173,6 @@ bool cScDlls::Load(void)
 
 class cScPlugin : public cPlugin {
 private:
-  tI18nPhrase *phrases;
 #ifndef STATICBUILD
   cScDlls dlls;
 #endif
@@ -1193,20 +1195,19 @@ public:
 
 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
@@ -1242,11 +1243,12 @@ bool cScPlugin::Start(void)
     }
     
   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);
@@ -1262,7 +1264,9 @@ void cScPlugin::Stop(void)
   cScDvbDevice::Shutdown();
   LogStatsDown();
   cSoftCAM::Shutdown();
-  RegisterI18n(NULL); free(phrases);
+#if APIVERSNUM < 10507
+  RegisterI18n(NULL);
+#endif
   PRINTF(L_GEN_DEBUG,"SC cleanup done");
 }
 
@@ -1281,18 +1285,20 @@ const char *cScPlugin::CommandLineHelp(void)
   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;
 }
@@ -1307,13 +1313,14 @@ bool cScPlugin::ProcessArgs(int argc, char *argv[])
       { "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;
@@ -1323,6 +1330,7 @@ bool cScPlugin::ProcessArgs(int argc, char *argv[])
       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;
       }
     }
@@ -1331,7 +1339,7 @@ bool cScPlugin::ProcessArgs(int argc, char *argv[])
 
 cMenuSetupPage *cScPlugin::SetupMenu(void)
 {
-  return new cMenuSetupSc(ConfigDirectory());
+  return new cMenuSetupSc(ConfigDirectory(cfgsub));
 }
 
 bool cScPlugin::SetupParse(const char *Name, const char *Value)
@@ -1375,7 +1383,7 @@ cString cScPlugin::SVDRPCommand(const char *Command, const char *Option, int &Re
       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;
index 03bb70de0535821a19d806c8cc5495fdb74b9a80..1cbd15cf92eb85b54f2541dbcde48f2013b44a08 100644 (file)
@@ -886,7 +886,7 @@ bool cSmartCard::ParseAtr(struct Atr *Atr, int id, int clock)
   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();
index cd29695a4996d053104482a71f61452742c59583..32e93254591741c77556e1cdc2bd11617d4c4e20 100644 (file)
--- a/system.c
+++ b/system.c
@@ -22,7 +22,6 @@
 #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)
 {
index 194a442f415d6805273c63c0a0ae523c5a68bab7..154a159ebca70fcbc8592311bd2df95c745ee231 100644 (file)
--- a/system.h
+++ b/system.h
 #include <ctype.h>
 
 #include <vdr/tools.h>
-#include <vdr/i18n.h>
 
 #include "data.h"
 #include "misc.h"
 #include "log-core.h"
+#include "i18n.h"
 
 // ----------------------------------------------------------------
 
@@ -48,12 +48,8 @@ class cHookManager;
 
 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; }
index 53df4ebb2a9ec38c373923d2e9f0f46a6d190fc8..166ad230512f45a6df7faf958afb77c3ca3820be 100644 (file)
@@ -413,7 +413,8 @@ struct EmmReq05 {
 
 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;
@@ -670,7 +671,7 @@ bool cCardClientCamd35::ProcessECM(const cEcmInfo *ecm, const unsigned char *dat
     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)
index eae431c901e66e24bd684be6d4839becbf442b50..0eb6b30441a8587b4922ed43ab6cfba84c3b9c84 100644 (file)
@@ -234,30 +234,11 @@ void cSystemCardClient::ProcessEMM(int pid, int caid, unsigned char *buffer)
 
 // -- 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)
index e9af43f2f8adc50ad2a4d9ec0e69c94314057613..cdb972b22d86ef6e268caab954f18cd0654f75ce 100644 (file)
@@ -138,13 +138,12 @@ void cMapEeprom::Set(unsigned short ea, unsigned char val)
 
 // -- 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));
@@ -221,12 +220,14 @@ unsigned char c6805::Get(unsigned char seg, unsigned short ea) const
 
 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);
 }
@@ -346,13 +347,13 @@ int c6805::Run(int max_count)
 // 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) {
@@ -372,6 +373,10 @@ int c6805::Run(int max_count)
       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':'.',
@@ -557,6 +562,7 @@ int c6805::Run(int max_count)
         case 0x0:                      // bit
         case 0x1:
           op=Get(pr,ea);
+          if(hasReadHandler) ReadHandler(cr,ea,op);
           CCLOGLBPUT("{%02x} ",op);
           break;
         case 0xA:                      // immediate
index 4f94e8dad40154cd62f3fbf2b9b2a6e79b0ff209..5e1cfeab7e859330de585c9180d87238b0bff4b0 100644 (file)
@@ -95,6 +95,9 @@ public:
 
 #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;
@@ -122,6 +125,7 @@ private:
 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);
@@ -141,6 +145,8 @@ protected:
   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];
index 68468ed189d2711a13a44a407e9d52dbbcd7d387..23dec2e2f97a9e52d2bc7c27a12eb07f9585f495 100644 (file)
@@ -29,7 +29,8 @@
 #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");}
 
index 74d60a479bc1ce002369831aa1f9ebbd61cf5403..185e67ed8fbebd43c4d88c1269c0f35dd00e24b1 100644 (file)
@@ -29,7 +29,7 @@ static const struct LogModule lm_sys = {
   (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)
 
@@ -51,9 +51,9 @@ cPlainKeyNagra::cPlainKeyNagra(bool Super)
 :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'):
@@ -69,6 +69,11 @@ bool cPlainKeyNagra::IsBNKey(void) const
   return false;
 }
 
+bool cPlainKeyNagra::IsBNKey(void) const
+{
+  return IsBNKey(keynr);
+}
+
 int cPlainKeyNagra::ParseTag(const char *tag, const char * &line)
 {
   int r=-1;
index e794b26f6742b9f75807bcebabfd8ab82f64f8e4..2b2874e8e03f8bd3ee63e6d01c4d2320f93c8958 100644 (file)
@@ -52,6 +52,8 @@ extern int minEcmTime;
 #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);
@@ -63,6 +65,7 @@ protected:
 public:
   cPlainKeyNagra(bool Super);
   virtual bool Parse(const char *line);
+  static bool IsBNKey(int kn);
   };
 
 // ----------------------------------------------------------------
index 473573e53b449b2b88b202ca04f79756e88bd9dc..b50b764d08a5b64cbd7ca24c8c90decccb27eaaa 100644 (file)
@@ -961,24 +961,6 @@ void cSystemNagra::ProcessEMM(int pid, int caid, unsigned char *buffer)
 
 // -- 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);
@@ -992,9 +974,8 @@ cSystemLinkNagra::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)
index 1eeb497219be40276d819088169151dd56045d3f..3899eef8653f88cd91db6c1a29785bf6c0366458 100644 (file)
@@ -169,31 +169,42 @@ void cMap0101::DoMap(int f, unsigned char *data, int l)
 // -- 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);
@@ -206,14 +217,15 @@ bool cN2Prov0101::Algo(int algo, const unsigned char *hd, unsigned char *hw)
     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;
     }
@@ -244,21 +256,17 @@ int cN2Prov0101::ProcessBx(unsigned char *data, int len, int pos)
         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;
@@ -270,6 +278,31 @@ int cN2Prov0101::ProcessBx(unsigned char *data, int len, int pos)
   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();
index bc2fec29b90e60603af99bb768b8802ede0137ed..761337cbea4b4efd2d33d65785629e05e41ebc4d 100644 (file)
@@ -77,23 +77,45 @@ bool cN2Prov0501::Algo(int algo, const unsigned char *hd, unsigned char *hw)
     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;
+
diff --git a/systems/nagra/nagra2-1101.c b/systems/nagra/nagra2-1101.c
deleted file mode 100644 (file)
index 2553cae..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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;
index a68e08fffb25177477caf582fc81e4231f423c06..f140b47878d0d8b6faa09d156ebe5516a8c08842 100644 (file)
@@ -20,6 +20,7 @@
 // -- cN2Prov4101 ----------------------------------------------------------------
 
 class cN2Prov4101 : public cN2Prov {
+protected:
 public:
   cN2Prov4101(int Id, int Flags):cN2Prov(Id,Flags) {}
   virtual bool PostProcAU(int id, unsigned char *data);
@@ -45,3 +46,14 @@ bool cN2Prov4101::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;
diff --git a/systems/nagra/nagra2-7101.c b/systems/nagra/nagra2-7101.c
deleted file mode 100644 (file)
index 695150d..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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;
-}
index 9f6056e6f0724f7d8b896a32aa227fae33f4ec74..53f6fa21c825f13c2cd570c163af86df8400a8c0 100644 (file)
@@ -70,7 +70,7 @@ bool cN2Emu::Init(int id, int romv)
     // 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
@@ -86,16 +86,33 @@ bool cN2Emu::Init(int id, int romv)
 
 // -- 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:
@@ -105,11 +122,9 @@ protected:
   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);
@@ -119,35 +134,8 @@ public:
 
 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)
@@ -206,7 +194,63 @@ void cMapCore::MonMul(BIGNUM *o, BIGNUM *i1, BIGNUM *i2)
 
 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;
@@ -235,6 +279,12 @@ bool cMapCore::DoMap(int f, unsigned char *data, int l)
 
 // -- 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];
@@ -253,8 +303,9 @@ public:
   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)
@@ -262,6 +313,15 @@ 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;
@@ -332,12 +392,6 @@ void cN2Prov::SwapCW(unsigned char *cw)
 
 // -- 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 {
@@ -348,7 +402,7 @@ protected:
   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);
@@ -589,18 +643,15 @@ bool cSystemNagra2::ProcessECM(const cEcmInfo *ecm, unsigned char *data)
   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:
@@ -617,8 +668,6 @@ bool cSystemNagra2::ProcessECM(const cEcmInfo *ecm, unsigned char *data)
         break;
       case 0x00:
         i+=2; break;
-      case 0x13 ... 0x17:
-        i+=4; break;
       case 0x30 ... 0x36:
       case 0xB0:
         i+=buff[i+1]+2;
@@ -660,7 +709,7 @@ void cSystemNagra2::ProcessEMM(int pid, int caid, unsigned char *buffer)
 
   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;
@@ -693,11 +742,7 @@ void cSystemNagra2::ProcessEMM(int pid, int caid, unsigned char *buffer)
   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;
 
@@ -708,15 +753,45 @@ void cSystemNagra2::ProcessEMM(int pid, int caid, unsigned char *buffer)
   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) {
@@ -724,24 +799,12 @@ void cSystemNagra2::ProcessEMM(int pid, int caid, unsigned char *buffer)
           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;
@@ -759,14 +822,19 @@ void cSystemNagra2::ProcessEMM(int pid, int caid, unsigned char *buffer)
           }
         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]);
index 843c71885c6ba5bda2303b560a234be02dabff8e..a08446a806bf0183ff50aafc43b7bec8cbc60c13 100644 (file)
@@ -65,52 +65,6 @@ cSystemScCryptoworks::cSystemScCryptoworks(void)
 
 // -- 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);
@@ -124,14 +78,13 @@ cSystemLinkScCryptoworks::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)
index 797d3838cca5e2d415c77573cc201a416337f481..ecb16592bb7d2eb6b98163403a13c0915190decf 100644 (file)
@@ -643,11 +643,8 @@ bool cSmartCardIrdeto::Update(int pid, int caid, const unsigned char *data)
         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);
index 5562589d4f371d269cb9c279b5a2571556f1b7d1..c994857a33dfd6d7e3ccd4fbc9c4e2215fdcaaa1 100644 (file)
@@ -77,99 +77,11 @@ cSystemScSeca::cSystemScSeca(void)
 
 // -- 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 {
@@ -185,12 +97,11 @@ cSystemLinkScSeca::cSystemLinkScSeca(void)
 :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)
index 2c18ad9141b5bc74d7df3ec7c367c24b7ee73dce..39f77b27fb1b079dfe9a93025b918f54353c8b2f 100644 (file)
--- a/version.h
+++ b/version.h
@@ -21,8 +21,8 @@
 #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;