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