/*
*
* versuch project
* Address Utilities
* $Id: AddrUtils.cxx,v 1.3 2006/05/29 06:08:20 warlock_kg Exp $
* warlock copyright since 2005 Nov
*
*/
#include "AddrUtils.h"
#include <pcre++.h>
#include <string.h>
#include <assert.h>
#include "Utils.h"
using namespace AddrUtils;
#define OVECCOUNT 30 /* should be a multiple of 3 */
#define BUFFERS_SIZE 512 /* limit for buffers */
void AddrUtils::GetIPAddress( H225_TransportAddress & IPAddress,
const H225_ArrayOf_TransportAddress & Addresses )
// Given an array of transport address, returns the first IP address
// will throw an error if no IP address
{
for ( int i=0; i < Addresses.GetSize(); ++i )
{
if ( Addresses[i].GetTag() == H225_TransportAddress::e_ipAddress )
{
IPAddress = Addresses[i];
return;
}
}
cerr << "No H225 IP address found!" << endl;
assert(false);
}
void AddrUtils::GetIPAddress( H225_TransportAddress_ipAddress & IPAddress, const H225_ArrayOf_TransportAddress & Addresses )
// Task: given an array of transport address, returns the first IP address
// will throw an error if no IP address
{
H225_TransportAddress AkaIPAddr;
AddrUtils::GetIPAddress( AkaIPAddr, Addresses );
IPAddress = static_cast<H225_TransportAddress_ipAddress &>(AkaIPAddr);
}
H225_TransportAddress AddrUtils::ConvertToH225TransportAddr( const WSocket::Address & Addr, unsigned Port )
{
H225_TransportAddress Result;
Result.SetTag( H225_TransportAddress::e_ipAddress );
H225_TransportAddress_ipAddress & ResultIP = Result;
ResultIP.m_ip[0] = Addr.Byte1();
ResultIP.m_ip[1] = Addr.Byte2();
ResultIP.m_ip[2] = Addr.Byte3();
ResultIP.m_ip[3] = Addr.Byte4();
ResultIP.m_port = Port;
return Result;
}
void AddrUtils::ConvertToIPAddress( const H225_TransportAddress_ipAddress & H225IP, WSocket::Address & Addr, unsigned & Port )
{
WSocket::Address ResultAddr(H225IP.m_ip[0], H225IP.m_ip[1], H225IP.m_ip[2], H225IP.m_ip[3] );
Addr = ResultAddr;
Port = static_cast<unsigned>(H225IP.m_port);
}
void AddrUtils::setIPAddress(H245_UnicastAddress_iPAddress & IP, const WSocket::Address & addr, unsigned port)
{
IP.m_network[0] = addr[0];
IP.m_network[1] = addr[1];
IP.m_network[2] = addr[2];
IP.m_network[3] = addr[3];
IP.m_tsapIdentifier = port;
WTRACE(3, "Setting IP address to " << WSocket::Address(addr).AsString() << ":" << port);
}
PString AddrUtils::AsString(const PASN_OctetString & Octets)
{
PString result;
if (Octets.GetDataLength() > 0) {
result = PString(PString::Printf, "%02X", Octets[0]);
for (int i = 1; i < Octets.GetDataLength(); ++i)
result += PString(PString::Printf, "%02X", Octets[i]);
}
return result;
}
string AddrUtils::PerlTranslate(const string RegExp, const string & Subject)
{
if (RegExp == "" || Subject == "")
return "";
vector<string> tokens;
string res;
pcrepp::Pcre sp("/");
tokens = sp.split(RegExp);
try {
pcrepp::Pcre p(tokens[1]);
res = p.replace(Subject, tokens[2]);
}
catch (pcrepp::Pcre::exception &exc)
{
cerr << endl << "Pcre++ error in PerlTranslate: RegExp: " << RegExp << " Subject: " << endl;
return "";
}
return res;
}
void AddrUtils::IncomingTranslate(PString & CalledNum, const vector<string> & CalledPattern)
{
string str0;
unsigned i;
if (CalledPattern.size() == 0)
return;
str0 = (const char *)CalledNum;
for ( i = 0; i < CalledPattern.size(); i++)
{
str0 = PerlTranslate(CalledPattern[i].c_str(), str0.c_str());
}
CalledNum = str0.c_str();
return;
}
void AddrUtils::MapToSocketList(vector< WSocket * > & SocketList, map<unsigned, WTCPSocket *> & Source)
{
map<unsigned, WTCPSocket *>::iterator it;
for( it = Source.begin(); it != Source.end(); it++ )
{
SocketList.push_back(it->second);
}
}
syntax highlighted by Code2HTML, v. 0.9.1