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

多媒体编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <atlisapi.h>
  3. #include "mplayerc.h"
  4. #include "resource.h"
  5. #include "MainFrm.h"
  6. #include "....subtitlesTextFile.h"
  7. #include ".webserver.h"
  8. #include ".webclientsocket.h"
  9. CWebClientSocket::CWebClientSocket(CWebServer* pWebServer, CMainFrame* pMainFrame) 
  10. : m_pWebServer(pWebServer)
  11. , m_pMainFrame(pMainFrame)
  12. {
  13. }
  14. CWebClientSocket::~CWebClientSocket()
  15. {
  16. }
  17. bool CWebClientSocket::SetCookie(CString name, CString value, __time64_t expire, CString path, CString domain)
  18. {
  19. if(name.IsEmpty()) return(false);
  20. if(value.IsEmpty()) {m_cookie.RemoveKey(name); return true;}
  21. m_cookie[name] = value;
  22. m_cookieattribs[name].path = path;
  23. m_cookieattribs[name].domain = domain;
  24. if(expire >= 0)
  25. {
  26. CTime t(expire);
  27. SYSTEMTIME st;
  28. t.GetAsSystemTime(st);
  29. CStringA str;
  30. SystemTimeToHttpDate(st, str);
  31. m_cookieattribs[name].expire = str;
  32. }
  33. return true;
  34. }
  35. void CWebClientSocket::Clear()
  36. {
  37. m_hdr.Empty();
  38. m_hdrlines.RemoveAll();
  39. m_data.Empty();
  40. m_cmd.Empty();
  41. m_path.Empty();
  42. m_ver.Empty();
  43. m_get.RemoveAll();
  44. m_post.RemoveAll();
  45. m_cookie.RemoveAll();
  46. m_request.RemoveAll();
  47. }
  48. void CWebClientSocket::Header()
  49. {
  50. if(m_cmd.IsEmpty())
  51. {
  52. if(m_hdr.IsEmpty()) return;
  53. CList<CString> lines;
  54. Explode(m_hdr, lines, 'n');
  55. CString str = lines.RemoveHead();
  56. CList<CString> sl;
  57. ExplodeMin(str, sl, ' ', 3);
  58. m_cmd = sl.RemoveHead().MakeUpper();
  59. m_path = sl.RemoveHead();
  60. m_ver = sl.RemoveHead().MakeUpper();
  61. ASSERT(sl.GetCount() == 0);
  62. POSITION pos = lines.GetHeadPosition();
  63. while(pos)
  64. {
  65. Explode(lines.GetNext(pos), sl, ':', 2);
  66. if(sl.GetCount() == 2)
  67. m_hdrlines[sl.GetHead().MakeLower()] = sl.GetTail();
  68. }
  69. }
  70. // remember new cookies
  71. POSITION pos = m_hdrlines.GetStartPosition();
  72. while(pos)
  73. {
  74. CString key, value;
  75. m_hdrlines.GetNextAssoc(pos, key, value);
  76. if(key == _T("cookie"))
  77. {
  78. CList<CString> sl;
  79. Explode(value, sl, ';');
  80. POSITION pos2 = sl.GetHeadPosition();
  81. while(pos2)
  82. {
  83. CList<CString> sl2;
  84. Explode(sl.GetNext(pos2), sl2, '=', 2);
  85. m_cookie[sl2.GetHead()] = sl2.GetCount() == 2 ? sl2.GetTail() : _T("");
  86. }
  87. }
  88. }
  89. // start new session
  90. if(!m_cookie.Lookup(_T("MPCSESSIONID"), m_sessid))
  91. {
  92. srand((unsigned int)time(NULL));
  93. m_sessid.Format(_T("%08x"), rand()*0x12345678);
  94. SetCookie(_T("MPCSESSIONID"), m_sessid);
  95. }
  96. else
  97. {
  98. // TODO: load session
  99. }
  100. CStringA reshdr, resbody;
  101. if(m_cmd == _T("POST"))
  102. {
  103. CString str;
  104. if(m_hdrlines.Lookup(_T("content-length"), str))
  105. {
  106. int len = _tcstol(str, NULL, 10);
  107. str.Empty();
  108. int err;
  109. char c;
  110. int timeout = 1000;
  111. do
  112. {
  113. for(; len > 0 && (err = Receive(&c, 1)) > 0; len--)
  114. {
  115. m_data += c;
  116. if(c == 'r') continue;
  117. str += c;
  118. if(c == 'n' || len == 1)
  119. {
  120. CList<CString> sl;
  121. Explode(AToT(UrlDecode(TToA(str))), sl, '&'); // FIXME
  122. POSITION pos = sl.GetHeadPosition();
  123. while(pos)
  124. {
  125. CList<CString> sl2;
  126. Explode(sl.GetNext(pos), sl2, '=', 2);
  127. m_post[sl2.GetHead().MakeLower()] = sl2.GetCount() == 2 ? sl2.GetTail() : _T("");
  128. }
  129. str.Empty();
  130. }
  131. }
  132. if(err == SOCKET_ERROR)
  133. Sleep(1);
  134. }
  135. while(err == SOCKET_ERROR && GetLastError() == WSAEWOULDBLOCK
  136. && timeout-- > 0); // FIXME: this is just a dirty fix now
  137. // FIXME: with IE it will only work if I read +2 bytes (?), btw Receive will just return -1
  138. Receive(&c, 1);
  139. Receive(&c, 1);
  140. }
  141. }
  142. if(m_cmd == _T("GET") || m_cmd == _T("HEAD") || m_cmd == _T("POST"))
  143. {
  144. CList<CString> sl;
  145. Explode(m_path, sl, '?', 2);
  146. m_path = sl.RemoveHead();
  147. m_query.Empty();
  148. if(!sl.IsEmpty())
  149. {
  150. m_query = sl.GetTail();
  151. Explode(Explode(m_query, sl, '#', 2), sl, '&'); // oh yeah
  152. // Explode(AToT(UrlDecode(TToA(Explode(m_query, sl, '#', 2)))), sl, '&'); // oh yeah
  153. POSITION pos = sl.GetHeadPosition();
  154. while(pos)
  155. {
  156. CList<CString> sl2;
  157. Explode(AToT(UrlDecode(TToA(sl.GetNext(pos)))), sl2, '=', 2);
  158. // Explode(sl.GetNext(pos), sl2, '=', 2);
  159. m_get[sl2.GetHead()] = sl2.GetCount() == 2 ? sl2.GetTail() : _T("");
  160. }
  161. }
  162. // m_request <-- m_get+m_post+m_cookie
  163. {
  164.             CString key, value;
  165. POSITION pos;
  166. pos = m_get.GetStartPosition();
  167. while(pos) {m_get.GetNextAssoc(pos, key, value); m_request[key] = value;}
  168. pos = m_post.GetStartPosition();
  169. while(pos) {m_post.GetNextAssoc(pos, key, value); m_request[key] = value;}
  170. pos = m_cookie.GetStartPosition();
  171. while(pos) {m_cookie.GetNextAssoc(pos, key, value); m_request[key] = value;}
  172. }
  173. m_pWebServer->OnRequest(this, reshdr, resbody);
  174. }
  175. else
  176. {
  177. reshdr = "HTTP/1.0 400 Bad Requestrn";
  178. }
  179. if(!reshdr.IsEmpty())
  180. {
  181. // cookies
  182. {
  183. POSITION pos = m_cookie.GetStartPosition();
  184. while(pos)
  185. {
  186. CString key, value;
  187. m_cookie.GetNextAssoc(pos, key, value);
  188. reshdr += "Set-Cookie: " + key + "=" + value;
  189. POSITION pos2 = m_cookieattribs.GetStartPosition();
  190. while(pos2)
  191. {
  192. CString key;
  193. cookie_attribs value;
  194. m_cookieattribs.GetNextAssoc(pos2, key, value);
  195. if(!value.path.IsEmpty()) reshdr += " path=" + value.path;
  196. if(!value.expire.IsEmpty()) reshdr += " expire=" + value.expire;
  197. if(!value.domain.IsEmpty()) reshdr += " domain=" + value.domain;
  198. }
  199. reshdr += "rn";
  200. }
  201. }
  202. reshdr += 
  203. "Server: MPC WebServerrn"
  204. "Connection: closern"
  205. "rn";
  206. Send(reshdr, reshdr.GetLength());
  207. if(m_cmd != _T("HEAD") && reshdr.Find("HTTP/1.0 200 OK") == 0 && !resbody.IsEmpty()) 
  208. {
  209. Send(resbody, resbody.GetLength());
  210. }
  211. CString connection = _T("close");
  212. m_hdrlines.Lookup(_T("connection"), connection);
  213. Clear();
  214. // TODO
  215. // if(connection == _T("close"))
  216. OnClose(0);
  217. }
  218. }
  219. //
  220. void CWebClientSocket::OnReceive(int nErrorCode)
  221. {
  222. if(nErrorCode == 0)
  223. {
  224. char c;
  225. while(Receive(&c, 1) > 0)
  226. {
  227. if(c == 'r') continue;
  228. else m_hdr += c;
  229. int len = m_hdr.GetLength();
  230. if(len >= 2 && m_hdr[len-2] == 'n' && m_hdr[len-1] == 'n')
  231. {
  232. Header();
  233. return;
  234. }
  235. }
  236. }
  237. __super::OnReceive(nErrorCode);
  238. }
  239. void CWebClientSocket::OnClose(int nErrorCode)
  240. {
  241. // TODO: save session
  242. m_pWebServer->OnClose(this);
  243. __super::OnClose(nErrorCode);
  244. }
  245. ////////////////////
  246. bool CWebClientSocket::OnCommand(CStringA& hdr, CStringA& body, CStringA& mime)
  247. {
  248. CString arg;
  249. if(m_request.Lookup(_T("wm_command"), arg))
  250. {
  251. int id = _ttol(arg);
  252. if(id > 0)
  253. if(id == ID_FILE_EXIT) m_pMainFrame->PostMessage(WM_COMMAND, id);
  254. else m_pMainFrame->SendMessage(WM_COMMAND, id);
  255. }
  256. else
  257. {
  258. if(arg == CMD_SETPOS && m_request.Lookup(_T("position"), arg))
  259. {
  260. int h, m, s, ms = 0;
  261. TCHAR c;
  262. if(_stscanf(arg, _T("%d%c%d%c%d%c%d"), &h, &c, &m, &c, &s, &c, &ms) >= 5)
  263. {
  264. REFERENCE_TIME rtPos = 10000i64*(((h*60+m)*60+s)*1000+ms);
  265. m_pMainFrame->SeekTo(rtPos);
  266. for(int retries = 20; retries-- > 0; Sleep(50))
  267. {
  268. if(abs((int)((rtPos - m_pMainFrame->GetPos())/10000)) < 100)
  269. break;
  270. }
  271. }
  272. }
  273. else if(arg == CMD_SETPOS && m_request.Lookup(_T("percent"), arg))
  274. {
  275. float percent = 0;
  276. if(_stscanf(arg, _T("%f"), &percent) == 1)
  277. m_pMainFrame->SeekTo((REFERENCE_TIME)(percent / 100 * m_pMainFrame->GetDur()));
  278. }
  279. else if(arg == CMD_SETVOLUME && m_request.Lookup(_T("volume"), arg))
  280. {
  281. int volume = _tcstol(arg, NULL, 10);
  282. m_pMainFrame->m_wndToolBar.Volume = min(max(volume, 1), 100);
  283. m_pMainFrame->OnPlayVolume(0);
  284. }
  285. }
  286. }
  287. CString ref;
  288. if(!m_hdrlines.Lookup(_T("referer"), ref))
  289. return true;
  290. hdr = 
  291. "HTTP/1.0 302 Foundrn"
  292. "Location: " + CStringA(ref) + "rn";
  293. return true;
  294. }
  295. bool CWebClientSocket::OnIndex(CStringA& hdr, CStringA& body, CStringA& mime)
  296. {
  297. CStringA wmcoptions;
  298. // generate page
  299. AppSettings& s = AfxGetAppSettings();
  300. POSITION pos = s.wmcmds.GetHeadPosition();
  301. while(pos)
  302. {
  303. wmcmd& wc = s.wmcmds.GetNext(pos);
  304. CStringA str;
  305. str.Format("%d", wc.cmd);
  306. wmcoptions += "<option value="" + str + "">" 
  307. + CStringA(wc.name) + "rn";
  308. }
  309. m_pWebServer->LoadPage(IDR_HTML_INDEX, body, m_path);
  310. body.Replace("[wmcoptions]", wmcoptions);
  311. return true;
  312. }
  313. bool CWebClientSocket::OnBrowser(CStringA& hdr, CStringA& body, CStringA& mime)
  314. {
  315. CList<CStringA> rootdrives;
  316. for(TCHAR drive[] = _T("A:"); drive[0] <= 'Z'; drive[0]++)
  317. if(GetDriveType(drive) != DRIVE_NO_ROOT_DIR)
  318. rootdrives.AddTail(CStringA(drive) + '\');
  319. // process GET
  320. CString path;
  321. CFileStatus fs;
  322. if(m_get.Lookup(_T("path"), path))
  323. {
  324. path = WToT(UTF8To16(TToA(path)));
  325. if(CFileGetStatus(path, fs) && !(fs.m_attribute&CFile::directory))
  326. {
  327. // TODO: make a new message for just opening files, this is a bit overkill now...
  328. CList<CString> cmdln;
  329. cmdln.AddTail(path);
  330. CString focus;
  331. if(m_get.Lookup(_T("focus"), focus) && !focus.CompareNoCase(_T("no")))
  332. cmdln.AddTail(_T("/nofocus"));
  333. int len = 0;
  334. POSITION pos = cmdln.GetHeadPosition();
  335. while(pos)
  336. {
  337. CString& str = cmdln.GetNext(pos);
  338. len += (str.GetLength()+1)*sizeof(TCHAR);
  339. }
  340. CAutoVectorPtr<BYTE> buff;
  341. if(buff.Allocate(4+len))
  342. {
  343. BYTE* p = buff;
  344. *(DWORD*)p = cmdln.GetCount(); 
  345. p += sizeof(DWORD);
  346. POSITION pos = cmdln.GetHeadPosition();
  347. while(pos)
  348. {
  349. CString& str = cmdln.GetNext(pos);
  350. len = (str.GetLength()+1)*sizeof(TCHAR);
  351. memcpy(p, (LPCTSTR)str, len);
  352. p += len;
  353. }
  354. COPYDATASTRUCT cds;
  355. cds.dwData = 0x6ABE51;
  356. cds.cbData = p - buff;
  357. cds.lpData = (void*)(BYTE*)buff;
  358. m_pMainFrame->SendMessage(WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds);
  359. }
  360. CPath p(path);
  361. p.RemoveFileSpec();
  362. path = (LPCTSTR)p;
  363. }
  364. }
  365. else
  366. {
  367. path = m_pMainFrame->m_wndPlaylistBar.GetCur();
  368. if(CFileGetStatus(path, fs) && !(fs.m_attribute&CFile::directory))
  369. {
  370. CPath p(path);
  371. p.RemoveFileSpec();
  372. path = (LPCTSTR)p;
  373. }
  374. }
  375. if(path.Find(_T("://")) >= 0)
  376. path.Empty();
  377. if(CFileGetStatus(path, fs) && (fs.m_attribute&CFile::directory)
  378. || path.Find(_T("\")) == 0) // FIXME
  379. {
  380. CPath p(path);
  381. p.Canonicalize();
  382. p.MakePretty();
  383. p.AddBackslash();
  384. path = (LPCTSTR)p;
  385. }
  386. CStringA files;
  387. if(path.IsEmpty())
  388. {
  389. POSITION pos = rootdrives.GetHeadPosition();
  390. while(pos)
  391. {
  392. CStringA& drive = rootdrives.GetNext(pos);
  393. files += "<tr>rn";
  394. files += 
  395. "<td><a href="[path]?path=" + UrlEncode(drive) + "">" + drive + "</a></td>"
  396. "<td>Directory</td>"
  397. "<td>&nbsp</td>rn"
  398. "<td>&nbsp</td>";
  399. files += "</tr>rn";
  400. }
  401. path = "Root";
  402. }
  403. else
  404. {
  405. CString parent;
  406. if(path.GetLength() > 3)
  407. {
  408. CPath p(path + "..");
  409. p.Canonicalize();
  410. p.AddBackslash();
  411. parent = (LPCTSTR)p;
  412. }
  413. files += "<tr>rn";
  414. files += 
  415. "<td><a href="[path]?path=" + parent + "">..</a></td>"
  416. "<td>Directory</td>"
  417. "<td>&nbsp</td>rn"
  418. "<td>&nbsp</td>";
  419. files += "</tr>rn";
  420. WIN32_FIND_DATA fd = {0};
  421. HANDLE hFind = FindFirstFile(path + "*.*", &fd);
  422. if(hFind != INVALID_HANDLE_VALUE)
  423. {
  424. do
  425. {
  426. if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) || fd.cFileName[0] == '.')
  427. continue;
  428. CString fullpath = path + fd.cFileName;
  429. files += "<tr>rn";
  430. files += 
  431. "<td><a href="[path]?path=" + UTF8Arg(fullpath) + "">" + UTF8(fd.cFileName) + "</a></td>"
  432. "<td>Directory</td>"
  433. "<td>&nbsp</td>rn"
  434. "<td><nobr>" + CStringA(CTime(fd.ftLastWriteTime).Format(_T("%Y.%m.%d %H:%M"))) + "</nobr></td>";
  435. files += "</tr>rn";
  436. }
  437. while(FindNextFile(hFind, &fd));
  438. FindClose(hFind);
  439. }
  440. hFind = FindFirstFile(path + "*.*", &fd);
  441. if(hFind != INVALID_HANDLE_VALUE)
  442. {
  443. do
  444. {
  445. if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
  446. continue;
  447. CString fullpath = path + fd.cFileName;
  448. CStringA size;
  449. size.Format("%I64dK", ((UINT64)fd.nFileSizeHigh<<22)|(fd.nFileSizeLow>>10));
  450. CString type(_T("&nbsp"));
  451. LoadType(fullpath, type);
  452. files += "<tr>rn";
  453. files += 
  454. "<td><a href="[path]?path=" + UTF8Arg(fullpath) + "">" + UTF8(fd.cFileName) + "</a></td>"
  455. "<td><nobr>" + UTF8(type) + "</nobr></td>"
  456. "<td align="right"><nobr>" + size + "</nobr></td>rn"
  457. "<td><nobr>" + CStringA(CTime(fd.ftLastWriteTime).Format(_T("%Y.%m.%d %H:%M"))) + "</nobr></td>";
  458. files += "</tr>rn";
  459. }
  460. while(FindNextFile(hFind, &fd));
  461. FindClose(hFind);
  462. }
  463. }
  464. m_pWebServer->LoadPage(IDR_HTML_BROWSER, body, m_path);
  465. body.Replace("[charset]", "UTF-8"); // FIXME: win9x build...
  466. body.Replace("[currentdir]", UTF8(path));
  467. body.Replace("[currentfiles]", files);
  468. return true;
  469. }
  470. bool CWebClientSocket::OnControls(CStringA& hdr, CStringA& body, CStringA& mime)
  471. {
  472. CString path = m_pMainFrame->m_wndPlaylistBar.GetCur();
  473. CString dir;
  474. if(!path.IsEmpty())
  475. {
  476. CPath p(path);
  477. p.RemoveFileSpec();
  478. dir = (LPCTSTR)p;
  479. }
  480. OAFilterState fs = m_pMainFrame->GetMediaState();
  481. CString state;
  482. state.Format(_T("%d"), fs);
  483. CString statestring;
  484. switch(fs)
  485. {
  486. case State_Stopped: statestring = _T("Stopped"); break;
  487. case State_Paused: statestring = _T("Paused"); break;
  488. case State_Running: statestring = _T("Playing"); break;
  489. default: statestring = _T("n/a"); break;
  490. }
  491. int pos = (int)(m_pMainFrame->GetPos()/10000);
  492. int dur = (int)(m_pMainFrame->GetDur()/10000);
  493. CString position, duration;
  494. position.Format(_T("%d"), pos);
  495. duration.Format(_T("%d"), dur);
  496. CString positionstring, durationstring, playbackrate;
  497. // positionstring.Format(_T("%02d:%02d:%02d.%03d"), (pos/3600000), (pos/60000)%60, (pos/1000)%60, pos%1000);
  498. // durationstring.Format(_T("%02d:%02d:%02d.%03d"), (dur/3600000), (dur/60000)%60, (dur/1000)%60, dur%1000);
  499. positionstring.Format(_T("%02d:%02d:%02d"), (pos/3600000), (pos/60000)%60, (pos/1000)%60);
  500. durationstring.Format(_T("%02d:%02d:%02d"), (dur/3600000), (dur/60000)%60, (dur/1000)%60);
  501. playbackrate = _T("1"); // TODO
  502. CString volumelevel, muted;
  503. volumelevel.Format(_T("%d"), m_pMainFrame->m_wndToolBar.m_volctrl.GetPos());
  504. muted.Format(_T("%d"), m_pMainFrame->m_wndToolBar.Volume == -10000 ? 1 : 0);
  505. CString reloadtime(_T("0")); // TODO
  506. m_pWebServer->LoadPage(IDR_HTML_CONTROLS, body, m_path);
  507. body.Replace("[charset]", "UTF-8"); // FIXME: win9x build...
  508. body.Replace("[filepatharg]", UTF8Arg(path));
  509. body.Replace("[filepath]", UTF8(path));
  510. body.Replace("[filedirarg]", UTF8Arg(dir));
  511. body.Replace("[filedir]", UTF8(dir));
  512. body.Replace("[state]", UTF8(state));
  513. body.Replace("[statestring]", UTF8(statestring));
  514. body.Replace("[position]", UTF8(position));
  515. body.Replace("[positionstring]", UTF8(positionstring));
  516. body.Replace("[duration]", UTF8(duration));
  517. body.Replace("[durationstring]", UTF8(durationstring));
  518. body.Replace("[volumelevel]", UTF8(volumelevel));
  519. body.Replace("[muted]", UTF8(muted));
  520. body.Replace("[playbackrate]", UTF8(playbackrate));
  521. body.Replace("[reloadtime]", UTF8(reloadtime));
  522. return true;
  523. }
  524. bool CWebClientSocket::OnStatus(CStringA& hdr, CStringA& body, CStringA& mime)
  525. {
  526. /*
  527. CString path = m_pMainFrame->m_wndPlaylistBar.GetCur(), dir;
  528. if(!path.IsEmpty()) {CPath p(path); p.RemoveFileSpec(); dir = (LPCTSTR)p;}
  529. path.Replace(_T("'"), _T("\'"));
  530. dir.Replace(_T("'"), _T("\'"));
  531. CString volumelevel, muted;
  532. volumelevel.Format(_T("%d"), m_pMainFrame->m_wndToolBar.m_volctrl.GetPos());
  533. muted.Format(_T("%d"), m_pMainFrame->m_wndToolBar.Volume == -10000 ? 1 : 0);
  534. body.Replace("[volumelevel]", UTF8(volumelevel));
  535. body.Replace("[muted]", UTF8(muted));
  536. */
  537. CString title;
  538. m_pMainFrame->GetWindowText(title);
  539. CString status = m_pMainFrame->GetStatusMessage();
  540. int pos = (int)(m_pMainFrame->GetPos()/10000);
  541. int dur = (int)(m_pMainFrame->GetDur()/10000);
  542. CString posstr, durstr;
  543. posstr.Format(_T("%02d:%02d:%02d"), (pos/3600000), (pos/60000)%60, (pos/1000)%60);
  544. durstr.Format(_T("%02d:%02d:%02d"), (dur/3600000), (dur/60000)%60, (dur/1000)%60);
  545. title.Replace(_T("'"), _T("\'"));
  546. status.Replace(_T("'"), _T("\'"));
  547. body.Format("OnStatus('%s', '%s', %d, '%s', %d, '%s', %d, %d)", // , '%s', '%s'
  548. UTF8(title), UTF8(status), 
  549. pos, UTF8(posstr), dur, UTF8(durstr),
  550. m_pMainFrame->IsMuted(), m_pMainFrame->GetVolume()
  551. /*, UTF8(path), UTF8(dir)*/);
  552.     return true;
  553. }
  554. bool CWebClientSocket::OnError404(CStringA& hdr, CStringA& body, CStringA& mime)
  555. {
  556. m_pWebServer->LoadPage(IDR_HTML_404, body, m_path);
  557.     return true;
  558. }
  559. bool CWebClientSocket::OnPlayer(CStringA& hdr, CStringA& body, CStringA& mime)
  560. {
  561. m_pWebServer->LoadPage(IDR_HTML_PLAYER, body, m_path);
  562.     return true;
  563. }
  564. #include "jpeg.h"
  565. bool CWebClientSocket::OnSnapShotJpeg(CStringA& hdr, CStringA& body, CStringA& mime)
  566. {
  567. // TODO: add quality control and return logo when nothing is loaded
  568. bool fRet = false;
  569. BYTE* pData = NULL;
  570. long size = 0;
  571. CArray<BYTE> jpeg;
  572. if(m_pMainFrame->GetDIB(&pData, size, true))
  573. {
  574. if(CJpegEncoderMem().Encode(pData, jpeg))
  575. {
  576. hdr += 
  577. "Expires: Thu, 19 Nov 1981 08:52:00 GMTrn"
  578. "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0rn"
  579. "Pragma: no-cachern";
  580. body = CStringA((char*)jpeg.GetData(), jpeg.GetSize());
  581. mime = "image/jpeg";
  582. fRet = true;
  583. }
  584. delete [] pData;
  585. }
  586. return fRet;
  587. }
  588. #include "ConvertDlg.h"
  589. bool CWebClientSocket::OnConvRes(CStringA& hdr, CStringA& body, CStringA& mime)
  590. {
  591. CString id;
  592. if(!m_get.Lookup(_T("id"), id))
  593. return false;
  594. DWORD key = 0;
  595. if(1 != _stscanf(id, _T("%x"), &key) || key == 0)
  596. return false;
  597. CAutoLock cAutoLock(&CDSMResource::m_csResources);
  598. CDSMResource* res = NULL;
  599. if(!CDSMResource::m_resources.Lookup(key, res) || !res)
  600. return false;
  601. body = CStringA((const char*)res->data.GetData(), res->data.GetSize());
  602. mime = CString(res->mime);
  603. return true;
  604. }