VirtualBox

Changeset 38437 in vbox


Ignore:
Timestamp:
Aug 12, 2011 3:05:41 PM (13 years ago)
Author:
vboxsync
Message:

GuestCtrl: Update.

Location:
trunk
Files:
12 edited

Legend:

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

    r36527 r38437  
    505505    }
    506506
     507    bool operator<(const RTCString &that) const { return RTCString::operator<(that); }
     508
    507509    RTMEMEF_NEW_AND_DELETE_OPERATORS();
    508510
     
    563565     */
    564566    static const Utf8Str Empty;
    565 
    566567protected:
    567568
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExecThread.cpp

    r38180 r38437  
    373373            {
    374374#ifdef DEBUG_andy
    375                 VBoxServiceVerbose(4, "ControlExec: [PID %u]: Waiting for pipe buffer %u\n",
    376                                    uPID, pPipeBuf->uPipeId);
     375                VBoxServiceVerbose(4, "ControlExec: [PID %u]: Waiting for pipe buffer %u (%ums)\n",
     376                                   uPID, pPipeBuf->uPipeId, uTimeout);
    377377#endif
    378378                rc = VBoxServicePipeBufWaitForEvent(pPipeBuf, uTimeout);
     
    385385                {
    386386                    if (fEnabled && !cbRead)
    387                         AssertMsgFailed(("Waited for pipe buffer %u, but nothing read!\n",
    388                                          pPipeBuf->uPipeId));
     387                        AssertMsgFailed(("[PID %u]: Waited (%ums) for pipe buffer %u (%u bytes left) , but nothing read!\n",
     388                                         uPID, uTimeout, pPipeBuf->uPipeId, pPipeBuf->cbSize - pPipeBuf->cbOffset));
    389389                    if (pcbRead)
    390390                        *pcbRead = cbRead;
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp

    r38113 r38437  
    111111            pBuf->cbOffset += cbToRead;
    112112
     113#ifdef DEBUG_andy
     114            VBoxServiceVerbose(4, "Pipe [%u %u 0x%p %s] read pcbToRead=%u, cbSize=%u, cbAlloc=%u, cbOff=%u\n",
     115                               pBuf->uPID, pBuf->uPipeId, pBuf, pBuf->fEnabled ? "EN" : "DIS", cbToRead, pBuf->cbSize, pBuf->cbAllocated, pBuf->cbOffset);
     116#endif
    113117            if (pBuf->hEventSem != NIL_RTSEMEVENT)
    114118            {
     
    117121            }
    118122
    119 #ifdef DEBUG_andy
    120             VBoxServiceVerbose(4, "Pipe [%u %u 0x%p %s] read pcbToRead=%u, cbSize=%u, cbAlloc=%u, cbOff=%u\n",
    121                                pBuf->uPID, pBuf->uPipeId, pBuf, pBuf->fEnabled ? "EN" : "DIS", cbToRead, pBuf->cbSize, pBuf->cbAllocated, pBuf->cbOffset);
    122 #endif
    123123            *pcbToRead = cbToRead;
    124124        }
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp

    r38403 r38437  
    940940    {
    941941        BOOL fDirExists = FALSE;
    942 #if 0
    943         HRESULT hr = pContext->pGuest->DirectoryExists(Bstr(pszDir).raw(),
    944                                                        Bstr(pContext->pszUsername).raw(),
    945                                                        Bstr(pContext->pszPassword).raw(), &fDirExists);
     942        /** @todo Replace with DirectoryExists as soon as API is in place. */
     943        HRESULT hr = pContext->pGuest->FileExists(Bstr(pszDir).raw(),
     944                                                  Bstr(pContext->pszUsername).raw(),
     945                                                  Bstr(pContext->pszPassword).raw(), &fDirExists);
    946946        if (FAILED(hr))
    947947            rc = ctrlPrintError(pContext->pGuest, COM_IIDOF(IGuest));
    948948        else
    949 #endif
    950949            *fExists = fDirExists ? true : false;
    951950    }
     
    15571556            const char *pszSource = vecSources[s].mSource.c_str();
    15581557            const char *pszFilter = vecSources[s].mFilter.c_str();
     1558            if (!strlen(pszFilter))
     1559                pszFilter = NULL; /* If empty filter then there's no filter :-) */
    15591560
    15601561            char *pszSourceRoot;
     
    15701571
    15711572            /** @todo Files with filter?? */
     1573            bool fIsFile = false;
    15721574            bool fExists;
    1573             vrc = ctrlCopyFileExistsOnSource(pContext, pszSource, &fExists);
     1575            Utf8Str Utf8CurSource(pszSource);
     1576            if (   Utf8CurSource.endsWith("/")
     1577                || Utf8CurSource.endsWith("\\"))
     1578            {
     1579                if (pszFilter) /* Directory with filter. */
     1580                    vrc = ctrlCopyDirExistsOnSource(pContext, pszSourceRoot, &fExists);
     1581                else /* Regular directory without filter. */
     1582                    vrc = ctrlCopyDirExistsOnSource(pContext, pszSource, &fExists);
     1583            }
     1584            else
     1585            {
     1586                vrc = ctrlCopyFileExistsOnSource(pContext, pszSource, &fExists);
     1587                if (   RT_SUCCESS(vrc)
     1588                    && fExists)
     1589                    fIsFile = true;
     1590            }
     1591
    15741592            if (RT_SUCCESS(vrc))
    15751593            {
    1576                 if (fExists)
     1594                if (fIsFile)
    15771595                {
    15781596                    /* Single file. */
     
    15941612                else
    15951613                {
    1596                     if (!pContext->fHostToGuest)
    1597                     {
    1598                         RTMsgError("Copying of guest directories to the host is not supported yet!\n");
    1599                         vrc = VERR_NOT_IMPLEMENTED;
    1600                     }
    1601                     else
    1602                     {
    1603                         if (   (RT_SUCCESS(ctrlCopyDirExistsOnSource(pContext, pszSource, &fExists))
    1604                                 && fExists)
    1605                             || (   RT_SUCCESS(ctrlCopyDirExistsOnSource(pContext, pszSourceRoot, &fExists))
    1606                                 && fExists
    1607                                 && pszFilter)
    1608                            )
    1609                         {
    1610                             /* Directory (with filter?). */
    1611                             vrc = ctrlCopyDirToTarget(pContext, pszSource, pszFilter,
    1612                                                       Utf8Dest.c_str(), fFlags, NULL /* Subdir */);
    1613                         }
    1614                     }
     1614                    /* Directory (with filter?). */
     1615                    vrc = ctrlCopyDirToTarget(pContext, pszSource, pszFilter,
     1616                                              Utf8Dest.c_str(), fFlags, NULL /* Subdir */);
    16151617                }
    16161618            }
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r38400 r38437  
    90619061        Reads the next directory entry of an opened guest directory.
    90629062
     9063        <result name="E_ABORT">
     9064          When the end of the directory has been reached.
     9065        </result>
     9066
    90639067        <result name="VBOX_E_IPRT_ERROR">
    90649068          Error while opening / reading directory.
     
    90819085      <desc>
    90829086        Checks if the specified file name exists and is a regular file.
     9087
     9088        If the file name ends with a slash or backslash, the function assumes
     9089        it's a directory and will check if the specified directory exists and
     9090        is a regular directory.
    90839091
    90849092        <result name="VBOX_E_IPRT_ERROR">
  • trunk/src/VBox/Main/include/GuestCtrlImplPrivate.h

    r38395 r38437  
    3737
    3838/** Structure representing the "value" side of a "key=value" pair. */
    39 typedef struct VBOXGUESTCTRL_STREAMPAIR
     39class VBOXGUESTCTRL_STREAMVALUE
    4040{
    41     VBOXGUESTCTRL_STREAMPAIR(const char *pszValue)
     41public:
     42
     43    VBOXGUESTCTRL_STREAMVALUE() { }
     44    VBOXGUESTCTRL_STREAMVALUE(const char *pszValue)
    4245        : mValue(pszValue) {}
    4346
     47    VBOXGUESTCTRL_STREAMVALUE(const VBOXGUESTCTRL_STREAMVALUE& aThat)
     48           : mValue(aThat.mValue) {}
     49
    4450    Utf8Str mValue;
    45 } VBOXGUESTCTRL_STREAMPAIR, *PVBOXGUESTCTRL_STREAM_PAIR;
     51};
    4652
    4753/** Map containing "key=value" pairs of a guest process stream. */
    48 typedef std::map< Utf8Str, VBOXGUESTCTRL_STREAMPAIR > GuestCtrlStreamPairs;
    49 typedef std::map< Utf8Str, VBOXGUESTCTRL_STREAMPAIR >::iterator GuestCtrlStreamPairsIter;
    50 typedef std::map< Utf8Str, VBOXGUESTCTRL_STREAMPAIR >::const_iterator GuestCtrlStreamPairsIterConst;
     54typedef std::pair< Utf8Str, VBOXGUESTCTRL_STREAMVALUE > GuestCtrlStreamPair;
     55typedef std::map < Utf8Str, VBOXGUESTCTRL_STREAMVALUE > GuestCtrlStreamPairMap;
     56typedef std::map < Utf8Str, VBOXGUESTCTRL_STREAMVALUE >::iterator GuestCtrlStreamPairMapIter;
     57typedef std::map < Utf8Str, VBOXGUESTCTRL_STREAMVALUE >::const_iterator GuestCtrlStreamPairMapIterConst;
    5158
    5259/**
     
    8592protected:
    8693
    87     GuestCtrlStreamPairs m_mapPairs;
     94    GuestCtrlStreamPairMap m_mapPairs;
    8895};
    8996
    9097/** Vector containing multiple allocated stream pair objects. */
    91 typedef std::vector< GuestProcessStreamBlock* > GuestCtrlStreamObjects;
    92 typedef std::vector< GuestProcessStreamBlock* >::iterator GuestCtrlStreamObjectsIter;
    93 typedef std::vector< GuestProcessStreamBlock* >::const_iterator GuestCtrlStreamObjectsIterConst;
     98typedef std::vector< GuestProcessStreamBlock > GuestCtrlStreamObjects;
     99typedef std::vector< GuestProcessStreamBlock >::iterator GuestCtrlStreamObjectsIter;
     100typedef std::vector< GuestProcessStreamBlock >::const_iterator GuestCtrlStreamObjectsIterConst;
    94101
    95102/**
     
    132139};
    133140
    134 struct GuestTask
     141class GuestTask
    135142{
     143
     144public:
     145
    136146    enum TaskType
    137147    {
  • trunk/src/VBox/Main/include/GuestImpl.h

    r38400 r38437  
    159159                                   ULONG aTimeoutMS, ULONG *aPID, IProgress **aProgress, int *pRC);
    160160    HRESULT executeProcessResult(const char *pszCommand, const char *pszUser, ULONG ulTimeout, PCALLBACKDATAEXECSTATUS pExecStatus, ULONG *puPID);
    161     HRESULT executeStreamQueryFsObjInfo(IN_BSTR aObjName,GuestProcessStreamBlock *pStreamBlock, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttribs);
     161    HRESULT executeStreamQueryFsObjInfo(IN_BSTR aObjName,GuestProcessStreamBlock &streamBlock, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttribs);
    162162    int     executeStreamDrain(ULONG aPID, GuestProcessStream &stream);
    163163    void    executeStreamFree(GuestCtrlStreamObjects &streamObjects);
  • trunk/src/VBox/Main/src-client/GuestCtrlIO.cpp

    r38395 r38437  
    121121    try
    122122    {
    123         GuestCtrlStreamPairsIterConst itPairs = m_mapPairs.find(Utf8Str(pszKey));
     123        GuestCtrlStreamPairMapIterConst itPairs = m_mapPairs.find(Utf8Str(pszKey));
    124124        if (itPairs != m_mapPairs.end())
    125125            return itPairs->second.mValue.c_str();
     
    186186        if (!m_mapPairs.empty())
    187187        {
    188             GuestCtrlStreamPairsIter it = m_mapPairs.find(Utf8Key);
     188            GuestCtrlStreamPairMapIter it = m_mapPairs.find(Utf8Key);
    189189            if (it != m_mapPairs.end())
    190190                 m_mapPairs.erase(it);
     
    193193        if (pszValue)
    194194        {
    195             m_mapPairs.insert(
    196                 std::pair<Utf8Str, VBOXGUESTCTRL_STREAMPAIR>(Utf8Key, VBOXGUESTCTRL_STREAMPAIR(pszValue)));
     195            VBOXGUESTCTRL_STREAMVALUE val(pszValue);
     196            m_mapPairs[Utf8Key] = val;
    197197        }
    198198    }
  • trunk/src/VBox/Main/src-client/GuestCtrlImpl.cpp

    r38399 r38437  
    12471247 */
    12481248HRESULT Guest::executeStreamQueryFsObjInfo(IN_BSTR aObjName,
    1249                                            GuestProcessStreamBlock *pStreamBlock,
     1249                                           GuestProcessStreamBlock &streamBlock,
    12501250                                           PRTFSOBJINFO pObjInfo,
    12511251                                           RTFSOBJATTRADD enmAddAttribs)
    12521252{
    1253     AssertPtrReturn(pStreamBlock, E_INVALIDARG);
    1254 
    12551253    HRESULT rc = S_OK;
    12561254    Utf8Str Utf8ObjName(aObjName);
    12571255
    12581256    int64_t iVal;
    1259     int vrc = pStreamBlock->GetInt64Ex("st_size", &iVal);
     1257    int vrc = streamBlock.GetInt64Ex("st_size", &iVal);
    12601258    if (RT_SUCCESS(vrc))
    12611259        pObjInfo->cbObject = iVal;
     
    13101308void Guest::executeStreamFree(GuestCtrlStreamObjects &streamObjects)
    13111309{
    1312     for (GuestCtrlStreamObjectsIter it = streamObjects.begin();
     1310    /*for (GuestCtrlStreamObjectsIter it = streamObjects.begin();
    13131311         it != streamObjects.end(); it++)
    13141312    {
    13151313        executeStreamFreeBlock(*it);
    1316     }
     1314    }*/
    13171315    streamObjects.clear();
    13181316}
     
    13451343    int rc = executeStreamDrain(aPID, stream);
    13461344    if (RT_SUCCESS(rc))
    1347         rc = stream.ParseBlock(streamBlock);
     1345    {
     1346        do
     1347        {
     1348            rc = stream.ParseBlock(streamBlock);
     1349            if (streamBlock.GetCount())
     1350                break; /* We got a block, bail out! */
     1351        } while (RT_SUCCESS(rc));
     1352
     1353        /* In case this was the last block, VERR_NO_DATA is returned.
     1354         * Overwrite this to get a proper return value for the last block. */
     1355        if(    streamBlock.GetCount()
     1356            && rc == VERR_NO_DATA)
     1357        {
     1358            rc = VINF_SUCCESS;
     1359        }
     1360    }
    13481361
    13491362    return rc;
     
    13701383            /* Try to parse the stream output we gathered until now. If we still need more
    13711384             * data the parsing routine will tell us and we just do another poll round. */
    1372             GuestProcessStreamBlock *pCurBlock = (GuestProcessStreamBlock*)
    1373                                             RTMemAlloc(sizeof(GuestProcessStreamBlock));
    1374             if (!pCurBlock)
    1375             {
    1376                 hr = setError(VBOX_E_IPRT_ERROR,
    1377                               tr("No memory for allocating stream block"));
    1378                 break;
    1379             }
    1380             int vrc = guestStream.ParseBlock(*pCurBlock);
     1385            GuestProcessStreamBlock curBlock;
     1386            int vrc = guestStream.ParseBlock(curBlock);
    13811387            if (RT_SUCCESS(vrc))
    13821388            {
    1383                 if (pCurBlock->GetCount())
     1389                if (curBlock.GetCount())
    13841390                {
    1385                     streamObjects.push_back(pCurBlock);
     1391                    streamObjects.push_back(curBlock);
    13861392                }
    13871393                else
    1388                 {
    1389                     GuestProcessStream::FreeBlock(pCurBlock);
    13901394                    break; /* No more data. */
    1391                 }
    13921395            }
    13931396            else /* Everything else would be an error! */
  • trunk/src/VBox/Main/src-client/GuestCtrlImplDir.cpp

    r38400 r38437  
    233233    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    234234
    235     RTFSOBJINFO objInfo;
    236235    int rc;
    237236    HRESULT hr = directoryQueryInfoInternal(aDirectory,
    238237                                            aUsername, aPassword,
    239                                             &objInfo, RTFSOBJATTRADD_NOTHING, &rc);
     238                                            NULL /* No RTFSOBJINFO needed */,
     239                                            RTFSOBJATTRADD_NOTHING, &rc);
    240240    if (SUCCEEDED(hr))
    241241    {
     
    283283/**
    284284 * Returns the next directory entry of an open guest directory.
    285  * Returns VERR_NO_MORE_FILES if no more entries available.
     285 * Returns VERR_NO_DATA if no more entries available or VERR_NOT_FOUND
     286 * if directory handle is invalid.
    286287 *
    287288 * @return  IPRT status code.
     
    486487                int rc = VINF_SUCCESS;
    487488
    488                 GuestProcessStreamBlock *pBlock = streamObjs[0];
    489                 AssertPtr(pBlock);
    490                 const char *pszFsType = pBlock->GetString("ftype");
     489                Assert(streamObjs.size());
     490                const char *pszFsType = streamObjs[0].GetString("ftype");
    491491                if (!pszFsType) /* Attribute missing? */
    492492                     rc = VERR_NOT_FOUND;
     
    495495                {
    496496                     rc = VERR_FILE_NOT_FOUND;
     497                     /* This is not critical for Main, so don't set hr --
     498                      * we will take care of rc then. */
    497499                }
    498500                if (   RT_SUCCESS(rc)
    499501                    && aObjInfo) /* Do we want object details? */
    500502                {
    501                     hr = executeStreamQueryFsObjInfo(aDirectory, pBlock,
     503                    hr = executeStreamQueryFsObjInfo(aDirectory, streamObjs[0],
    502504                                                     aObjInfo, enmAddAttribs);
    503505                }
     
    541543            ComAssertComRC(hr);
    542544
     545            Assert(streamBlock.GetCount());
    543546            hr = pDirEntry->init(this, streamBlock);
    544547            if (SUCCEEDED(hr))
     
    548551            else
    549552                hr = setError(VBOX_E_IPRT_ERROR,
    550                               Guest::tr("Unable to init guest directory entry"));
    551         }
    552         else if (rc == VERR_NO_MORE_FILES)
    553         {
    554             /* No more directory entries to read. */
     553                              Guest::tr("Failed to init guest directory entry"));
     554        }
     555        else if (rc == VERR_NO_DATA)
     556        {
     557            /* No more directory entries to read. That's fine. */
    555558            hr = E_ABORT; /** @todo Find/define a better rc! */
    556559        }
  • trunk/src/VBox/Main/src-client/GuestCtrlImplFile.cpp

    r38395 r38437  
    4646        return setError(E_INVALIDARG, tr("No user name specified"));
    4747
     48    /* If filename ends with a slash or backslash we assume it's a directory and
     49     * call the appropriate function instead the regular one just for files. */
     50    Utf8Str Utf8File(aFile);
     51    if (   Utf8File.endsWith("/")
     52        || Utf8File.endsWith("\\"))
     53    {
     54        return directoryExistsInternal(aFile, aUsername, aPassword, aExists);
     55    }
    4856    return fileExistsInternal(aFile,
    4957                              aUsername, aPassword, aExists);
     
    6169    if (FAILED(autoCaller.rc())) return autoCaller.rc();
    6270
    63     RTFSOBJINFO objInfo;
    6471    int rc;
    6572    HRESULT hr = fileQueryInfoInternal(aFile,
    6673                                       aUsername, aPassword,
    67                                        &objInfo, RTFSOBJATTRADD_NOTHING, &rc);
     74                                       NULL /* No RTFSOBJINFO needed */,
     75                                       RTFSOBJATTRADD_NOTHING, &rc);
    6876    if (SUCCEEDED(hr))
    6977    {
     
    139147            {
    140148                int rc = VINF_SUCCESS;
    141 
    142                 GuestProcessStreamBlock *pBlock = streamObjs[0];
    143                 AssertPtr(pBlock);
    144                 const char *pszFsType = pBlock->GetString("ftype");
     149                const char *pszFsType = streamObjs[0].GetString("ftype");
    145150                if (!pszFsType) /* Attribute missing? */
    146151                     rc = VERR_NOT_FOUND;
     
    149154                {
    150155                     rc = VERR_FILE_NOT_FOUND;
     156                     /* This is not critical for Main, so don't set hr --
     157                      * we will take care of rc then. */
    151158                }
    152159                if (   RT_SUCCESS(rc)
    153160                    && aObjInfo) /* Do we want object details? */
    154161                {
    155                     hr = executeStreamQueryFsObjInfo(aFile, pBlock,
     162                    hr = executeStreamQueryFsObjInfo(aFile, streamObjs[0],
    156163                                                     aObjInfo, enmAddAttribs);
    157164                }
  • trunk/src/VBox/Main/testcase/tstGuestCtrlParseBuffer.cpp

    r38395 r38437  
    9090    /* Good stuff, but with a second block -- should be *not* taken into account since
    9191     * we're only interested in parsing/handling the first object. */
    92     { "t9=t9\0t91=t91\0\0t92=t92\0\0",  sizeof("t9=t9\0t91=t91\0\0t92=t92\0\0"),           0,  sizeof("t9=t9\0t91=t91\0") - 1,            2, VINF_SUCCESS }
     92    { "t9=t9\0t91=t91\0\0t92=t92\0\0",  sizeof("t9=t9\0t91=t91\0\0t92=t92\0\0"),           0,  sizeof("t9=t9\0t91=t91\0") - 1,            2, VINF_SUCCESS },
     93    /* Some "real world" examples. */
     94    { "hdr_id=vbt_stat\0hdr_ver=1\0name=foo.txt\0\0",
     95                                        sizeof("hdr_id=vbt_stat\0hdr_ver=1\0name=foo.txt\0\0"),
     96                                                                                           0,  sizeof("hdr_id=vbt_stat\0hdr_ver=1\0name=foo.txt\0\0") - 1,
     97                                                                                                                                          3, VINF_SUCCESS }
    9398};
    9499
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