Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9589bb0 authored by Jerry Zhang's avatar Jerry Zhang Committed by android-build-merger
Browse files

Merge "Fix file transfer corner cases." into oc-dev am: 922669e8

am: aef8eb86

Change-Id: I5a838ba9fdbc481674eb4c6638d1221a7027f205
parents 07def20c aef8eb86
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -27,7 +27,7 @@ public:
    virtual int write(const void *data, int len) = 0;
    virtual int write(const void *data, int len) = 0;


    // Return 0 if send/receive is successful, or -1 and errno is set
    // Return 0 if send/receive is successful, or -1 and errno is set
    virtual int receiveFile(mtp_file_range mfr) = 0;
    virtual int receiveFile(mtp_file_range mfr, bool zero_packet) = 0;
    virtual int sendFile(mtp_file_range mfr) = 0;
    virtual int sendFile(mtp_file_range mfr) = 0;
    virtual int sendEvent(mtp_event me) = 0;
    virtual int sendEvent(mtp_event me) = 0;


+2 −2
Original line number Original line Diff line number Diff line
@@ -45,7 +45,7 @@ public:
    int read(void *data, int len);
    int read(void *data, int len);
    int write(const void *data, int len);
    int write(const void *data, int len);


    int receiveFile(mtp_file_range mfr);
    int receiveFile(mtp_file_range mfr, bool);
    int sendFile(mtp_file_range mfr);
    int sendFile(mtp_file_range mfr);
    int sendEvent(mtp_event me);
    int sendEvent(mtp_event me);


@@ -68,7 +68,7 @@ int MtpDevHandle::write(const void *data, int len) {
    return ::write(mFd, data, len);
    return ::write(mFd, data, len);
}
}


int MtpDevHandle::receiveFile(mtp_file_range mfr) {
int MtpDevHandle::receiveFile(mtp_file_range mfr, bool) {
    return ioctl(mFd, MTP_RECEIVE_FILE, reinterpret_cast<unsigned long>(&mfr));
    return ioctl(mFd, MTP_RECEIVE_FILE, reinterpret_cast<unsigned long>(&mfr));
}
}


+8 −9
Original line number Original line Diff line number Diff line
@@ -516,7 +516,7 @@ void MtpFfsHandle::close() {
}
}


/* Read from USB and write to a local file. */
/* Read from USB and write to a local file. */
int MtpFfsHandle::receiveFile(mtp_file_range mfr) {
int MtpFfsHandle::receiveFile(mtp_file_range mfr, bool zero_packet) {
    // When receiving files, the incoming length is given in 32 bits.
    // When receiving files, the incoming length is given in 32 bits.
    // A >4G file is given as 0xFFFFFFFF
    // A >4G file is given as 0xFFFFFFFF
    uint32_t file_length = mfr.length;
    uint32_t file_length = mfr.length;
@@ -538,7 +538,7 @@ int MtpFfsHandle::receiveFile(mtp_file_range mfr) {
    aio.aio_fildes = mfr.fd;
    aio.aio_fildes = mfr.fd;
    aio.aio_buf = nullptr;
    aio.aio_buf = nullptr;
    struct aiocb *aiol[] = {&aio};
    struct aiocb *aiol[] = {&aio};
    int ret;
    int ret = -1;
    size_t length;
    size_t length;
    bool read = false;
    bool read = false;
    bool write = false;
    bool write = false;
@@ -590,11 +590,6 @@ int MtpFfsHandle::receiveFile(mtp_file_range mfr) {
            } else {
            } else {
                // Receive an empty packet if size is a multiple of the endpoint size.
                // Receive an empty packet if size is a multiple of the endpoint size.
                file_length -= ret;
                file_length -= ret;
                if (file_length == 0 && ret % packet_size == 0) {
                    if (TEMP_FAILURE_RETRY(::read(mBulkOut, data, packet_size)) != 0) {
                        return -1;
                    }
                }
            }
            }
            // Enqueue a new write request
            // Enqueue a new write request
            aio.aio_buf = data;
            aio.aio_buf = data;
@@ -610,6 +605,11 @@ int MtpFfsHandle::receiveFile(mtp_file_range mfr) {
            read = false;
            read = false;
        }
        }
    }
    }
    if (ret % packet_size == 0 || zero_packet) {
        if (TEMP_FAILURE_RETRY(::read(mBulkOut, data, packet_size)) != 0) {
            return -1;
        }
    }
    return 0;
    return 0;
}
}


@@ -660,10 +660,9 @@ int MtpFfsHandle::sendFile(mtp_file_range mfr) {
                    sizeof(mtp_data_header), init_read_len, offset))
                    sizeof(mtp_data_header), init_read_len, offset))
            != init_read_len) return -1;
            != init_read_len) return -1;
    if (writeHandle(mBulkIn, data, sizeof(mtp_data_header) + init_read_len) == -1) return -1;
    if (writeHandle(mBulkIn, data, sizeof(mtp_data_header) + init_read_len) == -1) return -1;
    if (file_length == static_cast<unsigned>(init_read_len)) return 0;
    file_length -= init_read_len;
    file_length -= init_read_len;
    offset += init_read_len;
    offset += init_read_len;
    ret = 0;
    ret = init_read_len + sizeof(mtp_data_header);


    // Break down the file into pieces that fit in buffers
    // Break down the file into pieces that fit in buffers
    while(file_length > 0) {
    while(file_length > 0) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -55,7 +55,7 @@ public:
    int read(void *data, int len);
    int read(void *data, int len);
    int write(const void *data, int len);
    int write(const void *data, int len);


    int receiveFile(mtp_file_range mfr);
    int receiveFile(mtp_file_range mfr, bool zero_packet);
    int sendFile(mtp_file_range mfr);
    int sendFile(mtp_file_range mfr);
    int sendEvent(mtp_event me);
    int sendEvent(mtp_event me);


+26 −28
Original line number Original line Diff line number Diff line
@@ -1056,7 +1056,6 @@ MtpResponseCode MtpServer::doSendObject() {
        ALOGE("failed to write initial data");
        ALOGE("failed to write initial data");
        result = MTP_RESPONSE_GENERAL_ERROR;
        result = MTP_RESPONSE_GENERAL_ERROR;
    } else {
    } else {
        if (mSendObjectFileSize - initialData > 0) {
        mfr.offset = initialData;
        mfr.offset = initialData;
        if (mSendObjectFileSize == 0xFFFFFFFF) {
        if (mSendObjectFileSize == 0xFFFFFFFF) {
            // tell driver to read until it receives a short packet
            // tell driver to read until it receives a short packet
@@ -1069,12 +1068,12 @@ MtpResponseCode MtpServer::doSendObject() {
        mfr.transaction_id = 0;
        mfr.transaction_id = 0;


        // transfer the file
        // transfer the file
            ret = sHandle->receiveFile(mfr);
        ret = sHandle->receiveFile(mfr, mfr.length == 0 &&
                initialData == MTP_BUFFER_SIZE - MTP_CONTAINER_HEADER_SIZE);
        if ((ret < 0) && (errno == ECANCELED)) {
        if ((ret < 0) && (errno == ECANCELED)) {
            isCanceled = true;
            isCanceled = true;
        }
        }
    }
    }
    }


    if (mSendObjectModifiedTime) {
    if (mSendObjectModifiedTime) {
        struct timespec newTime[2];
        struct timespec newTime[2];
@@ -1271,7 +1270,6 @@ MtpResponseCode MtpServer::doSendPartialObject() {
    if (ret < 0) {
    if (ret < 0) {
        ALOGE("failed to write initial data");
        ALOGE("failed to write initial data");
    } else {
    } else {
        if (length > 0) {
        mtp_file_range  mfr;
        mtp_file_range  mfr;
        mfr.fd = edit->mFD;
        mfr.fd = edit->mFD;
        mfr.offset = offset;
        mfr.offset = offset;
@@ -1280,12 +1278,12 @@ MtpResponseCode MtpServer::doSendPartialObject() {
        mfr.transaction_id = 0;
        mfr.transaction_id = 0;


        // transfer the file
        // transfer the file
            ret = sHandle->receiveFile(mfr);
        ret = sHandle->receiveFile(mfr, mfr.length == 0 &&
                initialData == MTP_BUFFER_SIZE - MTP_CONTAINER_HEADER_SIZE);
        if ((ret < 0) && (errno == ECANCELED)) {
        if ((ret < 0) && (errno == ECANCELED)) {
            isCanceled = true;
            isCanceled = true;
        }
        }
    }
    }
    }
    if (ret < 0) {
    if (ret < 0) {
        mResponse.setParameter(1, 0);
        mResponse.setParameter(1, 0);
        if (isCanceled)
        if (isCanceled)
Loading