GFN.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:4k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "stdafx.h"
  22. #include <io.h>
  23. #include "TextFile.h"
  24. #include "GFN.h"
  25. TCHAR* exttypestr[] = 
  26. {
  27. _T("srt"), _T("sub"), _T("smi"), _T("psb"), 
  28. _T("ssa"), _T("ass"), _T("idx"), _T("usf"), 
  29. _T("xss"), _T("txt")
  30. };
  31. static TCHAR* ext[2][countof(exttypestr)] = 
  32. {
  33. {
  34. _T(".srt"), _T(".sub"), _T(".smi"), _T(".psb"), 
  35. _T(".ssa"), _T(".ass"), _T(".idx"), _T(".usf"), 
  36. _T(".xss"), _T(".txt")
  37. },
  38. {
  39. _T(".*.srt"), _T(".*.sub"), _T(".*.smi"), _T(".*.psb"), 
  40. _T(".*.ssa"), _T(".*.ass"), _T(".*.dummyidx"), _T(".*.usf"), 
  41. _T(".*.xss"), _T(".*.txt")
  42. }, 
  43. };
  44. #define WEBSUBEXT _T(".wse")
  45. static int SubFileCompare(const void* elem1, const void* elem2)
  46. {
  47. return(((SubFile*)elem1)->fn.CompareNoCase(((SubFile*)elem2)->fn));
  48. }
  49. void GetSubFileNames(CString fn, CStringArray& paths, SubFiles& ret)
  50. {
  51. ret.RemoveAll();
  52. int extlistnum = countof(ext);
  53. int extsubnum = countof(ext[0]);
  54. fn.Replace('\', '/');
  55. bool fWeb = false;
  56. {
  57. // int i = fn.Find(_T("://"));
  58. int i = fn.Find(_T("http://"));
  59. if(i > 0) {fn = _T("http") + fn.Mid(i); fWeb = true;}
  60. }
  61. int l = fn.GetLength(), l2 = l;
  62. l2 = fn.ReverseFind('.');
  63. l = fn.ReverseFind('/') + 1;
  64. if(l2 < l) l2 = l;
  65. CString orgpath = fn.Left(l);
  66. CString title = fn.Mid(l, l2-l);
  67. CString filename = title + _T(".nooneexpectsthespanishinquisition");
  68. if(!fWeb)
  69. {
  70. struct _tfinddata_t file, file2;
  71. long hFile, hFile2 = 0;
  72. for(int k = 0; k < paths.GetSize(); k++)
  73. {
  74. CString path = paths[k];
  75. path.Replace('\', '/');
  76. l = path.GetLength();
  77. if(l > 0 && path[l-1] != '/') path += '/';
  78. if(path.Find(':') == -1 && path.Find(_T("\\")) != 0) path = orgpath + path;
  79. path.Replace(_T("/./"), _T("/"));
  80. path.Replace('/', '\');
  81. {
  82. CList<CString> sl;
  83. bool fEmpty = true;
  84. if((hFile = _tfindfirst((LPTSTR)(LPCTSTR)(path + title + "*"), &file)) != -1L)
  85. {
  86. do
  87. {
  88. if(filename.CompareNoCase(file.name)) 
  89. {
  90. fEmpty = false;
  91. // sl.AddTail(path + file.name);
  92. }
  93. }
  94. while(_tfindnext(hFile, &file) != -1);
  95. _findclose(hFile);
  96. }
  97. // TODO: use 'sl' in the next step to find files (already a nice speedup as it is now...)
  98. if(fEmpty) continue;
  99. }
  100. for(int j = 0; j < extlistnum; j++)
  101. {
  102. for(int i = 0; i < extsubnum; i++)
  103. {
  104. CString fn2 = path + title + ext[j][i];
  105. if((hFile = _tfindfirst((LPTSTR)(LPCTSTR)fn2, &file)) != -1L)
  106. {
  107. do
  108. {
  109. CString fn = path + file.name;
  110. hFile2 = -1;
  111. if(j == 0 || (hFile2 = _tfindfirst((LPTSTR)(LPCTSTR)(fn.Left(fn.ReverseFind('.')) + _T(".avi")), &file2)) == -1L)
  112. {
  113. SubFile f;
  114. f.fn = fn;
  115. ret.Add(f);
  116. }
  117. if(hFile2 >= 0) _findclose(hFile2);
  118. }
  119. while(_tfindnext(hFile, &file) != -1);
  120. _findclose(hFile);
  121. }
  122. }
  123. }
  124. }
  125. }
  126. else if(l > 7)
  127. {
  128. CWebTextFile wtf; // :)
  129. if(wtf.Open(orgpath + title + WEBSUBEXT))
  130. {
  131. CString fn;
  132. while(wtf.ReadString(fn) && fn.Find(_T("://")) >= 0)
  133. {
  134. SubFile f;
  135. f.fn = fn;
  136. ret.Add(f);
  137. }
  138. }
  139. }
  140. // sort files, this way the user can define the order (movie.00.English.srt, movie.01.Hungarian.srt, etc)
  141. qsort(ret.GetData(), ret.GetSize(), sizeof(SubFile), SubFileCompare);
  142. }