00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef __CI_H
00028 #define __CI_H
00029
00030 #ifdef HAVE_STDINT_H
00031 #include <stdint.h>
00032 #endif
00033
00034 #include <stdio.h>
00035
00036 #include <pthread.h>
00037 #include <sys/types.h>
00038 #include <sys/socket.h>
00039 #include <netinet/in.h>
00040 #include <sys/un.h>
00041 #include <sys/stat.h>
00042 #include <sys/uio.h>
00043
00044 #define MAXCASYSTEMIDS 16
00045
00046 class cMutex {
00047 friend class cCondVar;
00048 private:
00049 pthread_mutex_t mutex;
00050 pid_t lockingPid;
00051 int locked;
00052 public:
00053 cMutex(void);
00054 ~cMutex();
00055 void Lock(void);
00056 void Unlock(void);
00057 };
00058
00059 class cMutexLock {
00060 private:
00061 cMutex *mutex;
00062 bool locked;
00063 public:
00064 cMutexLock(cMutex *Mutex = NULL);
00065 ~cMutexLock();
00066 bool Lock(cMutex *Mutex);
00067 };
00068
00069
00070 class cCiMMI;
00071
00072 class cCiMenu {
00073 friend class cCiMMI;
00074 private:
00075 enum { MAX_CIMENU_ENTRIES = 64 };
00076 cCiMMI *mmi;
00077 bool selectable;
00078 char *titleText;
00079 char *subTitleText;
00080 char *bottomText;
00081 char *entries[MAX_CIMENU_ENTRIES];
00082 int numEntries;
00083 bool AddEntry(char *s);
00084 cCiMenu(cCiMMI *MMI, bool Selectable);
00085 public:
00086 ~cCiMenu();
00087 const char *TitleText(void) { return titleText; }
00088 const char *SubTitleText(void) { return subTitleText; }
00089 const char *BottomText(void) { return bottomText; }
00090 const char *Entry(int n) { return n < numEntries ? entries[n] : NULL; }
00091 int NumEntries(void) { return numEntries; }
00092 bool Selectable(void) { return selectable; }
00093 bool Select(int Index);
00094 bool Cancel(void);
00095 };
00096
00097 class cCiEnquiry {
00098 friend class cCiMMI;
00099 private:
00100 cCiMMI *mmi;
00101 char *text;
00102 bool blind;
00103 int expectedLength;
00104 cCiEnquiry(cCiMMI *MMI);
00105 public:
00106 ~cCiEnquiry();
00107 const char *Text(void) { return text; }
00108 bool Blind(void) { return blind; }
00109 int ExpectedLength(void) { return expectedLength; }
00110 bool Reply(const char *s);
00111 bool Cancel(void);
00112 };
00113
00114
00115
00116 #define CPLM_MORE 0x00
00117 #define CPLM_FIRST 0x01
00118 #define CPLM_LAST 0x02
00119 #define CPLM_ONLY 0x03
00120 #define CPLM_ADD 0x04
00121 #define CPLM_UPDATE 0x05
00122
00123 class cCiCaPmt {
00124 friend class cCiConditionalAccessSupport;
00125 friend class cHlCiHandler;
00126 private:
00127 int length;
00128 int infoLengthPos;
00129 uint8_t capmt[2048];
00130 public:
00131 cCiCaPmt(int ProgramNumber, uint8_t cplm = CPLM_ONLY);
00132 void AddElementaryStream(int type, int pid);
00133 void AddCaDescriptor(int ca_system_id, int ca_pid, int data_len,
00134 const uint8_t *data);
00135 };
00136
00137 #define MAX_CI_SESSION 16 //XXX
00138
00139 class cCiSession;
00140 class cCiTransportLayer;
00141 class cCiTransportConnection;
00142
00143 class cCiHandler {
00144 public:
00145 virtual ~cCiHandler() {};
00146 static cCiHandler *CreateCiHandler(const char *FileName);
00147 virtual int NumSlots(void) = 0;
00148 virtual bool Process(void) = 0;
00149 virtual bool HasUserIO(void) = 0;
00150 virtual bool NeedCaPmt(void) = 0;
00151 virtual bool EnterMenu(int Slot) = 0;
00152 virtual cCiMenu *GetMenu(void) = 0;
00153 virtual cCiEnquiry *GetEnquiry(void) = 0;
00154 virtual const unsigned short *GetCaSystemIds(int Slot) = 0;
00155 virtual bool SetCaPmt(cCiCaPmt &CaPmt, int Slot) = 0;
00156 virtual void SetTimeOffset(double ) { }
00157 };
00158
00159 class cLlCiHandler : public cCiHandler {
00160 friend class cCiHandler;
00161 private:
00162 cMutex mutex;
00163 int fdCa;
00164 int numSlots;
00165 bool newCaSupport;
00166 bool hasUserIO;
00167 bool needCaPmt;
00168 cCiSession *sessions[MAX_CI_SESSION];
00169 cCiTransportLayer *tpl;
00170 cCiTransportConnection *tc;
00171 int ResourceIdToInt(const uint8_t *Data);
00172 bool Send(uint8_t Tag, int SessionId, int ResourceId = 0, int Status = -1);
00173 cCiSession *GetSessionBySessionId(int SessionId);
00174 cCiSession *GetSessionByResourceId(int ResourceId, int Slot);
00175 cCiSession *CreateSession(int ResourceId);
00176 bool OpenSession(int Length, const uint8_t *Data);
00177 bool CloseSession(int SessionId);
00178 int CloseAllSessions(int Slot);
00179 cLlCiHandler(int Fd, int NumSlots);
00180 public:
00181 virtual ~cLlCiHandler();
00182 int NumSlots(void) { return numSlots; }
00183 bool Process(void);
00184 bool HasUserIO(void) { return hasUserIO; }
00185 bool NeedCaPmt(void) { return needCaPmt; }
00186 bool EnterMenu(int Slot);
00187 cCiMenu *GetMenu(void);
00188 cCiEnquiry *GetEnquiry(void);
00189 bool SetCaPmt(cCiCaPmt &CaPmt);
00190 const unsigned short *GetCaSystemIds(int Slot);
00191 bool SetCaPmt(cCiCaPmt &CaPmt, int Slot);
00192 void SetTimeOffset(double offset_in_seconds);
00193 bool Reset(int Slot);
00194 bool connected() const;
00195 };
00196
00197 class cHlCiHandler : public cCiHandler {
00198 friend class cCiHandler;
00199 private:
00200 cMutex mutex;
00201 int fdCa;
00202 int numSlots;
00203 int state;
00204 int numCaSystemIds;
00205 unsigned short caSystemIds[MAXCASYSTEMIDS + 1];
00206 cHlCiHandler(int Fd, int NumSlots);
00207 int CommHL(unsigned tag, unsigned function, struct ca_msg *msg);
00208 int GetData(unsigned tag, struct ca_msg *msg);
00209 int SendData(unsigned tag, struct ca_msg *msg);
00210 public:
00211 virtual ~cHlCiHandler();
00212 int NumSlots(void) { return numSlots; }
00213 bool Process(void);
00214 bool HasUserIO(void) { return false; }
00215 bool NeedCaPmt(void);
00216 bool EnterMenu(int Slot);
00217 cCiMenu *GetMenu(void);
00218 cCiEnquiry *GetEnquiry(void);
00219 bool SetCaPmt(cCiCaPmt &CaPmt);
00220 const unsigned short *GetCaSystemIds(int Slot);
00221 bool SetCaPmt(cCiCaPmt &CaPmt, int Slot);
00222 bool Reset(int Slot);
00223 bool connected() const;
00224 };
00225
00226 int tcp_listen(struct sockaddr_in *name,int sckt,unsigned long address=INADDR_ANY);
00227 int accept_tcp(int ip_sock,struct sockaddr_in *ip_name);
00228 int udp_listen(struct sockaddr_un *name,char const * const filename);
00229 int accept_udp(int ip_sock,struct sockaddr_un *ip_name);
00230
00231 #endif //__CI_H