/*
*
* 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