VirtualBox

Changeset 100282 in vbox


Ignore:
Timestamp:
Jun 25, 2023 2:52:31 PM (17 months ago)
Author:
vboxsync
Message:

FE/Qt: bugref:9080. Double click on ISO folder now results in scanning and listing it.

Location:
trunk/src/VBox/Frontends/VirtualBox/src/medium/viso
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoContentBrowser.cpp

    r100281 r100282  
    4747#include <iprt/file.h>
    4848#include <iprt/fsvfs.h>
     49#include <iprt/mem.h>
     50#include <iprt/err.h>
    4951
    5052struct ISOFileObject
     
    5456};
    5557
    56 static QList<ISOFileObject> readISODir(const QString &strISOFilePath)
    57 {
    58     // QList<KFsObjType> fileObjectTypeList;
    59     // QStringList pathList;
     58
     59static void readISODir(RTVFSDIR &hVfsDir, QList<ISOFileObject> &fileObjectList)
     60{
     61    size_t cbDirEntry = sizeof(RTDIRENTRYEX);
     62    PRTDIRENTRYEX pDirEntry = (PRTDIRENTRYEX)RTMemTmpAlloc(cbDirEntry);
     63    size_t cbDirEntryAlloced = cbDirEntry;
     64    for(;;)
     65    {
     66        if (pDirEntry)
     67        {
     68            int vrc = RTVfsDirReadEx(hVfsDir, pDirEntry, &cbDirEntry, RTFSOBJATTRADD_UNIX);
     69            if (RT_FAILURE(vrc))
     70            {
     71                if (vrc == VERR_BUFFER_OVERFLOW)
     72                {
     73                    RTMemTmpFree(pDirEntry);
     74                    cbDirEntryAlloced = RT_ALIGN_Z(RT_MIN(cbDirEntry, cbDirEntryAlloced) + 64, 64);
     75                    pDirEntry  = (PRTDIRENTRYEX)RTMemTmpAlloc(cbDirEntryAlloced);
     76                    if (pDirEntry)
     77                        continue;
     78                    /// @todo log error
     79                    //rcExit = RTMsgErrorExitFailure("Out of memory (direntry buffer)");
     80                }
     81                /// @todo log error
     82                // else if (rc != VERR_NO_MORE_FILES)
     83                //     rcExit = RTMsgErrorExitFailure("RTVfsDirReadEx failed: %Rrc\n", rc);
     84                break;
     85            }
     86            else
     87            {
     88                ISOFileObject fileObject;
     89
     90                if (RTFS_IS_DIRECTORY(pDirEntry->Info.Attr.fMode))
     91                    fileObject.enmObjectType =  KFsObjType_Directory;
     92                else
     93                    fileObject.enmObjectType = KFsObjType_File;
     94                fileObject.strName = pDirEntry->szName;
     95                fileObjectList << fileObject;
     96            }
     97        }
     98    }
     99    RTMemTmpFree(pDirEntry);
     100}
     101
     102static QList<ISOFileObject> openAndReadISODir(const QString &strISOFilePath, QString strDirPath = QString())
     103{
    60104    QList<ISOFileObject> fileObjectList;
    61 
    62105
    63106    RTVFSFILE hVfsFileIso;
     
    74117            if (RT_SUCCESS(vrc))
    75118            {
    76                 size_t cbDirEntry = sizeof(RTDIRENTRYEX);
    77                 PRTDIRENTRYEX pDirEntry = (PRTDIRENTRYEX)RTMemTmpAlloc(cbDirEntry);
    78                 size_t cbDirEntryAlloced = cbDirEntry;
    79                 for(;;)
     119                if (strDirPath.isEmpty())
     120                    readISODir(hVfsSrcRootDir, fileObjectList);
     121                else
    80122                {
    81                     if (pDirEntry)
     123                    RTVFSDIR hVfsDir;
     124                    vrc = RTVfsDirOpenDir(hVfsSrcRootDir, strDirPath.toUtf8().constData(), 0 /* fFlags */, &hVfsDir);
     125                    if (RT_SUCCESS(vrc))
    82126                    {
    83                         vrc = RTVfsDirReadEx(hVfsSrcRootDir, pDirEntry, &cbDirEntry, RTFSOBJATTRADD_UNIX);
    84                         if (RT_FAILURE(vrc))
    85                         {
    86                             if (vrc == VERR_BUFFER_OVERFLOW)
    87                             {
    88                                 RTMemTmpFree(pDirEntry);
    89                                 cbDirEntryAlloced = RT_ALIGN_Z(RT_MIN(cbDirEntry, cbDirEntryAlloced) + 64, 64);
    90                                 pDirEntry  = (PRTDIRENTRYEX)RTMemTmpAlloc(cbDirEntryAlloced);
    91                                 if (pDirEntry)
    92                                     continue;
    93                                 /// @todo log error
    94                                 //rcExit = RTMsgErrorExitFailure("Out of memory (direntry buffer)");
    95                             }
    96                             /// @todo log error
    97                             // else if (rc != VERR_NO_MORE_FILES)
    98                             //     rcExit = RTMsgErrorExitFailure("RTVfsDirReadEx failed: %Rrc\n", rc);
    99                             break;
    100                         }
    101                         else
    102                         {
    103                             ISOFileObject fileObject;
    104 
    105                             if (RTFS_IS_DIRECTORY(pDirEntry->Info.Attr.fMode))
    106                                 fileObject.enmObjectType =  KFsObjType_Directory;
    107                             else
    108                                 fileObject.enmObjectType = KFsObjType_File;
    109                             fileObject.strName = pDirEntry->szName;
    110                             fileObjectList << fileObject;
    111                         }
     127                        readISODir(hVfsDir, fileObjectList);
     128                        RTVfsDirRelease(hVfsDir);
    112129                    }
    113130                }
    114                 RTMemTmpFree(pDirEntry);
     131
     132                RTVfsDirRelease(hVfsSrcRootDir);
    115133            }
    116134            RTVfsRelease(hVfsIso);
     
    119137    }
    120138    return fileObjectList;
    121     // if (!pathList.isEmpty() && pathList.size() == fileObjectTypeList.size() && m_pVISOContentBrowser)
    122     //     m_pVISOContentBrowser->importISOContentToViso(selectedObjectPaths[iIndex], pathList, fileObjectTypeList);
    123139}
    124140
     
    289305}
    290306
    291 void UIVisoContentBrowser::importISOContentToViso(const QString &strISOFilePath)
    292 {
    293     UICustomFileSystemItem *pParentItem = rootItem()->children()[0];
     307void UIVisoContentBrowser::importISOContentToViso(const QString &strISOFilePath,
     308                                                  UICustomFileSystemItem *pParentItem /* = 0 */,
     309                                                  const QString &strDirPath /* = QString() */)
     310{
     311    if (!pParentItem)
     312        pParentItem = rootItem()->children()[0];
    294313    if (!m_pTableView || !pParentItem)
    295314        return;
    296     QList<ISOFileObject> objectList = readISODir(strISOFilePath);
     315
     316    /* If this is not the root directory add an "up" file object explicity since RTVfsDirReadEx does not return one:*/
     317    if (!strDirPath.isEmpty())
     318    {
     319        UICustomFileSystemItem* pAddedItem = new UICustomFileSystemItem(UICustomFileSystemModel::strUpDirectoryString,
     320                                                                        pParentItem,
     321                                                                        KFsObjType_Directory);
     322        pAddedItem->setData(strISOFilePath, UICustomFileSystemModelData_ISOFilePath);
     323    }
     324    QList<ISOFileObject> objectList = openAndReadISODir(strISOFilePath, strDirPath);
    297325
    298326    for (int i = 0; i < objectList.size(); ++i)
     
    307335        UICustomFileSystemItem* pAddedItem = new UICustomFileSystemItem(fileInfo.fileName(), pParentItem,
    308336                                                                        objectList[i].enmObjectType);
    309         pAddedItem->setData(objectList[i].strName, UICustomFileSystemModelData_LocalPath);
     337        /* VISOPAth and LocalPath is the same since we allow importing ISO content only to VISO root:*/
     338        QString path = UIPathOperations::mergePaths(pParentItem->path(), fileInfo.fileName());
     339        pAddedItem->setData(path, UICustomFileSystemModelData_LocalPath);
    310340        pAddedItem->setData(strISOFilePath, UICustomFileSystemModelData_ISOFilePath);
    311         pAddedItem->setData(UIPathOperations::mergePaths(pParentItem->path(), fileInfo.fileName()),
    312                            UICustomFileSystemModelData_VISOPath);
     341        pAddedItem->setData(path, UICustomFileSystemModelData_VISOPath);
    313342        pAddedItem->setIsOpened(false);
    314343        // if (fileInfo.isSymLink())
     
    421450    UICustomFileSystemItem *pClickedItem =
    422451        static_cast<UICustomFileSystemItem*>(m_pTableProxyModel->mapToSource(index).internalPointer());
     452    if (!pClickedItem)
     453        return;
     454    QString strISOPath = pClickedItem->data(UICustomFileSystemModelData_ISOFilePath).toString();
    423455    if (pClickedItem->isUpDirectory())
    424456    {
     
    430462            setTreeCurrentIndex(currentRoot.parent());
    431463        }
     464    }
     465    else if (!strISOPath.isEmpty())
     466    {
     467        importISOContentToViso(strISOPath, pClickedItem, pClickedItem->data(UICustomFileSystemModelData_LocalPath).toString());
     468        setTableRootIndex(index);
     469        setTreeCurrentIndex(index);
    432470    }
    433471    else
     
    804842            UICustomFileSystemItem *newItem = new UICustomFileSystemItem(fileInfo.fileName(),
    805843                                                                         directoryItem,
    806                                                                        fileType(fileInfo));
     844                                                                         fileType(fileInfo));
    807845            newItem->setData(fileInfo.filePath(), UICustomFileSystemModelData_LocalPath);
    808846
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoContentBrowser.h

    r100281 r100282  
    6363    ~UIVisoContentBrowser();
    6464    /* Imports pathList (relative to ISO file's root) to VISO content. */
    65     void importISOContentToViso(const QString &strISOFilePath);
     65    void importISOContentToViso(const QString &strISOFilePath,
     66                                UICustomFileSystemItem *pParentItem = 0,
     67                                const QString &strDirPath = QString());
    6668    /** Adds file objests from the host file system. @p pathList consists of list of paths to there objects. */
    6769    void addObjectsToViso(const QStringList &pathList);
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