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

109 lines
3.3 KiB
C++

#pragma once
#ifndef protocol_relay_uvox_H_
#define protocol_relay_uvox_H_
#include "threadedRunner.h"
#include "streamData.h"
#include "uvox2Common.h"
class protocol_relay_uvox: public runnable
{
private:
const bool m_backup; // used to change log output depending on relay or backup usage
bool m_denied; // used to prevent source disconnected messages e.g. for failed passwords
short unsigned int m_remainderSize;
__uint8 * m_remainder;
const uniString::utf8 m_srcAddrName;
const uniString::utf8 m_srcAddrNumeric;
const uniString::utf8 m_srcURLpart;
const uniString::utf8 m_srcLogString;
///////////// for outgoing data //////////////////////////////
__uint8 * m_outData;
const __uint8 * m_outBuffer; // for outgoing data lines
int m_outBufferSize;
const config::streamConfig m_originalRelayInfo;
///////////// incoming data ////////////////////////////////////
std::vector<__uint8> m_inBuffer;
////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
//// data structures for assembling cached metadata
typedef std::vector<__uint8> metadataFragment_t;
struct metadataFragmentEntry_t
{
metadataFragment_t m_fragment;
bool m_isValid;
void clear() throw() {m_isValid = false; m_fragment.clear(); }
metadataFragmentEntry_t() throw():m_isValid(false){}
};
typedef metadataFragmentEntry_t metadataFragmentCollection_t[MAX_METADATA_FRAGMENTS];
#pragma pack(push, 1)
struct metadataEntry_t
{
__uint16 m_expectedFragments;
__uint16 m_receivedFragments;
metadataFragmentCollection_t m_fragments;
void clear() throw()
{
for (int x = 0; x < MAX_METADATA_FRAGMENTS; ++x)
{
m_fragments[x].clear();
}
m_receivedFragments = 0;
}
metadataEntry_t() throw() : m_expectedFragments(0), m_receivedFragments(0) { }
};
#pragma pack(pop)
typedef __uint32 assemblyTableIndex_t;
static assemblyTableIndex_t makeAssemblyTableIndex(__uint16 voxMsgType,__uint16 metadataID) throw()
{
return ((((assemblyTableIndex_t)voxMsgType) << 16) | metadataID);
}
typedef std::map<assemblyTableIndex_t,metadataEntry_t> metadataAssemblyTable_t;
metadataAssemblyTable_t m_metadataAssemblyTable;
/////////////////////////////////////////////////////
streamData *m_streamData;
typedef void (protocol_relay_uvox::*state_t)();
void state_GetPacket() throw(std::exception);
void state_SendBuffer() throw(std::exception);
void state_GetStreamData() throw(std::exception);
void state_Fail() throw(std::exception);
void state_CloseConnection() throw(std::exception);
state_t m_state;
state_t m_nextState;
streamData::uvoxConfigData_t m_configData;
void cleanup();
template<typename T> void loadAndSendMsg(const T &msg, int type,state_t nextState) throw();
protected:
virtual void timeSlice() throw(std::exception);
virtual uniString::utf8 name() const throw() { return "protocol_relay_uvox"; }
public:
protocol_relay_uvox(const socketOps::tSOCKET s, const config::streamConfig &originalRelayInfo,
const uniString::utf8 &srcAddrName, const uniString::utf8 &srcAddrNumeric,
const int srcPort, const uniString::utf8 &srcURLpart,
const httpHeaderMap_t &httpHeaders, const int originalBitrate = 0,
const uniString::utf8& originalMimeType = "", const bool backup = false) throw(std::runtime_error);
~protocol_relay_uvox() throw();
};
#endif