kb_dc_fileproc.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:16k
源码类别:

DVD

开发平台:

C/C++

  1. //-----------------------------------------------------------------------------
  2. // Project include files:
  3. //-----------------------------------------------------------------------------
  4. #include "kb_dc_pub.h"
  5. DCMODULEINFO moduleInfo={0,0};  
  6. static unsigned short curMovieCfgVer = 0x100;  /*影片配置文件版本号*/
  7. static unsigned short curServCfgVer = 0x100;    /*业务主配置文件版本号*/
  8. static unsigned char *curCfgName=NULL;
  9. //-----------------------------------------------------------------------------
  10. // FUNCTION:    Get_firstModID_ByName
  11. //
  12. // DESCRIPTION: 
  13. //
  14. // RETURN:      
  15. //
  16. // NOTES:       None
  17. //-----------------------------------------------------------------------------
  18. unsigned short Get_firstModID_ByName(char *name)
  19. {
  20. int i=0;
  21. unsigned short firstMId=0xffff;
  22. for(i=0;i<moduleInfo.modNum;i++)
  23. {
  24. if(strcmp((const char*)moduleInfo.modInf[i].fileName, (const char*)name)==0)
  25. return moduleInfo.modInf[i].modID;
  26. }
  27. return firstMId;
  28. }
  29. //get module number from a file
  30. int DCGetModNumByFile(DCFILE *file)   
  31. {
  32. int i=0;
  33. int count=0, blocksCnt=0;
  34. unsigned long fSize;
  35. if(file==NULL)
  36. {
  37. return -1;
  38. }
  39.        for(i=0;i<moduleInfo.modNum;i++)
  40.     {
  41. if(strcmp((const char*)file->fileName,  (const char*)moduleInfo.modInf[i].fileName)==0)
  42. count++;
  43.     }
  44. //if error, then choose another way to caculate the modulecount
  45. if(count==0)
  46. {
  47. fSize = file->fileLength;
  48. blocksCnt = (int)fSize/4066+(((int)fSize%4066==0)?0:1);
  49. count = blocksCnt/256+((blocksCnt%256==0)?0:1);
  50. }
  51. return count;
  52. }
  53. unsigned int DclsEof(DCFILE *file)
  54. {
  55. long position=file->position;
  56. long len=file->fileLength;
  57. if (position==(len))
  58. return 1;
  59. else
  60. return 0;
  61. }
  62. void DcCloseFile(DCFILE *file)
  63. {
  64. KBDcFree((void*)file->section);
  65. KBDcFree((void*)file);
  66. }
  67. void DcCloseDirectory(DCDIR *dir)
  68. {
  69. KBDcFree(dir->diiSection);
  70. KBDcFree(dir);
  71. }
  72. long DcReadFile(void *buf,int len,DCFILE *file)
  73. {
  74. long position=file->position;
  75. long fileLength=file->fileLength;
  76. unsigned long readBytes=0;
  77. if(DclsEof(file)==1)
  78. return readBytes;
  79. if((position+len)<fileLength)
  80. readBytes=len;
  81. else
  82. readBytes=fileLength-position;
  83. KBDcMemcpy((void*)buf,(const void*)(file->section+position),(size_t)readBytes);
  84. file->position+=readBytes;
  85. return readBytes;
  86. }
  87. //-----------------------------------------------------------------------------
  88. // FUNCTION:    FreeDCFILE
  89. //
  90. // DESCRIPTION: 释放分配的gDCFile
  91. //
  92. // RETURN:      
  93. //
  94. // NOTES:       None
  95. //-----------------------------------------------------------------------------
  96. void FreeDCFILE(void)
  97. {
  98. int i;
  99.        if(gDCFile!=NULL)
  100. {
  101. if(gDCFile->section!=NULL) 
  102. {
  103. DCDebug3("n ==free gDCFile->section");
  104. KBDcFree(gDCFile->section);
  105. gDCFile->section=NULL;
  106. }
  107. gDCFile->fileLength=0;
  108. //free BLOCK buffer status
  109. if(gDCFile->BufStatus.modcount>0&&gDCFile->BufStatus.modStat!=NULL)
  110. {
  111. for(i=0;i<gDCFile->BufStatus.modcount;i++)
  112. {
  113. if(gDCFile->BufStatus.modStat[i].blockCount>0)
  114. {
  115. if(gDCFile->BufStatus.modStat[i].blockStat!=NULL)
  116. {
  117. DCDebug3("n ==free blockStat of module %d", i);
  118. KBDcFree(gDCFile->BufStatus.modStat[i].blockStat);
  119. gDCFile->BufStatus.modStat[i].blockStat= NULL;
  120. gDCFile->BufStatus.modStat[i].blockCount = 0;
  121. }
  122. }
  123. }
  124. }
  125. //free module buffer status
  126. if(gDCFile->BufStatus.modStat!=NULL)
  127. {
  128. DCDebug3("n ==free modStat==");
  129. KBDcFree(gDCFile->BufStatus.modStat);
  130. gDCFile->BufStatus.modStat = NULL;
  131. gDCFile->BufStatus.modcount = 0;
  132. }
  133. }
  134. if(gDCFile!=NULL)
  135. KBDcFree(gDCFile);
  136. gDCFile=NULL;
  137. }
  138. //-----------------------------------------------------------------------------
  139. // FUNCTION:    FreeOneDCFILE
  140. //
  141. // DESCRIPTION: 根据参数释放分配的DCFILE内存
  142. //
  143. // RETURN:      
  144. //
  145. // NOTES:       None
  146. //-----------------------------------------------------------------------------
  147. void FreeOneDCFILE(DCFILE *pfile)
  148. {
  149. int i;
  150.        if(pfile!=NULL)
  151. {
  152. if(pfile->section!=NULL) 
  153. {
  154. DCDebug3("n ==free gDCFile->section_2");
  155. KBDcFree(pfile->section);
  156. pfile->section=NULL;
  157. }
  158. pfile->fileLength=0;
  159. //free BLOCK buffer status
  160. if(pfile->BufStatus.modcount>0&&pfile->BufStatus.modStat!=NULL)
  161. {
  162. for(i=0;i<pfile->BufStatus.modcount;i++)
  163. {
  164. if(pfile->BufStatus.modStat[i].blockCount>0)
  165. {
  166. if(pfile->BufStatus.modStat[i].blockStat!=NULL)
  167. {
  168. DCDebug3("n ==free blockStat of module %d_2", i);
  169. KBDcFree(pfile->BufStatus.modStat[i].blockStat);
  170. pfile->BufStatus.modStat[i].blockStat= NULL;
  171. pfile->BufStatus.modStat[i].blockCount = 0;
  172. }
  173. }
  174. }
  175. }
  176. //free module buffer status
  177. if(pfile->BufStatus.modStat!=NULL)
  178. {
  179. DCDebug3("n ==free modStat_2==");
  180. KBDcFree(pfile->BufStatus.modStat);
  181. pfile->BufStatus.modStat = NULL;
  182. pfile->BufStatus.modcount = 0;
  183. }
  184. }
  185. if(pfile!=NULL)
  186. {
  187. KBDcFree(pfile);
  188. pfile=NULL;
  189. }
  190. }
  191. //-----------------------------------------------------------------------------
  192. // FUNCTION:    FreeDCDIR
  193. //
  194. // DESCRIPTION: 释放分配的gDCFile
  195. //
  196. // RETURN:      
  197. //
  198. // NOTES:       None
  199. //-----------------------------------------------------------------------------
  200. void FreeDCDIR(void)
  201. {
  202.        if(gDCDir!=NULL)
  203. {
  204. if(gDCDir->diiSection!=NULL) 
  205. {
  206. KBDcFree(gDCDir->diiSection);
  207. gDCDir->diiSection=NULL;
  208. }
  209. }
  210. if(gDCDir!=NULL)
  211. KBDcFree(gDCDir);
  212. gDCDir=NULL;
  213. }
  214. //get file count int DII
  215. int DcGetFileCount()
  216. {
  217. int filecnt=0;
  218. return filecnt;
  219. }
  220. int InitFileModuleInfo(unsigned short modCount)
  221. {
  222. if((moduleInfo.modInf!=NULL)||(moduleInfo.modNum!=0))
  223. {
  224. if(moduleInfo.modNum != modCount)
  225. {
  226. FreeModuleInfo();  /*先释放moduleinfo结构内存*/
  227. }
  228. else
  229. {
  230. KBDcMemset(moduleInfo.modInf, 0x00, modCount*sizeof(DCModuleInfoArray));
  231. moduleInfo.modNum = 0;
  232. return 0;
  233. }
  234. }
  235. //init moduleinf struct
  236. moduleInfo.modInf = (DCModuleInfoArray *)KBDcMalloc(modCount*sizeof(DCModuleInfoArray));
  237. if(moduleInfo.modInf == NULL)
  238. {
  239. DCDebug1("n moduleInfo malloc error!");
  240. return -1;
  241. }
  242. KBDcMemset(moduleInfo.modInf, 0x00, modCount*sizeof(DCModuleInfoArray));
  243. moduleInfo.modNum = 0;
  244. return 0;
  245. }
  246. void FreeModuleInfo(void)
  247. {
  248.        if(moduleInfo.modInf!=NULL)
  249. {
  250. DCDebug4("n ==free moduleInfo.modInf");
  251. KBDcFree(moduleInfo.modInf);
  252. moduleInfo.modInf=NULL;
  253. moduleInfo.modNum = 0;
  254.        }
  255. }
  256. //初始化file结构
  257. void InitFileStruct(DCFILE *file)
  258. {
  259.    if(file==NULL)
  260.     return;
  261.    file->position =0;
  262.    file->fileLength =0;
  263.    KBDcMemset(file->fileName,0,KB_DCFILE_NAME_MAX_LEN);
  264.    file->section =NULL;
  265.    
  266.    //init bufstatus
  267.    file->BufStatus.modcount=0;
  268.    file->BufStatus.modStat = NULL;
  269.    
  270.    return;
  271. }
  272. //----------初始化buffer status----------
  273. int kb_dc_bufferStatusBuild(DCFILE *pfile, int blocksCnt)
  274. {
  275. int  i=0, modulesCnt=0;
  276. modulesCnt=blocksCnt/256+((blocksCnt%256==0)?0:1);
  277. if(pfile==NULL)
  278. {
  279. DCDebug1("n kb_dc_bufferStatusBuild: pfile is NULL");
  280. return 0;
  281. }
  282. //module buffer status
  283. pfile->BufStatus.modcount = modulesCnt;
  284. DCDebug3("n kb_dc_bufferStatusBuild:  modulesCnt=%d structSize=%d", modulesCnt, sizeof(DCBLOCKBUFSTATUS));
  285. pfile->BufStatus.modStat = (DCBLOCKBUFSTATUS *)KBDcMalloc(modulesCnt*sizeof(DCBLOCKBUFSTATUS));
  286. if(pfile->BufStatus.modStat == NULL) 
  287. {
  288. DCDebug1("n BufStatus malloc error");  
  289. return 0;
  290. }
  291. KBDcMemset(pfile->BufStatus.modStat, EMPTY, modulesCnt*sizeof(DCBLOCKBUFSTATUS));
  292. //block buffer status
  293. if(pfile->BufStatus.modcount==1)
  294. {
  295. DCDebug3("n ---in one module mode----");
  296. pfile->BufStatus.modStat[0].blockCount = blocksCnt;
  297. pfile->BufStatus.modStat[0].blockStat = (unsigned char *)KBDcMalloc(blocksCnt*sizeof(unsigned char));
  298. if(pfile->BufStatus.modStat[0].blockStat==NULL) 
  299. {
  300. DCDebug1("n blockStat malloc error 1");  
  301. return 0;
  302. }
  303. KBDcMemset(pfile->BufStatus.modStat[0].blockStat, EMPTY, blocksCnt*sizeof(unsigned char));
  304. }
  305. else if(pfile->BufStatus.modcount > 1)
  306. {
  307. int blockCntOfMod =0, blockCntOfLastMod =0;
  308. DCDebug3("n ---in multi-module mode----");
  309. blockCntOfMod = 256;
  310. for(i=0; i<pfile->BufStatus.modcount-1; i++)
  311. {
  312. pfile->BufStatus.modStat[i].blockCount = blockCntOfMod;
  313. pfile->BufStatus.modStat[i].blockStat  = (unsigned char *)KBDcMalloc(blockCntOfMod*sizeof(unsigned char));
  314. if(pfile->BufStatus.modStat[i].blockStat==NULL) 
  315. {
  316. DCDebug1("n blockStat of mod[%d] malloc error 2", i);  
  317. return 0;
  318. }
  319. KBDcMemset(pfile->BufStatus.modStat[i].blockStat, EMPTY, blockCntOfMod*sizeof(unsigned char));
  320. }
  321. //last module
  322. blockCntOfLastMod = blocksCnt - (pfile->BufStatus.modcount-1)*256;
  323. pfile->BufStatus.modStat[pfile->BufStatus.modcount-1].blockCount = blockCntOfLastMod;
  324. pfile->BufStatus.modStat[pfile->BufStatus.modcount-1].blockStat  = (unsigned char *)KBDcMalloc(blockCntOfLastMod*sizeof(unsigned char));
  325. if(pfile->BufStatus.modStat[pfile->BufStatus.modcount-1].blockStat==NULL) 
  326. {
  327. DCDebug1("n  blockStat  of last mod malloc error 3");  
  328. return 0;
  329. }
  330. KBDcMemset(pfile->BufStatus.modStat[pfile->BufStatus.modcount-1].blockStat,  EMPTY,  blockCntOfLastMod*sizeof(unsigned char));
  331. }
  332. return 1;
  333. }
  334. //根据moduleid从diiSection取得该module所承载的有效数据的大小
  335. unsigned int DCGetModSizeByIdSec(int index)
  336. {
  337.       DCDIR *dir;
  338.       ModuleInfo modInfo;
  339.   
  340.       // 获得dir 结构   
  341.       dir = GetDCDIR();
  342.       GetModuleInfo(dir->diiSection, index, &modInfo);
  343.       return modInfo.moduleSize;
  344. }
  345. //根据moduleid从DCFIle取得该module所承载的有效数据的大小
  346. unsigned int DCGetModSizeByModuleId(int modId)
  347. {
  348.      int i=0;
  349. for(i=0;i<moduleInfo.modNum;i++)
  350. {
  351. if(moduleInfo.modInf[i].modID == modId)
  352. return moduleInfo.modInf[i].moduleSize;
  353. }
  354. return 0xffff;
  355. }
  356. //Fuction:DcOpenFile
  357. //Description:malloc 
  358. DCFILE* DcOpenFile(DCDIR* dir,const char* fileName)
  359. {
  360. DIIHead diiHead;
  361. ModuleInfo modInfo;
  362. unsigned char name[255];
  363. int modCount=0;
  364. int blockSize=0;
  365. int blocksCnt=0;
  366. int i=0, nameLength;
  367. DCFILE *file;
  368. unsigned char *diiSection=dir->diiSection;
  369. GetDIIHead(diiSection,&diiHead);
  370. modCount=diiHead.numberOfModules;
  371. blockSize=diiHead.blockSize;
  372. file = (DCFILE*)KBDcMalloc(sizeof(DCFILE));
  373. if(file==NULL)
  374. {
  375. DCDebug1("nfile malloc error...n");
  376. return NULL;
  377. }
  378. InitFileStruct(file);
  379. if(InitFileModuleInfo(modCount)!=0)
  380. {
  381. DCDebug1("n InitFileModuleInfo error");
  382. return NULL;
  383. }
  384. DCDebug3("n modCount=%d...n",modCount);
  385. for(i=0;i<modCount;i++)
  386. {
  387. GetModuleInfo(diiSection,i,&modInfo);
  388. nameLength=GetModuleName(&modInfo,name);
  389. DCDebug3("[%s]VS[%s]...n", name, fileName);
  390. //初始化moduleInfo
  391. moduleInfo.modInf[moduleInfo.modNum].modID = modInfo.moduleId;
  392. moduleInfo.modInf[moduleInfo.modNum].moduleSize = modInfo.moduleSize;
  393. moduleInfo.modInf[moduleInfo.modNum].moduleVersion = modInfo.moduleVersion;
  394. strncpy((char*)moduleInfo.modInf[moduleInfo.modNum].fileName, (char*)name, strlen((char*)name));
  395. moduleInfo.modNum++;
  396. if(0==strcmp((const char*)name,(const char*)fileName))
  397. {
  398.        DCDebug3("open File[%d]=[%s]n",i,name);
  399. kb_dc_SaveCurCfgName(name);
  400. strcpy((char*)file->fileName,(char*)name);
  401. file->position=0;
  402. file->fileLength+=modInfo.moduleSize;
  403. }
  404. }
  405. //初始化一个配置文件收取 重复判断的结构,以避免解析中数组访问越界
  406. blocksCnt=(int)(file->fileLength)/4066+(((int)(file->fileLength)%4066==0)?0:1);
  407. if(kb_dc_bufferStatusBuild(file, blocksCnt)==0)
  408. {
  409. DCDebug1("n kb_dc_bufferStatusBuild failed");
  410. return NULL;
  411. }
  412. //初始化section buffer
  413. file->section = (unsigned char *)KBDcMalloc(file->fileLength);
  414.        if(file->section==NULL)
  415. {
  416. DCDebug1("Out of memory[%d]rn",file->fileLength);
  417. return NULL;
  418. }
  419. else
  420. {
  421.        //KBDcMemset(file->section, EMPTY, file->fileLength);
  422.        return file;
  423.         }
  424. }
  425. //--------------------------------------------------------------------------
  426. //description: 
  427. //--
  428. DCDIR* OpenDirectory(unsigned char *pData,int len)
  429. {
  430. DIIHead diiHead;
  431. DCDIR *dir;
  432. dir=(DCDIR*)KBDcMalloc(sizeof(DCDIR));
  433. KBDcMemset(dir, 0x00, sizeof(DCDIR));
  434. dir->diiSection=(unsigned char*)KBDcMalloc(4096);
  435. KBDcMemset(dir->diiSection, 0x00, 4096);
  436. KBDcMemcpy(dir->diiSection,pData,len);
  437. GetDIIHead(dir->diiSection,&diiHead);
  438. dir->blockSize=diiHead.blockSize;
  439. dir->numberOfModules = diiHead.numberOfModules;
  440. return dir;
  441. }
  442. //检查配置文件的版本号是否变更
  443. //TRUE: changed
  444. //FALSE: not changed
  445. BOOL kb_dc_CfgVerCheck(unsigned char *cfg_name, unsigned char type)
  446. {
  447. int i=0;
  448. if(cfg_name==NULL)
  449. {
  450. DCDebug1("n -kb_dc_CfgVerCheck-:  cfg_name is null");
  451. return FALSE;
  452. }
  453. //还没有取到module info数据的情况下,不去激活
  454. //配置文件搜索
  455. if(moduleInfo.modNum==0)
  456. {
  457. DCDebug1("n -kb_dc_CfgVerCheck-: moduleInfo.modNum==0! ");
  458. return FALSE;
  459. }
  460. //根据配置文件名匹配
  461. for(i=0;i<moduleInfo.modNum;i++)
  462. {
  463. if(strcmp((const char *)cfg_name, (const char *)moduleInfo.modInf[i].fileName)==0)
  464. {
  465. if(type==SERV_CFG_ADVERTISE)
  466. {
  467. DCDebug2("n -kb_dc_CfgVerCheck-: curCfgVer=%d   modInf[%d].moduleVersion=%d", curMovieCfgVer,i, moduleInfo.modInf[i].moduleVersion);
  468. if((unsigned short)moduleInfo.modInf[i].moduleVersion!=curMovieCfgVer)
  469. {
  470. curMovieCfgVer = (unsigned short)moduleInfo.modInf[i].moduleVersion;
  471. return TRUE;
  472. }
  473. }
  474. else if(type==SERV_CFG_MAIN)
  475. {
  476. DCDebug2("n -kb_dc_CfgVerCheck-: curServCfgVer=%d   modInf[%d].moduleVersion=%d", curServCfgVer,i, moduleInfo.modInf[i].moduleVersion);
  477. if((unsigned short)moduleInfo.modInf[i].moduleVersion!=curServCfgVer)
  478. {
  479. curServCfgVer = (unsigned short)moduleInfo.modInf[i].moduleVersion;
  480. return TRUE;
  481. }
  482. }
  483. } }
  484. //如果精确到文件, 此段代码应该屏蔽
  485. #if 0
  486. if(i>=moduleInfo.modNum)
  487. {
  488. int j=0;
  489. for(j=0;j<moduleInfo.modNum;j++)
  490. {
  491. if(moduleInfo.modInf[j].moduleVersion!=curMovieCfgVer)
  492. return TRUE;
  493. }
  494. }
  495. #endif
  496. return FALSE;
  497. }
  498. //-------
  499. unsigned char kb_dc_GetCurCfgVer()
  500. {
  501. return curMovieCfgVer;
  502. }
  503. int kb_dc_SaveServCfgVersion( char *cfg_name)
  504. {
  505. int i;
  506. for(i=0; i<moduleInfo.modNum; i++)
  507. {
  508. if(strcmp((const char *)cfg_name, (const char *)moduleInfo.modInf[i].fileName)==0)
  509. {
  510. curServCfgVer = (unsigned short)moduleInfo.modInf[i].moduleVersion;
  511. return true;
  512. }
  513. }
  514. return false;
  515. }
  516. void kb_dc_SaveCurCfgName(unsigned char *name)
  517. {
  518. if(curCfgName==NULL)
  519. {
  520. curCfgName=(unsigned char*)KBDcMalloc(KB_DCFILE_NAME_MAX_LEN*sizeof(unsigned char));
  521. if(curCfgName==NULL)
  522. {
  523. DCDebug1("n curCfgName malloc error!!!");
  524. return;
  525. }
  526. }
  527. strcpy((char*)curCfgName, (char*)name);
  528. return;
  529. }
  530. unsigned char * kb_dc_GetCurCfgName(void)
  531. {
  532. return curCfgName;
  533. }
  534. void kb_dc_moduleInfo_Test(void)
  535. {
  536. int i;
  537. for(i=0;i<moduleInfo.modNum;i++)
  538.     {
  539. DCDebug3("n mod[%d]: modid=%d,   fileName=%s,    moduleVersion=%d", i, moduleInfo.modInf[i].modID,  moduleInfo.modInf[i].fileName, moduleInfo.modInf[i].moduleVersion);
  540.     }
  541. }
  542. void kb_dc_CfgVerSaveTest(void)
  543. {
  544. DCDebug3("n ----kb_dc_CfgVerSaveTest-----");
  545. curMovieCfgVer++;
  546. }
  547. /*
  548. * 判断一个module是否已经收取完毕
  549. */
  550. unsigned char kb_dc_moduleIsEnd(DCFILE*pfile, unsigned short  index)
  551. {
  552. int k;
  553. if(index >(pfile->BufStatus.modcount-1))
  554. {
  555. DCDebug1("n index overflow error");
  556. index = pfile->BufStatus.modcount-1;
  557. }
  558. for(k=0; k<pfile->BufStatus.modStat[index].blockCount; k++)
  559. {
  560. if(pfile->BufStatus.modStat[index].blockStat[k] == EMPTY)
  561. break;
  562. }
  563. if(k>=pfile->BufStatus.modStat[index].blockCount)
  564. return 1;
  565. else
  566. return 0;
  567. }