/* * Created on 07-May-2004 * Created by Paul Gardner * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved. * * 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, or (at your option) any later version. * 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. * 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. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.platform.win32; /** * @author parg * */ import java.io.*; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.net.*; import org.gudy.azureus2.core3.util.*; import org.gudy.azureus2.core3.html.HTMLUtils; import org.gudy.azureus2.core3.logging.*; import org.gudy.azureus2.platform.*; import org.gudy.azureus2.plugins.utils.resourcedownloader.*; import org.gudy.azureus2.pluginsimpl.local.utils.resourcedownloader.*; import org.gudy.azureus2.plugins.*; import org.gudy.azureus2.plugins.update.*; import org.gudy.azureus2.pluginsimpl.update.sf.*; public class PlatformManagerUpdateChecker implements Plugin, UpdatableComponent { private static final LogIDs LOGID = LogIDs.CORE; public static final String UPDATE_NAME = "Platform-specific support"; public static final int RD_SIZE_RETRIES = 3; public static final int RD_SIZE_TIMEOUT = 10000; protected PluginInterface plugin_interface; public void initialize( PluginInterface _plugin_interface) { plugin_interface = _plugin_interface; plugin_interface.getPluginProperties().setProperty( "plugin.name", "Platform-Specific Support" ); String version = "1.0"; // default version if plugin not present PlatformManager platform = PlatformManagerFactory.getPlatformManager(); if ( platform.getPlatformType() == PlatformManager.PT_WINDOWS ){ if ( platform.hasCapability( PlatformManagerCapabilities.GetVersion )){ try{ version = platform.getVersion(); }catch( Throwable e ){ Debug.printStackTrace(e); } } plugin_interface.getUpdateManager().registerUpdatableComponent( this, false ); }else{ plugin_interface.getPluginProperties().setProperty( "plugin.version.info", "Not required for this platform" ); } plugin_interface.getPluginProperties().setProperty( "plugin.version", version ); } public String getName() { return( UPDATE_NAME ); } public int getMaximumCheckTime() { return(( RD_SIZE_RETRIES * RD_SIZE_TIMEOUT )/1000); } public void checkForUpdate( final UpdateChecker checker ) { try{ SFPluginDetails sf_details = SFPluginDetailsLoaderFactory.getSingleton().getPluginDetails( plugin_interface.getPluginID()); String current_version = plugin_interface.getPluginVersion(); if (Logger.isEnabled()) Logger.log(new LogEvent(LOGID, "PlatformManager:Win32 update check starts: current = " + current_version)); boolean current_az_is_cvs = Constants.isCVSVersion(); String sf_plugin_version = sf_details.getVersion(); String sf_comp_version = sf_plugin_version; if ( current_az_is_cvs ){ String sf_cvs_version = sf_details.getCVSVersion(); if ( sf_cvs_version.length() > 0 ){ // sf cvs version ALWAYS entry in _CVS sf_plugin_version = sf_cvs_version; sf_comp_version = sf_plugin_version.substring(0,sf_plugin_version.length()-4); } } String target_version = null; if ( sf_comp_version.length() == 0 || !Character.isDigit(sf_comp_version.charAt(0))){ if (Logger.isEnabled()) Logger.log(new LogEvent(LOGID, LogEvent.LT_WARNING, "PlatformManager:Win32 no valid version to check against (" + sf_comp_version + ")")); }else if ( Constants.compareVersions( current_version, sf_comp_version ) < 0 ){ target_version = sf_comp_version; } checker.reportProgress( "Win32: current = " + current_version + ", latest = " + sf_comp_version ); if (Logger.isEnabled()) Logger.log(new LogEvent(LOGID, "PlatformManager:Win32 update required = " + (target_version != null))); if ( target_version != null ){ String target_download = sf_details.getDownloadURL(); if ( current_az_is_cvs ){ String sf_cvs_version = sf_details.getCVSVersion(); if ( sf_cvs_version.length() > 0 ){ target_download = sf_details.getCVSDownloadURL(); } } ResourceDownloaderFactory rdf = ResourceDownloaderFactoryImpl.getSingleton(); ResourceDownloader direct_rdl = rdf.create( new URL( target_download )); String torrent_download = Constants.AELITIS_TORRENTS; int slash_pos = target_download.lastIndexOf("/"); if ( slash_pos == -1 ){ torrent_download += target_download; }else{ torrent_download += target_download.substring( slash_pos + 1 ); } torrent_download += ".torrent"; ResourceDownloader torrent_rdl = rdf.create( new URL( torrent_download )); torrent_rdl = rdf.getSuffixBasedDownloader( torrent_rdl ); // create an alternate downloader with torrent attempt first ResourceDownloader alternate_rdl = rdf.getAlternateDownloader( new ResourceDownloader[]{ torrent_rdl, direct_rdl }); // get size here so it is cached rdf.getTimeoutDownloader(rdf.getRetryDownloader(alternate_rdl,RD_SIZE_RETRIES),RD_SIZE_TIMEOUT).getSize(); List update_desc = new ArrayList(); List desc_lines = HTMLUtils.convertHTMLToText( "", sf_details.getDescription()); update_desc.addAll( desc_lines ); List comment_lines = HTMLUtils.convertHTMLToText( " ", sf_details.getComment()); update_desc.addAll( comment_lines ); String[] update_d = new String[update_desc.size()]; update_desc.toArray( update_d ); final Update update = checker.addUpdate( UPDATE_NAME, update_d, target_version, alternate_rdl, Update.RESTART_REQUIRED_YES ); update.setDescriptionURL(sf_details.getInfoURL()); alternate_rdl.addListener( new ResourceDownloaderAdapter() { public boolean completed( final ResourceDownloader downloader, InputStream data ) { installUpdate( checker, update, downloader, data ); return( true ); } public void failed( ResourceDownloader downloader, ResourceDownloaderException e ) { Debug.out( downloader.getName() + " failed", e ); update.complete( false ); } }); } }catch( Throwable e ){ Debug.printStackTrace( e ); checker.reportProgress( "Failed to load plugin details for the platform manager: " + Debug.getNestedExceptionMessage(e)); checker.failed(); }finally{ checker.completed(); } } protected void installUpdate( UpdateChecker checker, Update update, ResourceDownloader rd, InputStream data ) { ZipInputStream zip = null; try { data = update.verifyData( data, true ); rd.reportActivity( "Data verified successfully" ); UpdateInstaller installer = checker.createInstaller(); zip = new ZipInputStream(data); ZipEntry entry = null; while ((entry = zip.getNextEntry()) != null) { String name = entry.getName(); if (name.toLowerCase().startsWith("windows/")) { // win32 only files name = name.substring(8); // skip the directory entry if (name.length() > 0) { rd.reportActivity("Adding update action for '" + name + "'"); if (Logger.isEnabled()) Logger.log(new LogEvent(LOGID, "PlatformManager:Win32 adding action for '" + name + "'")); installer.addResource(name, zip, false); installer.addMoveAction(name, installer.getInstallDir() + File.separator + name); } } } update.complete( true ); } catch (Throwable e) { update.complete( false ); rd.reportActivity("Update install failed:" + e.getMessage()); }finally{ if ( zip != null ){ try{ zip.close(); }catch( Throwable e ){ } } } } protected List splitMultiLine( String indent, String text ) { int pos = 0; String lc_text = text.toLowerCase(); List lines = new ArrayList(); while( true ){ String line; int p1 = lc_text.indexOf( "<br>", pos ); if ( p1 == -1 ){ line = text.substring(pos); }else{ line = text.substring(pos,p1); pos = p1+4; } lines.add( indent + line ); if ( p1 == -1 ){ break; } } return( lines ); } }