mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-17 13:24:15 -05:00
Merge pull request #2161 from csoler/v0.6-BugFixing_5
V0.6 bug fixing 5
This commit is contained in:
commit
733b059571
@ -638,6 +638,23 @@ bool InternalFileHierarchyStorage::setTS(const DirectoryStorage::EntryIndex& ind
|
||||
return true;
|
||||
}
|
||||
|
||||
// Do a complete recursive sweep of directory hierarchy and update cumulative size of directories
|
||||
|
||||
uint64_t InternalFileHierarchyStorage::recursUpdateCumulatedSize(const DirectoryStorage::EntryIndex& dir_index)
|
||||
{
|
||||
DirEntry& d(*static_cast<DirEntry*>(mNodes[dir_index])) ;
|
||||
|
||||
uint64_t local_cumulative_size = 0;
|
||||
|
||||
for(uint32_t i=0;i<d.subfiles.size();++i)
|
||||
local_cumulative_size += static_cast<FileEntry*>(mNodes[d.subfiles[i]])->file_size;
|
||||
|
||||
for(uint32_t i=0;i<d.subdirs.size();++i)
|
||||
local_cumulative_size += recursUpdateCumulatedSize(d.subdirs[i]);
|
||||
|
||||
d.dir_cumulated_size = local_cumulative_size;
|
||||
return local_cumulative_size;
|
||||
}
|
||||
// Do a complete recursive sweep over sub-directories and files, and update the lst modf TS. This could be also performed by a cleanup method.
|
||||
|
||||
rstime_t InternalFileHierarchyStorage::recursUpdateLastModfTime(const DirectoryStorage::EntryIndex& dir_index,bool& unfinished_files_present)
|
||||
@ -1199,6 +1216,8 @@ bool InternalFileHierarchyStorage::load(const std::string& fname)
|
||||
if(!check(err_str))
|
||||
std::cerr << "(EE) Error while loading file hierarchy " << fname << std::endl;
|
||||
|
||||
recursUpdateCumulatedSize(mRoot);
|
||||
|
||||
return true ;
|
||||
}
|
||||
catch(read_error& e)
|
||||
|
@ -63,7 +63,7 @@ public:
|
||||
class DirEntry: public FileStorageNode
|
||||
{
|
||||
public:
|
||||
explicit DirEntry(const std::string& name) : dir_name(name), dir_modtime(0),dir_most_recent_time(0),dir_update_time(0) {}
|
||||
explicit DirEntry(const std::string& name) : dir_name(name), dir_cumulated_size(0), dir_modtime(0),dir_most_recent_time(0),dir_update_time(0) {}
|
||||
virtual ~DirEntry() {}
|
||||
|
||||
virtual uint32_t type() const { return FileStorageNode::TYPE_DIR ; }
|
||||
@ -72,6 +72,7 @@ public:
|
||||
std::string dir_name ;
|
||||
std::string dir_parent_path ;
|
||||
RsFileHash dir_hash ;
|
||||
uint64_t dir_cumulated_size;
|
||||
|
||||
std::vector<DirectoryStorage::EntryIndex> subdirs ;
|
||||
std::vector<DirectoryStorage::EntryIndex> subfiles ;
|
||||
@ -108,6 +109,10 @@ public:
|
||||
|
||||
rstime_t recursUpdateLastModfTime(const DirectoryStorage::EntryIndex& dir_index, bool &unfinished_files_present);
|
||||
|
||||
// Do a complete recursive sweep over sub-directories and files, and update the cumulative size.
|
||||
|
||||
uint64_t recursUpdateCumulatedSize(const DirectoryStorage::EntryIndex& dir_index);
|
||||
|
||||
// hash stuff
|
||||
|
||||
bool getDirHashFromIndex(const DirectoryStorage::EntryIndex& index,RsFileHash& hash) const ;
|
||||
|
@ -235,7 +235,7 @@ bool DirectoryStorage::extractData(const EntryIndex& indx,DirDetails& d)
|
||||
|
||||
d.type = DIR_TYPE_DIR;
|
||||
d.hash.clear() ;
|
||||
d.count = dir_entry->subdirs.size() + dir_entry->subfiles.size();
|
||||
d.size = dir_entry->dir_cumulated_size;//dir_entry->subdirs.size() + dir_entry->subfiles.size();
|
||||
d.max_mtime = dir_entry->dir_most_recent_time ;
|
||||
d.mtime = dir_entry->dir_modtime ;
|
||||
d.name = dir_entry->dir_name;
|
||||
@ -253,7 +253,7 @@ bool DirectoryStorage::extractData(const EntryIndex& indx,DirDetails& d)
|
||||
const InternalFileHierarchyStorage::FileEntry *file_entry = mFileHierarchy->getFileEntry(indx) ;
|
||||
|
||||
d.type = DIR_TYPE_FILE;
|
||||
d.count = file_entry->file_size;
|
||||
d.size = file_entry->file_size;
|
||||
d.max_mtime = file_entry->file_modtime ;
|
||||
d.name = file_entry->file_name;
|
||||
d.hash = file_entry->file_hash;
|
||||
@ -292,6 +292,8 @@ void DirectoryStorage::checkSave()
|
||||
|
||||
if(mChanged && mLastSavedTime + MIN_INTERVAL_BETWEEN_REMOTE_DIRECTORY_SAVE < now)
|
||||
{
|
||||
mFileHierarchy->recursUpdateCumulatedSize(mFileHierarchy->mRoot);
|
||||
|
||||
{
|
||||
RS_STACK_MUTEX(mDirStorageMtx) ;
|
||||
locked_check();
|
||||
@ -585,7 +587,7 @@ bool LocalDirectoryStorage::getFileInfo(DirectoryStorage::EntryIndex i,FileInfo&
|
||||
info.path = d.path + "/" + d.name;
|
||||
info.fname = d.name;
|
||||
info.hash = d.hash;
|
||||
info.size = d.count;
|
||||
info.size = d.size;
|
||||
|
||||
// all this stuff below is not useful in this case.
|
||||
|
||||
|
@ -224,7 +224,7 @@ void LocalDirectoryUpdater::recursUpdateSharedDir(const std::string& cumulated_p
|
||||
{
|
||||
some_files_not_ready = true ;
|
||||
|
||||
std::cerr << "(WW) file " << dirIt.file_fullpath() << " is probably being modified. Keeping it for later." << std::endl;
|
||||
std::cerr << "(WW) file " << dirIt.file_fullpath() << " is probably being written to. Keeping it for later." << std::endl;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -138,7 +138,7 @@ void RsFileTree::recurs_buildFileTree(
|
||||
{
|
||||
FileData f ;
|
||||
f.name = dd2.name ;
|
||||
f.size = dd2.count ;
|
||||
f.size = dd2.size ;
|
||||
f.hash = dd2.hash ;
|
||||
|
||||
ft.mDirs[index].subfiles.push_back(ft.mFiles.size()) ;
|
||||
@ -186,7 +186,7 @@ std::unique_ptr<RsFileTree> RsFileTree::fromDirDetails(
|
||||
if(dd.type == DIR_TYPE_FILE)
|
||||
{
|
||||
FileData fd;
|
||||
fd.name = dd.name; fd.hash = dd.hash; fd.size = dd.count;
|
||||
fd.name = dd.name; fd.hash = dd.hash; fd.size = dd.size;
|
||||
ft->mFiles.push_back(fd);
|
||||
ft->mTotalFiles = 1;
|
||||
ft->mTotalSize = fd.size;
|
||||
|
@ -1004,7 +1004,7 @@ void p3FileDatabase::getExtraFilesDirDetails(void *ref,DirectoryStorage::EntryIn
|
||||
d.prow = 0;//fi-1 ;
|
||||
d.type = DIR_TYPE_PERSON;
|
||||
d.hash.clear() ;
|
||||
d.count = mExtraFilesCache.size();
|
||||
d.size = mExtraFilesCache.size();
|
||||
d.max_mtime = time(NULL);
|
||||
d.mtime = time(NULL);
|
||||
d.name = "[Extra List]";
|
||||
@ -1029,7 +1029,7 @@ void p3FileDatabase::getExtraFilesDirDetails(void *ref,DirectoryStorage::EntryIn
|
||||
FileInfo& f(mExtraFilesCache[(int)e-1]) ;
|
||||
|
||||
d.hash = f.hash;
|
||||
d.count = f.size;
|
||||
d.size = f.size;
|
||||
d.max_mtime = 0; // this is irrelevant
|
||||
d.mtime = 0; // this is irrelevant
|
||||
d.name = f.path; // so that the UI shows the complete path, since the parent directory is not really a directory.
|
||||
@ -1116,7 +1116,7 @@ int p3FileDatabase::RequestDirDetails(void *ref, DirDetails& d, FileSearchFlags
|
||||
d.children.push_back(stub);
|
||||
}
|
||||
|
||||
d.count = d.children.size();
|
||||
d.size = 0; // non documented
|
||||
|
||||
#ifdef DEBUG_FILE_HIERARCHY
|
||||
P3FILELISTS_DEBUG() << "ExtractData: ref=" << ref << ", flags=" << flags << " : returning this: " << std::endl;
|
||||
|
@ -22,25 +22,40 @@
|
||||
|
||||
//
|
||||
// This class is responsible for
|
||||
// - maintaining a list of shared file hierarchies for each known friends
|
||||
// - talking to the GUI
|
||||
// - providing handles for the directory tree listing GUI
|
||||
// - providing search handles for FT
|
||||
// - keeping these lists up to date
|
||||
// - sending our own file list to friends depending on the defined access rights
|
||||
// - serving file search requests from other services such as file transfer
|
||||
// - maintaining a list of shared file hierarchies for each known friends
|
||||
// - talking to the GUI
|
||||
// - providing handles for the directory tree listing GUI
|
||||
// - providing search handles for FT
|
||||
// - keeping these lists up to date
|
||||
// - sending our own file list to friends depending on the defined access rights
|
||||
// - serving file search requests from other services such as file transfer
|
||||
//
|
||||
// p3FileList does the following micro-tasks:
|
||||
// - tick the watchers
|
||||
// - get incoming info from the service layer, which can be:
|
||||
// - directory content request => the directory content is shared to the friend
|
||||
// - directory content => the directory watcher is notified
|
||||
// - keep two queues of update requests:
|
||||
// - fast queue that is handled in highest priority. This one is used for e.g. updating while browsing.
|
||||
// - slow queue that is handled slowly. Used in background update of shared directories.
|
||||
// p3FileList does the following micro-tasks:
|
||||
// - tick the watchers
|
||||
// - get incoming info from the service layer, which can be:
|
||||
// - directory content request => the directory content is shared to the friend
|
||||
// - directory content => the directory watcher is notified
|
||||
// - keep two queues of update requests:
|
||||
// - fast queue that is handled in highest priority. This one is used for e.g. updating while browsing.
|
||||
// - slow queue that is handled slowly. Used in background update of shared directories.
|
||||
//
|
||||
// The file lists are not directry updated. A FileListWatcher class is responsible for this
|
||||
// in every case.
|
||||
// The list of local shared files is maintained by FileListWatcher.
|
||||
//
|
||||
// p3FileLists is organised as follows:
|
||||
//
|
||||
// p3FileDatabase
|
||||
// |
|
||||
// +---- HashStorage // Handles known hashes. Serves as a reference when new files are hashed.
|
||||
// |
|
||||
// +---- RemoteDirectoryStorage // Stores the list of shared files at friends
|
||||
// | |
|
||||
// | +---- InternalFileHierarchyStorage
|
||||
// |
|
||||
// +---- LocalDirectoryStorage // Stores the list of locally shared files
|
||||
// | |
|
||||
// | +---- InternalFileHierarchyStorage
|
||||
// |
|
||||
// +---- LocalDirectoryUpdater // Keeps the local lists up to date, by regularly crawling directories
|
||||
//
|
||||
#pragma once
|
||||
|
||||
|
@ -2283,7 +2283,7 @@ std::error_condition ftServer::exportFileLink(
|
||||
tDirDet.type = DIR_TYPE_FILE;
|
||||
tDirDet.name = fileName;
|
||||
tDirDet.hash = fileHash;
|
||||
tDirDet.count = fileSize;
|
||||
tDirDet.size = fileSize;
|
||||
|
||||
return dirDetailsToLink(link, tDirDet, fragSneak, baseUrl);
|
||||
}
|
||||
@ -2308,7 +2308,7 @@ std::error_condition ftServer::parseFilesLink(
|
||||
dt.name = *tUrl.getQueryV("name");
|
||||
try
|
||||
{
|
||||
dt.count = std::stoull(*tUrl.getQueryV("size"));
|
||||
dt.size = std::stoull(*tUrl.getQueryV("size"));
|
||||
std::unique_ptr<RsFileTree> ft;
|
||||
if( !dt.hash.isNull() &&
|
||||
(ft = RsFileTree::fromDirDetails(dt, true)) )
|
||||
|
@ -300,7 +300,7 @@ struct DirStub : RsSerializable
|
||||
struct DirDetails : RsSerializable
|
||||
{
|
||||
DirDetails() : parent(nullptr), prow(0), ref(nullptr),
|
||||
type(DIR_TYPE_UNKNOWN), count(0), mtime(0), max_mtime(0) {}
|
||||
type(DIR_TYPE_UNKNOWN), size(0), mtime(0), max_mtime(0) {}
|
||||
|
||||
|
||||
/* G10h4ck do we still need to keep this as void* instead of uint64_t for
|
||||
@ -318,7 +318,7 @@ struct DirDetails : RsSerializable
|
||||
std::string name;
|
||||
RsFileHash hash;
|
||||
std::string path; // full path of the parent directory, when it is a file; full path of the dir otherwise.
|
||||
uint64_t count;
|
||||
uint64_t size; // total size of directory, or size of the file.
|
||||
uint32_t mtime; // file/directory modification time, according to what the system reports
|
||||
FileStorageFlags flags;
|
||||
uint32_t max_mtime ; // maximum modification time of the whole hierarchy below.
|
||||
@ -347,7 +347,7 @@ struct DirDetails : RsSerializable
|
||||
RS_SERIAL_PROCESS(name);
|
||||
RS_SERIAL_PROCESS(hash);
|
||||
RS_SERIAL_PROCESS(path);
|
||||
RS_SERIAL_PROCESS(count);
|
||||
RS_SERIAL_PROCESS(size);
|
||||
RS_SERIAL_PROCESS(mtime);
|
||||
RS_SERIAL_PROCESS(flags);
|
||||
RS_SERIAL_PROCESS(max_mtime);
|
||||
|
@ -1984,7 +1984,7 @@ void RsTurtleStringSearchRequestItem::search(std::list<TurtleFileInfo>& result)
|
||||
|
||||
TurtleFileInfo i ;
|
||||
i.hash = it->hash ;
|
||||
i.size = it->count ;
|
||||
i.size = it->size ;
|
||||
i.name = it->name ;
|
||||
|
||||
result.push_back(i) ;
|
||||
@ -2022,7 +2022,7 @@ void RsTurtleRegExpSearchRequestItem::search(std::list<TurtleFileInfo>& result)
|
||||
}
|
||||
TurtleFileInfo i ;
|
||||
i.hash = it->hash ;
|
||||
i.size = it->count ;
|
||||
i.size = it->size ;
|
||||
i.name = it->name ;
|
||||
|
||||
result.push_back(i) ;
|
||||
|
@ -479,7 +479,7 @@ void SearchDialog::collCreate()
|
||||
DirDetails details;
|
||||
details.name = name;
|
||||
details.hash = hash;
|
||||
details.count = count;
|
||||
details.size = count;
|
||||
details.type = DIR_TYPE_FILE;
|
||||
|
||||
dirVec.push_back(details);
|
||||
@ -1010,8 +1010,8 @@ void SearchDialog::insertDirectory(const QString &txt, qulonglong searchId, cons
|
||||
|
||||
child->setText(SR_NAME_COL, QString::fromUtf8(dir.name.c_str()));
|
||||
child->setText(SR_HASH_COL, QString::fromStdString(dir.hash.toStdString()));
|
||||
child->setText(SR_SIZE_COL, QString::number(dir.count));
|
||||
child->setData(SR_SIZE_COL, ROLE_SORT, (qulonglong) dir.count);
|
||||
child->setText(SR_SIZE_COL, QString::number(dir.size));
|
||||
child->setData(SR_SIZE_COL, ROLE_SORT, (qulonglong) dir.size);
|
||||
child->setText(SR_AGE_COL, QString::number(dir.mtime));
|
||||
child->setData(SR_AGE_COL, ROLE_SORT, dir.mtime);
|
||||
child->setTextAlignment( SR_SIZE_COL, Qt::AlignRight );
|
||||
@ -1036,8 +1036,8 @@ void SearchDialog::insertDirectory(const QString &txt, qulonglong searchId, cons
|
||||
child->setIcon(SR_NAME_COL, QIcon(IMAGE_DIRECTORY));
|
||||
child->setText(SR_NAME_COL, QString::fromUtf8(dir.name.c_str()));
|
||||
child->setText(SR_HASH_COL, QString::fromStdString(dir.hash.toStdString()));
|
||||
child->setText(SR_SIZE_COL, QString::number(dir.count));
|
||||
child->setData(SR_SIZE_COL, ROLE_SORT, (qulonglong) dir.count);
|
||||
child->setText(SR_SIZE_COL, QString::number(dir.size));
|
||||
child->setData(SR_SIZE_COL, ROLE_SORT, (qulonglong) dir.size);
|
||||
child->setText(SR_AGE_COL, QString::number(dir.mtime));
|
||||
child->setData(SR_AGE_COL, ROLE_SORT, dir.mtime);
|
||||
child->setTextAlignment( SR_SIZE_COL, Qt::AlignRight );
|
||||
@ -1105,8 +1105,8 @@ void SearchDialog::insertDirectory(const QString &txt, qulonglong searchId, cons
|
||||
child->setIcon(SR_NAME_COL, QIcon(IMAGE_DIRECTORY));
|
||||
child->setText(SR_NAME_COL, QString::fromUtf8(dir.name.c_str()));
|
||||
child->setText(SR_HASH_COL, QString::fromStdString(dir.hash.toStdString()));
|
||||
child->setText(SR_SIZE_COL, QString::number(dir.count));
|
||||
child->setData(SR_SIZE_COL, ROLE_SORT, (qulonglong) dir.count);
|
||||
child->setText(SR_SIZE_COL, QString::number(dir.size));
|
||||
child->setData(SR_SIZE_COL, ROLE_SORT, (qulonglong) dir.size);
|
||||
child->setText(SR_AGE_COL, QString::number(dir.max_mtime));
|
||||
child->setData(SR_AGE_COL, ROLE_SORT, dir.max_mtime);
|
||||
child->setTextAlignment( SR_SIZE_COL, Qt::AlignRight );
|
||||
@ -1389,7 +1389,7 @@ void SearchDialog::resultsToTree(const QString& txt,qulonglong searchId, const s
|
||||
fd.name = it->name;
|
||||
fd.hash = it->hash;
|
||||
fd.path = it->path;
|
||||
fd.size = it->count;
|
||||
fd.size = it->size;
|
||||
fd.age = it->mtime;
|
||||
fd.rank = 0;
|
||||
|
||||
|
@ -655,7 +655,7 @@ void SharedFilesDialog::copyLinks(const QModelIndexList& lst, bool remote,QList<
|
||||
}
|
||||
else
|
||||
name = QString::fromUtf8(details.name.c_str());
|
||||
RetroShareLink link = RetroShareLink::createFile(name, details.count, details.hash.toStdString().c_str());
|
||||
RetroShareLink link = RetroShareLink::createFile(name, details.size, details.hash.toStdString().c_str());
|
||||
if (link.valid()) {
|
||||
urls.push_back(link) ;
|
||||
}
|
||||
|
@ -2468,7 +2468,7 @@ void TransfersDialog::collCreate()
|
||||
DirDetails details;
|
||||
details.name = info.fname;
|
||||
details.hash = info.hash;
|
||||
details.count = info.size;
|
||||
details.size = info.size;
|
||||
details.type = DIR_TYPE_FILE;
|
||||
|
||||
dirVec.push_back(details);
|
||||
|
@ -203,10 +203,10 @@ bool TreeStyle_RDM::hasChildren(const QModelIndex &parent) const
|
||||
}
|
||||
/* PERSON/DIR*/
|
||||
#ifdef RDM_DEBUG
|
||||
std::cerr << "lookup PER/DIR #" << details.count;
|
||||
std::cerr << "lookup PER/DIR #" << details.size;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
return (details.count > 0); /* do we have children? */
|
||||
return (details.children.size() > 0); /* do we have children? */
|
||||
}
|
||||
bool FlatStyle_RDM::hasChildren(const QModelIndex &parent) const
|
||||
{
|
||||
@ -262,7 +262,7 @@ int TreeStyle_RDM::rowCount(const QModelIndex &parent) const
|
||||
|
||||
/* else PERSON/DIR*/
|
||||
#ifdef RDM_DEBUG
|
||||
std::cerr << "lookup PER/DIR #" << details.count;
|
||||
std::cerr << "lookup PER/DIR #" << details.size;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
if ((details.type == DIR_TYPE_ROOT) && !_showEmpty && RemoteMode)
|
||||
@ -271,14 +271,14 @@ int TreeStyle_RDM::rowCount(const QModelIndex &parent) const
|
||||
//Scan all children to know if they are empty.
|
||||
//And save their real row index
|
||||
//Prefer do like that than modify requestDirDetails with a new flag (rsFiles->RequestDirDetails)
|
||||
for(uint64_t i = 0; i < details.count; ++i)
|
||||
for(uint64_t i = 0; i < details.children.size(); ++i)
|
||||
{
|
||||
if (requestDirDetails(details.children[i].ref, RemoteMode,childDetails) && (childDetails.count > 0))
|
||||
if (requestDirDetails(details.children[i].ref, RemoteMode,childDetails) && (childDetails.children.size() > 0))
|
||||
_parentRow.push_back(i);
|
||||
}
|
||||
return _parentRow.size();
|
||||
}
|
||||
return details.count;
|
||||
return details.children.size();
|
||||
}
|
||||
int FlatStyle_RDM::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
@ -505,7 +505,7 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
|
||||
else if(details.id == rsPeers->getOwnId())
|
||||
rsFiles->getSharedDirStatistics(rsPeers->getOwnId(),stats) ;
|
||||
else
|
||||
stats.total_number_of_files = details.count;
|
||||
stats.total_number_of_files = details.children.size();
|
||||
|
||||
if(stats.total_number_of_files > 0)
|
||||
{
|
||||
@ -552,7 +552,7 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
|
||||
case COLUMN_FILENB:
|
||||
return QVariant();
|
||||
case COLUMN_SIZE:
|
||||
return misc::friendlyUnit(details.count);
|
||||
return misc::friendlyUnit(details.size);
|
||||
case COLUMN_AGE:
|
||||
{
|
||||
if(details.type == DIR_TYPE_FILE)
|
||||
@ -584,14 +584,14 @@ QVariant TreeStyle_RDM::displayRole(const DirDetails& details,int coln) const
|
||||
return QString::fromUtf8(details.name.c_str());
|
||||
break;
|
||||
case COLUMN_FILENB:
|
||||
if (details.count > 1)
|
||||
if (details.children.size() > 1)
|
||||
{
|
||||
return QString::number(details.count) + " " + tr("Files");
|
||||
return QString::number(details.children.size()) + " " + tr("Files");
|
||||
}
|
||||
return QString::number(details.count) + " " + tr("File");
|
||||
return QString::number(details.children.size()) + " " + tr("File");
|
||||
case COLUMN_SIZE:
|
||||
return QVariant();
|
||||
case COLUMN_AGE:
|
||||
return misc::friendlyUnit(details.size);
|
||||
case COLUMN_AGE:
|
||||
return misc::timeRelativeToNow(details.max_mtime);
|
||||
case COLUMN_FRIEND_ACCESS:
|
||||
return QVariant();
|
||||
@ -652,7 +652,7 @@ QVariant FlatStyle_RDM::displayRole(const DirDetails& details,int coln) const
|
||||
{
|
||||
case COLUMN_NAME: return QString::fromUtf8(details.name.c_str());
|
||||
case COLUMN_FILENB: return QString();
|
||||
case COLUMN_SIZE: return misc::friendlyUnit(details.count);
|
||||
case COLUMN_SIZE: return misc::friendlyUnit(details.size);
|
||||
case COLUMN_AGE: return misc::timeRelativeToNow(details.max_mtime);
|
||||
case COLUMN_FRIEND_ACCESS: return QString::fromUtf8(rsPeers->getPeerName(details.id).c_str());
|
||||
case COLUMN_WN_VISU_DIR: return computeDirectoryPath(details);
|
||||
@ -712,7 +712,7 @@ QVariant TreeStyle_RDM::sortRole(const QModelIndex& /*index*/,const DirDetails&
|
||||
case COLUMN_FILENB:
|
||||
return (qulonglong) 0;
|
||||
case COLUMN_SIZE:
|
||||
return (qulonglong) details.count;
|
||||
return (qulonglong) details.size;
|
||||
case COLUMN_AGE:
|
||||
return details.max_mtime;
|
||||
case COLUMN_FRIEND_ACCESS:
|
||||
@ -735,7 +735,7 @@ QVariant TreeStyle_RDM::sortRole(const QModelIndex& /*index*/,const DirDetails&
|
||||
case COLUMN_NAME:
|
||||
return QString::fromUtf8(details.name.c_str());
|
||||
case COLUMN_FILENB:
|
||||
return (qulonglong) details.count;
|
||||
return (qulonglong) details.children.size();
|
||||
case COLUMN_SIZE:
|
||||
return (qulonglong) 0;
|
||||
case COLUMN_AGE:
|
||||
@ -762,7 +762,7 @@ QVariant FlatStyle_RDM::sortRole(const QModelIndex& /*index*/,const DirDetails&
|
||||
{
|
||||
case COLUMN_NAME: return QString::fromUtf8(details.name.c_str());
|
||||
case COLUMN_FILENB: return (qulonglong) 0;
|
||||
case COLUMN_SIZE: return (qulonglong) details.count;
|
||||
case COLUMN_SIZE: return (qulonglong) details.size;
|
||||
case COLUMN_AGE: return details.max_mtime;
|
||||
case COLUMN_FRIEND_ACCESS: return QString::fromUtf8(rsPeers->getPeerName(details.id).c_str());
|
||||
case COLUMN_WN_VISU_DIR: {
|
||||
@ -1287,8 +1287,7 @@ void RetroshareDirModel::downloadSelected(const QModelIndexList &list,bool inter
|
||||
std::cerr << std::endl;
|
||||
std::list<RsPeerId> srcIds;
|
||||
srcIds.push_back(details.id);
|
||||
rsFiles -> FileRequest(details.name, details.hash,
|
||||
details.count, "", RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds);
|
||||
rsFiles -> FileRequest(details.name, details.hash, details.size, "", RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds);
|
||||
}
|
||||
/* if it is a dir, copy all files included*/
|
||||
else if (details.type == DIR_TYPE_DIR)
|
||||
@ -1309,7 +1308,7 @@ void RetroshareDirModel::downloadDirectory(const DirDetails & dirDetails, int pr
|
||||
QString cleanPath = QDir::cleanPath(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str()) + "/" + QString::fromUtf8(dirDetails.path.substr(prefixLen).c_str()));
|
||||
|
||||
srcIds.push_back(dirDetails.id);
|
||||
rsFiles->FileRequest(dirDetails.name, dirDetails.hash, dirDetails.count, cleanPath.toUtf8().constData(), RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds);
|
||||
rsFiles->FileRequest(dirDetails.name, dirDetails.hash, dirDetails.size, cleanPath.toUtf8().constData(), RS_FILE_REQ_ANONYMOUS_ROUTING, srcIds);
|
||||
}
|
||||
else if (dirDetails.type & DIR_TYPE_DIR)
|
||||
{
|
||||
@ -1394,7 +1393,7 @@ void RetroshareDirModel::getFileInfoFromIndexList(const QModelIndexList& list, s
|
||||
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 << "Size: " << details.size << std::endl;
|
||||
std::cerr << "Path: " << details.path << std::endl;
|
||||
#endif
|
||||
// Note: for directories, the returned hash, is the peer id, so if we collect
|
||||
@ -1592,7 +1591,7 @@ QMimeData * RetroshareDirModel::mimeData ( const QModelIndexList & indexes ) con
|
||||
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 << "Size: " << details.size << std::endl;
|
||||
std::cerr << "Path: " << details.path << std::endl;
|
||||
#endif
|
||||
|
||||
@ -1612,9 +1611,8 @@ QMimeData * RetroshareDirModel::mimeData ( const QModelIndexList & indexes ) con
|
||||
continue; /* duplicate */
|
||||
}
|
||||
|
||||
drags[details.hash] = details.count;
|
||||
|
||||
QString line = QString("%1/%2/%3/").arg(QString::fromUtf8(details.name.c_str()), QString::fromStdString(details.hash.toStdString()), QString::number(details.count));
|
||||
drags[details.hash] = details.children.size();
|
||||
QString line = QString("%1/%2/%3/").arg(QString::fromUtf8(details.name.c_str()), QString::fromStdString(details.hash.toStdString()), QString::number(details.size));
|
||||
|
||||
if (RemoteMode)
|
||||
{
|
||||
|
@ -221,7 +221,7 @@ void RsCollection::recursAddElements(QDomDocument& doc,const DirDetails& details
|
||||
|
||||
f.setAttribute(QString("name"),QString::fromUtf8(details.name.c_str())) ;
|
||||
f.setAttribute(QString("sha1"),QString::fromStdString(details.hash.toStdString())) ;
|
||||
f.setAttribute(QString("size"),QString::number(details.count)) ;
|
||||
f.setAttribute(QString("size"),QString::number(details.size)) ;
|
||||
|
||||
e.appendChild(f) ;
|
||||
}
|
||||
|
@ -203,7 +203,7 @@ void CreateGxsChannelMsg::pasteLink()
|
||||
{
|
||||
std::cerr << "Pasting links: " << std::endl;
|
||||
|
||||
QList<RetroShareLink> links,not_have ;
|
||||
QList<RetroShareLink> links;
|
||||
RSLinkClipboard::pasteLinks(links) ;
|
||||
|
||||
for(QList<RetroShareLink>::const_iterator it(links.begin());it!=links.end();++it)
|
||||
@ -217,14 +217,19 @@ void CreateGxsChannelMsg::pasteLink()
|
||||
FileInfo info ;
|
||||
RsFileHash hash( (*it).hash().toStdString()) ;
|
||||
|
||||
#ifdef TO_REMOVE
|
||||
if(rsFiles->alreadyHaveFile( hash,info ) )
|
||||
addAttachment(hash, (*it).name().toUtf8().constData(), (*it).size(), true, RsPeerId()) ;
|
||||
else
|
||||
not_have.push_back( *it ) ;
|
||||
}
|
||||
#endif
|
||||
addAttachment(hash, (*it).name().toUtf8().constData(), (*it).size(), rsFiles->alreadyHaveFile( hash,info ), RsPeerId()) ;
|
||||
#ifdef TO_REMOVE
|
||||
else
|
||||
not_have.push_back( *it ) ;
|
||||
#endif
|
||||
}
|
||||
|
||||
if(!not_have.empty())
|
||||
{
|
||||
#ifdef TO_REMOVE
|
||||
if(!not_have.empty())
|
||||
{
|
||||
QString msg = tr("You are about to add files you're not actually sharing. Do you still want this to happen?")+"<br><br>" ;
|
||||
|
||||
for(QList<RetroShareLink>::const_iterator it(not_have.begin());it!=not_have.end();++it)
|
||||
@ -233,7 +238,8 @@ void CreateGxsChannelMsg::pasteLink()
|
||||
if(QMessageBox::YesToAll == QMessageBox::question(NULL,tr("About to post un-owned files to a channel."),msg,QMessageBox::YesToAll | QMessageBox::No))
|
||||
for(QList<RetroShareLink>::const_iterator it(not_have.begin());it!=not_have.end();++it)
|
||||
addAttachment(RsFileHash((*it).hash().toStdString()), (*it).name().toUtf8().constData(), (*it).size(), false, RsPeerId()) ;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Dropping */
|
||||
@ -325,7 +331,7 @@ void CreateGxsChannelMsg::dropEvent(QDropEvent *event)
|
||||
QMessageBox mb(tr("Drop file error."), tr("Directory can't be dropped, only files are accepted."),QMessageBox::Information,QMessageBox::Ok,0,0,this);
|
||||
mb.exec();
|
||||
} else if (QFile::exists(localpath)) {
|
||||
addAttachment(localpath.toUtf8().constData());
|
||||
addAttachment(localpath.toUtf8().constData());
|
||||
} else {
|
||||
std::cerr << "CreateGxsChannelMsg::dropEvent() file does not exists."<< std::endl;
|
||||
QMessageBox mb(tr("Drop file error."), tr("File not found or file name not accepted."),QMessageBox::Information,QMessageBox::Ok,0,0,this);
|
||||
@ -520,7 +526,7 @@ void CreateGxsChannelMsg::addHtmlText(const QString& text)
|
||||
RichTextEditWidget->setText(text) ;
|
||||
}
|
||||
|
||||
void CreateGxsChannelMsg::addAttachment(const std::string &path)
|
||||
bool CreateGxsChannelMsg::addAttachment(const std::string &path)
|
||||
{
|
||||
/* add a SubFileItem to the attachment section */
|
||||
#ifdef DEBUG_CREATE_GXS_MSG
|
||||
@ -540,13 +546,12 @@ void CreateGxsChannelMsg::addAttachment(const std::string &path)
|
||||
for(it= mAttachments.begin(); it != mAttachments.end(); ++it){
|
||||
|
||||
if((*it)->FilePath() == path){
|
||||
QMessageBox::warning(this, tr("RetroShare"), tr("File already Added and Hashed"), QMessageBox::Ok, QMessageBox::Ok);
|
||||
QMessageBox::warning(this, tr("RetroShare"), tr("This file already in this post:")+"<br/>"+QString::fromStdString(path), QMessageBox::Ok, QMessageBox::Ok);
|
||||
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
FileInfo fInfo;
|
||||
std::string filename = RsDirUtil::getTopDir(path);
|
||||
uint64_t size = 0;
|
||||
RsFileHash hash ;
|
||||
@ -570,7 +575,7 @@ void CreateGxsChannelMsg::addAttachment(const std::string &path)
|
||||
|
||||
updateAttachmentCount();
|
||||
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CreateGxsChannelMsg::setThumbNail(const std::string& path, int frame){
|
||||
@ -724,32 +729,55 @@ void CreateGxsChannelMsg::sendMsg()
|
||||
std::string msg = std::string(text.toUtf8());
|
||||
|
||||
std::list<RsGxsFile> files;
|
||||
std::list<RsGxsFile> missing_files;
|
||||
std::list<RsGxsFile> files_only_extra;
|
||||
|
||||
std::list<SubFileItem *>::iterator fit;
|
||||
|
||||
for(fit = mAttachments.begin(); fit != mAttachments.end(); ++fit)
|
||||
{
|
||||
if (!(*fit)->isHidden())
|
||||
for(auto fit :mAttachments)
|
||||
if (!fit->isHidden())
|
||||
{
|
||||
RsGxsFile fi;
|
||||
fi.mHash = (*fit)->FileHash();
|
||||
fi.mName = (*fit)->FileName();
|
||||
fi.mSize = (*fit)->FileSize();
|
||||
fi.mHash = fit->FileHash();
|
||||
fi.mName = fit->FileName();
|
||||
fi.mSize = fit->FileSize();
|
||||
|
||||
files.push_back(fi);
|
||||
|
||||
/* commence downloads - if we don't have the file */
|
||||
/* if we don't have the file, display info about it */
|
||||
|
||||
if (!(*fit)->done())
|
||||
{
|
||||
if ((*fit)->ready())
|
||||
{
|
||||
(*fit)->download();
|
||||
}
|
||||
// Skips unhashed files.
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!fit->done() && fit->ready()) // Skips unhashed files.
|
||||
missing_files.push_back(fi);
|
||||
|
||||
FileInfo finfo;
|
||||
bool extra = rsFiles->FileDetails(fi.mHash, RS_FILE_HINTS_EXTRA | RS_FILE_HINTS_SPEC_ONLY, finfo );
|
||||
bool local = rsFiles->FileDetails(fi.mHash, RS_FILE_HINTS_LOCAL | RS_FILE_HINTS_SPEC_ONLY, finfo );
|
||||
|
||||
if(extra && !local)
|
||||
files_only_extra.push_back(fi);
|
||||
}
|
||||
|
||||
if(!missing_files.empty())
|
||||
{
|
||||
QString filesstr = "<br/>";
|
||||
|
||||
for(auto& file: missing_files)
|
||||
filesstr += "<br/>" /*+QString::fromStdString(file.mHash.toStdString()) + " "*/ + QString::fromStdString(file.mName) ;
|
||||
|
||||
if(QMessageBox::Cancel == QMessageBox::warning(nullptr,tr("Post refers to non shared files"),
|
||||
tr("This post contains files that you are currently not sharing. Do you still want to post?")+filesstr,QMessageBox::Ok,QMessageBox::Cancel))
|
||||
return;
|
||||
}
|
||||
if(!files_only_extra.empty())
|
||||
{
|
||||
QString filesstr = "<br/>";
|
||||
|
||||
for(auto& file: files_only_extra)
|
||||
filesstr += "<br/>" /*+QString::fromStdString(file.mHash.toStdString()) + " "*/ + QString::fromStdString(file.mName) ;
|
||||
|
||||
QMessageBox::information(nullptr,
|
||||
tr("Post refers to temporary shared files"),
|
||||
tr("The following files will only be shared for 30 days. Think about adding them to a shared directory.")
|
||||
+filesstr);
|
||||
}
|
||||
|
||||
sendMessage(subject, msg, files);
|
||||
}
|
||||
|
@ -44,8 +44,10 @@ public:
|
||||
void reject() override;
|
||||
|
||||
void addHtmlText(const QString& text) ;
|
||||
void addSubject(const QString& text) ;
|
||||
void addAttachment(const std::string &path);
|
||||
void addSubject(const QString& text) ;
|
||||
|
||||
// adds a file to be hashed and shared. Returns false if something goes wrong.
|
||||
bool addAttachment(const std::string &path);
|
||||
void addAttachment(const RsFileHash &hash, const std::string &fname, uint64_t size, bool local, const RsPeerId &srcId,bool assume_file_ready = false);
|
||||
|
||||
void newChannelMsg();
|
||||
|
@ -831,7 +831,7 @@ void MessageComposer::setFileList(const std::list<DirDetails>& dir_info)
|
||||
FileInfo info ;
|
||||
info.fname = it->name ;
|
||||
info.hash = it->hash ;
|
||||
info.size = it->count ;
|
||||
info.size = it->size ;
|
||||
files_info.push_back(info) ;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user