/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.motorola.studio.android.emulator.logic.reset;
import static com.motorola.studio.android.common.log.StudioLogger.error;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.osgi.util.NLS;
import com.motorola.studio.android.emulator.EmulatorPlugin;
import com.motorola.studio.android.emulator.i18n.EmulatorNLS;
import com.motorola.studio.android.emulator.logic.IAndroidLogicInstance;
/**
* DESCRIPTION:
* This class contains the business layer of the Android
* Emulator reset procedure
*
* RESPONSIBILITY:
* Reset any Android Emulator
*
* COLABORATORS:
* None.
*
* USAGE:
* Use the public method to reset a Android Emulator
*/
public class AndroidEmulatorReseter
{
/**
* Resets a Android Emulator based at the provided folder
*
* @param userDataFolder The folder where a working copy of the emulator is located
* @param force Perform the reset without questioning the user
*
* @return IStatus the status of the operation
*/
static String SNAPSHOT_FILE_NAME = "snapshots.img";
public static IStatus resetInstance(IAndroidLogicInstance instance)
{
IStatus resetStatus = Status.OK_STATUS;
File userData = instance.getUserdata();
List<File> stateData = instance.getStateData();
if ((userData != null) || (stateData != null))
{
List<File> allFiles = new ArrayList<File>();
if (stateData != null)
{
allFiles.addAll(stateData);
}
if (userData != null)
{
allFiles.add(userData);
}
for (File file : allFiles)
{
if (file.exists())
{
if (!file.delete())
{
error("There was an error when trying to remove the emulator instance user data files");
resetStatus =
new Status(
IStatus.ERROR,
EmulatorPlugin.PLUGIN_ID,
NLS.bind(
EmulatorNLS.EXC_AndroidEmulatorReseter_ErrorWhilePerformingDeleteOperation,
new Path(file.getPath()).removeLastSegments(1)
.toString()));
break;
}
}
}
// When the snapshots file is missing or corrupted after the reset, the snapshot operation will not work properly
// (when start and then closing the AVD after a reset operation,
/// the snapshots file will not be saved), that is why the error message should be shown.
if ((allFiles != null) && (allFiles.size() > 0))
{
File snapshot = instance.getSnapshotOriginalFilePath();
String snapshotToPath =
allFiles.get(0).getParentFile() + File.separator + SNAPSHOT_FILE_NAME;
File snapshotToFile = new File(snapshotToPath);
if ((snapshot != null) && (snapshotToFile.exists()))
{
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try
{
bis = new BufferedInputStream((new FileInputStream(snapshot)));
bos = new BufferedOutputStream(new FileOutputStream(snapshotToFile));
int c;
while ((c = bis.read()) >= 0)
{
bos.write(c);
}
}
catch (Exception e)
{
error("Error while copying the original snapshot file to the avd that is being reseted:"
+ e.getMessage());
if (resetStatus.equals(Status.OK_STATUS))
{
resetStatus =
new Status(
IStatus.ERROR,
EmulatorPlugin.PLUGIN_ID,
NLS.bind(
EmulatorNLS.EXC_AndroidEmulatorReseter_ErrorWhilePerformingSnapshotCopyOperation,
snapshot.getPath(), allFiles.get(0)
.getParentFile()));
}
else
{
resetStatus =
new Status(
IStatus.ERROR,
EmulatorPlugin.PLUGIN_ID,
NLS.bind(
EmulatorNLS.EXC_AndroidEmulatorReseter_ErrorWhilePerformingDeleteSnapshotOperation,
allFiles.get(0).getParentFile(),
snapshot.getPath()));
}
}
finally
{
try
{
if (bis != null)
{
bis.close();
}
if (bos != null)
{
bos.close();
}
}
catch (Exception e)
{
error("Error while closing the snapshots file of the avd that is being reseted:"
+ e.getMessage());
}
}
}
}
}
return resetStatus;
}
}