
// DLLUninstallAction.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Vytvořeno na základě ukázkové aplikace sytému install4j 
   s názvem HelloUninstallAction example.

   Před hlavním odinstalovacím procesem systému install4j
   odinstaluje všechny soubory typu DLL.

   Tato třída se spouští v adresáři <PROG_DIR>/.install4j,
   ovšem soubory typu DLL maže v adresáři <PROG_DIR>/Executables,
   což je důvod, proč má konstanta PATH na začátku dvě tečky.
*/

import java.io.*;
import com.install4j.api.*;


public class DLLUninstallAction extends UninstallAction 
{
  private static final String PATH = "../Executables";
       // umístění souborů typu DLL vzhledem k adresáři <PROG_DIR>/.install4j


  public boolean performAction(Context context, ProgressInterface progReport) 
  // tuto metodu volá systém install4j pro vykonání činností souvisejících s odinstalováním
  {
    File delDir = new File(PATH);

    FilenameFilter dllFilter = new FilenameFilter() {
      public boolean accept(File dir, String name) 
      { return name.endsWith("dll");  }
    };

    String[] fNms = delDir.list(dllFilter); // seznam souborů typu DLL
    if (fNms.length == 0)
      System.out.println("Odinstalace: žádné soubory typu DLL nebyly nalezeny");
    else
      deleteDLLs(fNms, progReport);
    return true;
  } // konec metody: performAction()


  private void deleteDLLs(String[] fNms, ProgressInterface progReport)
  // maže všechny soubory typu DLL a svůj postup vypisuje na výstup
  {
    progReport.setStatusMessage("Mažu instalované soubory typu DLL");
 
    int numFiles = fNms.length;
    String msg;
    for (int i=0; i < numFiles; i++) {
      msg = new String("" + (i+1) + "/" + numFiles + ": " + fNms[i] + "... ");
      deleteFile(fNms[i], progReport, msg);
      progReport.setPercentCompleted( ((i+1)*100)/numFiles );
      try {
        Thread.sleep(500);   // vyčkej 0,5, aby bylo něco vidět
      } 
      catch (InterruptedException e) {}
    }
  }  // konec metody: deleteDLLs()


  private static void deleteFile(String dllFnm, ProgressInterface progReport, String msg)
  // smaže pojmenovaný soubor s adresáře Executables/ 
  {
    File f = new File(PATH + "/" + dllFnm);
    if (!f.exists())
      progReport.setDetailMessage(msg + "neexistuje");
    else {
      if (f.delete())
        progReport.setDetailMessage(msg + "hotovo");
      else
        progReport.setDetailMessage(msg + "CHYBA");
    }
  }  // konec metody: deleteFile()


  public int getPercentOfTotalInstallation() 
  // procento stavové lišty reprezentované touto akcí
  { return 50; }    // protože nemáme žádné post-odinstalační činnost

} // konec třídy: DLLUninstallAction

