/*
 * Copyright (c) 2016, Intel Corporation
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation and/or
 * other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its contributors
 * may be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
#include "BackgroundRemoteProcessorServer.h"
#include "RemoteProcessorServer.h"

BackgroundRemoteProcessorServer::BackgroundRemoteProcessorServer(
    std::string bindAddress, std::unique_ptr<IRemoteCommandHandler> &&commandHandler)
    : _server(new CRemoteProcessorServer(bindAddress)), mCommandHandler(std::move(commandHandler))
{
}

bool BackgroundRemoteProcessorServer::start(std::string &error)
{
    if (!_server->start(error)) {
        return false;
    }
    try {
        mServerSuccess = std::async(std::launch::async, &CRemoteProcessorServer::process,
                                    _server.get(), std::ref(*mCommandHandler));
    } catch (std::exception &e) {
        error = "Could not create a remote processor thread: " + std::string(e.what());
        return false;
    }

    return true;
}

bool BackgroundRemoteProcessorServer::stop()
{
    _server->stop();
    return mServerSuccess.get();
}

BackgroundRemoteProcessorServer::~BackgroundRemoteProcessorServer()
{
    stop();
}
