VirtualBox

Changeset 100583 in vbox for trunk


Ignore:
Timestamp:
Jul 14, 2023 2:13:03 PM (15 months ago)
Author:
vboxsync
Message:

FE/Qt: bugref:9080. Make host directory scan optionally recursive.

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

Legend:

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

    r100556 r100583  
    5454
    5555const ULONG uAllowedFileSize = _4K;
     56const char *cRemoveText = ":remove:";
    5657
    5758struct ISOFileObject
     
    395396    }
    396397    else
    397         m_entryMap.insert(strPath, ":remove:");
     398        m_entryMap.insert(strPath, cRemoveText);
    398399}
    399400
     
    437438    if (!pClickedItem)
    438439        return;
    439     if (!pClickedItem->isDirectory())
     440    if (!pClickedItem->isDirectory() && !pClickedItem->isSymLinkToADirectory())
    440441        return;
    441442    /* Don't navigate into removed directories: */
     
    452453    else
    453454    {
    454         scanHostDirectory(pClickedItem);
     455        scanHostDirectory(pClickedItem, false /* not recursive */);
    455456        setTableRootIndex(index);
    456457    }
     
    661662}
    662663
     664bool UIVisoContentBrowser::hasContent() const
     665{
     666    if (m_strImportedISOPath.isEmpty() && m_entryMap.isEmpty())
     667        return false;
     668    return true;
     669}
     670
    663671void UIVisoContentBrowser::prepareConnections()
    664672{
     
    811819#endif
    812820    QMap<QString, QString> fileEntries;
     821    QStringList removedEntries;
    813822    foreach (const QString &strPart, list)
    814823    {
     
    835844                if (QFileInfo(fileEntry[1]).exists())
    836845                    fileEntries[fileEntry[0]] = fileEntry[1];
     846                else if (fileEntry[1] == cRemoveText)
     847                    removedEntries.append(fileEntry[0]);
    837848            }
    838849        }
     
    840851    file.close();
    841852    createLoadedFileEntries(fileEntries);
     853    processRemovedEntries(removedEntries);
    842854}
    843855
     
    863875            UICustomFileSystemItem *pItem = searchItemByPath(strPath);
    864876            KFsObjType enmObjectType;
    865             /* All objects except possibly the last one are directories:*/
     877            /* All objects, except possibly the last one, are directories:*/
    866878            if (i == pathList.size() - 1)
    867879                enmObjectType = fileType(localFileObjectInfo);
     
    876888                if (i == pathList.size() - 1)
    877889                    pItem->setData(strLocalPath, UICustomFileSystemModelData_LocalPath);
     890                /* Pre-scan and populate the directory since we may need its content while processing removed items: */
     891                if (enmObjectType == KFsObjType_Directory)
     892                    scanHostDirectory(pItem, true  /* recursive */);
    878893            }
    879894            if (i == pathList.size() - 1)
     
    888903}
    889904
     905void UIVisoContentBrowser::processRemovedEntries(const QStringList &removedEntries)
     906{
     907    foreach (const QString &strPath, removedEntries)
     908    {
     909        QStringList path = UIPathOperations::pathTrail(strPath);
     910    }
     911}
     912
    890913QModelIndex UIVisoContentBrowser::convertIndexToTableIndex(const QModelIndex &index)
    891914{
     
    900923}
    901924
    902 void UIVisoContentBrowser::scanHostDirectory(UICustomFileSystemItem *directoryItem)
     925void UIVisoContentBrowser::scanHostDirectory(UICustomFileSystemItem *directoryItem, bool fRecursive)
    903926{
    904927    if (!directoryItem)
     
    906929    /* the clicked item can be a directory created with the VISO content. in that case local path data
    907930       should be empty: */
    908     if (directoryItem->type() != KFsObjType_Directory ||
     931    if ((directoryItem->type() != KFsObjType_Directory && !directoryItem->isSymLinkToADirectory()) ||
    909932        directoryItem->data(UICustomFileSystemModelData_LocalPath).toString().isEmpty())
    910933        return;
     
    913936    {
    914937        QFileInfoList directoryContent = directory.entryInfoList();
     938
    915939        for (int i = 0; i < directoryContent.size(); ++i)
    916940        {
     
    918942            if (fileInfo.fileName() == ".")
    919943                continue;
     944            KFsObjType enmType = fileType(fileInfo);
    920945            UICustomFileSystemItem *newItem = new UICustomFileSystemItem(fileInfo.fileName(),
    921946                                                                         directoryItem,
    922                                                                          fileType(fileInfo));
     947                                                                         enmType);
    923948            newItem->setData(fileInfo.filePath(), UICustomFileSystemModelData_LocalPath);
    924 
    925949            if (fileInfo.isSymLink())
    926950            {
     
    928952                newItem->setIsSymLinkToADirectory(QFileInfo(fileInfo.symLinkTarget()).isDir());
    929953            }
     954            /* Do not recurse into sysmlinks since it may end up infinite recursion: */
     955            if (fRecursive && enmType == KFsObjType_Directory && !newItem->isUpDirectory())
     956                scanHostDirectory(newItem, true);
     957
    930958        }
    931959        directoryItem->setIsOpened(true);
     
    10041032        m_entryMap.remove(strOldPath);
    10051033        if (!pItem->data(UICustomFileSystemModelData_LocalPath).toString().isEmpty())
    1006             m_entryMap.insert(strOldPath, ":remove:");
     1034            m_entryMap.insert(strOldPath, cRemoveText);
    10071035    }
    10081036
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoContentBrowser.h

    r100548 r100583  
    8080    void setImportedISOPath(const QString &strPath = QString());
    8181
     82    bool hasContent() const;
     83
    8284public slots:
    8385
     
    119121    QModelIndex             convertIndexToTableIndex(const QModelIndex &index);
    120122    /** Lists the content of the host file system directory by using Qt file system API. */
    121     void                    scanHostDirectory(UICustomFileSystemItem *directory);
     123    void                    scanHostDirectory(UICustomFileSystemItem *directory, bool fRecursive);
    122124    KFsObjType              fileType(const QFileInfo &fsInfo);
    123125    /** Renames the starts item's name as VISO name changes. */
     
    141143    void                           goUp();
    142144    void                           createLoadedFileEntries(const QMap<QString, QString> &fileEntries);
     145    /* Processes a list of VISO paths that are loaded from a file and indicate file object to be removed from VISO content. */
     146    void                           processRemovedEntries(const QStringList &removedEntries);
    143147    const UICustomFileSystemItem*  currentDirectoryItem() const;
    144148    UIVisoContentTableView        *m_pTableView;
  • trunk/src/VBox/Frontends/VirtualBox/src/medium/viso/UIVisoCreator.cpp

    r100515 r100583  
    423423    QWidget *pActive =  QApplication::activeWindow();
    424424    AssertReturnVoid(pActive);
    425 
    426     if (!msgCenter().confirmVisoDiscard(pActive))
    427         return;
     425    if (m_pVISOContentBrowser->hasContent())
     426        if (!msgCenter().confirmVisoDiscard(pActive))
     427            return;
    428428    QString strFileName =  QIFileDialog::getOpenFileName(uiCommon().defaultFolderPathForType(UIMediumDeviceType_DVD),
    429429                                                         "VISO files (*.viso)", pActive, UIVisoCreatorWidget::tr("Select a VISO file to load"));
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