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

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: tools.c 585 2006-01-16 09:48:55Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #include "common.h"
  24. #include "../splitter/asf.h"
  25. void BuildChapter(tchar_t* s,int slen,int No,int64_t Time,int Rate)
  26. {
  27. int Hour,Min,Sec;
  28. if (Time<0) Time=0;
  29. Time /= Rate;
  30. Hour = (int)(Time / 3600000);
  31. Time -= Hour * 3600000;
  32. Min = (int)(Time / 60000);
  33. Time -= Min * 60000;
  34. Sec = (int)(Time / 1000);
  35. Time -= Sec * 1000;
  36. stprintf_s(s,slen,T("CHAPTER%02d=%02d:%02d:%02d.%03d"),No,Hour,Min,Sec,(int)Time);
  37. }
  38. bool_t SetFileExt(tchar_t* URL, int URLLen, const tchar_t* Ext)
  39. {
  40. tchar_t *p,*q;
  41. bool_t HasHost;
  42. p = (tchar_t*) GetMime(URL,NULL,0,&HasHost);
  43. q = p;
  44. p = tcsrchr(q,'\');
  45. if (!p)
  46. p = tcsrchr(q,'/');
  47. if (p)
  48. q = p+1;
  49. else
  50. if (HasHost) // only hostname
  51. return 0;
  52. if (!q[0]) // no filename at all?
  53. return 0;
  54. p = tcsrchr(q,'.');
  55. if (p)
  56. *p = 0;
  57. tcscat_s(URL,URLLen,T("."));
  58. tcscat_s(URL,URLLen,Ext);
  59. return 1;
  60. }
  61. void SplitURL(const tchar_t* URL, tchar_t* Mime, int MimeLen, tchar_t* Dir, int DirLen, tchar_t* Name, int NameLen, tchar_t* Ext, int ExtLen)
  62. {
  63. const tchar_t* p;
  64. const tchar_t* p2;
  65. bool_t HasHost;
  66. bool_t MergeMime = Mime && Mime == Dir;
  67. // mime 
  68. p = GetMime(URL,MergeMime?NULL:Mime,MimeLen,&HasHost);
  69. if (!MergeMime)
  70. URL = p;
  71. // dir
  72. p2 = tcsrchr(p,'\');
  73. if (!p2)
  74. p2 = tcsrchr(p,'/');
  75. if (p2)
  76. {
  77. if (Dir)
  78. tcsncpy_s(Dir,DirLen,URL,p2-URL);
  79. URL = p2+1;
  80. }
  81. else
  82. if (HasHost) // no filename, only host
  83. {
  84. if (Dir)
  85. tcscpy_s(Dir,DirLen,URL);
  86. URL += tcslen(URL);
  87. }
  88. else // no directory
  89. {
  90. if (Dir)
  91. tcsncpy_s(Dir,DirLen,URL,p-URL);
  92. URL = p;
  93. }
  94. // name
  95. if (Name && Name == Ext)
  96. tcscpy_s(Name,NameLen,URL);
  97. else
  98. {
  99. p = tcsrchr(URL,'.');
  100. if (p)
  101. {
  102. if (Name)
  103. tcsncpy_s(Name,NameLen,URL,p-URL);
  104. if (Ext)
  105. tcscpy_s(Ext,ExtLen,p+1);
  106. }
  107. else
  108. {
  109. if (Name)
  110. tcscpy_s(Name,NameLen,URL);
  111. if (Ext)
  112. Ext[0] = 0;
  113. }
  114. }
  115. }
  116. void RelPath(tchar_t* Rel, int RelLen, const tchar_t* Any, const tchar_t* Base)
  117. {
  118. size_t n;
  119. bool_t HasHost;
  120. const tchar_t* p = GetMime(Base,NULL,0,&HasHost);
  121. if (p != Base)
  122. {
  123. if (HasHost)
  124. {
  125. // include host name too
  126. tchar_t *a,*b;
  127. a = tcschr(p,'\');
  128. b = tcschr(p,'/');
  129. if (!a || (b && b<a))
  130. a=b;
  131. if (a)
  132. p=a;
  133. else
  134. p+=tcslen(p);
  135. }
  136. // check if mime and host is the same
  137. n = p-Base;
  138. if (n<tcslen(Any) && (Any[n]=='\' || Any[n]=='/') && tcsnicmp(Any,Base,n)==0)
  139. {
  140. Base += n;
  141. Any += n;
  142. }
  143. }
  144. n = tcslen(Base);
  145. if (n<tcslen(Any) && (Any[n]=='\' || Any[n]=='/') && tcsnicmp(Any,Base,n)==0)
  146. Any += n+1;
  147. tcscpy_s(Rel,RelLen,Any);
  148. }
  149. bool_t UpperPath(tchar_t* Path, tchar_t* Last, int LastLen)
  150. {
  151. tchar_t *a,*b,*c;
  152. bool_t HasHost;
  153. if (!*Path)
  154. return 0;
  155. c = (tchar_t*)GetMime(Path,NULL,0,&HasHost);
  156. a = tcsrchr(c,'\');
  157. b = tcsrchr(c,'/');
  158. if (a<b)
  159. a=b;
  160. if (!a)
  161. {
  162. if (HasHost)
  163. return 0;
  164. a=c;
  165. if (!a[0]) // only mime left
  166. a=c=Path;
  167. }
  168. else
  169. ++a;
  170. if (Last)
  171. tcscpy_s(Last,LastLen,a);
  172. if (a==c)
  173. *a = 0;
  174. while (--a>=c && (*a=='\' || *a=='/'))
  175. *a = 0;
  176. return 1;
  177. }
  178. void AbsPath(tchar_t* Abs, int AbsLen, const tchar_t* Any, const tchar_t* Base)
  179. {
  180. if (GetMime(Base,NULL,0,NULL)!=Base && (Any[0] == '/' || Any[0] == '\'))
  181. {
  182. tchar_t* s;
  183. bool_t HasHost;
  184. tcscpy_s(Abs,AbsLen,Base);
  185. s = (tchar_t*)GetMime(Abs,NULL,0,&HasHost);
  186. if (!HasHost)
  187. {
  188. // keep "mime://" from Base
  189. ++Any;
  190. *s = 0;
  191. }
  192. else
  193. {
  194. // keep "mime://host" from Base
  195. tchar_t *a,*b;
  196. a = tcschr(s,'\');
  197. b = tcschr(s,'/');
  198. if (!a || (b && b<a))
  199. a=b;
  200. if (a)
  201. *a=0;
  202. }
  203. }
  204. else
  205. if (GetMime(Any,NULL,0,NULL)==Any && Any[0] != '/' && Any[0] != '\' &&
  206. !(Any[0] && Any[1]==':' && Any[2]=='\'))
  207. {
  208. const tchar_t* MimeEnd = GetMime(Base,NULL,0,NULL);
  209. tcscpy_s(Abs,AbsLen,Base);
  210. #if defined(TARGET_WIN32) || defined(TARGET_WINCE) || defined(TARGET_SYMBIAN)
  211. if (MimeEnd==Base)
  212. tcscat_s(Abs,AbsLen,T("\"));
  213. else
  214. #endif
  215. if (MimeEnd[0])
  216. tcscat_s(Abs,AbsLen,T("/"));
  217. }
  218. else
  219. Abs[0] = 0;
  220. tcscat_s(Abs,AbsLen,Any);
  221. if (GetMime(Abs,NULL,0,NULL)!=Abs)
  222. for (;*Abs;++Abs)
  223. if (*Abs == '\')
  224. *Abs = '/';
  225. }
  226. bool_t CheckContentType(const tchar_t* s, const tchar_t* List)
  227. {
  228. size_t n = tcslen(s);
  229. if (n)
  230. {
  231. while (List)
  232. {
  233. if (tcsnicmp(List,s,n)==0 && (!List[n] || List[n]==',' || List[n]==' '))
  234. return 1;
  235. List = tcschr(List,',');
  236. if (List) ++List;
  237. }
  238. }
  239. return 0;
  240. }
  241. bool_t UniqueExts(const int* Begin,const int* Pos)
  242. {
  243. const tchar_t* Exts = LangStr(*Pos,NODE_EXTS);
  244. if (!Exts[0])
  245. return 0;
  246. for (;Begin != Pos;++Begin)
  247. if (tcsicmp(Exts,LangStr(*Begin,NODE_EXTS))==0)
  248. return 0;
  249. return 1;
  250. }
  251. int CheckExts(const tchar_t* URL, const tchar_t* Exts)
  252. {
  253. tchar_t Ext[MAXPATH];
  254. tchar_t* Tail;
  255. SplitURL(URL,NULL,0,NULL,0,NULL,0,Ext,TSIZEOF(Ext));
  256. Tail = tcschr(Ext,'?');
  257. if (Tail) *Tail = 0;
  258. while (Exts)
  259. {
  260. const tchar_t* p = tcschr(Exts,':');
  261. if (p && tcsnicmp(Ext,Exts,p-Exts)==0)
  262. return p[1]; // return type char
  263. Exts = tcschr(Exts,';');
  264. if (Exts) ++Exts;
  265. }
  266. return 0;
  267. }
  268. void GetAsciiToken(tchar_t* Out,size_t OutLen,const char* In,size_t InLen)
  269. {
  270. char* Tmp = alloca(OutLen);
  271. size_t i,n = min(InLen,OutLen-1);
  272. for (i=0;i<n && (unsigned char)In[i]<128;++i)
  273. Tmp[i] = In[i];
  274. Tmp[i] = 0;
  275. AsciiToTcs(Out,OutLen,Tmp);
  276. }
  277. void ShowError(int Sender, int Class, int No,...)
  278. {
  279. tchar_t s[1024];
  280. const tchar_t* Msg;
  281. if (Sender)
  282. stprintf_s(s,TSIZEOF(s), T("%s: "),LangStr(Sender,0));
  283. else
  284. s[0] = 0;
  285. Msg = LangStr(Class,No);
  286. if (Msg[0])
  287. {
  288. va_list Args;
  289. va_start(Args,No);
  290. vstprintf_s(s+tcslen(s),TSIZEOF(s)-tcslen(s), Msg, Args);
  291. va_end(Args);
  292. }
  293. else
  294. {
  295. FourCCToString(s+tcslen(s),TSIZEOF(s)-tcslen(s),Class);
  296. stcatprintf_s(s,TSIZEOF(s), T("%04X"), No);
  297. }
  298. if (Context()->Error.Func)
  299. Context()->Error.Func(Context()->Error.This,Sender,(int)s);
  300. else
  301. ShowMessage(LangStr(PLATFORM_ID,PLATFORM_ERROR),s);
  302. }
  303. void DebugBinary(const tchar_t* Msg,const void* Data,int Length)
  304. {
  305. const uint8_t* p = (const uint8_t*)Data;
  306. int i;
  307. tchar_t s[256];
  308. while (Length>0)
  309. {
  310. tcscpy_s(s,TSIZEOF(s),Msg);
  311. for (i=0;Length>0 && i<16;++i,--Length,++p)
  312. stcatprintf_s(s,TSIZEOF(s),T(" %02x"),*p);
  313. DebugMessage(s);
  314. }
  315. }
  316. const nodedef WMVF = 
  317. {
  318. 0, // parent size
  319. WMVF_ID,
  320. ASF_ID,
  321. PRI_DEFAULT,
  322. };
  323. const nodedef WMAF = 
  324. {
  325. 0, // parent size
  326. WMAF_ID,
  327. ASF_ID,
  328. PRI_DEFAULT,
  329. };