55 static std::shared_ptr<RWebWindowsManager> sInstance = std::make_shared<ROOT::Experimental::RWebWindowsManager>();
106 if (
gApplication && fServer && !fServer->IsTerminated()) {
108 fServer->SetTerminate();
159 std::lock_guard<std::recursive_mutex> grd(fMutex);
163 fServer = std::make_unique<THttpServer>(
"basic_sniffer");
165 const char *serv_thrd =
gEnv->
GetValue(
"WebGui.HttpThrd",
"");
166 if (serv_thrd && strstr(serv_thrd,
"yes"))
168 else if (serv_thrd && strstr(serv_thrd,
"no"))
169 fUseHttpThrd =
false;
171 const char *send_thrds =
gEnv->
GetValue(
"WebGui.SenderThrds",
"");
172 if (send_thrds && *send_thrds) {
173 if (strstr(send_thrds,
"yes"))
174 fUseSenderThreads =
true;
175 else if (strstr(send_thrds,
"no"))
176 fUseSenderThreads =
false;
178 R__ERROR_HERE(
"WebDisplay") <<
"WebGui.SenderThrds has to be yes or no";
181 if (IsUseHttpThread())
182 fServer->CreateServerThread();
198 R__ERROR_HERE(
"WebDisplay") <<
"Path to ROOT ui5 sources " << ui5dir <<
" not found, set ROOTUI5SYS correctly";
202 fServer->AddLocation(
"rootui5sys/", ui5dir.
Data());
205 if (!with_http || !fAddr.empty())
209 int http_min =
gEnv->
GetValue(
"WebGui.HttpPortMin", 8800);
210 int http_max =
gEnv->
GetValue(
"WebGui.HttpPortMax", 9800);
211 int http_wstmout =
gEnv->
GetValue(
"WebGui.HttpWSTmout", 10000);
212 int http_maxage =
gEnv->
GetValue(
"WebGui.HttpMaxAge", -1);
213 fLaunchTmout =
gEnv->
GetValue(
"WebGui.LaunchTmout", 30.);
214 const char *http_loopback =
gEnv->
GetValue(
"WebGui.HttpLoopback",
"no");
215 const char *http_bind =
gEnv->
GetValue(
"WebGui.HttpBind",
"");
216 const char *http_ssl =
gEnv->
GetValue(
"WebGui.UseHttps",
"no");
217 const char *ssl_cert =
gEnv->
GetValue(
"WebGui.ServerCert",
"rootserver.pem");
219 bool assign_loopback = http_loopback && strstr(http_loopback,
"yes");
220 bool use_secure = http_ssl && strstr(http_ssl,
"yes");
224 R__ERROR_HERE(
"WebDisplay") <<
"Not allowed to create real HTTP server, check WebGui.HttpPort variable";
231 if (http_max - http_min < ntry)
232 ntry = http_max - http_min;
234 while (ntry-- >= 0) {
236 if ((http_min <= 0) || (http_max <= http_min)) {
237 R__ERROR_HERE(
"WebDisplay") <<
"Wrong HTTP range configuration, check WebGui.HttpPortMin/Max variables";
241 http_port = (
int)(http_min + (http_max - http_min) *
gRandom->
Rndm(1));
244 TString engine, url(use_secure ?
"https://" :
"http://");
245 engine.
Form(
"%s:%d?websocket_timeout=%d", (use_secure ?
"https" :
"http"), http_port, http_wstmout);
246 if (assign_loopback) {
247 engine.
Append(
"&loopback");
249 }
else if (http_bind && (strlen(http_bind) > 0)) {
257 if (http_maxage >= 0)
261 engine.
Append(
"&ssl_cert=");
265 if (fServer->CreateEngine(engine)) {
268 fAddr.append(std::to_string(http_port));
286 std::lock_guard<std::recursive_mutex> grd(fMutex);
288 if (!CreateServer()) {
289 R__ERROR_HERE(
"WebDisplay") <<
"Cannot create server when creating window";
293 std::shared_ptr<ROOT::Experimental::RWebWindow> win = std::make_shared<ROOT::Experimental::RWebWindow>();
296 R__ERROR_HERE(
"WebDisplay") <<
"Fail to create RWebWindow instance";
300 double dflt_tmout =
gEnv->
GetValue(
"WebGui.OperationTmout", 50.);
302 auto wshandler = win->CreateWSHandler(Instance(), ++fIdCnt, dflt_tmout);
305 std::string fname, prefix;
307 prefix = std::string(
"f") + std::to_string(fIdCnt) +
"_";
308 fname = std::string(
"protcol") + std::to_string(fIdCnt) +
".json";
310 fname =
"protocol.json";
312 win->RecordData(fname, prefix);
315 fServer->RegisterWS(wshandler);
336 R__ERROR_HERE(
"WebDisplay") <<
"Server instance not exists when requesting window URL";
340 std::string addr =
"/";
347 if (!CreateServer(
true)) {
348 R__ERROR_HERE(
"WebDisplay") <<
"Fail to start real HTTP server when requesting URL";
396 if (!batch_mode &&
gROOT->IsWebDisplayBatch())
404 std::lock_guard<std::recursive_mutex> grd(fMutex);
407 R__ERROR_HERE(
"WebDisplay") <<
"Server instance not exists to show window";
416 }
while ((--ntry > 0) && win.
HasKey(key));
418 R__ERROR_HERE(
"WebDisplay") <<
"Fail to create unique key for the window";
434 if (!normal_http && (
gEnv->
GetValue(
"WebGui.ForceHttp",0) == 1))
437 std::string url = GetUrl(win, normal_http);
439 R__ERROR_HERE(
"WebDisplay") <<
"Cannot create URL for the window";
477 auto start = std::chrono::high_resolution_clock::now();
481 while ((res = check(spent)) == 0) {
488 std::this_thread::sleep_for(std::chrono::milliseconds(1));
490 std::chrono::duration<double, std::milli> elapsed = std::chrono::high_resolution_clock::now() - start;
492 spent = elapsed.count() * 1
e-3;
494 if (timed && (spent > timelimit))
509 fServer->SetTerminate();
#define R__ERROR_HERE(GROUP)
static std::thread::id gWebWinMainThrd
This thread id used to identify main application thread, where ROOT event processing runs To inject c...
R__EXTERN TApplication * gApplication
R__EXTERN TRandom * gRandom
R__EXTERN TSystem * gSystem
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
bool IsSupportHeadless() const
returns true if browser supports headless mode
RWebDisplayArgs & SetUrl(const std::string &url)
set window url
int GetHeight() const
returns preferable web window height
void SetHeadless(bool on=true)
set headless mode
void SetHttpServer(THttpServer *serv)
set http server instance, used for window display
EBrowserKind GetBrowserKind() const
returns configured browser kind, see EBrowserKind for supported values
std::string GetBrowserName() const
Returns configured browser name.
bool IsLocalDisplay() const
returns true if local display like CEF or Qt5 QWebEngine should be used
@ kEmbedded
window will be embedded into other, no extra browser need to be started
void AppendUrlOpt(const std::string &opt)
append extra url options, add "&" as separator if required
RWebDisplayArgs & SetHeight(int h=0)
set preferable web window height
int GetWidth() const
returns preferable web window width
RWebDisplayArgs & SetWidth(int w=0)
set preferable web window width
static std::unique_ptr< RWebDisplayHandle > Display(const RWebDisplayArgs &args)
Create web display.
Represents web window, which can be shown in web browser or any other supported environment.
bool HasKey(const std::string &key) const
Returns true if provided key value already exists (in processes map or in existing connections)
unsigned AddDisplayHandle(bool batch_mode, const std::string &key, std::unique_ptr< RWebDisplayHandle > &handle)
Add display handle and associated key Key is random number generated when starting new window When cl...
void Sync()
Special method to process all internal activity when window runs in separate thread.
unsigned GetHeight() const
returns configured window height (0 - default)
unsigned GetWidth() const
returns configured window width (0 - default) actual window width can be different
std::shared_ptr< RWebWindowWSHandler > fWSHandler
! specialize websocket handler for all incoming connections
std::shared_ptr< RWebWindow > CreateWindow()
Creates new window To show window, RWebWindow::Show() have to be called.
static std::shared_ptr< RWebWindowsManager > & Instance()
Returns default window manager Used to display all standard ROOT elements like TCanvas or TFitPanel.
std::string GetUrl(const RWebWindow &win, bool remote=false)
Provide URL address to access specified window from inside or from remote.
void Unregister(RWebWindow &win)
Release all references to specified window Called from RWebWindow destructor.
static bool IsMainThrd()
Returns true when called from main process Main process recognized at the moment when library is load...
static void AssignMainThrd()
Re-assigns main thread id Normally main thread id recognized at the moment when library is loaded It ...
RWebWindowsManager()
window manager constructor Required here for correct usage of unique_ptr<THttpServer>
unsigned ShowWindow(RWebWindow &win, bool batch_mode, const RWebDisplayArgs &args)
Show window in specified location, see Show() method for more details.
bool CreateServer(bool with_http=false)
Creates http server, if required - with real http engine (civetweb) One could configure concrete HTTP...
~RWebWindowsManager()
window manager destructor Required here for correct usage of unique_ptr<THttpServer>
int WaitFor(RWebWindow &win, WebWindowWaitFunc_t check, bool timed=false, double tm=-1)
Waits until provided check function or lambdas returns non-zero value Regularly calls WebWindow::Sync...
void Terminate()
Terminate http server and ROOT application.
virtual void Terminate(Int_t status=0)
Terminate the application by call TSystem::Exit() unless application has been told to return from Run...
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Non-static method is used to connect from the signal of this object to the receiver slot.
Bool_t Disconnect(const char *signal=0, void *receiver=0, const char *slot=0)
Disconnects signal of this object from slot of receiver.
static const TString & GetDataDir()
Get the data directory in the installation. Static utility function.
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
virtual Double_t Rndm()
Machine independent random number generator.
virtual UInt_t Integer(UInt_t imax)
Returns a random integer uniformly distributed on the interval [ 0, imax-1 ].
const char * Data() const
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
virtual const char * Getenv(const char *env)
Get environment variable.
virtual Bool_t ProcessEvents()
Process pending events (GUI, timers, sockets).
std::function< int(double)> WebWindowWaitFunc_t
function signature for waiting call-backs Such callback used when calling thread need to waits for so...