version 0.3.29
[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 \r
11 void ShowImagePage::handleRequest(Poco::Net::HTTPServerRequest &request, Poco::Net::HTTPServerResponse &response)\r
12 {\r
13         m_log->trace("ShowImagePage::handleRequest from "+request.clientAddress().toString());\r
14 \r
15         std::map<std::string,std::string> queryvars;\r
16         CreateQueryVarMap(request,queryvars);\r
17 \r
18         if(request.getVersion()==Poco::Net::HTTPRequest::HTTP_1_1)\r
19         {\r
20                 response.setChunkedTransferEncoding(true);\r
21         }\r
22 \r
23         std::string content="";\r
24         if(queryvars.find("image")!=queryvars.end())\r
25         {\r
26                 if(m_imagecache.find((*queryvars.find("image")).second)!=m_imagecache.end())\r
27                 {\r
28                         content+=std::string(m_imagecache[(*queryvars.find("image")).second].begin(),m_imagecache[(*queryvars.find("image")).second].end());\r
29                 }\r
30                 else\r
31                 {\r
32                         FILE *infile=fopen((*queryvars.find("image")).second.c_str(),"rb");\r
33                         if(infile)\r
34                         {\r
35                                 fseek(infile,0,SEEK_END);\r
36                                 long filelen=ftell(infile);\r
37                                 fseek(infile,0,SEEK_SET);\r
38 \r
39                                 if(filelen>0)\r
40                                 {\r
41                                         std::vector<char> data(filelen,0);\r
42                                         fread(&data[0],1,data.size(),infile);\r
43                                         content+=std::string(data.begin(),data.end());\r
44                                         m_imagecache[(*queryvars.find("image")).second]=data;\r
45                                 }\r
46 \r
47                                 fclose(infile);\r
48                         }\r
49                 }\r
50         }\r
51 \r
52         std::ostream &ostr = response.send();\r
53         ostr << content;\r
54 }\r
55 \r
56 const bool ShowImagePage::WillHandleURI(const std::string &uri)\r
57 {\r
58         if(uri.find("showimage.htm")!=std::string::npos)\r
59         {\r
60                 return true;\r
61         }\r
62         else\r
63         {\r
64                 return false;\r
65         }\r
66 }\r