From: leslie Date: Thu, 27 Dec 2007 21:00:51 +0000 (+0100) Subject: release 0.8.2 X-Git-Tag: 0.8.2 X-Git-Url: http://www.vanbest.org/gitweb/?a=commitdiff_plain;h=58ee77ba5e74331a64f27b60c645b9d06c44aa80;p=sasc-ng.git release 0.8.2 --- diff --git a/HISTORY b/HISTORY index 8e55d65..c17ca68 100644 --- 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 diff --git a/Makefile b/Makefile index facf6ed..14522aa 100644 --- 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='' -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 diff --git a/Makefile.system b/Makefile.system index 9d4ec61..36a192e 100644 --- a/Makefile.system +++ b/Makefile.system @@ -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 ee0222e..6138482 100644 --- 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 format (the V 000000 00 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 cb4321e..c8b3e2a 100644 --- a/cam.c +++ b/cam.c @@ -26,15 +26,17 @@ #include #include +#include #include #include +#ifndef SASC #if APIVERSNUM >= 10500 #include #endif -#include #include #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 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(idxparity==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->indexpidpid]=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=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=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 752a64e..f2d3d35 100644 --- 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 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 6c2bd39..0b8b491 100644 --- 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 b39b4b7..151afb1 100644 --- a/i18n.h +++ b/i18n.h @@ -22,6 +22,9 @@ #include +#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 index 0000000..80d8ade --- /dev/null +++ b/po/de_DE.po @@ -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: \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 index 0000000..0d37daa --- /dev/null +++ b/po/fi_FI.po @@ -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: \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 index 0000000..64bab21 --- /dev/null +++ b/po/fr_FR.po @@ -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: \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 index 0000000..95f98f2 --- /dev/null +++ b/po/it_IT.po @@ -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: \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 index 0000000..e7ed5fa --- /dev/null +++ b/po/nl_NL.po @@ -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: \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 index 0000000..4653f39 --- /dev/null +++ b/po/pl_PL.po @@ -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: \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 index 0000000..6f493b9 --- /dev/null +++ b/po/ru_RU.po @@ -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: \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 index 0000000..7a96db4 --- /dev/null +++ b/po/sv_SE.po @@ -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: \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 382dcc2..7f05483 100644 --- a/sc.c +++ b/sc.c @@ -78,12 +78,13 @@ #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; iAdd(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; diff --git a/smartcard.c b/smartcard.c index 03bb70d..1cbd15c 100644 --- a/smartcard.c +++ b/smartcard.c @@ -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 ; ihistLen ; i++) LBPUT(" %02x",atr[len+i]); LBFLUSH(); diff --git a/system.c b/system.c index cd29695..32e9325 100644 --- a/system.c +++ b/system.c @@ -22,7 +22,6 @@ #include #include -#include #include "sc.h" #include "scsetup.h" @@ -33,45 +32,10 @@ // --- 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 #include -#include #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; } diff --git a/systems/cardclient/camd.c b/systems/cardclient/camd.c index 53df4eb..166ad23 100644 --- a/systems/cardclient/camd.c +++ b/systems/cardclient/camd.c @@ -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) diff --git a/systems/cardclient/cc.c b/systems/cardclient/cc.c index eae431c..0eb6b30 100644 --- a/systems/cardclient/cc.c +++ b/systems/cardclient/cc.c @@ -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) diff --git a/systems/nagra/cpu.c b/systems/nagra/cpu.c index e9af43f..cdb972b 100644 --- a/systems/nagra/cpu.c +++ b/systems/nagra/cpu.c @@ -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 diff --git a/systems/nagra/cpu.h b/systems/nagra/cpu.h index 4f94e8d..5e1cfea 100644 --- a/systems/nagra/cpu.h +++ b/systems/nagra/cpu.h @@ -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]; diff --git a/systems/nagra/log-nagra.h b/systems/nagra/log-nagra.h index 68468ed..23dec2e 100644 --- a/systems/nagra/log-nagra.h +++ b/systems/nagra/log-nagra.h @@ -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");} diff --git a/systems/nagra/nagra.c b/systems/nagra/nagra.c index 74d60a4..185e67e 100644 --- a/systems/nagra/nagra.c +++ b/systems/nagra/nagra.c @@ -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; diff --git a/systems/nagra/nagra.h b/systems/nagra/nagra.h index e794b26..2b2874e 100644 --- a/systems/nagra/nagra.h +++ b/systems/nagra/nagra.h @@ -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); }; // ---------------------------------------------------------------- diff --git a/systems/nagra/nagra1.c b/systems/nagra/nagra1.c index 473573e..b50b764 100644 --- a/systems/nagra/nagra1.c +++ b/systems/nagra/nagra1.c @@ -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) diff --git a/systems/nagra/nagra2-0101.c b/systems/nagra/nagra2-0101.c index 1eeb497..3899eef 100644 --- a/systems/nagra/nagra2-0101.c +++ b/systems/nagra/nagra2-0101.c @@ -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 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(); diff --git a/systems/nagra/nagra2-0501.c b/systems/nagra/nagra2-0501.c index bc2fec2..761337c 100644 --- a/systems/nagra/nagra2-0501.c +++ b/systems/nagra/nagra2-0501.c @@ -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 staticPL0511; + +// -- cN2Prov1101 ---------------------------------------------------------------- + +/* +class cN2Prov1101 : public cN2Prov0501 { +public: + cN2Prov1101(int Id, int Flags):cN2Prov0501(Id,Flags) {} + }; +*/ + +static cN2ProvLinkReg staticPL1101; + diff --git a/systems/nagra/nagra2-1101.c b/systems/nagra/nagra2-1101.c deleted file mode 100644 index 2553cae..0000000 --- a/systems/nagra/nagra2-1101.c +++ /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 staticPL1101; diff --git a/systems/nagra/nagra2-4101.c b/systems/nagra/nagra2-4101.c index a68e08f..f140b47 100644 --- a/systems/nagra/nagra2-4101.c +++ b/systems/nagra/nagra2-4101.c @@ -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 staticPL7101; diff --git a/systems/nagra/nagra2-7101.c b/systems/nagra/nagra2-7101.c deleted file mode 100644 index 695150d..0000000 --- a/systems/nagra/nagra2-7101.c +++ /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 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; -} diff --git a/systems/nagra/nagra2.c b/systems/nagra/nagra2.c index 9f6056e..53f6fa2 100644 --- a/systems/nagra/nagra2.c +++ b/systems/nagra/nagra2.c @@ -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>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; iPostProcAU(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]); diff --git a/systems/sc-cryptoworks/sc-cryptoworks.c b/systems/sc-cryptoworks/sc-cryptoworks.c index 843c718..a08446a 100644 --- a/systems/sc-cryptoworks/sc-cryptoworks.c +++ b/systems/sc-cryptoworks/sc-cryptoworks.c @@ -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) diff --git a/systems/sc-irdeto/sc-irdeto.c b/systems/sc-irdeto/sc-irdeto.c index 797d383..ecb1659 100644 --- a/systems/sc-irdeto/sc-irdeto.c +++ b/systems/sc-irdeto/sc-irdeto.c @@ -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); diff --git a/systems/sc-seca/sc-seca.c b/systems/sc-seca/sc-seca.c index 5562589..c994857 100644 --- a/systems/sc-seca/sc-seca.c +++ b/systems/sc-seca/sc-seca.c @@ -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) diff --git a/version.h b/version.h index 2c18ad9..39f77b2 100644 --- 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;