/*
* Copyright (C) 2015 iZc
*
* 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 3 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, see .
*/
package de.nplusc.izc.InstallPak.legacy;
import de.nplusc.izc.InstallPak.izsetupReader;
import de.nplusc.izc.tools.IOtools.FileTK;
import de.nplusc.izc.tools.IOtools.registryReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
/**
*
* @author LH
*/
public class PackManager
{
private HashMap> groupsplitted = new HashMap<>();
private String[] installingPacks,AllPacks,DetectedPacks,queue;
/**
* Lädt die Liste aller Packs aus der aktiven Datei
* @return PAckliste im FOrmat ID|Name
*
*/
public String[] getPackList()
{
String[] ret = new String[AllPacks.length];
for (int i=0;i group=groupsplitted.get(id);
for (String row[] : group)
{
String[] rowSplit = row;
if(rowSplit[1].equalsIgnoreCase("pack"))
ret[i] = id+"|"+rowSplit[2];
}
}
return ret;
}
public void loadPackageData(String path)
{
String[][] data = izsetupReader.getSysSpezSetupFile(path,true,true);
String groupID="000";
String previousGRPID ="000";
ArrayList SubGroup = new ArrayList<>();
for (String[] line : data)
{
if(!(line==null))
{
String[] splittedLine=line;
if(!splittedLine[0].equals("000"))
{
groupID=splittedLine[0];
if(!previousGRPID.equals(groupID)&&!previousGRPID.equals("000"))
{
groupsplitted.put(previousGRPID, SubGroup);//Einlagern der abgeschlossenen gruppe
SubGroup = new ArrayList<>();//resetten für neue daten;
}
SubGroup.add(line);
previousGRPID=groupID;
}
}
}
groupsplitted.put(previousGRPID, SubGroup);//die letzte auch noch einflanschen
String[] groupIDs = groupsplitted.keySet().toArray(new String[0]);
Arrays.sort(groupIDs);
AllPacks = groupIDs;
checkForpackInstalled();
ArrayList installables = new ArrayList<>();
for (String id : AllPacks)
{
if(!packIsInstalled(id))
installables.add(id);
}
installingPacks = installables.toArray(new String[0]);
Arrays.sort(installingPacks);
}
public void setPackInstallState(String packid, boolean state)
{
boolean exists = false;
for (int i = 0; i < installingPacks.length; i++)
{
String id = installingPacks[i];
if(packid.equals(id))
{
exists=true;
if(!state)
{
installingPacks[i]="";
}
}
}
ArrayList newGrps = new ArrayList<>();
for (String cnt : installingPacks)
{
if(cnt.length()>1)
{
newGrps.add(cnt);
}
}
if(!exists&&state)
{
newGrps.add(packid);
}
installingPacks = newGrps.toArray(new String[0]);
newGrps = new ArrayList<>();
for (String cnt : installingPacks)
{
if(packIsInstallable(cnt))
newGrps.add(cnt);
}
installingPacks = newGrps.toArray(new String[0]);
}
public boolean packIsInstallable(String packid)
{
return packIsInstallable(packid, false);
}
public boolean packIsInstallable(String packid,boolean blocksItself)
{
String reqPack = packDependency(packid);
for (String pack : DetectedPacks)//Detektiere obDependency installiert(dependency erfüllt wenn pack bereits installiert
{
if(reqPack.equalsIgnoreCase(pack))
return true;
}
if(blocksItself)
{
for (String pack : installingPacks)//detektiere obDependency in installierliste
{
if(packid.equalsIgnoreCase(pack))
return false;
}
}
for (String pack : installingPacks)//detektiere obDependency in installierliste
{
if(reqPack.equalsIgnoreCase(pack)&&packIsInstallable(reqPack))
return true;
}
if(reqPack.equals("none"))
return true;
return false;
}
public boolean packIsInstalled(String packid)
{
for (String cntnt : DetectedPacks)
{
if(cntnt.equalsIgnoreCase(packid))
return true;
}
return false;
}
public boolean packIsScheduled(String packid)
{
for (String cntnt : installingPacks)
{
if(cntnt.equalsIgnoreCase(packid))
return true;
}
return false;
}
public String packDependency(String packid)
{
ArrayList selectedPack = groupsplitted.get(packid);
//002|req|001|nummer des benötigten packs//kann weitere erfordernwenn
for (String[] line : selectedPack)
{
String[] linesegs = line;
if(linesegs[1].equalsIgnoreCase("req"))
return linesegs[2];
}
return "none";
}
//005|Description|Tools für die games aus dem Package
public String getPackDescription(String packid)
{
ArrayList selectedPack = groupsplitted.get(packid);
for (String[] line : selectedPack)
{
String[] linesegs = line;
if(linesegs[1].equalsIgnoreCase("Description"))
return linesegs[2];
}
return "Error 0x0404: keine Beschreiubung gefunden";
}
public String getPackName(String packid)
{
ArrayList selectedPack = groupsplitted.get(packid);
for (String line[] : selectedPack)
{
String[] linesegs = line;
if(linesegs[1].equalsIgnoreCase("pack"))
return linesegs[2];
}
return "Error 0x0404: kein Name gefunden";
}
private void checkForpackInstalled()
{
ArrayList installedPack = new ArrayList<>();
for (int i=0;i group=groupsplitted.get(id);
for (String[] row : group)
{
String[] rowSplit = row;
if(rowSplit[1].equalsIgnoreCase("detectInstall"))
{
String detecString = rowSplit[2];
//CMM|File:// benutzt den DateiExistiert-operator
//CMM|Reg:// detektiert unter Win auf Exitenz von Regwert
if(detecString.substring(0,7).equalsIgnoreCase("File://"))
{
String detecpart = detecString.substring(7);
if(FileTK.checkDirExist(detecpart))
{
installedPack.add(id);
}
}
if(detecString.substring(0,6).equalsIgnoreCase("Reg://"))
{
String detecpart = detecString.substring(6);
if(registryReader.checkExistenceOfRegKey(detecpart)||registryReader.checkExistenceOfRegKeyEntry(detecpart))
{
installedPack.add(id);
}
}
}
}
}
DetectedPacks = installedPack.toArray(new String[0]);
}
public void createQueue()
{
Arrays.sort(installingPacks);
ArrayList queuetmp = new ArrayList<>();
for (String id : installingPacks)
{
ArrayList grpldr =groupsplitted.get(id);
for (String[] line : grpldr)
{
String[] data = line;
if(data[1].equalsIgnoreCase("packfile"))
{
queuetmp.add("packfile:"+data[2]);
}
if(data[1].startsWith("waitdisk:"))
{
queuetmp.add("waitdisk:"+data[2]+"|"+data[1].substring(9));
}
}
}
queue=queuetmp.toArray(new String[0]);
}
public String[] getQueue()
{
return queue;
}
}