void UDPPusher::start() { uint32_t timeMs; CHECK_EQ(fread(&timeMs, 1, sizeof(timeMs), mFile), sizeof(timeMs)); mFirstTimeMs = fromlel(timeMs); mFirstTimeUs = ALooper::GetNowUs(); (new AMessage(kWhatPush, id()))->post(); }
bool UDPPusher::onPush() { uint32_t length; if (fread(&length, 1, sizeof(length), mFile) < sizeof(length)) { LOGI("No more data to push."); return false; } length = fromlel(length); CHECK_GT(length, 0u); sp<ABuffer> buffer = new ABuffer(length); if (fread(buffer->data(), 1, length, mFile) < length) { LOGE("File truncated?."); return false; } ssize_t n = PR_SendTo( mSocket, buffer->data(), buffer->size(), 0, &mRemoteAddr, PR_INTERVAL_NO_WAIT); CHECK_EQ(n, (ssize_t)buffer->size()); uint32_t timeMs; if (fread(&timeMs, 1, sizeof(timeMs), mFile) < sizeof(timeMs)) { LOGI("No more data to push."); return false; } timeMs = fromlel(timeMs); CHECK_GE(timeMs, mFirstTimeMs); timeMs -= mFirstTimeMs; int64_t whenUs = mFirstTimeUs + timeMs * 1000ll; int64_t nowUs = ALooper::GetNowUs(); (new AMessage(kWhatPush, id()))->post(whenUs - nowUs); return true; }
status_t BackupDataReader::ReadNextHeader(bool* done, int* type) { *done = m_done; if (m_status != NO_ERROR) { return m_status; } int amt; amt = skip_padding(); if (amt == EIO) { *done = m_done = true; return NO_ERROR; } else if (amt != NO_ERROR) { return amt; } amt = read(m_fd, &m_header, sizeof(m_header)); *done = m_done = (amt == 0); if (*done) { return NO_ERROR; } CHECK_SIZE(amt, sizeof(m_header)); m_pos += sizeof(m_header); if (type) { *type = m_header.type; } // validate and fix up the fields. m_header.type = fromlel(m_header.type); switch (m_header.type) { case BACKUP_HEADER_ENTITY_V1: { m_header.entity.keyLen = fromlel(m_header.entity.keyLen); if (m_header.entity.keyLen <= 0) { ALOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos, (int)m_header.entity.keyLen); m_status = EINVAL; } m_header.entity.dataSize = fromlel(m_header.entity.dataSize); m_entityCount++; // read the rest of the header (filename) size_t size = m_header.entity.keyLen; char* buf = m_key.lockBuffer(size); if (buf == NULL) { m_status = ENOMEM; return m_status; } int amt = read(m_fd, buf, size+1); CHECK_SIZE(amt, (int)size+1); m_key.unlockBuffer(size); m_pos += size+1; SKIP_PADDING(); m_dataEndPos = m_pos + m_header.entity.dataSize; break; } default: ALOGD("Chunk header at %d has invalid type: 0x%08x", (int)(m_pos - sizeof(m_header)), (int)m_header.type); m_status = EINVAL; } return m_status; }