package LiveContacts.Connections;

import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;

import net.rim.device.api.xml.parsers.ParserConfigurationException;
import net.rim.device.api.xml.parsers.SAXParser;
import net.rim.device.api.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class ApnInfo
{
	private String _apnDescription;
    private String _apnName;
    private String _apnLoginName;
    private String _apnPassword;
    private boolean _isValid;

    public void setValid(boolean aIsValid)
    {
        this._isValid = aIsValid;
    }

    public boolean isValid()
    {
        return _isValid;
    }

    public ApnInfo(String aApnName, String aApnDescription, String aLoginName, String aPassword)
    {
    	_apnDescription = aApnDescription;
        _apnName = aApnName;
        _apnLoginName = aLoginName;
        _apnPassword = aPassword;
    }
    
	public void SetApnDescription(String _apnName) {
		this._apnDescription = _apnName;
	}

	public String getApnDescription() {
		return _apnDescription;
	}   

    
    public void setApn(String _apn)
    {
        this._apnName = _apn;
    }

    public String getApn()
    {
        return _apnName;
    }

    public void setApnLoginName(String _apnLoginName)
    {
        this._apnLoginName = _apnLoginName;
    }

    public String getApnLoginName()
    {
        return _apnLoginName;
    }

    public void setApnPassword(String _apnPassword)
    {
        this._apnPassword = _apnPassword;
    }

    public String getApnPassword()
    {
        return _apnPassword;
    }

    public static ApnInfo [] GetApnStringsFromXml(int aMcc, int aMnc)
    {
    	// see: http://docstore.mik.ua/orelly/xml/sax2/ch02_03.htm
    	
        SAXParserFactory saxFac = SAXParserFactory.newInstance();
        SAXParser saxParser = null;
        final int theMcc = aMcc;
        final int theMnc = aMnc;
        final Vector apnInfoVector = new Vector();
        
        try
        {
            saxParser = saxFac.newSAXParser();

            Class c = Class.forName("LiveContacts.FWMEngine");
            InputStream is = c.getResourceAsStream("/serviceproviders.xml");
            
            DefaultHandler checkForCountryOnly = new DefaultHandler()
            {
            	private boolean _readingMCC = false;
            	
            	private boolean _readingApnDescription = false;
            	private boolean _readingApnName = false;
            	private boolean _readingUserName = false;
            	private boolean _readingPassword = false;
            	
            	private boolean _mccFound = false;
            	
            	private String  _apnDescription;
            	private String  _apnName;
            	private String  _apnUsername;
            	private String  _apnPassword;

                public void characters(char[] buf, int offset, int length) throws SAXException 
                {
                	String value = new String (buf, offset, length);
                	if ( _readingMCC )
                	{
                		int mccInt = Integer.parseInt(value);
                		if (mccInt == theMcc)
                			_mccFound = true;
                	}
                	else if ( _readingApnDescription )
                	{
                		_apnDescription = value;	
                	}
					else if ( _readingApnName )
					{
						_apnName = value;
					}
					else if ( _readingUserName )
					{
						_apnUsername = value;
					}
					else if ( _readingPassword )
					{
						_apnPassword = value;
					}
				}

				public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException
                {
					if ( "mcc".equals(name) )
						_readingMCC = true;
					else if ( "name".equals(name) )
		            	_readingApnDescription = true;						
					else if ( "apn".equals(name) )
						_readingApnName = true;		
					else if ( "username".equals(name) )
						_readingUserName = true;			
					else if ( "password".equals(name) )
						_readingPassword = true;
					else if ( "country".equals(name) )
						// if we encounter a new country element, we need to check if it contains the correct mcc
						_mccFound = false;
                }

                public void endElement(String uri, String name, String qName)
                {
					_readingMCC = _readingApnDescription 
					= _readingApnName = _readingUserName = _readingPassword = false;
                	
                	if ( "provider".equals(name) )
                	{
                		if ( _mccFound )
                		{
                			// we have found ourselves a correct APN
                			ApnInfo apn = new ApnInfo(_apnName, _apnDescription, _apnUsername, _apnPassword);
                			apnInfoVector.addElement(apn);
                			
                        	_apnDescription = _apnName = _apnUsername = _apnPassword = null;
                		}
                	}
                }
            };

            DefaultHandler checkForCountryANDOperator = new DefaultHandler()
            {
            	private boolean _readingMCC = false;
            	private boolean _readingMNC = false;
            	
            	private boolean _readingApnDescription = false;
            	private boolean _readingApnName = false;
            	private boolean _readingUserName = false;
            	private boolean _readingPassword = false;
            	
            	private boolean _mccFound = false;
            	private boolean _mncFound = false;
            	
            	private String  _apnDescription;
            	private String  _apnName;
            	private String  _apnUsername;
            	private String  _apnPassword;

                public void characters(char[] buf, int offset, int length) throws SAXException 
                {
                	String value = new String (buf, offset, length);
                	if ( _readingMCC )
                	{
                		int mccInt = Integer.parseInt(value);
                		if (mccInt == theMcc)
                			_mccFound = true;
                	}
                	else if ( _readingMNC )
                	{
                		int mncInt = Integer.parseInt(value);
                		if (mncInt == theMnc)
                			_mncFound = true;
                	}
                	else if ( _readingApnDescription )
                	{
                		_apnDescription = value;	
                	}
					else if ( _readingApnName )
					{
						_apnName = value;
					}
					else if ( _readingUserName )
					{
						_apnUsername = value;
					}
					else if ( _readingPassword )
					{
						_apnPassword = value;
					}
				}

				public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException
                {
					if ( "mcc".equals(name) )
						_readingMCC = true;
					else if ( "mnc".equals(name) )
						_readingMNC = true;
					else if ( "name".equals(name) )
		            	_readingApnDescription = true;						
					else if ( "apn".equals(name) )
						_readingApnName = true;		
					else if ( "username".equals(name) )
						_readingUserName = true;			
					else if ( "password".equals(name) )
						_readingPassword = true;
					else if ( "provider".equals(name) )
						// if we encounter a new provider element, we need to check if it contains the correct mnc 
						_mncFound = false; 			 
					else if ( "country".equals(name) )
						// if we encounter a new country element, we need to check if it contains the correct mcc
						_mccFound = false;
                }

                public void endElement(String uri, String name, String qName)
                {
					_readingMCC = _readingMNC = _readingApnDescription 
					= _readingApnName = _readingUserName = _readingPassword = false;
                	
                	if ( "provider".equals(name) )
                	{
                		if ( _mccFound && _mncFound )
                		{
                			// we have found ourselves a correct APN
                			ApnInfo apn = new ApnInfo(_apnName, _apnDescription, _apnUsername, _apnPassword);
                			apnInfoVector.addElement(apn);
                			
                        	_apnDescription = _apnName = _apnUsername = _apnPassword = null;
                        	_mncFound = false;
                		}
                	}
                }
            };
            saxParser.parse(is, checkForCountryANDOperator);
            
            if ( apnInfoVector.size() == 0 )
            {
            	is.close();
            	InputStream isSecondTry = c.getResourceAsStream("/serviceproviders.xml");
            	saxParser.parse(isSecondTry, checkForCountryOnly);
            	isSecondTry.close();
            }
            
            
        }
        catch (ParserConfigurationException e) { return null; } 
        catch (SAXException e) { return null; }
        catch (IOException e) { return null; }
        catch (ClassNotFoundException e) { return null; }
        
        if ( apnInfoVector.size() > 0 )
        {
	        ApnInfo [] apns = new ApnInfo[apnInfoVector.size()];
	        apnInfoVector.copyInto(apns);
	        return apns;
        }
        else
        	return null;
    }
}
