16 #ifndef ROOT7_RWebWindow
17 #define ROOT7_RWebWindow
35 namespace Experimental {
40 using WebWindowConnectCallback_t = std::function<void(unsigned)>;
44 using WebWindowDataCallback_t = std::function<void(unsigned, const std::string &)>;
51 using WebWindowWaitFunc_t = std::function<int(double)>;
53 class RWebWindowsManager;
54 class RWebWindowWSHandler;
58 friend class RWebWindowsManager;
59 friend class RWebWindowWSHandler;
60 friend class RWebDisplayHandle;
63 using timestamp_t = std::chrono::time_point<std::chrono::system_clock>;
69 QueueItem(
int chid,
bool txt, std::string &&data) : fChID(chid), fText(txt), fData(data) {}
74 bool fBatchMode{
false};
76 std::unique_ptr<RWebDisplayHandle> fDisplayHandle;
77 std::shared_ptr<THttpCallArg> fHold;
78 timestamp_t fSendStamp;
82 mutable std::mutex fMutex;
83 timestamp_t fRecvStamp;
86 int fClientCredits{0};
87 bool fDoingSend{
false};
88 std::queue<QueueItem> fQueue;
89 std::map<int,std::shared_ptr<RWebWindow>> fEmbed;
91 WebConn(
unsigned connid) : fConnId(connid) {}
92 WebConn(
unsigned connid,
unsigned wsid) : fConnId(connid), fActive(true), fWSId(wsid) {}
93 WebConn(
unsigned connid,
bool batch_mode,
const std::string &key)
94 : fConnId(connid), fBatchMode(batch_mode), fKey(key)
100 void ResetStamps() { fSendStamp = fRecvStamp = std::chrono::system_clock::now(); }
103 enum EQueueEntryKind { kind_None, kind_Connect, kind_Data, kind_Disconnect };
107 EQueueEntryKind fKind{kind_None};
109 QueueEntry() =
default;
110 QueueEntry(
unsigned connid, EQueueEntryKind kind, std::string &&data) : fConnId(connid), fKind(kind), fData(data) {}
113 using ConnectionsList_t = std::vector<std::shared_ptr<WebConn>>;
115 std::shared_ptr<RWebWindowsManager> fMgr;
116 std::shared_ptr<RWebWindow> fMaster;
117 unsigned fMasterConnId{0};
118 int fMasterChannel{-1};
119 std::string fDefaultPage;
120 std::string fPanelName;
122 bool fProcessMT{
false};
124 std::shared_ptr<RWebWindowWSHandler> fWSHandler;
125 unsigned fConnCnt{0};
126 ConnectionsList_t fPendingConn;
127 ConnectionsList_t fConn;
128 mutable std::mutex fConnMutex;
129 unsigned fConnLimit{1};
130 bool fNativeOnlyConn{
false};
131 unsigned fMaxQueueLength{10};
132 WebWindowConnectCallback_t fConnCallback;
133 WebWindowDataCallback_t fDataCallback;
134 WebWindowConnectCallback_t fDisconnCallback;
135 std::thread::id fCallbacksThrdId;
136 bool fCallbacksThrdIdSet{
false};
137 std::queue<QueueEntry> fInputQueue;
138 std::mutex fInputQueueMutex;
141 float fOperationTmout{50.};
142 std::string fClientVersion;
143 std::string fProtocolFileName;
144 int fProtocolCnt{-1};
145 unsigned fProtocolConnId{0};
146 std::string fProtocolPrefix;
147 std::string fProtocol;
148 std::string fUserArgs;
150 std::shared_ptr<RWebWindowWSHandler> CreateWSHandler(std::shared_ptr<RWebWindowsManager> mgr,
unsigned id,
double tmout);
152 bool ProcessWS(THttpCallArg &arg);
154 void CompleteWSSend(
unsigned wsid);
156 ConnectionsList_t GetConnections(
unsigned connid = 0,
bool only_active =
false)
const;
158 std::shared_ptr<WebConn> FindOrCreateConnection(
unsigned wsid,
bool make_new,
const char *query);
160 std::shared_ptr<WebConn> FindConnection(
unsigned wsid) {
return FindOrCreateConnection(wsid,
false,
nullptr); }
162 std::shared_ptr<WebConn> RemoveConnection(
unsigned wsid);
164 std::string _MakeSendHeader(std::shared_ptr<WebConn> &conn,
bool txt,
const std::string &data,
int chid);
166 void ProvideQueueEntry(
unsigned connid, EQueueEntryKind kind, std::string &&arg);
168 void InvokeCallbacks(
bool force =
false);
170 void SubmitData(
unsigned connid,
bool txt, std::string &&data,
int chid = 1);
172 bool CheckDataToSend(std::shared_ptr<WebConn> &conn);
174 void CheckDataToSend(
bool only_once =
false);
176 bool HasKey(
const std::string &key)
const;
178 void CheckPendingConnections();
180 void CheckInactiveConnections();
182 unsigned AddDisplayHandle(
bool batch_mode,
const std::string &key, std::unique_ptr<RWebDisplayHandle> &handle);
184 unsigned AddEmbedWindow(std::shared_ptr<RWebWindow> window,
int channel);
186 void RemoveEmbedWindow(
unsigned connid,
int channel);
188 bool ProcessBatchHolder(std::shared_ptr<THttpCallArg> &arg);
190 void AssignCallbackThreadId();
199 unsigned GetId()
const {
return fId; }
205 void SetDefaultPage(
const std::string &page) { fDefaultPage = page; }
207 void SetPanelName(
const std::string &name);
210 void SetGeometry(
unsigned width,
unsigned height)
219 unsigned GetWidth()
const {
return fWidth; }
223 unsigned GetHeight()
const {
return fHeight; }
229 void SetConnLimit(
unsigned lmt = 0) { fConnLimit = lmt; }
233 unsigned GetConnLimit()
const {
return fConnLimit; }
237 void SetMaxQueueLength(
unsigned len = 10) { fMaxQueueLength = len; }
241 unsigned GetMaxQueueLength()
const {
return fMaxQueueLength; }
245 void SetNativeOnlyConn(
bool on =
true) { fNativeOnlyConn = on; }
249 bool IsNativeOnlyConn()
const {
return fNativeOnlyConn; }
251 void SetClientVersion(
const std::string &vers);
253 std::string GetClientVersion()
const;
255 void SetUserArgs(
const std::string &args);
257 std::string GetUserArgs()
const;
259 int NumConnections(
bool with_pending =
false)
const;
261 unsigned GetConnectionId(
int num = 0)
const;
263 bool HasConnection(
unsigned connid = 0,
bool only_active =
true)
const;
265 void CloseConnections();
267 void CloseConnection(
unsigned connid);
270 float GetOperationTmout()
const {
return fOperationTmout; }
273 void SetOperationTmout(
float tm = 50.) { fOperationTmout = tm; }
275 std::string GetUrl(
bool remote =
true);
277 THttpServer *GetServer();
281 void Run(
double tm = 0.);
283 unsigned Show(
const RWebDisplayArgs &args =
"");
285 unsigned GetDisplayConnection()
const;
288 bool IsShown()
const {
return GetDisplayConnection() != 0; }
290 unsigned MakeBatch(
bool create_new =
false,
const RWebDisplayArgs &args =
"");
292 unsigned FindBatch();
294 bool CanSend(
unsigned connid,
bool direct =
true)
const;
296 int GetSendQueueLength(
unsigned connid)
const;
298 void Send(
unsigned connid,
const std::string &data);
300 void SendBinary(
unsigned connid,
const void *data, std::size_t len);
302 void SendBinary(
unsigned connid, std::string &&data);
304 void RecordData(
const std::string &fname =
"protocol.json",
const std::string &fprefix =
"");
306 std::string GetAddr()
const;
308 std::string GetRelativeAddr(
const std::shared_ptr<RWebWindow> &win)
const;
310 void SetCallBacks(WebWindowConnectCallback_t conn, WebWindowDataCallback_t data, WebWindowConnectCallback_t disconn =
nullptr);
312 void SetConnectCallBack(WebWindowConnectCallback_t func);
314 void SetDataCallBack(WebWindowDataCallback_t func);
316 void SetDisconnectCallBack(WebWindowConnectCallback_t func);
318 int WaitFor(WebWindowWaitFunc_t check);
320 int WaitForTimed(WebWindowWaitFunc_t check);
322 int WaitForTimed(WebWindowWaitFunc_t check,
double duration);
324 void TerminateROOT();
326 static std::shared_ptr<RWebWindow> Create();
328 static unsigned ShowWindow(std::shared_ptr<RWebWindow> window,
const RWebDisplayArgs &args =
"");