asx.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: asx.c 346 2005-11-21 22:20:40Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "../common.h"
  24. #include "asx.h"
  25. static const guid ASFHeader = { 0x75B22630, 0x668E, 0x11CF, { 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }};
  26. static int ReadListRef(playlist* p,tchar_t* Path,int PathLen,tchar_t* DispName,int DispNameLen,tick_t* Length)
  27. {
  28. int i;
  29. tchar_t s[MAXLINE];
  30. DispName[0] = 0;
  31. *Length = -1;
  32. while (ParserLine(&p->Parser,s,MAXLINE))
  33. {
  34. tcsuprto(s,'=');
  35. if (stscanf(s,T("REF%d ="),&i)==1)
  36. {
  37. tchar_t* p = tcschr(s,'=');
  38. if (p++)
  39. {
  40. while (IsSpace(*p)) ++p;
  41. tcscpy_s(Path,PathLen,p);
  42. return ERR_NONE;
  43. }
  44. }
  45. }
  46. return ERR_END_OF_FILE;
  47. }
  48. static int ReadList(playlist* p,tchar_t* Path,int PathLen,tchar_t* DispName,int DispNameLen,tick_t* Length)
  49. {
  50. tchar_t Token[MAXTOKEN];
  51. Path[0] = 0;
  52. DispName[0] = 0;
  53. *Length = -1;
  54. while (ParserIsElement(&p->Parser,Token,MAXTOKEN))
  55. {
  56. if (tcsicmp(Token,T("/ENTRY"))==0)
  57. {
  58. if (Path[0])
  59. return ERR_NONE;
  60. DispName[0] = 0;
  61. }
  62. else
  63. if (tcsicmp(Token,T("TITLE"))==0)
  64. ParserElementContent(&p->Parser,DispName,DispNameLen);
  65. else
  66. if (tcsicmp(Token,T("REF"))==0 && !Path[0])
  67. {
  68. while (ParserIsAttrib(&p->Parser,Token,MAXTOKEN))
  69. {
  70. if (tcsicmp(Token,T("HREF"))==0)
  71. ParserAttribString(&p->Parser,Path,PathLen);
  72. else
  73. ParserAttribSkip(&p->Parser);
  74. }
  75. }
  76. else
  77. ParserElementSkip(&p->Parser);
  78. }
  79. return ERR_END_OF_FILE;
  80. }
  81. static int UpdateStream(playlist* p)
  82. {
  83. p->ReadList = (playreadlist)ReadList;
  84. if (p->Stream)
  85. {
  86. // detect asf files (some files have wrong extensions...)
  87. const uint8_t* Data = ParserPeek(&p->Parser,16);
  88. if (Data)
  89. {
  90. guid Id;
  91. Id.v1 = Data[0] | (Data[1] << 8) | (Data[2] << 16) | (Data[3] << 24);
  92. Data += 4;
  93. Id.v2 = (uint16_t)(Data[0] | (Data[1] << 8));
  94. Data += 2;
  95. Id.v3 = (uint16_t)(Data[0] | (Data[1] << 8));
  96. Data += 2;
  97. memcpy(Id.v4,Data,8);
  98. if (memcmp(&Id, &ASFHeader, sizeof(guid))==0)
  99. {
  100. ParserStream(&p->Parser,NULL);
  101. return ERR_INVALID_DATA;
  102. }
  103. }
  104. // detect web reference files
  105. if (ParserIsToken(&p->Parser,T("[Reference]")))
  106. p->ReadList = (playreadlist)ReadListRef;
  107. }
  108. return ERR_NONE;
  109. }
  110. static int WriteList(playlist* p, const tchar_t* Path,const tchar_t* DispName,tick_t Length)
  111. {
  112. if (p->No<0)
  113. {
  114. p->No=0;
  115. StreamPrintf(p->Stream,T("<ASX version = "3.0">n"));
  116. StreamPrintf(p->Stream,T("  <PARAM NAME = "Encoding" VALUE = "UTF-8" />n"));
  117. }
  118. if (Path)
  119. {
  120.     StreamPrintf(p->Stream,T("  <ENTRY>n"));
  121. if (DispName)
  122.     StreamPrintfEx(p->Stream,1,T("    <TITLE>%s</TITLE>n"),DispName);
  123.     StreamPrintfEx(p->Stream,1,T("    <REF HREF = "%s" />n"),Path);
  124.     StreamPrintf(p->Stream,T("  </ENTRY>n"));
  125. }
  126. else
  127. StreamPrintf(p->Stream,T("</ASX>n"));
  128. return ERR_NONE;
  129. }
  130. static int Create(playlist* p)
  131. {
  132. p->UpdateStream = (nodefunc)UpdateStream;
  133. p->ReadList = (playreadlist)ReadList;
  134. p->WriteList = (playwritelist)WriteList;
  135. return ERR_NONE;
  136. }
  137. static const nodedef ASX =
  138. {
  139. sizeof(playlist),
  140. ASX_ID,
  141. PLAYLIST_CLASS,
  142. PRI_DEFAULT,
  143. (nodecreate)Create,
  144. NULL,
  145. };
  146. void ASX_Init()
  147. {
  148. NodeRegisterClass(&ASX);
  149. }
  150. void ASX_Done()
  151. {
  152. NodeUnRegisterClass(ASX_ID);
  153. }