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

DVD

开发平台:

C/C++

  1. //
  2. // (C)版权2006 深圳市键桥通讯技术有限公司
  3. // 
  4. // 文件名称: Demand.c
  5. // 
  6. // 创建日期: 2007.03.25
  7. //
  8. // 创建人 :wangxiaorong
  9. //
  10. // 修改人 : ***
  11. //
  12. //修改日期: 2007.3.29
  13. //
  14. // 描 述:  预约实现源文件
  15. //
  16. // 版 本:1.0.0
  17. //--------------------------------------------------------------------
  18. #include  <stdio.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include <ctype.h>
  22. #include "osd.h"
  23. #include "db.h"
  24. #include "rckeymap.h"
  25. #include "epg.h"
  26. #include "timeclk.h"
  27. #include "Nvod.h"
  28. #include "Demand.h"
  29. #include "sr_time.h"
  30. static EPGDDataLink *EDDataLink=NULL;
  31. #if 0
  32. /*=============================================================
  33.  函数名称 : EDHF_AddDataLink
  34.  功    能 : 添加预约信息数据链
  35.  入    口 : int prgno --------节目号
  36.   int eid   -------- 事件号
  37.   USHORT mjd ------ 播放日期
  38.   int secs  --------播放起始时间
  39.   int dur   --------播放时长
  40.   int edt   --------事件类型
  41.  出    口 : 无
  42.  返    回 : TRUE---成功,FALSE---失败
  43. =============================================================*/
  44.  BOOL KB_AddDataLink(int prgno,int eid,USHORT mjd,int secs,int dur,int edt)
  45. {
  46. EPGDDataLink  **ppEDL=&EDDataLink;
  47. //搜索到最后
  48. while(*ppEDL != NULL)
  49. {
  50. ppEDL=&((*ppEDL)->nextnode);
  51. }
  52. //追加
  53. *ppEDL=(EPGDDataLink*)KB_OSPMalloc(sizeof(EPGDDataLink));
  54. if(*ppEDL == NULL)
  55. {
  56. printf("n预约信息存储空间分配失败!");
  57. return FALSE;
  58. }
  59. (*ppEDL)->prgno=prgno;
  60. (*ppEDL)->eid=eid;
  61. (*ppEDL)->mjd=mjd;
  62. (*ppEDL)->seconds=secs;
  63. (*ppEDL)->duration=dur;
  64. (*ppEDL)->edt=edt;
  65. (*ppEDL)->nextnode=NULL;
  66. return TRUE;
  67. }
  68. #else 
  69. /*=============================================================
  70.  函数名称 : KB_AddDataLink
  71.  功    能 : 添加预约信息数据链
  72.  入    口 : EPGDDataLink *Demanddata
  73.  出    口 : 无
  74.  返    回 : TRUE---成功,FALSE---失败
  75. =============================================================*/
  76.  BOOL KB_AddDataLink(EPGDDataLink *Demanddata)
  77. {
  78.      EPGDDataLink  **ppEDL=&EDDataLink;
  79. //搜索到最后
  80. while(*ppEDL != NULL)
  81. {
  82. ppEDL=&((*ppEDL)->nextnode);
  83. }
  84. //追加
  85. *ppEDL=(EPGDDataLink*)KB_OSPMalloc(sizeof(EPGDDataLink));
  86. if(*ppEDL == NULL)
  87. {
  88. printf("n预约信息存储空间分配失败!");
  89. return FALSE;
  90. }
  91. (*ppEDL)->prgno=Demanddata->prgno;
  92. (*ppEDL)->eid=Demanddata->eid;
  93. (*ppEDL)->mjd=Demanddata->mjd;
  94. (*ppEDL)->seconds=Demanddata->seconds;
  95. (*ppEDL)->duration=Demanddata->duration;
  96. (*ppEDL)->edt=Demanddata->edt;
  97. strcpy((*ppEDL)->chlname, Demanddata->chlname);
  98. strcpy((*ppEDL)->prgname, Demanddata->prgname);
  99. strcpy((*ppEDL)->date,Demanddata->date);
  100. strcpy((*ppEDL)->time,Demanddata->time);
  101. (*ppEDL)->nextnode=NULL;
  102. return TRUE;
  103. }
  104. #endif
  105. /*=============================================================
  106.  函数名称 : KD_DelDataLink
  107.  功    能 : 删除指定的预约信息
  108.  入    口 : USHORT mjd --- 指定的预约日期
  109.   int sec    -----指定的播出时间
  110.  出    口 : 无
  111.  返    回 : TRUE---成功,FALSE---失败
  112. =============================================================*/
  113. BOOL KB_DelDataLink(USHORT mjd,int sec)
  114. {
  115. EPGDDataLink  *pEDL=EDDataLink,*qEDL=NULL;
  116. //删除指定的节点
  117. while(pEDL != NULL)
  118. {
  119. if(pEDL->mjd== mjd && pEDL->seconds==sec)
  120. break;
  121. qEDL=pEDL;
  122. pEDL=pEDL->nextnode;
  123. }
  124. //如果没找到,返回
  125. if(pEDL == NULL)
  126. return FALSE;
  127. //找到删除
  128. if(qEDL== NULL)
  129. {
  130. EDDataLink=EDDataLink->nextnode;
  131. }
  132. else
  133. {
  134. qEDL->nextnode=pEDL->nextnode;
  135. }
  136. KB_OSPFree(pEDL);
  137. return TRUE;
  138. }
  139. /*=============================================================
  140.  函数名称 : KB_GetDataLink
  141.  功    能 : 获取指定索引的预约信息
  142.  入    口 : int nItemIdx --- 指定的预约索引
  143.  出    口 : struct  _EDHFDataLink* pdl --获取节点
  144.  返    回 : TRUE---成功,FALSE---失败
  145. =============================================================*/
  146. BOOL KB_GetDataLink(int nItemIdx,EPGDDataLink* pdl)
  147. {
  148. EPGDDataLink  *pEDL=EDDataLink;
  149. int i=0;
  150. if(pdl == NULL)
  151. {
  152. printf("n传入节点地址不存在!");
  153. return FALSE;
  154. }
  155. //获取指定的节点
  156. while(pEDL != NULL)
  157. {
  158. if(i == nItemIdx)
  159. {
  160. memcpy(pdl,pEDL,sizeof(EPGDDataLink));
  161. return TRUE;
  162. }
  163. pEDL=pEDL->nextnode;
  164. i++;
  165. }
  166. return FALSE;
  167. }
  168. /*=============================================================
  169.  函数名称 : KB_GetDataLinkNum
  170.  功    能 : 获取预约信息的总数
  171.  入    口 : 无
  172.  出    口 :UINT  *num--预约信息的总数
  173.  返    回 : TRUE---成功,FALSE---失败
  174. =============================================================*/
  175. BOOL KB_GetDataLinkNum(UINT *num)
  176. {
  177. EPGDDataLink  *pEDL=EDDataLink;
  178.        int i=0;
  179. while(pEDL != NULL)
  180. {
  181. pEDL=pEDL->nextnode;
  182. i++;
  183. }
  184. *num=i;
  185. return TRUE;
  186. }
  187. /*=============================================================
  188.  函数名称 : KB_ClearDataLink
  189.  功    能 : 清除所有预约信息
  190.  入    口 : 无
  191.  出    口 : 无
  192.  返    回 : 无
  193. =============================================================*/
  194. void   KB_ClearDataLink()
  195. {
  196. EPGDDataLink  *pEDL=EDDataLink,*qEDL;
  197. //删除所有的节点
  198. while(pEDL != NULL)
  199. {
  200. qEDL=pEDL->nextnode;
  201. KB_OSPFree(pEDL);
  202. pEDL=qEDL;
  203. }
  204. EDDataLink=NULL;
  205. }
  206. /*=============================================================
  207.  函数名称 : KB_DelOnTimeDmdEnt
  208.  功    能 : 清除预约到时节目
  209.  入    口 : 无
  210.  出    口 : 无
  211.  返    回 : 无
  212. =============================================================*/
  213. void KB_DelOnTimeDmdEnt()
  214. {
  215. time_t cur_seconds;
  216. EPGDChlLink  *pp=EDTLink,*pq=NULL;
  217. EPGDEntLink *sp,*sq;
  218. int CurWeekDay=0,nYear, nMonth, nDay;
  219. //先获取当前时间
  220. if(KB_TimeGetCurTime(&cur_seconds)==0)
  221. return;
  222. //检验前把所有今天之前预约的节目清除
  223. CurWeekDay=ConvertTimeStampToDate((U32)cur_seconds, (U32 *)&nYear, (U32 *)&nMonth, (U32 *)&nDay);
  224. while(pp != NULL)
  225. {
  226. sp=pp->DmdEnt;
  227. sq=NULL;
  228. while(sp!=NULL)
  229. {
  230. if((CurWeekDay)==sp->mjd)///////////////////////////////////////注意问题
  231. {
  232. //清除播放的预约节目
  233. if((cur_seconds >= sp->seconds-30)&&(cur_seconds<=sp->seconds + sp->duration))
  234. {
  235. KB_DelDataLink(sp->mjd,(int)sp->seconds);
  236. //printf("n---------del--------   yijingbofangjiemu");
  237. if(sq == NULL)
  238. {
  239. pp->DmdEnt=pp->DmdEnt->next;
  240. KB_OSPFree(sp);
  241. sp=pp->DmdEnt;
  242. }
  243. else
  244. {
  245. sq->next=sp->next;
  246. KB_OSPFree(sp);
  247. sp=sq->next;
  248. }
  249. }
  250. else
  251. {
  252. sq=sp;
  253. sp=sp->next;
  254. }
  255. }
  256. else
  257. {
  258. sq=sp;
  259. sp=sp->next;
  260. }
  261. }
  262. //如果当前频道没有任何预约节目,清除该频道
  263. if(pp->DmdEnt == NULL)
  264. {
  265. if(pq == NULL)
  266. {
  267. EDTLink=EDTLink->next;
  268. KB_OSPFree(pp);
  269. pp=EDTLink;
  270. }
  271. else
  272. {
  273. pq->next=pp->next;
  274. KB_OSPFree(pp);
  275. pp=pq->next;
  276. }
  277. }
  278. else
  279. {
  280. pq =pp;
  281. pp=pp->next;
  282. }
  283. }
  284. }
  285. /*=============================================================
  286.  函数名称 : KB_CheckOnlyOne
  287.  功    能 : 预约节目是否同时播出校验
  288.  入    口 : USHORT mjg-----------节目播出日期
  289.   int secs ------------节目播出起始秒
  290.  出    口 : int * nManiIdx------ 频道索引
  291.   int* nSubIdx ------- 节目索引
  292.  返    回 : TRUE---成功(有同时播出的节目,但不替换),FALSE---失败(没有相同或者已经替换掉)
  293. =============================================================*/
  294. BOOL  KB_CheckOnlyOne(USHORT mjg,int secs,int * nManiIdx,int* nSubIdx)
  295. {
  296. EPGDChlLink  *pp=EDTLink;
  297. EPGDEntLink *sp;
  298. EPGDEntLink *p1,*p2;
  299. register int nm=0,ns;
  300. //char *pszInfo;
  301. int nLangType;
  302. nLangType=KB_DBGetLanguageFlag();
  303. //搜索同日期同时播出的节目
  304. while(pp != NULL)
  305. {
  306. sp=pp->DmdEnt;
  307. ns=0;
  308. p1=sp;
  309. while(sp != NULL)
  310. {
  311. if((sp->mjd == mjg )&&(sp->seconds == secs))
  312. {
  313. *nManiIdx=nm;
  314. *nSubIdx=ns;
  315. //pszInfo=KB_GetLanguageInfoStr(nLangType,STR_BEIJING);//提示只能同时播一个节目
  316. //if(pszInfo != NULL)
  317. //nRet=D_OSD_MSGBox("冲突替换原有的吗?", MB_YESNO|MB_ICONINFORMATION, 0,IDNO);
  318. //if(nRet == IDNO) //不替换
  319. //return TRUE;
  320. //替换
  321. if(sp==pp->DmdEnt)
  322. {
  323.      pp->DmdEnt=sp->next;
  324. }
  325. else
  326. {
  327.      p2->next=p1->next;
  328. }
  329. KB_OSPFree(sp);
  330. return FALSE;//替换
  331. }
  332. ns++;
  333. sp = sp->next;
  334. if(p1->next!=NULL)
  335. {
  336. p2=p1;
  337. p1=p1->next;
  338. }
  339. }
  340. nm++;
  341. pp = pp->next;
  342. }
  343. //没有找到
  344. *nManiIdx=-1;
  345. *nSubIdx=-1;
  346. return FALSE;//无冲突
  347. }
  348. /*=============================================================
  349.  函数名称 : KB_GetDmdEntCount
  350.  功    能 : 获取预约节目总数目
  351.  入    口 : 无
  352.  出    口 : 无
  353.  返    回 : 预约节目总数
  354. =============================================================*/
  355. int  KB_GetDmdEntCount()
  356. {
  357. EPGDChlLink  *pp=EDTLink;
  358. EPGDEntLink *sp;
  359. register int i=0;
  360. while(pp!=NULL)
  361. {
  362. sp=pp->DmdEnt;
  363. while(sp!=NULL)
  364. {
  365. i++;
  366. sp=sp->next;
  367. }
  368. pp=pp->next;
  369. }
  370. return i;
  371. }
  372. /*=============================================================
  373.  函数名称 : KB_CheckOntimeDemand
  374.  功    能 : 检验出到时间的预约节目,然后提示用户
  375.  入    口 : 无
  376.  出    口 : 无
  377.  返    回 : TRUE---有,FALSE---没有
  378. =============================================================*/
  379.  BOOL KB_CheckOntimeDemand(int *chno,int*type,int*entid)
  380. {
  381. EPGDChlLink  *pp=EDTLink,*pq=NULL;
  382. EPGDEntLink *sp,*sq;
  383. time_t cur_seconds;
  384. int nYear, nMonth, nDay;
  385. int sCurWeekDay=0;
  386. //先获取当前时间
  387. KB_TimeGetCurTime(&cur_seconds);
  388. sCurWeekDay=ConvertTimeStampToDate((U32)cur_seconds, (U32 *)&nYear, (U32 *)&nMonth, (U32 *)&nDay);
  389. //检验前把所有今天之前预约的节目清除
  390. while(pp != NULL)
  391. {
  392. sp=pp->DmdEnt;
  393. sq=NULL;
  394. while(sp!=NULL)
  395. {
  396. //凡是预约日期小于当天日期的,全部清除
  397. if(sp->mjd<sCurWeekDay)
  398. {
  399. if(sq == NULL)
  400. {
  401. pp->DmdEnt=pp->DmdEnt->next;
  402. KB_OSPFree(sp);
  403. sp=pp->DmdEnt;
  404. }
  405. else
  406. {
  407. sq->next=sp->next;
  408. KB_OSPFree(sp);
  409. sp=sq->next;
  410. }
  411. }
  412. else if(sCurWeekDay==sp->mjd)
  413. {
  414. //当天如果已经被播放过,清除它
  415. if (cur_seconds >= sp->seconds+24)
  416. {
  417. if(sq == NULL)
  418. {
  419. pp->DmdEnt=pp->DmdEnt->next;
  420. KB_OSPFree(sp);
  421. sp=pp->DmdEnt;
  422. }
  423. else
  424. {
  425. sq->next=sp->next;
  426. KB_OSPFree(sp);
  427. sp=sq->next;
  428. }
  429. }
  430. else
  431. {
  432. sq=sp;
  433. sp=sp->next;
  434. }
  435. }
  436. else
  437. {
  438. sq=sp;
  439. sp=sp->next;
  440. }
  441. }
  442. //如果当前频道没有任何预约节目,清除该频道
  443. if(pp->DmdEnt == NULL)
  444. {
  445. if(pq == NULL)
  446. {
  447. EDTLink=EDTLink->next;
  448. KB_OSPFree(pp);
  449. pp=EDTLink;
  450. }
  451. else
  452. {
  453. pq->next=pp->next;
  454. KB_OSPFree(pp);
  455. pp=pq->next;
  456. }
  457. }
  458. else
  459. {
  460. pq =pp;
  461. pp=pp->next;
  462. }
  463. }
  464. //开始校验
  465. pq=EDTLink;
  466. while(pq != NULL)
  467. {
  468. sq=pq->DmdEnt;
  469. while(sq != NULL)
  470. {
  471. //持续秒
  472. //printf("n----left  time------%d",cur_seconds - sq->seconds);
  473. if ((cur_seconds >= (sq->seconds-30))&& (cur_seconds < sq->seconds) )
  474. {
  475. if(chno != NULL&&type!= NULL&&entid!= NULL)
  476. {
  477. *chno=pq->ProgIndex;
  478. *type=pq->edt;
  479. *entid=sq->eventid;
  480.   }
  481. return TRUE;
  482. }
  483. sq=sq->next;
  484. }
  485. pq=pq->next;
  486. }
  487. return FALSE;
  488. }
  489. /*=============================================================
  490.  函数名称 : KB_SaveDmdEnt
  491.  功    能 : 存储预约信息到NVM,前4个字节是操作标记,紧接着4个字节
  492.   放数据信息的大小,其次接着4个字节是频道数,每个频道的
  493.   数据信息前面4个字节存放当前频道预约节目个数,
  494. ---------------------------------------------------------------------------------
  495. | 标记 | 总数 | 频道 | 类型 | 节目 | 事件 | mjd | sec | dur | eid |
  496. |  | 据大 | 总数 |  | id  | 总数 | | | | |
  497. | 4b  | 小4b | 4b  | 4b  | 4b  | 4b  | 4b | 4b | 4b | 4b |
  498. --------------------------------------------------------------------------------- 
  499.  --------------------------------------------------------
  500.  | 类型 | 节目 | 事件 | mjd | sec | dur | eid |
  501.  |  | id  | 总数 | | | | |
  502.  | 4b  | 4b  | 4b  | 4b | 4b | 4b | 4b |
  503.  -------------------------------------------------------- 
  504.  --------------------------------------------------------
  505.  | 类型 | 节目 | 事件 | mjd | sec | dur | eid |
  506.  |  | id  | 总数 | | | | |
  507.  | 4b  | 4b  | 4b  | 4b | 4b | 4b | 4b |
  508.  -------------------------------------------------------- 
  509.  入    口 : 无
  510.  出    口 : 无
  511.  返    回 : OSD_RETURN_FAIL:失败,OSD_RETURN_OK:成功
  512. =============================================================*/
  513. int KB_SaveDmdEnt()
  514. {
  515. EPGDChlLink  *pp=EDTLink;
  516. EPGDEntLink *sp;
  517. char *debuf;
  518. UINT  nSize=12;
  519. int ret;
  520. int nchlsum=0,npgmsum,*pnde,*ppnde;
  521. //先计算数据信息的大小
  522. while(pp!= NULL)
  523. {
  524. nchlsum+=1;
  525. nSize+=8;
  526. sp=pp->DmdEnt;
  527. while(sp != NULL)
  528. {
  529. nSize+=16;
  530. sp=sp->next;
  531. }
  532. pp=pp->next;
  533. }
  534. //总字节数
  535. nSize+=nchlsum*4;
  536. debuf=(char*)KB_OSPMalloc(nSize);
  537. if(NULL==debuf)
  538. return OSD_RETURN_FAIL;
  539. memset(debuf,0x00,nSize);
  540. strcpy(debuf,EDHF_OPER_FLAG);
  541. //存储预约信息
  542. pnde=(int*)(debuf+4);
  543. pp=EDTLink;
  544. *(pnde++)=nSize;
  545. *(pnde++)=nchlsum;
  546. while(pp!= NULL)
  547. {
  548. *(pnde++)=pp->edt;
  549. *(pnde++)=pp->ProgIndex;
  550. sp=pp->DmdEnt;
  551. ppnde=pnde++;
  552. npgmsum=0;
  553. while(sp != NULL)
  554. {
  555. npgmsum+=1;
  556. *(pnde++)=(int)(sp->mjd&0x0000FFFF);
  557. *(pnde++)=(int)sp->seconds;
  558. *(pnde++)=(int)sp->duration;
  559. *(pnde++)=(int)(sp->eventid&0x0000FFFF);
  560. sp=sp->next;
  561. }
  562. *ppnde=npgmsum;
  563. pp=pp->next;
  564. }
  565. //写入NVM
  566. // ret=BQ_Storage_DmdEntSave((ULONG)nSize,debuf);
  567. KB_DBSaveDemandInfo(nSize, (UINT8 *)debuf );//存储到e2p
  568. KB_OSPFree(debuf);
  569. return ret;
  570. }
  571. /*=============================================================
  572.  函数名称 : KB_LoadDmdEnt
  573.  功    能 : 加载预约信息到预约结构
  574. ---------------------------------------------------------------------------------
  575. | 标记 | 总数 | 频道 | 类型 | 节目 | 事件 | mjd | sec | dur | eid |
  576. |  | 据大 | 总数 |  | id  | 总数 | | | | |
  577. | 4b  | 小4b | 4b  | 4b  | 4b  | 4b  | 4b | 4b | 4b | 4b |
  578. --------------------------------------------------------------------------------- 
  579.  --------------------------------------------------------
  580.  | 类型 | 节目 | 事件 | mjd | sec | dur | eid |
  581.  |  | id  | 总数 | | | | |
  582.  | 4b  | 4b  | 4b  | 4b | 4b | 4b | 4b |
  583.  -------------------------------------------------------- 
  584.  --------------------------------------------------------
  585.  | 类型 | 节目 | 事件 | mjd | sec | dur | eid |
  586.  |  | id  | 总数 | | | | |
  587.  | 4b  | 4b  | 4b  | 4b | 4b | 4b | 4b |
  588.  -------------------------------------------------------- 
  589.  入    口 : 无
  590.  出    口 : 无
  591.  返    回 : OSD_RETURN_FAIL:失败,OSD_RETURN_OK:成功
  592. =============================================================*/
  593. int KB_LoadDmdEnt()
  594. {
  595. char *debuf,head[9];
  596. UINT nSize;
  597. int *pnde;
  598. register int chlsum,i,j,npgmsum;
  599. int pi,sec,dur;
  600. USHORT mjd;
  601. short eventid;
  602. KB_DBRET ret;
  603. enumDemandType edt;
  604. EPGDChlLink  **pp;
  605. EPGDEntLink **sp;
  606. BOOL bFind;
  607. //先读取信息的总长度
  608. memset(head,0x00,9);
  609. ret=KB_DBGetDemandInfo(8,(UINT8 *)head);
  610. if(ret==RET_FAIL)
  611. return OSD_RETURN_FAIL;
  612. if(strncmp(head,EDHF_OPER_FLAG,4)!=0)
  613. return OSD_RETURN_FAIL;
  614. pnde=(int*)head;
  615. nSize=*(pnde+1);
  616. //分配信息内存
  617. debuf=(char*)KB_OSPMalloc(nSize);
  618. if(NULL == debuf)
  619. return OSD_RETURN_FAIL;
  620. memset(debuf,0x00,nSize);
  621. //读取信息
  622. ret=KB_DBGetDemandInfo(nSize,(UINT8 *)debuf);
  623. if(ret==RET_FAIL)
  624. {
  625. KB_OSPFree(debuf);
  626. return OSD_RETURN_FAIL;
  627. }
  628. pnde=(int*)(debuf+8);
  629. chlsum=*(pnde++);
  630. for(i=0;i<chlsum;i++)
  631. {
  632. edt=*(pnde++);
  633. pi=*(pnde++);
  634. pp=&EDTLink;
  635. bFind=FALSE;
  636. //添加预约项
  637. //搜索到到指定的频道,如果没有添加指定频道
  638. while(*pp != NULL)
  639. {
  640. if((*pp)->ProgIndex == pi)
  641. {
  642. bFind = TRUE;
  643. break;
  644. }
  645. pp = &((*pp)->next);
  646. }
  647. //没有找到
  648. if(!bFind)
  649. {
  650. //先添加频道
  651. *pp=(EPGDChlLink*)KB_OSPMalloc(sizeof(EPGDChlLink));
  652. if(*pp == NULL)
  653. {
  654. printf("nEPG节目预约内存分配失败!");
  655. KB_OSPFree(debuf);
  656. return OSD_RETURN_FAIL;
  657. }
  658. memset(*pp,0x00,sizeof(EPGDChlLink));
  659. (*pp)->edt=edt;
  660. (*pp)->ProgIndex = pi;
  661. }
  662. npgmsum=*(pnde++);
  663. for(j=0;j<npgmsum;j++)
  664. {
  665. mjd=(USHORT)(*(pnde++)&0xFFFF);
  666. sec=*(pnde++);
  667. dur=*(pnde++);
  668. eventid=(short)(*(pnde++)&0xFFFF);
  669. //搜索到预约节目
  670. bFind=FALSE;
  671. sp=&((*pp)->DmdEnt);
  672. while(*sp != NULL)
  673. {
  674. if((*sp)->mjd == mjd &&(*sp)->seconds == sec&&(*sp)->eventid==eventid)
  675. {
  676. bFind = TRUE;
  677. break;
  678. }
  679. sp = &((*sp)->next);
  680. }
  681. //如果找到,说明已经被添加
  682. if(bFind)
  683. {
  684. continue;
  685. }
  686. //添加预约节目
  687. *sp=(EPGDEntLink*)KB_OSPMalloc(sizeof(EPGDEntLink));
  688. if(*sp == NULL)
  689. {
  690. printf("nEPG节目预约内存分配失败!");
  691. KB_OSPFree(debuf);
  692. return OSD_RETURN_FAIL;
  693. }
  694. memset(*sp,0x00,sizeof(EPGDEntLink));
  695. (*sp)->seconds=sec;
  696. (*sp)->mjd=mjd;
  697. (*sp)->duration=dur;
  698. (*sp)->eventid=eventid;
  699. (*sp)->next=NULL;
  700. }
  701. }
  702. KB_OSPFree(debuf);
  703. return OSD_RETURN_OK;
  704. }
  705. /*=============================================================
  706.  函数名称 : KB_AddDmdEnt
  707.  功    能 : 预约节目
  708.  入    口 : int nChlNo----------频道索引号
  709.   int nent------------事件索引号
  710.   int  nWeekCurTab----预约日期
  711.  出    口 : 无
  712.  返    回 : OSD_RETURN_OK---成功,OSD_RETURN_FAIL---失败
  713. =============================================================*/
  714.  int KB_AddDmdEnt(int nChlNo,int nent,int  nWeekCurTab,int Evntid,int type)
  715. {
  716. EPGDChlLink  **pp=&EDTLink;
  717. EPGDEntLink **sp;
  718. //EPGDEntLink **p1,**p2;
  719. BOOL bFind=FALSE;
  720. time_t cur_seconds,start_time,duration_time;
  721. KB_SIEitSchEvent po;
  722. //U32 year, month, day;
  723. //USHORT po_MJD;
  724. int sum;
  725. //UINT nRet=IDYES;
  726. int nLangType;
  727. //char *pszInfo;
  728. //BOOL displace_order;
  729. KB_EPGDayInfo *dateinfo;
  730. int ncurday=0;
  731. //int nYear, nMonth, nDay;
  732.        KB_NVODStruct       *curNvodNodeHead;
  733.     unsigned long fre, sym;
  734. unsigned char qam;
  735. UINT16 tsid;
  736. nLangType=KB_DBGetLanguageFlag();
  737. KB_TimeGetCurTime(&cur_seconds);
  738. if(type==DT_EPG)
  739. {
  740. KB_DBGetChnlInfoByPrgNO(DTVPRG, nChlNo+1, &fre, &sym, &qam);
  741. KB_DBGetTsIDByFre(&tsid, fre/100000);
  742. dateinfo= KB_EPGGetSchInfo(tsid, KB_DBGetSvcIDByNO(DTVPRG, nChlNo),nWeekCurTab);
  743. po =dateinfo->ptEvent[nent];
  744. start_time=po.start_time;
  745. duration_time=po.duration;
  746. ncurday=nWeekCurTab;
  747. Evntid=nent;
  748. }
  749. if(type==DT_NVOD)
  750. {  
  751. curNvodNodeHead=KB_NVOD_GetTsIndexFromCur(nChlNo);
  752. start_time=curNvodNodeHead->TimeNode[nent].startTime;
  753. duration_time=curNvodNodeHead->durTime;
  754. Evntid=-1;
  755. }
  756. if(type==DT_MANAGE)
  757. {
  758. start_time=nent;
  759. ncurday=nWeekCurTab;
  760. }
  761. //printf("nshengyushijian----%d",cur_seconds - start_time);
  762. //当天当时以后的节目都可以预约
  763.        //printf("n[KB_AddDmdEnt]: cur_seconds=%ld,start_time=%ld,nent=%ld",cur_seconds,start_time,nent);
  764. //cur_seconds-=100000;
  765. if (cur_seconds >= Time_2_Local_Tiem(start_time))
  766. {
  767. #if 0 //在老版本的代码中打开这段代码
  768. pszInfo=KB_GetLanguageInfoStr(nLangType,STR_SYSSETTING);
  769. if(pszInfo != NULL)
  770.     D_OSD_MSGBox("已经过时", MB_OK|MB_ICONINFORMATION, 0,IDOK);
  771. #endif
  772. return OSD_RETURN_FAIL;
  773. }
  774. //在老版本的代码中打开这段代码,用于检测是否有冲突预定节目并判断是否替换
  775. #if 0
  776. //同时播出校验
  777. displace_order=KB_CheckOnlyOne((USHORT)nWeekCurTab,start_time,&nm,&ns);
  778. if (displace_order==TRUE)
  779. {
  780. printf("n有相同,但不替换");
  781. return OSD_RETURN_FAIL;
  782. }
  783. #endif
  784. sum=KB_GetDmdEntCount();
  785. if(sum>=10)
  786. {
  787.        #if 0//在老版本代码中打开
  788. pszInfo=KB_GetLanguageInfoStr(nLangType,STR_SYSSETTING);
  789. if(pszInfo != NULL)
  790. D_OSD_MSGBox("已经满10个", MB_OK, 0,IDOK);
  791. #endif
  792. return OSD_RETURN_FAIL;
  793. }
  794. //添加
  795. while(*pp != NULL)
  796. {
  797. if(type==DT_MANAGE)
  798. type=(*pp)->edt;
  799. if((*pp)->ProgIndex == nChlNo&&(*pp)->edt==type)
  800. {
  801. bFind = TRUE;
  802. //printf("n-----------find the same chl");
  803. break;
  804. }
  805. pp = &((*pp)->next);
  806. }
  807. //没有找到相同的频道
  808. if(!bFind)
  809. {
  810. //先添加频道
  811. *pp=(EPGDChlLink*)KB_OSPMalloc(sizeof(EPGDChlLink));
  812. if(*pp == NULL)
  813. {
  814. printf("nEPG节目预约内存分配失败!");
  815. return OSD_RETURN_FAIL;
  816. }
  817. memset(*pp,0x00,sizeof(EPGDChlLink));
  818. (*pp)->edt=type;
  819. (*pp)->ProgIndex = nChlNo;
  820. //printf("n--------no--find ");
  821. }
  822. sp=&((*pp)->DmdEnt);
  823. //搜索到预约节目的末尾
  824. bFind=FALSE;
  825. while(*sp != NULL)
  826. {
  827. if((*sp)->seconds == start_time)
  828. {
  829. bFind = TRUE;
  830. printf("n---------find event");
  831. break;
  832. }
  833. sp = &((*sp)->next);
  834. }
  835. //如果找到,说明已经被预约
  836. if(bFind)
  837. {
  838. //pszInfo=KB_GetLanguageInfoStr(nLangType,STR_SYSSETTING);
  839. #if 0//在老版本代码中打开
  840. if(pszInfo != NULL)
  841. D_OSD_MSGBox("已经被预约", MB_OK|MB_ICONINFORMATION, 0,IDOK);
  842.               #endif
  843. return OSD_RETURN_FAIL;
  844. }
  845. //添加预约节目
  846. *sp=(EPGDEntLink*)KB_OSPMalloc(sizeof(EPGDEntLink));
  847. if(*sp == NULL)
  848. {
  849. printf("nEPG节目预约内存分配失败!");
  850. return OSD_RETURN_FAIL;
  851. }
  852. memset(*sp,0x00,sizeof(EPGDEntLink));
  853. (*sp)->seconds=start_time;
  854. (*sp)->duration=duration_time;
  855. (*sp)->mjd=(USHORT)ncurday;
  856. (*sp)->eventid=Evntid;
  857. (*sp)->next=NULL;
  858. return OSD_RETURN_OK;
  859. }
  860. /*=============================================================
  861.  函数名称 : KB_DelDmdEnt
  862.  功    能 : 取消预约
  863.  入    口 : int nChlNo----------频道索引号
  864.   int nent-----------事件索引号
  865.    int  nWeekCurTab----预约日期
  866.  出    口 : 无
  867.  返    回 : OSD_RETURN_OK---成功,OSD_RETURN_FAIL---失败
  868. =============================================================*/
  869.  int KB_DelDmdEnt(int nChlNo,int nent,int nWeekCurTab ,int type)
  870. {
  871. EPGDChlLink  *pp=EDTLink,*pq=NULL;
  872. EPGDEntLink *sp,*sq;
  873. BOOL bFind=FALSE;
  874. //int seconds,dtv_type;
  875. KB_EPGDayInfo *dateinfo;
  876. KB_SIEitSchEvent po;
  877. KB_NVODStruct       *curNvodNodeHead;
  878.    time_t cur_seconds,start_time;
  879.    int ncurday,nYear, nMonth, nDay;
  880. unsigned long fre, sym;
  881. unsigned char qam;
  882. UINT16 tsid;   
  883.    
  884. //printf("n-----------------del");
  885. if(type==DT_EPG)
  886. {
  887. KB_DBGetChnlInfoByPrgNO(DTVPRG, nChlNo+1, &fre, &sym, &qam);
  888. KB_DBGetTsIDByFre(&tsid, fre/100000);
  889. dateinfo= KB_EPGGetSchInfo(tsid, KB_DBGetSvcIDByNO(DTVPRG, nChlNo),nWeekCurTab);
  890. po =dateinfo->ptEvent[nent];
  891. ncurday=nWeekCurTab;
  892. start_time=po.start_time;
  893. }
  894. if(type==DT_NVOD)
  895. {
  896. KB_TimeGetCurTime(&cur_seconds);
  897. ncurday=ConvertTimeStampToDate((U32)cur_seconds, (U32 *)&nYear, (U32 *)&nMonth, (U32 *)&nDay);
  898. curNvodNodeHead=KB_NVOD_GetTsIndexFromCur(nChlNo);
  899. start_time=curNvodNodeHead->TimeNode[nent].startTime;
  900. }
  901. if(type==DT_MANAGE)
  902. {
  903. ncurday=nWeekCurTab;
  904. start_time=nent;
  905. }
  906. //搜查指定频道,如果指定频道没有预定节目,清除此频道
  907. while(pp != NULL)
  908. {
  909. if(type==DT_MANAGE)
  910.         type=pp->edt;
  911. if(pp->ProgIndex ==nChlNo&&pp->edt==type)
  912. {
  913. bFind=TRUE;
  914. break;
  915. }
  916. pq=pp;
  917. pp =pp->next;
  918. }
  919. //没有找到,并且是第一个节点,而且还是没有节目
  920. //删除它
  921. if(!bFind)
  922. {
  923. if(pq == NULL && pp->DmdEnt==NULL)
  924. {
  925. EDTLink=EDTLink->next;
  926. KB_OSPFree(pp);
  927. }
  928. return OSD_RETURN_OK;
  929. }
  930. sp=pp->DmdEnt;
  931. sq =NULL;
  932. bFind=FALSE;
  933. //搜索指定的预约节目
  934. while(sp != NULL)
  935. {
  936. if(sp->mjd== ncurday && sp->seconds==start_time)
  937. {
  938. bFind=TRUE;
  939. break;
  940. }
  941. sq =sp;
  942. sp=sp->next;
  943. }
  944. //找到,释放,如果频道没有预约节目,释放频道
  945. if(bFind)
  946. {
  947. if(sq == NULL)
  948. pp->DmdEnt=pp->DmdEnt->next;
  949. else
  950. sq->next=sp->next;
  951. KB_OSPFree(sp);
  952. if(pp->DmdEnt == NULL)
  953. {
  954. if(pq==NULL)
  955. EDTLink=EDTLink->next;
  956. else
  957. pq->next=pp->next;
  958. KB_OSPFree(pp);
  959. }
  960. }
  961. return OSD_RETURN_OK;
  962. }
  963. /*=============================================================
  964.  函数名称 : KB_CheckDmdEnt
  965.  功    能 : 预约校验,检查该事件是否预约
  966.  入    口 : int nChlNo----------频道索引号
  967.   int nent-----------事件索引号
  968.    int  nWeekCurTab----预约日期//NVOD时无效
  969. int type---------------类别
  970.  出    口 : 无
  971.  返    回 : TRUE---预约,FALSE---没有预约
  972. =============================================================*/
  973.  BOOL KB_CheckDmdEnt(int nChlNo,int nent,int  nWeekCurTab,int type)
  974. {
  975. EPGDChlLink  *pp=EDTLink;
  976. EPGDEntLink *sp;
  977. BOOL bFind=FALSE;
  978. int seconds;
  979. KB_EPGDayInfo *dateinfo;
  980. KB_SIEitSchEvent po;
  981. KB_NVODStruct       *curNvodNodeHead;
  982.    time_t cur_seconds;
  983.    int ncurday,nYear, nMonth, nDay;
  984. unsigned long fre, sym;
  985. unsigned char qam;
  986. UINT16 tsid;
  987.    
  988. if(type==DT_EPG)
  989. {
  990. KB_DBGetChnlInfoByPrgNO(DTVPRG, nChlNo+1, &fre, &sym, &qam);
  991. KB_DBGetTsIDByFre(&tsid, fre/100000);
  992. dateinfo= KB_EPGGetSchInfo(tsid, KB_DBGetSvcIDByNO(DTVPRG, nChlNo),nWeekCurTab);
  993. po =dateinfo->ptEvent[nent];
  994. ncurday=nWeekCurTab;
  995. seconds=(int)po.start_time;
  996. }
  997. if(type==DT_NVOD)
  998.   {
  999. KB_TimeGetCurTime(&cur_seconds);
  1000. ncurday=ConvertTimeStampToDate((U32)cur_seconds, (U32 *)&nYear, (U32 *)&nMonth, (U32 *)&nDay);
  1001. curNvodNodeHead=KB_NVOD_GetTsIndexFromCur(nChlNo);
  1002. seconds = (int)curNvodNodeHead->TimeNode[nent].startTime;
  1003.   }
  1004.   if(type==DT_MANAGE)
  1005.   {
  1006.   seconds=nent;
  1007.   ncurday=nWeekCurTab;
  1008.   }
  1009. //搜查指定频道,如果指定频道没有预定节目,清除此频道
  1010. while(pp != NULL)
  1011. {
  1012. if(type==DT_MANAGE)
  1013. type=pp->edt;
  1014. if(pp->ProgIndex == nChlNo&&pp->edt==type)
  1015. {
  1016. bFind=TRUE;
  1017. break;
  1018. }
  1019. pp =pp->next;
  1020. }
  1021. //没有找到,返回
  1022. if(!bFind)
  1023. return FALSE;
  1024. //搜索指定的预约节目
  1025. sp=pp->DmdEnt;
  1026. while(sp != NULL)
  1027. {
  1028. if(sp->mjd==ncurday && sp->seconds == seconds)
  1029. {
  1030. return TRUE;
  1031. }
  1032. sp=sp->next;
  1033. }
  1034. return FALSE;
  1035. }
  1036. //added by whale 07/06/08 start
  1037. /*=============================================================
  1038.  函数名称 : KB_CreatDmdDataLink
  1039.  功    能 : 预约管理列表内容初始化
  1040.  入    口 : BOOL bOnTime------显示标志(TRUE:所有预约到时节目,FALSE:所有预约节目)
  1041.   BOOL bNoList------没有列表显示
  1042.  出    口 : 无
  1043.  返    回 : OSD_RETURN_OK---成功,OSD_RETURN_FAIL---失败
  1044. =============================================================*/
  1045. int KB_CreatDmdDataLink(void)
  1046. {
  1047. time_t cur_seconds;
  1048. int nYear, nMonth, nDay,nHour,nMinute,nSec;
  1049. EPGDChlLink  *pq=EDTLink;
  1050. EPGDEntLink *sq;
  1051. //int nRet,si=0;
  1052. char strname[50],*pszName;
  1053. U32 nLocalTime;
  1054. KB_EPGDayInfo * pEPGInfo;
  1055. KB_SIEitSchEvent po;
  1056. KB_NVODStruct *curNvodNodeHead;
  1057. int nLangType;
  1058. int i=0,sCurWeekDay=0;
  1059. //added by yyj 2007.6.11
  1060.        EPGDDataLink demanddata;
  1061. unsigned long fre, sym;
  1062. unsigned char qam;
  1063. UINT16 tsid;
  1064. nLangType=KB_DBGetLanguageFlag();
  1065. //先获取当前时间
  1066. KB_TimeGetCurTime(&cur_seconds);
  1067. //printf("n[KB_CreatDmdDataLink]:cur_seconds=%ld",cur_seconds);
  1068. sCurWeekDay=ConvertTimeStampToDate((U32)cur_seconds, (U32 *)&nYear, (U32 *)&nMonth, (U32 *)&nDay);
  1069.       // printf("n[KB_CreatDmdDataLink]:sCurWeekDay=%d",sCurWeekDay);
  1070. KB_ClearDataLink();
  1071. while(pq != NULL)
  1072. {
  1073. sq=pq->DmdEnt;
  1074. if(pq->edt == DT_EPG)
  1075. {
  1076. //pEPGInfo =KB_EPGGetSchInfo(KB_DBGetSvcIDByNO(DTVPRG, pq->ProgIndex), pq->DmdEnt->mjd);
  1077. KB_DBGetChnlInfoByPrgNO(DTVPRG, pq->ProgIndex+1, &fre, &sym, &qam);
  1078. KB_DBGetTsIDByFre(&tsid, fre/100000);
  1079. pEPGInfo=KB_EPGGetSchInfo(tsid, KB_DBGetSvcIDByNO(DTVPRG, pq->ProgIndex),pq->DmdEnt->mjd);
  1080. }
  1081. else
  1082. {   
  1083. curNvodNodeHead=KB_NVOD_GetTsIndexFromCur(pq->ProgIndex);
  1084. }
  1085. while(sq != NULL)
  1086. {
  1087. if(pq->edt == DT_EPG)
  1088. {
  1089. po=pEPGInfo->ptEvent[sq->eventid];
  1090. }
  1091. {
  1092. //设置0单元频道名称
  1093. if(pq->edt == DT_EPG)
  1094. {
  1095. if(pq->ProgIndex<0)
  1096. ;
  1097. else
  1098. {
  1099. pszName=(char *)KB_DBGetPrgName(DTVPRG,pq->ProgIndex+1);
  1100. memset(strname,0x00,50);
  1101. sprintf(strname,"%02d%s",++i,pszName);
  1102. if(strname!=NULL)
  1103. printf("-=频道名称:%s=-n", strname);
  1104.                             strcpy(demanddata.chlname, strname);
  1105.       /*
  1106.      if(strname!=NULL)
  1107.             nRet= AddListViewItem(&hEDHFlv,demanddata.chlname);
  1108.      if(-1 == nRet)
  1109.     {
  1110.    printf("n添加预约节目列表项0失败!");
  1111.    return OSD_RETURN_FAIL;
  1112.     }
  1113.     */
  1114. }
  1115. }
  1116. else
  1117. {
  1118. memset(strname,0x00,50);
  1119. sprintf(strname,"%02d%s",++i,"NVOD");
  1120. printf("-=频道名称:%s=-n", strname);
  1121. strcpy(demanddata.chlname, strname);
  1122. /*
  1123. nRet= AddListViewItem(&hEDHFlv,strname);
  1124.                              if(-1 == nRet)
  1125.  {
  1126.    printf("n添加预约节目列表项0失败!");
  1127.    return OSD_RETURN_FAIL;
  1128.  }
  1129.  */
  1130. }
  1131. nLocalTime = (U32)Time_2_Local_Tiem(sq->seconds);
  1132. //printf("n[KB_CreatDmdDataLink]:nLocalTime=%ld,sq->seconds=%ld",nLocalTime,sq->seconds);
  1133. //节目播放日期
  1134. ConvertTimeStampToDate(nLocalTime, (U32 *)&nYear, (U32 *)&nMonth, (U32 *)&nDay);
  1135. memset(demanddata.date,0x00,20);
  1136.          sprintf(demanddata.date,"%04d-%02d-%02d",nYear, nMonth, nDay);
  1137. printf("n[KB_CreatDmdDataLink]:date=%sn",demanddata.date);  
  1138. //节目播放时间
  1139. ConvertTimeStampToTime(nLocalTime,( U32 * )&nHour, (U32 *)&nMinute, (U32 *)&nSec);
  1140. memset(demanddata.time,0x00,20);
  1141. sprintf(demanddata.time,"%02d:%02d",nHour, nMinute);
  1142. printf("n[KB_CreatDmdDataLink]:time=%sn",demanddata.time);
  1143. //memset(str,0x00,50);
  1144. //sprintf(str,"%04ld-%02ld-%02ld %02d:%02d",nYear,nMonth,nDay,nHour,nMinute);
  1145. /*
  1146. //设置1单元节目播放时间
  1147. sprintf(str,"%s %s",demanddata.date,demanddata.time);
  1148. printf("n[KB_CreatDmdDataLink]:str=%s",str);
  1149. if(strlen(str)<=0)
  1150. nRet = SetLVItemText(&hEDHFlv,nRet,1,"---");
  1151. else
  1152. nRet = SetLVItemText(&hEDHFlv,nRet,1,str);
  1153. if(-1 == nRet)
  1154. {
  1155. printf("n添加预约节目列表项1失败!");
  1156. return OSD_RETURN_FAIL;
  1157. }
  1158. */
  1159.        //设置2单元频道名称
  1160. if(pq->edt == DT_EPG)
  1161. {
  1162. memset(strname,0x00,50);
  1163. sprintf(strname,"%s",(char*)po.chinese.event_name);
  1164. if(strlen((char*)po.chinese.event_name)>0)
  1165. printf("-=epg节目名称:%s=-n", strname);
  1166. strcpy(demanddata.prgname, strname);
  1167. /*
  1168. if(strlen((char*)po.chinese.event_name)>0)
  1169.            nRet= SetLVItemText(&hEDHFlv,nRet,2,demanddata.prgname);
  1170.        else
  1171.            nRet= SetLVItemText(&hEDHFlv,nRet,2,"- - -");
  1172.                      if(-1 == nRet)
  1173.        {
  1174.    printf("n添加预约节目列表项2失败!");
  1175.    return OSD_RETURN_FAIL;
  1176. }
  1177. */
  1178. }
  1179. else
  1180. {
  1181. memset(strname,0x00,50);
  1182. sprintf(strname,"%s",(char*)curNvodNodeHead->PrgName);
  1183. if(strlen((char*)curNvodNodeHead->PrgName)>0)
  1184. printf("-=nvod节目名称:%s=-n", strname);
  1185. strcpy(demanddata.prgname, strname);
  1186. /*
  1187.        if(strlen((char*)curNvodNodeHead.PrgName)>0)
  1188.            nRet= SetLVItemText(&hEDHFlv,nRet,2,demanddata.prgname);
  1189.        else
  1190.            nRet= SetLVItemText(&hEDHFlv,nRet,2,"- - -");
  1191.                      if(-1 == nRet)
  1192.        {
  1193.    printf("n添加预约节目列表项2失败!");
  1194.    return OSD_RETURN_FAIL;
  1195. }
  1196. */
  1197. }
  1198.               #if 0
  1199. if(!KB_AddDataLink(pq->ProgIndex,sq->eventid, sq->mjd,sq->seconds,sq->duration,pq->edt))
  1200. continue;
  1201. #else
  1202.        if(!KB_AddDataLink(&demanddata))
  1203. continue;
  1204. #endif
  1205. }
  1206. sq=sq->next;
  1207. }
  1208. pq=pq->next;
  1209. }
  1210. return OSD_RETURN_OK;
  1211. }
  1212. //added by whale 07/06/08 end
  1213. //added by yyj 2007.7.3 start
  1214. /*=============================================================
  1215.  函数名称 : KB_ClearAllDmdEnt
  1216.  功    能 : 清除预约链表中的所有节目
  1217.  入    口 : 无
  1218.  出    口 : 无
  1219.  返    回 : 无
  1220. =============================================================*/
  1221. void KB_ClearAllDmdEnt(void)
  1222. {
  1223. EPGDChlLink  *pp=EDTLink,*pq=NULL;
  1224. while(pp != NULL)
  1225. {
  1226.     pq = pp->next;
  1227.     while(pp->DmdEnt!=NULL)
  1228.     {
  1229.          pq->DmdEnt = pp->DmdEnt->next;
  1230.          KB_OSPFree(pp->DmdEnt);
  1231.   pp->DmdEnt = pq->DmdEnt;
  1232.     }
  1233.     KB_OSPFree(pp);
  1234.     pp = pq;
  1235. }
  1236.        EDTLink = NULL;
  1237. }
  1238. //added by yyj 2007.7.3 end
  1239. //added by yyj 2007.7.4 start
  1240. /*=============================================================
  1241.  函数名称 : KB_CheckConfilictDmdEnt
  1242.  功    能 : 检测预约节目是否同时播出
  1243.  入    口 : USHORT mjg-----------节目播出日期
  1244.   int nChlNo----------节目频道号
  1245.   int nent-------------事件索引号
  1246.   int type------------节目类型
  1247.  出    口 : int * nManiIdx------ 频道索引
  1248.   int* nSubIdx ------- 节目索引
  1249.  返    回 : DEMAND_PGM_OVERTIME----预约节目过时
  1250.                    DEMAND_PGM_CONFLICT----有冲突的预定节目
  1251.                    DEMAND_PGM_NO_CONFLICT----没有冲突的预定节目
  1252. =============================================================*/
  1253. BOOL KB_CheckConfilictDmdEnt(USHORT mjg,int nChlNo,int nent,int * nManiIdx,int* nSubIdx,int type)
  1254. {
  1255. EPGDChlLink  *pp=EDTLink;
  1256. EPGDEntLink *sp;
  1257. register int nm=0,ns;
  1258. //char *pszInfo;
  1259. int nLangType;
  1260. time_t cur_seconds,start_time,duration_time;
  1261. KB_EPGDayInfo *dateinfo;
  1262. KB_SIEitSchEvent po;
  1263. int ncurday=0;
  1264. KB_NVODStruct       *curNvodNodeHead;
  1265. unsigned long fre, sym;
  1266. unsigned char qam;
  1267. UINT16 tsid;
  1268. //UINT8 sum;
  1269. nLangType=KB_DBGetLanguageFlag();
  1270. KB_TimeGetCurTime(&cur_seconds);
  1271. if(type==DT_EPG)
  1272. {
  1273.        KB_DBGetChnlInfoByPrgNO(DTVPRG, nChlNo+1, &fre, &sym, &qam);
  1274. KB_DBGetTsIDByFre(&tsid, fre/100000);
  1275. dateinfo= KB_EPGGetSchInfo(tsid, KB_DBGetSvcIDByNO(DTVPRG, nChlNo),mjg);
  1276. po =dateinfo->ptEvent[nent];
  1277. start_time=po.start_time;
  1278. duration_time=po.duration;
  1279. ncurday=mjg;
  1280. //Evntid=nent;
  1281. }
  1282. if(type==DT_NVOD)
  1283. {  
  1284. curNvodNodeHead=KB_NVOD_GetTsIndexFromCur(nChlNo);
  1285. start_time=curNvodNodeHead->TimeNode[nent].startTime;
  1286. duration_time=curNvodNodeHead->durTime;
  1287. //Evntid=-1;
  1288. }
  1289. if(type==DT_MANAGE)
  1290. {
  1291. start_time=nent;
  1292. ncurday=mjg;
  1293. }
  1294.    
  1295. if (cur_seconds >= Time_2_Local_Tiem(start_time))
  1296. {
  1297.        printf("n预定节目过时!");
  1298. return DEMAND_PGM_OVERTIME;
  1299. }
  1300. //搜索同日期同时播出的节目
  1301. while(pp != NULL)
  1302. {
  1303. sp=pp->DmdEnt;
  1304. ns=0;
  1305. while(sp != NULL)
  1306. {
  1307. if((sp->mjd == mjg )&&(sp->seconds == start_time))
  1308. {
  1309. *nManiIdx=nm;
  1310. *nSubIdx=ns;
  1311.  return DEMAND_PGM_CONFLICT;//有冲突的预定节目
  1312. }
  1313. ns++;
  1314. sp = sp->next;
  1315. }
  1316. nm++;
  1317. pp = pp->next;
  1318. }
  1319. //没有找到
  1320. *nManiIdx=-1;
  1321. *nSubIdx=-1;
  1322. return DEMAND_PGM_NO_CONFLICT;//没有冲突的预定节目
  1323. }
  1324. /*=============================================================
  1325.  函数名称 : KB_DelConfilictDmdEnt
  1326.  功    能 : 删除同时播出的预约节目
  1327.  入    口 : USHORT mjg-----------节目播出日期
  1328.   int nChlNo----------节目频道号
  1329.   int nent-------------事件索引号
  1330.   int type------------节目类型
  1331.  出    口 : int * nManiIdx------ 频道索引
  1332.   int* nSubIdx ------- 节目索引
  1333.  返    回 : TRUE---成功(删除冲突的预约节目),FALSE---失败(没有冲突节目)
  1334. =============================================================*/
  1335. BOOL KB_DelConfilictDmdEnt(USHORT mjg,int nChlNo,int nent,int * nManiIdx,int* nSubIdx,int type)
  1336. {
  1337. EPGDChlLink  *pp=EDTLink;
  1338. EPGDEntLink *sp;
  1339. EPGDEntLink *p1,*p2;
  1340. register int nm=0,ns;
  1341. //char *pszInfo;
  1342. int nLangType;
  1343. time_t cur_seconds,start_time,duration_time;
  1344. KB_EPGDayInfo *dateinfo;
  1345. KB_SIEitSchEvent po;
  1346. int ncurday=0;
  1347. KB_NVODStruct       *curNvodNodeHead;
  1348. unsigned long fre, sym;
  1349. unsigned char qam;
  1350. UINT16 tsid;
  1351. nLangType=KB_DBGetLanguageFlag();
  1352. KB_TimeGetCurTime(&cur_seconds);
  1353. if(type==DT_EPG)
  1354. {
  1355.        KB_DBGetChnlInfoByPrgNO(DTVPRG, nChlNo+1, &fre, &sym, &qam);
  1356. KB_DBGetTsIDByFre(&tsid, fre/100000);
  1357. dateinfo= KB_EPGGetSchInfo(tsid, KB_DBGetSvcIDByNO(DTVPRG, nChlNo),mjg);
  1358. po =dateinfo->ptEvent[nent];
  1359. start_time=po.start_time;
  1360. duration_time=po.duration;
  1361. ncurday=mjg;
  1362. //Evntid=nent;
  1363. }
  1364. if(type==DT_NVOD)
  1365. {  
  1366. curNvodNodeHead=KB_NVOD_GetTsIndexFromCur(nChlNo);
  1367. start_time=curNvodNodeHead->TimeNode[nent].startTime;
  1368. duration_time=curNvodNodeHead->durTime;
  1369. //Evntid=-1;
  1370. }
  1371. if(type==DT_MANAGE)
  1372. {
  1373. start_time=nent;
  1374. ncurday=mjg;
  1375. }
  1376. while(pp != NULL)
  1377. {
  1378. sp=pp->DmdEnt;
  1379. ns=0;
  1380. p1=sp;
  1381. while(sp != NULL)
  1382. {
  1383. if((sp->mjd == mjg )&&(sp->seconds == start_time))
  1384. {
  1385. *nManiIdx=nm;
  1386. *nSubIdx=ns;
  1387. //删除冲突节目
  1388. if(sp==pp->DmdEnt)
  1389. {
  1390.      pp->DmdEnt=sp->next;
  1391. }
  1392. else
  1393. {
  1394.      p2->next=p1->next;
  1395. }
  1396. KB_OSPFree(sp);
  1397. return TRUE;//删除冲突节目
  1398. }
  1399. ns++;
  1400. sp = sp->next;
  1401. if(p1->next!=NULL)
  1402. {
  1403. p2=p1;
  1404. p1=p1->next;
  1405. }
  1406. }
  1407. nm++;
  1408. pp = pp->next;
  1409. }
  1410. //没有找到
  1411. *nManiIdx=-1;
  1412. *nSubIdx=-1;
  1413. return FALSE;//无相同
  1414. }
  1415. //added by yyj 2007.7.4 end