VirtualBox

Changeset 27945 in vbox


Ignore:
Timestamp:
Apr 1, 2010 3:20:08 PM (15 years ago)
Author:
vboxsync
Message:

Guest Control: Update (added dummy IProgress, update to host service).

Location:
trunk/src/VBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp

    r27926 r27945  
    112112                                           execData.szPassword, sizeof(execData.szPassword),
    113113                                           &execData.uTimeLimitMS);
    114     if (RT_SUCCESS(rc))
     114    if (RT_FAILURE(rc))
     115    {
     116        VBoxServiceError("Control: Failed to retrieve execution command! Error: %Rrc\n", rc);
     117    }
     118    else
    115119    {
    116120        /* Adjust time limit value. */
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp

    r27929 r27945  
    3737#include <VBox/log.h>
    3838#include <iprt/asm.h>
     39#include <iprt/getopt.h>
    3940#include <iprt/stream.h>
    4041#include <iprt/string.h>
     
    6263{
    6364    RTPrintf("VBoxManage guestcontrol     execute <vmname>|<uuid>\n"
    64              "                            <path to program> [--arguments <arguments>] [--environment NAME=VALUE]\n"
     65             "                            <path to program> [--arguments \"<arguments>\"] [--environment \"NAME=VALUE NAME=VALUE\"]\n"
    6566             "                            [--flags <flags>] [--username <name> [--password <password>]]\n"
    6667             "                            [--timeout <msec>]\n"
     
    108109                 || !strcmp(a->argv[i], "--env"))
    109110        {
    110             /** @todo Allow more environment blocks be spcecified per "--environment"
    111               *       option, e.g. "--environment "FOO=BAR HOHO=HEHE;QWER=ASDF". */
    112111            if (i + 1 >= a->argc)
    113112                usageOK = false;
    114113            else
    115114            {               
    116                 env.push_back(Bstr(a->argv[i + 1]));
     115                char **papszArg;
     116                int cArgs;
     117
     118                rc = RTGetOptArgvFromString(&papszArg, &cArgs, a->argv[i + 1], NULL);
     119                if (RT_SUCCESS(rc))
     120                {
     121                    for (int a = 0; a < cArgs; a++)                       
     122                        env.push_back(Bstr(papszArg[a]));
     123
     124                    RTGetOptArgvFree(papszArg);
     125                }               
    117126                ++i;
    118127            }
     
    204213            CHECK_ERROR_BREAK(console, COMGETTER(Guest)(guest.asOutParam()));
    205214
     215            ComPtr<IProgress> progress;
    206216            ULONG uPID = 0;
    207217            CHECK_ERROR_BREAK(guest, ExecuteProgram(Bstr(Utf8Cmd), uFlags,
     
    209219                                                    Bstr(Utf8StdIn), Bstr(Utf8StdOut), Bstr(Utf8StdErr),
    210220                                                    Bstr(Utf8UserName), Bstr(Utf8Password), uTimeoutMS,
    211                                                     &uPID));
     221                                                    &uPID, progress.asOutParam()));
     222            /** @todo Show some progress here? */
    212223            a->session->Close();
    213224        } while (0);
  • trunk/src/VBox/HostServices/GuestControl/service.cpp

    r27897 r27945  
    3636#include <iprt/cpp/autores.h>
    3737#include <iprt/cpp/utils.h>
     38#include <iprt/critsect.h>
    3839#include <iprt/err.h>
    3940#include <iprt/mem.h>
     
    7778    /** The execution data to hold (atm only one buffer!) */
    7879    VBOXGUESTCTRPARAMBUFFER mExec;
     80    RTCRITSECT critsect;
    7981
    8082public:
     
    9395                                "GuestCtrlReq");
    9496#endif
     97        mExec.uParmCount = 0;
     98        mExec.pParms = NULL;
     99
     100        if (RT_SUCCESS(rc))
     101            rc = RTCritSectInit(&critsect);
     102
    95103        if (RT_FAILURE(rc))
    96104            throw rc;
     
    204212int Service::execBufferAllocate(PVBOXGUESTCTRPARAMBUFFER pBuf, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
    205213{
     214    RTCritSectEnter(&critsect);
     215
    206216    AssertPtr(pBuf);
    207217    int rc = VINF_SUCCESS;
     
    260270        }
    261271    }
     272    RTCritSectLeave(&critsect);
    262273    return rc;
    263274}
     
    266277void Service::execBufferFree(PVBOXGUESTCTRPARAMBUFFER pBuf)
    267278{
     279    RTCritSectEnter(&critsect);
    268280    AssertPtr(pBuf);
    269281    for (uint32_t i = 0; i < pBuf->uParmCount; i++)
     
    272284        {
    273285            case VBOX_HGCM_SVC_PARM_PTR:
    274                 RTMemFree(pBuf->pParms[i].u.pointer.addr);
     286                if (pBuf->pParms[i].u.pointer.size > 0)
     287                    RTMemFree(pBuf->pParms[i].u.pointer.addr);
    275288                break;
    276289        }
     
    281294        pBuf->uParmCount = 0;
    282295    }
     296    RTCritSectLeave(&critsect);
    283297}
    284298
     
    286300int Service::execBufferAssign(PVBOXGUESTCTRPARAMBUFFER pBuf, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
    287301{
     302    execBufferFree(pBuf);
     303
     304    RTCritSectEnter(&critsect);
     305
    288306    AssertPtr(pBuf);
     307    int rc = VINF_SUCCESS;
    289308    if (cParms != pBuf->uParmCount)
    290         return VERR_INVALID_PARAMETER;
    291     /** @todo Add check to verify if the HGCM request is the same *type* as the buffered one! */
    292 
    293     for (uint32_t i = 0; i < pBuf->uParmCount; i++)
    294     {
    295         paParms[i].type = pBuf->pParms[i].type;
    296         switch (paParms[i].type)
    297         {
    298             case VBOX_HGCM_SVC_PARM_32BIT:
    299                 paParms[i].u.uint32 = pBuf->pParms[i].u.uint32;
    300                 break;
    301 
    302             case VBOX_HGCM_SVC_PARM_64BIT:
    303                 /* Not supported yet. */
    304                 break;
    305 
    306             case VBOX_HGCM_SVC_PARM_PTR:
    307                 paParms[i].u.pointer.size = pBuf->pParms[i].u.pointer.size;
    308                 paParms[i].u.pointer.addr = pBuf->pParms[i].u.pointer.addr;
    309                 break;
    310 
    311             default:                       
    312                 break;
    313         }
    314     }
    315 
    316     return VINF_SUCCESS;
     309    {
     310        rc = VERR_INVALID_PARAMETER;
     311    }
     312    else
     313    {
     314        /** @todo Add check to verify if the HGCM request is the same *type* as the buffered one! */   
     315        for (uint32_t i = 0; i < pBuf->uParmCount; i++)
     316        {
     317            paParms[i].type = pBuf->pParms[i].type;
     318            switch (paParms[i].type)
     319            {
     320                case VBOX_HGCM_SVC_PARM_32BIT:
     321                    paParms[i].u.uint32 = pBuf->pParms[i].u.uint32;
     322                    break;
     323   
     324                case VBOX_HGCM_SVC_PARM_64BIT:
     325                    /* Not supported yet. */
     326                    break;
     327   
     328                case VBOX_HGCM_SVC_PARM_PTR:
     329                    memcpy(paParms[i].u.pointer.addr,
     330                           pBuf->pParms[i].u.pointer.addr,
     331                           pBuf->pParms[i].u.pointer.size);
     332                    break;
     333   
     334                default:                       
     335                    break;
     336            }
     337        }
     338    }
     339    RTCritSectLeave(&critsect);
     340    return rc;
    317341}
    318342
     
    333357    LogFlowFunc(("u32ClientID = %d, fn = %d, cParms = %d, pparms = %d\n",
    334358                 u32ClientID, eFunction, cParms, paParms));
     359
     360    ASMBreakpoint();
     361
    335362    try
    336363    {
  • trunk/src/VBox/Main/GuestImpl.cpp

    r27930 r27945  
    423423                                   IN_BSTR aStdIn, IN_BSTR aStdOut, IN_BSTR aStdErr,
    424424                                   IN_BSTR aUserName, IN_BSTR aPassword,
    425                                    ULONG aTimeoutMS, ULONG *aPID)
     425                                   ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress)
    426426{
    427427#ifndef VBOX_WITH_GUEST_CONTROL
     
    431431
    432432    CheckComArgStrNotEmptyOrNull(aCommand);
     433    CheckComArgOutPointerValid(aProgress);
    433434    CheckComArgOutPointerValid(aPID);
    434435    /* Flags are not supported at the moment. */
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r27911 r27945  
    83538353  <interface
    83548354     name="IGuest" extends="$unknown"
    8355      uuid="66dfe00b-f174-40d8-9d78-4e30d58137ed"
     8355     uuid="a4dac036-f7ed-4634-98d8-44b8672b1779"
    83568356     wsmap="managed"
    83578357     >
     
    85288528        <desc>Foobar</desc>
    85298529      </param>
    8530       <param name="pid" type="unsigned long" dir="return">
     8530      <param name="pid" type="unsigned long" dir="out">
    85318531        <desc>Foobar</desc>
    85328532      </param>
    8533     </method>
     8533      <param name="progress" type="IProgress" dir="return">
     8534        <desc>Progress object to track the operation completion.</desc>
     8535      </param>
     8536      </method>
    85348537
    85358538  </interface>
  • trunk/src/VBox/Main/include/GuestImpl.h

    r27913 r27945  
    8787                              IN_BSTR aStdIn, IN_BSTR aStdOut, IN_BSTR aStdErr,
    8888                              IN_BSTR aUserName, IN_BSTR aPassword,
    89                               ULONG aTimeoutMS, ULONG* aPID);
     89                              ULONG aTimeoutMS, ULONG* aPID, IProgress **aProgress);
    9090    STDMETHOD(InternalGetStatistics)(ULONG aCpuId, ULONG *aCpuUser, ULONG *aCpuKernel, ULONG *aCpuIdle,
    9191                                     ULONG *aMemTotal, ULONG *aMemFree, ULONG *aMemBalloon, ULONG *aMemCache,
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