45 const char *undef =
"<undefined>";
47 if (!value)
return dflt;
48 std::string svalue = value;
49 if (svalue == undef)
return dflt;
51 if (svalue ==
"yes")
return 1;
52 if (svalue ==
"no")
return 0;
76 static std::shared_ptr<RWebWindowsManager> sInstance = std::make_shared<RWebWindowsManager>();
125 fAssgnExec = std::make_unique<TExec>(
"init_threadid",
"ROOT::Experimental::RWebWindowsManager::AssignMainThrd();");
237 if (
gROOT->GetWebDisplay() ==
"off")
241 std::lock_guard<std::recursive_mutex> grd(
fMutex);
245 fServer = std::make_unique<THttpServer>(
"basic_sniffer");
256 if (send_thrds != -1)
277 R__LOG_ERROR(
WebGUILog()) <<
"Path to ROOT ui5 sources " << ui5dir <<
" not found, set ROOTUI5SYS correctly";
281 fServer->AddLocation(
"rootui5sys/", ui5dir.
Data());
284 if (!with_http ||
fServer->IsAnyEngine())
288 int http_min =
gEnv->
GetValue(
"WebGui.HttpPortMin", 8800);
289 int http_max =
gEnv->
GetValue(
"WebGui.HttpPortMax", 9800);
290 int http_timer =
gEnv->
GetValue(
"WebGui.HttpTimer", 10);
291 int http_thrds =
gEnv->
GetValue(
"WebGui.HttpThreads", 10);
292 int http_wstmout =
gEnv->
GetValue(
"WebGui.HttpWSTmout", 10000);
293 int http_maxage =
gEnv->
GetValue(
"WebGui.HttpMaxAge", -1);
294 int fcgi_port =
gEnv->
GetValue(
"WebGui.FastCgiPort", 0);
295 int fcgi_thrds =
gEnv->
GetValue(
"WebGui.FastCgiThreads", 10);
296 const char *fcgi_serv =
gEnv->
GetValue(
"WebGui.FastCgiServer",
"");
299 const char *http_bind =
gEnv->
GetValue(
"WebGui.HttpBind",
"");
301 const char *ssl_cert =
gEnv->
GetValue(
"WebGui.ServerCert",
"rootserver.pem");
305 if ((http_port < 0) && (fcgi_port <= 0)) {
320 if (http_max - http_min < ntry)
321 ntry = http_max - http_min;
327 while (ntry-- >= 0) {
328 if ((http_port == 0) && (fcgi_port <= 0)) {
329 if ((http_min <= 0) || (http_max <= http_min)) {
330 R__LOG_ERROR(
WebGUILog()) <<
"Wrong HTTP range configuration, check WebGui.HttpPortMin/Max variables";
334 http_port = (
int)(http_min + (http_max - http_min) *
gRandom->
Rndm(1));
340 engine.
Form(
"fastcgi:%d?thrds=%d", fcgi_port, fcgi_thrds);
341 if (!
fServer->CreateEngine(engine))
return false;
342 if (fcgi_serv && (strlen(fcgi_serv) > 0))
fAddr = fcgi_serv;
343 if (http_port < 0)
return true;
345 }
else if (http_port > 0) {
346 url = use_secure ?
"https://" :
"http://";
347 engine.
Form(
"%s:%d?thrds=%d&websocket_timeout=%d", (use_secure ?
"https" :
"http"), http_port, http_thrds, http_wstmout);
348 if (assign_loopback) {
349 engine.
Append(
"&loopback");
351 }
else if (http_bind && (strlen(http_bind) > 0)) {
359 if (http_maxage >= 0)
363 engine.
Append(
"&ssl_cert=");
367 if (
fServer->CreateEngine(engine)) {
370 fAddr.append(std::to_string(http_port));
387 std::lock_guard<std::recursive_mutex> grd(
fMutex);
394 std::shared_ptr<RWebWindow> win = std::make_shared<RWebWindow>();
401 double dflt_tmout =
gEnv->
GetValue(
"WebGui.OperationTmout", 50.);
403 auto wshandler = win->CreateWSHandler(
Instance(), ++
fIdCnt, dflt_tmout);
406 std::string fname, prefix;
408 prefix = std::string(
"f") + std::to_string(
fIdCnt) +
"_";
409 fname = std::string(
"protcol") + std::to_string(
fIdCnt) +
".json";
411 fname =
"protocol.json";
413 win->RecordData(fname, prefix);
420 win->UseServerThreads();
422 win->UseServerThreads();
424 const char *token =
gEnv->
GetValue(
"WebGui.ConnToken",
"");
426 win->SetConnToken(token);
428 fServer->RegisterWS(wshandler);
453 std::string addr =
"/";
528 std::lock_guard<std::recursive_mutex> grd(
fMutex);
540 }
while ((--ntry > 0) && win.
HasKey(key));
557 if (!normal_http && (
gEnv->
GetValue(
"WebGui.ForceHttp",0) == 1))
560 std::string url =
GetUrl(win, normal_http);
565 if (normal_http &&
fAddr.empty()) {
578 std::cout <<
"New web window: " << args.
GetUrl() << std::endl;
607 int res = 0, cnt = 0;
610 auto start = std::chrono::high_resolution_clock::now();
616 while ((res = check(spent)) == 0) {
625 std::this_thread::sleep_for(std::chrono::milliseconds(cnt > 5000 ? 10 : 1));
627 std::chrono::duration<double, std::milli> elapsed = std::chrono::high_resolution_clock::now() - start;
629 spent = elapsed.count() * 1
e-3;
631 if (timed && (spent > timelimit))
#define R__LOG_WARNING(...)
#define R__LOG_ERROR(...)
static bool gWebWinMainThrdSet
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.
std::string GetBrowserName() const
Returns configured browser name.
bool IsSupportHeadless() const
returns true if browser supports headless mode
bool IsHeadless() const
returns headless mode
RWebDisplayArgs & SetUrl(const std::string &url)
set window url
int GetHeight() const
returns preferable web window height
void SetHttpServer(THttpServer *serv)
set http server instance, used for window display
EBrowserKind GetBrowserKind() const
returns configured browser kind, see EBrowserKind for supported values
void AppendUrlOpt(const std::string &opt)
append extra url options, add "&" as separator if required
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
@ kOff
disable web display, do not start any browser
RWebDisplayArgs & SetHeight(int h=0)
set preferable web window height
const std::string & GetUrl() const
returns window url
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.
static int GetBoolEnv(const std::string &name, int dfl=-1)
Parse boolean gEnv variable which should be "yes" or "no" Returns 1 for true or 0 for false Returns.
Represents web window, which can be shown in web browser or any other supported environment.
void Sync()
Special method to process all internal activity when window runs in separate thread.
bool fCallbacksThrdIdSet
! flag indicating that thread id is assigned
unsigned AddDisplayHandle(bool headless_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...
std::thread::id fCallbacksThrdId
! thread id where callbacks should be invoked
std::string GetConnToken() const
Returns configured connection token.
unsigned GetHeight() const
returns configured window height (0 - default)
bool HasKey(const std::string &key) const
Returns true if provided key value already exists (in processes map or in existing connections)
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
bool fUseServerThreads
! indicates that server thread is using, no special window thread
bool fProcessMT
! if window event processing performed in dedicated thread
void AssignWindowThreadId(RWebWindow &win)
Assign thread id for window Required in case of external process events.
std::unique_ptr< THttpServer > fServer
! central communication with the all used displays
std::string GetUrl(const RWebWindow &win, bool remote=false)
Provide URL address to access specified window from inside or from remote.
bool CreateServer(bool with_http=false)
Creates http server, if required - with real http engine (civetweb) One could configure concrete HTTP...
RWebWindowsManager()
window manager constructor 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...
std::recursive_mutex fMutex
! main mutex, used for window creations
unsigned fIdCnt
! counter for identifiers
unsigned ShowWindow(RWebWindow &win, const RWebDisplayArgs &args)
Show window in specified location, see Show() method for more details.
std::string fAddr
! HTTP address of the server
bool fUseSenderThreads
! use extra threads for sending data from RWebWindow to clients
void Terminate()
Terminate http server and ROOT application.
~RWebWindowsManager()
window manager destructor Required here for correct usage of unique_ptr<THttpServer>
THttpServer * GetServer() const
Returns THttpServer instance.
WebWindowShowCallback_t fShowCallback
! function called for each RWebWindow::Show call
static void AssignMainThrd()
Re-assigns main thread id Normally main thread id recognized at the moment when library is loaded It ...
std::unique_ptr< TExec > fAssgnExec
! special exec to assign thread id via ProcessEvents
bool IsUseHttpThread() const
Returns true if http server use special thread for requests processing (default off)
static bool IsMainThrd()
Returns true when called from main process Main process recognized at the moment when library is load...
static std::shared_ptr< RWebWindowsManager > & Instance()
Returns default window manager Used to display all standard ROOT elements like TCanvas or TFitPanel.
bool fUseHttpThrd
! use special thread for THttpServer
void Unregister(RWebWindow &win)
Release all references to specified window Called from RWebWindow destructor.
float fLaunchTmout
! timeout in seconds to start browser process, default 30s
bool fExternalProcessEvents
! indicate that there are external process events engine
std::shared_ptr< RWebWindow > CreateWindow()
Creates new window To show window, RWebWindow::Show() have to be called.
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).
static void SingleShot(Int_t milliSec, const char *receiver_class, void *receiver, const char *method)
This static function calls a slot after a given time interval.
RLogChannel & WebGUILog()
Log channel for WebGUI diagnostics.
std::function< int(double)> WebWindowWaitFunc_t
function signature for waiting call-backs Such callback used when calling thread need to waits for so...