00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <webserver/ServerWebAppletHandler.h>
00022 #include <webserver/ServerWebServerUtil.h>
00023 #include <webserver/ServerWebServer.h>
00024 #include <server/ServerChannelManager.h>
00025 #include <server/ServerAdminCommon.h>
00026 #include <XML/XMLNode.h>
00027
00028 bool ServerWebAppletHandler::AppletFileHandler::processRequest(
00029 ServerWebServerIRequest &request,
00030 std::string &text)
00031 {
00032
00033 std::string file =
00034 S3D::getDataFile(
00035 S3D::formatStringBuffer("data/html/server/binary/%s", request.getUrl()));
00036
00037
00038 std::string contents;
00039 FILE *in = fopen(file.c_str(), "rb");
00040 if (!in) return false;
00041 int read = 0;
00042 char buffer[256];
00043 while (read = fread(buffer, 1, 256, in))
00044 {
00045 contents.append(buffer, read);
00046 }
00047 fclose(in);
00048
00049
00050 unsigned int dataSize = contents.size();
00051 text.append(S3D::formatStringBuffer(
00052 "HTTP/1.1 200 OK\r\n"
00053 "Server: Scorched3D\r\n"
00054 "Content-Length: %u\r\n"
00055 "Content-Type: application/octet-stream\r\n"
00056 "Connection: Close\r\n"
00057 "\r\n", dataSize));
00058 text.append(contents.data(), dataSize);
00059
00060 return true;
00061 }
00062
00063 bool ServerWebAppletHandler::AppletHtmlHandler::processRequest(
00064 ServerWebServerIRequest &request,
00065 std::string &text)
00066 {
00067 return ServerWebServerUtil::getHtmlTemplate(request.getSession(), "applet.html", request.getFields(), text);
00068 }
00069
00070 bool ServerWebAppletHandler::AppletActionHandler::processRequest(
00071 ServerWebServerIRequest &request,
00072 std::string &text)
00073 {
00074 const char *action = ServerWebServerUtil::getField(request.getFields(), "action");
00075 if (action)
00076 {
00077
00078 if (0 == strcmp(action, "chat"))
00079 {
00080
00081 const char *text = ServerWebServerUtil::getField(request.getFields(), "text");
00082 const char *channel = ServerWebServerUtil::getField(request.getFields(), "channel");
00083 if (text && channel && request.getSession())
00084 {
00085 ServerAdminCommon::adminSay(request.getSession()->credentials, channel, text);
00086 }
00087 }
00088 }
00089
00090 return true;
00091 }
00092
00093 ServerWebAppletHandler::AppletAsyncHandler::AppletAsyncHandler() :
00094 lastMessage_(0),
00095 initialized_(false)
00096 {
00097 }
00098
00099 bool ServerWebAppletHandler::AppletAsyncHandler::processRequest(
00100 ServerWebServerIRequest &request,
00101 std::string &text)
00102 {
00103
00104 if (!initialized_)
00105 {
00106 initialized_ = true;
00107
00108
00109 {
00110 std::list<std::string> channels =
00111 ServerChannelManager::instance()->getAllChannels();
00112 std::list<std::string>::iterator itor;
00113 for (itor = channels.begin();
00114 itor != channels.end();
00115 itor++)
00116 {
00117 text.append("<addchannel>").
00118 append(itor->c_str()).
00119 append("</addchannel>\n");
00120 }
00121 }
00122 }
00123
00124
00125 std::string chatText;
00126 std::list<ServerChannelManager::MessageEntry> &textsList =
00127 ServerChannelManager::instance()->getLastMessages();
00128 if (!textsList.empty())
00129 {
00130 std::list<ServerChannelManager::MessageEntry>::reverse_iterator textsListItor;
00131 for (textsListItor = textsList.rbegin();
00132 textsListItor != textsList.rend();
00133 textsListItor++)
00134 {
00135 ServerChannelManager::MessageEntry &entry = *textsListItor;
00136 if (lastMessage_ >= entry.messageid) break;
00137
00138 std::string cleanText;
00139 XMLNode::removeSpecialChars(entry.message, cleanText);
00140
00141 chatText.insert(0,
00142 S3D::formatStringBuffer("<chat>%s</chat>\n", cleanText.c_str()));
00143 }
00144 lastMessage_ = textsList.back().messageid;
00145 text.append(chatText);
00146 }
00147
00148 return true;
00149 }