示例#1
0
QModelIndex InventoryItemModel::parent(const QModelIndex &index) const
{
    if (!index.isValid())
        return QModelIndex();

    AbstractInventoryItem *childItem = GetItem(index);
    assert(childItem);
    InventoryFolder *parentItem = static_cast<InventoryFolder *>(childItem->GetParent());
    if (parentItem == static_cast<InventoryFolder *>(dataModel_->GetRoot()))
        return QModelIndex();

    return createIndex(parentItem->Row(), 0, reinterpret_cast<void *>(static_cast<AbstractInventoryItem*>(parentItem)));

/*
    if (!index.isValid())
        return QModelIndex();

    TreeItem *childItem = getItem(index);
    TreeItem *parentItem = childItem->parent();

    if (parentItem == rootItem)
        return QModelIndex();

    return createIndex(parentItem->childNumber(), 0, parentItem);
*/
}
void WebDavInventoryDataModel::UploadFile(const QString &file_path, AbstractInventoryItem *parent_folder)
{
    if (!parent_folder)
        parent_folder = GetFirstChildFolderByName("My Inventory");

    InventoryFolder *parentFolder = dynamic_cast<InventoryFolder *>(parent_folder);
    if (!parentFolder)
        return;

    QString filePath = file_path;
    QString filename = filePath.split("/").last();
    QString parentPath = ValidateFolderPath(parentFolder->GetID());
    QStringList result = webdavclient_.call("uploadFile", QVariantList() << filePath << parentPath << filename).toStringList();

    if (result.count() >= 1)
    {
        if (result[0] == "True")
        {
            FetchInventoryDescendents(parent_folder);
            InventoryModule::LogInfo(QString("Webdav | Upload of file %1 to path %2%3 succeeded\n").arg(filePath, parentPath, filename).toStdString());
        }
        else
            InventoryModule::LogInfo(QString("Webdav | Upload of file %1 to path %2%3 failed\n").arg(filePath, parentPath, filename).toStdString());
    }
}
示例#3
0
bool InventoryItemModel::InsertFolder(int position, const QModelIndex &parent, const QString &name)
{
    InventoryFolder *parentFolder = dynamic_cast<InventoryFolder *>(GetItem(parent));
    if (!parentFolder)
        return false;

    if (parentFolder->IsLibraryItem())
        return false;

    beginInsertRows(parent, position, position );

    RexUUID id;
    bool unique = false;
    while(!unique)
    {
        id.Random();
        AbstractInventoryItem *existing = dataModel_->GetChildFolderById(id.ToQString());
        if (!existing)
            unique = true;
        else
            InventoryModule::LogWarning("Generated an UUID that already exists! Generating a new one...");
    }

    dataModel_->GetOrCreateNewFolder(id.ToQString(), *parentFolder, name);

    endInsertRows();

    return true;
}
void WebDavInventoryDataModel::FetchRootFolder()
{
    webdavclient_ = pythonQtMainModule_.evalScript("connection.WebDavClient()\n", Py_eval_input);
    if (!webdavclient_)
    {
        ErrorOccurredCreateEmptyRootFolder();
        return;
    }

    // Set urls
    webdavclient_.call("setHostAndUser", QVariantList() << webdavIdentityUrl_ << webdavUrl_);
    // Connect to webdav
    webdavclient_.call("setupConnection");
    // Fetch root resources
    QStringList rootResources = webdavclient_.call("listResources").toStringList();
    if (rootResources.count() < 1)
    {
        ErrorOccurredCreateEmptyRootFolder();
        return;
    }

    QMap<QString, QString> folders;
    InventoryFolder *parentFolder;
    for (int index=0; index<=rootResources.count(); index++)
    {
        folders[rootResources.value(index)] = rootResources.value(index+1);
        index++;
    }

    if (!rootFolder_)
    {
        rootFolder_ = new InventoryFolder("root", "Webdav Inventory", false, 0);
        parentFolder = new InventoryFolder("", QString("My Inventory"), false, rootFolder_);
        rootFolder_->AddChild(parentFolder);
        rootFolder_->SetDirty(true);
    }

    AbstractInventoryItem *newItem = 0;
    QString path;
    QString name;
    QString type;

    for (QMap<QString, QString>::iterator iter = folders.begin(); iter!=folders.end(); ++iter)
    {
        path = iter.key();
        name = path.midRef(0, path.lastIndexOf("/")).toString();
        name = path.midRef(path.lastIndexOf("/")).toString();
        type = iter.value();
        if (name != "")
        {
            if (type == "resource")
                newItem = new InventoryAsset(path, "", name, parentFolder);
            else
                newItem = new InventoryFolder(path, name, parentFolder, true);
            parentFolder->AddChild(newItem);
        }
    }
}
示例#5
0
bool InventoryItemModel::canFetchMore(const QModelIndex & parent) const
{
    AbstractInventoryItem *item = GetItem(parent);
    if (item && item->GetItemType() == AbstractInventoryItem::Type_Folder)
    {
        InventoryFolder *folder = dynamic_cast<InventoryFolder*>(item);
        if (folder)
            return folder->IsDirty();
    }
    return false;
}
示例#6
0
 foreach (AbstractInventoryItem *item, children)
 {
     if (item->GetItemType() == AbstractInventoryItem::Type_Folder)
     {
         InventoryFolder *folder = dynamic_cast<InventoryFolder*>(item);
         if (!folder)
             continue;
         CheckChildrenForDirtys(folder->GetChildren());
         if (!folder->IsDirty())
             continue;
         QModelIndexList all_items = persistentIndexList();
         foreach (QModelIndex index, all_items)
             if (item == reinterpret_cast<AbstractInventoryItem *>(index.internalPointer()))
                 emit IndexModelIsDirty(index);
         folder->SetDirty(false);
     }
示例#7
0
int InventoryItemModel::rowCount(const QModelIndex &parent) const
{
    if (parent.column() > 0 || !dataModel_->GetRoot())
        return 0;

    if (!parent.isValid())
        dynamic_cast<InventoryFolder *>(dataModel_->GetRoot())->ChildCount();

    AbstractInventoryItem *item = GetItem(parent);
    if (item->GetItemType() == AbstractInventoryItem::Type_Folder)
    {
        InventoryFolder *parentFolder = static_cast<InventoryFolder *>(item);
        return parentFolder->ChildCount();
    }

    return 0;
}
bool WebDavInventoryDataModel::FetchInventoryDescendents(AbstractInventoryItem *item)
{
    InventoryFolder *selected = dynamic_cast<InventoryFolder *>(item);
    if (!selected)
        return false;

    // Delete children
    selected->GetChildren().clear();

    QString itemPath = selected->GetID();
    QStringList children = webdavclient_.call("listResources", QVariantList() << itemPath).toStringList();
    if ( children.count() >=1 )
    {
        // Process child list to map
        QMap<QString, QString> childMap;
        for (int index=0; index<=children.count(); index++)
        {
            childMap[children.value(index)] = children.value(index+1);
            index++;
        }

        AbstractInventoryItem *newItem = 0;
        QString path, name, type;
        for (QMap<QString, QString>::iterator iter = childMap.begin(); iter!=childMap.end(); ++iter)
        {
            path = iter.key();
            name = path.midRef(path.lastIndexOf("/")+1).toString();
            type = iter.value();
            if (name != "")
            {
                if (type == "resource")
                    newItem = new InventoryAsset(path, "", name, selected);
                else
                    newItem = new InventoryFolder(path, name, selected, true);
                selected->AddChild(newItem);
            }
        }

        InventoryModule::LogInfo(QString("Webdav | Fetched %1 children to path /%2").arg(QString::number(childMap.count()), itemPath).toStdString());
    }

    return true;
}
示例#9
0
QModelIndex InventoryItemModel::index(int row, int column, const QModelIndex &parent) const
{
    if (!hasIndex(row, column, parent))
        return QModelIndex();

    ///\todo Use AbstractInventoryItem?
    InventoryFolder *parentItem = 0;

    if (!parent.isValid())
        parentItem = static_cast<InventoryFolder *>(dataModel_->GetRoot());
    else
        parentItem = static_cast<InventoryFolder *>(reinterpret_cast<AbstractInventoryItem *>(parent.internalPointer()));

    AbstractInventoryItem *childItem = parentItem->Child(row);
    if (childItem)
        return createIndex(row, column, reinterpret_cast<void *>(childItem));
    else
        return QModelIndex();

    return QModelIndex();
}
示例#10
0
bool InventoryItemModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (role != Qt::EditRole)
        return false;

    AbstractInventoryItem *item = GetItem(index);

    InventoryFolder *folder = dynamic_cast<InventoryFolder *>(item);
    if (folder && !folder->IsEditable())
            return false;
    if (item->GetName() == value.toString())
        return false;

    QString oldName = item->GetName();
    item->SetName(value.toString());

    // Is this needed anymore?  
    emit dataChanged(index, index);

    // Notify server. Give updated item and old name (webdav needs this at least)
    dataModel_->NotifyServerAboutItemUpdate(item, oldName);

    return true;
}
示例#11
0
void InventoryItemModel::CheckTreeForDirtys()
{
    InventoryFolder *root = dynamic_cast<InventoryFolder*>(dataModel_->GetRoot());
    if (root)
        CheckChildrenForDirtys(root->GetChildren());
}
示例#12
0
bool InventoryItemModel::removeRows(int position, int rows, const QModelIndex &parent)
{
    InventoryFolder *parentFolder = dynamic_cast<InventoryFolder *>(GetItem(parent));
    if (!parentFolder)
        return false;

    AbstractInventoryItem *childItem = parentFolder->Child(position);
    if (!childItem)
        return false;

    if (childItem->GetItemType() == AbstractInventoryItem::Type_Folder)
        if (!static_cast<InventoryFolder *>(childItem)->IsEditable())
            return false;

    bool removeRow = false;
    if (itemMoveFlag_)
    {
        // We don't want to notify server if we're just moving (i.e. deleting temporarily from one location).
        int idx = itemsToBeMoved_.indexOf(childItem->GetID());
        if (idx != -1)
        {
            // Do not remove library items from the model.
            if (!childItem->IsLibraryItem())
                removeRow = true;

            itemsToBeMoved_.remove(idx);
        }
    }
    //else if(!itemMoveFlag_ && itemsToBeMoved_.size() == 0)
    else
    {
        removeRow = true;

        if(useTrash_)
        {
            // When deleting items, we move them first to the Trash folder.
            InventoryFolder *trashFolder = static_cast<InventoryFolder *>(dataModel_->GetTrashFolder());
            if (parentFolder == trashFolder)
            {
                // If the folder is already in the trash folder, delete it for good.
                dataModel_->NotifyServerAboutItemRemove(childItem);
            }
            else
            {
                // Move to the Trash folder.
                dataModel_->NotifyServerAboutItemMove(childItem);
                InsertExistingItem(position, trashFolder, childItem);
            }
        }
        else
            dataModel_->NotifyServerAboutItemRemove(childItem);
    }

    if (itemsToBeMoved_.size() <= 0)
        itemMoveFlag_ = false;

    if (removeRow)
    {
        beginRemoveRows(parent, position, position + rows - 1);
        bool success = parentFolder->RemoveChildren(position, rows);
        endRemoveRows();
        return success;
    }

    return false;
}
AbstractInventoryItem *WebDavInventoryDataModel::GetOrCreateNewFolder(const QString &id, AbstractInventoryItem &parentFolder,
        const QString &name, const bool &notify_server)
{
    InventoryFolder *parent = dynamic_cast<InventoryFolder *>(&parentFolder);
    if (!parent)
        return 0;

    if (RexUUID::IsValid(id.toStdString()))
    {
        // This is a new folder if the id is RexUUID 
        // RexUUID generated in data model, cant do nothing about this...
        QString parentPath = parent->GetID();
        QString newFolderName = name;
        QStringList result = webdavclient_.call("createDirectory", QVariantList() << parentPath << newFolderName).toStringList();
        if (result.count() >= 1)
        {
            if (result[0] == "True")
            {
                FetchInventoryDescendents(parent);
                InventoryModule::LogInfo(QString("Webdav | Created folder named %1 to path %2\n").arg(newFolderName, parentPath).toStdString());
            }
            else
                InventoryModule::LogInfo(QString("Webdav | Could not create folder named %1 to path %2\n").arg(newFolderName, parentPath).toStdString());
        }
    }
    else
    {
        // If its not RexUUID or and existing item in this folder,
        // then its a move command. Lets do that to the webdav server then...
        InventoryFolder *existingItem = parent->GetChildFolderById(id);
        if (!existingItem)
        {
            InventoryFolder *currentFolder = rootFolder_->GetChildFolderById(name);
            if (!currentFolder)
                return 0;

            QString currentPath = ValidateFolderPath(currentFolder->GetParent()->GetID());
            QString newPath = ValidateFolderPath(parent->GetID());
            QString folderName = name;
            QString deepCopy = "False";
            if (currentFolder->HasChildren())
                deepCopy = "True";
            QStringList result = webdavclient_.call("moveResource", QVariantList() << currentPath << newPath << folderName).toStringList();
            if (result.count() >= 1)
            {
                if (result[0] == "True")
                {
                    FetchInventoryDescendents(parent);
                    InventoryModule::LogInfo(QString("Webdav | Moved folder %1 from %2 to %3\nNote: This fucntionality is experimental,").append(
                        "dont assume it went succesfull\n").arg(folderName, currentPath, newPath).toStdString());
                }
                else
                {
                    InventoryModule::LogInfo(QString("Webdav | Failed to move folder %1 from %2 to %3\n").arg(
                        folderName, currentPath, newPath).toStdString());
                }
            }
        }
        else
            return existingItem;
    }

    // Return 0 to data model, we just updated 
    // folder content from webdav, no need to return the real item
    return 0;
}