/*
* File : ExternalIPCheckerServiceImpl.java
* Created : 09-Nov-2003
* By : parg
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.core3.ipchecker.extipchecker.impl;
/**
* @author parg
*
*/
import java.util.*;
import java.io.*;
import java.net.*;
import org.gudy.azureus2.core3.internat.*;
import org.gudy.azureus2.core3.ipchecker.extipchecker.*;
import org.gudy.azureus2.core3.util.*;
public abstract class
ExternalIPCheckerServiceImpl
implements ExternalIPCheckerService, Cloneable
{
private static final int MAX_PAGE_SIZE = 4096;
private static final String MSG_KEY_ROOT = "IPChecker.external";
private String name;
private String description;
private String url;
private boolean completed;
private Vector listeners = new Vector();
private AEMonitor this_mon = new AEMonitor( "ExtIPCheckServ");
private AESemaphore timeout_sem = new AESemaphore( "ExtIPCheckServ" );
protected
ExternalIPCheckerServiceImpl(
String name_key )
{
name = MessageText.getString( name_key + ".name" );
description = MessageText.getString( name_key + ".description" );
url = MessageText.getString( name_key + ".url" );
}
public void
initiateCheck(
long timeout )
{
_clone().initiateCheckSupport(timeout);
}
protected ExternalIPCheckerServiceImpl
_clone()
{
try{
return((ExternalIPCheckerServiceImpl)clone());
}catch( CloneNotSupportedException e){
Debug.printStackTrace( e );
return( null );
}
}
protected void
initiateCheckSupport(
final long timeout )
{
Thread t =
new AEThread("IPChecker")
{
public void
runSupport()
{
try{
initiateCheckSupport();
}finally{
setComplete();
}
}
};
t.setDaemon( true );
t.start();
if ( timeout > 0 ){
Thread t2 =
new AEThread("IPChecker2")
{
public void
runSupport()
{
try{
if ( !timeout_sem.reserve( timeout )){
if ( !completed ){
informFailure( "timeout" );
setComplete();
}
}
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
};
t2.setDaemon( true );
t2.start();
}
}
protected abstract void
initiateCheckSupport();
protected void
setComplete()
{
completed = true;
}
protected String
loadPage(
String url_string )
{
try{
URL url = new URL( url_string );
HttpURLConnection connection = null;
InputStream is = null;
try{
connection = (HttpURLConnection)url.openConnection();
int response = connection.getResponseCode();
if( response == HttpURLConnection.HTTP_ACCEPTED || response == HttpURLConnection.HTTP_OK ){
is = connection.getInputStream();
String page = "";
while( page.length() < MAX_PAGE_SIZE ){
byte[] buffer = new byte[2048];
int len = is.read( buffer );
if ( len < 0 ){
break;
}
page += new String(buffer, 0, len);
}
return( page );
}else{
informFailure( "httpinvalidresponse", "" + response );
return( null );
}
}finally{
try{
if ( is != null ){
is.close();
}
if ( connection != null ){
connection.disconnect();
}
}catch( Throwable e){
Debug.printStackTrace( e );
}
}
}catch( Throwable e ){
informFailure( "httploadfail", e.toString());
return( null );
}
}
protected String
extractIPAddress(
String str )
{
int pos = 0;
while(pos < str.length()){
int p1 = str.indexOf( '.', pos );
if ( p1 == -1 ){
informFailure( "ipnotfound" );
return( null );
}
if ( p1 > 0 ){
if ( Character.isDigit(str.charAt(p1-1))){
int p2 = p1-1;
while(p2>=0&&Character.isDigit(str.charAt(p2))){
p2--;
}
p2++;
int p3 = p2+1;
int dots = 0;
while(p3<str.length()){
char c = str.charAt(p3);
if ( c == '.' ){
dots++;
}else if ( Character.isDigit( c )){
}else{
break;
}
p3++;
}
if ( dots == 3 ){
return( str.substring(p2,p3));
}
}
}
pos = p1+1;
}
informFailure( "ipnotfound" );
return( null );
}
public String
getName()
{
return( name );
}
public String
getDescription()
{
return( description );
}
public String
getURL()
{
return( url );
}
protected void
informSuccess(
String ip )
{
try{
this_mon.enter();
if ( !completed ){
timeout_sem.releaseForever();
for ( int i=0;i<listeners.size();i++){
((ExternalIPCheckerServiceListener)listeners.elementAt(i)).checkComplete( this, ip );
}
}
}finally{
this_mon.exit();
}
}
protected void
informFailure(
String msg_key )
{
try{
this_mon.enter();
informFailure( msg_key, null );
}finally{
this_mon.exit();
}
}
protected void
informFailure(
String msg_key,
String extra )
{
try{
this_mon.enter();
if ( !completed ){
timeout_sem.releaseForever();
String message = MessageText.getString( MSG_KEY_ROOT + "." + msg_key );
if ( extra != null ){
message += ": " + extra;
}
for ( int i=0;i<listeners.size();i++){
((ExternalIPCheckerServiceListener)listeners.elementAt(i)).checkFailed( this, message );
}
}
}finally{
this_mon.exit();
}
}
protected void
reportProgress(
String msg_key )
{
try{
this_mon.enter();
reportProgress( msg_key, null );
}finally{
this_mon.exit();
}
}
protected void
reportProgress(
String msg_key,
String extra )
{
try{
this_mon.enter();
if ( !completed ){
String message = MessageText.getString( MSG_KEY_ROOT.concat(".").concat(msg_key) );
if ( extra != null ){
message = message.concat(": ").concat(extra);
}
for ( int i=0;i<listeners.size();i++){
((ExternalIPCheckerServiceListener)listeners.elementAt(i)).reportProgress( this, message );
}
}
}finally{
this_mon.exit();
}
}
public void
addListener(
ExternalIPCheckerServiceListener l )
{
try{
this_mon.enter();
listeners.addElement( l );
}finally{
this_mon.exit();
}
}
public void
removeListener(
ExternalIPCheckerServiceListener l )
{
try{
this_mon.enter();
listeners.removeElement( l );
}finally{
this_mon.exit();
}
}
}
|