Program Listing for File com_ctrl.h#

Return to documentation for file (ipc_com\com_ctrl.h)

#ifndef COM_CTRL_H
#define COM_CTRL_H

#include <support/pssup.h>
#include <support/component_impl.h>
#include <interfaces/com.h>

// Forward declaration
class CChannelConnector;
class CMarshallObject;

class CCommunicationControl : public sdv::CSdvObject, public sdv::IObjectControl, public sdv::com::IConnectionControl,
    public sdv::ps::IMarshallAccess
{
public:
    CCommunicationControl();

    virtual ~CCommunicationControl() override;

    // Interface map
    BEGIN_SDV_INTERFACE_MAP()
        SDV_INTERFACE_ENTRY(sdv::ps::IMarshallAccess)
        SDV_INTERFACE_ENTRY(sdv::com::IConnectionControl)
        SDV_INTERFACE_ENTRY(sdv::IObjectControl)
    END_SDV_INTERFACE_MAP()

    // Component declarations
    DECLARE_OBJECT_CLASS_TYPE(sdv::EObjectType::SystemObject)
    DECLARE_OBJECT_SINGLETON()
    DECLARE_OBJECT_CLASS_NAME("CommunicationControl")

    virtual void Initialize(const sdv::u8string& ssObjectConfig) override;

    virtual sdv::EObjectStatus GetStatus() const override;

    void SetOperationMode(sdv::EOperationMode eMode) override;

    virtual void Shutdown() override;

    virtual sdv::com::TConnectionID CreateServerConnection(/*in*/ sdv::com::EChannelType eChannelType,
        /*in*/ sdv::IInterfaceAccess* pObject, /*in*/ uint32_t uiTimeoutMs, /*out*/ sdv::u8string& ssConnectionString) override;

    virtual sdv::com::TConnectionID CreateClientConnection(/*in*/ const sdv::u8string& ssConnectionString,
        /*in*/ uint32_t uiTimeoutMs, /*out*/ sdv::IInterfaceAccess*& pProxy) override;

    virtual sdv::com::TConnectionID AssignServerEndpoint(/*in*/ sdv::IInterfaceAccess* pChannelEndpoint,
        /*in*/ sdv::IInterfaceAccess* pObject, /*in*/ uint32_t uiTimeoutMs, /*in*/ bool bAllowReconnect) override;

    virtual sdv::com::TConnectionID AssignClientEndpoint(/*in*/ sdv::IInterfaceAccess* pChannelEndpoint,
        /*in*/ uint32_t uiTimeoutMs, /*out*/ sdv::IInterfaceAccess*& pProxy) override;

    virtual void RemoveConnection(/*in*/ const sdv::com::TConnectionID& tConnectionID) override;

    virtual sdv::interface_t GetProxy(/*in*/ const sdv::ps::TMarshallID& tStubID, /*in*/ sdv::interface_id id) override;

    virtual sdv::ps::TMarshallID GetStub(/*in*/ sdv::interface_t ifc) override;

    std::shared_ptr<CMarshallObject> CreateProxy(sdv::interface_id id, sdv::ps::TMarshallID tStubID,
        CChannelConnector& rConnector);

    std::shared_ptr<CMarshallObject> GetOrCreateStub(sdv::interface_t ifc);

    uint64_t CreateUniqueCallIndex();

    void SetConnectorContext(CChannelConnector* pConnectorContext);

    sdv::sequence<sdv::pointer<uint8_t>> CallStub(sdv::ps::TMarshallID tStubID, sdv::sequence<sdv::pointer<uint8_t>>& seqInputData);

private:
    sdv::EObjectStatus                              m_eObjectStatus = sdv::EObjectStatus::initialization_pending;
    std::mutex                                      m_mtxChannels;
    std::vector<std::shared_ptr<CChannelConnector>> m_vecChannels;
    std::vector<std::thread>                        m_vecInitialConnectMon;
    std::recursive_mutex                            m_mtxObjects;
    std::vector<std::weak_ptr<CMarshallObject>>     m_vecMarshallObjects;
    std::map<sdv::interface_t, std::shared_ptr<CMarshallObject>> m_mapStubObjects;
    std::atomic_uint64_t                            m_uiCurrentCallCnt = 0;
    thread_local static CChannelConnector*          m_pConnectorContext;
};
DEFINE_SDV_OBJECT(CCommunicationControl)

#endif // !defined COM_CTRL_H