109 lines
3.3 KiB
C++
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
|