# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# bos720 src/bos/usr/sbin/install/ecc/lib/ECC/ServiceProviderManager.pm 1.6 
#  
# Licensed Materials - Property of IBM 
#  
# Restricted Materials of IBM 
#  
# COPYRIGHT International Business Machines Corp. 2006,2007 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
package ServiceProviderManager;

use strict;
use warnings;
use Exporter;
use XML::SAX;
use base qw(XML::SAX::Base);
use lib '/usr/ecc/lib/ECC';
use Definitions;

use vars qw(@ISA @EXPORT);
@ISA = qw(Exporter XML::SAX::Base);
@EXPORT = qw(PhoneList CountryList RetrieveID RetrieveSPConfigN);


my $record;
my $context;
my @phones;
my %countries;
my %u_ids;
my $parser;
my $process_text = 0;
my %sp_config_uris;
my $sp_ip="";

sub init()
{
 if (! (-e Definitions::SPMFILE))
 {
   &Utils::showMessage(1, 19, '"Service Provider XML file not found. Contact your local Service Representative.\n"');
   exit 1;
 }

 my $refresh =
 ! (stat(Definitions::SPMFILE_PHONES_PREP)) ||
 ((stat(Definitions::SPMFILE_PHONES_PREP))[9] - (stat(Definitions::SPMFILE))[9]) <= 0 ||
 ! (stat(Definitions::SPMFILE_COUNTRIES_PREP)) ||
 ((stat(Definitions::SPMFILE_COUNTRIES_PREP))[9] - (stat(Definitions::SPMFILE))[9]) <= 0 ||
 ! (stat(Definitions::SPMFILE_REGIONIDS_PREP)) ||
 ((stat(Definitions::SPMFILE_REGIONIDS_PREP))[9] - (stat(Definitions::SPMFILE))[9]) <= 0 ;


 if ($refresh)
 {
  $parser = XML::SAX::ParserFactory->parser(
              Handler => ServiceProviderManager->new);
  $parser->parse_uri(Definitions::SPMFILE);


  # PhoneList

  open(phones_prep_file, "> @{[ Definitions::SPMFILE_PHONES_PREP ]}");
  foreach (sort @phones)
  {
    print phones_prep_file $_;
  }
  close(phones_prep_file);

  # Countries

  open(countries_prep_file, "> @{[ Definitions::SPMFILE_COUNTRIES_PREP ]}");
  foreach (sort keys %countries)
  {
    print countries_prep_file $_;
  }
  close(countries_prep_file);

  # IDs
  open(ids_prep_file, "> @{[ Definitions::SPMFILE_REGIONIDS_PREP ]}");
  foreach (keys %u_ids)
  {
    print ids_prep_file "$_=$u_ids{$_}\n";
  }
  close(ids_prep_file);


 }

}


sub PhoneList()
{
 init();
 open(phones_prep_file, "< @{[ Definitions::SPMFILE_PHONES_PREP ]}");
 while ($_ = <phones_prep_file>)
 {
  print;
 }
 close(phones_prep_file);
}

sub CountryList()
{
 init();
 open(countries_prep_file, "< @{[ Definitions::SPMFILE_COUNTRIES_PREP ]}");
 while ($_ = <countries_prep_file>)
 {
  print;
 }
 close(countries_prep_file);
}


sub RetrieveID($)
{
 my $by_region = shift;
 my $temp_region;
 my $temp_id;
 my $id;

 init();
 open(ids_prep_file, "< @{[ Definitions::SPMFILE_REGIONIDS_PREP ]}");
 LINE: while ($_ = <ids_prep_file>)
 {
  ($temp_region, $temp_id) = $_ =~ /(\w+)=([\w\.]+)/g;
  if ($temp_region eq $by_region)
  {
    $id = $temp_id;
    last LINE;
  }
 }
 close(ids_prep_file);
 return $id;
}

sub start_element
{
  shift;
  my $elem = shift;
  $context = $elem->{LocalName};
  if ($context eq 'Service-Provider-Phone-List-Entry' || 
      $context eq 'Service-Provider-Phone-List-Authentication-Entry' ||
      $context eq 'Service-Provider-Connection-Information-Entry')
  {
   $record = {};
   $process_text = 1;
  }
}

sub characters
{
  if (! $process_text)
  { return; }
  shift;
  $record->{$context} .= shift(@_)->{Data}; #.= because of possible multiple calls
}

sub end_element
{
  shift;
  my $elem = shift;
  $context = $elem->{LocalName};

  if ($context eq 'Service-Provider-Phone-List-Entry')
  {
   $record->{'State-Province'} = "" unless defined $record->{'State-Province'};

   my @phone_entry = ($record->{'Country-Region'},
                      $record->{'State-Province'},
                      $record->{'Location'},
                      $record->{'Phone-Number'});

   foreach (@phone_entry)
   {
     s/\s+$//;
   }

   push(@phones, join(";", @phone_entry)."\n");
   $countries{$phone_entry[0]."\n"} = '1';
   $process_text = 0;
  }

  if ($context eq 'Service-Provider-Phone-List-Authentication-Entry')
  {
   my $temp = $record->{'Country-Region'};
   my $temp2 = $record->{'User-Id'};
   $temp =~ s/\s+$//;
   $temp2 =~ s/\s+$//;

   $u_ids{$temp} = $temp2;
   $process_text = 0;
  }

  if ($context eq 'Service-Provider-Connection-Information-Entry' && defined($record->{'Service-Destination'}) 
      && $record->{'Service-Destination'} =~ /^SP_Config_/)
  {
     foreach (keys %$record) { $record->{$_} =~ s/\s+$//; }
     # $sp_config_uris{$record->{'Service-Destination'}} =
     # ['http://'.$record->{'Host-Name'}
     #           .':'.$record->{'Port'}
     #           .'/'.$record->{'URI'},
     #  'http://'.$record->{'IP-Address'}
     #           .':'.$record->{'Port'}
     #           .'/'.$record->{'URI'}
     # ];
     if (($record->{'Host-Name'} =~ /www-03\.ibm\.com/)  ||
	($record->{'Host-Name'} =~ /rchgsa\.ibm\.com/))
     {
       $sp_ip = $record->{'IP-Address'};
     }
     $process_text = 0;
  }
}

1;
