-
Notifications
You must be signed in to change notification settings - Fork 34
/
localstorage.cpp
172 lines (153 loc) · 4.79 KB
/
localstorage.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
* Copyright (c) 2018 Sylvain "Skarsnik" Colinet.
*
* This file is part of the QUsb2Snes project.
* (see https://github.com/Skarsnik/QUsb2snes).
*
* QUsb2Snes 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 3 of the License, or
* (at your option) any later version.
*
* QUsb2Snes 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 QUsb2Snes. If not, see <https://www.gnu.org/licenses/>.
*/
#include "localstorage.h"
#include <QLoggingCategory>
Q_LOGGING_CATEGORY(log_localStorage, "LocalStorage")
#define sDebug() qCDebug(log_localStorage)
#define sInfo() qCInfo(log_localStorage)
QDir LocalStorage::rootDir;
QString LocalStorage::rootPath;
LocalStorage::LocalStorage()
{
}
bool LocalStorage::isUsable()
{
return !rootPath.isEmpty();
}
void LocalStorage::setRootPath(const QString arootDir)
{
sDebug() << "Root path is " << arootDir;
rootDir.setPath(arootDir);
rootPath = QDir::cleanPath(rootDir.absolutePath());
rootDir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
}
QList<LocalStorage::FileInfo> LocalStorage::list(const QString path)
{
sDebug() << "Request listing " << path;
rootDir.refresh();
QList<LocalStorage::FileInfo> toret;
if (violateRoot(path))
return toret;
QString nPath = rootDir.absoluteFilePath(rootPath + "/" + path);
nPath = QDir::cleanPath(nPath);
//sDebug() << nPath;
QFileInfo nfi(nPath);
if (!nfi.isDir())
return toret;
QDir nDir(nPath);
sDebug() << "Listing" << nDir.absolutePath();
nDir.refresh();
auto infoList = nDir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotDot);
for (const QFileInfo& info : qAsConst(infoList))
{
//sDebug() << info;
LocalStorage::FileInfo fi;
fi.name = info.fileName();
if (info.isDir())
fi.type = FileType::Dir;
if (info.isFile())
fi.type = FileType::File;
toret.append(fi);
}
FileInfo fi;
if (rootDir.absolutePath() != nDir.absolutePath())
{
fi.type = FileType::Dir;
fi.name = "..";
toret.append(fi);
}
return toret;
}
QByteArray LocalStorage::getFile(const QString path)
{
sDebug() << "Access to " << path;
if (violateRoot(path))
return QByteArray();
QFile file(rootPath + "/" + path);
if (!file.exists() || QFileInfo(rootPath + "/" + path).isDir())
return QByteArray();
file.open(QIODevice::ReadOnly);
return file.readAll();
}
bool LocalStorage::createFile(const QString path, const QByteArray& data)
{
sDebug() << "Wanting to create " << path << "Bytes : " << data.size();
if (violateRoot(path))
return false;
QFile file(rootPath + "/" + path);
if (!file.open(QIODevice::WriteOnly))
return false;
file.write(data);
file.close();
return true;
}
QFile* LocalStorage::prepareWriteFile(const QString path, const unsigned int size)
{
sDebug() << "Wanting to create " << path;
if (violateRoot(path))
return new QFile();
QFile* toret = new QFile(rootPath + "/" + path);
toret->open(QIODevice::WriteOnly);
return toret;
}
bool LocalStorage::remove(const QString path)
{
sDebug() << "Removing " << path;
if (violateRoot(path))
return false;
return QFile::remove(rootPath + "/" + path);
}
bool LocalStorage::makeDir(const QString path)
{
sDebug() << "Creating directory " << path;
if (violateRoot(path))
return false;
return rootDir.mkdir(rootPath + "/" + path);
}
bool LocalStorage::rename(const QString path, const QString newPath)
{
if (violateRoot(path) || violateRoot(newPath))
return false;
return rootDir.rename(path, newPath);
}
bool LocalStorage::isInStorage(const QString path)
{
QString cleanedPath = QDir::cleanPath(path);
sDebug() << "Is in storage: testing : " << cleanedPath;
sDebug() << "Rooth path : " << rootPath;
return cleanedPath.startsWith(rootPath);
}
QString LocalStorage::storagePath(const QString path)
{
QString plop = path;
plop = QDir::cleanPath(path);
plop.replace(rootPath + "/", "");
return plop;
}
bool LocalStorage::violateRoot(QString toCheck)
{
QString path = rootDir.absoluteFilePath(rootPath + "/" + toCheck);
path = QDir::cleanPath(path);
sDebug() << "Testing violation root, root : " << rootPath;
sDebug() << " path : " << path;
if (path.indexOf(rootPath) == -1)
return true;
return false;
}