version 0.3.32
[fms.git] / src / http / pages / showimagepage.cpp
1 #include "../../../include/http/pages/showimagepage.h"\r
2 \r
3 #include <cstdio>\r
4 \r
5 #ifdef XMEM\r
6         #include <xmem.h>\r
7 #endif\r
8 \r
9 std::map<std::string,std::vector<char> > ShowImagePage::m_imagecache;\r
10 std::set<std::string> ShowImagePage::m_imagewhitelist;\r
11 \r
12 ShowImagePage::ShowImagePage(SQLite3DB::DB *db):IPageHandler(db)\r
13 {\r
14         m_imagewhitelist.insert("images/new_posts.png");\r
15         m_imagewhitelist.insert("images/no_new_posts.png");\r
16 }\r
17 \r
18 void ShowImagePage::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)\r
19 {\r
20         m_log->trace("ShowImagePage::handleRequest from "+request.clientAddress().toString());\r
21 \r
22         std::map<std::string,std::string> queryvars;\r
23         CreateQueryVarMap(request,queryvars);\r
24 \r
25         if(request.getVersion()==Poco::Net::HTTPRequest::HTTP_1_1)\r
26         {\r
27                 response.setChunkedTransferEncoding(true);\r
28         }\r
29 \r
30         std::string content="";\r
31         if(queryvars.find("image")!=queryvars.end() && m_imagewhitelist.find((*queryvars.find("image")).second)!=m_imagewhitelist.end())\r
32         {\r
33                 if(m_imagecache.find((*queryvars.find("image")).second)!=m_imagecache.end())\r
34                 {\r
35                         content+=std::string(m_imagecache[(*queryvars.find("image")).second].begin(),m_imagecache[(*queryvars.find("image")).second].end());\r
36                 }\r
37                 else\r
38                 {\r
39                         FILE *infile=fopen((*queryvars.find("image")).second.c_str(),"rb");\r
40                         if(infile)\r
41                         {\r
42                                 fseek(infile,0,SEEK_END);\r
43                                 long filelen=ftell(infile);\r
44                                 fseek(infile,0,SEEK_SET);\r
45 \r
46                                 if(filelen>0)\r
47                                 {\r
48                                         std::vector<char> data(filelen,0);\r
49                                         fread(&data[0],1,data.size(),infile);\r
50                                         content+=std::string(data.begin(),data.end());\r
51                                         m_imagecache[(*queryvars.find("image")).second]=data;\r
52                                 }\r
53 \r
54                                 fclose(infile);\r
55                         }\r
56                 }\r
57         }\r
58 \r
59         std::ostream &ostr = response.send();\r
60         ostr << content;\r
61 }\r
62 \r
63 const bool ShowImagePage::WillHandleURI(const std::string &uri)\r
64 {\r
65         if(uri.find("showimage.htm")!=std::string::npos)\r
66         {\r
67                 return true;\r
68         }\r
69         else\r
70         {\r
71                 return false;\r
72         }\r
73 }\r