36using namespace std::string_literals;
 
   45      fHold->SetTextContent(
"console.log('execute holder script');  if (window) setTimeout (window.close, 1000); if (window) window.close();");
 
   46      fHold->NotifyCondition();
 
 
   90      std::vector<MasterConn> 
lst;
 
  116      for (
auto &conn : 
lst) {
 
  117         conn->fActive = 
false;
 
  118         for (
auto &
elem: conn->fEmbed)
 
  119            elem.second->RemoveMasterConnection();
 
  120         conn->fEmbed.clear();
 
  123      fMgr->Unregister(*
this);
 
 
  136      if (!
fConn.empty()) {
 
 
  151std::shared_ptr<RWebWindowWSHandler>
 
  183   return fMgr->GetServer();
 
 
  193   return fMgr->ShowWindow(*
this, args);
 
 
  210      connid = 
fMgr->ShowWindow(*
this, args);
 
 
  226      if (
entry->fHeadlessMode)
 
  227         return entry->fConnId;
 
  230   for (
auto &conn : 
fConn) {
 
  231      if (conn->fHeadlessMode)
 
  232         return conn->fConnId;
 
 
  249      if (!
entry->fHeadlessMode)
 
  250         return entry->fConnId;
 
  253   for (
auto &conn : 
fConn) {
 
  254      if (!conn->fHeadlessMode)
 
  255         return conn->fConnId;
 
 
  268   for (
auto &conn : 
fConn) {
 
  269      if (conn->fWSId == 
wsid)
 
 
  282   std::shared_ptr<WebConn> res;
 
  287      for (
size_t n = 0; 
n < 
fConn.size(); ++
n)
 
  289            res = std::move(
fConn[
n]);
 
  291            res->fActive = 
false;
 
  297      for (
auto &
elem: res->fEmbed)
 
  298         elem.second->RemoveMasterConnection(res->fConnId);
 
 
  327   std::vector<MasterConn> 
lst;
 
  334      if (!connid || 
entry.connid == connid)
 
 
  356            if (iter->connid == connid) {
 
 
  376   std::string 
query = arg->GetQuery();
 
  378   if (
query.compare(0, 4, 
"key=") != 0)
 
  381   std::string key = 
query.substr(4);
 
  383   std::shared_ptr<THttpCallArg> prev;
 
  391         if (
entry->fKey == key)  {
 
  394            prev = std::move(
entry->fHold);
 
  399      for (
auto &conn : 
fConn) {
 
  400         if (conn->fKey == key) {
 
  402            prev = std::move(conn->fHold);
 
  410      prev->SetTextContent(
"console.log('execute holder script'); if (window) window.close();");
 
  411      prev->NotifyCondition();
 
 
  453         connid = 
entry.fConnId;
 
  455         arg = std::move(
entry.fData);
 
 
  487      if (
entry->fKey == key) {
 
  489         std::swap(
entry->fDisplayHandle, handle);
 
  490         return entry->fConnId;
 
  496   std::swap(conn->fDisplayHandle, handle);
 
 
  532         if (conn->fKeyUsed >= 
intry) {
 
  539         conn->fKeyUsed = 
intry;
 
  541         if (conn->fKeyUsed != 
intry) {
 
 
  566      if (
entry->fKey == key)
 
  570   for (
auto &conn : 
fConn) {
 
  571      if (conn->fKey == key)
 
 
  590      auto pred = [&](std::shared_ptr<WebConn> &
e) {
 
  591         if (
e->fKey == key) {
 
  602   for (
auto &conn : 
lst)
 
 
  615   R__ASSERT((!
HasKey(key) && (key != 
fMgr->fSessionKey)) && 
"Fail to generate window connection key");
 
 
  637      auto pred = [&](std::shared_ptr<WebConn> &
e) {
 
  638         std::chrono::duration<double> 
diff = 
stamp - 
e->fSendStamp;
 
 
  664   std::vector<std::shared_ptr<WebConn>> 
clr;
 
  669      auto pred = [&](std::shared_ptr<WebConn> &conn) {
 
  670         std::chrono::duration<double> 
diff = 
stamp - conn->fSendStamp;
 
  673            conn->fActive = 
false;
 
  674            clr.emplace_back(conn);
 
 
  761         if (!
url.HasOption(
"token") || (
fConnToken != 
url.GetValueFromOptions(
"token"))) {
 
  770      if(!
url.HasOption(
"key")) {
 
  775      std::string key, 
ntry;
 
  776      if (
url.HasOption(
"key"))
 
  777         key = 
url.GetValueFromOptions(
"key");
 
  778      if(
url.HasOption(
"ntry"))
 
  779         ntry = 
url.GetValueFromOptions(
"ntry");
 
  795      std::shared_ptr<WebConn> conn;
 
  796      std::string key, 
ntry;
 
  800      if (
url.HasOption(
"key"))
 
  801         key = 
url.GetValueFromOptions(
"key");
 
  802      if (
url.HasOption(
"ntry"))
 
  803         ntry = 
url.GetValueFromOptions(
"ntry");
 
  817         conn->fActive = 
true;
 
  823         fConn.emplace_back(conn);
 
  843      std::string key, 
ntry;
 
  844      if(
url.HasOption(
"key"))
 
  845         key = 
url.GetValueFromOptions(
"key");
 
  846      if(
url.HasOption(
"ntry"))
 
  847         ntry = 
url.GetValueFromOptions(
"ntry");
 
  861         if (!conn->fNewKey.empty()) {
 
  865            conn->fKey = conn->fNewKey;
 
  866            conn->fNewKey.clear();
 
  921      std::string 
hmac = 
HMAC(conn->fKey, 
fMgr->fSessionKey, buf, data_len);
 
  924   } 
else if (!
fMgr->fUseSessionKey) {
 
  988      std::lock_guard<std::mutex> 
grd(conn->fMutex);
 
  993      conn->fRecvStamp = 
stamp;
 
 1014      if ((
cdata.compare(0, 6, 
"READY=") == 0) && !conn->fReady) {
 
 1016         std::string key = 
cdata.substr(6);
 
 1023         if (!key.empty() && !conn->fKey.empty() && (conn->fKey != key)) {
 
 1024            R__LOG_ERROR(
WebGUILog()) << 
"Key mismatch after established connection " << key << 
" != " << conn->fKey;
 
 1037      } 
else if (
cdata.compare(0, 8, 
"CLOSECH=") == 0) {
 
 1038         int channel = std::stoi(
cdata.substr(8));
 
 1039         auto iter = conn->fEmbed.find(channel);
 
 1040         if (iter != conn->fEmbed.end()) {
 
 1042            conn->fEmbed.erase(iter);
 
 1044      } 
else if (
cdata.compare(0, 7, 
"RESIZE=") == 0) {
 
 1045         auto p = 
cdata.find(
",");
 
 1046         if (
p != std::string::npos) {
 
 1049            if ((
width > 0) && (
height > 0) && conn->fDisplayHandle)
 
 1052      } 
else if (
cdata == 
"GENERATE_KEY") {
 
 1057            if(!conn->fNewKey.empty())
 
 1058               SubmitData(conn->fConnId, 
true, 
"NEW_KEY="s + conn->fNewKey, -1);
 
 1061   } 
else if (
fPanelName.length() && (conn->fReady < 10)) {
 
 1062      if (
cdata == 
"PANEL_READY") {
 
 
 1096      std::lock_guard<std::mutex> 
grd(conn->fMutex);
 
 1097      conn->fDoingSend = 
false;
 
 
 1116   if (conn->fSendCredits <= 0) {
 
 1121   if (conn->fDoingSend) {
 
 1127      buf.reserve(
data.length() + 100);
 
 1129   buf.append(std::to_string(conn->fSendSeq++));
 
 1131   buf.append(std::to_string(conn->fRecvCount));
 
 1133   buf.append(std::to_string(conn->fSendCredits));
 
 1135   conn->fRecvCount = 0; 
 
 1136   conn->fSendCredits--;
 
 1138   buf.append(std::to_string(
chid));
 
 1143   } 
else if (
data.length()==0) {
 
 1144      buf.append(
"$$nullbinary$$");
 
 1146      buf.append(
"$$binary$$");
 
 1147      if (!conn->fKey.empty() && !
fMgr->fSessionKey.empty() && 
fMgr->fUseSessionKey)
 
 1148         buf.append(
HMAC(conn->fKey, 
fMgr->fSessionKey, 
data.data(), 
data.length()));
 
 
 1160   std::string 
hdr, 
data, prefix;
 
 1163      std::lock_guard<std::mutex> 
grd(conn->fMutex);
 
 1165      if (!conn->fActive || (conn->fSendCredits <= 0) || conn->fDoingSend) 
return false;
 
 1167      if (!conn->fQueue.empty()) {
 
 1173      } 
else if ((conn->fClientCredits < 3) && (conn->fRecvCount > 1)) {
 
 1178      if (
hdr.empty()) 
return false;
 
 1180      conn->fDoingSend = 
true;
 
 1184   if (!conn->fKey.empty() && !
fMgr->fSessionKey.empty() && 
fMgr->fUseSessionKey) {
 
 1185      prefix = 
HMAC(conn->fKey, 
fMgr->fSessionKey, 
hdr.c_str(), 
hdr.length());
 
 1191   hdr.insert(0, prefix);
 
 1202   if (res >=0) 
return true;
 
 1205   std::lock_guard<std::mutex> 
grd(conn->fMutex);
 
 1206   conn->fDoingSend = 
false;
 
 
 1224      for (
auto &conn : 
arr)
 
 
 1277   std::string res(
"../");
 
 1278   res.append(
win.GetAddr());
 
 
 1379   return ((num >= 0) && (num < (
int)
fConn.size()) && 
fConn[num]->fActive) ? 
fConn[num]->fConnId : 0;
 
 
 1389   std::vector<unsigned> res;
 
 1398            res.emplace_back(
entry.connid);
 
 1402            res.emplace_back(
entry->fConnId);
 
 
 1417   for (
auto &conn : 
fConn) {
 
 1418      if (connid && (conn->fConnId != connid))
 
 1426         if (!connid || (conn->fConnId == connid))
 
 
 1465      for (
auto &conn : 
fConn) {
 
 1466         if ((conn->fActive || !
only_active) && (!connid || (conn->fConnId == connid)))
 
 1467            arr.push_back(conn);
 
 1472            if (!connid || (conn->fConnId == connid))
 
 1473               arr.push_back(conn);
 
 
 1490   for (
auto &conn : 
arr) {
 
 1492      std::lock_guard<std::mutex> 
grd(conn->fMutex);
 
 1494      if (
direct && (!conn->fQueue.empty() || (conn->fSendCredits == 0) || conn->fDoingSend))
 
 1497      if (conn->fQueue.size() >= 
maxqlen)
 
 
 1514      std::lock_guard<std::mutex> 
grd(conn->fMutex);
 
 1515      int len = conn->fQueue.size();
 
 
 1533      auto cnt = 
lst.size();
 
 1543   auto cnt = 
arr.size();
 
 1555   for (
auto &conn : 
arr) {
 
 1561            fname.append(
"msg");
 
 1564               fname.append(
"_ch");
 
 1567            fname.append(
txt ? 
".txt" : 
".bin");
 
 1569            std::ofstream ofs(
fname);
 
 1570            ofs.write(
data.c_str(), 
data.length());
 
 1582      conn->fSendStamp = 
stamp;
 
 1584      std::lock_guard<std::mutex> 
grd(conn->fMutex);
 
 1587         while (!conn->fQueue.empty())
 
 1591      if (conn->fQueue.size() < 
maxqlen) {
 
 1593            conn->fQueue.emplace(
chid, 
txt, std::string(
data)); 
 
 
 1634   std::copy((
const char *)
data, (
const char *)
data + 
len, buf.begin());
 
 1635   SubmitData(connid, 
false, std::move(buf), 1);
 
 
 1654   } 
else if (
fMgr->IsUseHttpThread()) {
 
 1656      R__LOG_ERROR(
WebGUILog()) << 
"create web window from main thread when THttpServer created with special thread - not supported";
 
 
 1689   std::thread 
thrd([
this] {
 
 
 1852   if (
arr.size() == 0)
 
 1856   if (
arr[0]->fEmbed.find(channel) != 
arr[0]->fEmbed.
end())
 
 1859   arr[0]->fEmbed[channel] = window;
 
 1861   return arr[0]->fConnId;
 
 
 1871   for (
auto &conn : 
arr) {
 
 1872      auto iter = conn->fEmbed.find(channel);
 
 1873      if (iter != conn->fEmbed.end())
 
 1874         conn->fEmbed.erase(iter);
 
 
 1921      if (args.
fMaster && window->fMaster && window->fMaster != args.
fMaster) {
 
 1930         window->RemoveMasterConnection(connid);
 
 1944   return window->Show(args);
 
 
 1965   return msg.compare(0, 11, 
"FILEDIALOG:") == 0;
 
 
 2000      sha256_final(&
hash, 
reinterpret_cast<unsigned char *
>(
digest.data()));
 
 2004      static const char* 
digits = 
"0123456789abcdef";
 
 2006      for (
int n = 0; 
n < 32; 
n++) {
 
 2007         unsigned char code = (
unsigned char) 
digest[
n];
 
 2008         hex += 
digits[code / 16];
 
 2009         hex += 
digits[code % 16];
 
 2016   sha256_init(&
hash1);
 
 2018   sha256_update(&
hash1, (
const unsigned char *) key.data(), key.length());
 
 2024   const int opad = 0x5c;
 
 2025   const int ipad = 0x36;
 
 2026   for (
size_t i = 0; i < 
kbis.length(); ++i) {
 
 2033   sha256_init(&
hash2);
 
 2034   sha256_update(&
hash2, (
const unsigned char *) 
ki.data(), 
ki.length());
 
 2035   sha256_update(&
hash2, (
const unsigned char *) 
msg, msglen);
 
 2040   sha256_init(&
hash3);
 
 2041   sha256_update(&
hash3, (
const unsigned char *) 
ko.data(), 
ko.length());
 
 
#define R__LOG_WARNING(...)
 
#define R__LOG_ERROR(...)
 
#define R__LOG_DEBUG(DEBUGLEVEL,...)
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
winID h TVirtualViewer3D TVirtualGLPainter p
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t stamp
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t win
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t height
 
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
 
R__EXTERN TSystem * gSystem
 
const_iterator end() const
 
Holds different arguments for starting browser with RWebDisplayHandle::Display() method.
 
EBrowserKind GetBrowserKind() const
returns configured browser kind, see EBrowserKind for supported values
 
unsigned fMasterConnection
! used master connection
 
int fMasterChannel
! used master channel
 
std::shared_ptr< RWebWindow > fMaster
! master window
 
@ kEmbedded
window will be embedded into other, no extra browser need to be started
 
void SetHeadless(bool on=true)
set headless mode
 
static int GetBoolEnv(const std::string &name, int dfl=-1)
Parse boolean gEnv variable which should be "yes" or "no".
 
Represents web window, which can be shown in web browser or any other supported environment.
 
bool CheckDataToSend(std::shared_ptr< WebConn > &conn)
Checks if one should send data for specified connection Returns true when send operation was performe...
 
int WaitFor(WebWindowWaitFunc_t check)
Waits until provided check function or lambdas returns non-zero value Check function has following si...
 
unsigned GetId() const
Returns ID for the window - unique inside window manager.
 
std::vector< MasterConn > GetMasterConnections(unsigned connid=0) const
Get list of master connections.
 
void AddMasterConnection(std::shared_ptr< RWebWindow > window, unsigned connid, int channel)
Add new master connection If there are many connections - only same master is allowed.
 
std::mutex fConnMutex
! mutex used to protect connection list
 
WebWindowDataCallback_t fDataCallback
! main callback when data over channel 1 is arrived
 
void CheckInactiveConnections()
Check if there are connection which are inactive for longer time For instance, batch browser will be ...
 
unsigned fId
! unique identifier
 
bool fHasWindowThrd
! indicate if special window thread was started
 
std::vector< MasterConn > fMasterConns
! master connections
 
void SetClearOnClose(const std::shared_ptr< void > &handle=nullptr)
Set handle which is cleared when last active connection is closed Typically can be used to destroy we...
 
void StartThread()
Start special thread which will be used by the window to handle all callbacks One has to be sure,...
 
unsigned fConnCnt
! counter of new connections to assign ids
 
unsigned fProtocolConnId
! connection id, which is used for writing protocol
 
ConnectionsList_t GetWindowConnections(unsigned connid=0, bool only_active=false) const
returns connection list (or all active connections)
 
bool fSendMT
! true is special threads should be used for sending data
 
std::thread::id fCallbacksThrdId
! thread id where callbacks should be invoked
 
void RemoveKey(const std::string &key)
Removes all connections with the key.
 
std::queue< QueueEntry > fInputQueue
! input queue for all callbacks
 
bool _CanTrustIn(std::shared_ptr< WebConn > &conn, const std::string &key, const std::string &ntry, bool remote, bool test_first_time)
Check if provided hash, ntry parameters from the connection request could be accepted.
 
void SetConnToken(const std::string &token="")
Configures connection token (default none) When specified, in URL of webpage such token should be pro...
 
unsigned MakeHeadless(bool create_new=false)
Start headless browser for specified window Normally only single instance is used,...
 
std::string GetUrl(bool remote=true)
Return URL string to connect web window URL typically includes extra parameters required for connecti...
 
void CloseConnections()
Closes all connection to clients Normally leads to closing of all correspondent browser windows Some ...
 
std::shared_ptr< RWebWindow > fMaster
! master window where this window is embedded
 
int NumConnections(bool with_pending=false) const
Returns current number of active clients connections.
 
bool fCallbacksThrdIdSet
! flag indicating that thread id is assigned
 
std::string fUserArgs
! arbitrary JSON code, which is accessible via conn.getUserArgs() method
 
void SetDefaultPage(const std::string &page)
Set content of default window HTML page This page returns when URL address of the window will be requ...
 
unsigned fConnLimit
! number of allowed active connections
 
void InvokeCallbacks(bool force=false)
Invoke callbacks with existing data Must be called from appropriate thread.
 
std::shared_ptr< WebConn > FindConnection(unsigned wsid)
Find connection with specified websocket id.
 
std::string GetClientVersion() const
Returns current client version.
 
void SetConnectCallBack(WebWindowConnectCallback_t func)
Set call-back function for new connection.
 
std::vector< std::shared_ptr< WebConn > > ConnectionsList_t
 
void Sync()
Special method to process all internal activity when window runs in separate thread.
 
void UseServerThreads()
Let use THttpServer threads to process requests WARNING!!! only for expert use Should be only used wh...
 
void TerminateROOT()
Terminate ROOT session Tries to correctly close THttpServer, associated with RWebWindowsManager After...
 
void Send(unsigned connid, const std::string &data)
Sends data to specified connection.
 
unsigned Show(const RWebDisplayArgs &args="")
Show window in specified location.
 
THttpServer * GetServer()
Return THttpServer instance serving requests to the window.
 
unsigned AddDisplayHandle(bool headless_mode, const std::string &key, std::unique_ptr< RWebDisplayHandle > &handle)
Add display handle and associated key Key is large random string generated when starting new window W...
 
void AssignThreadId()
Assign thread id which has to be used for callbacks WARNING!!! only for expert use Automatically done...
 
bool IsNativeOnlyConn() const
returns true if only native (own-created) connections are allowed
 
void SendBinary(unsigned connid, const void *data, std::size_t len)
Send binary data to specified connection.
 
static std::shared_ptr< RWebWindow > Create()
Create new RWebWindow Using default RWebWindowsManager.
 
std::string fClientVersion
! configured client version, used as prefix in scripts URL
 
bool ProcessBatchHolder(std::shared_ptr< THttpCallArg > &arg)
Process special http request, used to hold headless browser running Such requests should not be repli...
 
unsigned AddEmbedWindow(std::shared_ptr< RWebWindow > window, unsigned connid, int channel)
Add embed window.
 
void SetDisconnectCallBack(WebWindowConnectCallback_t func)
Set call-back function for disconnecting.
 
std::vector< unsigned > GetConnections(unsigned excludeid=0) const
returns vector with all existing connections ids One also can exclude specified connection from retur...
 
void SetDataCallBack(WebWindowDataCallback_t func)
Set call-back function for data, received from the clients via websocket.
 
float fOperationTmout
! timeout in seconds to perform synchronous operation, default 50s
 
bool fRequireAuthKey
! defines if authentication key always required when connect to the widget
 
void SetUserArgs(const std::string &args)
Set arbitrary JSON data, which is accessible via conn.getUserArgs() method in JavaScript This JSON co...
 
std::string fConnToken
! value of "token" URL parameter which should be provided for connecting window
 
static unsigned ShowWindow(std::shared_ptr< RWebWindow > window, const RWebDisplayArgs &args="")
Static method to show web window Has to be used instead of RWebWindow::Show() when window potentially...
 
std::shared_ptr< RWebWindowWSHandler > fWSHandler
! specialize websocket handler for all incoming connections
 
void StopThread()
Stop special thread.
 
void SubmitData(unsigned connid, bool txt, std::string &&data, int chid=1)
Internal method to send data.
 
static std::string HMAC(const std::string &key, const std::string &sessionKey, const char *msg, int msglen)
Calculate HMAC checksum for provided key and message Key combained from connection key and session ke...
 
~RWebWindow()
RWebWindow destructor Closes all connections and remove window from manager.
 
static bool EmbedFileDialog(const std::shared_ptr< RWebWindow > &window, unsigned connid, const std::string &args)
Create dialog instance to use as embedded dialog inside provided widget Loads libROOTBrowserv7 and tr...
 
void CloseConnection(unsigned connid)
Close specified connection.
 
ConnectionsList_t fPendingConn
! list of pending connection with pre-assigned keys
 
unsigned GetConnectionId(int num=0) const
Returns connection id for specified connection sequence number Only active connections are returned -...
 
std::string GetConnToken() const
Returns configured connection token.
 
float GetOperationTmout() const
Returns timeout for synchronous WebWindow operations.
 
void SetConnLimit(unsigned lmt=0)
Configure maximal number of allowed connections - 0 is unlimited Will not affect already existing con...
 
void SetPanelName(const std::string &name)
Configure window to show some of existing JSROOT panels It uses "file:rootui5sys/panel/panel....
 
bool IsRequireAuthKey() const
returns true if authentication string is required
 
RWebWindow()
RWebWindow constructor Should be defined here because of std::unique_ptr<RWebWindowWSHandler>
 
std::string fProtocolPrefix
! prefix for created files names
 
int GetSendQueueLength(unsigned connid) const
Returns send queue length for specified connection.
 
std::shared_ptr< WebConn > RemoveConnection(unsigned wsid)
Remove connection with given websocket id.
 
std::shared_ptr< RWebWindowWSHandler > CreateWSHandler(std::shared_ptr< RWebWindowsManager > mgr, unsigned id, double tmout)
Assigns manager reference, window id and creates websocket handler, used for communication with the c...
 
std::string fProtocol
! protocol
 
bool CanSend(unsigned connid, bool direct=true) const
Returns true if sending via specified connection can be performed.
 
std::string GetUserArgs() const
Returns configured user arguments for web window See SetUserArgs method for more details.
 
void RecordData(const std::string &fname="protocol.json", const std::string &fprefix="")
Configures recording of communication data in protocol file Provided filename will be used to store J...
 
bool fUseProcessEvents
! all window functionality will run through process events
 
unsigned GetDisplayConnection() const
Returns first connection id where window is displayed It could be that connection(s) not yet fully es...
 
unsigned GetConnLimit() const
returns configured connections limit (0 - default)
 
std::string GetRelativeAddr(const std::shared_ptr< RWebWindow > &win) const
Returns relative URL address for the specified window Address can be required if one needs to access ...
 
static void SetStartDialogFunc(std::function< bool(const std::shared_ptr< RWebWindow > &, unsigned, const std::string &)>)
Configure func which has to be used for starting dialog.
 
std::string fPanelName
! panel name which should be shown in the window
 
void Run(double tm=0.)
Run window functionality for specified time If no action can be performed - just sleep specified time...
 
std::string GetAddr() const
Returns window address which is used in URL.
 
std::shared_ptr< RWebWindowsManager > fMgr
! display manager
 
std::string fProtocolFileName
! local file where communication protocol will be written
 
ConnectionsList_t fConn
! list of all accepted connections
 
WebWindowConnectCallback_t fConnCallback
! callback for connect event
 
void CheckPendingConnections()
Check if started process(es) establish connection.
 
std::shared_ptr< void > fClearOnClose
! entry which is cleared when last connection is closed
 
std::mutex fInputQueueMutex
! mutex to protect input queue
 
static std::function< bool(const std::shared_ptr< RWebWindow > &, unsigned, const std::string &) gStartDialogFunc)
 
std::string _MakeSendHeader(std::shared_ptr< WebConn > &conn, bool txt, const std::string &data, int chid)
Internal method to prepare text part of send data Should be called under locked connection mutex.
 
std::chrono::time_point< std::chrono::system_clock > timestamp_t
 
bool ProcessWS(THttpCallArg &arg)
Processing of websockets call-backs, invoked from RWebWindowWSHandler Method invoked from http server...
 
bool HasConnection(unsigned connid=0, bool only_active=true) const
returns true if specified connection id exists
 
std::thread fWindowThrd
! special thread for that window
 
void ProvideQueueEntry(unsigned connid, EQueueEntryKind kind, std::string &&arg)
Provide data to user callback User callback must be executed in the window thread.
 
bool HasKey(const std::string &key, bool also_newkey=false) const
Returns true if provided key value already exists (in processes map or in existing connections) In sp...
 
void CompleteWSSend(unsigned wsid)
Complete websocket send operation Clear "doing send" flag and check if next operation has to be start...
 
bool fUseServerThreads
! indicates that server thread is using, no special window thread
 
unsigned FindHeadlessConnection()
Returns connection id of window running in headless mode This can be special connection which may run...
 
int WaitForTimed(WebWindowWaitFunc_t check)
Waits until provided check function or lambdas returns non-zero value Check function has following si...
 
bool fProcessMT
! if window event processing performed in dedicated thread
 
int fProtocolCnt
! counter for protocol recording
 
void SetClientVersion(const std::string &vers)
Set client version, used as prefix in scripts URL When changed, web browser will reload all related J...
 
void RemoveMasterConnection(unsigned connid=0)
Remove master connection - if any.
 
void RemoveEmbedWindow(unsigned connid, int channel)
Remove RWebWindow associated with the channelfEmbed.
 
void SetCallBacks(WebWindowConnectCallback_t conn, WebWindowDataCallback_t data, WebWindowConnectCallback_t disconn=nullptr)
Set call-backs function for connect, data and disconnect events.
 
std::string GenerateKey() const
Generate new unique key for the window.
 
void SetUseCurrentDir(bool on=true)
Configure if window can access local files via currentdir/ path of http server.
 
WebWindowConnectCallback_t fDisconnCallback
! callback for disconnect event
 
unsigned GetMaxQueueLength() const
Return maximal queue length of data which can be held by window.
 
static bool IsFileDialogMessage(const std::string &msg)
Check if this could be the message send by client to start new file dialog If returns true,...
 
static std::string GenerateKey(int keylen=32)
Static method to generate cryptographic key Parameter keylen defines length of cryptographic key in b...
 
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.
 
static bool IsLoopbackMode()
Returns true if loopback mode used by THttpServer for web widgets.
 
Contains arguments for single HTTP call.
 
UInt_t GetWSId() const
get web-socket id
 
const char * GetTopName() const
returns engine-specific top-name
 
const void * GetPostData() const
return pointer on posted with request data
 
const char * GetQuery() const
returns request query (string after ? in request URL)
 
Long_t GetPostDataLength() const
return length of posted with request data
 
Bool_t IsMethod(const char *name) const
returns kTRUE if post method is used
 
const char * GetFileName() const
returns file name from request URL
 
Online http server for arbitrary ROOT application.
 
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
 
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
 
This class represents a WWW compatible URL.
 
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
 
std::function< void(unsigned, const std::string &)> WebWindowDataCallback_t
function signature for call-backs from the window clients first argument is connection id,...
 
ROOT::Experimental::RLogChannel & WebGUILog()
Log channel for WebGUI diagnostics.
 
std::function< void(unsigned)> WebWindowConnectCallback_t
function signature for connect/disconnect call-backs argument is connection id
 
std::function< int(double)> WebWindowWaitFunc_t
function signature for waiting call-backs Such callback used when calling thread need to waits for so...
 
std::string fData
! text or binary data
 
std::shared_ptr< THttpCallArg > fHold
! request used to hold headless browser
 
~WebConn()
Destructor for WebConn Notify special HTTP request which blocks headless browser from exit.