/** @file Archiver.java
*
* @author marco corvi
* @date june 2012
*
* @brief TopoDroid survey archiver
* --------------------------------------------------------
* Copyright This sowftare is distributed under GPL-3.0 or later
* See the file COPYING.
* --------------------------------------------------------
*/
package com.topodroid.DistoX;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.BufferedOutputStream;
import java.util.zip.ZipOutputStream;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.List;
// import java.util.Locale;
// import java.util.ArrayList;
import android.content.Context;
import android.content.Intent;
// import android.util.Log;
public class Archiver
{
private TopoDroidApp app;
private static final int BUF_SIZE = 2048;
private byte[] data = new byte[ BUF_SIZE ];
public String zipname;
public Archiver( TopoDroidApp _app )
{
app = _app;
data = new byte[ BUF_SIZE ];
}
private boolean addEntry( ZipOutputStream zos, File name )
{
if ( name == null || ! name.exists() ) return false;
boolean ret = false;
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream( new FileInputStream( name ), BUF_SIZE );
ZipEntry entry = new ZipEntry( name.getName() );
int cnt;
zos.putNextEntry( entry );
while ( (cnt = bis.read( data, 0, BUF_SIZE )) != -1 ) {
zos.write( data, 0, cnt );
}
zos.closeEntry( );
ret = true;
} catch (FileNotFoundException e ) {
// FIXME
} catch ( IOException e ) {
// FIXME
} finally {
if ( bis != null ) try { bis.close(); } catch (IOException e ) { }
}
return ret;
}
public boolean archive( )
{
if ( app.mSID < 0 ) return false;
File temp = null;
String survey = app.mySurvey;
boolean ret = true;
zipname = TDPath.getSurveyZipFile( survey );
TDPath.checkPath( zipname );
ZipOutputStream zos = null;
try {
String pathname;
zos = new ZipOutputStream( new BufferedOutputStream( new FileOutputStream( zipname ) ) );
/* FIXME BEGIN SKETCH_3D */
List< Sketch3dInfo > sketches = app.mData.selectAllSketches( app.mSID, TopoDroidApp.STATUS_NORMAL );
for ( Sketch3dInfo skt : sketches ) {
addEntry( zos, new File( TDPath.getSurveySketchFile( survey, skt.name ) ) );
}
sketches = app.mData.selectAllSketches( app.mSID, TopoDroidApp.STATUS_DELETED );
for ( Sketch3dInfo skt : sketches ) {
addEntry( zos, new File( TDPath.getSurveySketchFile( survey, skt.name ) ) );
}
/* END SKETCH_3D */
List< PlotInfo > plots = app.mData.selectAllPlots( app.mSID, TopoDroidApp.STATUS_NORMAL );
for ( PlotInfo plt : plots ) {
addEntry( zos, new File( TDPath.getSurveyPlotTh2File( survey, plt.name ) ) );
addEntry( zos, new File( TDPath.getSurveyPlotTdrFile( survey, plt.name ) ) );
addEntry( zos, new File( TDPath.getSurveyPlotDxfFile( survey, plt.name ) ) );
addEntry( zos, new File( TDPath.getSurveyPlotSvgFile( survey, plt.name ) ) );
addEntry( zos, new File( TDPath.getSurveyPlotPngFile( survey, plt.name ) ) );
if ( plt.type == PlotInfo.PLOT_PLAN ) {
addEntry( zos, new File( TDPath.getSurveyCsxFile( survey, plt.name ) ) );
}
}
plots = app.mData.selectAllPlots( app.mSID, TopoDroidApp.STATUS_DELETED );
for ( PlotInfo plt : plots ) {
addEntry( zos, new File( TDPath.getSurveyPlotTdrFile( survey, plt.name ) ) );
}
List< PhotoInfo > photos = app.mData.selectAllPhotos( app.mSID, TopoDroidApp.STATUS_NORMAL );
for ( PhotoInfo pht : photos ) {
addEntry( zos, new File( TDPath.getSurveyJpgFile( survey, Long.toString(pht.id) ) ) );
}
photos = app.mData.selectAllPhotos( app.mSID, TopoDroidApp.STATUS_DELETED );
for ( PhotoInfo pht : photos ) {
addEntry( zos, new File( TDPath.getSurveyJpgFile( survey, Long.toString(pht.id) ) ) );
}
addEntry( zos, new File( TDPath.getSurveyCsvFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyCsxFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyCaveFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyDatFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyDxfFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyKmlFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyPltFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveySrvFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveySvxFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyThFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyTroFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyTopFile( survey ) ) );
addEntry( zos, new File( TDPath.getSurveyNoteFile( survey ) ) );
pathname = TDPath.getSqlFile( );
app.mData.dumpToFile( pathname, app.mSID );
addEntry( zos, new File(pathname) );
pathname = TDPath.getManifestFile();
app.writeManifestFile();
addEntry( zos, new File(pathname) );
ret = true;
} catch ( FileNotFoundException e ) {
// FIXME
} catch ( IOException e ) {
// FIXME
} finally {
File fp = new File( TDPath.getSqlFile() );
if ( fp.exists() ) {
// fp.delete();
}
if ( zos != null ) try { zos.close(); } catch ( IOException e ) { }
}
return ret;
}
public int unArchive( String filename, String surveyname )
{
int ok_manifest = -2;
String pathname;
try {
// byte buffer[] = new byte[36768];
byte buffer[] = new byte[4096];
TDLog.Log( TDLog.LOG_ZIP, "unzip " + filename );
ZipFile zip = new ZipFile( filename );
ZipEntry ze = zip.getEntry( "manifest" );
if ( ze != null ) {
pathname = TDPath.getManifestFile();
// TDPath.checkPath( pathname );
FileOutputStream fout = new FileOutputStream( pathname );
InputStream is = zip.getInputStream( ze );
int c;
while ( ( c = is.read( buffer ) ) != -1 ) {
fout.write(buffer, 0, c);
}
fout.close();
ok_manifest = app.checkManifestFile( pathname, surveyname );
File f = new File( pathname );
f.delete();
}
zip.close();
TDLog.Log( TDLog.LOG_ZIP, "unArchive manifest " + ok_manifest );
if ( ok_manifest == 0 ) {
FileInputStream fis = new FileInputStream( filename );
ZipInputStream zin = new ZipInputStream( fis );
while ( ( ze = zin.getNextEntry() ) != null ) {
if ( ze.isDirectory() ) {
File dir = new File( TDPath.getDirFile( ze.getName() ) );
if ( ! dir.isDirectory() ) {
dir.mkdirs();
}
} else {
TDLog.Log( TDLog.LOG_ZIP, "Zip entry \"" + ze.getName() + "\"" );
boolean sql = false;
pathname = null;
if ( ze.getName().equals( "manifest" ) ) {
// skip
} else if ( ze.getName().equals( "survey.sql" ) ) {
pathname = TDPath.getSqlFile();
sql = true;
} else if ( ze.getName().endsWith( TDPath.CSV ) ) {
pathname = TDPath.getCsvFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.CSX ) ) {
pathname = TDPath.getCsxFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.CAVE ) ) {
pathname = TDPath.getCaveFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.CAV ) ) {
pathname = TDPath.getCavFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.DAT ) ) {
pathname = TDPath.getDatFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.DXF ) ) {
pathname = TDPath.getDxfFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.KML ) ) {
pathname = TDPath.getKmlFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.PLT ) ) {
pathname = TDPath.getPltFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.PNG ) ) {
pathname = TDPath.getPngFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.SRV ) ) {
pathname = TDPath.getSrvFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.SVG ) ) {
pathname = TDPath.getSvgFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.SVX ) ) {
pathname = TDPath.getSvxFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.TH ) ) {
pathname = TDPath.getThFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.TH2 ) ) {
pathname = TDPath.getTh2File( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.TH3 ) ) {
pathname = TDPath.getTh3File( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.TDR ) ) {
pathname = TDPath.getTdrFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.TRO ) ) {
pathname = TDPath.getTroFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.TOP ) ) {
pathname = TDPath.getTopFile( ze.getName() );
} else if ( ze.getName().endsWith( TDPath.TXT ) ) {
pathname = TDPath.getNoteFile( ze.getName() );
} else if ( ze.getName().endsWith( ".jpg" ) ) { // PHOTOS
// FIXME need survey dir
pathname = TDPath.getJpgDir( surveyname );
File file = new File( pathname );
file.mkdirs();
pathname = TDPath.getJpgFile( surveyname, ze.getName() );
} else {
// unexpected file type
pathname = null; //
}
TDLog.Log( TDLog.LOG_ZIP, "Zip filename \"" + pathname + "\"" );
if ( pathname != null ) {
TDPath.checkPath( pathname );
FileOutputStream fout = new FileOutputStream( pathname );
int c;
while ( ( c = zin.read( buffer ) ) != -1 ) {
fout.write(buffer, 0, c);
}
fout.close();
if ( sql ) {
TDLog.Log( TDLog.LOG_ZIP, "Zip sqlfile \"" + pathname + "\"" );
app.mData.loadFromFile( pathname, app.mManifestDbVersion );
File f = new File( pathname );
f.delete();
}
}
zin.closeEntry();
}
}
zin.close();
}
} catch ( FileNotFoundException e ) {
TDLog.Error( "ERROR File: " + e.toString() );
} catch ( IOException e ) {
TDLog.Error( "ERROR IO: " + e.toString() );
}
return ok_manifest;
}
}