2009-10-13 16:36:29 -04:00
|
|
|
/*************************************:***************************
|
2009-08-11 17:59:40 -04:00
|
|
|
* RetroShare is distributed under the following license:
|
|
|
|
*
|
|
|
|
* Copyright (C) 2006 - 2009 RetroShare Team
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2009-10-13 16:36:29 -04:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
2009-08-11 17:59:40 -04:00
|
|
|
* Boston, MA 02110-1301, USA.
|
|
|
|
****************************************************************/
|
|
|
|
|
2010-07-23 14:52:58 -04:00
|
|
|
#include <QFileInfo>
|
|
|
|
#include <QDir>
|
|
|
|
#include <QDesktopServices>
|
|
|
|
#include <QUrl>
|
|
|
|
#include <QMimeData>
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
#include "RemoteDirModel.h"
|
2010-08-06 05:40:23 -04:00
|
|
|
#include <retroshare/rsfiles.h>
|
|
|
|
#include <retroshare/rstypes.h>
|
2010-07-23 14:52:58 -04:00
|
|
|
#include "util/misc.h"
|
2008-07-02 12:59:56 -04:00
|
|
|
|
2010-07-23 14:52:58 -04:00
|
|
|
#include <set>
|
2007-11-14 22:18:48 -05:00
|
|
|
#include <sstream>
|
2008-11-02 10:20:42 -05:00
|
|
|
#include <algorithm>
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2008-07-09 05:53:47 -04:00
|
|
|
/*****
|
|
|
|
* #define RDM_DEBUG
|
|
|
|
****/
|
|
|
|
|
2008-07-04 10:41:24 -04:00
|
|
|
RemoteDirModel::RemoteDirModel(bool mode, QObject *parent)
|
|
|
|
: QAbstractItemModel(parent),
|
2010-06-10 10:13:20 -04:00
|
|
|
ageIndicator(IND_ALWAYS),
|
|
|
|
RemoteMode(mode), nIndex(1), indexSet(1) /* ass zero index cant be used */
|
2008-07-04 10:41:24 -04:00
|
|
|
{
|
|
|
|
setSupportedDragActions(Qt::CopyAction);
|
2009-10-13 16:36:29 -04:00
|
|
|
treeStyle();
|
2008-07-04 10:41:24 -04:00
|
|
|
}
|
|
|
|
|
2009-05-31 19:06:14 -04:00
|
|
|
void RemoteDirModel::treeStyle()
|
|
|
|
{
|
|
|
|
categoryIcon.addPixmap(QPixmap(":/images/folder16.png"),
|
|
|
|
QIcon::Normal, QIcon::Off);
|
|
|
|
categoryIcon.addPixmap(QPixmap(":/images/folder_video.png"),
|
|
|
|
QIcon::Normal, QIcon::On);
|
|
|
|
peerIcon = QIcon(":/images/user/identity16.png");
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
bool RemoteDirModel::hasChildren(const QModelIndex &parent) const
|
|
|
|
{
|
|
|
|
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "RemoteDirModel::hasChildren() :" << parent.internalPointer();
|
|
|
|
std::cerr << ": ";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (!parent.isValid())
|
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "root -> true ";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *ref = parent.internalPointer();
|
|
|
|
|
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_CHILDREN;
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
|
2008-07-02 12:59:56 -04:00
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
|
|
|
/* error */
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "lookup failed -> false";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
return false;
|
|
|
|
}
|
2009-07-07 14:56:31 -04:00
|
|
|
|
|
|
|
if (details.type == DIR_TYPE_FILE)
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "lookup FILE -> false";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
/* PERSON/DIR*/
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "lookup PER/DIR #" << details.count;
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
return (details.count > 0); /* do we have children? */
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int RemoteDirModel::rowCount(const QModelIndex &parent) const
|
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "RemoteDirModel::rowCount(): " << parent.internalPointer();
|
|
|
|
std::cerr << ": ";
|
|
|
|
#endif
|
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
void *ref = (parent.isValid())? parent.internalPointer() : NULL ;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_CHILDREN;
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
|
2008-07-02 12:59:56 -04:00
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "lookup failed -> 0";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (details.type == DIR_TYPE_FILE)
|
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "lookup FILE: 0";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2007-11-14 22:18:48 -05:00
|
|
|
/* else PERSON/DIR*/
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "lookup PER/DIR #" << details.count;
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
return details.count;
|
|
|
|
}
|
|
|
|
|
|
|
|
int RemoteDirModel::columnCount(const QModelIndex &parent) const
|
|
|
|
{
|
2009-10-13 16:36:29 -04:00
|
|
|
return 5;
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
2009-08-10 14:55:49 -04:00
|
|
|
QString RemoteDirModel::getFlagsString(uint32_t flags)
|
|
|
|
{
|
|
|
|
switch(flags & (DIR_FLAGS_NETWORK_WIDE|DIR_FLAGS_BROWSABLE))
|
|
|
|
{
|
2010-09-12 20:27:50 -04:00
|
|
|
case DIR_FLAGS_NETWORK_WIDE: return tr("Anonymous") ;
|
|
|
|
case DIR_FLAGS_NETWORK_WIDE | DIR_FLAGS_BROWSABLE: return tr("Anonymous and browsable by friends") ;
|
|
|
|
case DIR_FLAGS_BROWSABLE: return tr("Only browsable by friends") ;
|
2009-08-10 14:55:49 -04:00
|
|
|
default:
|
|
|
|
return QString() ;
|
|
|
|
}
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2009-10-13 16:36:29 -04:00
|
|
|
QString RemoteDirModel::getAgeIndicatorString(const DirDetails &details) const
|
|
|
|
{
|
|
|
|
QString ret("");
|
2010-10-28 13:26:00 -04:00
|
|
|
QString nind = tr("NEW");
|
|
|
|
// QString oind = tr("OLD");
|
2009-10-13 16:36:29 -04:00
|
|
|
uint32_t age = details.age;
|
|
|
|
|
|
|
|
switch (ageIndicator) {
|
|
|
|
case IND_LAST_DAY:
|
|
|
|
if (age < 24 * 60 * 60) return nind;
|
|
|
|
break;
|
|
|
|
case IND_LAST_WEEK:
|
|
|
|
if (age < 7 * 24 * 60 * 60) return nind;
|
|
|
|
break;
|
|
|
|
case IND_LAST_MONTH:
|
|
|
|
if (age < 30 * 24 * 60 * 60) return nind;
|
|
|
|
break;
|
2010-02-08 17:32:00 -05:00
|
|
|
// case IND_OLDER:
|
|
|
|
// if (age >= 30 * 24 * 60 * 60) return oind;
|
|
|
|
// break;
|
|
|
|
case IND_ALWAYS:
|
2009-10-13 16:36:29 -04:00
|
|
|
return ret;
|
|
|
|
default:
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2007-11-14 22:18:48 -05:00
|
|
|
QVariant RemoteDirModel::data(const QModelIndex &index, int role) const
|
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "RemoteDirModel::data(): " << index.internalPointer();
|
|
|
|
std::cerr << ": ";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (!index.isValid())
|
|
|
|
return QVariant();
|
|
|
|
|
|
|
|
/* get the data from the index */
|
|
|
|
void *ref = index.internalPointer();
|
2009-07-07 14:56:31 -04:00
|
|
|
int coln = index.column();
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_DETAILS;
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
|
2009-10-13 16:36:29 -04:00
|
|
|
|
2008-07-02 12:59:56 -04:00
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
|
|
|
return QVariant();
|
|
|
|
}
|
|
|
|
|
2009-04-07 04:08:03 -04:00
|
|
|
if (role == RemoteDirModel::FileNameRole)
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QString::fromUtf8(details.name.c_str());
|
2010-06-12 14:10:39 -04:00
|
|
|
} /* end of FileNameRole */
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2010-02-08 17:32:00 -05:00
|
|
|
if (role == Qt::TextColorRole)
|
|
|
|
{
|
2010-06-12 14:10:39 -04:00
|
|
|
if(details.min_age > ageIndicator)
|
|
|
|
return Qt::gray ;
|
|
|
|
else
|
|
|
|
return Qt::black ;
|
|
|
|
} /* end of TextColorRole */
|
2010-02-08 17:32:00 -05:00
|
|
|
|
|
|
|
|
2010-06-12 14:10:39 -04:00
|
|
|
if (role == Qt::DecorationRole)
|
|
|
|
{
|
|
|
|
if (details.type == DIR_TYPE_PERSON)
|
|
|
|
{
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
if(details.min_age > ageIndicator)
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_grey.png");
|
|
|
|
}
|
|
|
|
else if (ageIndicator == IND_LAST_DAY )
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_green.png");
|
|
|
|
}
|
|
|
|
else if (ageIndicator == IND_LAST_WEEK )
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_yellow.png");
|
|
|
|
}
|
|
|
|
else if (ageIndicator == IND_LAST_MONTH )
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_red.png");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return (QIcon(peerIcon));
|
|
|
|
}
|
|
|
|
break;
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (details.type == DIR_TYPE_DIR)
|
|
|
|
{
|
2010-06-12 14:10:39 -04:00
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
if(details.min_age > ageIndicator)
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_grey.png");
|
|
|
|
}
|
|
|
|
else if (ageIndicator == IND_LAST_DAY )
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_green.png");
|
|
|
|
}
|
|
|
|
else if (ageIndicator == IND_LAST_WEEK )
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_yellow.png");
|
|
|
|
}
|
|
|
|
else if (ageIndicator == IND_LAST_MONTH )
|
|
|
|
{
|
|
|
|
return QIcon(":/images/folder_red.png");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(categoryIcon);
|
2010-06-12 14:10:39 -04:00
|
|
|
}
|
|
|
|
break;
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (details.type == DIR_TYPE_FILE) /* File */
|
|
|
|
{
|
|
|
|
// extensions predefined
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
2010-09-19 20:10:51 -04:00
|
|
|
QString ext = QFileInfo(QString::fromUtf8(details.name.c_str())).suffix();
|
2009-08-10 14:55:49 -04:00
|
|
|
if (ext == "jpg" || ext == "jpeg" || ext == "png" || ext == "gif"
|
|
|
|
|| ext == "bmp" || ext == "ico" || ext == "svg")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypePicture.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "avi" || ext == "AVI" || ext == "mpg" || ext == "mpeg" || ext == "wmv" || ext == "ogm"
|
|
|
|
|| ext == "mkv" || ext == "mp4" || ext == "flv" || ext == "mov"
|
|
|
|
|| ext == "vob" || ext == "qt" || ext == "rm" || ext == "3gp")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeVideo.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "ogg" || ext == "mp3" || ext == "wav" || ext == "wma" || ext == "xpm")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeAudio.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "tar" || ext == "bz2" || ext == "zip" || ext == "gz" || ext == "7z"
|
|
|
|
|| ext == "rar" || ext == "rpm" || ext == "deb")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeArchive.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "app" || ext == "bat" || ext == "cgi" || ext == "com"
|
|
|
|
|| ext == "bin" || ext == "exe" || ext == "js" || ext == "pif"
|
|
|
|
|| ext == "py" || ext == "pl" || ext == "sh" || ext == "vb" || ext == "ws")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeProgram.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "iso" || ext == "nrg" || ext == "mdf" )
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeCDImage.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "txt" || ext == "cpp" || ext == "c" || ext == "h")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeDocument.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "doc" || ext == "rtf" || ext == "sxw" || ext == "xls"
|
|
|
|
|| ext == "sxc" || ext == "odt" || ext == "ods")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeDocument.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else if (ext == "html" || ext == "htm" || ext == "php")
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeDocument.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QIcon(":/images/FileTypeAny.png");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return QVariant();
|
|
|
|
}
|
2010-06-12 14:10:39 -04:00
|
|
|
} /* end of DecorationRole */
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-06-12 14:10:39 -04:00
|
|
|
/*****************
|
2007-11-14 22:18:48 -05:00
|
|
|
Qt::EditRole
|
|
|
|
Qt::ToolTipRole
|
|
|
|
Qt::StatusTipRole
|
|
|
|
Qt::WhatsThisRole
|
|
|
|
Qt::SizeHintRole
|
|
|
|
****************/
|
2010-06-12 14:10:39 -04:00
|
|
|
|
|
|
|
if (role == Qt::SizeHintRole)
|
|
|
|
{
|
|
|
|
return QSize(18, 18);
|
|
|
|
} /* end of SizeHintRole */
|
|
|
|
|
|
|
|
if (role == Qt::TextAlignmentRole)
|
|
|
|
{
|
|
|
|
if(coln == 1)
|
|
|
|
{
|
|
|
|
return int( Qt::AlignRight | Qt::AlignVCenter);
|
|
|
|
}
|
2010-10-28 13:26:00 -04:00
|
|
|
return QVariant();
|
|
|
|
} /* end of TextAlignmentRole */
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-06-12 14:10:39 -04:00
|
|
|
if (role == Qt::DisplayRole)
|
|
|
|
{
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-06-12 14:10:39 -04:00
|
|
|
/*
|
2007-11-14 22:18:48 -05:00
|
|
|
* Person: name, id, 0, 0;
|
|
|
|
* File : name, size, rank, (0) ts
|
|
|
|
* Dir : name, (0) count, (0) path, (0) ts
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
if (details.type == DIR_TYPE_PERSON) /* Person */
|
|
|
|
{
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
2010-09-19 20:10:51 -04:00
|
|
|
return QString::fromUtf8(details.name.c_str());
|
2007-11-14 22:18:48 -05:00
|
|
|
case 1:
|
2010-01-30 15:47:34 -05:00
|
|
|
return QString() ;
|
2007-11-14 22:18:48 -05:00
|
|
|
default:
|
2010-01-30 15:47:34 -05:00
|
|
|
return QString() ;
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (details.type == DIR_TYPE_FILE) /* File */
|
|
|
|
{
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
2010-01-30 15:47:34 -05:00
|
|
|
return QString::fromUtf8(details.name.c_str());
|
2007-11-14 22:18:48 -05:00
|
|
|
case 1:
|
2010-10-28 13:26:00 -04:00
|
|
|
return misc::friendlyUnit(details.count);
|
2007-11-14 22:18:48 -05:00
|
|
|
case 2:
|
2010-10-28 13:26:00 -04:00
|
|
|
return misc::userFriendlyDuration(details.age);
|
2007-11-14 22:18:48 -05:00
|
|
|
case 3:
|
2010-10-28 13:26:00 -04:00
|
|
|
return getFlagsString(details.flags);
|
2009-10-13 16:36:29 -04:00
|
|
|
case 4:
|
2010-06-12 14:10:39 -04:00
|
|
|
{
|
|
|
|
QString ind("");
|
|
|
|
if (ageIndicator != IND_ALWAYS)
|
|
|
|
ind = getAgeIndicatorString(details);
|
|
|
|
return ind;
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
default:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("FILE");
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (details.type == DIR_TYPE_DIR) /* Dir */
|
|
|
|
{
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
2010-02-04 11:54:59 -05:00
|
|
|
return QString::fromUtf8(details.name.c_str());
|
2009-08-10 14:55:49 -04:00
|
|
|
break;
|
2007-11-14 22:18:48 -05:00
|
|
|
case 1:
|
2010-10-28 13:26:00 -04:00
|
|
|
if (details.count > 1)
|
2009-08-10 14:55:49 -04:00
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return QString::number(details.count) + " " + tr("Files");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
2010-10-28 13:26:00 -04:00
|
|
|
return QString::number(details.count) + " " + tr("File");
|
2007-11-14 22:18:48 -05:00
|
|
|
case 2:
|
2010-10-28 13:26:00 -04:00
|
|
|
return misc::userFriendlyDuration(details.min_age);
|
2009-10-13 16:36:29 -04:00
|
|
|
case 3:
|
2010-10-28 13:26:00 -04:00
|
|
|
return getFlagsString(details.flags);
|
2007-11-14 22:18:48 -05:00
|
|
|
default:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("DIR");
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
}
|
2010-10-28 13:26:00 -04:00
|
|
|
return QVariant();
|
2007-11-14 22:18:48 -05:00
|
|
|
} /* end of DisplayRole */
|
2008-11-18 17:59:33 -05:00
|
|
|
|
2010-09-19 20:10:51 -04:00
|
|
|
if (role == SortRole)
|
|
|
|
{
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Person: name, id, 0, 0;
|
|
|
|
* File : name, size, rank, (0) ts
|
|
|
|
* Dir : name, (0) count, (0) path, (0) ts
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
if (details.type == DIR_TYPE_PERSON) /* Person */
|
|
|
|
{
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
return QString::fromUtf8(details.name.c_str());
|
|
|
|
case 1:
|
|
|
|
return QString();
|
|
|
|
default:
|
|
|
|
return QString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (details.type == DIR_TYPE_FILE) /* File */
|
|
|
|
{
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
return QString::fromUtf8(details.name.c_str());
|
|
|
|
case 1:
|
2010-10-04 09:40:17 -04:00
|
|
|
return (qulonglong) details.count;
|
2010-09-19 20:10:51 -04:00
|
|
|
case 2:
|
|
|
|
return details.age;
|
|
|
|
case 3:
|
|
|
|
return getFlagsString(details.flags);
|
|
|
|
case 4:
|
|
|
|
{
|
|
|
|
QString ind("");
|
|
|
|
if (ageIndicator != IND_ALWAYS)
|
|
|
|
ind = getAgeIndicatorString(details);
|
|
|
|
return ind;
|
|
|
|
}
|
|
|
|
default:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("FILE");
|
2010-09-19 20:10:51 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (details.type == DIR_TYPE_DIR) /* Dir */
|
|
|
|
{
|
|
|
|
switch(coln)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
return QString::fromUtf8(details.name.c_str());
|
|
|
|
case 1:
|
2010-10-04 09:40:17 -04:00
|
|
|
return (qulonglong) details.count;
|
2010-09-19 20:10:51 -04:00
|
|
|
case 2:
|
|
|
|
return details.min_age;
|
|
|
|
case 3:
|
|
|
|
return getFlagsString(details.flags);
|
|
|
|
default:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("DIR");
|
2010-09-19 20:10:51 -04:00
|
|
|
}
|
|
|
|
}
|
2010-10-28 13:26:00 -04:00
|
|
|
return QVariant();
|
2010-09-19 20:10:51 -04:00
|
|
|
} /* end of SortRole */
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2010-09-19 20:10:51 -04:00
|
|
|
return QVariant();
|
2010-06-12 14:10:39 -04:00
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2009-10-13 16:36:29 -04:00
|
|
|
void RemoteDirModel::getAgeIndicatorRec(DirDetails &details, QString &ret) const {
|
|
|
|
if (details.type == DIR_TYPE_FILE) {
|
|
|
|
ret = getAgeIndicatorString(details);
|
|
|
|
return;
|
2010-10-28 13:26:00 -04:00
|
|
|
} else if (details.type == DIR_TYPE_DIR && ret.isEmpty()) {
|
2009-10-13 16:36:29 -04:00
|
|
|
std::list<DirStub>::iterator it;
|
|
|
|
for (it = details.children.begin(); it != details.children.end(); it++) {
|
|
|
|
void *ref = it->ref;
|
|
|
|
DirDetails childDetails;
|
|
|
|
uint32_t flags;
|
|
|
|
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
|
|
|
|
if (rsFiles->RequestDirDetails(ref, childDetails, flags) && ret == tr(""))
|
|
|
|
getAgeIndicatorRec(childDetails, ret);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-11-18 17:59:33 -05:00
|
|
|
|
2007-11-14 22:18:48 -05:00
|
|
|
QVariant RemoteDirModel::headerData(int section, Qt::Orientation orientation,
|
|
|
|
int role) const
|
2009-08-10 14:55:49 -04:00
|
|
|
{
|
|
|
|
if (role == Qt::SizeHintRole)
|
|
|
|
{
|
|
|
|
int defw = 50;
|
|
|
|
int defh = 21;
|
|
|
|
if (section < 2)
|
|
|
|
{
|
|
|
|
defw = 200;
|
|
|
|
}
|
|
|
|
return QSize(defw, defh);
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2009-08-10 14:55:49 -04:00
|
|
|
if (role != Qt::DisplayRole)
|
|
|
|
return QVariant();
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2009-08-10 14:55:49 -04:00
|
|
|
if (orientation == Qt::Horizontal)
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
2009-08-10 14:55:49 -04:00
|
|
|
switch(section)
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
if (RemoteMode)
|
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("Friends Directories");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("My Directories");
|
2009-08-10 14:55:49 -04:00
|
|
|
case 1:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("Size");
|
2009-08-10 14:55:49 -04:00
|
|
|
case 2:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("Age");
|
2009-08-10 14:55:49 -04:00
|
|
|
case 3:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("Share Type");
|
2009-10-13 16:36:29 -04:00
|
|
|
case 4:
|
2010-10-28 13:26:00 -04:00
|
|
|
return tr("What's new");
|
2009-08-10 14:55:49 -04:00
|
|
|
}
|
|
|
|
return QString("Column %1").arg(section);
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
2009-08-10 14:55:49 -04:00
|
|
|
else
|
|
|
|
return QString("Row %1").arg(section);
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
QModelIndex RemoteDirModel::index(int row, int column, const QModelIndex & parent) const
|
|
|
|
{
|
2007-11-14 22:18:48 -05:00
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "RemoteDirModel::index(): " << parent.internalPointer();
|
|
|
|
std::cerr << ": row:" << row << " col:" << column << " ";
|
|
|
|
#endif
|
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
if(row < 0)
|
|
|
|
return QModelIndex() ;
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
void *ref = (parent.isValid()) ? parent.internalPointer() : NULL;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
/********
|
2010-01-30 15:47:34 -05:00
|
|
|
if (!RemoteMode)
|
|
|
|
{
|
|
|
|
remote = &(rsiface->getLocalDirectoryList());
|
|
|
|
}
|
|
|
|
********/
|
|
|
|
|
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_CHILDREN;
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
|
|
|
{
|
2007-11-14 22:18:48 -05:00
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "lookup failed -> invalid";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
#endif
|
2010-01-30 15:47:34 -05:00
|
|
|
return QModelIndex();
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-02-08 17:32:00 -05:00
|
|
|
|
2009-07-07 14:56:31 -04:00
|
|
|
/* now iterate through the details to
|
2007-11-14 22:18:48 -05:00
|
|
|
* get the reference number
|
|
|
|
*/
|
|
|
|
|
|
|
|
std::list<DirStub>::iterator it;
|
|
|
|
int i = 0;
|
2010-02-08 17:32:00 -05:00
|
|
|
for(it = details.children.begin(); ((i < row) && (it != details.children.end())); ++it,++i) ;
|
2010-09-19 20:10:51 -04:00
|
|
|
|
2009-07-07 14:56:31 -04:00
|
|
|
if (it == details.children.end())
|
|
|
|
{
|
2007-11-14 22:18:48 -05:00
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "wrong number of children -> invalid";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
#endif
|
2009-07-07 14:56:31 -04:00
|
|
|
return QModelIndex();
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "success index(" << row << "," << column << "," << it->ref << ")";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/* we can just grab the reference now */
|
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
return createIndex(row, column, it->ref);
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
|
|
|
|
QModelIndex RemoteDirModel::parent( const QModelIndex & index ) const
|
|
|
|
{
|
2007-11-14 22:18:48 -05:00
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "RemoteDirModel::parent(): " << index.internalPointer();
|
|
|
|
std::cerr << ": ";
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* create the index */
|
2010-01-30 15:47:34 -05:00
|
|
|
if (!index.isValid())
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "Invalid Index -> invalid";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
#endif
|
|
|
|
/* Parent is invalid too */
|
|
|
|
return QModelIndex();
|
|
|
|
}
|
|
|
|
void *ref = index.internalPointer();
|
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = (RemoteMode)?DIR_FLAGS_REMOTE:DIR_FLAGS_LOCAL;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
|
|
|
{
|
2007-11-14 22:18:48 -05:00
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "Failed Lookup -> invalid";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
#endif
|
2010-01-30 15:47:34 -05:00
|
|
|
return QModelIndex();
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
if (!(details.parent))
|
|
|
|
{
|
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "success. parent is Root/NULL --> invalid";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
#endif
|
2010-01-30 15:47:34 -05:00
|
|
|
return QModelIndex();
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "success index(" << details.prow << ",0," << details.parent << ")";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
|
|
|
#endif
|
|
|
|
return createIndex(details.prow, 0, details.parent);
|
2010-01-30 15:47:34 -05:00
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
Qt::ItemFlags RemoteDirModel::flags( const QModelIndex & index ) const
|
|
|
|
{
|
2007-11-14 22:18:48 -05:00
|
|
|
#ifdef RDM_DEBUG
|
2010-01-30 15:47:34 -05:00
|
|
|
std::cerr << "RemoteDirModel::flags()";
|
|
|
|
std::cerr << std::endl;
|
2007-11-14 22:18:48 -05:00
|
|
|
#endif
|
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
if (!index.isValid())
|
2007-11-14 22:18:48 -05:00
|
|
|
return (Qt::ItemIsSelectable); // Error.
|
|
|
|
|
|
|
|
void *ref = index.internalPointer();
|
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_DETAILS;
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
|
|
|
return Qt::ItemIsSelectable; // Error.
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-30 15:47:34 -05:00
|
|
|
switch(details.type)
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
2010-10-28 13:26:00 -04:00
|
|
|
case DIR_TYPE_PERSON: return Qt::ItemIsEnabled;
|
|
|
|
case DIR_TYPE_DIR: return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
|
|
|
|
case DIR_TYPE_FILE: return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled;
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
2010-10-28 13:26:00 -04:00
|
|
|
|
|
|
|
return Qt::ItemIsSelectable;
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// The other flags...
|
|
|
|
//Qt::ItemIsUserCheckable
|
|
|
|
//Qt::ItemIsEditable
|
|
|
|
//Qt::ItemIsDropEnabled
|
|
|
|
//Qt::ItemIsTristate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Callback from */
|
|
|
|
void RemoteDirModel::preMods()
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2007-11-14 22:18:48 -05:00
|
|
|
std::cerr << "RemoteDirModel::preMods()" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
//modelAboutToBeReset();
|
2009-08-11 15:43:51 -04:00
|
|
|
// reset();
|
2010-11-23 16:00:17 -05:00
|
|
|
#if QT_VERSION >= 0x040600
|
2010-11-13 13:02:08 -05:00
|
|
|
beginResetModel();
|
2010-11-23 16:00:17 -05:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
layoutAboutToBeChanged();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Callback from */
|
|
|
|
void RemoteDirModel::postMods()
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2007-11-14 22:18:48 -05:00
|
|
|
std::cerr << "RemoteDirModel::postMods()" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
//modelReset();
|
|
|
|
layoutChanged();
|
|
|
|
//reset();
|
2010-11-23 16:00:17 -05:00
|
|
|
#if QT_VERSION >= 0x040600
|
2010-11-13 13:02:08 -05:00
|
|
|
endResetModel();
|
2010-11-23 16:00:17 -05:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-08 17:32:00 -05:00
|
|
|
//void RemoteDirModel::update (const QModelIndex &index )
|
|
|
|
//{
|
|
|
|
//#ifdef RDM_DEBUG
|
|
|
|
// //std::cerr << "Directory Request(" << id << ") : ";
|
|
|
|
// //std::cerr << path << std::endl;
|
|
|
|
//#endif
|
|
|
|
// //rsFiles -> RequestDirectories(id, path, 1);
|
|
|
|
//}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
void RemoteDirModel::downloadSelected(const QModelIndexList &list)
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
|
|
|
if (!RemoteMode)
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2007-11-14 22:18:48 -05:00
|
|
|
std::cerr << "Cannot download from local" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
|
2009-07-07 14:56:31 -04:00
|
|
|
/* so for all the selected .... get the name out,
|
2007-11-14 22:18:48 -05:00
|
|
|
* make it into something the RsControl can understand
|
|
|
|
*/
|
|
|
|
|
2009-05-18 10:23:55 -04:00
|
|
|
std::vector <DirDetails> dirVec;
|
|
|
|
|
|
|
|
getDirDetailsFromSelect(list, dirVec);
|
|
|
|
|
2007-11-14 22:18:48 -05:00
|
|
|
/* Fire off requests */
|
2009-05-18 10:23:55 -04:00
|
|
|
for (int i = 0, n = dirVec.size(); i < n; ++i)
|
|
|
|
{
|
|
|
|
if (!RemoteMode)
|
|
|
|
{
|
|
|
|
continue; /* don't try to download local stuff */
|
|
|
|
}
|
|
|
|
|
|
|
|
const DirDetails& details = dirVec[i];
|
|
|
|
|
|
|
|
/* if it is a file */
|
|
|
|
if (details.type == DIR_TYPE_FILE)
|
|
|
|
{
|
|
|
|
std::cerr << "RemoteDirModel::downloadSelected() Calling File Request";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
std::list<std::string> srcIds;
|
|
|
|
srcIds.push_back(details.id);
|
|
|
|
rsFiles -> FileRequest(details.name, details.hash,
|
2010-01-26 15:40:21 -05:00
|
|
|
details.count, "", RS_FILE_HINTS_NETWORK_WIDE, srcIds);
|
2009-05-18 10:23:55 -04:00
|
|
|
}
|
|
|
|
/* if it is a dir, copy all files included*/
|
|
|
|
else if (details.type == DIR_TYPE_DIR)
|
|
|
|
{
|
2009-07-26 11:00:29 -04:00
|
|
|
int prefixLen = details.path.rfind(details.name);
|
2009-07-17 16:07:43 -04:00
|
|
|
if (prefixLen < 0) continue;
|
|
|
|
downloadDirectory(details, prefixLen);
|
2009-05-18 10:23:55 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2009-07-17 16:07:43 -04:00
|
|
|
/* recursively download a directory */
|
|
|
|
void RemoteDirModel::downloadDirectory(const DirDetails & dirDetails, int prefixLen)
|
|
|
|
{
|
|
|
|
if (dirDetails.type & DIR_TYPE_FILE)
|
|
|
|
{
|
|
|
|
std::list<std::string> srcIds;
|
2010-09-17 14:27:30 -04:00
|
|
|
QString cleanPath = QDir::cleanPath(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str()) + "/" + QString::fromUtf8(dirDetails.path.substr(prefixLen).c_str()));
|
2009-07-17 16:07:43 -04:00
|
|
|
|
|
|
|
srcIds.push_back(dirDetails.id);
|
2010-09-17 14:27:30 -04:00
|
|
|
rsFiles->FileRequest(dirDetails.name, dirDetails.hash, dirDetails.count, cleanPath.toUtf8().constData(), RS_FILE_HINTS_NETWORK_WIDE, srcIds);
|
2009-07-17 16:07:43 -04:00
|
|
|
}
|
|
|
|
else if (dirDetails.type & DIR_TYPE_DIR)
|
|
|
|
{
|
|
|
|
std::list<DirStub>::const_iterator it;
|
|
|
|
QDir dwlDir(rsFiles->getDownloadDirectory().c_str());
|
2010-09-17 14:27:30 -04:00
|
|
|
QString cleanPath = QDir::cleanPath(QString::fromUtf8(dirDetails.path.substr(prefixLen).c_str()));
|
2009-07-17 16:07:43 -04:00
|
|
|
|
|
|
|
if (!dwlDir.mkpath(cleanPath)) return;
|
|
|
|
|
|
|
|
for (it = dirDetails.children.begin(); it != dirDetails.children.end(); it++)
|
|
|
|
{
|
|
|
|
if (!it->ref) continue;
|
|
|
|
|
|
|
|
DirDetails subDirDetails;
|
|
|
|
uint32_t flags = DIR_FLAGS_CHILDREN | DIR_FLAGS_REMOTE;
|
|
|
|
|
|
|
|
if (!rsFiles->RequestDirDetails(it->ref, subDirDetails, flags)) continue;
|
|
|
|
|
|
|
|
downloadDirectory(subDirDetails, prefixLen);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
void RemoteDirModel::getDirDetailsFromSelect (const QModelIndexList &list, std::vector <DirDetails>& dirVec)
|
2009-05-18 10:23:55 -04:00
|
|
|
{
|
|
|
|
dirVec.clear();
|
2009-02-02 15:46:30 -05:00
|
|
|
|
2009-05-18 10:23:55 -04:00
|
|
|
/* Fire off requests */
|
2010-11-20 09:50:14 -05:00
|
|
|
QModelIndexList::const_iterator it;
|
2009-05-18 10:23:55 -04:00
|
|
|
for(it = list.begin(); it != list.end(); it++)
|
|
|
|
{
|
|
|
|
if(it->column()==1)
|
|
|
|
{
|
|
|
|
void *ref = it -> internalPointer();
|
|
|
|
|
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_DETAILS;
|
|
|
|
if (RemoteMode)
|
|
|
|
{
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
dirVec.push_back(details);
|
|
|
|
}
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
|
2008-07-02 12:59:56 -04:00
|
|
|
/****************************************************************************
|
|
|
|
* OLD RECOMMEND SYSTEM - DISABLED
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2009-05-17 15:38:42 -04:00
|
|
|
void RemoteDirModel::getFileInfoFromIndexList(const QModelIndexList& list, std::list<DirDetails>& file_details)
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
2009-05-17 15:38:42 -04:00
|
|
|
file_details.clear() ;
|
|
|
|
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2007-11-14 22:18:48 -05:00
|
|
|
std::cerr << "recommendSelected()" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
if (RemoteMode)
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2007-11-14 22:18:48 -05:00
|
|
|
std::cerr << "Cannot recommend remote! (should download)" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
/* Fire off requests */
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2009-05-17 15:38:42 -04:00
|
|
|
std::set<std::string> already_in ;
|
|
|
|
|
|
|
|
for(QModelIndexList::const_iterator it(list.begin()); it != list.end(); ++it)
|
2010-01-31 09:21:24 -05:00
|
|
|
if(it->column()==0)
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
2010-01-31 09:21:24 -05:00
|
|
|
void *ref = it -> internalPointer();
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-31 09:21:24 -05:00
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_DETAILS;
|
|
|
|
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
|
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if(details.type == DIR_TYPE_PERSON)
|
|
|
|
continue ;
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2010-01-31 09:21:24 -05:00
|
|
|
std::cerr << "::::::::::::FileRecommend:::: " << std::endl;
|
|
|
|
std::cerr << "Name: " << details.name << std::endl;
|
|
|
|
std::cerr << "Hash: " << details.hash << std::endl;
|
|
|
|
std::cerr << "Size: " << details.count << std::endl;
|
|
|
|
std::cerr << "Path: " << details.path << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2010-02-03 15:59:54 -05:00
|
|
|
// Note: for directories, the returned hash, is the peer id, so if we collect
|
|
|
|
// dirs, we need to be a bit more conservative for the
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2010-01-31 09:21:24 -05:00
|
|
|
if(already_in.find(details.hash+details.name) == already_in.end())
|
|
|
|
{
|
|
|
|
file_details.push_back(details) ;
|
|
|
|
already_in.insert(details.hash+details.name) ;
|
|
|
|
}
|
2009-05-17 15:38:42 -04:00
|
|
|
}
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2007-11-14 22:18:48 -05:00
|
|
|
std::cerr << "::::::::::::Done FileRecommend" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2007-11-14 22:18:48 -05:00
|
|
|
}
|
|
|
|
|
2008-07-02 12:59:56 -04:00
|
|
|
/****************************************************************************
|
|
|
|
* OLD RECOMMEND SYSTEM - DISABLED
|
|
|
|
******/
|
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
void RemoteDirModel::openSelected(const QModelIndexList &qmil)
|
2007-11-14 22:18:48 -05:00
|
|
|
{
|
2009-07-07 14:56:31 -04:00
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "RemoteDirModel::openSelected()" << std::endl;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (RemoteMode) {
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "Cannot open remote. Download first." << std::endl;
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
2007-11-14 22:18:48 -05:00
|
|
|
|
2009-07-07 14:56:31 -04:00
|
|
|
std::list<std::string> dirs_to_open;
|
|
|
|
|
|
|
|
std::list<DirDetails> files_info;
|
|
|
|
std::list<DirDetails>::iterator it;
|
|
|
|
getFileInfoFromIndexList(qmil, files_info);
|
|
|
|
|
2010-03-28 16:46:45 -04:00
|
|
|
for (it = files_info.begin(); it != files_info.end(); it++)
|
|
|
|
{
|
2009-07-07 14:56:31 -04:00
|
|
|
if ((*it).type & DIR_TYPE_PERSON) continue;
|
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
std::string path, name;
|
|
|
|
rsFiles->ConvertSharedFilePath((*it).path, path);
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
QDir dir(QString::fromUtf8(path.c_str()));
|
|
|
|
QString dest;
|
2009-07-07 14:56:31 -04:00
|
|
|
if ((*it).type & DIR_TYPE_FILE) {
|
2010-11-20 09:50:14 -05:00
|
|
|
dest = dir.absoluteFilePath(QString::fromUtf8(it->name.c_str()));
|
2009-07-07 14:56:31 -04:00
|
|
|
} else if ((*it).type & DIR_TYPE_DIR) {
|
2010-11-20 09:50:14 -05:00
|
|
|
dest = dir.absolutePath();
|
2009-07-07 14:56:31 -04:00
|
|
|
}
|
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
std::cerr << "Opening this file: " << dest.toStdString() << std::endl ;
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
QDesktopServices::openUrl(QUrl::fromLocalFile(dest));
|
2009-07-07 14:56:31 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef RDM_DEBUG
|
|
|
|
std::cerr << "::::::::::::Done RemoteDirModel::openSelected()" << std::endl;
|
|
|
|
#endif
|
|
|
|
}
|
2008-03-31 14:37:50 -04:00
|
|
|
|
2010-11-20 09:50:14 -05:00
|
|
|
void RemoteDirModel::getFilePaths(const QModelIndexList &list, std::list<std::string> &fullpaths)
|
2008-03-31 14:37:50 -04:00
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-03-31 14:37:50 -04:00
|
|
|
std::cerr << "RemoteDirModel::getFilePaths()" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-03-31 14:37:50 -04:00
|
|
|
if (RemoteMode)
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-03-31 14:37:50 -04:00
|
|
|
std::cerr << "No File Paths for remote files" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-03-31 14:37:50 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
/* translate */
|
2010-11-20 09:50:14 -05:00
|
|
|
QModelIndexList::const_iterator it;
|
2008-03-31 14:37:50 -04:00
|
|
|
for(it = list.begin(); it != list.end(); it++)
|
|
|
|
{
|
|
|
|
void *ref = it -> internalPointer();
|
|
|
|
|
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_DETAILS;
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
|
2008-07-02 12:59:56 -04:00
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
2008-03-31 14:37:50 -04:00
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-03-31 14:37:50 -04:00
|
|
|
std::cerr << "getFilePaths() Bad Request" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-03-31 14:37:50 -04:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (details.type != DIR_TYPE_FILE)
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-03-31 14:37:50 -04:00
|
|
|
std::cerr << "getFilePaths() Not File" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-03-31 14:37:50 -04:00
|
|
|
continue; /* not file! */
|
|
|
|
}
|
|
|
|
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-03-31 14:37:50 -04:00
|
|
|
std::cerr << "::::::::::::File Details:::: " << std::endl;
|
|
|
|
std::cerr << "Name: " << details.name << std::endl;
|
|
|
|
std::cerr << "Hash: " << details.hash << std::endl;
|
|
|
|
std::cerr << "Size: " << details.count << std::endl;
|
|
|
|
std::cerr << "Path: " << details.path << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-03-31 14:37:50 -04:00
|
|
|
|
|
|
|
std::string filepath = details.path + "/";
|
|
|
|
filepath += details.name;
|
|
|
|
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-03-31 14:37:50 -04:00
|
|
|
std::cerr << "Constructed FilePath: " << filepath << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-03-31 14:37:50 -04:00
|
|
|
if (fullpaths.end() == std::find(fullpaths.begin(), fullpaths.end(), filepath))
|
|
|
|
{
|
|
|
|
fullpaths.push_back(filepath);
|
|
|
|
}
|
|
|
|
}
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-03-31 14:37:50 -04:00
|
|
|
std::cerr << "::::::::::::Done getFilePaths" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-03-31 14:37:50 -04:00
|
|
|
}
|
|
|
|
|
2008-07-04 10:41:24 -04:00
|
|
|
/* Drag and Drop Functionality */
|
|
|
|
QMimeData * RemoteDirModel::mimeData ( const QModelIndexList & indexes ) const
|
|
|
|
{
|
|
|
|
/* extract from each the member text */
|
|
|
|
std::string text;
|
|
|
|
QModelIndexList::const_iterator it;
|
|
|
|
std::map<std::string, uint64_t> drags;
|
|
|
|
std::map<std::string, uint64_t>::iterator dit;
|
|
|
|
|
|
|
|
for(it = indexes.begin(); it != indexes.end(); it++)
|
|
|
|
{
|
|
|
|
void *ref = it -> internalPointer();
|
|
|
|
|
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_DETAILS;
|
|
|
|
if (RemoteMode)
|
|
|
|
{
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-07-04 10:41:24 -04:00
|
|
|
std::cerr << "::::::::::::FileDrag:::: " << std::endl;
|
|
|
|
std::cerr << "Name: " << details.name << std::endl;
|
|
|
|
std::cerr << "Hash: " << details.hash << std::endl;
|
|
|
|
std::cerr << "Size: " << details.count << std::endl;
|
|
|
|
std::cerr << "Path: " << details.path << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-07-04 10:41:24 -04:00
|
|
|
|
|
|
|
if (details.type != DIR_TYPE_FILE)
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-07-04 10:41:24 -04:00
|
|
|
std::cerr << "RemoteDirModel::mimeData() Not File" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-07-04 10:41:24 -04:00
|
|
|
continue; /* not file! */
|
|
|
|
}
|
|
|
|
|
|
|
|
if (drags.end() != (dit = drags.find(details.hash)))
|
|
|
|
{
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-07-04 10:41:24 -04:00
|
|
|
std::cerr << "RemoteDirModel::mimeData() Duplicate" << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-07-04 10:41:24 -04:00
|
|
|
continue; /* duplicate */
|
|
|
|
}
|
|
|
|
|
|
|
|
drags[details.hash] = details.count;
|
|
|
|
|
|
|
|
std::string line = details.name;
|
|
|
|
line += "/";
|
|
|
|
line += details.hash;
|
|
|
|
line += "/";
|
|
|
|
|
|
|
|
{
|
|
|
|
std::ostringstream out;
|
|
|
|
out << details.count;
|
|
|
|
line += out.str();
|
|
|
|
line += "/";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (RemoteMode)
|
|
|
|
{
|
|
|
|
line += "Remote";
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
line += "Local";
|
|
|
|
}
|
|
|
|
line += "/\n";
|
|
|
|
|
|
|
|
text += line;
|
|
|
|
}
|
|
|
|
|
2008-07-09 05:53:47 -04:00
|
|
|
#ifdef RDM_DEBUG
|
2008-07-04 10:41:24 -04:00
|
|
|
std::cerr << "Created MimeData:";
|
|
|
|
std::cerr << std::endl;
|
|
|
|
|
|
|
|
std::cerr << text;
|
|
|
|
std::cerr << std::endl;
|
2008-07-09 05:53:47 -04:00
|
|
|
#endif
|
2008-07-04 10:41:24 -04:00
|
|
|
|
|
|
|
QMimeData *data = new QMimeData();
|
|
|
|
data->setData("application/x-rsfilelist", QByteArray(text.c_str()));
|
|
|
|
|
|
|
|
return data;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
QStringList RemoteDirModel::mimeTypes () const
|
|
|
|
{
|
|
|
|
QStringList list;
|
|
|
|
list.push_back("application/x-rsfilelist");
|
|
|
|
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
2009-04-07 04:08:03 -04:00
|
|
|
//============================================================================
|
|
|
|
|
2010-11-07 16:33:48 -05:00
|
|
|
int RemoteDirModel::getType ( const QModelIndex & index ) const
|
2009-04-07 04:08:03 -04:00
|
|
|
{
|
|
|
|
//if (RemoteMode) // only local files can be opened
|
|
|
|
// return ;
|
|
|
|
void *ref = index.internalPointer();
|
|
|
|
if (!ref)
|
|
|
|
return false;
|
2009-07-07 14:56:31 -04:00
|
|
|
|
2009-04-07 04:08:03 -04:00
|
|
|
DirDetails details;
|
|
|
|
uint32_t flags = DIR_FLAGS_DETAILS;
|
|
|
|
if (RemoteMode)
|
|
|
|
flags |= DIR_FLAGS_REMOTE;
|
|
|
|
else
|
|
|
|
flags |= DIR_FLAGS_LOCAL;
|
|
|
|
|
|
|
|
if (!rsFiles->RequestDirDetails(ref, details, flags))
|
|
|
|
{
|
|
|
|
return false;//not good, but....
|
|
|
|
}
|
|
|
|
|
2010-11-07 16:33:48 -05:00
|
|
|
return details.type;
|
2009-04-07 04:08:03 -04:00
|
|
|
}
|