winamp/Src/Plugins/DSP/sc_serv3/protocol_relay.h
2024-09-24 14:54:57 +02:00

73 lines
2.3 KiB
C++

#pragma once
#ifndef protocol_relay_H_
#define protocol_relay_H_
#include "threadedRunner.h"
/*
Runnable object that handles the initial part of a relay connection.
Makes the connection to the source and determines what type of protocol
should be used, then hands off to that particular protocol
(shoutcast or uvox relay)
*/
class protocol_relay: public runnable
{
private:
u_short m_srcPort; // server port
short m_redirectCount;
uniString::utf8 m_srcAddrName; // server DNS name or value as specified in relayInfo
std::string m_srcAddrNumeric; // resolved numeric addr
uniString::utf8 m_srcURLpart; // server
uniString::utf8 m_srcLogString;
httpHeaderMap_t m_HTTPHeaders;
uniString::utf8 m_HTTPGreetingResponse; // first line of response
const uniString::utf8::value_type *m_outBuffer; // for outgoing text lines
int m_outBufferSize;
bool m_relayWaitingToReconnect;
bool m_relaySentConnectWait;
bool m_retryRelay;
bool m_skip;
bool m_backupStarted;
bool m_registered; // true if runnable is ok to start. new relay have to wait for exisitng one to drop
uniString::utf8 m_lineBuffer; // in/out lines
config::streamConfig m_relayInfo;
const config::streamConfig m_originalRelayInfo; // used for reconnects later on
/// reconnects
int m_retryCount;
time_t m_relayReconnectStartTime;
typedef void (protocol_relay::*state_t)();
state_t m_state;
state_t m_nextState;
void state_Initial() throw(std::exception);
void state_ResolveServer() throw(std::exception);
void state_Connect() throw(std::exception);
void state_ConnectWait() throw(std::exception);
void state_SendGreeting() throw(std::exception);
void state_GetGreetingResponse() throw(std::exception);
void state_AnalyzeGreetingResponse() throw(std::exception);
void state_DetermineProtocol() throw(std::exception);
void state_Send() throw(std::exception);
void state_GetLine() throw(std::exception);
void startBackupConnection(uniString::utf8 errorMessage) throw(std::exception);
protected:
virtual void timeSlice() throw(std::exception);
virtual uniString::utf8 name() const throw() { return "protocol_relay"; }
public:
protocol_relay(const config::streamConfig &info, const bool retry = false) throw();
virtual ~protocol_relay() throw();
};
#endif