VirtualBox

Ignore:
Timestamp:
Feb 8, 2018 2:56:45 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
120740
Message:

FE/Qt: bugref:6699 Reduce redundant code for event (de)registration

Location:
trunk/src/VBox/Frontends/VirtualBox/src/runtime/information
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/UIGuestSessionsEventHandler.cpp

    r70909 r70912  
    2020#else  /* !VBOX_WITH_PRECOMPILED_HEADERS */
    2121
     22# include <QSharedPointer>
    2223/* GUI includes: */
    2324# include "UIExtraDataManager.h"
     
    4344typedef QMap<ULONG, UIGuestProcess*> GuestProcessMap;
    4445
     46/** A wrapper around (de)registering event listener for COM objects. */
     47template <typename T>
     48class UIEventWrapper
     49{
     50
     51public:
     52    UIEventWrapper(const QVector<KVBoxEventType>& eventTypes, T comObject, QObject* qParent)
     53        : m_comObject(comObject)
     54        , m_bInitialized(false)
     55        , m_pQtListener(0)
     56    {
     57        /* Check if we have a valid COM object */
     58        if (m_comObject.isOk())
     59        {
     60            m_pQtListener.createObject();
     61            m_pQtListener->init(new UIMainEventListener, qParent);
     62            m_comEventListener = CEventListener(m_pQtListener);
     63            /* Get object event source: */
     64            CEventSource comEventSource = m_comObject.GetEventSource();
     65            if(comEventSource.isOk())
     66            {
     67                /* Register event listener for object event source: */
     68                comEventSource.RegisterListener(m_comEventListener, eventTypes,
     69                                                gEDataManager->eventHandlingType() == EventHandlingType_Active ? TRUE : FALSE);
     70                m_bInitialized = true;
     71                /* If event listener registered as passive one: */
     72                if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
     73                {
     74                    m_pQtListener->getWrapped()->registerSource(comEventSource, m_comEventListener);
     75                }
     76            }
     77        }
     78    }
     79    ~UIEventWrapper()
     80    {
     81        if (!m_pQtListener)
     82            return;
     83        if (!vboxGlobal().isVBoxSVCAvailable())
     84            return;
     85        /* Unregister everything: */
     86        if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
     87            m_pQtListener->getWrapped()->unregisterSources();
     88        /* Unregister event listener for object event source: */
     89        if(m_comObject.isOk())
     90        {
     91            CEventSource comEventSourceGuestProcess = m_comObject.GetEventSource();
     92            if(comEventSourceGuestProcess.isOk())
     93                comEventSourceGuestProcess.UnregisterListener(m_comEventListener);
     94        }
     95    }
     96
     97    UIMainEventListener* qtListener()
     98    {
     99        if(!m_pQtListener)
     100            return 0;
     101        return m_pQtListener->getWrapped();
     102    }
     103
     104    bool isInitialized() const
     105    {
     106        return m_bInitialized;
     107    }
     108
     109private:
     110    T m_comObject;
     111    bool m_bInitialized;
     112    ComObjPtr<UIMainEventListenerImpl> m_pQtListener;
     113    CEventListener m_comEventListener;
     114};
    45115
    46116/******************************************************************************************************
     
    59129public:
    60130
    61     UIGuestProcess(QObject *parent, const CGuestProcess &guestProcess);
    62     ~UIGuestProcess();
     131    UIGuestProcess(QObject *parent, CGuestProcess guestProcess);
    63132    QString guestProcessName() const;
    64133    ULONG   guestPID() const;
     
    72141
    73142    void  prepareListener();
    74     void  cleanupListener();
    75143
    76144    CGuestProcess  m_comGuestProcess;
    77     ComObjPtr<UIMainEventListenerImpl> m_pQtListener;
    78     CEventListener m_comEventListener;
     145    QSharedPointer<UIEventWrapper<CGuestProcess> > m_pEventWrapper;
    79146};
    80147
     
    94161public:
    95162
    96     UIGuestSession(QObject *parent, const CGuestSession &guestSession);
    97     ~UIGuestSession();
     163    UIGuestSession(QObject *parent, CGuestSession guestSession);
    98164    QString guestSessionName() const;
    99165    QString guestSessionStatus() const;
     
    108174
    109175    void  prepareListener();
    110     void  cleanupListener();
    111176    void  initialize();
    112177    void  addGuestProcess(const CGuestProcess &guestProcess);
     
    114179
    115180    CGuestSession  m_comGuestSession;
    116     ComObjPtr<UIMainEventListenerImpl> m_pQtListener;
    117     CEventListener m_comEventListener;
     181    QSharedPointer<UIEventWrapper<CGuestSession> > m_pEventWrapper;
    118182    GuestProcessMap m_guestProcessMap;
    119183};
     
    133197public:
    134198
    135     UIGuestSessionsEventHandlerImp(QObject *parent, const CGuest &comGuest);
    136     ~UIGuestSessionsEventHandlerImp();
     199    UIGuestSessionsEventHandlerImp(QObject *parent, CGuest comGuest);
    137200    const GuestSessionMap& getGuestSessionMap() const;
    138201
     
    145208
    146209    void  prepareListener();
    147     void  cleanupListener();
    148210    void  initialize();
    149211
     
    151213    void removeGuestSession(const CGuestSession &guestSession);
    152214
    153 
    154215    CGuest  m_comGuest;
    155     ComObjPtr<UIMainEventListenerImpl> m_pQtListener;
    156     CEventListener m_comEventListener;
     216    QSharedPointer<UIEventWrapper<CGuest> > m_pEventWrapper;
    157217    GuestSessionMap m_guestSessionMap;
    158218};
     
    162222*   UIGuestProcess definition.                                                            *
    163223******************************************************************************************************/
    164 UIGuestProcess::UIGuestProcess(QObject *parent, const CGuestProcess &guestProcess)
     224UIGuestProcess::UIGuestProcess(QObject *parent, CGuestProcess guestProcess)
    165225    :QObject(parent)
    166226    , m_comGuestProcess(guestProcess)
     227    , m_pEventWrapper(0)
    167228{
    168229    qRegisterMetaType<CGuestProcess>("CGuestProcess");
     
    170231}
    171232
    172 UIGuestProcess::~UIGuestProcess()
    173 {
    174     cleanupListener();
    175 }
    176233
    177234void  UIGuestProcess::prepareListener()
     
    179236    if (!m_comGuestProcess.isOk())
    180237        return;
    181 
    182     m_pQtListener.createObject();
    183     m_pQtListener->init(new UIMainEventListener, this);
    184     m_comEventListener = CEventListener(m_pQtListener);
    185     connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigGuestProcessStateChanged,
    186             this, &UIGuestProcess::sigGuestProcessUpdated);
    187 
    188     CEventSource comEventSourceGuestProcess = m_comGuestProcess.GetEventSource();
    189     AssertWrapperOk(comEventSourceGuestProcess);
    190 
    191238    QVector<KVBoxEventType> eventTypes;
    192239    eventTypes  << KVBoxEventType_OnGuestProcessStateChanged
     
    194241                << KVBoxEventType_OnGuestProcessOutput;
    195242
    196     comEventSourceGuestProcess.RegisterListener(m_comEventListener, eventTypes,
    197         gEDataManager->eventHandlingType() == EventHandlingType_Active ? TRUE : FALSE);
    198     AssertWrapperOk(comEventSourceGuestProcess);
    199 
    200     if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
    201     {
    202          m_pQtListener->getWrapped()->registerSource(comEventSourceGuestProcess, m_comEventListener);
    203     }
    204 }
    205 
    206 
    207 void  UIGuestProcess::cleanupListener()
    208 {
    209     if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
    210         m_pQtListener->getWrapped()->unregisterSources();
    211 
    212     if (!vboxGlobal().isVBoxSVCAvailable())
    213         return;
    214     if(m_comGuestProcess.isOk())
    215     {
    216         CEventSource comEventSourceGuestProcess = m_comGuestProcess.GetEventSource();
    217         if(comEventSourceGuestProcess.isOk())
    218         {
    219             AssertWrapperOk(comEventSourceGuestProcess);
    220             comEventSourceGuestProcess.UnregisterListener(m_comEventListener);
    221         }
    222     }
    223 }
     243    m_pEventWrapper =
     244        QSharedPointer<UIEventWrapper<CGuestProcess> >(new UIEventWrapper<CGuestProcess>(eventTypes, m_comGuestProcess, this));
     245
     246    if (m_pEventWrapper && m_pEventWrapper->isInitialized() && m_pEventWrapper->qtListener())
     247        connect(m_pEventWrapper->qtListener(), &UIMainEventListener::sigGuestProcessStateChanged,
     248                this, &UIGuestProcess::sigGuestProcessUpdated);
     249}
     250
    224251
    225252QString UIGuestProcess::guestProcessName() const
     
    289316******************************************************************************************************/
    290317
    291 UIGuestSession::UIGuestSession(QObject *parent, const CGuestSession &guestSession)
     318UIGuestSession::UIGuestSession(QObject *parent, CGuestSession guestSession)
    292319    : QObject(parent)
    293320    , m_comGuestSession(guestSession)
     
    298325}
    299326
    300 UIGuestSession::~UIGuestSession()
    301 {
    302     cleanupListener();
    303 }
    304 
    305327void  UIGuestSession::prepareListener()
    306328{
    307329    if (!m_comGuestSession.isOk())
    308330        return;
    309     /* Create event listener instance: */
    310     m_pQtListener.createObject();
    311     m_pQtListener->init(new UIMainEventListener, this);
    312     m_comEventListener = CEventListener(m_pQtListener);
    313 
    314     connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigGuestSessionStatedChanged,
    315             this, &UIGuestSession::sigGuestSessionUpdated);
    316     connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigGuestProcessRegistered,
    317             this, &UIGuestSession::sltGuestProcessRegistered);
    318     connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigGuestProcessUnregistered,
    319             this, &UIGuestSession::sltGuestProcessUnregistered);
    320 
    321     /* Get CGuest event source: */
    322     CEventSource comEventSourceGuestSession = m_comGuestSession.GetEventSource();
    323     AssertWrapperOk(comEventSourceGuestSession);
    324 
    325     /* Enumerate all the required event-types: */
    326331    QVector<KVBoxEventType> eventTypes;
    327332    eventTypes << KVBoxEventType_OnGuestSessionStateChanged
    328333               << KVBoxEventType_OnGuestProcessRegistered;
    329                // << KVBoxEventType_OnGuestProcessStateChanged
    330                // << KVBoxEventType_OnGuestProcessInputNotify
    331                // << KVBoxEventType_OnGuestProcessOutput
    332                // << KVBoxEventType_OnGuestFileRegistered
    333                // << KVBoxEventType_OnGuestFileStateChanged
    334                // << KVBoxEventType_OnGuestFileOffsetChanged
    335                // << KVBoxEventType_OnGuestFileRead
    336                // << KVBoxEventType_OnGuestFileWrite;
    337 
    338     /* Register event listener for CGuestSession event source: */
    339     comEventSourceGuestSession.RegisterListener(m_comEventListener, eventTypes,
    340         gEDataManager->eventHandlingType() == EventHandlingType_Active ? TRUE : FALSE);
    341     AssertWrapperOk(comEventSourceGuestSession);
    342 
    343     /* If event listener registered as passive one: */
    344     if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
    345     {
    346         /* Register event sources in their listeners as well: */
    347         m_pQtListener->getWrapped()->registerSource(comEventSourceGuestSession, m_comEventListener);
    348     }
    349 }
    350 
    351 void  UIGuestSession::cleanupListener()
    352 {
    353     /* If event listener registered as passive one: */
    354     if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
    355     {
    356         /* Unregister everything: */
    357         m_pQtListener->getWrapped()->unregisterSources();
    358     }
    359 
    360     /* Make sure VBoxSVC is available: */
    361     if (!vboxGlobal().isVBoxSVCAvailable())
    362         return;
    363 
    364     if (m_comGuestSession.isOk())
    365     {
    366         /* Get CGuestSession event source: */
    367         CEventSource comEventSourceGuestSession = m_comGuestSession.GetEventSource();
    368         if (comEventSourceGuestSession.isOk())
    369         {
    370             AssertWrapperOk(comEventSourceGuestSession);
    371 
    372             /* Unregister event listener for CProgress event source: */
    373             comEventSourceGuestSession.UnregisterListener(m_comEventListener);
    374         }
     334
     335    m_pEventWrapper =
     336        QSharedPointer<UIEventWrapper<CGuestSession> >(new UIEventWrapper<CGuestSession>(eventTypes, m_comGuestSession, this));
     337
     338    if (m_pEventWrapper && m_pEventWrapper->isInitialized() && m_pEventWrapper->qtListener())
     339    {
     340        connect(m_pEventWrapper->qtListener(), &UIMainEventListener::sigGuestSessionStatedChanged,
     341                this, &UIGuestSession::sigGuestSessionUpdated);
     342        connect(m_pEventWrapper->qtListener(), &UIMainEventListener::sigGuestProcessRegistered,
     343                this, &UIGuestSession::sltGuestProcessRegistered);
     344        connect(m_pEventWrapper->qtListener(), &UIMainEventListener::sigGuestProcessUnregistered,
     345                this, &UIGuestSession::sltGuestProcessUnregistered);
    375346    }
    376347}
     
    477448******************************************************************************************************/
    478449
    479 UIGuestSessionsEventHandlerImp::UIGuestSessionsEventHandlerImp(QObject *parent, const CGuest &comGuest)
     450UIGuestSessionsEventHandlerImp::UIGuestSessionsEventHandlerImp(QObject *parent, CGuest comGuest)
    480451    : QObject(parent)
    481452    , m_comGuest(comGuest)
     453    , m_pEventWrapper(0)
     454
    482455{
    483456    prepareListener();
     
    485458}
    486459
    487 UIGuestSessionsEventHandlerImp::~UIGuestSessionsEventHandlerImp()
    488 {
    489     cleanupListener();
    490 }
    491 
    492460void UIGuestSessionsEventHandlerImp::prepareListener()
    493461{
    494     if (!m_comGuest.isOk())
    495         return;
    496     /* Create event listener instance: */
    497     m_pQtListener.createObject();
    498     m_pQtListener->init(new UIMainEventListener, this);
    499     m_comEventListener = CEventListener(m_pQtListener);
    500     connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigGuestSessionRegistered,
    501             this, &UIGuestSessionsEventHandlerImp::sltGuestSessionRegistered);
    502     connect(m_pQtListener->getWrapped(), &UIMainEventListener::sigGuestSessionUnregistered,
    503             this, &UIGuestSessionsEventHandlerImp::sltGuestSessionUnregistered);
    504 
    505     /* Get CGuest event source: */
    506     CEventSource comEventSourceGuest = m_comGuest.GetEventSource();
    507     AssertWrapperOk(comEventSourceGuest);
    508 
    509     /* Enumerate all the required event-types: */
     462     if (!m_comGuest.isOk())
     463        return;
    510464    QVector<KVBoxEventType> eventTypes;
    511465    eventTypes << KVBoxEventType_OnGuestSessionRegistered;
    512466
    513     /* Register event listener for CGuest event source: */
    514     comEventSourceGuest.RegisterListener(m_comEventListener, eventTypes,
    515         gEDataManager->eventHandlingType() == EventHandlingType_Active ? TRUE : FALSE);
    516     AssertWrapperOk(comEventSourceGuest);
    517 
    518     /* If event listener registered as passive one: */
    519     if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
    520     {
    521         /* Register event sources in their listeners as well: */
    522         m_pQtListener->getWrapped()->registerSource(comEventSourceGuest, m_comEventListener);
    523     }
    524 }
    525 
    526 void UIGuestSessionsEventHandlerImp::cleanupListener()
    527 {
    528     if (gEDataManager->eventHandlingType() == EventHandlingType_Passive)
    529     {
    530         m_pQtListener->getWrapped()->unregisterSources();
    531     }
    532 
    533     if (!vboxGlobal().isVBoxSVCAvailable())
    534         return;
    535 
    536     CEventSource comEventSourceGuest = m_comGuest.GetEventSource();
    537     AssertWrapperOk(comEventSourceGuest);
    538 
    539     comEventSourceGuest.UnregisterListener(m_comEventListener);
     467    m_pEventWrapper =
     468        QSharedPointer<UIEventWrapper<CGuest> >(new UIEventWrapper<CGuest>(eventTypes, m_comGuest, this));
     469
     470    if (m_pEventWrapper && m_pEventWrapper->isInitialized() && m_pEventWrapper->qtListener())
     471    {
     472        connect(m_pEventWrapper->qtListener(), &UIMainEventListener::sigGuestSessionRegistered,
     473                this, &UIGuestSessionsEventHandlerImp::sltGuestSessionRegistered);
     474        connect(m_pEventWrapper->qtListener(), &UIMainEventListener::sigGuestSessionUnregistered,
     475                this, &UIGuestSessionsEventHandlerImp::sltGuestSessionUnregistered);
     476    }
    540477}
    541478
     
    594531}
    595532
    596 UIGuestSessionsEventHandler::UIGuestSessionsEventHandler(QObject *parent, const CGuest &comGuest)
     533UIGuestSessionsEventHandler::UIGuestSessionsEventHandler(QObject *parent, CGuest comGuest)
    597534    :QObject(parent)
    598535    , m_pPrivateImp(new UIGuestSessionsEventHandlerImp(this, comGuest))
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/information/UIGuestSessionsEventHandler.h

    r70899 r70912  
    3838public:
    3939
    40     UIGuestSessionsEventHandler(QObject *parent, const CGuest &comGuest);
     40    UIGuestSessionsEventHandler(QObject *parent, CGuest comGuest);
    4141    ~UIGuestSessionsEventHandler();
    4242
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette