VirtualBox

Changeset 16903 in vbox for trunk


Ignore:
Timestamp:
Feb 18, 2009 2:17:15 PM (16 years ago)
Author:
vboxsync
Message:

Python: imporved error reporting in XPCOM, shell updates, docs

Location:
trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/VirtualBoxImpl.cpp

    r16873 r16903  
    749749{
    750750    LogFlowThisFuncEnter();
     751    LogFlowThisFunc (("aName=\"%ls\",aOsTypeId =\"%ls\",aBaseFolder=\"%ls\"\n", aName, aOsTypeId, aBaseFolder));
    751752
    752753    CheckComArgStrNotEmptyOrNull (aName);
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r16867 r16903  
    14971497        However, this is not recommended and you should normally pass an empty
    14981498        (null) UUID to this method so that a new UUID will be automatically
    1499         generated for every created machine.
     1499        generated for every created machine. You can use UUID
     1500        00000000-0000-0000-0000-000000000000 as null value.
    15001501
    15011502        <note>
  • trunk/src/libs/xpcom18a4/python/sample/shellcommon.py

    r16366 r16903  
    145145   return s.split()
    146146
    147 def startVm(mgr,vb,mach,type,perf):
     147def createVm(ctx,name,kind,base):
     148    mgr = ctx['mgr']
     149    vb = ctx['vb']
     150    session = mgr.getSessionObject(vb)
     151    mach = vb.createMachine(name, kind, base,
     152                            "00000000-0000-0000-0000-000000000000")
     153    mach.saveSettings()
     154    print "created machine with UUID",mach.id
     155    vb.registerMachine(mach)
     156
     157def removeVm(ctx,mach):
     158    mgr = ctx['mgr']
     159    vb = ctx['vb']
     160    print "removing machine ",mach.name,"with UUID",mach.id
     161    mach = vb.unregisterMachine(mach.id)
     162    if mach:
     163         mach.deleteSettings()
     164
     165def startVm(ctx,mach,type):
     166    mgr = ctx['mgr']
     167    vb = ctx['vb']
     168    perf = ctx['perf']
    148169    session = mgr.getSessionObject(vb)
    149170    uuid = mach.id
     
    152173    completed = progress.completed
    153174    rc = progress.resultCode
    154     print "Completed:", completed, "rc:",rc
     175    print "Completed:", completed, "rc:",hex(rc&0xffffffff)
    155176    if int(rc) == 0:
    156177        # we ignore exceptions to allow starting VM even if
     
    163184                traceback.print_exc()
    164185            pass
    165     session.close()
     186         # if session not opened, close doesn't make sense
     187        session.close()
     188    else:
     189        # Not yet implemented error string query API for remote API
     190        if not ctx['remote']:
     191            print session.QueryErrorObject(rc)
    166192
    167193def getMachines(ctx):
     
    282308    else:
    283309        type = "gui"
    284     startVm(ctx['mgr'], ctx['vb'], mach, type, ctx['perf'])
     310    startVm(ctx, mach, type)
     311    return 0
     312
     313def createCmd(ctx, args):
     314    if (len(args) < 3 or len(args) > 4):
     315        print "usage: create name ostype <basefolder>"
     316        return 0
     317    name = args[1]
     318    oskind = args[2]
     319    if len(args) == 4:
     320        base = args[3]
     321    else:
     322        base = ''
     323    try:
     324         ctx['vb'].getGuestOSType(oskind)
     325    except Exception, e:
     326        print 'Unknown OS type:',oskind
     327        return 0
     328    createVm(ctx, name, oskind, base)
     329    return 0
     330
     331def removeCmd(ctx, args):
     332    mach = argsToMach(ctx,args)
     333    if mach == None:
     334        return 0
     335    removeVm(ctx, mach)
    285336    return 0
    286337
     
    382433commands = {'help':['Prints help information', helpCmd],
    383434            'start':['Start virtual machine by name or uuid', startCmd],
     435            'create':['Create virtual machine', createCmd],
     436            'remove':['Remove virtual machine', removeCmd],
    384437            'pause':['Pause virtual machine', pauseCmd],
    385438            'resume':['Resume virtual machine', resumeCmd],
  • trunk/src/libs/xpcom18a4/python/src/ErrorUtils.cpp

    r12752 r16903  
    5151#ifdef VBOX
    5252#include <nsIExceptionService.h>
     53#include <iprt/err.h>
    5354#endif
    5455#include "nspr.h" // PR_fprintf
     
    210211        // state when called back from the C code is clear.  Only Python 2.4
    211212        // and later allows an explicit exc_info tuple().
    212        
     213
    213214        // Don't use VLogF here, instead arrange for exception info and
    214215        // traceback to be in the same buffer.
     
    243244#endif
    244245
     246#ifdef VBOX
     247PyObject *PyXPCOM_BuildErrorMessage(nsresult r)
     248{
     249    char msg[512];
     250    bool gotMsg = false;
     251
     252    const RTCOMERRMSG* pMsg = RTErrCOMGet(r);
     253    if (strncmp(pMsg->pszMsgFull, "Unknown", 7) != 0)
     254    {
     255        gotMsg = true;
     256        PR_snprintf(msg, sizeof(msg), "%s (%s)",
     257                    pMsg->pszMsgFull, pMsg->pszDefine);
     258        gotMsg = true;
     259    }
     260
     261    nsresult rc;
     262    nsCOMPtr <nsIExceptionService> es;
     263    es = do_GetService (NS_EXCEPTIONSERVICE_CONTRACTID, &rc);
     264    if (!gotMsg && NS_SUCCEEDED (rc))
     265    {
     266        nsCOMPtr <nsIExceptionManager> em;
     267        rc = es->GetCurrentExceptionManager (getter_AddRefs (em));
     268        if (NS_SUCCEEDED (rc))
     269        {
     270            nsCOMPtr <nsIException> ex;
     271            rc = em->GetExceptionFromProvider(r, NULL, getter_AddRefs (ex));
     272            if  (NS_SUCCEEDED (rc) && ex)
     273            {
     274                nsXPIDLCString emsg;
     275                ex->GetMessage(getter_Copies(emsg));
     276                PR_snprintf(msg, sizeof(msg), "%s",
     277                            emsg.get());
     278                gotMsg = true;
     279            }
     280        }
     281    }
     282
     283    if (!gotMsg)
     284    {
     285        PR_snprintf(msg, sizeof(msg), "Error %d in module %d",
     286                    NS_ERROR_GET_CODE(r), NS_ERROR_GET_MODULE(r));
     287    }
     288    PyObject *evalue = Py_BuildValue("is", r, msg);
     289    return evalue;
     290}
     291#endif
    245292
    246293PyObject *PyXPCOM_BuildPyException(nsresult r)
    247294{
    248 #ifndef VBOX 
     295#ifndef VBOX
    249296        // Need the message etc.
    250297        PyObject *evalue = Py_BuildValue("i", r);
     298#else
     299        PyObject *evalue = PyXPCOM_BuildErrorMessage(r);
     300#endif
    251301        PyErr_SetObject(PyXPCOM_Error, evalue);
    252302        Py_XDECREF(evalue);
    253303        return NULL;
    254 #else
    255         char msg[256];
    256        
    257         nsresult rc;
    258         nsCOMPtr <nsIExceptionService> es;
    259         es = do_GetService (NS_EXCEPTIONSERVICE_CONTRACTID, &rc);
    260         bool gotMsg = false;
    261         if (NS_SUCCEEDED (rc))
    262         {
    263             nsCOMPtr <nsIExceptionManager> em;
    264             rc = es->GetCurrentExceptionManager (getter_AddRefs (em));
    265             if (NS_SUCCEEDED (rc))
    266             {
    267                 nsCOMPtr <nsIException> ex;
    268                 rc = em->GetExceptionFromProvider(r, NULL, getter_AddRefs (ex));
    269                 if  (NS_SUCCEEDED (rc) && ex)
    270                 {       
    271                     nsXPIDLCString emsg;
    272                     ex->GetMessage(getter_Copies(emsg));
    273                     PR_snprintf(msg, sizeof(msg), "%s",
    274                                 emsg.get());
    275                     gotMsg = true;
    276                 }
    277             }
    278         }
    279 
    280         if (!gotMsg)
    281         {
    282             PR_snprintf(msg, sizeof(msg), "Error %d in module %d",
    283                         NS_ERROR_GET_CODE(r), NS_ERROR_GET_MODULE(r));
    284         }
    285         PyObject *evalue = Py_BuildValue("is", r, msg);
    286         PyErr_SetObject(PyXPCOM_Error, evalue);
    287         Py_XDECREF(evalue);
    288         return NULL;
    289 #endif
    290304}
    291305
     
    348362                TRACEBACK_FETCH_ERROR("cant find traceback.print_tb\n");
    349363
    350         argsTB = Py_BuildValue("OOO", 
     364        argsTB = Py_BuildValue("OOO",
    351365                        exc_tb  ? exc_tb  : Py_None,
    352                         Py_None, 
     366                        Py_None,
    353367                        obStringIO);
    354         if (argsTB==NULL) 
     368        if (argsTB==NULL)
    355369                TRACEBACK_FETCH_ERROR("cant make print_tb arguments\n");
    356370
    357371        obResult = PyObject_CallObject(obFuncTB, argsTB);
    358         if (obResult==NULL) 
     372        if (obResult==NULL)
    359373                TRACEBACK_FETCH_ERROR("traceback.print_tb() failed\n");
    360374        /* Now call the getvalue() method in the StringIO instance */
     
    365379        Py_DECREF(obResult);
    366380        obResult = PyObject_CallObject(obFuncStringIO, NULL);
    367         if (obResult==NULL) 
     381        if (obResult==NULL)
    368382                TRACEBACK_FETCH_ERROR("getvalue() failed.\n");
    369383
  • trunk/src/libs/xpcom18a4/python/src/PyISupports.cpp

    r11746 r16903  
    5353
    5454PyObject *PyObject_FromNSInterface( nsISupports *aInterface,
    55                                     const nsIID &iid, 
     55                                    const nsIID &iid,
    5656                                    PRBool bMakeNicePyObject /*= PR_TRUE */)
    5757{
     
    6060}
    6161
    62 PRInt32 
     62PRInt32
    6363_PyXPCOM_GetInterfaceCount(void)
    6464{
     
    7979Py_nsISupports::~Py_nsISupports()
    8080{
    81         SafeRelease(this);     
     81        SafeRelease(this);
    8282        PR_AtomicDecrement(&cInterfaces);
    8383        PyXPCOM_DLLRelease();
     
    130130                if (NS_SUCCEEDED(rv))
    131131                        rv = ss->ToString(&val);
    132                 } // end-scope 
     132                } // end-scope
    133133                Py_END_ALLOW_THREADS;
    134134                PyObject *ret = NS_FAILED(rv) ?
     
    154154Py_nsISupports::Constructor(nsISupports *pInitObj, const nsIID &iid)
    155155{
    156         return new Py_nsISupports(pInitObj, 
    157                                        iid, 
     156        return new Py_nsISupports(pInitObj,
     157                                       iid,
    158158                                       type);
    159159}
    160160
    161161PRBool
    162 Py_nsISupports::InterfaceFromPyISupports(PyObject *ob, 
    163                                          const nsIID &iid, 
     162Py_nsISupports::InterfaceFromPyISupports(PyObject *ob,
     163                                         const nsIID &iid,
    164164                                         nsISupports **ppv)
    165165{
     
    178178        if (iid.Equals(Py_nsIID_NULL)) {
    179179                // a bit of a hack - we are asking for the arbitary interface
    180                 // wrapped by this object, not some other specific interface - 
     180                // wrapped by this object, not some other specific interface -
    181181                // so no QI, just an AddRef();
    182182                Py_BEGIN_ALLOW_THREADS
     
    209209
    210210PRBool
    211 Py_nsISupports::InterfaceFromPyObject(PyObject *ob, 
    212                                            const nsIID &iid, 
    213                                            nsISupports **ppv, 
     211Py_nsISupports::InterfaceFromPyObject(PyObject *ob,
     212                                           const nsIID &iid,
     213                                           nsISupports **ppv,
    214214                                           PRBool bNoneOK,
    215215                                           PRBool bTryAutoWrap /* = PR_TRUE */)
     
    300300
    301301/*static */PyObject *
    302 Py_nsISupports::PyObjectFromInterface(nsISupports *pis, 
    303                                       const nsIID &riid, 
     302Py_nsISupports::PyObjectFromInterface(nsISupports *pis,
     303                                      const nsIID &riid,
    304304                                      PRBool bMakeNicePyObject, /* = PR_TRUE */
    305305                                      PRBool bIsInternalCall /* = PR_FALSE */)
     
    359359// the object to actually pass to Python.
    360360PyObject *
    361 Py_nsISupports::MakeDefaultWrapper(PyObject *pyis, 
     361Py_nsISupports::MakeDefaultWrapper(PyObject *pyis,
    362362                             const nsIID &iid)
    363363{
     
    374374        if (g_obFuncMakeInterfaceCount==NULL) {
    375375                PyObject *mod = PyImport_ImportModule("xpcom.client");
    376                 if (mod) 
     376                if (mod)
    377377                        g_obFuncMakeInterfaceCount = PyObject_GetAttrString(mod, "MakeInterfaceResult");
    378378                Py_XDECREF(mod);
     
    393393        Py_XDECREF(obIID);
    394394        if (ret==NULL) // eek - error - return the original with no refcount mod.
    395                 ret = pyis; 
     395                ret = pyis;
    396396        else
    397397                // no error - decref the old object
     
    442442
    443443
     444#ifdef VBOX
     445static PyObject *
     446QueryErrorObject(PyObject *self, PyObject *args)
     447{
     448        nsresult rc = 0;
     449
     450        if (!PyArg_ParseTuple(args, "i", &rc))
     451                return NULL;
     452
     453        return PyXPCOM_BuildErrorMessage(rc);
     454}
     455#endif
     456
    444457// @object Py_nsISupports|The base object for all PythonCOM objects.  Wraps a COM nsISupports interface.
    445 /*static*/ struct PyMethodDef 
     458/*static*/ struct PyMethodDef
    446459Py_nsISupports::methods[] =
    447460{
    448461        { "queryInterface", Py_nsISupports::QueryInterface, 1, "Queries the object for an interface."},
    449462        { "QueryInterface", Py_nsISupports::QueryInterface, 1, "An alias for queryInterface."},
     463#ifdef VBOX
     464        { "QueryErrorObject", QueryErrorObject, 1, "Query an error object for given status code."},
     465#endif
    450466        {NULL}
    451467};
  • trunk/src/libs/xpcom18a4/python/src/PyXPCOM.h

    r11746 r16903  
    153153PYXPCOM_EXPORT PyObject *PyXPCOM_BuildPyException(nsresult res);
    154154
     155#ifdef VBOX
     156// Build human readable error message out of XPCOM error
     157PYXPCOM_EXPORT PyObject *PyXPCOM_BuildErrorMessage(nsresult r);
     158#endif
     159
    155160// Used in gateways to handle the current Python exception
    156161// NOTE: this function assumes it is operating within the Python context
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