/
dvbci_hlcmgr.cpp
118 lines (109 loc) · 2.81 KB
/
dvbci_hlcmgr.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/* DVB CI Host Language and Country Manager */
#include <lib/base/eerror.h>
#include <lib/base/nconfig.h>
#include <lib/dvb_ci/dvbci_hlcmgr.h>
int eDVBCIHostLanguageAndCountrySession::receivedAPDU(const unsigned char *tag,const void *data, int len)
{
int ret = 0;
eTraceNoNewLine("[CI%d HLC] SESSION(%d)/HLC %02x %02x %02x: ", slot->getSlotID(), session_nb, tag[0], tag[1], tag[2]);
for (int i=0; i<len; i++)
eTraceNoNewLine("%02x ", ((const unsigned char*)data)[i]);
eTraceNoNewLine("\n");
if ((tag[0]==0x9f) && (tag[1]==0x81))
{
switch (tag[2])
{
case 0x00: // country enquiry
eDebug("[CI%d HLC] Host country enquiry:", slot->getSlotID());
state=stateCountryEnquiry;
ret = 1;
break;
case 0x10: // language enquiry
eDebug("[CI%d HLC] Host language enquiry:", slot->getSlotID());
state=stateLanguageEnquiry;
ret = 1;
break;
default:
eWarning("[CI%d HLC] unknown APDU tag 9F 80 %02x", slot->getSlotID(), tag[2]);
state = stateFinal;
break;
}
}
return ret;
}
std::map<std::string, std::string> eDVBCIHostLanguageAndCountrySession::createLanguageMap()
{
std::map<std::string, std::string> m;
m["ar_AE"] = "ara";
m["bg_BG"] = "bul";
m["ca_AD"] = "cat";
m["cs_CZ"] = "ces";
m["da_DK"] = "dan";
m["de_DE"] = "deu";
m["el_GR"] = "ell";
m["en_GB"] = "eng";
m["en_US"] = "eng";
m["es_ES"] = "spa";
m["et_EE"] = "est";
m["fa_IR"] = "fas";
m["fi_FI"] = "fin";
m["fr_FR"] = "fra";
m["fy_NL"] = "fry";
m["gl_ES"] = "glg";
m["he_IL"] = "heb";
m["hr_HR"] = "hrv";
m["hu_HU"] = "hun";
m["id_ID"] = "ind";
m["is_IS"] = "isl";
m["it_IT"] = "ita";
m["ku_KU"] = "kur";
m["lt_LT"] = "lit";
m["lv_LV"] = "lav";
m["nb_NO"] = "nob";
m["nl_NL"] = "nld";
m["no_NO"] = "nor";
m["pl_PL"] = "pol";
m["pt_BR"] = "por";
m["pt_PT"] = "por";
m["ro_RO"] = "ron";
m["ru_RU"] = "rus";
m["sk_SK"] = "slk";
m["sl_SI"] = "slv";
m["sr_YU"] = "srp";
m["sv_SE"] = "swe";
m["th_TH"] = "tha";
m["tr_TR"] = "tur";
m["uk_UA"] = "ukr";
m["vi_VN"] = "vie";
m["zh_CN"] = "zho";
m["zh_HK"] = "zho";
return m;
}
const std::map<std::string, std::string> eDVBCIHostLanguageAndCountrySession::m_languageMap = eDVBCIHostLanguageAndCountrySession::createLanguageMap();
int eDVBCIHostLanguageAndCountrySession::doAction()
{
switch (state)
{
case stateCountryEnquiry:
{
const unsigned char tag[] = {0x9F, 0x81, 0x01};
sendAPDU(tag, "GBR", 3);
break;
}
case stateLanguageEnquiry:
{
const unsigned char tag[] = {0x9F, 0x81, 0x11};
std::string language = eDVBCIInterfaces::getInstance()->getLanguage();
std::map<std::string, std::string>::const_iterator it = m_languageMap.find(language);
if (it != m_languageMap.end())
sendAPDU(tag, it->second.c_str(), 3);
else
sendAPDU(tag, "eng", 3);
break;
}
default:
eWarning("[CI%d HLC] unknown state", slot->getSlotID());
break;
}
return 0;
}