version 0.1.7
[fms.git] / src / http / httpthread.cpp
1 #include "../../include/http/httpthread.h"\r
2 #include "../../include/option.h"\r
3 #include "../../include/stringfunctions.h"\r
4 #include "../../include/http/pages/homepage.h"\r
5 #include "../../include/http/pages/optionspage.h"\r
6 #include "../../include/http/pages/showcaptchapage.h"\r
7 #include "../../include/http/pages/createidentitypage.h"\r
8 #include "../../include/http/pages/localidentitiespage.h"\r
9 #include "../../include/http/pages/announceidentitypage.h"\r
10 #include "../../include/http/pages/addpeerpage.h"\r
11 #include "../../include/http/pages/peertrustpage.h"\r
12 \r
13 #include <iostream>\r
14 \r
15 #ifdef XMEM\r
16         #include <xmem.h>\r
17 #endif\r
18 \r
19 HTTPThread::HTTPThread()\r
20 {\r
21         std::string templatestr;\r
22         int port;\r
23         std::string portstr;\r
24         Option::Instance()->Get("HTTPListenPort",portstr);\r
25         StringFunctions::Convert(portstr,port);\r
26 \r
27         // set template\r
28         templatestr="<html><head></head><body><a href=\"home.htm\">Home</a><br>[CONTENT]</body></html>";\r
29         FILE *infile=fopen("template.htm","r+b");\r
30         if(infile)\r
31         {\r
32                 fseek(infile,0,SEEK_END);\r
33                 long len=ftell(infile);\r
34                 std::vector<char> data(len,0);\r
35                 fseek(infile,0,SEEK_SET);\r
36                 fread(&data[0],1,len,infile);\r
37                 fclose(infile);\r
38                 templatestr.assign(data.begin(),data.end());\r
39         }\r
40         else\r
41         {\r
42                 m_log->WriteLog(LogFile::LOGLEVEL_ERROR,"HTTPThread::HTTPThread could not open template.htm");\r
43         }\r
44 \r
45         // push back page handlers\r
46         m_pagehandlers.push_back(new ShowCaptchaPage());\r
47         m_pagehandlers.push_back(new OptionsPage(templatestr));\r
48         m_pagehandlers.push_back(new LocalIdentitiesPage(templatestr));\r
49         m_pagehandlers.push_back(new CreateIdentityPage(templatestr));\r
50         m_pagehandlers.push_back(new AnnounceIdentityPage(templatestr));\r
51         m_pagehandlers.push_back(new AddPeerPage(templatestr));\r
52         m_pagehandlers.push_back(new PeerTrustPage(templatestr));\r
53         // homepage must be last - catch all page handler\r
54         m_pagehandlers.push_back(new HomePage(templatestr));\r
55 \r
56         m_ctx=0;\r
57         m_ctx=shttpd_init(NULL,"listen_ports",portstr.c_str(),NULL);\r
58         shttpd_listen(m_ctx,port,false);\r
59 \r
60         shttpd_register_uri(m_ctx,"*",HTTPThread::PageCallback,this);\r
61 \r
62 }\r
63 \r
64 HTTPThread::~HTTPThread()\r
65 {\r
66         shttpd_fini(m_ctx);\r
67 \r
68         for(std::vector<IPageHandler *>::iterator i=m_pagehandlers.begin(); i!=m_pagehandlers.end(); i++)\r
69         {\r
70                 delete (*i);\r
71         }\r
72 \r
73 }\r
74 \r
75 void HTTPThread::PageCallback(shttpd_arg *arg)\r
76 {\r
77 \r
78         HTTPThread *thread=(HTTPThread *)arg->user_data;\r
79 \r
80         for(std::vector<IPageHandler *>::iterator i=thread->m_pagehandlers.begin(); i!=thread->m_pagehandlers.end(); )\r
81         {\r
82                 if((*i)->Handle(arg)==true)\r
83                 {\r
84                         i=thread->m_pagehandlers.end();\r
85                 }\r
86                 else\r
87                 {\r
88                         i++;\r
89                 }\r
90         }\r
91 \r
92 }\r
93 \r
94 void HTTPThread::Run()\r
95 {\r
96         m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"HTTPThread::run thread started.");\r
97 \r
98         do\r
99         {\r
100                 shttpd_poll(m_ctx,1000);\r
101         }while(!IsCancelled());\r
102 \r
103         m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"HTTPThread::run thread exiting.");\r
104 \r
105 }\r