////////////////////////////////////////////////////////////////////// // DlgServerGui: ISAPI web server connector. #include "WebCtrl.h" #pragma hdrstop #define LNGFILE #define LANGUAGE LNG_CZECH #include #define LNGFILE #define LNGMODULE Web_Ctrl_DlgHttpServer_lay #define LANGUAGE LNG_CZECH #include #define LANGUAGE LNG_ENGLISH #include #define LAYOUTFILE #include #undef LNGFILE #undef LNGMODULE #define LNGFILE #define LANGUAGE LNG_CZECH #include #define LNGFILE #define LNGMODULE Web_Ctrl_DlgHttpServer #define LANGUAGE LNG_CZECH #include #define LANGUAGE LNG_ENGLISH #include #include "WebImg.h" #define IMAGECLASS WebImg #define IMAGEFILE #include ////////////////////////////////////////////////////////////////////// void DeleteMask(const char *path, const char *mask) { Vector files; FindFile ff; if(ff.Search(AppendFileName(path, mask))) do if(!ff.IsDirectory()) files.Add(ff.GetName()); while(ff.Next()); while(!files.IsEmpty()) DeleteFile(AppendFileName(path, files.Pop())); } ////////////////////////////////////////////////////////////////////// void DeleteMask(const char *mask) { DeleteMask(GetFileDirectory(mask), GetFileNamePos(mask)); } ////////////////////////////////////////////////////////////////////// template class Moveable; class DlgServerGui : public WithHttpServerLayout { friend class DlgHttpServer; public: typedef DlgServerGui CLASSNAME; DlgServerGui(); bool Run(int timeout); void AddServer(HttpServer& server); void RemoveServer(HttpServer& server); int GetServerCount() const; HttpServer& GetServer(int i) const; One GetRequest(); private: void OnMinimize(); void OnStop(); protected: HttpServer *activeserver; Index servers; GradientDisplay gradient; bool minimized; bool stopped; Time start_time; }; ////////////////////////////////////////////////////////////////////// RegisterHelpTopicObjectTitle(DlgHttpServer, s_(DlgHttpServerTitle)) DlgServerGui::DlgServerGui() : gradient(Point(0, -1), Color(192, 255, 192), Point(-1, 0), White) { activeserver = NULL; minimized = false; CtrlLayoutOKCancel(*this, DlgHttpServerHelpTitle()); HelpTopic("DlgHttpServer"); run_time.SetReadOnly(); response.SetReadOnly(); trailing.SetReadOnly(); elapsed_time.SetReadOnly(); hits.SetReadOnly(); Icon(WebImg::small_web_server(), WebImg::large_web_server()); ActiveFocus(ok); Background(gradient); MinimizeBox(); ok <<= THISBACK(OnMinimize); cancel <<= WhenClose = THISBACK(OnStop); run_time <<= Format(start_time = GetSysTime()); } ////////////////////////////////////////////////////////////////////// /* static void LogExc(const Exc& e, WebConfig& cfg) { cfg.Log("exception at " + Format(GetSysTime()) + ": " + e); } */ ////////////////////////////////////////////////////////////////////// bool DlgServerGui::Run(int timeout_msec) { stopped = false; activeserver = NULL; try { // if(context.LogRequests) // context.Log("normal startup at " + Format(dog_time = GetSysTime()) + "\r\n"); if(!IsOpen()) { TopWindow::OpenMain(); if(minimized) Minimize(false); } /* if(!IsNull(context.dlg_position.x) && context.dlg_position.y >= 0) { Size dlgSize = dialog.GetScreenRect().Size(); dialog.SetRect(Rect(minmax(context.dlg_position, Point(0, 0), Point(ScreenInfo().GetPagePixels() - dlgSize)), dlgSize)); } #ifdef PLATFORM_MFC CWinApp *app = AfxGetApp(); bool set_main_wnd = false; if(app && !app -> m_pMainWnd) { set_main_wnd = true; app -> m_pMainWnd = GetCWnd(); } #endif//PLATFORM_MFC */ String text; int delta = fround(GetSysTime() - start_time); if(delta < 60) text << delta << " s"; else if(delta < 3600) text = Format(s_(DlgHttpServerFormatMinSec), delta / 60, delta % 60); else text = Format(s_(DlgHttpServerFormatHourMinSec), delta / 3600, delta / 60 % 60, delta % 60); elapsed_time = text; double s_hits = 0, s_response = 0, s_trailing = 0; for(int i = 0; i < servers.GetCount(); i++) { s_hits += servers[i] -> GetHitCount(); s_response += servers[i] -> GetAvgTime(); s_trailing += servers[i] -> GetAvgLagTime(); } int ndiv = max(servers.GetCount(), 1); hits = AsString(s_hits, 0); response = AsString(s_response / ndiv, 0); trailing = AsString(s_trailing / ndiv, 0); semaphore.SetImage(WebImg::semaphore_green()); Show(); ProcessEvents(); activeserver = HttpServer::Wait(servers.GetKeys(), min(timeout_msec, 100)); if(activeserver) { semaphore.SetImage(WebImg::semaphore_red()); semaphore.Sync(); } return !stopped; } catch(Exc e) { // LogExc(e, context); #ifdef _DEBUG PromptOK(e); #endif//_DEBUG // context.exit_code = Null; return false; } } ////////////////////////////////////////////////////////////////////// void DlgServerGui::AddServer(HttpServer& server) { servers.FindAdd(&server); } ////////////////////////////////////////////////////////////////////// void DlgServerGui::RemoveServer(HttpServer& server) { int i = servers.Find(&server); if(i >= 0) servers.Remove(i); } ////////////////////////////////////////////////////////////////////// int DlgServerGui::GetServerCount() const { return servers.GetCount(); } ////////////////////////////////////////////////////////////////////// HttpServer& DlgServerGui::GetServer(int i) const { return *servers[i]; } ////////////////////////////////////////////////////////////////////// One DlgServerGui::GetRequest() { if(!activeserver) return NULL; One request = activeserver -> GetRequest(); activeserver = NULL; return request; } ////////////////////////////////////////////////////////////////////// void DlgServerGui::OnMinimize() { Minimize(); } ////////////////////////////////////////////////////////////////////// void DlgServerGui::OnStop() { stopped = true; } ////////////////////////////////////////////////////////////////////// // DlgHttpServer:: DlgHttpServer::DlgHttpServer() { gui = new DlgServerGui; } ////////////////////////////////////////////////////////////////////// DlgHttpServer::~DlgHttpServer() { } ////////////////////////////////////////////////////////////////////// void DlgHttpServer::Title(const char *t) { gui -> Title(t); } ////////////////////////////////////////////////////////////////////// void DlgHttpServer::Icon(Image small_icon, Image large_icon) { gui -> Icon(small_icon, large_icon); } ////////////////////////////////////////////////////////////////////// void DlgHttpServer::Minimize(bool min) { if(!gui -> IsOpen()) gui -> minimized = min; else if(min) gui -> Minimize(); else gui -> Restore(); } ////////////////////////////////////////////////////////////////////// bool DlgHttpServer::IsMinimized() const { return gui -> IsOpen() ? gui -> IsMinimized() : gui -> minimized; } ////////////////////////////////////////////////////////////////////// void DlgHttpServer::Position(Point pt) { if(gui -> IsOverlapped()) { Rect old_rc = gui -> GetRect(); Rect work_rc = Ctrl::GetWorkArea(); Size rc = old_rc.Size(); pt.x += (pt.x >= 0 ? work_rc.left : work_rc.right + pt.x - rc.cx); pt.y += (pt.y >= 0 ? work_rc.top : work_rc.bottom + pt.y - rc.cy); gui -> SetRect(old_rc + (pt - old_rc.TopLeft())); } } ////////////////////////////////////////////////////////////////////// Point DlgHttpServer::GetPosition() const { return gui -> GetRect().TopLeft(); } ////////////////////////////////////////////////////////////////////// bool DlgHttpServer::Wait(int msec) { return gui -> Run(msec); } ////////////////////////////////////////////////////////////////////// One DlgHttpServer::GetRequest() { return gui -> GetRequest(); } ////////////////////////////////////////////////////////////////////// void DlgHttpServer::AddServer(HttpServer& server) { gui -> AddServer(server); } ////////////////////////////////////////////////////////////////////// void DlgHttpServer::RemoveServer(HttpServer& server) { gui -> RemoveServer(server); } ////////////////////////////////////////////////////////////////////// int DlgHttpServer::GetServerCount() const { return gui -> GetServerCount(); } ////////////////////////////////////////////////////////////////////// HttpServer& DlgHttpServer::GetServer(int i) const { return gui -> GetServer(i); } //////////////////////////////////////////////////////////////////////