DecodeBTDlg.cpp
上传用户:likl4521
上传日期:2020-06-11
资源大小:22k
文件大小:4k
源码类别:

网格计算

开发平台:

Visual C++

  1. // DecodeBTDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DecodeBT.h"
  5. #include "DecodeBTDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDecodeBTDlg dialog
  13. CDecodeBTDlg::CDecodeBTDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CDecodeBTDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CDecodeBTDlg)
  17. m_edit = _T("");
  18. //}}AFX_DATA_INIT
  19. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  20. }
  21. void CDecodeBTDlg::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialog::DoDataExchange(pDX);
  24. //{{AFX_DATA_MAP(CDecodeBTDlg)
  25. DDX_Text(pDX, IDC_EDIT1, m_edit);
  26. //}}AFX_DATA_MAP
  27. }
  28. BEGIN_MESSAGE_MAP(CDecodeBTDlg, CDialog)
  29. //{{AFX_MSG_MAP(CDecodeBTDlg)
  30. ON_WM_PAINT()
  31. ON_WM_QUERYDRAGICON()
  32. //}}AFX_MSG_MAP
  33. END_MESSAGE_MAP()
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CDecodeBTDlg message handlers
  36. BOOL CDecodeBTDlg::OnInitDialog()
  37. {
  38. CDialog::OnInitDialog();
  39. SetIcon(m_hIcon, TRUE); // Set big icon
  40. SetIcon(m_hIcon, FALSE); // Set small icon
  41. // TODO: Add extra initialization here
  42. return TRUE;  // return TRUE  unless you set the focus to a control
  43. }
  44. // If you add a minimize button to your dialog, you will need the code below
  45. //  to draw the icon.  For MFC applications using the document/view model,
  46. //  this is automatically done for you by the framework.
  47. void CDecodeBTDlg::OnPaint() 
  48. {
  49. if (IsIconic())
  50. {
  51. CPaintDC dc(this); // device context for painting
  52. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  53. // Center icon in client rectangle
  54. int cxIcon = GetSystemMetrics(SM_CXICON);
  55. int cyIcon = GetSystemMetrics(SM_CYICON);
  56. CRect rect;
  57. GetClientRect(&rect);
  58. int x = (rect.Width() - cxIcon + 1) / 2;
  59. int y = (rect.Height() - cyIcon + 1) / 2;
  60. // Draw the icon
  61. dc.DrawIcon(x, y, m_hIcon);
  62. }
  63. else
  64. {
  65. CDialog::OnPaint();
  66. }
  67. }
  68. HCURSOR CDecodeBTDlg::OnQueryDragIcon()
  69. {
  70. return (HCURSOR) m_hIcon;
  71. }
  72. void CDecodeBTDlg::OnOK() 
  73. {
  74. // TODO: Add extra validation here
  75. CFile file;
  76. CFileDialog fd(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, "BT种子文件(*.torrent)|*.torrent||");
  77. if ((fd.DoModal() == IDOK) &&
  78. file.Open(fd.GetPathName(), CFile::modeRead | CFile::shareDenyNone))
  79. {
  80. char *dat;
  81. DWORD len;
  82. len = file.GetLength();
  83. dat = new char[len+10];
  84. file.ReadHuge(dat, len);
  85. file.Close();
  86. strcpy(dat+len, "eeeeeeee");
  87. m_edit = "";
  88. Decode(0, 0, dat);
  89. UpdateData(FALSE);
  90. delete []dat;
  91. }
  92. // CDialog::OnOK();
  93. }
  94. BOOL CDecodeBTDlg::Decode(int mode, int level, char *dat)
  95. {
  96. #define CRLF {m_edit += "rn"; for (i=level; i-->0; m_edit+="t");}
  97. static char *s = NULL;
  98. int i;
  99. bool j;
  100. char ch;
  101. char *p;
  102. if (dat != NULL) 
  103. s = dat;
  104. j = true;
  105. while ((ch = *s++) != 'e')
  106. {
  107. switch (ch)
  108. {
  109. case 'd': //dictionary
  110. m_edit += "{";
  111. level++;
  112. CRLF;
  113. Decode(ch, level);
  114. level--;
  115. m_edit += "}";
  116. CRLF;
  117. break;
  118. case 'l': //list
  119. if (mode != 'l') CRLF;
  120. m_edit += "[";
  121. level++;
  122. CRLF;
  123. Decode(ch, level);
  124. level--;
  125. m_edit += "]";
  126. CRLF;
  127. break;
  128. case 'i': //integer
  129. strtoul(s, &p, 10);
  130. i = p - s;
  131. p = new char[i+1];
  132. strncpy(p, s, i);
  133. s += i + 1;
  134. p[i] = '';
  135. m_edit += p;
  136. delete []p;
  137. break;
  138. default: //string
  139. i = strtoul(s-1, &s, 10);
  140. s++;
  141. p = new char[i+1];
  142. strncpy(p, s, i);
  143. s += i;
  144. p[i] = '';
  145. m_edit += p;
  146. delete []p;
  147. }
  148. switch (mode)
  149. {
  150. case 'd':
  151. if (j)
  152. {
  153. m_edit += " : ";
  154. }
  155. else
  156. {
  157. m_edit += "rn";
  158. i = level;
  159. if (*s == 'e') i -= 1;
  160. for (; i-->0; m_edit+="t");
  161. }
  162. j = !j;
  163. break;
  164. case 'l':
  165. if (*s == 'e')
  166. {m_edit += "rn"; for (i=level-1; i-->0; m_edit+="t");}
  167. break;
  168. }
  169. }
  170. return TRUE;
  171. }