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