📄 dsmcc-biop.c
字号:
#include <stdio.h>#include <stdlib.h>#include <vdr/receiver.h>#include "dsmcc-biop.h"#include "dsmcc-descriptor.h"#include "dsmcc-receiver.h"#include "dsmcc-cache.h"// FILE *biop_fd;// FILE *bd_fd;/*struct biop_stream * Biop::ProcessBiopStream() { ; }struct biop_streamevent * Biop::ProcessBiopStreamEvent() { ; }*/intBiop::ProcessBiopMsgHdr(struct biop_message *bm, struct cache_module_data *cachep) { struct biop_msg_header *hdr = &bm->hdr; uchar *Data = cachep->data + cachep->curp; int off = 0; if(Data == NULL) { return -1; }// fprintf(bd_fd, "Hdr -> Checking magic\n"); if(Data[0] !='B' || Data[1] !='I' || Data[2] !='O' || Data[3] !='P') {// fprintf(bd_fd, "Hdr -> Magic Failed %c%c%c%c!\n", Data[0], Data[1], Data[2], Data[3]);// fflush(bd_fd); return -2; }// fprintf(bd_fd, "Hdr -> Magic OK!\n");// fflush(bd_fd); off+=4;/* skip magic */ hdr->version_major = Data[off++];// fprintf(bd_fd, "Hdr -> Version Major = %d\n", hdr->version_major); hdr->version_minor = Data[off++]; off+=2; /* skip byte order & message type */// fprintf(bd_fd, "Hdr -> Version Minor = %d\n", hdr->version_minor); hdr->message_size = (Data[off] << 24) | (Data[off+1] << 16) | (Data[off+2] << 8) | Data[off+3]; off+=4;// fprintf(bd_fd, "Hdr -> Message Size = %d\n", hdr->message_size); hdr->objkey_len = Data[off++];// fprintf(bd_fd, "Hdr -> ObjKey Len = %d\n", hdr->objkey_len); hdr->objkey = (char *)malloc(hdr->objkey_len); memcpy(hdr->objkey, Data+off, hdr->objkey_len);// fprintf(bd_fd, "Hdr -> ObjKey = %c%c%c%c\n", hdr->objkey[0], hdr->objkey[1], hdr->objkey[2], hdr->objkey[3]); off+= hdr->objkey_len; hdr->objkind_len = (Data[off] << 24) | (Data[off+1] << 16) | (Data[off+2] << 8) | Data[off+3]; off+=4;// fprintf(bd_fd, "Hdr -> ObjKind Len = %ld\n", hdr->objkind_len); hdr->objkind = (char *)malloc(hdr->objkind_len); memcpy(hdr->objkind, Data+off, hdr->objkind_len);// fprintf(bd_fd, "Hdr -> ObjKind Data = %s\n", hdr->objkind); off+= hdr->objkind_len; hdr->objinfo_len = Data[off] << 8 | Data[off+1]; off+=2;// fprintf(bd_fd, "Hdr -> ObjInfo Len = %d\n", hdr->objkey_len); hdr->objinfo = (char *)malloc(hdr->objinfo_len); memcpy(hdr->objinfo, Data+off, hdr->objinfo_len);// fprintf(bd_fd, "Hdr -> ObjInfo = %c%c%c\n", hdr->objinfo[0], hdr->objinfo[1], hdr->objinfo[2]); off+= hdr->objinfo_len; cachep->curp += off; return 0;}intBiop::ProcessBiopNameComp(struct biop_name_comp *comp, uchar *Data) { int off = 0; comp->id_len = Data[off++];// fprintf(bd_fd, "Dir -> Binding -> Name -> Comp -> Id Len = %d\n", comp->id_len); comp->id = (char *)malloc(comp->id_len); memcpy(comp->id, Data+off, comp->id_len); off+=comp->id_len; comp->kind_len = Data[off++];// fprintf(bd_fd, "Dir -> Binding -> Name -> Comp -> Kind Len = %d\n", comp->kind_len); comp->kind = (char *)malloc(comp->kind_len); memcpy(comp->kind, Data+off, comp->kind_len); off+= comp->kind_len;// fprintf(bd_fd, "Dir -> Binding -> Name -> Comp -> Kind = %s\n", comp->kind); return off;}intBiop::ProcessBiopName(struct biop_name *name, uchar *Data) { int i, off = 0, ret; name->comp_count = Data[0];// fprintf(bd_fd, "Dir -> Binding -> Name -> Comp Count = %d\n", name->comp_count); off++; name->comps = (struct biop_name_comp *) malloc(sizeof(struct biop_name_comp) * name->comp_count); for(i = 0; i < name->comp_count; i++) { ret = ProcessBiopNameComp(&name->comps[i], Data+off); if(ret > 0) { off += ret; } else { /* TODO error */ } } return off;}intBiop::ProcessBiopBinding(struct biop_binding *bind, uchar *Data) { int off = 0, ret;// fprintf(bd_fd, "Dir -> Binding -> Processing Name \n"); ret = ProcessBiopName(&bind->name, Data); if(ret > 0) { off += ret; } else { /* TODO error */ } bind->binding_type = Data[off++];// fprintf(bd_fd, "Dir -> Binding -> Type = %d\n", bind->binding_type); ret = ProcessBiopIor(&bind->ior, Data+off); if(ret > 0) { off += ret; } else { /*TODO error */ } bind->objinfo_len = (Data[off] << 8) | Data[off+1];// fprintf(bd_fd, "Dir -> Binding -> ObjInfo Len = %d\n", bind->objinfo_len); off+=2; bind->objinfo = (char *)malloc(bind->objinfo_len); memcpy(bind->objinfo, Data+off, bind->objinfo_len);// fprintf(bd_fd, "Dir -> Binding -> ObjInfo = %s\n", bind->objinfo); off+= bind->objinfo_len; return off;}intBiop::ProcessBiopSrg(struct biop_message *bm,struct cache_module_data *cachep, Cache *cache) { unsigned int i; int off = 0, ret; uchar *Data = cachep->data + cachep->curp; off++; /* skip service context count */ bm->body.srg.msgbody_len = (Data[off] << 24) | (Data[off+1] << 16) | (Data[off+2] << 8) | Data[off+3];// fprintf(bd_fd, "Gateway -> MsgBody Len = %ld\n", bm->body.srg.msgbody_len); off+=4; bm->body.srg.bindings_count = Data[off] << 8 | Data[off+1];// fprintf(bd_fd, "Gateway -> Bindings Count = %d\n", bm->body.srg.bindings_count); off+=2; for(i = 0; i < bm->body.srg.bindings_count; i++) { ret = ProcessBiopBinding(&bm->body.srg.binding, Data+off); if(ret > 0) { off += ret; } else { /* TODO error */ } if(!strcmp("dir", bm->body.srg.binding.name.comps[0].kind)) { cache->CacheDirInfo(0,0,NULL,&bm->body.srg.binding); } else if(!strcmp("fil",bm->body.srg.binding.name.comps[0].kind)) { cache->CacheFileInfo(0,0,NULL,&bm->body.srg.binding); } FreeBiopBinding(&bm->body.srg.binding); } cachep->curp += off; return 0;}voidBiop::FreeBiopBinding(struct biop_binding *binding) { int i; for(i = 0; i < binding->name.comp_count; i++) { if(binding->name.comps[i].id_len > 0) free(binding->name.comps[i].id); if(binding->name.comps[i].kind_len > 0) free(binding->name.comps[i].kind); } free(binding->name.comps); if(binding->ior.type_id_len > 0) free(binding->ior.type_id); if(binding->ior.body.full.obj_loc.objkey_len > 0) free(binding->ior.body.full.obj_loc.objkey); if(binding->ior.body.full.dsm_conn.tap.selector_len > 0) free(binding->ior.body.full.dsm_conn.tap.selector_data); if(binding->objinfo_len > 0) free(binding->objinfo);}voidBiop::ProcessBiopDir(struct biop_message *bm, struct cache_module_data *cachep, Cache *cache){ unsigned int i; int off = 0, ret; uchar *Data = cachep->data + cachep->curp; off++; /* skip service context count */ bm->body.dir.msgbody_len = (Data[off] << 24) | (Data[off+1] << 16) | (Data[off+2] << 8) | Data[off+3];// fprintf(bd_fd, "Dir -> MsgBody Len = %ld\n", bm->body.dir.msgbody_len); off+=4; bm->body.dir.bindings_count = Data[off] << 8 | Data[off+1];// fprintf(bd_fd, "Dir -> Bindings Count = %d\n", bm->body.dir.bindings_count); off+=2; for(i = 0; i < bm->body.dir.bindings_count; i++) { ret = ProcessBiopBinding(&bm->body.dir.binding, Data+off); if(ret > 0) { off+= ret; } else { /* TODO error */ } if(!strcmp("dir",bm->body.dir.binding.name.comps[0].kind)) { cache->CacheDirInfo(cachep->module_id, bm->hdr.objkey_len, bm->hdr.objkey, &bm->body.dir.binding); } else if(!strcmp("fil", bm->body.dir.binding.name.comps[0].kind)){ cache->CacheFileInfo(cachep->module_id, bm->hdr.objkey_len, bm->hdr.objkey, &bm->body.dir.binding); } FreeBiopBinding(&bm->body.dir.binding); } cache->num_dirs--; cachep->curp += off;}voidBiop::ProcessBiopFile(struct biop_message *bm,struct cache_module_data *cachep, Cache *cache){ int off = 0; uchar *Data = cachep->data+cachep->curp; /* skip service contect count */ off++; bm->body.file.msgbody_len = (Data[off] << 24) | (Data[off+1] << 16) | (Data[off+2] << 8) | Data[off+3]; off+=4;// fprintf(bd_fd, "File -> MsgBody Len = %ld\n",bm->body.file.msgbody_len); bm->body.file.content_len = (Data[off] << 24) | (Data[off+1] << 16) | (Data[off+2] << 8) | Data[off+3]; off+=4;// fprintf(bd_fd, "File -> Content Len = %ld\n", bm->body.file.content_len); cachep->curp += off; cache->CacheFile(bm, cachep); cachep->curp += bm->body.file.content_len;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -