VirtualBox

Changeset 22305 in vbox


Ignore:
Timestamp:
Aug 17, 2009 5:37:41 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
51179
Message:

Main: generic callback wrappers mechanism

Location:
trunk
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/com/VirtualBox.h

    r8155 r22305  
    5555// for convenience
    5656#include "VBox/com/defs.h"
     57#include "VBox/com/ptr.h"
    5758
     59template <class I>
     60inline HRESULT createCallbackWrapper(I* aInstance,
     61                                     I** paWrapper)
     62{
     63    ComPtr<ILocalOwner> ptr;
     64
     65    HRESULT rc = ptr.createInprocObject(CLSID_VirtualBoxCallback);
     66    if (FAILED(rc))
     67        return rc;
     68
     69    rc = ptr->SetLocalObject(aInstance);
     70    if (FAILED(rc))
     71        return rc;
     72
     73    ComPtr<I> ptr2 = ptr;
     74    if (ptr2.isNull())
     75        return E_FAIL;
     76
     77    rc = ptr2.queryInterfaceTo(paWrapper);
     78    return rc;
     79}
    5880#endif
  • trunk/include/VBox/com/defs.h

    r21521 r22305  
    608608#define VBOX_SCRIPTABLE_IMPL(iface)                     \
    609609    public iface
    610 #define VBOX_SCRIPTABLE_DISPATCH_IMPL(iface)               
     610#define VBOX_SCRIPTABLE_DISPATCH_IMPL(iface)
    611611#endif
    612612
  • trunk/include/VBox/com/ptr.h

    r17911 r22305  
    541541    }
    542542};
    543 
    544543#endif
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestProp.cpp

    r21520 r22305  
    436436    Bstr uuid;
    437437    machine->COMGETTER(Id)(uuid.asOutParam());
    438     GuestPropertyCallback *callback = new GuestPropertyCallback(pszPatterns, uuid);
    439     callback->AddRef();
     438    GuestPropertyCallback* cbImpl = new GuestPropertyCallback(pszPatterns, uuid);
     439    ComPtr<IVirtualBoxCallback> callback;
     440    rc = createCallbackWrapper((IVirtualBoxCallback*)cbImpl, callback.asOutParam());
     441    if (FAILED(rc))
     442        return 1;
    440443    a->virtualBox->RegisterCallback (callback);
    441444    bool stop = false;
     
    466469            u32Timeout += (uint32_t)(u64Time + 1000 - u64NextTime);
    467470            a->eventQ->ProcessPendingEvents();
    468             if (callback->Signalled())
     471            if (cbImpl->Signalled())
    469472                stop = true;
    470473        }
     
    474477        /**@todo r=bird: get to it!*/
    475478        RTThreadSleep(RT_MIN(1000, u32Timeout));
    476         if (callback->Signalled())
     479        if (cbImpl->Signalled())
    477480            stop = true;
    478481#endif /* !USE_XPCOM_QUEUE */
     
    483486     */
    484487    a->virtualBox->UnregisterCallback(callback);
    485     if (!callback->Signalled())
     488    if (!cbImpl->Signalled())
    486489        RTPrintf("Time out or interruption while waiting for a notification.\n");
    487     callback->Release();
    488 
    489490    /*
    490491     * Done.
     
    521522    return errorSyntax(USAGE_GUESTPROPERTY, "Incorrect parameters");
    522523}
    523 
  • trunk/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp

    r22173 r22305  
    854854    uint32_t memorySize = 0;
    855855    uint32_t vramSize = 0;
    856     VBoxSDLCallback *callback = NULL;
    857     VBoxSDLConsoleCallback *consoleCallback = NULL;
     856    VBoxSDLCallback *cbVBoxImpl = NULL;
     857    /* wrapper around above object */
     858    ComPtr<IVirtualBoxCallback> callback;
     859    VBoxSDLConsoleCallback *cbConsoleImpl = NULL;
     860    ComPtr<IConsoleCallback> consoleCallback;
     861
    858862    bool fFullscreen = false;
    859863    bool fResizable = true;
     
    18501854#endif
    18511855
     1856
    18521857    for (ULONG i = 0; i < gcMonitors; i++)
    18531858    {
    18541859        // register our framebuffer
    18551860        rc = gDisplay->SetFramebuffer(i, gpFramebuffer[i]);
    1856         if (rc != S_OK)
     1861        if (FAILED(rc))
    18571862        {
    18581863            RTPrintf("Error: could not register framebuffer object!\n");
     
    18661871
    18671872    // register a callback for global events
    1868     callback = new VBoxSDLCallback();
    1869     callback->AddRef();
     1873    cbVBoxImpl = new VBoxSDLCallback();
     1874    rc = createCallbackWrapper((IVirtualBoxCallback*)cbVBoxImpl, callback.asOutParam());
     1875    if (FAILED(rc))
     1876        goto leave;
    18701877    virtualBox->RegisterCallback(callback);
    18711878
    18721879    // register a callback for machine events
    1873     consoleCallback = new VBoxSDLConsoleCallback();
    1874     consoleCallback->AddRef();
     1880    cbConsoleImpl = new VBoxSDLConsoleCallback();
     1881    rc = createCallbackWrapper((IConsoleCallback*)cbConsoleImpl, consoleCallback.asOutParam());
     1882    if (FAILED(rc))
     1883        goto leave;
    18751884    gConsole->RegisterCallback(consoleCallback);
    18761885    // until we've tried to to start the VM, ignore power off events
    1877     consoleCallback->ignorePowerOffEvents(true);
     1886    cbConsoleImpl->ignorePowerOffEvents(true);
    18781887
    18791888#ifdef VBOX_WITH_VRDP
     
    21722181    // accept power off events from now on because we're running
    21732182    // note that there's a possible race condition here...
    2174     consoleCallback->ignorePowerOffEvents(false);
     2183    cbConsoleImpl->ignorePowerOffEvents(false);
    21752184
    21762185    rc = gConsole->COMGETTER(Keyboard)(gKeyboard.asOutParam());
     
    26852694        && machineState == MachineState_Running)
    26862695    {
    2687         consoleCallback->ignorePowerOffEvents(true);
     2696        cbConsoleImpl->ignorePowerOffEvents(true);
    26882697        ComPtr <IProgress> progress;
    26892698        CHECK_ERROR_BREAK(gConsole, PowerDown(progress.asOutParam()));
     
    27922801    gMachine = NULL;
    27932802    session = NULL;
    2794     LogFlow(("Releasing callback handlers...\n"));
    2795     if (callback)
    2796         callback->Release();
    2797     if (consoleCallback)
    2798         consoleCallback->Release();
    2799 
    28002803    LogFlow(("Releasing VirtualBox object...\n"));
    28012804    virtualBox = NULL;
  • trunk/src/VBox/Frontends/VirtualBox/src/VBoxGlobal.cpp

    r22189 r22305  
    48854885    mAction->setText (text);
    48864886}
    4887 
  • trunk/src/VBox/Main/Makefile.kmk

    r22213 r22305  
    590590        SharedFolderImpl.cpp \
    591591        SessionImpl.cpp \
     592        VirtualBoxCallbackImpl.cpp \
    592593        ConsoleImpl.cpp \
    593594        ConsoleImpl2.cpp \
  • trunk/src/VBox/Main/SessionImpl.cpp

    r21961 r22305  
    2020 */
    2121
    22 #if defined(RT_OS_WINDOWS)
    23 #elif defined(RT_OS_LINUX)
    24 #endif
    25 
    2622#ifdef VBOX_WITH_SYS_V_IPC_SESSION_WATCHER
    2723#   include <errno.h>
     
    335331
    336332    if (SUCCEEDED(rc))
    337     {
     333    {       
    338334        mType = SessionType_Direct;
    339335        mState = SessionState_Open;
  • trunk/src/VBox/Main/glue/vboxapi.py

    r21968 r22305  
    218218            win32com.client.gencache.EnsureDispatch('VirtualBox.Session')
    219219            win32com.client.gencache.EnsureDispatch('VirtualBox.VirtualBox')
     220            win32com.client.gencache.EnsureDispatch('VirtualBox.VirtualBoxCallback')
    220221
    221222    def getSessionObject(self, vbox):
    222223        import win32com
    223224        from win32com.client import Dispatch
    224         return win32com.client.Dispatch("VirtualBox.Session")
     225        return win32com.client.Dispatch("VirtualBox.Session")
    225226
    226227    def getVirtualBox(self):
    227         import win32com
     228        import win32com
    228229        from win32com.client import Dispatch
    229230        return win32com.client.Dispatch("VirtualBox.VirtualBox")
     
    267268
    268269        str += "   def __init__(self): BaseClass.__init__(self, arg)\n"
    269         str += "result = win32com.server.util.wrap("+iface+"Impl())\n"
     270        str += "result = win32com.client.Dispatch('VirtualBox.VirtualBoxCallback')\n"
     271        str += "result.SetLocalObject(win32com.server.util.wrap("+iface+"Impl())\n"
    270272        exec (str,d,d)
    271273        return d['result']
     
    342344        str += "   _com_interfaces_ = xpcom.components.interfaces."+iface+"\n"
    343345        str += "   def __init__(self): BaseClass.__init__(self, arg)\n"
    344         str += "result = "+iface+"Impl()\n"
     346        str += "result = xpcom.components.classes['@virtualbox.org/VirtualBoxCallback;1'].createInstance()\n"
     347        str += "result.setLocalObject("+iface+"Impl())\n"
    345348        exec (str,d,d)
    346349        return d['result']
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r22214 r22305  
    127127#define NS_IMPL_THREADSAFE_QUERY_INTERFACE1_CI  NS_IMPL_QUERY_INTERFACE1_CI
    128128#define NS_IMPL_THREADSAFE_QUERY_INTERFACE2_CI  NS_IMPL_QUERY_INTERFACE2_CI
     129#define NS_IMPL_THREADSAFE_QUERY_INTERFACE3_CI  NS_IMPL_QUERY_INTERFACE3_CI
    129130
    130131#ifndef NS_IMPL_THREADSAFE_ISUPPORTS1_CI
     
    142143   NS_IMPL_THREADSAFE_QUERY_INTERFACE2_CI(_class, _i1, _i2)                   \
    143144   NS_IMPL_CI_INTERFACE_GETTER2(_class, _i1, _i2)
     145#endif
     146
     147#ifndef NS_IMPL_THREADSAFE_ISUPPORTS3_CI
     148# define NS_IMPL_THREADSAFE_ISUPPORTS3_CI(_class, _i1, _i2, _i3)              \
     149   NS_IMPL_THREADSAFE_ADDREF(_class)                                          \
     150   NS_IMPL_THREADSAFE_RELEASE(_class)                                         \
     151   NS_IMPL_THREADSAFE_QUERY_INTERFACE3_CI(_class, _i1, _i2, _i3)              \
     152   NS_IMPL_CI_INTERFACE_GETTER3(_class, _i1, _i2, _i3)
    144153#endif
    145154
     
    164173#endif
    165174
     175#ifndef NS_IMPL_QUERY_INTERFACE3_AMBIGUOUS_CI
     176# define NS_IMPL_QUERY_INTERFACE3_AMBIGUOUS_CI(_class, _i1, _ic1,             \
     177                                               _i2, _ic2, _i3, _ic3)          \
     178   NS_INTERFACE_MAP_BEGIN(_class)                                             \
     179    NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i1, _ic1)                               \
     180    NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i2, _ic2)                               \
     181    NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(_i3, _ic3)                               \
     182    NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, _ic1)                       \
     183    NS_IMPL_QUERY_CLASSINFO(_class)                                           \
     184   NS_INTERFACE_MAP_END
     185#endif
     186
    166187#define NS_IMPL_THREADSAFE_QUERY_INTERFACE1_AMBIGUOUS_CI NS_IMPL_QUERY_INTERFACE1_AMBIGUOUS_CI
    167188#define NS_IMPL_THREADSAFE_QUERY_INTERFACE2_AMBIGUOUS_CI NS_IMPL_QUERY_INTERFACE2_AMBIGUOUS_CI
     189#define NS_IMPL_THREADSAFE_QUERY_INTERFACE3_AMBIGUOUS_CI NS_IMPL_QUERY_INTERFACE3_AMBIGUOUS_CI
    168190
    169191#ifndef NS_IMPL_THREADSAFE_ISUPPORTS1_AMBIGUOUS_CI
     
    184206   NS_IMPL_CI_INTERFACE_GETTER2(_class, _i1, _i2)
    185207#endif
     208
     209#ifndef NS_IMPL_THREADSAFE_ISUPPORTS3_AMBIGUOUS_CI
     210# define NS_IMPL_THREADSAFE_ISUPPORTS3_AMBIGUOUS_CI(_class, _i1, _ic1,        \
     211                                                     _i2, _ic2, _i3, _ic3)    \
     212   NS_IMPL_THREADSAFE_ADDREF(_class)                                          \
     213   NS_IMPL_THREADSAFE_RELEASE(_class)                                         \
     214   NS_IMPL_THREADSAFE_QUERY_INTERFACE3_AMBIGUOUS_CI(_class, _i1, _ic1,        \
     215                                                    _i2, _ic2, _i3, _ic3)     \
     216   NS_IMPL_CI_INTERFACE_GETTER3(_class, _i1, _i2, _i3)
     217#endif
     218
    186219  </cpp>
    187220</if>
     
    10421075  </interface>
    10431076
     1077  <interface
     1078     name="ILocalOwner" extends="$dispatched"
     1079     uuid="308ff42a-dc45-49d4-a950-b1eee5e00bb5" wsmap="suppress"
     1080     >
     1081    <desc>
     1082      The ILocalOwner interface allows to provide custom implementation
     1083      of VirtualBox interfaces, not being fully remote-aware classes by themselved.
     1084      Most importnat usecase for this interface is callbacks implementation.
     1085    </desc>
     1086    <method name="setLocalObject">
     1087      <desc>
     1088        Set local object.
     1089      </desc>
     1090      <param name="object" type="$unknown" dir="in">
     1091        <desc>Local object, to forward requests to.
     1092          If null, clears currently set local object(s).</desc>
     1093      </param>
     1094    </method>
     1095  </interface>
    10441096
    10451097  <!--
     
    10531105     wsmap="suppress"
    10541106     >
     1107
    10551108    <method name="onMachineStateChange">
    10561109      <desc>
     
    1308913142
    1309013143  <module name="VBoxC" context="InprocServer" threadingModel="Free">
    13091     <class name="Session" uuid="3C02F46D-C9D2-4f11-A384-53F0CF917214"
     13144    <class name="Session" uuid="3C02F46D-C9D2-4F11-A384-53F0CF917214"
    1309213145           namespace="virtualbox.org">
    1309313146      <interface name="ISession" default="yes"/>
    1309413147    </class>
     13148    <class name="VirtualBoxCallback" uuid="49EE8561-5563-4715-B18C-A4B1A490DAFE"
     13149           namespace="virtualbox.org">
     13150      <interface name="IVirtualBoxCallback" default="yes"/>
     13151      <interface name="ILocalOwner"/>
     13152    </class>
    1309513153  </module>
    1309613154
  • trunk/src/VBox/Main/include/VirtualBoxImpl.h

    r22173 r22305  
    483483    ComObjPtr<VirtualBox, ComWeakRef> mVirtualBox;
    484484};
    485 
    486485#endif // ____H_VIRTUALBOXIMPL
    487486/* vi: set tabstop=4 shiftwidth=4 expandtab: */
  • trunk/src/VBox/Main/win/dllmain.cpp

    r19239 r22305  
    2424
    2525#include <SessionImpl.h>
     26#include <VirtualBoxCallbackImpl.h>
    2627
    2728#include <atlbase.h>
     
    3435BEGIN_OBJECT_MAP(ObjectMap)
    3536    OBJECT_ENTRY(CLSID_Session, Session)
     37    OBJECT_ENTRY(CLSID_VirtualBoxCallback, VirtualBoxCallback)
    3638END_OBJECT_MAP()
    3739
     
    4850
    4951        // idempotent, so doesn't harm, and needed for COM embedding scenario
    50         RTR3Init();       
     52        RTR3Init();
    5153    }
    5254    else if (dwReason == DLL_PROCESS_DETACH)
     
    8789    return _Module.UnregisterServer(TRUE);
    8890}
    89 
  • trunk/src/VBox/Main/xpcom/module.cpp

    r19817 r22305  
    4747#include "ConsoleImpl.h"
    4848#include "ConsoleVRDPServer.h"
     49#include "VirtualBoxCallbackImpl.h"
    4950
    5051#include "Logging.h"
     
    7980NS_DECL_CLASSINFO(Console)
    8081NS_IMPL_THREADSAFE_ISUPPORTS1_CI(Console, IConsole)
    81 
     82NS_DECL_CLASSINFO(VirtualBoxCallback)
     83NS_IMPL_THREADSAFE_ISUPPORTS3_CI(VirtualBoxCallback, IVirtualBoxCallback, IConsoleCallback, ILocalOwner)
    8284/**
    8385 *  Singleton class factory that holds a reference to the created instance
     
    134136NS_GENERIC_FACTORY_CONSTRUCTOR_WITH_RC (Session)
    135137
     138NS_GENERIC_FACTORY_CONSTRUCTOR_WITH_RC (VirtualBoxCallback)
     139
    136140
    137141/**
     
    153157        NULL, // language helper
    154158        &NS_CLASSINFO_NAME(Session) // global class info & flags
     159    },
     160    {
     161        "VirtualBoxCallback component", // description
     162        NS_VIRTUALBOXCALLBACK_CID, NS_VIRTUALBOXCALLBACK_CONTRACTID, // CID/ContractID
     163        VirtualBoxCallbackConstructor, // constructor function
     164        NULL, // registration function
     165        NULL, // deregistration function
     166//        SessionClassFactory::releaseInstance,
     167        NULL, // destructor function
     168        NS_CI_INTERFACE_GETTER_NAME(VirtualBoxCallback), // interfaces function
     169        NULL, // language helper
     170        &NS_CLASSINFO_NAME(VirtualBoxCallback) // global class info & flags
    155171    }
     172
    156173};
    157174
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