/* * File : Clic3Pac.java * Created : 08-nov-2000 20:25 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * 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 (see the LICENSE file). */ package edu.xtec.jclic.clic3; import edu.xtec.jclic.fileSystem.FileSystem; /** * This class encapsulates a Clic 3.0 package of activities (.pac file), and provides * methods to import it from a data stream and to import it into a * {@link edu.xtec.jclic.project.JClicProject}. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.08 */ public class Clic3Pac extends Clic3 { public String rPath; public String fileName; public String fileDesc; public String[] acts; public int nActs; public int act; public boolean loaded, modified; public boolean autoPass, noPassButtons, noDiskButton, noExitButton; //public boolean botoSep, av800, av256; public int lapToPass; public boolean def, sup, inf, supTFlag, infTFlag; public String chDef, chSup, chInf; public int infP, infT, supP, supT; /** Creates new Clic3Pac */ public Clic3Pac() { acts=null; chDef=chSup=chInf=null; clear(); rPath=BLANK; } public void clear(){ int i; acts=null; fileName=BLANK; fileDesc=BLANK; nActs=0; act=0; autoPass=false; noPassButtons=false; noDiskButton=false; noExitButton=false; //av800=false; //av256=false; lapToPass=0; loaded=false; modified=false; def=sup=inf=supTFlag=infTFlag=false; //botoSep=false; infT=supT=0; infP=25; supP=75; chDef=null; chSup=null; chInf=null; } public boolean load(String name, byte[] data){ String [] txt; String fn; String str; int nLin, fLine, ver; boolean result=false; int i, boolParms; //clear(); /* for(i=0; i<data.length; i++) //if(data[i]==ENDDESC_BYTE) data[i]=ENDDESC; if(data[i]==ENDDESC_BYTE) data[i]=0; */ fileName = FileSystem.getCanonicalNameOf(validFileName(name), false); rPath=FileSystem.getPathPartOf(fileName); fLine=0; if(getExt(fileName)==EXT_PAC && (txt=dataToArray(data))!=null && (nLin=txt.length)>0){ ver=parseIntX(txt[fLine++]); if(ver>1000) ver-=1000; if(ver>107 && ver<=CLICVER){ StringBuilder sb=new StringBuilder(); //fLine++; while(fLine<nLin){ if(txt[fLine].length()>0 && txt[fLine].charAt(0)==ENDDESC){ fLine++; break; } if(sb.length()>0) sb.append("\r\n"); sb.append(txt[fLine++]); } fileDesc=sb.substring(0); if(ver>=113){ boolParms=parseIntX(txt[fLine++]); autoPass=(boolParms & 0x0001)!=0; noPassButtons=(boolParms & 0x0002)!=0; noDiskButton=(boolParms & 0x0004)!=0; noExitButton=(boolParms & 0x0008)!=0; lapToPass=parseIntX(txt[fLine++]); boolParms=parseIntX(txt[fLine++]); def=(boolParms & 0x0001)!=0; sup=(boolParms & 0x0002)!=0; inf=(boolParms & 0x0004)!=0; supTFlag=(boolParms & 0x0008)!=0; infTFlag=(boolParms & 0x0010)!=0; //if(ver>117) botoSep=(boolParms & 0x0020)!=0; if(ver>=119){ //av800=(boolParms & 0x0040)!=0; //av256=(boolParms & 0x0080)!=0; } str=txt[fLine++]; if(str.length()>0) chDef=rPath+validFileName(str); str=txt[fLine++]; if(str.length()>0) chSup=rPath+validFileName(str); str=txt[fLine++]; if(str.length()>0) chInf=rPath+validFileName(str); supP=parseIntX(txt[fLine++]); supT=parseIntX(txt[fLine++]); infP=parseIntX(txt[fLine++]); infT=parseIntX(txt[fLine++]); } } if(fLine>=nLin || ver>CLICVER || (nActs=nLin-fLine)<1 || (acts=new String[nActs])==null || copyArray(acts, 0, txt, fLine, nActs, true)==false) result=false; else result=true; if(!result){ //BMsgBox(0, IDS_LECT, ver>CLICVER ? IDS_ERRNEWV:IDS_ERRFMT, fn); clear(); } else{ for(int l=0; l<acts.length; l++) acts[l]=rPath+validFileName(acts[l]); loaded=true; //if(baseRep) lastElRep=baseRep->getCur(); } } else clear(); return result; } }