mirror of
https://github.com/nextcloud/desktop.git
synced 2024-10-28 07:54:49 +03:00
parent
62ded39416
commit
3b60f6e238
5 changed files with 70 additions and 3 deletions
|
@ -129,6 +129,13 @@ void OcsShareJob::createShare(const QString& path,
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OcsShareJob::getSharedWithMe()
|
||||||
|
{
|
||||||
|
setVerb("GET");
|
||||||
|
addParam(QLatin1String("shared_with_me"), QLatin1String("true"));
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
void OcsShareJob::jobDone(QVariantMap reply)
|
void OcsShareJob::jobDone(QVariantMap reply)
|
||||||
{
|
{
|
||||||
emit shareJobFinished(reply, _value);
|
emit shareJobFinished(reply, _value);
|
||||||
|
|
|
@ -103,6 +103,11 @@ public:
|
||||||
const QString& shareWith = "",
|
const QString& shareWith = "",
|
||||||
const Share::Permissions permissions = Share::PermissionRead);
|
const Share::Permissions permissions = Share::PermissionRead);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns information on the items shared with the current user.
|
||||||
|
*/
|
||||||
|
void getSharedWithMe();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
/**
|
/**
|
||||||
* Result of the OCS request
|
* Result of the OCS request
|
||||||
|
|
|
@ -17,6 +17,17 @@
|
||||||
|
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
struct CreateShare
|
||||||
|
{
|
||||||
|
QString path;
|
||||||
|
OCC::Share::ShareType shareType;
|
||||||
|
QString shareWith;
|
||||||
|
OCC::Share::Permissions permissions;
|
||||||
|
};
|
||||||
|
} // anonymous namespace
|
||||||
|
Q_DECLARE_METATYPE(CreateShare)
|
||||||
|
|
||||||
namespace OCC {
|
namespace OCC {
|
||||||
|
|
||||||
Share::Share(AccountPtr account,
|
Share::Share(AccountPtr account,
|
||||||
|
@ -212,15 +223,57 @@ void ShareManager::slotLinkShareCreated(const QVariantMap &reply)
|
||||||
emit linkShareCreated(share);
|
emit linkShareCreated(share);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ShareManager::createShare(const QString& path,
|
void ShareManager::createShare(const QString& path,
|
||||||
const Share::ShareType shareType,
|
const Share::ShareType shareType,
|
||||||
const QString shareWith,
|
const QString shareWith,
|
||||||
const Share::Permissions permissions)
|
const Share::Permissions permissions)
|
||||||
{
|
{
|
||||||
|
auto job = new OcsShareJob(_account);
|
||||||
|
|
||||||
|
// Store values that we need for creating this share later.
|
||||||
|
CreateShare continuation;
|
||||||
|
continuation.path = path;
|
||||||
|
continuation.shareType = shareType;
|
||||||
|
continuation.shareWith = shareWith;
|
||||||
|
continuation.permissions = permissions;
|
||||||
|
_jobContinuation[job] = QVariant::fromValue(continuation);
|
||||||
|
|
||||||
|
connect(job, SIGNAL(shareJobFinished(QVariantMap,QVariant)), SLOT(slotCreateShare(QVariantMap)));
|
||||||
|
connect(job, SIGNAL(ocsError(int,QString)), SLOT(slotOcsError(int,QString)));
|
||||||
|
job->getSharedWithMe();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShareManager::slotCreateShare(const QVariantMap &reply)
|
||||||
|
{
|
||||||
|
if (!_jobContinuation.contains(sender()))
|
||||||
|
return;
|
||||||
|
|
||||||
|
CreateShare cont = _jobContinuation[sender()].value<CreateShare>();
|
||||||
|
if (cont.path.isEmpty())
|
||||||
|
return;
|
||||||
|
_jobContinuation.remove(sender());
|
||||||
|
|
||||||
|
// Find existing share permissions (if this was shared with us)
|
||||||
|
Share::Permissions existingPermissions = Share::PermissionDefault;
|
||||||
|
foreach (const QVariant & element, reply["ocs"].toMap()["data"].toList()) {
|
||||||
|
QVariantMap map = element.toMap();
|
||||||
|
if (map["file_target"] == cont.path)
|
||||||
|
existingPermissions = Share::Permissions(map["permissions"].toInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limit the permissions we request for a share to the ones the item
|
||||||
|
// was shared with initially.
|
||||||
|
if (cont.permissions == Share::PermissionDefault) {
|
||||||
|
cont.permissions = existingPermissions;
|
||||||
|
} else if (existingPermissions != Share::PermissionDefault) {
|
||||||
|
cont.permissions &= existingPermissions;
|
||||||
|
}
|
||||||
|
|
||||||
OcsShareJob *job = new OcsShareJob(_account);
|
OcsShareJob *job = new OcsShareJob(_account);
|
||||||
connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotShareCreated(QVariantMap)));
|
connect(job, SIGNAL(shareJobFinished(QVariantMap, QVariant)), SLOT(slotShareCreated(QVariantMap)));
|
||||||
connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString)));
|
connect(job, SIGNAL(ocsError(int, QString)), SLOT(slotOcsError(int, QString)));
|
||||||
job->createShare(path, shareType, shareWith, permissions);
|
job->createShare(cont.path, cont.shareType, cont.shareWith, cont.permissions);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShareManager::slotShareCreated(const QVariantMap &reply)
|
void ShareManager::slotShareCreated(const QVariantMap &reply)
|
||||||
|
|
|
@ -268,11 +268,13 @@ private slots:
|
||||||
void slotLinkShareCreated(const QVariantMap &reply);
|
void slotLinkShareCreated(const QVariantMap &reply);
|
||||||
void slotShareCreated(const QVariantMap &reply);
|
void slotShareCreated(const QVariantMap &reply);
|
||||||
void slotOcsError(int statusCode, const QString &message);
|
void slotOcsError(int statusCode, const QString &message);
|
||||||
|
void slotCreateShare(const QVariantMap &reply);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSharedPointer<LinkShare> parseLinkShare(const QVariantMap &data);
|
QSharedPointer<LinkShare> parseLinkShare(const QVariantMap &data);
|
||||||
QSharedPointer<Share> parseShare(const QVariantMap &data);
|
QSharedPointer<Share> parseShare(const QVariantMap &data);
|
||||||
|
|
||||||
|
QMap<QObject*, QVariant> _jobContinuation;
|
||||||
AccountPtr _account;
|
AccountPtr _account;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -386,7 +386,7 @@ void SocketApi::command_SHARE(const QString& localFile, QIODevice* socket)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString remotePath = shareFolder->remotePath() + QLatin1Char('/') + file;
|
const QString remotePath = QDir(shareFolder->remotePath()).filePath(file);
|
||||||
|
|
||||||
// Can't share root folder
|
// Can't share root folder
|
||||||
if (remotePath == "/") {
|
if (remotePath == "/") {
|
||||||
|
|
Loading…
Reference in a new issue