diff options
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.java | 189 |
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; + } +} |