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

Commit aef8eb86 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

Change-Id: Idf99f296e03b2e35b6140d5650147a7dcb3cbc8f
parents 86a0b96d 922669e8
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ public:
    virtual int write(const void *data, int len) = 0;

    // 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 sendEvent(mtp_event me) = 0;

+2 −2
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ public:
    int read(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 sendEvent(mtp_event me);

@@ -68,7 +68,7 @@ int MtpDevHandle::write(const void *data, int 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));
}

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

/* 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.
    // A >4G file is given as 0xFFFFFFFF
    uint32_t file_length = mfr.length;
@@ -538,7 +538,7 @@ int MtpFfsHandle::receiveFile(mtp_file_range mfr) {
    aio.aio_fildes = mfr.fd;
    aio.aio_buf = nullptr;
    struct aiocb *aiol[] = {&aio};
    int ret;
    int ret = -1;
    size_t length;
    bool read = false;
    bool write = false;
@@ -590,11 +590,6 @@ int MtpFfsHandle::receiveFile(mtp_file_range mfr) {
            } else {
                // Receive an empty packet if size is a multiple of the endpoint size.
                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
            aio.aio_buf = data;
@@ -610,6 +605,11 @@ int MtpFfsHandle::receiveFile(mtp_file_range mfr) {
            read = false;
        }
    }
    if (ret % packet_size == 0 || zero_packet) {
        if (TEMP_FAILURE_RETRY(::read(mBulkOut, data, packet_size)) != 0) {
            return -1;
        }
    }
    return 0;
}

@@ -660,10 +660,9 @@ int MtpFfsHandle::sendFile(mtp_file_range mfr) {
                    sizeof(mtp_data_header), init_read_len, offset))
            != init_read_len) 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;
    offset += init_read_len;
    ret = 0;
    ret = init_read_len + sizeof(mtp_data_header);

    // Break down the file into pieces that fit in buffers
    while(file_length > 0) {
+1 −1
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ public:
    int read(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 sendEvent(mtp_event me);

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

        // 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)) {
            isCanceled = true;
        }
    }
    }

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

        // 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)) {
            isCanceled = true;
        }
    }
    }
    if (ret < 0) {
        mResponse.setParameter(1, 0);
        if (isCanceled)
Loading