summaryrefslogtreecommitdiffstats
path: root/media/mtp
diff options
context:
space:
mode:
Diffstat (limited to 'media/mtp')
-rw-r--r--media/mtp/MtpServer.cpp8
-rw-r--r--media/mtp/MtpServer.h2
-rw-r--r--media/mtp/MtpStorage.cpp9
-rw-r--r--media/mtp/MtpStorage.h6
4 files changed, 16 insertions, 9 deletions
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index d65845d..b371e41 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -104,10 +104,10 @@ MtpServer::MtpServer(int fd, MtpDatabase* database,
MtpServer::~MtpServer() {
}
-void MtpServer::addStorage(const char* filePath) {
+void MtpServer::addStorage(const char* filePath, uint64_t reserveSpace) {
int index = mStorages.size() + 1;
index |= index << 16; // set high and low part to our index
- MtpStorage* storage = new MtpStorage(index, filePath, mDatabase);
+ MtpStorage* storage = new MtpStorage(index, filePath, reserveSpace);
addStorage(storage);
}
@@ -687,6 +687,10 @@ MtpResponseCode MtpServer::doSendObjectInfo() {
if (access(path, R_OK) == 0)
return MTP_RESPONSE_GENERAL_ERROR;
+ // check space first
+ if (mSendObjectFileSize > storage->getFreeSpace())
+ return MTP_RESPONSE_STORAGE_FULL;
+
MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path,
format, parent, storageID, mSendObjectFileSize, modifiedTime);
if (handle == kInvalidObjectHandle) {
diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h
index 5aee4ea..605d5a2 100644
--- a/media/mtp/MtpServer.h
+++ b/media/mtp/MtpServer.h
@@ -67,7 +67,7 @@ public:
int fileGroup, int filePerm, int directoryPerm);
virtual ~MtpServer();
- void addStorage(const char* filePath);
+ void addStorage(const char* filePath, uint64_t reserveSpace);
inline void addStorage(MtpStorage* storage) { mStorages.push(storage); }
MtpStorage* getStorage(MtpStorageID id);
void run();
diff --git a/media/mtp/MtpStorage.cpp b/media/mtp/MtpStorage.cpp
index eccf186..abc23de 100644
--- a/media/mtp/MtpStorage.cpp
+++ b/media/mtp/MtpStorage.cpp
@@ -32,11 +32,11 @@
namespace android {
-MtpStorage::MtpStorage(MtpStorageID id, const char* filePath, MtpDatabase* db)
+MtpStorage::MtpStorage(MtpStorageID id, const char* filePath, uint64_t reserveSpace)
: mStorageID(id),
mFilePath(filePath),
- mDatabase(db),
- mMaxCapacity(0)
+ mMaxCapacity(0),
+ mReserveSpace(reserveSpace)
{
LOGD("MtpStorage id: %d path: %s\n", id, filePath);
}
@@ -70,7 +70,8 @@ uint64_t MtpStorage::getFreeSpace() {
struct statfs stat;
if (statfs(mFilePath, &stat))
return -1;
- return (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
+ uint64_t freeSpace = (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize;
+ return (freeSpace > mReserveSpace ? freeSpace - mReserveSpace : 0);
}
const char* MtpStorage::getDescription() const {
diff --git a/media/mtp/MtpStorage.h b/media/mtp/MtpStorage.h
index b13b926..ace720b 100644
--- a/media/mtp/MtpStorage.h
+++ b/media/mtp/MtpStorage.h
@@ -28,11 +28,13 @@ class MtpStorage {
private:
MtpStorageID mStorageID;
const char* mFilePath;
- MtpDatabase* mDatabase;
uint64_t mMaxCapacity;
+ // amount of free space to leave unallocated
+ uint64_t mReserveSpace;
public:
- MtpStorage(MtpStorageID id, const char* filePath, MtpDatabase* db);
+ MtpStorage(MtpStorageID id, const char* filePath,
+ uint64_t reserveSpace);
virtual ~MtpStorage();
inline MtpStorageID getStorageID() const { return mStorageID; }