⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsmcc-biop.c

📁 Parses UK Profile 1.05/1.06 Object Carousel and saves files to disk (all stored under /tmp/cache at
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -