ISDb.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:2k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "ISDb.h"
  3. #include "mplayerc.h"
  4. bool hash(LPCTSTR fn, filehash& fh)
  5. {
  6. CFile f;
  7. CFileException fe;
  8. if(!f.Open(fn, CFile::modeRead|CFile::osSequentialScan|CFile::shareDenyNone, &fe))
  9.         return false;
  10. CPath p(fn);
  11. p.StripPath();
  12. fh.name = (LPCTSTR)p;
  13. fh.size = f.GetLength();
  14. fh.hash = fh.size;
  15. for(UINT64 tmp = 0, i = 0; i < 65536/sizeof(tmp) && f.Read(&tmp, sizeof(tmp)); fh.hash += tmp, i++);
  16. f.Seek(max(0, (INT64)fh.size - 65536), CFile::begin);
  17. for(UINT64 tmp = 0, i = 0; i < 65536/sizeof(tmp) && f.Read(&tmp, sizeof(tmp)); fh.hash += tmp, i++);
  18. return true;
  19. }
  20. void hash(CPlaylist& pl, CList<filehash>& fhs)
  21. {
  22. fhs.RemoveAll();
  23. POSITION pos = pl.GetHeadPosition();
  24. while(pos)
  25. {
  26. CString fn = pl.GetNext(pos).m_fns.GetHead();
  27. if(AfxGetAppSettings().Formats.FindExt(CPath(fn).GetExtension().MakeLower(), true))
  28. continue;
  29. filehash fh;
  30. if(!hash(fn, fh))
  31. continue;
  32. fhs.AddTail(fh);
  33. }
  34. }
  35. CStringA makeargs(CPlaylist& pl)
  36. {
  37. CList<filehash> fhs;
  38. hash(pl, fhs);
  39. CAtlList<CStringA> args;
  40. POSITION pos = fhs.GetHeadPosition();
  41. for(int i = 0; pos; i++)
  42. {
  43. filehash& fh = fhs.GetNext(pos);
  44. CStringA str;
  45. str.Format("name[%d]=%s&size[%d]=%016I64x&hash[%d]=%016I64x",
  46. i, UrlEncode(CStringA(fh.name)), 
  47. i, fh.size,
  48. i, fh.hash);
  49. args.AddTail(str);
  50. }
  51. return Implode(args, '&');
  52. }
  53. bool OpenUrl(CInternetSession& is, CString url, CStringA& str)
  54. {
  55. str.Empty();
  56. try
  57. {
  58. CAutoPtr<CStdioFile> f(is.OpenURL(url, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_EXISTING_CONNECT));
  59. char buff[1024];
  60. for(int len; (len = f->Read(buff, sizeof(buff))) > 0; str += CStringA(buff, len));
  61. f->Close(); // must close it because the desctructor doesn't seem to do it and we will get an exception when "is" is destroying
  62. }
  63. catch(CInternetException* ie)
  64. {
  65. ie->Delete();
  66. return false;
  67. }
  68. return true;
  69. }