/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
// Description : interface definition file for the Crysis remote control system
#ifndef CRYINCLUDE_CRYCOMMON_IREMOTECONTROL_H
#define CRYINCLUDE_CRYCOMMON_IREMOTECONTROL_H
#pragma once
struct IRemoteControlServer;
struct IRemoteControlClient;
struct IRemoteControlSystem
{
    // 
    virtual ~IRemoteControlSystem(){}
    virtual IRemoteControlServer* GetServerSingleton() = 0;
    virtual IRemoteControlClient* GetClientSingleton() = 0;
    // 
};
// the event handler on an RCON_server
struct IRemoteControlServerListener
{
    enum EResultDesc
    {
        eRD_Okay, eRD_Failed, eRD_AlreadyStarted
    };
    // 
    virtual ~IRemoteControlServerListener(){}
    //
    virtual void OnStartResult(bool started, EResultDesc desc) = 0;
    // invoked when a client is authorized
    virtual void OnClientAuthorized(string clientAddr) = 0;
    // invoked when the authorized client disconnects
    virtual void OnAuthorizedClientLeft(string clientAddr) = 0;
    // invoked when a client command is received on the server
    virtual void OnClientCommand(uint32 commandId, string command) = 0;
    // required by work queueing
    virtual void AddRef() const {}
    virtual void Release() const {}
    virtual bool IsDead() const { return false; }
    // 
};
// the RCON_server interface
struct IRemoteControlServer
{
    // 
    virtual ~IRemoteControlServer(){}
    // starts up an RCON_server
    virtual void Start(uint16 serverPort, const string& password, IRemoteControlServerListener* pListener) = 0;
    // stops the RCON_server
    virtual void Stop() = 0;
    // sends command result back to the command client
    virtual void SendResult(uint32 commandId, const string& result) = 0;
    // 
};
// the event handler on an RCON_client
struct IRemoteControlClientListener
{
    enum EResultDesc
    {
        eRD_Okay, eRD_Failed, eRD_CouldNotResolveServerAddr, eRD_UnsupportedAddressType, eRD_ConnectAgain
    };
    enum EStatusDesc
    {
        eSD_Authorized, eSD_ConnectFailed, eSD_ServerSessioned, eSD_AuthFailed, eSD_AuthTimeout, eSD_ServerClosed, eSD_BogusMessage
    };
    // 
    virtual ~IRemoteControlClientListener(){}
    //
    virtual void OnConnectResult(bool okay, EResultDesc desc) = 0;
    // invoked when connection is authorized or not (raw TCP connection failure are considered unauthorized)
    virtual void OnSessionStatus(bool connected, EStatusDesc desc) = 0;
    // invoked when the RCON_client receives a command result
    virtual void OnCommandResult(uint32 commandId, string command, string result) = 0;
    // required by work queueing
    virtual void AddRef() const {}
    virtual void Release() const {}
    virtual bool IsDead() const { return false; }
    // 
};
// the RCON_client interface
struct IRemoteControlClient
{
    // 
    virtual ~IRemoteControlClient(){}
    // connects to an RCON_server
    virtual void Connect(const string& serverAddr, uint16 serverPort, const string& password, IRemoteControlClientListener* pListener) = 0;
    // disconnects from an RCON_server
    virtual void Disconnect() = 0;
    // sends RCON commands to the connected RCON_server; returns a unique command ID
    virtual uint32 SendCommand(const string& command) = 0;
    // 
};
#endif // CRYINCLUDE_CRYCOMMON_IREMOTECONTROL_H