Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 10:10:50

0001 // Author: Sergey Linev <s.linev@gsi.de>
0002 // Date: 2017-10-16
0003 // Warning: This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback is welcome!
0004 
0005 /*************************************************************************
0006  * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers.               *
0007  * All rights reserved.                                                  *
0008  *                                                                       *
0009  * For the licensing terms see $ROOTSYS/LICENSE.                         *
0010  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
0011  *************************************************************************/
0012 
0013 #ifndef ROOT7_RWebWindowsManager
0014 #define ROOT7_RWebWindowsManager
0015 
0016 #include <memory>
0017 #include <string>
0018 #include <thread>
0019 #include <mutex>
0020 #include <functional>
0021 
0022 #include "THttpEngine.h"
0023 
0024 #include <ROOT/RWebWindow.hxx>
0025 
0026 class THttpServer;
0027 class THttpWSHandler;
0028 class TExec;
0029 
0030 namespace ROOT {
0031 
0032 /// function signature for catching show calls of arbitrary RWebWindow
0033 /// if returns true, normal show procedure will not be invoked
0034 using WebWindowShowCallback_t = std::function<bool(RWebWindow &, const RWebDisplayArgs &)>;
0035 
0036 class RWebWindowsManager {
0037 
0038    friend class RWebWindow;
0039 
0040 private:
0041    std::unique_ptr<THttpServer> fServer;  ///<! central communication with the all used displays
0042    std::string fAddr;                     ///<! HTTP address of the server
0043    std::string fSessionKey;               ///<! secret session key used on client to code connections keys
0044    bool fUseSessionKey{false};            ///<! is session key has to be used for data signing
0045    std::recursive_mutex fMutex;           ///<! main mutex, used for window creations
0046    unsigned fIdCnt{0};                    ///<! counter for identifiers
0047    bool fUseHttpThrd{false};              ///<! use special thread for THttpServer
0048    bool fUseSenderThreads{false};         ///<! use extra threads for sending data from RWebWindow to clients
0049    float fLaunchTmout{30.};               ///<! timeout in seconds to start browser process, default 30s
0050    bool fExternalProcessEvents{false};    ///<! indicate that there are external process events engine
0051    std::unique_ptr<TExec> fAssgnExec;     ///<! special exec to assign thread id via ProcessEvents
0052    WebWindowShowCallback_t fShowCallback; ///<! function called for each RWebWindow::Show call
0053 
0054    /// Returns true if http server use special thread for requests processing (default off)
0055    bool IsUseHttpThread() const { return fUseHttpThrd; }
0056 
0057    /// Returns true if extra threads to send data via websockets will be used (default off)
0058    bool IsUseSenderThreads() const { return fUseSenderThreads; }
0059 
0060    /// Returns timeout for launching new browser process
0061    float GetLaunchTmout() const { return fLaunchTmout; }
0062 
0063    void Unregister(RWebWindow &win);
0064 
0065    /// Show window in specified location, see Show() method for more details
0066    unsigned ShowWindow(RWebWindow &win, const RWebDisplayArgs &args);
0067 
0068    int WaitFor(RWebWindow &win, WebWindowWaitFunc_t check, bool timed = false, double tm = -1);
0069 
0070    std::string GetUrl(RWebWindow &win, bool remote = false, std::string *produced_key = nullptr);
0071 
0072    bool CreateServer(bool with_http = false);
0073 
0074    bool InformListener(const std::string &msg);
0075 
0076    static std::string GenerateKey(int keylen = 32);
0077 
0078 public:
0079    RWebWindowsManager();
0080 
0081    ~RWebWindowsManager();
0082 
0083    /// Returns THttpServer instance
0084    THttpServer *GetServer() const { return fServer.get(); }
0085 
0086    /// Returns http address of the server, empty string when not available
0087    std::string GetServerAddr() const { return fAddr; }
0088 
0089    /// Assign show callback which can catch window showing, used by RBrowser
0090    void SetShowCallback(WebWindowShowCallback_t func) { fShowCallback = func; }
0091 
0092    static std::shared_ptr<RWebWindowsManager> &Instance();
0093 
0094    std::shared_ptr<RWebWindow> CreateWindow();
0095 
0096    void Terminate();
0097 
0098    static bool IsMainThrd();
0099    static void AssignMainThrd();
0100 
0101    static void SetLoopbackMode(bool on = true);
0102    static bool IsLoopbackMode();
0103 
0104    static void SetUseSessionKey(bool on = true);
0105    static void SetUseConnectionKey(bool on = true);
0106 };
0107 
0108 } // namespace ROOT
0109 
0110 #endif