/**
 * Copyright (C) Arm Limited 2010-2016. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef __STREAMLINE_SETUP_H__
#define __STREAMLINE_SETUP_H__

#include <stdint.h>
#include <string.h>
#include <vector>

#include "lib/Span.h"

#include "ClassBoilerPlate.h"

#include "ISender.h"

class OlySocket;
class Drivers;
class ICpuInfo;
struct CapturedSpe;

// Commands from Streamline
enum
{
    COMMAND_REQUEST_XML = 0,
    COMMAND_DELIVER_XML = 1,
    COMMAND_APC_START = 2,
    COMMAND_APC_STOP = 3,
    COMMAND_DISCONNECT = 4,
    COMMAND_PING = 5
};

class StreamlineSetup
{
public:
    StreamlineSetup(OlySocket *socket, Drivers & drivers, lib::Span<const CapturedSpe> capturedSpes);
    ~StreamlineSetup();
private:
    OlySocket* mSocket;
    Drivers & mDrivers;
    lib::Span<const CapturedSpe> mCapturedSpes;

    std::vector<char> readCommand(int*);
    void handleRequest(char* xml);
    void handleDeliver(char* xml);
    void sendData(const char* data, uint32_t length, ResponseType type);
    void sendString(const char* string, ResponseType type)
    {
        sendData(string, strlen(string), type);
    }
    void sendDefaults();
    void writeConfiguration(char* xml);

    // Intentionally unimplemented
    CLASS_DELETE_COPY_MOVE(StreamlineSetup);
};

#endif //__STREAMLINE_SETUP_H__
