56 static std::shared_ptr<RWebWindowsManager> sInstance = std::make_shared<ROOT::Experimental::RWebWindowsManager>();
91 if (
gApplication && fServer && !fServer->IsTerminated()) {
93 fServer->SetTerminate();
144 std::lock_guard<std::recursive_mutex> grd(fMutex);
148 fServer = std::make_unique<THttpServer>(
"basic_sniffer");
150 const char *serv_thrd =
gEnv->
GetValue(
"WebGui.HttpThrd",
"");
151 if (serv_thrd && strstr(serv_thrd,
"yes"))
153 else if (serv_thrd && strstr(serv_thrd,
"no"))
154 fUseHttpThrd =
false;
156 const char *send_thrds =
gEnv->
GetValue(
"WebGui.SenderThrds",
"");
157 if (send_thrds && *send_thrds) {
158 if (strstr(send_thrds,
"yes"))
159 fUseSenderThreads =
true;
160 else if (strstr(send_thrds,
"no"))
161 fUseSenderThreads =
false;
163 R__ERROR_HERE(
"WebDisplay") <<
"WebGui.SenderThrds has to be yes or no";
166 if (IsUseHttpThread())
167 fServer->CreateServerThread();
183 R__ERROR_HERE(
"WebDisplay") <<
"Path to ROOT ui5 sources " << ui5dir <<
" not found, set ROOTUI5SYS correctly";
187 fServer->AddLocation(
"rootui5sys/", ui5dir.
Data());
190 if (!with_http || !fAddr.empty())
194 int http_min =
gEnv->
GetValue(
"WebGui.HttpPortMin", 8800);
195 int http_max =
gEnv->
GetValue(
"WebGui.HttpPortMax", 9800);
196 int http_wstmout =
gEnv->
GetValue(
"WebGui.HttpWSTmout", 10000);
197 int http_maxage =
gEnv->
GetValue(
"WebGui.HttpMaxAge", -1);
198 fLaunchTmout =
gEnv->
GetValue(
"WebGui.LaunchTmout", 30.);
199 const char *http_loopback =
gEnv->
GetValue(
"WebGui.HttpLoopback",
"no");
200 const char *http_bind =
gEnv->
GetValue(
"WebGui.HttpBind",
"");
201 const char *http_ssl =
gEnv->
GetValue(
"WebGui.UseHttps",
"no");
202 const char *ssl_cert =
gEnv->
GetValue(
"WebGui.ServerCert",
"rootserver.pem");
204 bool assign_loopback = http_loopback && strstr(http_loopback,
"yes");
205 bool use_secure = http_ssl && strstr(http_ssl,
"yes");
209 R__ERROR_HERE(
"WebDisplay") <<
"Not allowed to create real HTTP server, check WebGui.HttpPort variable";
216 if (http_max - http_min < ntry)
217 ntry = http_max - http_min;
219 while (ntry-- >= 0) {
221 if ((http_min <= 0) || (http_max <= http_min)) {
222 R__ERROR_HERE(
"WebDisplay") <<
"Wrong HTTP range configuration, check WebGui.HttpPortMin/Max variables";
226 http_port = (int)(http_min + (http_max - http_min) *
gRandom->
Rndm(1));
229 TString engine, url(use_secure ?
"https://" :
"http://");
230 engine.
Form(
"%s:%d?websocket_timeout=%d", (use_secure ?
"https" :
"http"), http_port, http_wstmout);
231 if (assign_loopback) {
232 engine.
Append(
"&loopback");
234 }
else if (http_bind && (strlen(http_bind) > 0)) {
242 if (http_maxage >= 0)
246 engine.
Append(
"&ssl_cert=");
250 if (fServer->CreateEngine(engine)) {
253 fAddr.append(std::to_string(http_port));
271 std::lock_guard<std::recursive_mutex> grd(fMutex);
273 if (!CreateServer()) {
274 R__ERROR_HERE(
"WebDisplay") <<
"Cannot create server when creating window";
278 std::shared_ptr<ROOT::Experimental::RWebWindow> win = std::make_shared<ROOT::Experimental::RWebWindow>();
281 R__ERROR_HERE(
"WebDisplay") <<
"Fail to create RWebWindow instance";
285 double dflt_tmout =
gEnv->
GetValue(
"WebGui.OperationTmout", 50.);
287 auto wshandler = win->CreateWSHandler(Instance(), ++fIdCnt, dflt_tmout);
290 std::string fname, prefix;
292 prefix = std::string(
"f") + std::to_string(fIdCnt) +
"_";
293 fname = std::string(
"protcol") + std::to_string(fIdCnt) +
".json";
295 fname =
"protocol.json";
297 win->RecordData(fname, prefix);
300 fServer->RegisterWS(wshandler);
321 R__ERROR_HERE(
"WebDisplay") <<
"Server instance not exists when requesting window URL";
325 std::string addr =
"/";
332 if (!CreateServer(
true)) {
333 R__ERROR_HERE(
"WebDisplay") <<
"Fail to start real HTTP server when requesting URL";
381 if (!batch_mode &&
gROOT->IsWebDisplayBatch())
389 std::lock_guard<std::recursive_mutex> grd(fMutex);
392 R__ERROR_HERE(
"WebDisplay") <<
"Server instance not exists to show window";
401 }
while ((--ntry > 0) && win.
HasKey(key));
403 R__ERROR_HERE(
"WebDisplay") <<
"Fail to create unique key for the window";
419 if (!normal_http && (
gEnv->
GetValue(
"WebGui.ForceHttp",0) == 1))
422 std::string url = GetUrl(win, normal_http);
424 R__ERROR_HERE(
"WebDisplay") <<
"Cannot create URL for the window";
462 auto start = std::chrono::high_resolution_clock::now();
466 while ((res = check(spent)) == 0) {
473 std::this_thread::sleep_for(std::chrono::milliseconds(1));
475 std::chrono::duration<double, std::milli> elapsed = std::chrono::high_resolution_clock::now() - start;
477 spent = elapsed.count() * 1
e-3;
479 if (timed && (spent > timelimit))
494 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...
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...