summaryrefslogtreecommitdiff
path: root/src/plugins/emulator/src/com/motorola/studio/android/emulator/logic/reset/AndroidEmulatorReseter.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/emulator/src/com/motorola/studio/android/emulator/logic/reset/AndroidEmulatorReseter.java')
-rw-r--r--src/plugins/emulator/src/com/motorola/studio/android/emulator/logic/reset/AndroidEmulatorReseter.java189
1 files changed, 189 insertions, 0 deletions
diff --git a/src/plugins/emulator/src/com/motorola/studio/android/emulator/logic/reset/AndroidEmulatorReseter.java b/src/plugins/emulator/src/com/motorola/studio/android/emulator/logic/reset/AndroidEmulatorReseter.java
new file mode 100644
index 0000000..4f0ad44
--- /dev/null
+++ b/src/plugins/emulator/src/com/motorola/studio/android/emulator/logic/reset/AndroidEmulatorReseter.java
@@ -0,0 +1,189 @@
+/*
+* 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;
+ }
+}