diff options
Diffstat (limited to 'pw_transfer/server_context.cc')
-rw-r--r-- | pw_transfer/server_context.cc | 122 |
1 files changed, 9 insertions, 113 deletions
diff --git a/pw_transfer/server_context.cc b/pw_transfer/server_context.cc index 9d3410974..353258f5b 100644 --- a/pw_transfer/server_context.cc +++ b/pw_transfer/server_context.cc @@ -1,4 +1,4 @@ -// Copyright 2021 The Pigweed Authors +// Copyright 2022 The Pigweed Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of @@ -25,55 +25,18 @@ namespace pw::transfer::internal { -Status ServerContext::Start(TransferType type, - Handler& handler, - work_queue::WorkQueue& work_queue, - EncodingBuffer& encoding_buffer, - rpc::RawServerReaderWriter& stream, - chrono::SystemClock::duration timeout, - uint8_t max_retries) { - PW_DCHECK(!active()); - - PW_LOG_INFO("Starting transfer %u", static_cast<unsigned>(handler.id())); - - if (const Status status = handler.Prepare(type); !status.ok()) { - PW_LOG_WARN("Transfer %u prepare failed with status %u", - static_cast<unsigned>(handler.id()), - status.code()); - return status.IsPermissionDenied() ? status : Status::DataLoss(); - } - - type_ = type; - handler_ = &handler; +Status ServerContext::FinalCleanup(const Status status) { + PW_DCHECK(active()); - if (type == kRead) { - InitializeForTransmit(handler.id(), - work_queue, - encoding_buffer, - stream, - handler.reader(), - timeout, - max_retries); - } else { - InitializeForReceive(handler.id(), - work_queue, - encoding_buffer, - stream, - handler.writer(), - timeout, - max_retries); + // If no handler is set, then the Prepare call failed. Nothing to do. + if (handler_ == nullptr) { + return OkStatus(); } - return OkStatus(); -} - -Status ServerContext::Finish(const Status status) { - PW_DCHECK(active()); - Handler& handler = *handler_; - set_transfer_state(TransferState::kCompleted); + handler_ = nullptr; - if (type_ == kRead) { + if (type() == TransferType::kTransmit) { handler.FinalizeRead(status); return OkStatus(); } @@ -86,75 +49,8 @@ Status ServerContext::Finish(const Status status) { static_cast<int>(finalized.code())); return Status::DataLoss(); } - return OkStatus(); -} - -Result<ServerContext*> ServerContextPool::StartTransfer( - uint32_t transfer_id, - work_queue::WorkQueue& work_queue, - EncodingBuffer& encoding_buffer, - rpc::RawServerReaderWriter& stream, - chrono::SystemClock::duration timeout, - uint8_t max_retries) { - ServerContext* new_transfer = nullptr; - // Check if the ID belongs to an active transfer. If not, pick an inactive - // slot to start a new transfer. - for (ServerContext& transfer : transfers_) { - if (transfer.active()) { - // Check if restarting a currently pending transfer. - if (transfer.transfer_id() == transfer_id) { - PW_LOG_DEBUG( - "Received initial chunk for transfer %u which was already in " - "progress; aborting and restarting", - static_cast<unsigned>(transfer_id)); - transfer.Finish(Status::Aborted()); - new_transfer = &transfer; - break; - } - } else { - // Remember this but keep searching for an active transfer with this ID. - new_transfer = &transfer; - } - } - - if (new_transfer == nullptr) { - return Status::Unavailable(); - } - - // Try to start the new transfer by checking if a handler for it exists. - auto handler = std::find_if(handlers_.begin(), handlers_.end(), [&](auto& h) { - return h.id() == transfer_id; - }); - - if (handler == handlers_.end()) { - return Status::NotFound(); - } - - PW_TRY(new_transfer->Start(type_, - *handler, - work_queue, - encoding_buffer, - stream, - timeout, - max_retries)); - return new_transfer; -} - -Result<ServerContext*> ServerContextPool::GetPendingTransfer( - uint32_t transfer_id) { - auto transfer = - std::find_if(transfers_.begin(), transfers_.end(), [=](auto& t) { - return t.initialized() && t.transfer_id() == transfer_id; - }); - - if (transfer == transfers_.end()) { - PW_LOG_DEBUG("Ignoring chunk for transfer %u, which is not pending", - static_cast<unsigned>(transfer_id)); - return Status::FailedPrecondition(); - } - - return &(*transfer); + return OkStatus(); } } // namespace pw::transfer::internal |