00001 #pragma once
00002
00003 #include <afxsock.h>
00004 #include <atlcoll.h>
00005
00006 #define UTF8(str) UTF16To8(TToW(str))
00007 #define UTF8Arg(str) UrlEncode(UTF8(str))
00008
00009 #define CMD_SETPOS "-1"
00010 #define CMD_SETVOLUME "-2"
00011
00012
00013 class CWebServerSocket;
00014 class CWebClientSocket;
00015 class CMainFrame;
00016
00017 class CWebServer
00018 {
00019 CMainFrame* m_pMainFrame;
00020 int m_nPort;
00021
00022 DWORD ThreadProc();
00023 static DWORD WINAPI StaticThreadProc(LPVOID lpParam);
00024 DWORD m_ThreadId;
00025 HANDLE m_hThread;
00026
00027 CAutoPtrList<CWebClientSocket> m_clients;
00028
00029 typedef bool (CWebClientSocket::*RequestHandler)(CStringA& hdr, CStringA& body, CStringA& mime);
00030 static CAtlMap<CString, RequestHandler, CStringElementTraits<CString> > m_internalpages;
00031 static CAtlMap<CString, UINT, CStringElementTraits<CString> > m_downloads;
00032 static CAtlMap<CStringA, CStringA, CStringElementTraits<CStringA> > m_mimes;
00033 CPath m_webroot;
00034
00035 CAtlMap<CString, CString, CStringElementTraits<CString> > m_cgi;
00036 bool CallCGI(CWebClientSocket* pClient, CStringA& hdr, CStringA& body, CStringA& mime);
00037
00038 public:
00039 CWebServer(CMainFrame* pMainFrame, int nPort = 13579);
00040 virtual ~CWebServer();
00041
00042 static void Deploy(CString dir);
00043
00044 bool ToLocalPath(CString& path, CString& redir);
00045 bool LoadPage(UINT resid, CStringA& str, CString path = _T(""));
00046
00047 void OnAccept(CWebServerSocket* pServer);
00048 void OnClose(CWebClientSocket* pClient);
00049 void OnRequest(CWebClientSocket* pClient, CStringA& reshdr, CStringA& resbody);
00050 };