summaryrefslogtreecommitdiffstats
path: root/media/mtp/MtpServer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/mtp/MtpServer.cpp')
-rw-r--r--media/mtp/MtpServer.cpp34
1 files changed, 23 insertions, 11 deletions
diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp
index 5a16a03..e8f09fa 100644
--- a/media/mtp/MtpServer.cpp
+++ b/media/mtp/MtpServer.cpp
@@ -123,6 +123,7 @@ MtpServer::MtpServer(int fd, MtpDatabase* database,
mSessionID(0),
mSessionOpen(false),
mSendObjectHandle(kInvalidObjectHandle),
+ mSendObjectFormat(0),
mSendObjectFileSize(0)
{
initObjectProperties();
@@ -519,8 +520,8 @@ MtpResponseCode MtpServer::doSendObjectInfo() {
path += (const char *)name;
mDatabase->beginTransaction();
- MtpObjectHandle handle = mDatabase->addFile((const char*)path, format, parent, storageID,
- mSendObjectFileSize, modifiedTime);
+ MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path,
+ format, parent, storageID, mSendObjectFileSize, modifiedTime);
if (handle == kInvalidObjectHandle) {
mDatabase->rollbackTransaction();
return MTP_RESPONSE_GENERAL_ERROR;
@@ -538,6 +539,7 @@ MtpResponseCode MtpServer::doSendObjectInfo() {
mSendObjectFilePath = path;
// save the handle for the SendObject call, which should follow
mSendObjectHandle = handle;
+ mSendObjectFormat = format;
}
mResponse.setParameter(1, storageID);
@@ -548,13 +550,18 @@ MtpResponseCode MtpServer::doSendObjectInfo() {
}
MtpResponseCode MtpServer::doSendObject() {
+ MtpResponseCode result = MTP_RESPONSE_OK;
+ mode_t mask;
+ int ret;
+
if (mSendObjectHandle == kInvalidObjectHandle) {
LOGE("Expected SendObjectInfo before SendObject");
- return MTP_RESPONSE_NO_VALID_OBJECT_INFO;
+ result = MTP_RESPONSE_NO_VALID_OBJECT_INFO;
+ goto done;
}
// read the header
- int ret = mData.readDataHeader(mFD);
+ ret = mData.readDataHeader(mFD);
// FIXME - check for errors here.
// reset so we don't attempt to send this back
@@ -563,11 +570,12 @@ MtpResponseCode MtpServer::doSendObject() {
mtp_file_range mfr;
mfr.fd = open(mSendObjectFilePath, O_RDWR | O_CREAT | O_TRUNC);
if (mfr.fd < 0) {
- return MTP_RESPONSE_GENERAL_ERROR;
+ result = MTP_RESPONSE_GENERAL_ERROR;
+ goto done;
}
fchown(mfr.fd, getuid(), mFileGroup);
// set permissions
- mode_t mask = umask(0);
+ mask = umask(0);
fchmod(mfr.fd, mFilePermission);
umask(mask);
@@ -578,18 +586,22 @@ MtpResponseCode MtpServer::doSendObject() {
ret = ioctl(mFD, MTP_RECEIVE_FILE, (unsigned long)&mfr);
close(mfr.fd);
- // FIXME - we need to delete mSendObjectHandle from the database if this fails.
LOGV("MTP_RECEIVE_FILE returned %d", ret);
- mSendObjectHandle = kInvalidObjectHandle;
if (ret < 0) {
unlink(mSendObjectFilePath);
if (errno == ECANCELED)
- return MTP_RESPONSE_TRANSACTION_CANCELLED;
+ result = MTP_RESPONSE_TRANSACTION_CANCELLED;
else
- return MTP_RESPONSE_GENERAL_ERROR;
+ result = MTP_RESPONSE_GENERAL_ERROR;
}
- return MTP_RESPONSE_OK;
+
+done:
+ mDatabase->endSendObject(mSendObjectFilePath, mSendObjectHandle, mSendObjectFormat,
+ result == MTP_RESPONSE_OK);
+ mSendObjectHandle = kInvalidObjectHandle;
+ mSendObjectFormat = 0;
+ return result;
}
MtpResponseCode MtpServer::doDeleteObject() {