Program Listing for File FileObjectLoadedState.cpp

Return to documentation for file (src/fileObject/FileObjectLoadedState.cpp)

//
// Created by Aleksey Timin on 11/23/19.
//

#include "FileObjectLoadedState.h"
#include "FileObjectUploadInProgressState.h"
#include "utils/Buffer.h"

namespace eipScanner {
namespace fileObject {
    using utils::Buffer;
    using utils::LogLevel;

    FileObjectLoadedState::FileObjectLoadedState(FileObject &owner, cip::CipUint objectId,
                                               MessageRouter::SPtr messageRouter)
            : FileObjectState(FileObjectStateCodes::FILE_LOADED, owner, objectId, messageRouter) {
    }

    void FileObjectLoadedState::initiateUpload(SessionInfoIf::SPtr si, EndUploadHandler handler) {
        logWithStateName(LogLevel::INFO, "Initiate upload");
        Buffer buffer;
        buffer << MAX_TRANSFER_SIZE;

        auto response = _messageRouter->sendRequest(si,
                                                    static_cast<cip::CipUsint>(FileObjectServiceCodes::INITIATE_UPLOAD),
                                                    cip::EPath(FILE_OBJECT_CLASS_ID, _objectId), buffer.data());

        if (response.getGeneralStatusCode() == cip::GeneralStatusCodes::SUCCESS) {
            buffer = Buffer(response.getData());
            cip::CipUdint fileSize = 0;
            cip::CipUsint transferSize = 0;

            buffer >> fileSize >> transferSize;
            setState<FileObjectUploadInProgressState>(fileSize, transferSize, handler);

        } else {
            logGeneralAndAdditionalStatus(response);
            handler(response.getGeneralStatusCode(), std::vector<uint8_t>(0));
        }
    }

    bool FileObjectLoadedState::transfer(SessionInfoIf::SPtr si) {
        return false;
    }
}
}