VirtualBox

Changeset 2976 in vbox


Ignore:
Timestamp:
Jun 1, 2007 1:47:51 PM (18 years ago)
Author:
vboxsync
Message:

Main:

  • XPCOM: Implemented storing compreg.data and xpti.data in the VirtualBox home directory (defect #1947).
  • Cleaned up the COM/XPCOM layer API (removed tons of duplicate definitions and several pieces of duplcate code).
Location:
trunk
Files:
10 edited

Legend:

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

    r2672 r2976  
    2525
    2626#include "VBox/com/defs.h"
     27#include "VBox/com/string.h"
    2728
    2829namespace com
     
    4243 *  No COM calls may be made after this method returns.
    4344 */
    44 void Shutdown();
     45HRESULT Shutdown();
    4546
    4647/**
     
    5556void GetInterfaceNameByIID (const GUID &aIID, BSTR *aName);
    5657
     58/**
     59 *  Returns the VirtualBox user home directory.
     60 *
     61 *  On failure, this function will return a path that caused a failure (or a
     62 *  null string if the faiulre is not path-related).
     63 *
     64 *  On success, this function will try to create the returned directory if it
     65 *  doesn't exist yet. This may also fail with the corresponding status code.
     66 *
     67 *  @param aDir     Where to return the directory to.
     68 *  @return         VBox status code.
     69 */
     70int GetVBoxUserHomeDirectory (Utf8Str &aDir);
     71
    5772}; // namespace com
    5873
  • trunk/include/VBox/com/defs.h

    r612 r2976  
    138138#define E_ABORT             NS_ERROR_ABORT
    139139#define E_FAIL              NS_ERROR_FAILURE
     140/* Note: a better analog for E_ACCESSDENIED would probably be
     141 * NS_ERROR_NOT_AVAILABLE, but we want binary compatibility for now. */
    140142#define E_ACCESSDENIED      ((nsresult) 0x80070005L)
    141143
  • trunk/include/VBox/com/ptr.h

    r1472 r2976  
    2424#define __VBox_com_ptr_h__
    2525
    26 #if defined (__WIN__)
     26#if !defined (VBOX_WITH_XPCOM)
    2727
    2828#include <atlbase.h>
     
    3232#endif
    3333
    34 #else // !defined (__WIN__)
     34#else /* !defined (VBOX_WITH_XPCOM) */
    3535
    3636#include <nsXPCOM.h>
     
    4646    "@mozilla.org/ipc/dconnect-service;1"
    4747
    48 #endif // !defined (__WIN__)
     48#endif /* !defined (VBOX_WITH_XPCOM) */
    4949
    5050#include <VBox/com/defs.h>
     
    8585    class NoAddRefRelease : public I {
    8686        private:
    87 #ifdef __WIN__
     87#if !defined (VBOX_WITH_XPCOM)
    8888            STDMETHOD_(ULONG, AddRef)() = 0;
    8989            STDMETHOD_(ULONG, Release)() = 0;
    90 #else
     90#else /* !defined (VBOX_WITH_XPCOM) */
    9191            NS_IMETHOD_(nsrefcnt) AddRef(void) = 0;
    9292            NS_IMETHOD_(nsrefcnt) Release(void) = 0;
    93 #endif
     93#endif /* !defined (VBOX_WITH_XPCOM) */
    9494    };
    9595
     
    255255        HRESULT rc;
    256256        I *obj = NULL;
    257 #if defined (__WIN__)
     257#if !defined (VBOX_WITH_XPCOM)
    258258        rc = CoCreateInstance (clsid, NULL, CLSCTX_INPROC_SERVER, _ATL_IIDOF (I),
    259259                               (void **) &obj);
    260 #else
     260#else /* !defined (VBOX_WITH_XPCOM) */
    261261        nsCOMPtr <nsIComponentManager> manager;
    262262        rc = NS_GetComponentManager (getter_AddRefs (manager));
     
    264264            rc = manager->CreateInstance (clsid, nsnull, NS_GET_IID (I),
    265265                                          (void **) &obj);
    266 #endif
     266#endif /* !defined (VBOX_WITH_XPCOM) */
    267267        *this = obj;
    268268        if (SUCCEEDED (rc))
     
    282282    HRESULT createLocalObject (const CLSID &clsid)
    283283    {
    284 #if defined (__WIN__)
     284#if !defined (VBOX_WITH_XPCOM)
    285285        HRESULT rc;
    286286        I *obj = NULL;
     
    291291            obj->Release();
    292292        return rc;
    293 #else
     293#else /* !defined (VBOX_WITH_XPCOM) */
    294294        return createInprocObject (clsid);
    295 #endif
     295#endif /* !defined (VBOX_WITH_XPCOM) */
    296296    }
    297297
     
    410410    HRESULT createObject() {
    411411        HRESULT rc;
    412 #if defined (__WIN__)
     412#if !defined (VBOX_WITH_XPCOM)
    413413#   ifdef VBOX_COM_OUTOFPROC_MODULE
    414414        CComObjectNoLock <C> *obj = new CComObjectNoLock <C>();
     
    424424        rc = CComObject <C>::CreateInstance (&obj);
    425425#   endif
    426 #else
     426#else /* !defined (VBOX_WITH_XPCOM) */
    427427        CComObject <C> *obj = new CComObject <C>();
    428428        if (obj) {
     
    431431            rc = E_OUTOFMEMORY;
    432432        }
    433 #endif
     433#endif /* !defined (VBOX_WITH_XPCOM) */
    434434        *this = obj;
    435435        return rc;
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManage.cpp

    r2920 r2976  
    60746074    else
    60756075    {
    6076         // check if an alternative VBox Home directory is set
    6077         Utf8Str homeDir = getenv ("VBOX_USER_HOME");
    6078         if (!homeDir)
    6079         {
    6080             // compose the config directory (full path)
    6081             char home [RTPATH_MAX];
    6082             RTPathUserHome (home, RTPATH_MAX);
    6083             homeDir = Utf8StrFmt ("%s%c%s", home, RTPATH_DELIMITER, ".VirtualBox");
    6084         }
     6076        Utf8Str homeDir;
     6077        GetVBoxUserHomeDirectory (homeDir);
    60856078
    60866079        RTPrintf ("Updating settings files in the following VirtualBox Home Directory:\n"
  • trunk/src/VBox/Frontends/VirtualBox/include/COMDefs.h

    r2671 r2976  
    2828#define __COMDefs_h__
    2929
     30
     31/* Both VBox/com/assert.h and qglobal.h contain a definition of ASSERT.
     32 * Either of them can be already included here, so try to shut them up.  */
     33#undef ASSERT
     34
     35#include <VBox/com/com.h>
     36
     37#undef ASSERT
     38
    3039#include <qglobal.h>
    3140#include <qstring.h>
     
    3544
    3645/*
    37  * common COM / XPCOM includes and defines
     46 * Additional COM / XPCOM defines and includes
    3847 */
    3948
    40 #if defined(Q_OS_WIN32)
    41 
    42     #include <objbase.h>
    43     /* for _ATL_IIDOF */
    44     #include <atldef.h>
    45 
    46     #include <VBox/types.h>
    47 
    48     /* these are XPCOM only */
    49     #define NS_DECL_ISUPPORTS
    50 
    51     /* makes interface getter/setter names (n must be capitalized) */
    52     #define COMGETTER(n)    get_##n
    53     #define COMSETTER(n)    put_##n
    54 
    55     #define IN_BSTRPARAM    BSTR
    56     #define IN_GUIDPARAM    GUID
    57 
    58     /* const reference to IID of the interface */
    59     #define COM_IIDOF(I)    _ATL_IIDOF (I)
    60 
    61 #else
    62 
    63     #include <VBox/types.h>
    64 
    65     #include <nsMemory.h>
    66     #include <nsIComponentManager.h>
    67     #include <ipcIDConnectService.h>
    68 
    69     class nsIComponentManager;
    70     class nsIEventQueue;
    71     class ipcIDConnectService;
    72 
    73     typedef nsCID   CLSID;
    74     typedef nsIID   IID;
    75 
    76     class XPCOMEventQSocketListener;
    77 
    78     #define STDMETHOD(a) NS_IMETHOD a
    79     #define STDMETHODIMP NS_IMETHODIMP
    80 
    81     #define HRESULT     nsresult
    82     #define SUCCEEDED   NS_SUCCEEDED
    83     #define FAILED      NS_FAILED
    84 
    85     /// @todo error code mappings
    86     #define S_OK            NS_OK
    87     #define E_UNEXPECTED    (HRESULT)0x8000FFFFL
    88     #define E_NOTIMPL       (HRESULT)0x80004001L
    89     #define E_OUTOFMEMORY   (HRESULT)0x8007000EL
    90     #define E_INVALIDARG    (HRESULT)0x80070057L
    91     #define E_NOINTERFACE   (HRESULT)0x80004002L
    92     #define E_POINTER       (HRESULT)0x80004003L
    93     #define E_HANDLE        (HRESULT)0x80070006L
    94     #define E_ABORT         (HRESULT)0x80004004L
    95     #define E_FAIL          (HRESULT)0x80004005L
    96     #define E_ACCESSDENIED  (HRESULT)0x80070005L
    97 
    98     #define IUnknown    nsISupports
    99 
    100     #define BOOL        PRBool
    101     #define BYTE        PRUint8
    102     #define SHORT       PRInt16
    103     #define USHORT      PRUint16
    104     #define LONG        PRInt32
    105     #define ULONG       PRUint32
    106     #define LONG64      PRInt64
    107     #define ULONG64     PRUint64
    108 
    109     #define BSTR        PRUnichar*
    110     #define LPBSTR      BSTR*
    111     #define OLECHAR     wchar_t
    112     #define GUID        nsID
    113 
    114     #define IN_BSTRPARAM    const BSTR
    115     #define IN_GUIDPARAM    const nsID &
    116 
    117     /* makes interface getter/setter names (n must be capitalized) */
    118     #define COMGETTER(n)    Get##n
    119     #define COMSETTER(n)    Set##n
    120 
    121     /* const reference to IID of the interface */
    122     #define COM_IIDOF(I)    NS_GET_IID (I)
    123 
    124     /* helper functions (defined in the Runtime3 library) */
    125     extern "C" {
    126         BSTR SysAllocString (const OLECHAR* sz);
    127         BSTR SysAllocStringByteLen (char *psz, unsigned int len);
    128         BSTR SysAllocStringLen (const OLECHAR *pch, unsigned int cch);
    129         void SysFreeString (BSTR bstr);
    130         int SysReAllocString (BSTR *pbstr, const OLECHAR *psz);
    131         int SysReAllocStringLen (BSTR *pbstr, const OLECHAR *psz, unsigned int cch);
    132         unsigned int SysStringByteLen (BSTR bstr);
    133         unsigned int SysStringLen (BSTR bstr);
    134     }
    135 
    136 #endif
     49#define IN_BSTRPARAM    INPTR BSTR
     50#define IN_GUIDPARAM    INPTR GUIDPARAM
     51
     52#if !defined (VBOX_WITH_XPCOM)
     53
     54#else /* !defined (VBOX_WITH_XPCOM) */
     55
     56#include <nsXPCOM.h>
     57#include <nsMemory.h>
     58#include <nsIComponentManager.h>
     59
     60class XPCOMEventQSocketListener;
     61
     62#endif /* !defined (VBOX_WITH_XPCOM) */
     63
    13764
    13865/* VirtualBox interfaces declarations */
    139 #if defined(Q_OS_WIN32)
     66#if !defined (VBOX_WITH_XPCOM)
    14067    #include <VirtualBox.h>
    141 #else
     68#else /* !defined (VBOX_WITH_XPCOM) */
    14269    #include <VirtualBox_XPCOM.h>
    143 #endif
     70#endif /* !defined (VBOX_WITH_XPCOM) */
    14471
    14572#include "VBoxDefs.h"
     73
    14674
    14775/////////////////////////////////////////////////////////////////////////////
     
    217145    static HRESULT cleanupCOM();
    218146
     147#if !defined (VBOX_WITH_XPCOM)
     148
    219149    /** Converts a GUID value to QUuid */
    220 #if defined (Q_OS_WIN32)
    221     static QUuid toQUuid (const GUID &id) {
     150    static QUuid toQUuid (const GUID &id)
     151    {
    222152        return QUuid (id.Data1, id.Data2, id.Data3,
    223153                      id.Data4[0], id.Data4[1], id.Data4[2], id.Data4[3],
    224154                      id.Data4[4], id.Data4[5], id.Data4[6], id.Data4[7]);
    225155    }
    226 #else
    227     static QUuid toQUuid (const nsID &id) {
     156
     157#else /* !defined (VBOX_WITH_XPCOM) */
     158
     159    /** Converts a GUID value to QUuid */
     160    static QUuid toQUuid (const nsID &id)
     161    {
    228162        return QUuid (id.m0, id.m1, id.m2,
    229163                      id.m3[0], id.m3[1], id.m3[2], id.m3[3],
    230164                      id.m3[4], id.m3[5], id.m3[6], id.m3[7]);
    231165    }
    232 #endif
     166
     167#endif /* !defined (VBOX_WITH_XPCOM) */
    233168
    234169    /**
     
    251186    COMBase() : mRC (S_OK) {};
    252187
    253 #if !defined (Q_OS_WIN32)
    254     static nsIComponentManager *gComponentManager;
    255     static nsIEventQueue* gEventQ;
    256     static ipcIDConnectService *gDConnectService;
    257     static PRUint32 gVBoxServerID;
    258 
    259     static XPCOMEventQSocketListener *gSocketListener;
     188#if defined (VBOX_WITH_XPCOM)
     189    static XPCOMEventQSocketListener *sSocketListener;
    260190#endif
    261191
     
    264194    {
    265195    public:
     196
    266197        BSTRIn (const QString &s) : bstr (SysAllocString ((const OLECHAR *) s.ucs2())) {}
    267         ~BSTRIn() {
     198
     199        ~BSTRIn()
     200        {
    268201            if (bstr)
    269202                SysFreeString (bstr);
    270203        }
     204
    271205        operator BSTR() const { return bstr; }
    272206
    273207    private:
     208
    274209        BSTR bstr;
    275210    };
     
    279214    {
    280215    public:
     216
    281217        BSTROut (QString &s) : str (s), bstr (0) {}
    282         ~BSTROut() {
     218
     219        ~BSTROut()
     220        {
    283221            if (bstr) {
    284222                str = QString::fromUcs2 (bstr);
     
    286224            }
    287225        }
     226
    288227        operator BSTR *() { return &bstr; }
    289228
    290229    private:
     230
    291231        QString &str;
    292232        BSTR bstr;
     
    298238    {
    299239    public:
     240
    300241        ENUMOut (CE &e) : ce (e), ve ((VE) 0) {}
    301242        ~ENUMOut() { ce = (CE) ve; }
     
    303244
    304245    private:
     246
    305247        CE &ce;
    306248        VE ve;
    307249    };
    308250
    309 #if defined (Q_OS_WIN32)
     251#if !defined (VBOX_WITH_XPCOM)
    310252
    311253    /** Adapter to pass QUuid as input GUID params */
    312     GUID GUIDIn (const QUuid &uuid) const { return uuid; }
     254    static GUID GUIDIn (const QUuid &uuid) { return uuid; }
    313255
    314256    /** Adapter to pass QUuid as output GUID params */
     
    316258    {
    317259    public:
    318         GUIDOut (QUuid &id) : uuid (id) {
     260
     261        GUIDOut (QUuid &id) : uuid (id)
     262        {
    319263            ::memset (&guid, 0, sizeof (GUID));
    320264        }
    321         ~GUIDOut() {
     265
     266        ~GUIDOut()
     267        {
    322268            uuid = QUuid (
    323269                guid.Data1, guid.Data2, guid.Data3,
    324270                guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
    325                 guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]
    326             );
    327         }
     271                guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
     272        }
     273
    328274        operator GUID *() { return &guid; }
    329275
    330276    private:
     277
    331278        QUuid &uuid;
    332279        GUID guid;
    333280    };
    334281
    335 #else
     282#else /* !defined (VBOX_WITH_XPCOM) */
    336283
    337284    /** Adapter to pass QUuid as input GUID params */
    338     static const nsID &GUIDIn (const QUuid &uuid) {
     285    static const nsID &GUIDIn (const QUuid &uuid)
     286    {
    339287        return *(const nsID *) &uuid;
    340288    }
     
    344292    {
    345293    public:
     294
    346295        GUIDOut (QUuid &id) : uuid (id), nsid (0) {}
    347         ~GUIDOut() {
    348             if (nsid) {
     296
     297        ~GUIDOut()
     298        {
     299            if (nsid)
     300            {
    349301                uuid = QUuid (
    350302                    nsid->m0, nsid->m1, nsid->m2,
    351303                    nsid->m3[0], nsid->m3[1], nsid->m3[2], nsid->m3[3],
    352                     nsid->m3[4], nsid->m3[5], nsid->m3[6], nsid->m3[7]
    353                 );
     304                    nsid->m3[4], nsid->m3[5], nsid->m3[6], nsid->m3[7]);
    354305                nsMemory::Free (nsid);
    355306            }
    356307        }
     308
    357309        operator nsID **() { return &nsid; }
    358310
    359311    private:
     312
    360313        QUuid &uuid;
    361314        nsID *nsid;
    362315    };
    363316
    364 #endif
     317#endif /* !defined (VBOX_WITH_XPCOM) */
    365318
    366319    void fetchErrorInfo (IUnknown * /*callee*/, const GUID * /*calleeIID*/) const {}
     
    394347    COMBaseWithEI() : COMBase () {};
    395348
    396     void fetchErrorInfo (IUnknown *callee, const GUID *calleeIID) const {
     349    void fetchErrorInfo (IUnknown *callee, const GUID *calleeIID) const
     350    {
    397351        mErrInfo.fetchFromCurrentThread (callee, calleeIID);
    398352    }
     
    484438        if (!mIface)
    485439        {
    486 #if defined (Q_OS_WIN32)
     440#if !defined (VBOX_WITH_XPCOM)
     441
    487442            B::mRC = CoCreateInstance (clsid, NULL, CLSCTX_ALL,
    488                                        _ATL_IIDOF (I), (void**) &mIface);
    489 #else
    490             /* first, try to create an instance within the in-proc server
    491              * (for compatibility with Win32) */
    492             B::mRC = B::gComponentManager->
    493                 CreateInstance (clsid, nsnull, NS_GET_IID (I), (void**) &mIface);
    494             if (FAILED (B::mRC) && B::gDConnectService && B::gVBoxServerID)
    495             {
    496                 /* now try the out-of-proc server if it exists */
    497                 B::mRC = B::gDConnectService->
    498                     CreateInstance (B::gVBoxServerID, clsid,
    499                                     NS_GET_IID (I), (void**) &mIface);
    500             }
    501 #endif
     443                                       _ATL_IIDOF (I), (void **) &mIface);
     444
     445#else /* !defined (VBOX_WITH_XPCOM) */
     446
     447            nsCOMPtr <nsIComponentManager> manager;
     448            B::mRC = NS_GetComponentManager (getter_AddRefs (manager));
     449            if (SUCCEEDED (B::mRC))
     450                B::mRC = manager->CreateInstance (clsid, nsnull, NS_GET_IID (I),
     451                                                  (void **) &mIface);
     452
     453#endif /* !defined (VBOX_WITH_XPCOM) */
     454
    502455            /* fetch error info, but don't assert if it's missing -- many other
    503456             * reasons can lead to an error (w/o providing error info), not only
     
    524477        B::mRC = S_OK;
    525478        if (i)
    526 #if defined (Q_OS_WIN32)
    527             B::mRC = i->QueryInterface (_ATL_IIDOF (I), (void**) &mIface);
    528 #else
    529             B::mRC = i->QueryInterface (NS_GET_IID (I), (void**) &mIface);
    530 #endif
     479#if !defined (VBOX_WITH_XPCOM)
     480            B::mRC = i->QueryInterface (_ATL_IIDOF (I), (void **) &mIface);
     481#else /* !defined (VBOX_WITH_XPCOM) */
     482            B::mRC = i->QueryInterface (NS_GET_IID (I), (void **) &mIface);
     483#endif /* !defined (VBOX_WITH_XPCOM) */
    531484        release (old_iface);
    532485    };
     
    575528        mIface = NULL;
    576529        if (that.mIface)
    577 #if defined (Q_OS_WIN32)
     530#if !defined (VBOX_WITH_XPCOM)
    578531            mRC = that.mIface->QueryInterface (_ATL_IIDOF (IUnknown), (void**) &mIface);
    579 #else
     532#else /* !defined (VBOX_WITH_XPCOM) */
    580533            mRC = that.mIface->QueryInterface (NS_GET_IID (IUnknown), (void**) &mIface);
    581 #endif
    582         if (SUCCEEDED (mRC)) {
     534#endif /* !defined (VBOX_WITH_XPCOM) */
     535        if (SUCCEEDED (mRC))
     536        {
    583537            mRC = that.lastRC();
    584538            mErrInfo = that.errorInfo();
    585539        }
    586540    }
     541
    587542    /* specialization for CUnknown */
    588     CUnknown (const CUnknown &that) : CInterface <IUnknown, COMBaseWithEI> () {
     543    CUnknown (const CUnknown &that) : CInterface <IUnknown, COMBaseWithEI> ()
     544    {
    589545        mIface = that.mIface;
    590546        addref (mIface);
     
    593549
    594550    template <class C>
    595     CUnknown &operator= (const C &that) {
     551    CUnknown &operator= (const C &that)
     552    {
    596553        /* be aware of self (from COM point of view) assignment */
    597554        IUnknown *old_iface = mIface;
    598555        mIface = NULL;
    599556        mRC = S_OK;
    600 #if defined (Q_OS_WIN32)
     557#if !defined (VBOX_WITH_XPCOM)
    601558        if (that.mIface)
    602559            mRC = that.mIface->QueryInterface (_ATL_IIDOF (IUnknown), (void**) &mIface);
    603 #else
     560#else /* !defined (VBOX_WITH_XPCOM) */
    604561        if (that.mIface)
    605562            mRC = that.mIface->QueryInterface (NS_GET_IID (IUnknown), (void**) &mIface);
    606 #endif
    607         if (SUCCEEDED (mRC)) {
     563#endif /* !defined (VBOX_WITH_XPCOM) */
     564        if (SUCCEEDED (mRC))
     565        {
    608566            mRC = that.lastRC();
    609567            mErrInfo = that.errorInfo();
     
    612570        return *this;
    613571    }
     572
    614573    /* specialization for CUnknown */
    615     CUnknown &operator= (const CUnknown &that) {
     574    CUnknown &operator= (const CUnknown &that)
     575    {
    616576        attach (that.mIface);
    617577        COMBaseWithEI::operator= (that);
  • trunk/src/VBox/Frontends/VirtualBox/src/COMDefs.cpp

    r2671 r2976  
    2323#include "COMDefs.h"
    2424
    25 #if defined (Q_OS_WIN32)
    26 
    27 // for CComPtr/CComQIPtr
    28 #include <atlcomcli.h>
    29 #include <VBox/com/assert.h>
    30 
    31 #else // !defined (Q_OS_WIN32)
     25#if !defined (VBOX_WITH_XPCOM)
     26
     27#else /* !defined (VBOX_WITH_XPCOM) */
    3228
    3329#include <qobject.h>
    34 #include <qapplication.h>
    35 #include <qfile.h>
    3630#include <qsocketnotifier.h>
    37 #ifdef DEBUG
    38     #include <qfileinfo.h>
    39 #endif
    40 
    41 #include <nsXPCOMGlue.h>
    42 #include <nsIServiceManager.h>
    43 #include <nsIComponentRegistrar.h>
    44 // for NS_InitXPCOM2 with bin dir parameter
    45 #include <nsEmbedString.h>
    46 #include <nsIFile.h>
    47 #include <nsILocalFile.h>
    48 // for dconnect
    49 #include <ipcIService.h>
    50 #include <ipcCID.h>
    51 // XPCOM headers still do not define this, so define by hand
    52 #define IPC_DCONNECTSERVICE_CONTRACTID \
    53     "@mozilla.org/ipc/dconnect-service;1"
    54 // for event queue management
     31
    5532#include <nsEventQueueUtils.h>
    5633#include <nsIEventQueue.h>
    5734
    58 // for IID to name resolution
    59 #include <nsIInterfaceInfo.h>
    60 #include <nsIInterfaceInfoManager.h>
    61 
    6235// for exception fetching
    6336#include <nsIExceptionService.h>
    6437
    65 #undef ASSERT
    66 #include <VBox/com/assert.h>
    6738#include <iprt/env.h>
    6839#include <iprt/path.h>
    6940#include <iprt/param.h>
    7041#include <iprt/err.h>
    71 
    72 nsIComponentManager *COMBase::gComponentManager = nsnull;
    73 nsIEventQueue* COMBase::gEventQ = nsnull;
    74 ipcIDConnectService *COMBase::gDConnectService = nsnull;
    75 PRUint32 COMBase::gVBoxServerID = 0;
    7642
    7743/* Mac OS X (Carbon mode) and OS/2 will notify the native queue
     
    8046   very silly. */
    8147# if !defined (Q_OS_MAC)  && !defined (Q_OS_OS2)
    82 XPCOMEventQSocketListener *COMBase::gSocketListener = 0;
     48XPCOMEventQSocketListener *COMBase::sSocketListener = 0;
     49
    8350# endif
    8451
     
    10370    }
    10471
     72    virtual ~XPCOMEventQSocketListener()
     73    {
     74        delete mNotifier;
     75    }
     76
    10577public slots:
    10678
     
    11082
    11183    QSocketNotifier *mNotifier;
    112     nsIEventQueue *mEventQ;
     84    nsCOMPtr <nsIEventQueue> mEventQ;
    11385};
    11486
    115 #endif // !defined (Q_OS_WIN32)
     87#endif /* !defined (VBOX_WITH_XPCOM) */
    11688
    11789/**
     
    12294    LogFlowFuncEnter();
    12395
    124 #if defined (Q_OS_WIN32)
     96    HRESULT rc = S_OK;
     97
     98#if !defined (VBOX_WITH_XPCOM)
    12599
    126100    /* disable this damn CoInitialize* somehow made by Qt during
     
    128102     * why does it do this) */
    129103    CoUninitialize();
    130     CoInitializeEx (NULL, COINIT_MULTITHREADED |
    131                           COINIT_DISABLE_OLE1DDE |
    132                           COINIT_SPEED_OVER_MEMORY);
    133 
    134     LogFlowFuncLeave();
    135     return S_OK;
    136 
    137 #else
    138 
    139     if (gComponentManager)
    140     {
    141         LogFlowFuncLeave();
    142         return S_OK;
    143     }
    144 
    145     /*
    146      * Set VBOX_XPCOM_HOME if not present like we do in the common glue code.
    147      * (XPCOMGlueStartup will query this.)
    148      */
    149     if (!RTEnvExist ("VBOX_XPCOM_HOME"))
    150     {
    151         /* get the executable path */
    152         char szPathProgram [RTPATH_MAX];
    153         int rcVBox = RTPathProgram (szPathProgram, sizeof (szPathProgram));
    154         if (RT_SUCCESS (rcVBox))
    155             RTEnvSet ("VBOX_XPCOM_HOME", szPathProgram);
    156     }
    157 
    158     HRESULT rc;
    159     XPCOMGlueStartup (nsnull);
    160 
    161     nsCOMPtr <nsIServiceManager> serviceManager;
    162 
    163     /* create a file object containing the path to the executable */
    164     QCString appDir;
     104
     105#endif /* !defined (VBOX_WITH_XPCOM) */
     106
     107    rc = com::Initialize();
     108
     109#if defined (VBOX_WITH_XPCOM)
     110
     111#if !defined (__DARWIN__) && !defined (__OS2__)
     112
     113    if (NS_SUCCEEDED (rc))
     114    {
     115        nsCOMPtr <nsIEventQueue> eventQ;
     116        rc = NS_GetMainEventQ (getter_AddRefs (eventQ));
     117        if (NS_SUCCEEDED (rc))
     118        {
    165119#ifdef DEBUG
    166     appDir = getenv ("VIRTUALBOX_APP_HOME");
    167     if (!appDir.isNull())
    168         appDir = QFile::encodeName (QFileInfo (QFile::decodeName (appDir)).absFilePath());
    169     else
     120            BOOL isNative = FALSE;
     121            eventQ->IsQueueNative (&isNative);
     122            AssertMsg (isNative, ("The event queue must be native"));
    170123#endif
    171     appDir = QFile::encodeName (qApp->applicationDirPath());
    172     nsCOMPtr <nsILocalFile> lfAppDir;
    173     rc = NS_NewNativeLocalFile (nsEmbedCString (appDir.data()), PR_FALSE,
    174                                 getter_AddRefs (lfAppDir));
    175     if (SUCCEEDED (rc))
    176     {
    177         nsCOMPtr <nsIFile> fAppDir = do_QueryInterface (lfAppDir, &rc);
    178         if (SUCCEEDED( rc ))
    179         {
    180             /* initialize XPCOM and get the service manager */
    181             rc = NS_InitXPCOM2 (getter_AddRefs (serviceManager), fAppDir, nsnull);
    182         }
    183     }
    184 
    185     if (SUCCEEDED (rc))
    186     {
    187         /* get the registrar */
    188         nsCOMPtr <nsIComponentRegistrar> registrar =
    189             do_QueryInterface (serviceManager, &rc);
    190         if (SUCCEEDED (rc))
    191         {
    192             /* autoregister components from a component directory */
    193             registrar->AutoRegister (nsnull);
    194 
    195             /* get the component manager */
    196             rc = registrar->QueryInterface (NS_GET_IID (nsIComponentManager),
    197                                             (void**) &gComponentManager);
    198             if (SUCCEEDED (rc))
     124            BOOL isOnMainThread = FALSE;
     125            rc = eventQ->IsOnCurrentThread (&isOnMainThread);
     126            if (NS_SUCCEEDED (rc) && isOnMainThread)
    199127            {
    200                 /* get the main thread's event queue (afaik, the
    201                  * dconnect service always gets created upon XPCOM
    202                  * startup, so it will use the main (this) thread's
    203                  * event queue to receive IPC events) */
    204                 rc = NS_GetMainEventQ (&gEventQ);
    205 #ifdef DEBUG
    206                 BOOL isNative = FALSE;
    207                 gEventQ->IsQueueNative (&isNative);
    208                 AssertMsg (isNative, ("The event queue must be native"));
    209 #endif
    210 # if !defined (__DARWIN__) && !defined (__OS2__)
    211                 gSocketListener = new XPCOMEventQSocketListener (gEventQ);
    212 # endif
    213 
    214 /// @todo remove the below code and corresponding variables etc. when
    215 /// the server autostart feature is finished and well tested.
    216 ///
    217 //                /* get the IPC service */
    218 //                 nsCOMPtr <ipcIService> ipcServ =
    219 //                     do_GetService (IPC_SERVICE_CONTRACTID, serviceManager, &rc);
    220 //                 if (SUCCEEDED (rc))
    221 //                 {
    222 //                     /* get the VirtualBox out-of-proc server ID */
    223 //                     rc = ipcServ->ResolveClientName ("VirtualBoxServer",
    224 //                                                      &gVBoxServerID);
    225 //                     if (SUCCEEDED (rc))
    226 //                     {
    227 //                         /* get the DConnect service */
    228 //                         rc = serviceManager->
    229 //                             GetServiceByContractID (IPC_DCONNECTSERVICE_CONTRACTID,
    230 //                                                     NS_GET_IID (ipcIDConnectService),
    231 //                                                     (void **) &gDConnectService);
    232 //                     }
    233 //                 }
     128                sSocketListener = new XPCOMEventQSocketListener (eventQ);
    234129            }
    235130        }
    236131    }
    237132
     133#endif
     134
     135#endif /* defined (VBOX_WITH_XPCOM) */
     136
    238137    if (FAILED (rc))
    239138        cleanupCOM();
     139
     140    AssertComRC (rc);
    240141
    241142    LogFlowFunc (("rc=%08X\n", rc));
     
    243144    return rc;
    244145
    245 #endif
    246146}
    247147
    248148/**
    249  *  Initializes COM/XPCOM.
     149 *  Cleans up COM/XPCOM.
    250150 */
    251151HRESULT COMBase::cleanupCOM()
     
    253153    LogFlowFuncEnter();
    254154
    255 #if defined (Q_OS_WIN32)
    256     CoUninitialize();
    257 #else
    258     if (gComponentManager)
    259     {
    260         PRBool isOnCurrentThread = true;
    261         if (gEventQ)
    262             gEventQ->IsOnCurrentThread (&isOnCurrentThread);
    263 
    264         if (isOnCurrentThread)
     155    HRESULT rc = S_OK;
     156
     157#if defined (VBOX_WITH_XPCOM)
     158
     159    /* scope the code to make smart references are released before calling
     160     * com::Shutdown() */
     161    {
     162        nsCOMPtr <nsIEventQueue> eventQ;
     163        rc = NS_GetMainEventQ (getter_AddRefs (eventQ));
     164        if (NS_SUCCEEDED (rc))
    265165        {
    266             LogFlowFunc (("Doing cleanup...\n"));
     166            BOOL isOnMainThread = FALSE;
     167            rc = eventQ->IsOnCurrentThread (&isOnMainThread);
     168            if (NS_SUCCEEDED (rc) && isOnMainThread)
     169            {
    267170# if !defined (__DARWIN__) && !defined (__OS2__)
    268             if (gSocketListener)
    269                 delete gSocketListener;
     171                if (sSocketListener)
     172                {
     173                    delete sSocketListener;
     174                    sSocketListener = NULL;
     175                }
    270176# endif
    271             if (gDConnectService)
    272             {
    273                 gDConnectService->Release();
    274                 gDConnectService = nsnull;
    275177            }
    276             if (gEventQ)
    277             {
    278                 gEventQ->Release();
    279                 gEventQ = nsnull;
    280             }
    281             gComponentManager->Release();
    282             gComponentManager = nsnull;
    283             /* note: gComponentManager = nsnull indicates that we're
    284              * cleaned up */
    285             NS_ShutdownXPCOM (nsnull);
    286             XPCOMGlueShutdown();
    287178        }
    288179    }
    289 #endif
    290 
     180
     181#endif /* defined (VBOX_WITH_XPCOM) */
     182
     183    HRESULT rc2 = com::Shutdown();
     184    if (SUCCEEDED (rc))
     185        rc = rc2;
     186
     187    AssertComRC (rc);
     188
     189    LogFlowFunc (("rc=%08X\n", rc));
    291190    LogFlowFuncLeave();
    292     return S_OK;
     191    return rc;
    293192}
    294193
     
    358257    HRESULT rc = E_FAIL;
    359258
    360 #if defined (__WIN__)
     259#if !defined (VBOX_WITH_XPCOM)
    361260
    362261    if (callee)
     
    405304    }
    406305
    407 #else // !defined (__WIN__)
     306#else /* !defined (VBOX_WITH_XPCOM) */
    408307
    409308    nsCOMPtr <nsIExceptionService> es;
     
    458357    AssertComRC (rc);
    459358
    460 #endif // !defined (__WIN__)
     359#endif /* !defined (VBOX_WITH_XPCOM) */
    461360
    462361    if (callee && calleeIID && mIsBasicAvailable)
     
    472371    QString name;
    473372
    474 #if defined (__WIN__)
    475 
    476     LONG rc;
    477     LPOLESTR iidStr = NULL;
    478     if (StringFromIID (id, &iidStr) == S_OK)
    479     {
    480         HKEY ifaceKey;
    481         rc = RegOpenKeyExW (HKEY_CLASSES_ROOT, L"Interface", 0, KEY_QUERY_VALUE, &ifaceKey);
    482         if (rc == ERROR_SUCCESS)
    483         {
    484             HKEY iidKey;
    485             rc = RegOpenKeyExW (ifaceKey, iidStr, 0, KEY_QUERY_VALUE, &iidKey);
    486             if (rc == ERROR_SUCCESS)
    487             {
    488                 // determine the size and type
    489                 DWORD sz, type;
    490                 rc = RegQueryValueExW (iidKey, NULL, NULL, &type, NULL, &sz);
    491                 if (rc == ERROR_SUCCESS && type == REG_SZ)
    492                 {
    493                     // query the value to BSTR
    494                     BSTR bstrName = SysAllocStringLen (NULL, (sz + 1) / sizeof (TCHAR) + 1);
    495                     rc = RegQueryValueExW (iidKey, NULL, NULL, NULL, (LPBYTE) bstrName, &sz);
    496                     if (rc == ERROR_SUCCESS)
    497                     {
    498                         name = QString::fromUcs2 (bstrName);
    499                     }
    500                     SysFreeString (bstrName);
    501                 }
    502                 RegCloseKey (iidKey);
    503             }
    504             RegCloseKey (ifaceKey);
    505         }
    506         CoTaskMemFree (iidStr);
    507     }
    508 
    509 #else
    510 
    511     nsresult rv;
    512     nsCOMPtr <nsIInterfaceInfoManager> iim =
    513         do_GetService (NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID, &rv);
    514     if (NS_SUCCEEDED (rv))
    515     {
    516         nsCOMPtr <nsIInterfaceInfo> iinfo;
    517         rv = iim->GetInfoForIID (&COMBase::GUIDIn (id), getter_AddRefs (iinfo));
    518         if (NS_SUCCEEDED (rv))
    519         {
    520             const char *iname = NULL;
    521             iinfo->GetNameShared (&iname);
    522             name = QString::fromLocal8Bit (iname);
    523         }
    524     }
    525 
    526 #endif
     373    com::GetInterfaceNameByIID (COMBase::GUIDIn (id), COMBase::BSTROut (name));
    527374
    528375    return name;
    529376}
    530377
    531 #if !defined (Q_OS_WIN32)
     378#if defined (VBOX_WITH_XPCOM)
    532379#include "COMDefs.moc"
    533380#endif
  • trunk/src/VBox/Main/VirtualBoxImpl.cpp

    r2610 r2976  
    4040#include <stdio.h>
    4141#include <stdlib.h>
    42 #include <VBox/err.h>
     42
    4343#include <iprt/path.h>
    4444#include <iprt/dir.h>
     
    4848#include <iprt/thread.h>
    4949#include <iprt/process.h>
     50
     51#include <VBox/err.h>
    5052#include <VBox/param.h>
    5153#include <VBox/VBoxHDD.h>
     
    5456#include <VBox/version.h>
    5557
     58#include <VBox/com/com.h>
     59
    5660#include <algorithm>
    5761#include <set>
     
    6165/////////////////////////////////////////////////////////////////////////////
    6266
    63 #ifdef __DARWIN__
    64 #define VBOXCONFIGDIR        "Library/VirtualBox"
    65 #else
    66 #define VBOXCONFIGDIR        ".VirtualBox"
    67 #endif
    68 #define VBOXCONFIGGLOBALFILE "VirtualBox.xml"
     67#define VBOX_GLOBAL_SETTINGS_FILE "VirtualBox.xml"
    6968
    7069// globals
     
    138137    LogFlowThisFunc (("Version: %ls\n", sVersion.raw()));
    139138
    140     int vrc = VINF_SUCCESS;
    141     char buf [RTPATH_MAX];
    142 
    143     /*
    144      *  Detect the VirtualBox home directory. Note that the code below must
    145      *  be in sync with the appropriate code in Logging.cpp
    146      *  (MainReleaseLoggerInit()).
    147      */
    148     {
    149         /* check if an alternative VBox Home directory is set */
    150         const char *vboxUserHome = getenv ("VBOX_USER_HOME");
    151         if (vboxUserHome)
    152         {
    153             /* get the full path name */
    154             vrc = RTPathAbs (vboxUserHome, buf, sizeof (buf));
    155             if (VBOX_FAILURE (vrc))
    156                 return setError (E_FAIL,
    157                     tr ("Invalid home directory file path '%s' (%Vrc)"),
    158                     vboxUserHome, vrc);
    159             unconst (mData.mHomeDir) = buf;
    160         }
    161         else
    162         {
    163             /* compose the config directory (full path) */
    164             RTPathUserHome (buf, sizeof (buf));
    165             unconst (mData.mHomeDir) = Utf8StrFmt ("%s%c%s", buf,
    166                                                    RTPATH_DELIMITER,
    167                                                    VBOXCONFIGDIR);
    168         }
    169 
    170         /* ensure the home directory exists */
    171         if (!RTDirExists (mData.mHomeDir))
    172         {
    173             vrc = RTDirCreateFullPath (mData.mHomeDir, 0777);
    174             if (VBOX_FAILURE (vrc))
    175             {
    176                 return setError (E_FAIL,
    177                     tr ("Could not create the VirtualBox home directory '%s'"
    178                         "(%Vrc)"),
    179                     mData.mHomeDir.raw(), vrc);
    180             }
    181         }
    182     }
     139    /* Get the VirtualBox home directory. */
     140    int vrc = com::GetVBoxUserHomeDirectory (unconst (mData.mHomeDir));
     141    if (VBOX_FAILURE (vrc))
     142        return setError (E_FAIL,
     143            tr ("Could not create the VirtualBox home directory '%s'"
     144                "(%Vrc)"),
     145            mData.mHomeDir.raw(), vrc);
    183146
    184147    /* compose the global config file name (always full path) */
    185148    Utf8StrFmt vboxConfigFile ("%s%c%s", mData.mHomeDir.raw(),
    186                                RTPATH_DELIMITER, VBOXCONFIGGLOBALFILE);
     149                               RTPATH_DELIMITER, VBOX_GLOBAL_SETTINGS_FILE);
    187150
    188151    /* store the config file name */
  • trunk/src/VBox/Main/glue/com.cpp

    r2754 r2976  
    2323#include <objbase.h>
    2424
    25 #else
     25#else /* !defined (VBOX_WITH_XPCOM) */
    2626
    2727#include <stdlib.h>
    28 #include <VBox/err.h>
    29 #include <iprt/path.h>
    3028
    31 #include <nsXPCOMGlue.h>
    32 #include <nsIComponentRegistrar.h>
    33 #include <nsIServiceManager.h>
    3429#include <nsCOMPtr.h>
    35 #include <nsEventQueueUtils.h>
     30#include <nsIServiceManagerUtils.h>
    3631
    3732#include <nsIInterfaceInfo.h>
    3833#include <nsIInterfaceInfoManager.h>
    3934
    40 #endif
     35#endif /* !defined (VBOX_WITH_XPCOM) */
    4136
     37#include <iprt/param.h>
     38#include <iprt/path.h>
     39#include <iprt/dir.h>
     40#include <iprt/env.h>
    4241#include <iprt/string.h>
     42
    4343#include <VBox/err.h>
    4444
    4545#include "VBox/com/com.h"
    4646#include "VBox/com/assert.h"
     47
     48
     49#ifdef __DARWIN__
     50#define VBOX_USER_HOME_SUFFIX   "Library/VirtualBox"
     51#else
     52#define VBOX_USER_HOME_SUFFIX   ".VirtualBox"
     53#endif
     54
    4755
    4856namespace com
     
    95103    }
    96104
    97 #else
     105#else /* !defined (VBOX_WITH_XPCOM) */
    98106
    99107    nsresult rv;
     
    122130    }
    123131
    124 #endif
     132#endif /* !defined (VBOX_WITH_XPCOM) */
     133}
     134
     135int GetVBoxUserHomeDirectory (Utf8Str &aDir)
     136{
     137    /* start with null */
     138    aDir.setNull();
     139
     140    const char *VBoxUserHome = RTEnvGet ("VBOX_USER_HOME");
     141
     142    char path [RTPATH_MAX];
     143    int vrc = VINF_SUCCESS;
     144
     145    if (VBoxUserHome)
     146    {
     147        /* get the full path name */
     148        char *VBoxUserHomeUtf8 = NULL;
     149        vrc = RTStrCurrentCPToUtf8 (&VBoxUserHomeUtf8, VBoxUserHome);
     150        if (RT_SUCCESS (vrc))
     151        {
     152            vrc = RTPathAbs (VBoxUserHomeUtf8, path, sizeof (path));
     153            if (RT_SUCCESS (vrc))
     154                aDir = path;
     155            RTStrFree (VBoxUserHomeUtf8);
     156        }
     157    }
     158    else
     159    {
     160        /* compose the config directory (full path) */
     161        vrc = RTPathUserHome (path, sizeof (path));
     162        aDir = Utf8StrFmt ("%s%c%s", path, RTPATH_DELIMITER,
     163                           VBOX_USER_HOME_SUFFIX);
     164    }
     165
     166    /* ensure the home directory exists */
     167    if (RT_SUCCESS (vrc))
     168        if (!RTDirExists (aDir))
     169            vrc = RTDirCreateFullPath (aDir, 0777);
     170
     171    return vrc;
    125172}
    126173
  • trunk/src/VBox/Main/glue/initterm.cpp

    r2754 r2976  
    2323#include <objbase.h>
    2424
    25 #else
     25#else /* !defined (VBOX_WITH_XPCOM) */
    2626
    2727#include <stdlib.h>
    28 #include <VBox/err.h>
    29 #include <iprt/path.h>
    3028
    3129#include <nsXPCOMGlue.h>
     
    3432#include <nsCOMPtr.h>
    3533#include <nsEventQueueUtils.h>
    36 
    37 #include <nsIInterfaceInfo.h>
    38 #include <nsIInterfaceInfoManager.h>
    39 
    40 #endif
    41 
     34#include <nsEmbedString.h>
     35
     36#include <nsILocalFile.h>
     37#include <nsIDirectoryService.h>
     38#include <nsDirectoryServiceDefs.h>
     39
     40#endif /* !defined (VBOX_WITH_XPCOM) */
     41
     42#include <iprt/param.h>
     43#include <iprt/path.h>
    4244#include <iprt/string.h>
     45#include <iprt/env.h>
     46
    4347#include <VBox/err.h>
    4448
     
    4650#include "VBox/com/assert.h"
    4751
     52
    4853namespace com
    4954{
     55
     56#if defined (VBOX_WITH_XPCOM)
     57
     58class DirectoryServiceProvider : public nsIDirectoryServiceProvider
     59{
     60public:
     61
     62    NS_DECL_ISUPPORTS
     63
     64    DirectoryServiceProvider()
     65        : mCompRegLocation (NULL), mXPTIDatLocation (NULL)
     66        {}
     67
     68    virtual ~DirectoryServiceProvider();
     69
     70    HRESULT init (const char *aCompRegLocation,
     71                  const char *aXPTIDatLocation);
     72
     73    NS_DECL_NSIDIRECTORYSERVICEPROVIDER
     74
     75private:
     76
     77    char *mCompRegLocation;
     78    char *mXPTIDatLocation;
     79};
     80
     81NS_IMPL_ISUPPORTS1 (DirectoryServiceProvider, nsIDirectoryServiceProvider)
     82
     83DirectoryServiceProvider::~DirectoryServiceProvider()
     84{
     85    if (mCompRegLocation)
     86    {
     87        RTStrFree (mCompRegLocation);
     88        mCompRegLocation = NULL;
     89    }
     90    if (mXPTIDatLocation)
     91    {
     92        RTStrFree (mXPTIDatLocation);
     93        mXPTIDatLocation = NULL;
     94    }
     95}
     96
     97/**
     98 *  @param aCompRegLocation Path to compreg.dat, in Utf8.
     99 *  @param aXPTIDatLocation Path to xpti.data, in Utf8.
     100 */
     101HRESULT
     102DirectoryServiceProvider::init (const char *aCompRegLocation,
     103                                const char *aXPTIDatLocation)
     104{
     105    AssertReturn (aCompRegLocation, NS_ERROR_INVALID_ARG);
     106    AssertReturn (aXPTIDatLocation, NS_ERROR_INVALID_ARG);
     107
     108    int vrc = RTStrUtf8ToCurrentCP (&mCompRegLocation, aCompRegLocation);
     109    if (RT_SUCCESS (vrc))
     110        vrc = RTStrUtf8ToCurrentCP (&mXPTIDatLocation, aXPTIDatLocation);
     111
     112    return RT_SUCCESS (vrc) ? NS_OK : NS_ERROR_OUT_OF_MEMORY;
     113}
     114
     115NS_IMETHODIMP
     116DirectoryServiceProvider::GetFile (const char *aProp,
     117                                   PRBool *aPersistent,
     118                                   nsIFile **aRetval)
     119{
     120    nsCOMPtr <nsILocalFile> localFile;
     121    nsresult rv = NS_ERROR_FAILURE;
     122
     123    *aRetval = nsnull;
     124    *aPersistent = PR_TRUE;
     125
     126    const char *fileLocation = NULL;
     127
     128    if (strcmp (aProp, NS_XPCOM_COMPONENT_REGISTRY_FILE) == 0)
     129        fileLocation = mCompRegLocation;
     130    else if (strcmp (aProp, NS_XPCOM_XPTI_REGISTRY_FILE) == 0)
     131        fileLocation = mXPTIDatLocation;
     132    else
     133        return NS_ERROR_FAILURE;
     134
     135    rv = NS_NewNativeLocalFile (nsEmbedCString (fileLocation),
     136                                PR_TRUE, getter_AddRefs (localFile)); 
     137    if (NS_FAILED(rv))
     138        return rv;
     139
     140    return localFile->QueryInterface (NS_GET_IID (nsIFile),
     141                                      (void **) aRetval);
     142}
     143
     144#endif /* defined (VBOX_WITH_XPCOM) */
    50145
    51146HRESULT Initialize()
     
    59154                               COINIT_SPEED_OVER_MEMORY);
    60155
    61 #else
     156#else /* !defined (VBOX_WITH_XPCOM) */
    62157
    63158    /* Set VBOX_XPCOM_HOME if not present */
    64     if (!getenv("VBOX_XPCOM_HOME"))
     159    if (!RTEnvExist ("VBOX_XPCOM_HOME"))
    65160    {
    66161        /* get the executable path */
    67         char szPathProgram[1024];
    68         int rcVBox = RTPathProgram(szPathProgram, sizeof(szPathProgram));
    69         if (VBOX_SUCCESS(rcVBox))
    70         {
    71             setenv("VBOX_XPCOM_HOME", szPathProgram, 1);
    72         }
     162        char pathProgram [RTPATH_MAX];
     163        int vrc = RTPathProgram (pathProgram, sizeof (pathProgram));
     164        if (RT_SUCCESS (vrc))
     165        {
     166            char *pathProgramCP = NULL;
     167            vrc = RTStrUtf8ToCurrentCP (&pathProgramCP, pathProgram);
     168            if (RT_SUCCESS (vrc))
     169            {
     170                vrc = RTEnvSet ("VBOX_XPCOM_HOME", pathProgramCP);
     171                RTStrFree (pathProgramCP);
     172            }
     173        }
     174        AssertRC (vrc);
    73175    }
    74176
     
    78180    {
    79181        XPCOMGlueStartup (nsnull);
    80         nsCOMPtr <nsIServiceManager> serviceManager;
    81         rc = NS_InitXPCOM2 (getter_AddRefs (serviceManager), nsnull, nsnull);
     182
     183        nsCOMPtr <DirectoryServiceProvider> dsProv;
     184
     185        /* prepare paths for registry files */
     186        Utf8Str homeDir;
     187        int vrc = GetVBoxUserHomeDirectory (homeDir);
     188        if (RT_SUCCESS (vrc))
     189        {
     190            Utf8Str compReg = Utf8StrFmt ("%s%c%s", homeDir.raw(),
     191                                          RTPATH_DELIMITER, "compreg.dat");
     192            Utf8Str xptiDat = Utf8StrFmt ("%s%c%s", homeDir.raw(),
     193                                          RTPATH_DELIMITER, "xpti.dat");
     194            dsProv = new DirectoryServiceProvider();
     195            if (dsProv)
     196                rc = dsProv->init (compReg, xptiDat);
     197            else
     198                rc = NS_ERROR_OUT_OF_MEMORY;
     199        }
     200        else
     201            rc = NS_ERROR_FAILURE;
     202
     203        /* get the path to the executable */
     204        nsCOMPtr <nsIFile> appDir;
     205        {
     206            char path [RTPATH_MAX];
     207            char *appDirCP = NULL;
     208#if defined (DEBUG)
     209            const char *env = RTEnvGet ("VIRTUALBOX_APP_HOME");
     210            if (env)
     211            {
     212                char *appDirUtf8 = NULL;
     213                vrc = RTStrCurrentCPToUtf8 (&appDirUtf8, env);
     214                if (RT_SUCCESS (vrc))
     215                {
     216                    vrc = RTPathReal (appDirUtf8, path, RTPATH_MAX);
     217                    if (RT_SUCCESS (vrc))
     218                        vrc = RTStrUtf8ToCurrentCP (&appDirCP, appDirUtf8);
     219                    RTStrFree (appDirUtf8);
     220                }
     221            }
     222            else
     223#endif
     224            {
     225                vrc = RTPathProgram (path, RTPATH_MAX);
     226                if (RT_SUCCESS (vrc))
     227                    vrc = RTStrUtf8ToCurrentCP (&appDirCP, path);
     228            }
     229
     230            if (RT_SUCCESS (vrc))
     231            {
     232                nsCOMPtr<nsILocalFile> file;
     233                rc = NS_NewNativeLocalFile (nsEmbedCString (appDirCP),
     234                                            PR_FALSE, getter_AddRefs (file));
     235                if (NS_SUCCEEDED (rc))
     236                    appDir = do_QueryInterface (file, &rc);
     237           
     238                RTStrFree (appDirCP);
     239            }
     240            else
     241                rc = NS_ERROR_FAILURE;
     242        }
     243
     244        /* Finally, initialize XPCOM */
    82245        if (NS_SUCCEEDED (rc))
    83246        {
    84             nsCOMPtr <nsIComponentRegistrar> registrar =
    85                 do_QueryInterface (serviceManager, &rc);
     247            nsCOMPtr <nsIServiceManager> serviceManager;
     248            rc = NS_InitXPCOM2 (getter_AddRefs (serviceManager),
     249                                appDir, dsProv);
     250
    86251            if (NS_SUCCEEDED (rc))
    87                 registrar->AutoRegister (nsnull);
    88         }
    89     }
    90 
    91 #endif
     252            {
     253                nsCOMPtr <nsIComponentRegistrar> registrar =
     254                    do_QueryInterface (serviceManager, &rc);
     255                if (NS_SUCCEEDED (rc))
     256                    registrar->AutoRegister (nsnull);
     257            }
     258        }
     259    }
     260
     261#endif /* !defined (VBOX_WITH_XPCOM) */
    92262
    93263    AssertComRC (rc);
     
    96266}
    97267
    98 void Shutdown()
    99 {
     268HRESULT Shutdown()
     269{
     270    HRESULT rc = S_OK;
     271
    100272#if !defined (VBOX_WITH_XPCOM)
    101273
    102274    CoUninitialize();
    103275
    104 #else
     276#else /* !defined (VBOX_WITH_XPCOM) */
    105277
    106278    nsCOMPtr <nsIEventQueue> eventQ;
    107     nsresult rc = NS_GetMainEventQ (getter_AddRefs (eventQ));
    108     if (NS_SUCCEEDED (rc))
    109     {
     279    rc = NS_GetMainEventQ (getter_AddRefs (eventQ));
     280
     281    if (NS_SUCCEEDED (rc) || rc == NS_ERROR_NOT_AVAILABLE)
     282    {
     283        /* NS_ERROR_NOT_AVAILABLE seems to mean that
     284         * nsIEventQueue::StopAcceptingEvents() has been called (see
     285         * nsEventQueueService.cpp). We hope that this error code always means
     286         * just that in this case and assume that we're on the main thread
     287         * (it's a kind of unexpected behavior if a non-main thread ever calls
     288         * StopAcceptingEvents() on the main event queue). */
     289
    110290        BOOL isOnMainThread = FALSE;
    111         eventQ->IsOnCurrentThread (&isOnMainThread);
    112         eventQ = nsnull; /* early release */
    113         if (isOnMainThread)
     291        if (NS_SUCCEEDED (rc))
     292        {
     293            rc = eventQ->IsOnCurrentThread (&isOnMainThread);
     294            eventQ = nsnull; /* early release */
     295        }
     296        else
     297        {
     298            isOnMainThread = TRUE;
     299            rc = NS_OK;
     300        }
     301
     302        if (NS_SUCCEEDED (rc) && isOnMainThread)
    114303        {
    115304            /* only the main thread needs to uninitialize XPCOM */
    116             NS_ShutdownXPCOM (nsnull);
     305            rc = NS_ShutdownXPCOM (nsnull);
    117306            XPCOMGlueShutdown();
    118307        }
    119308    }
    120309
    121 #endif
     310#endif /* !defined (VBOX_WITH_XPCOM) */
     311
     312    AssertComRC (rc);
     313
     314    return rc;
    122315}
    123316
  • trunk/src/VBox/Main/linux/server.cpp

    r2331 r2976  
    2323#include <ipcCID.h>
    2424
    25 #include <nsIServiceManager.h>
    2625#include <nsIComponentRegistrar.h>
    2726
     
    2928#include <nsEventQueueUtils.h>
    3029
    31 // for NS_InitXPCOM2 with bin dir parameter
    32 #include <nsEmbedString.h>
    33 #include <nsIFile.h>
    34 #include <nsILocalFile.h>
     30// for nsMyFactory
     31#include <nsIGenericFactory.h>
     32#include <nsIClassInfo.h>
    3533
    3634#include "linux/server.h"
     35
    3736#include "Logging.h"
    3837
     
    4544#include <VBox/version.h>
    4645
    47 // for nsMyFactory
    48 #include "nsIGenericFactory.h"
    49 #include "nsIClassInfo.h"
     46#include <VBox/com/com.h>
    5047
    5148#include <stdio.h>
     
    10731070    do
    10741071    {
    1075         XPCOMGlueStartup (nsnull);
    1076 
    1077         char path [RTPATH_MAX];
    1078         path [0] = '\0';
    1079 
    1080         nsCOMPtr<nsIFile> nsAppPath;
    1081         {
    1082             /* get the path to the executable */
    1083             char *appPath = NULL;
    1084 #if defined (DEBUG)
    1085             appPath = getenv ("VIRTUALBOX_APP_HOME");
    1086             if (appPath)
    1087                 RTPathReal (appPath, path, RTPATH_MAX);
    1088             else
    1089 #endif
    1090                 RTPathProgram (path, RTPATH_MAX);
    1091             appPath = path;
    1092 
    1093             nsCOMPtr<nsILocalFile> file;
    1094             rc = NS_NewNativeLocalFile (nsEmbedCString (appPath),
    1095                                         PR_FALSE, getter_AddRefs (file));
    1096             if (NS_SUCCEEDED (rc))
    1097                 nsAppPath = do_QueryInterface (file, &rc);
    1098         }
     1072        rc = com::Initialize();
    10991073        if (NS_FAILED (rc))
    11001074        {
    1101             printf ("ERROR: Failed to create file object! (rc=%08X)\n", rc);
     1075            printf ("ERROR: Failed to initialize XPCOM! (rc=%08X)\n", rc);
    11021076            break;
    11031077        }
    11041078
    1105         /* not really necessary at the moment */
    1106 #if 0
    1107         if (!RTProcGetExecutableName (path, sizeof (path)))
    1108         {
    1109             printf ("ERROR: Failed to get executable name!\n");
    1110             break;
    1111         }
    1112 #endif
    1113 
    1114         nsCOMPtr<nsIServiceManager> servMan;
    1115         NS_InitXPCOM2 (getter_AddRefs (servMan), nsAppPath, nsnull);
    1116         if (!servMan)
    1117         {
    1118             printf ("ERROR: Failed to get service manager!\n");
    1119             break;
    1120         }
    1121 
    1122         nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface (servMan);
    1123         if (!registrar)
    1124         {
    1125             printf ("ERROR: Failed to get component registrar!\n");
     1079        nsCOMPtr <nsIComponentRegistrar> registrar;
     1080        rc = NS_GetComponentRegistrar (getter_AddRefs (registrar));
     1081        if (NS_FAILED (rc))
     1082        {
     1083            printf ("ERROR: Failed to get component registrar! (rc=%08X)\n", rc);
    11261084            break;
    11271085        }
     
    12291187        }
    12301188
    1231         gIpcServ->RemoveName (path);
    1232 
    1233         // stop accepting new events
     1189        gIpcServ->RemoveName (VBOXSVC_IPC_NAME);
     1190
     1191        /* stop accepting new events */
    12341192        gEventQ->StopAcceptingEvents();
    1235         // process any remaining events
     1193
     1194        /* process any remaining events */
    12361195        gEventQ->ProcessPendingEvents();
    12371196
    12381197        printf ("Terminated event loop.\n");
    1239 
    12401198    }
    12411199    while (0); // this scopes the nsCOMPtrs
     
    12441202    NS_IF_RELEASE (gEventQ);
    12451203
    1246     // no nsCOMPtrs are allowed to be alive when you call NS_ShutdownXPCOM
    1247     LogFlowFunc (("Calling NS_ShutdownXPCOM()...\n"));
    1248     rc = NS_ShutdownXPCOM (nsnull);
    1249     LogFlowFunc (("Finished NS_ShutdownXPCOM() (rc=%08X)\n", rc));
     1204    /* no nsCOMPtrs are allowed to be alive when you call com::Shutdown(). */
     1205
     1206    LogFlowFunc (("Calling com::Shutdown()...\n"));
     1207    rc = com::Shutdown();
     1208    LogFlowFunc (("Finished com::Shutdown() (rc=%08X)\n", rc));
    12501209
    12511210    if (NS_FAILED (rc))
    12521211        printf ("ERROR: Failed to shutdown XPCOM! (rc=%08X)\n", rc);
    12531212
    1254     XPCOMGlueShutdown();
    1255 
    12561213    printf ("XPCOM server has shutdown.\n");
    12571214
Note: See TracChangeset for help on using the changeset viewer.

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