From 3d69cf772b4a1a4a1db296fc82fa2c3469446b62 Mon Sep 17 00:00:00 2001 From: donghee yang Date: Wed, 3 Jul 2013 15:25:40 +0900 Subject: [PATCH] 2013-07-03 sources upload Change-Id: I55b7a615e4fae2c34bc2ace7e2153d299732e436 --- .../updater/InstallManagerUpdater.java | 125 -- SdkImageCreator/README | 5 - SdkImageCreator/build.xml | 79 -- SdkImageCreator/installmanager.conf | 9 - SdkImageCreator/lib/jarinjar.zip | Bin 7841 -> 0 bytes SdkImageCreator/sic.sh | 80 -- .../src/org/tizen/installmanager/core/Config.java | 597 -------- .../core/DistributionController.java | 369 ----- .../tizen/installmanager/core/IMExitException.java | 48 - .../installmanager/core/IMFatalException.java | 64 - .../core/IMInstallCancelException.java | 40 - .../tizen/installmanager/core/InstallManager.java | 1258 ----------------- .../org/tizen/installmanager/core/Installer.java | 492 ------- .../src/org/tizen/installmanager/core/Options.java | 248 ---- .../installmanager/core/SDKExtensionInfo.java | 169 --- .../org/tizen/installmanager/core/SnapshotLog.java | 115 -- .../installmanager/core/UpdateInstallManager.java | 335 ----- .../src/org/tizen/installmanager/lib/Checksum.java | 137 -- .../org/tizen/installmanager/lib/Documents.java | 110 -- .../org/tizen/installmanager/lib/Downloader.java | 696 --------- .../tizen/installmanager/lib/ErrorController.java | 254 ---- .../installmanager/lib/IFileSystemInformation.java | 71 - .../installmanager/lib/IIMProgressMonitor.java | 75 - .../src/org/tizen/installmanager/lib/IMError.java | 110 -- .../src/org/tizen/installmanager/lib/Log.java | 229 --- .../installmanager/lib/LoggerShellParser.java | 104 -- .../org/tizen/installmanager/lib/NetworkProxy.java | 144 -- .../org/tizen/installmanager/lib/OldRegistry.java | 278 ---- .../src/org/tizen/installmanager/lib/Platform.java | 157 --- .../installmanager/lib/ProgramController.java | 124 -- .../src/org/tizen/installmanager/lib/Registry.java | 268 ---- .../tizen/installmanager/lib/SDKPackageFormat.java | 179 --- .../org/tizen/installmanager/lib/ShellParser.java | 165 --- .../org/tizen/installmanager/lib/StartMenu.java | 115 -- .../lib/linux/LinuxFileSystemInfo.java | 123 -- .../lib/linux/LinuxProgramController.java | 192 --- .../lib/linux/LinuxSDKPackageFormat.java | 189 --- .../lib/linux/LinuxShellInstalledListParser.java | 282 ---- .../lib/linux/LinuxShellRunningProgramParser.java | 100 -- .../lib/mac/MacProgramController.java | 33 - .../lib/win/WindowsFileSystemInfo.java | 72 - .../lib/win/WindowsProgramController.java | 221 --- .../installmanager/lib/win/WindowsRegistry.java | 111 -- .../lib/win/WindowsSDKPackageFormat.java | 254 ---- .../lib/win/WindowsShellRunningProgramParser.java | 121 -- .../installmanager/pkg/lib/PackageManager.java | 1488 -------------------- .../installmanager/pkg/lib/PropertyParser.java | 305 ---- .../pkg/lib/darwin/DarwinPackageManager.java | 22 - .../pkg/lib/linux/LinuxPackageManager.java | 45 - .../pkg/lib/win/WindowsPackageManager.java | 47 - .../tizen/installmanager/pkg/model/ConfigFile.java | 473 ------- .../installmanager/pkg/model/Distribution.java | 117 -- .../installmanager/pkg/model/DistributionSet.java | 76 - .../pkg/model/IMPackageNotFound.java | 55 - .../tizen/installmanager/pkg/model/Package.java | 501 ------- .../tizen/installmanager/pkg/model/PackageSet.java | 120 -- .../tizen/installmanager/pkg/model/Properties.java | 41 - .../tizen/installmanager/pkg/model/Property.java | 73 - .../installmanager/pkg/model/PropertySection.java | 58 - .../tizen/installmanager/pkg/model/Snapshot.java | 180 --- .../installmanager/pkg/model/SnapshotList.java | 81 -- .../tizen/installmanager/pkg/model/Version.java | 227 --- .../installmanager/ui/InstallManagerWindow.java | 879 ------------ .../installmanager/ui/dialog/AddExtraDialog.java | 256 ---- .../ui/dialog/AddExtraRepositoryDialog.java | 300 ---- .../ui/dialog/ChangeServerDialog.java | 146 -- .../ui/dialog/ConfigurationDialog.java | 925 ------------ .../ui/dialog/IndeterminateProgressDialog.java | 185 --- .../tizen/installmanager/ui/dialog/LoginDlg.java | 171 --- .../installmanager/ui/dialog/MessageBoxDlg.java | 98 -- .../ui/dialog/SnapshotLogDialog.java | 110 -- .../org/tizen/installmanager/ui/model/Item.java | 582 -------- .../installmanager/ui/model/ItemLabelProvider.java | 150 -- .../ui/model/ItemTreeContentProvider.java | 97 -- .../org/tizen/installmanager/ui/page/.gitignore | 1 - .../tizen/installmanager/ui/page/CompletePage.java | 141 -- .../installmanager/ui/page/ConfigPathPage.java | 88 -- .../ui/page/InstallableListPage.java | 330 ----- .../installmanager/ui/page/InstallingPage.java | 591 -------- .../tizen/installmanager/ui/page/LicensePage.java | 86 -- .../installmanager/ui/page/PackageListPage.java | 591 -------- .../ui/page/SetInstallDirectoryPage.java | 404 ------ .../ui/page/UninstallableListPage.java | 145 -- .../installmanager/ui/page/UninstallingPage.java | 344 ----- .../installmanager/ui/page/UpdatableListPage.java | 102 -- .../installmanager/ui/page/ViewController.java | 439 ------ .../tizen/installmanager/ui/page/WelcomePage.java | 270 ---- .../installmanager/util/IMShellCommandFail.java | 40 - .../org/tizen/installmanager/util/PathUtil.java | 820 ----------- .../org/tizen/installmanager/util/ShellUtil.java | 206 --- SdkImageCreator/src/res/COPYING | 12 - .../desktop_directory/ExecuteInstallManager.vbs | 3 - .../res/desktop_directory/checkJavaInstallation.sh | 5 - .../res/desktop_directory/checkRunningTaskList.vbs | 21 - .../src/res/desktop_directory/install.sh | 54 - .../src/res/desktop_directory/install.vbs | 19 - .../src/res/desktop_directory/makeshortcut.sh | 101 -- .../src/res/desktop_directory/makeshortcut.vbs | 15 - .../src/res/desktop_directory/remove.sh | 23 - .../src/res/desktop_directory/remove.vbs | 27 - .../src/res/desktop_directory/removeOldSDK.sh | 34 - .../src/res/desktop_directory/removeOldSDK.vbs | 24 - .../src/res/desktop_directory/removeshortcut.sh | 6 - .../src/res/desktop_directory/removeshortcut.vbs | 10 - .../desktop_directory/tizen-sdk-installmanager.ico | Bin 149216 -> 0 bytes .../desktop_directory/tizen-sdk-installmanager.png | Bin 18685 -> 0 bytes .../res/desktop_directory/tizen-sdk-menu.directory | 6 - .../src/res/desktop_directory/tizen-sdk-menu.ico | Bin 143332 -> 0 bytes .../src/res/desktop_directory/tizen-sdk-menu.png | Bin 18038 -> 0 bytes SdkImageCreator/src/res/icons/SDK_icon.png | Bin 9051 -> 0 bytes .../src/res/icons/icon_directory_open.png | Bin 3241 -> 0 bytes SdkImageCreator/src/res/icons/icon_error.png | Bin 5913 -> 0 bytes SdkImageCreator/src/res/icons/icon_loading.png | Bin 6914 -> 0 bytes SdkImageCreator/src/res/icons/icon_login.png | Bin 6271 -> 0 bytes SdkImageCreator/src/res/icons/icon_messages.png | Bin 6327 -> 0 bytes SdkImageCreator/src/res/icons/icon_notify.png | Bin 6295 -> 0 bytes SdkImageCreator/src/res/icons/icon_permission.png | Bin 6334 -> 0 bytes .../src/res/icons/icon_repositories.png | Bin 8232 -> 0 bytes SdkImageCreator/src/res/icons/icon_warning.png | Bin 5240 -> 0 bytes .../images/install_manager_graphicmotif_001.png | Bin 45492 -> 0 bytes .../images/install_manager_graphicmotif_002.png | Bin 45516 -> 0 bytes .../images/install_manager_graphicmotif_003.png | Bin 45554 -> 0 bytes .../images/install_manager_graphicmotif_004.png | Bin 45495 -> 0 bytes .../install_manager_graphicmotif_welcome.png | Bin 55243 -> 0 bytes .../res/images/uninstaller_graphicmotif_001.png | Bin 45590 -> 0 bytes .../res/images/uninstaller_graphicmotif_002.png | Bin 45686 -> 0 bytes .../res/images/uninstaller_graphicmotif_003.png | Bin 45733 -> 0 bytes .../src/res/installmanager/buildversion | 1 - .../src/res/installmanager/removetizentemp.bat | 25 - UpdateInstallManager/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 12 - .../updater/InstallManagerUpdater.java | 183 --- .../org/tizen/installmanager/updater/PathUtil.java | 93 -- unittest/.project | 17 - unittest/.settings/org.eclipse.jdt.core.prefs | 12 - .../installmanager/tests/InstallManagerTest.java | 61 - .../installmanager/tests/Packages_repo.list | 319 ----- .../installmanager/tests/installedpackage.list | 100 -- .../installmanager/util/TestResourceHandler.java | 31 - 139 files changed, 22584 deletions(-) delete mode 100644 InstallManagerUpdater/src/org/tizen/installmanager/updater/InstallManagerUpdater.java delete mode 100644 SdkImageCreator/README delete mode 100644 SdkImageCreator/build.xml delete mode 100644 SdkImageCreator/installmanager.conf delete mode 100644 SdkImageCreator/lib/jarinjar.zip delete mode 100755 SdkImageCreator/sic.sh delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/Config.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/DistributionController.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/IMExitException.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/IMFatalException.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/IMInstallCancelException.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/InstallManager.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/Installer.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/Options.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/SDKExtensionInfo.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/SnapshotLog.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/core/UpdateInstallManager.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/Checksum.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/Documents.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/Downloader.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/ErrorController.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/IFileSystemInformation.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/IIMProgressMonitor.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/IMError.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/Log.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/LoggerShellParser.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/NetworkProxy.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/OldRegistry.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/Platform.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/ProgramController.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/Registry.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/SDKPackageFormat.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/ShellParser.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/StartMenu.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxFileSystemInfo.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxProgramController.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxSDKPackageFormat.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellInstalledListParser.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellRunningProgramParser.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/mac/MacProgramController.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsFileSystemInfo.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsProgramController.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsRegistry.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsSDKPackageFormat.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsShellRunningProgramParser.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PackageManager.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PropertyParser.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/lib/darwin/DarwinPackageManager.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/lib/linux/LinuxPackageManager.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/lib/win/WindowsPackageManager.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/ConfigFile.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/Distribution.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/DistributionSet.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/IMPackageNotFound.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/Package.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/PackageSet.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/Properties.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/Property.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/PropertySection.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/Snapshot.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/SnapshotList.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/pkg/model/Version.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/InstallManagerWindow.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraDialog.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraRepositoryDialog.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ChangeServerDialog.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ConfigurationDialog.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/IndeterminateProgressDialog.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/LoginDlg.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/MessageBoxDlg.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/dialog/SnapshotLogDialog.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/model/Item.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemLabelProvider.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemTreeContentProvider.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/.gitignore delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/CompletePage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/ConfigPathPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallableListPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallingPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/LicensePage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/PackageListPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/SetInstallDirectoryPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallableListPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallingPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/UpdatableListPage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/ViewController.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/ui/page/WelcomePage.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/util/IMShellCommandFail.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/util/PathUtil.java delete mode 100644 SdkImageCreator/src/org/tizen/installmanager/util/ShellUtil.java delete mode 100644 SdkImageCreator/src/res/COPYING delete mode 100644 SdkImageCreator/src/res/desktop_directory/ExecuteInstallManager.vbs delete mode 100644 SdkImageCreator/src/res/desktop_directory/checkJavaInstallation.sh delete mode 100644 SdkImageCreator/src/res/desktop_directory/checkRunningTaskList.vbs delete mode 100644 SdkImageCreator/src/res/desktop_directory/install.sh delete mode 100644 SdkImageCreator/src/res/desktop_directory/install.vbs delete mode 100644 SdkImageCreator/src/res/desktop_directory/makeshortcut.sh delete mode 100644 SdkImageCreator/src/res/desktop_directory/makeshortcut.vbs delete mode 100644 SdkImageCreator/src/res/desktop_directory/remove.sh delete mode 100644 SdkImageCreator/src/res/desktop_directory/remove.vbs delete mode 100644 SdkImageCreator/src/res/desktop_directory/removeOldSDK.sh delete mode 100644 SdkImageCreator/src/res/desktop_directory/removeOldSDK.vbs delete mode 100755 SdkImageCreator/src/res/desktop_directory/removeshortcut.sh delete mode 100644 SdkImageCreator/src/res/desktop_directory/removeshortcut.vbs delete mode 100644 SdkImageCreator/src/res/desktop_directory/tizen-sdk-installmanager.ico delete mode 100644 SdkImageCreator/src/res/desktop_directory/tizen-sdk-installmanager.png delete mode 100644 SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.directory delete mode 100644 SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.ico delete mode 100755 SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.png delete mode 100644 SdkImageCreator/src/res/icons/SDK_icon.png delete mode 100644 SdkImageCreator/src/res/icons/icon_directory_open.png delete mode 100644 SdkImageCreator/src/res/icons/icon_error.png delete mode 100644 SdkImageCreator/src/res/icons/icon_loading.png delete mode 100644 SdkImageCreator/src/res/icons/icon_login.png delete mode 100644 SdkImageCreator/src/res/icons/icon_messages.png delete mode 100644 SdkImageCreator/src/res/icons/icon_notify.png delete mode 100644 SdkImageCreator/src/res/icons/icon_permission.png delete mode 100644 SdkImageCreator/src/res/icons/icon_repositories.png delete mode 100644 SdkImageCreator/src/res/icons/icon_warning.png delete mode 100644 SdkImageCreator/src/res/images/install_manager_graphicmotif_001.png delete mode 100644 SdkImageCreator/src/res/images/install_manager_graphicmotif_002.png delete mode 100644 SdkImageCreator/src/res/images/install_manager_graphicmotif_003.png delete mode 100644 SdkImageCreator/src/res/images/install_manager_graphicmotif_004.png delete mode 100644 SdkImageCreator/src/res/images/install_manager_graphicmotif_welcome.png delete mode 100644 SdkImageCreator/src/res/images/uninstaller_graphicmotif_001.png delete mode 100644 SdkImageCreator/src/res/images/uninstaller_graphicmotif_002.png delete mode 100644 SdkImageCreator/src/res/images/uninstaller_graphicmotif_003.png delete mode 100644 SdkImageCreator/src/res/installmanager/buildversion delete mode 100644 SdkImageCreator/src/res/installmanager/removetizentemp.bat delete mode 100644 UpdateInstallManager/.project delete mode 100644 UpdateInstallManager/.settings/org.eclipse.jdt.core.prefs delete mode 100644 UpdateInstallManager/src/org/tizen/installmanager/updater/InstallManagerUpdater.java delete mode 100644 UpdateInstallManager/src/org/tizen/installmanager/updater/PathUtil.java delete mode 100644 unittest/.project delete mode 100644 unittest/.settings/org.eclipse.jdt.core.prefs delete mode 100644 unittest/src/com/samsung/installmanager/tests/InstallManagerTest.java delete mode 100644 unittest/src/com/samsung/installmanager/tests/Packages_repo.list delete mode 100644 unittest/src/com/samsung/installmanager/tests/installedpackage.list delete mode 100644 unittest/src/org/tizen/installmanager/util/TestResourceHandler.java diff --git a/InstallManagerUpdater/src/org/tizen/installmanager/updater/InstallManagerUpdater.java b/InstallManagerUpdater/src/org/tizen/installmanager/updater/InstallManagerUpdater.java deleted file mode 100644 index 2d643d0..0000000 --- a/InstallManagerUpdater/src/org/tizen/installmanager/updater/InstallManagerUpdater.java +++ /dev/null @@ -1,125 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.updater; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.PrintWriter; - -public class InstallManagerUpdater { - private static PrintWriter writer; - - private static void initWriter() { - try { - writer = new PrintWriter(new File(System.getProperty("user.dir") + - File.separator +"updater.log")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - public boolean moveFile(String from, String to) { - return moveFile(new File(from), new File(to)); - } - - public boolean moveFile(File from, File to) { - writer.println("Move " + from + " to " + to); - if (!from.exists()) { - writer.println("File not found: "+from); - return false; - } else {} //nothing - - if (to.exists()) { - writer.println("File exists. try to delete : "+to); - if(to.delete()) { - writer.println("deleted"); - } else { - writer.println("delete fail"); - return false; - } - } else {} - - return from.renameTo(to); - } - - /** - * Moves new IM to old IM and run the IM. - * @param args args[0] is path of new IM. args[1] is path of old IM. - */ - public static void main(String[] args) { - initWriter(); - - if (args.length < 2) { - return; - } - - try { - writer.println("sleep 3000"); - Thread.sleep(3000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - String[] imargs = new String[args.length-2]; - for(int i = 0; i < args.length-2; i++) { - imargs[i] = args[i+2]; - } - - InstallManagerUpdater upInstallManager = new InstallManagerUpdater(); - upInstallManager.update(args[0], args[1], imargs); - } - - private void update(String newIM, String oldIM, String[] imargs) { - boolean bResult = moveFile(newIM, oldIM); - String imarg = ""; - for(String a : imargs) { - imarg = imarg + " " + a; - } - - if (bResult){ - writer.println("move success"); - try { - File toFile = new File(oldIM); - toFile.setExecutable(true); - writer.println("run IM"); - Runtime.getRuntime().exec("java -jar " + toFile.getAbsolutePath() + " -updated " + imarg); - } catch (IOException e) { - writer.println("run failed"); - // TODO Auto-generated catch block - e.printStackTrace(); - } - } else { - writer.println("move failed"); - } - writer.close(); - } - -} diff --git a/SdkImageCreator/README b/SdkImageCreator/README deleted file mode 100644 index 6f2624b..0000000 --- a/SdkImageCreator/README +++ /dev/null @@ -1,5 +0,0 @@ -How to build and use in Eclipse -- Add jar files in lib directory to classpath -- Use appropriate SWT jar file depending on your platform -- Copy one of installmanager.conf.* to installmanager.conf depending on your platform - diff --git a/SdkImageCreator/build.xml b/SdkImageCreator/build.xml deleted file mode 100644 index 1666834..0000000 --- a/SdkImageCreator/build.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - Install Manager for Tizen SDK - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/SdkImageCreator/installmanager.conf b/SdkImageCreator/installmanager.conf deleted file mode 100644 index 62e57ae..0000000 --- a/SdkImageCreator/installmanager.conf +++ /dev/null @@ -1,9 +0,0 @@ -Repository: http://172.21.17.55/packages -InstallManager-Repository: -Type: -Package-Server: -Server-Type: snapshot -InstallManager-Version: 2.0.5 -Distribution: release -Release-note: https://developer.tizen.org - diff --git a/SdkImageCreator/lib/jarinjar.zip b/SdkImageCreator/lib/jarinjar.zip deleted file mode 100644 index 8fcca7cb49534d7bb633091dc2b4954689ce5afa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7841 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 Kz8vtkr~d&R^78Ef diff --git a/SdkImageCreator/sic.sh b/SdkImageCreator/sic.sh deleted file mode 100755 index a00ecf3..0000000 --- a/SdkImageCreator/sic.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/sh - -TPUT="`which tput`" -if test -t 0 -a -t 1 -a -n "$TPUT"; then - CI="`$TPUT setf 6 || true`"; CE="`$TPUT setf 4 || true`" - CX="`$TPUT setf 2 || true`"; CN="`$TPUT sgr0 || true`" -else CI=''; CE=''; CX=''; CN='' -fi - -echo "$CX******************************$CN" -echo "$CX** SDK Image Creator v1.0 **$CN" -echo "$CX******************************$CN" - -### 1. check argument ### -if [ $# != 6 ]; then - echo "$CE usage : ./sic.sh $CN" - echo "$CE ex) ./sic.sh tizendev.org release linux 32 partner Ubuntu32SDKImage $CN" - exit 1 -else - echo "1. Success to input argument. Start making SDK image." -fi - -### 2. set argument ### -echo "2. Set argument" -CUR_DIR=`pwd` -targetServer=$1 -distribution=$2 -platform=$3 -bit=$4 -boundary=$5 -targetImageName=$6 - -sdkImage=${targetImageName}_*.zip -sicBinary="sic.jar" - -### 3. Set installmanager.conf ### -echo "3. Set installmanager.conf" -## set config file variable -configFile="installmanager.conf" -repository=http://${targetServer}/packages -serverType="snapshot" - -## clear workspace(remove installmanager.conf if exists.) -echo "- Clear workspace(remove installmanager.conf if exists.)" -if [ -e ${configFile} ] -then - rm ${configFile} -else - echo "- ${configFile} file not found. workspace clear." -fi - -## create config file -echo "- Create config file." -echo "Repository: "${repository} >> ${configFile} -echo "Server-Type: "${serverType} >> ${configFile} -echo "Distribution: "${distribution} >> ${configFile} - -### 4. Make SDK Image ### -echo "4. Make SDK Image" -## download packages to './binary/*' -echo "- Download packages to './binary/* " -java -jar ${sicBinary} -onlyDownload ${boundary} ${platform} ${bit} - -currentDate=`date '+%Y%m%d%H%M'` - -zip -r $6_${currentDate} binary/ pkg_list* - -echo "exitcode="$? - -rm pkg_list* - -if [ $? -eq 0 ] -then - rm -rf binary -fi - -### 5. Finish work and Cleare workspace ### -echo "5. Finish work and Cleare workspace." -rm installmanager.conf -exit 0 diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/Config.java b/SdkImageCreator/src/org/tizen/installmanager/core/Config.java deleted file mode 100644 index e64bb35..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/Config.java +++ /dev/null @@ -1,597 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.core; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.pkg.model.ConfigFile; -import org.tizen.installmanager.pkg.model.Version; -import org.tizen.installmanager.util.PathUtil; - -/** - * This class manages to configure installmanager. - * - * @author shihyun kim - * - */ -public class Config { - public static final String SDK_NAME = "Tizen SDK"; - - // Directory and Execute file name. - public static final String INSTALL_MANAGER_FILE_NAME = "InstallManager"; - public static final String INSTALL_MANAGER_DIRECTORY = "install-manager"; - public static final String OLD_INSTALL_MANAGER_DIRECTORY = "InstallManager"; - public static final String INSTALL_MANAGER_BINARY = "InstallManager.jar"; - public static final String INSTALL_MANAGER_UPDATER_BINARY = "InstallManagerUpdater.jar"; - public static final String EXECUTE_FILE_NAME_OF_INSTALL_MANAGER = getExecuteFileNameOfInstallManager(); - public static final String EXECUTE_FILE_NAME_OF_INSTALL_MANAGER_PARTNER = - getExecuteFileNameOfInstallManagerPartner(); - public static final String EXECUTE_FILE_PATH_OF_INSTALL_MANAGER = PathUtil - .get(INSTALL_MANAGER_DIRECTORY, - EXECUTE_FILE_NAME_OF_INSTALL_MANAGER); - public static final String SDK_DIRECTORY = "tizen-sdk"; - - // config File - public static final String CONFIG_DIRECTORY_NAME = "tizen-sdk-data"; - public static final String CONFIG_HOME = getConfigHome(); - public static final String INFO_DIRECTORY = ".info"; - - public static final String OLD_CONFIG_DIRECTORY_NAME = ".TizenSDK"; - public static final String OLD_CONFIG_HOME = getOldConfigHome(); - // public static final String INFO_DIRECTORY_PATH = - // PathUtil.getFromInstalledPath(INFO_DIRECTORY); - - // old config File - public static final String OLD_INFO_DIRECTORY = "info"; - public static final String OLD_INFO_DIRECTORY_PATH = PathUtil.get( - CONFIG_HOME, OLD_INFO_DIRECTORY); - public static final String OLD_INFO_REMOVESCRIPT_DIRECTORY = "removescript"; - public static final String OLD_INFO_REMOVESCRIPT_PATH = PathUtil.get( - OLD_INFO_DIRECTORY_PATH, OLD_INFO_REMOVESCRIPT_DIRECTORY); - public static final String OLD_INSTALLED_FILE_LIST_DIRECTORY = "installedlist"; - public static final String OLD_INSTALLED_FILE_LIST_DIRECTORY_PATH = PathUtil - .get(OLD_INFO_DIRECTORY_PATH, OLD_INSTALLED_FILE_LIST_DIRECTORY); - - // IM config file. - public static final String INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME = "installmanager.conf"; - public static final String INSTALL_MANAGER_DEFAULT_CONFIG_FILE_PATH = PathUtil - .get(INSTALL_MANAGER_DIRECTORY, - INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME); - - // Programs shortcut path - public static final String SDK_PROGRAMS_SHORTCUT_MENU_PATH = getSLPSDKShortcutPath(); - public static final String SDK_PROGRAMS_SHORTCUT_MENU_FILENAME = "tizen-sdk-menu.directory"; - public static final String SDK_PROGRAMS_SHORTCUT_MENU_ICON_PATH = PathUtil - .getFromHome(".local/share/icons/tizen-sdk-menu.png"); - - // InstallManager Shortcut PathUtil - public static final String SHORTCUT_DIRECTORY = "Tizen SDK"; - public static final String INSTALL_MANAGER_SHORTCUT = "InstallManager"; - public static final String INSTALL_MANAGER_SHORTCUT_PATH = getInstallManagerShortcutPath(); - public static final String INSTALL_MANAGER_SHORTCUT_FILENAME = "tizen-sdk-installmanager.desktop"; - public static final String INSTALL_MANAGER_SHORTCUT_ICON_PATH = getInstallManagerShortcutIconPath(); - - // OLD SHORTCUT - public static final String OLD_SHORTCUT_DIRECTORY = "Samsung Linux Platform"; - public static final String OLD_SDK_PROGRAMS_SHORTCUT_MENU_PATH = getOldSLPSDKShortcutPath(); - public static final String OLD_SDK_PROGRAMS_SHORTCUT_MENU_FILENAME = "samsung-sdk_menu.directory"; - public static final String OLD_SDK_PROGRAMS_SHORTCUT_MENU_ICON_PATH = PathUtil - .getFromHome(".local/share/icons/samsung-sdk-menu.ico"); - - public static final String OLD_INSTALL_MANAGER_SHORTCUT_PATH = PathUtil - .getFromHome(".local/share/applications/samsung-sdk-installmanager.desktop"); - public static final String OLD_INSTALL_MANAGER_SHORTCUT_FILENAME = "samsung-sdk-installmanager.desktop"; - public static final String OLD_INSTALL_MANAGER_SHORTCUT_ICON_PATH = PathUtil - .getFromHome(".local/share/icons/samsung-sdk-installmanager.ico"); - - // Packages info - public static final String BINARY_DIRECTORY = "binary"; - public static final String PACKAGE_LIST_FILE_LINUX_32 = "pkg_list_ubuntu-32"; - public static final String PACKAGE_LIST_FILE_LINUX_64 = "pkg_list_ubuntu-64"; - public static final String PACKAGE_LIST_FILE_WINDOWS_32 = "pkg_list_windows-32"; - public static final String PACKAGE_LIST_FILE_WINDOWS_64 = "pkg_list_windows-64"; - public static final String PACKAGE_LIST_FILE_MACOS_64 = "pkg_list_macos-64"; - public static final String PACKAGE_BINARY_LOCAL_DIRECTORY_PATH = PathUtil - .getFromCurrDir(Config.BINARY_DIRECTORY); - public static final String PACKAGE_LIST_LOCAL_DIRECTORY_PATH = PathUtil - .getCurrentDir(); -// public static String PACKAGE_LIST_FILE_PATH = ""; // path includes pkg list file name by using configuration dialog. -// public static String PACKAGE_LIST_FILE_DIR = ""; // path excepts pkg list file name by using configuration dialog. - public static final String INSTALLED_PACKAGE_LIST_FILE_NAME = "installedpackage.list"; -// public static String SDK_IMAGE_PATH = ""; - - // Install temp directory - public static final String TEMP_DIRECTORY = "temp"; - public static final String DATA_DIRECTORY = "data"; - public static final String SDK_TEMP_DIR = "tizensdk"; - public static final String SDK_TEMP_DIR_PATH = PathUtil.getFromTempDir(Config.SDK_TEMP_DIR); - - // batch file - public static final String INSTALL_MANAGER_REMOVE_BATCH_SCRIPT_FILE_NAME = "removeSDKDirectory.bat"; - public static final String INSTALL_MANAGER_REMOVE_VB_SCRIPT_FILE_NAME = "removeSDKDirectory.vbs"; - - // repository - public static final String REPOSITORY_DISTRIBUTION_INFO_FILE = "distribution.info"; - public static final String REPOSITORY_SNAPSHOT_INFO_FILE = "snapshot.info"; - public static final String REPOSITORY_DEFAULT_TYPE = "develop"; - - private String localRepository = ""; - private String confFilePath = null; - - // configuration dialog - public static ConfDialog fromWhere = ConfDialog.NORMAL; // where does information come from in configuration dialog. - - private ServerType serverType = ServerType.SNAPSHOT; - public static Status status = Status.INSTALL; - - /** - * This enumeration where does information come from in configuration dialog.
- * NORMAL is just push 'next' button.
- * SNAPSHOT is information from snapshot table in configuration dialog.
- * LOCAL_IMAGE is information from file dialog in configuration dialog.
- * USER_SPECIFIC is information from text editor in configuration dialog.
- */ - public enum ConfDialog { - NORMAL, SNAPSHOT, LOCAL_IMAGE, USER_SPECIFIC; - } - - public enum Status { - INSTALL, UPDATE, UNINSTALL; - } - - public enum ServerType{ - SNAPSHOT("snapshot"), - PACKAGE("package"), - LOCAL("local"); - - private String type = ""; - ServerType(String type){ - this.type = type; - } - - public String toString() { - return type; - } - } - - // exit codes of Install Manager - public static final int EXITCODE_NORMAL = 0; - public static final int EXITCODE_HAS_SELF_UPDATE = 1; - public static final int EXITCODE_DEP_ERROR = 2; - public static final int EXITCODE_ONLY_DOWNLOAD = 3; - public static final int EXITCODE_UNKNOWN_ERROR = 4; - - // release note file - public static final String RELEASE_NOTE = "release-note.txt"; - private ConfigFile mConfigFile = null; - private String mTargetDir = ""; - - private static Config config = null; - - private Config() { - confFilePath = getConfigFilePath(); - mConfigFile = new ConfigFile(confFilePath); - } - - /** - * @return filename of install manager executable - */ - private static String getExecuteFileNameOfInstallManager() { - if (Platform.isLinux() || Platform.isMacOS() ) { - return "InstallManager"; - } else if ( Platform.isWindows() ) { - return "InstManager.exe"; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - /** - * @return filename of install manager executable for Partner SDK - */ - private static String getExecuteFileNameOfInstallManagerPartner() { - if (Platform.isLinux() || Platform.isMacOS() ) { - return "InstallManagerP"; - } else if ( Platform.isWindows() ) { - return "InstManager.exe"; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - private static String getInstallManagerShortcutPath() { - if (Platform.isUbuntu()) { - return PathUtil.getFromHome(".local/share/applications/" - + Config.INSTALL_MANAGER_SHORTCUT_FILENAME); - } else if (Platform.isWindows()) { - return ""; - } else if (Platform.isMacOS()) { - return ""; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - private static String getInstallManagerShortcutIconPath() { - if (Platform.isUbuntu()) { - return PathUtil - .getFromHome(".local/share/icons/tizen-sdk-installmanager.png"); - } else if (Platform.isWindows()) { - return ""; - } else if (Platform.isMacOS()) { - return ""; - } - else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - public static String getConfigHome() { - if (Platform.isLinux() || Platform.isMacOS()) { - return PathUtil.getFromHome(Config.CONFIG_DIRECTORY_NAME); - } else if (Platform.isWindows()) { - return PathUtil.getFromAppData(Config.CONFIG_DIRECTORY_NAME); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - public static String getOldConfigHome() { - if (Platform.isLinux() || Platform.isMacOS()) { - return PathUtil.getFromHome(Config.OLD_CONFIG_DIRECTORY_NAME); - } else if (Platform.isWindows()) { - return PathUtil.getFromAppData(Config.OLD_CONFIG_DIRECTORY_NAME); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - private static String getSLPSDKShortcutPath() { - if (Platform.isUbuntu()) { - return PathUtil.getFromHome(".local/share/desktop-directories/" - + Config.SDK_PROGRAMS_SHORTCUT_MENU_FILENAME); - } else if (Platform.isWindows()) { - return Config.SHORTCUT_DIRECTORY; - } else if (Platform.isMacOS()) { - return ""; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - private static String getOldSLPSDKShortcutPath() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32) { - return PathUtil - .getFromHome(".local/share/desktop-directories/samsung-sdk_menu.directory"); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32) { - return Config.OLD_SHORTCUT_DIRECTORY; - } else { - return ""; - } - } - - /** - * Set target directory to member variable. - * - * @param targetDir - */ - public void setTargetDir(String targetDir) { - mTargetDir = targetDir; - } - - /** - * Get ConfigFile Class instance - * - * @return - */ - public ConfigFile getConfigFile() { - return mConfigFile; - } - - private String[] getSDKRepositories() { - String repo = mConfigFile.getRepository(); - - String[] repos = repo.split(","); - - for (int i=0; i getSDKRepositoryList() { - String[] repos = getSDKRepositories(); - - return Arrays.asList(repos); - } - - /** - * Set snapshot path from repository. - * @return - */ - public String getSnapshotPath() { - return mConfigFile.getSnapshotPath(); - } - - /** - * Set snapshot path from repository. - * @param snapshotPath if snapshotPath is empty(""), always update latest version. - */ - public void setSnapshotPath(String snapshotPath) { - mConfigFile.setSnapshotPath(snapshotPath); - } - - /** - * Always update latest version. - */ - public void setLatestSnapshotPath() { - mConfigFile.setSnapshotPath(""); - } - - /** - * Get repositories. - * - * @return List of packgae repositories. - */ - public Collection getSDKPackageServerList() { - if (serverType == ServerType.SNAPSHOT) { - String[] repos = getSDKRepositories(); - - if (repos.length <= 0) { - return Collections.emptyList(); - } - - for (int i=0; itrue if success. - */ - public boolean makeInfoDirectory() { - - boolean bResult = makeConfigHome(); - - if (bResult) { - File configDirFile = new File( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY)); - configDirFile.mkdir(); - } else { - return false; - } - - return bResult; - } - - /** - * @return path of target directory - */ - public String getTargetDir() { - return mTargetDir; - } - - /** - * @return true if proxy server is specified - */ - public boolean hasProxy() { - if (mConfigFile != null) { - String server = mConfigFile.getProxyServer(); - int port = mConfigFile.getProxyPort(); - if (server.equals("") || port < 0) { - return false; - } - } - return true; - } - - /** - * @return version of install manager - */ - public Version getInstallManagerVersion() { - return new Version(this.mConfigFile.getInstallManagerVersion()); - } - - /** - * @return Config file Path when installer is recognize install - * option(-conf). - */ - public static String getConfigFilePath() { - //user config option is false. - if (Options.userConfPath == null) { - //1st, get config file from installed path. - File installedConfFile = new File(PathUtil.getFromInstalledPath(Config.INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME)); - if (installedConfFile.exists()) { - return installedConfFile.getAbsolutePath(); - - //if not exist config file from installed path, 2nd get config file from current directory. - } else { - File currentDirConfFile = new File(PathUtil.getFromCurrDir(Config.INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME)); - - if (currentDirConfFile.exists()) { - return currentDirConfFile.getAbsolutePath(); - } else { - return null; - } - } - - //user config option is true, - } else { - return Options.userConfPath; - } - } - - /** - * save config file to TargetDirectory - */ - public void saveConfig() { - if (confFilePath == null || confFilePath.isEmpty()) { - return; - } else { - mConfigFile.saveConfig(confFilePath); - } - } - - /** - * Reads build version from resource which will be generated - * - * @return build version - */ - public static String getJarBuildVersion() { - String buildversion = PathUtil - .readAllTextFromResource("/res/installmanager/buildversion"); - return buildversion; - } - - public static Config getInstance() { - if (config == null) { - config = new Config(); - } - - return config; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/DistributionController.java b/SdkImageCreator/src/org/tizen/installmanager/core/DistributionController.java deleted file mode 100644 index 18566eb..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/DistributionController.java +++ /dev/null @@ -1,369 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.core; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -import org.tizen.installmanager.lib.Downloader; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.pkg.lib.PropertyParser; -import org.tizen.installmanager.pkg.model.Distribution; -import org.tizen.installmanager.pkg.model.DistributionSet; -import org.tizen.installmanager.pkg.model.PropertySection; -import org.tizen.installmanager.pkg.model.Snapshot; -import org.tizen.installmanager.pkg.model.SnapshotList; -import org.tizen.installmanager.util.PathUtil; - -/** - * This class manages to distribution. - * - * @author shihyun kim - * - */ -public class DistributionController { - private static DistributionController distController = null; - - private String MARKED_SNAPSHOT = "manual"; - - //distributino information - DistributionSet dists = new DistributionSet(); - - Collection repositories = null; - HashMap distributionSnapshotSet = new HashMap(); - - private DistributionController(Collection repos) { - repositories = repos; - } - - /** - * initialize distribution. - * @return if false, can not read any distribuion. - */ - public boolean init() { - if (!dists.isEmpty()) { - dists.clear(); - } - - loadDistribution(); - - if (dists.isEmpty()) { - return false; - } else { - for (Distribution dist : dists) { - loadSnapshot(dist); - } - return true; - } - } - - /** - * Get distribution list in repository. - * @return - */ - public List getDistributionList() { - List distList = new ArrayList(); - for (Distribution dist : dists) { - if (dist.getName() != null) { - distList.add(dist.getName()); - } - } - - return distList; - } - - /** - * Load distribution from repository. - */ - public void loadDistribution() { - if (!dists.isEmpty()) { - dists.clear(); - } - - File tmp = null; - try { - tmp = File.createTempFile("dist", ".info"); - tmp.deleteOnExit(); - } catch (IOException e) { - Log.ExceptionLog(e); - return; - } - - //download dist.info file from repository - Downloader downloader = new Downloader(); - - for (String repo : repositories) { - URL distInfoFileURL = getDistInfoFilePath(repo); - - long size = downloader.download(distInfoFileURL, tmp.getAbsolutePath(), null); - if (size < 0) { - return; - } - - //parsing dist.list file. - PropertyParser parser = new PropertyParser(); - List sections = parser.readFromFile(tmp); - - if (sections == null) { - return; - } - - for (PropertySection section : sections) { - dists.add(new Distribution(repo, section.getProperties())); - } - - // temp file cleanup - if (tmp.exists()) { - tmp.delete(); - } - } - } - - private URL getDistInfoFilePath(String repo) { - String distInfoFilePath = PathUtil.addURLPath(repo, Config.REPOSITORY_DISTRIBUTION_INFO_FILE); - - try { - return new URL(distInfoFilePath); - } catch (MalformedURLException e) { - Log.err("Cannot connect distribution file in repository(" + distInfoFilePath + ")"); - return null; - } - } - - /** - * Get all of snapshots. - * @return - */ - public SnapshotList getSnapshotList(String distribution) { - SnapshotList list = distributionSnapshotSet.get(distribution); - - if (list == null) { - return SnapshotList.EMPTY; - } else { - return list; - } - } - - /** - * Get manual snapshot list. - * @param distribution - * @return - */ - public SnapshotList getManualSnapshotList(String distribution) { - SnapshotList manualSnapshotList = new SnapshotList(); - - SnapshotList snapshotList = getSnapshotList(distribution); - - for(Snapshot snapshot : snapshotList) { - if (snapshot.getType().equals(MARKED_SNAPSHOT)) { - manualSnapshotList.add(snapshot); - } - } - - return manualSnapshotList; - } - - /** - * Load snapshot information from repository. - * @param distribution selected distribution. - * @return SnapshotList - */ - public void loadSnapshot(String distribution) { - Distribution dist = dists.getDistributionByName(distribution); - loadSnapshot(dist); - } - /** - * Load snapshot information from repository. - * @param distribution selected distribution. - * @return - */ - private void loadSnapshot(Distribution distribution) { - if (distribution == null) { - return; - } else { - String snapshotRepo = PathUtil.addURLPath(distribution.getRepository(), distribution.getName()); - SnapshotList list = loadSnapshotFromRepository(snapshotRepo); - - //sort by date. - Collections.sort(list); - - //read snapshots and save to distributionSnapshotSet instance. - //If you read snapshots next, you can find in distributionSnapshotSet instance. - distributionSnapshotSet.put(distribution.getName(), list); - } - } - - /** - * Load snapshot information from repository. - * @param repository package repository. - */ - private SnapshotList loadSnapshotFromRepository(String snapshotRepo) { - SnapshotList snapshots = new SnapshotList(); - - File tmp = null; - - try { - tmp = File.createTempFile("snapshot", ".info"); - tmp.deleteOnExit(); - } catch (IOException e) { - Log.ExceptionLog(e); - return SnapshotList.EMPTY; - } - - //download snapshot.list file from repository - Downloader downloader = new Downloader(); - URL snapshotListURL = getSnapshotListPathInRepository(snapshotRepo); - - long size = downloader.download(snapshotListURL, tmp.getAbsolutePath(), null); - if (size < 0) { - Log.err("Fail to download snapshot.info from repository."); - return SnapshotList.EMPTY; - } - - //parsing snapshot.list file. - PropertyParser parser = new PropertyParser(); - List sections = parser.readFromFile(tmp); - - if (sections == null) { - return SnapshotList.EMPTY; - } - - if (Options.allSnapshots) { - // for showing all snapshots. - for (PropertySection section : sections) { - snapshots.add(new Snapshot(section.getProperties())); - } - } else { - // for showing filtered snapshots. - for (PropertySection section : sections) { - Snapshot s = new Snapshot(section.getProperties()); - snapshots.add(s); - } - } - - return snapshots; - } - - private URL getSnapshotListPathInRepository(String snapshotRepo) { - if (snapshotRepo == null || snapshotRepo.isEmpty()) { - Log.log("Repository for snapshot do not exist."); - return null; - - } else { - String snapshotListPath = PathUtil.addURLPath(snapshotRepo, Config.REPOSITORY_SNAPSHOT_INFO_FILE); - try { - Log.log("Snapshot.list url is " + snapshotListPath); - return new URL(snapshotListPath); - } catch (MalformedURLException e) { - Log.ExceptionLog(e); - return null; - } - } - } - - /** - * Filter snapshot list of distribution. - * @param distribution distribution for snapshot - * @return - */ - public SnapshotList filterSnapshotByDistribution(String distribution) { - SnapshotList snapshots = distributionSnapshotSet.get(distribution); - - if (snapshots == null) { - return SnapshotList.EMPTY; - } else { - return snapshots; - } - } - - /** - * Get latest snapshot in distribution. - * @param distribution - * @return Snapshot. - */ - public Snapshot getLatestSnapshot(String distribution) { - Snapshot latestSnapshot = null; - - SnapshotList snapshotList = getSnapshotList(distribution); - if (!snapshotList.isEmpty()) { - latestSnapshot = getSnapshotList(distribution).get(0); - } else { - Log.err("There are not snapshots in distribution. : " + distribution); - return null; - } - - Log.log("The latest snapshot name: " + latestSnapshot.getName()); - return latestSnapshot; - } - - public Collection getRepositories() { - return repositories; - } - - /** - * Get DistributionController instance. - * @param repository - * @return - */ - public static DistributionController getInstance(Collection repositories) { - if (distController == null || !distController.getRepositories().containsAll(repositories)) { - distController = new DistributionController(repositories); - } - - return distController; - } - - /** - * Get DistributionController instance. - * @param repository - * @return - */ - public static DistributionController getInstance(String repo) { - Collection repositories = new ArrayList(); - repositories.add(repo); - - return getInstance(repositories); - } - - /** - * Get DistributionController instance. - * @param repository - * @return if null, instance is not created. - */ - public static DistributionController getInstance(){ - return distController; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/IMExitException.java b/SdkImageCreator/src/org/tizen/installmanager/core/IMExitException.java deleted file mode 100644 index 0b05461..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/IMExitException.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.core; - -import org.tizen.installmanager.lib.ErrorController; - -/** - * Thrown when IM needs to exit immediately and gracefully - * - * @author Wooyoung Cho - * - */ -public class IMExitException extends Exception { - private static final long serialVersionUID = -6412113539194703737L; - - /** - * @param exitCode - */ - public IMExitException(int exitCode) { - ErrorController.setExitCode(exitCode); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/IMFatalException.java b/SdkImageCreator/src/org/tizen/installmanager/core/IMFatalException.java deleted file mode 100644 index 5335a9c..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/IMFatalException.java +++ /dev/null @@ -1,64 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.core; - -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; - -/** - * This exception is thrown when fatal error occurs. - * - * @author Wooyoung Cho - * - */ -public class IMFatalException extends RuntimeException { - - private String msg; - - public IMFatalException(String msg) { - Log.err(msg); - this.msg = msg; - ErrorController.setErrorMessage(msg); - } - - public IMFatalException(ErrorCode e) { - this.msg = ErrorController.getMessage(e); - Log.err(msg); - - ErrorController.setError(e); - } - - public String getMessage() { - return msg; - } - - private static final long serialVersionUID = 756412192330085351L; - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/IMInstallCancelException.java b/SdkImageCreator/src/org/tizen/installmanager/core/IMInstallCancelException.java deleted file mode 100644 index 0fa44a5..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/IMInstallCancelException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.core; - -/** - * This exception is thrown when user cancels the installation - * @author Wooyoung Cho - * - */ -public class IMInstallCancelException extends RuntimeException { - - private static final long serialVersionUID = 3148263859401585847L; - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/InstallManager.java b/SdkImageCreator/src/org/tizen/installmanager/core/InstallManager.java deleted file mode 100644 index 43d0b08..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/InstallManager.java +++ /dev/null @@ -1,1258 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.core; - -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.net.URL; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.Collection; - -import org.tizen.installmanager.lib.Checksum; -import org.tizen.installmanager.lib.Downloader; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.Registry; -import org.tizen.installmanager.lib.StartMenu; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.win.WindowsProgramController; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.Package; -import org.tizen.installmanager.pkg.model.PackageSet; -import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor; -import org.tizen.installmanager.util.IMShellCommandFail; -import org.tizen.installmanager.util.PathUtil; - -/** - * This class contains the main business logic of Install Manager. Use singleton - * instance. - * - * @author Shihyun Kim - */ -public class InstallManager { - - private static final InstallManager mInstallManager = new InstallManager(); - - private Config mConfig = null; - private static Downloader mDownloader = new Downloader(); - private PackageManager packageManager; - - // windows path - private static String WINDOWS_INSTALL_MANAGER_INSTALL_SCRIPT = "/res/desktop_directory/install.vbs"; - private static String WINDOWS_INSTALL_MANAGER_REMOVE_SCRIPT = "/res/desktop_directory/remove.vbs"; - private static String WINDOWS_MAKE_SHORTCUT_PATH = "/res/desktop_directory/makeshortcut.vbs"; - private static String WINDOWS_REMOVE_SHORTCUT_PATH = "/res/desktop_directory/removeshortcut.vbs"; - - // linux script - private static String LINUX_INSTALL_MANAGER_INSTALL_SCRIPT = "/res/desktop_directory/install.sh"; - private static String LINUX_INSTALL_MANAGER_REMOVE_SCRIPT = "/res/desktop_directory/remove.sh"; - private static String LINUX_MAKE_SHORTCUT_PATH = "/res/desktop_directory/makeshortcut.sh"; - private static String LINUX_REMOVE_SHORTCUT_PATH = "/res/desktop_directory/removeshortcut.sh"; - - private File makeShortCutFile = null; - private File removeShortCutFile = null; - - private InstallManager() { - } - - /** - * @return singleton instance of InstallManager - */ - public static InstallManager getInstance() { - return mInstallManager; - } - - /** - * Load config file - */ - public void initConfig() { - if (mConfig != null) { - return; - } else { - mConfig = Config.getInstance(); - - if (Options.doReplaceRepository) { - Log.log("Replace repository => " + Options.repo); - mConfig.getConfigFile().setRepository(Options.repo); - mConfig.saveConfig(); - } - - if (mConfig.getConfigFile() == null) { - Log.log("Loading config file failed"); - throw new IMFatalException("Loading configuration file failed"); - } - - if (!Registry.getInstalledPath().isEmpty()) { - mConfig.setTargetDir(Registry.getInstalledPath()); - } - } - } - - /** - * Initialize packages information. - */ - public void initPackageList() { - Collection repositoryURLs = mConfig.getSDKPackageServerList(); - - initPackageManager(repositoryURLs); - } - - private void initPackageManager(Collection repositoryURLs) { - - File installedPackageListFile = new File(PathUtil.get( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY), - Config.INSTALLED_PACKAGE_LIST_FILE_NAME)); - try { - if (installedPackageListFile.exists()) { - this.packageManager = PackageManager.getInstance(installedPackageListFile, repositoryURLs); - } else { - this.packageManager = PackageManager.getInstance(null, repositoryURLs); - } - } catch (IOException e) { - Log.err("Cannot load package manager =>" + installedPackageListFile - + ", " + repositoryURLs); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_FILE); - } - } - - /** - * Initialize distribution and snapshot information - */ - public boolean initDistribution() { - DistributionController controller = - DistributionController.getInstance(mConfig.getSDKRepositoryList()); - - return controller.init(); - } - - - /** - * Initialize installmanager. It performs that read config file, make - * temporary files and load package list from repository. - * - * @return true if initialize success to install or uninstall. - */ - public void init() { - initConfig(); - - initDistribution(); - initPackageList(); - initConfigurationFile(); - checkOldSDK(); - } - - private void initConfigurationFile() { - copyMakeShortCutFile(); - copyRemoveShortCutFile(); - } - - /** - * Delete temporary files related installmanager. - */ - public static void deleteTempFile() { - - File tmpDir = new File(PathUtil.getTempFileParent()); - File[] tmpFiles = tmpDir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - boolean found = false; - String[] prefix = { "makeshortcut", "removeshortcut", - "installmanager.repository", "Packages", - "tizen_installmanager", "checkJavaInstallation", - "install" }; - for (String pref : prefix) { - found = name.startsWith(pref); - if (found == true) { - return true; - } - } - return found; - } - }); - - for (File f : tmpFiles) { - f.delete(); - } - } - - /** - * Copy make shortcut file from resource to temp directory. - */ - private void copyMakeShortCutFile() { - try { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - makeShortCutFile = PathUtil.getTempFileFromResource( - LINUX_MAKE_SHORTCUT_PATH, "makeshortcut", ".sh"); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - makeShortCutFile = PathUtil.getTempFileFromResource( - WINDOWS_MAKE_SHORTCUT_PATH, "makeshortcut", ".vbs"); - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - makeShortCutFile = PathUtil.getTempFileFromResource( - LINUX_MAKE_SHORTCUT_PATH, "makeshortcut", ".sh"); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - - if (makeShortCutFile.exists()) { - makeShortCutFile.setExecutable(true); - } - } catch (IOException e) { - Log.err("Installer cannot make 'makeshortcut script' file."); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT); - } - } - - /** - * Copy remove shortcut file from resource to temp directory. - */ - private void copyRemoveShortCutFile() { - try { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - removeShortCutFile = PathUtil.getTempFileFromResource( - LINUX_REMOVE_SHORTCUT_PATH, "removeshortcut", ".sh"); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - removeShortCutFile = PathUtil.getTempFileFromResource( - WINDOWS_REMOVE_SHORTCUT_PATH, "removeshortcut", ".vbs"); - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - removeShortCutFile = PathUtil.getTempFileFromResource( - LINUX_REMOVE_SHORTCUT_PATH, "removeshortcut", ".sh"); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - removeShortCutFile.setExecutable(true); - } catch (IOException e) { - Log.err("Installer cannot make 'makeshortcut script' file."); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT); - } - } - - /** - * get make shortcut File instance. - * - * @return File instance of makeshortcut script. - */ - public File getMakeShortCut() { - return makeShortCutFile; - } - - /** - * Get temporary file path.(makeshortcut script, Packages list, Installer - * log) - * - * @return temporary file path, if not exist makeshortcut file, return empty - * string. - */ - public String getMakeShortCutPath() { - if (getMakeShortCut() == null) { - return ""; - } else { - return getMakeShortCut().getAbsolutePath(); - } - } - - /** - * Get temporary file path.(rmoveshortcut script, Packages list, Installer - * log) - * - * @return temporary file path, if not exist removeshortcut file, return - * emptry string. - */ - public String getRemoveShortCutPath() { - if (getRemoveShortCut() == null) { - return ""; - } else { - return getRemoveShortCut().getAbsolutePath(); - } - } - - /** - * Get remove shortcut File instance. - * - * @return File instance of removeshortcut script. - */ - public File getRemoveShortCut() { - return removeShortCutFile; - } - - /** - * Get Config instance - * - * @return - */ - public Config getConfig() { - return mConfig; - } - - /** - * Get PackageManager instance. - * - * @return - */ - public PackageManager getPackageManager() { - return packageManager; - } - - private void checkOldSDK() { - if (Registry.getInstalledPath() == null - || Registry.getInstalledPath().isEmpty()) { - return; - } - - File oldInfoDir = new File(Config.OLD_INFO_DIRECTORY_PATH); - - if (oldInfoDir.exists()) { - moveOldInfoDirToCurrentInfoDir(oldInfoDir); - } else { - return; - } - } - - private void moveOldInfoDirToCurrentInfoDir(File oldInfoDir) { - File currentInfoDir = new File( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY)); - if (!currentInfoDir.exists()) { - currentInfoDir.mkdirs(); - } - - File oldInstalledList = new File(PathUtil.get( - Config.OLD_INFO_DIRECTORY_PATH, - Config.INSTALLED_PACKAGE_LIST_FILE_NAME)); - - if (oldInstalledList.exists()) { - File currentInstalledList = new File(PathUtil.get( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY), - Config.INSTALLED_PACKAGE_LIST_FILE_NAME)); - PathUtil.move(oldInstalledList, currentInstalledList); - } else { - return; - } - - File[] oldPackageDir = new File(Config.OLD_INFO_REMOVESCRIPT_PATH) - .listFiles(); - for (File childFile : oldPackageDir) { - File currentPackageDir = new File(PathUtil.get( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY), - childFile.getName())); - - File parentDir = currentPackageDir.getParentFile(); - if (!parentDir.exists()) { - parentDir.mkdirs(); - } - - PathUtil.move(childFile, currentPackageDir); - } - - File[] oldInstalledFileList = new File( - Config.OLD_INSTALLED_FILE_LIST_DIRECTORY_PATH).listFiles(); - for (File childFile : oldInstalledFileList) { - File currentInstalledFile = new File(PathUtil.get(PathUtil - .getFromInstalledPath(Config.INFO_DIRECTORY), PathUtil - .getFileNameWithOutExtension(childFile.getAbsolutePath()), - childFile.getName())); - - File parentDir = currentInstalledFile.getParentFile(); - if (!parentDir.exists()) { - parentDir.mkdirs(); - } - - PathUtil.move(childFile, currentInstalledFile); - } - - PathUtil.remove(oldInfoDir); - } - - /** - * Download packages - * - * @param packagesToDownload - * Set of packages to download - * @param monitor - * @return true if download success. - * @throws IMExitException - */ - public boolean downloadPackages(PackageSet downloadPkgSet, - InstallProgressMonitor monitor) throws IMExitException { - Log.log("InstallManager download start => " + downloadPkgSet); - - long totalSize = 0; - for (Package pkg : downloadPkgSet) { - totalSize += pkg.getPackageSize(); - } - - if (monitor != null) { - int total = (int) (totalSize / 1024); - monitor.beginTask("", total); - } - - for (Package pkg : downloadPkgSet) { - - if (monitor != null) { - monitor.setPackageName(pkg.getPackageName()); - } - - if (monitor != null && monitor.isCanceled()) { - Log.log("download canceled"); - throw new IMInstallCancelException(); - } - - String fileName = pkg.getFileName(); - boolean downloadResult = downloadPackage(pkg, PathUtil.getFromCurrDir(fileName), monitor); - - if (!downloadResult) { - Log.err("InstallManager download fail => " + pkg); - return false; - } - } - - if (monitor != null) { - monitor.workedProgressbar(100); - } - - return true; - } - - /** - * Download package. - * - * @param packageToDownload - * @param fileDownloadTargetPath - * @param monitor - * @return true if success - */ - public boolean downloadPackage(Package packageToDownload, - String fileDownloadTargetPath, IIMProgressMonitor monitor) { - Log.log("Download package '" + packageToDownload + "'"); - - if (packageToDownload == null || fileDownloadTargetPath == null - || fileDownloadTargetPath.isEmpty()) { - Log.err("InstallManager.downloadPackage(): Invalid package: " - + packageToDownload + ": This might be a bug of IM"); - throw new IMFatalException( - ErrorCode.PACKAGE_NOT_EXIST_TO_INSTALL_OR_UNINSTALL); - } - - // Check cache foler - if (existInCacheFolder(packageToDownload, fileDownloadTargetPath)) { - if (monitor != null) { - if (monitor.isCanceled()) { - throw new IMFatalException(ErrorCode.CANCEL); - } else { - monitor.workedChecksum(packageToDownload.getPackageSize()); - } - } - Log.log("Found in cache"); - - return true; - } - - // TODO : refactoring. - long size = 0; - if (Options.onlyDownload) { - System.out.print("Downloading package => " + packageToDownload + " ......."); - } - Log.log("start download package: " + packageToDownload); - URL packageUrl = packageToDownload.getURL(); - size = mDownloader.download(packageUrl, fileDownloadTargetPath, - monitor); - if (size >= 0) { - if (Options.onlyDownload) { - System.out.println(" done."); - } - Log.log("finish download"); - } else { - Log.err("download failed => " + packageToDownload.getURL()); - - String errMsg = ""; - if (monitor.isCanceled()) { - errMsg = ErrorController.getErrorMessage(); - } else { - errMsg = "Fail to get '" + - packageToDownload.getPackageName() + "'." + - "\n(" + ErrorController.getErrorMessage() + ")"; - } - throw new IMFatalException(errMsg); - } - - if (Options.doPackageValidation) { - Log.log("Validate package"); - if (!checkPackageSize(packageToDownload, size)) { - Log.err("Package size error. downloaded size => " + size); - throw new IMFatalException(ErrorCode.PACKAGE_WRONG_SIZE); - } - - // TODO : - if (!checkFileChecksum(packageToDownload, - mDownloader.getFileChecksum())) { - Log.err("Package checksum error downloaded checksum => " - + mDownloader.getFileChecksum()); - throw new IMFatalException(ErrorCode.PACKAGE_WRONG_CHECKSUM); - } - } - - return true; - } - - /** - * @param pkg - * @param filePath - * @return true if the package is already downloaded to the - * file path - */ - private boolean existInCacheFolder(Package pkg, String filePath) { - File file = new File(filePath); - - if (!file.exists()) { - return false; - } - - if (Options.doPackageValidation) { - return checkFileChecksum(pkg, Checksum.getSHA256(filePath)); - } else { - return true; - } - } - - private boolean checkPackageSize(Package pkg, long size) { - if (pkg.getPackageSize() == size) { - return true; - } - return false; - } - - private boolean checkFileChecksum(Package pkg, MessageDigest mDigest) { - - if (pkg.getSHA256() == null || pkg.getSHA256().isEmpty()) { - return false; - } - - if (mDigest.getAlgorithm().equals(Checksum.SHA_256_TYPE)) { - return (pkg.getSHA256().equalsIgnoreCase(Checksum - .messageDigestToString(mDigest))); - } else { - // TODO there's no checksum field in package. - return false; - } - } - - /** - * Package installation management - * - * @param pkg - * package to install. - * @param targetDir - * target directory to install. - * @param monitor - * @return - */ - public boolean install(Package pkg, String targetDir, - IIMProgressMonitor monitor) { - Log.log("Install package '" + pkg + "'"); - - if (monitor != null) { - monitor.setPackageName(pkg.getPackageName()); - } - - Installer installer = new Installer(); - boolean bResult = installer.install(pkg, targetDir, monitor); - - if (bResult) { - // save installed package list - packageManager.addPackageToInstalledPackages(pkg); - packageManager.saveInstalledList(PathUtil.get( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY), - Config.INSTALLED_PACKAGE_LIST_FILE_NAME)); - } else { - Log.err("InstallManager.install() install fail => " + pkg); - return false; - } - return bResult; - } - - /** - * Packages Installation management - * - * @param packagesToInstall - * @param targetDir - * @param monitor - * @return - * @throws IMExitException - */ - public boolean install(PackageSet metasToInstall, String targetDir, - InstallProgressMonitor monitor) throws IMExitException { - - Log.log("InstallManager.install meta packages " + metasToInstall); - - if (metasToInstall == null || targetDir == null) { - Log.err("packaegs => " + metasToInstall + ", targetDir => " - + targetDir); - return false; - } - - PackageSet pkgsToInstall = null; - if (!Options.onlyDownload) { - - // save target directory - initializeTargetDir(targetDir); - - // remove missing packages - removeMissingPackages(monitor); - - // remove conflict packages - if (!removeConflictPackages(metasToInstall, monitor)) { - Log.err("Cannot remove conflict package"); - throw new IMFatalException( - ErrorCode.CONFIG_CANNOT_REMOVE_CONFLICT_PACKAGES); - } - - boolean result = false; - if (Options.snapshot) { - result = removeDifferentVersionPackages(metasToInstall, monitor); - } else { - result = removeUpdatablePackages(metasToInstall, monitor); - } - - if (!result) { - Log.err("Cannot remove updatable package"); - throw new IMFatalException( - ErrorCode.CONFIG_CANNOT_REMOVE_UPDATABLE_PACKAGES); - } - - // get All installable packages - pkgsToInstall = packageManager.getInstallablePackages(metasToInstall); - Log.log("Install packages: " + pkgsToInstall); - } else { - pkgsToInstall = packageManager.getDependsPackagesFromRepository(metasToInstall); - } - - // download packages from repository - if (downloadPackages(pkgsToInstall, monitor)) { - Log.log("Success to download packages from repository"); - } else { - if (Options.doRemovePackages) { - removePackagesDir(); - } - - Log.err("Fail to download packages from repository"); - return false; - } - - // wait if cancel confirm dialog is showing. wait until user press - // button(cancel or not). - if (monitor != null) { - while (monitor.checkCancelAndDisableCancelButton() == false) { - if (monitor.isCanceled()) { - throw new IMInstallCancelException(); - } - } - } - - if (monitor != null) { - monitor.beginTask("Installing", pkgsToInstall.size() + 1); - } - - // make start menu - installInstallManager(); - - int i = 0; - for (Package pkg : pkgsToInstall) { - if (monitor != null) { - monitor.worked(++i); - } - - if (!install(pkg, targetDir, monitor)) { - Log.log("Installation fail => " + pkg); - throw new IMFatalException(ErrorCode.INSTALLATION_FAIL); - } - } - - // remove temp directory - String tempDir = targetDir + File.separator + Config.TEMP_DIRECTORY; - PathUtil.remove(tempDir); - - // save config file - mConfig.saveConfig(); - - // save sdk version. - saveSDKVersion(); - - // Delete installed packages - if (Options.doRemovePackages) { - removePackagesDir(); - } - - // move InstallManager to target directory - if (monitor != null) { - monitor.setFileName("Move to target directory..."); - monitor.workedFileName(); - } - - return true; - } - - private void removeMissingPackages(IIMProgressMonitor monitor) { - PackageSet missingPackages = packageManager - .getMissingPackagesFromRepository(); - Log.log("Remove missing packages => " + missingPackages); - - if (monitor != null) { - monitor.setPackageName("Remove Missing Packages"); - } - - for (Package pkg : missingPackages) { - if (!removePackage(pkg, monitor)) { - Log.err("Cannot remove missing package"); - throw new IMFatalException( - ErrorCode.CANNOT_REMOVE_MISSING_PACKAGE); - } - } - } - - private boolean removeConflictPackages(PackageSet installableMetaPkgs, - IIMProgressMonitor monitor) { - PackageSet conflictPackages = packageManager - .getConflictPackagesInUpdate(installableMetaPkgs); - Log.log("Remove conflict packages => " + conflictPackages); - - if (monitor != null) { - monitor.setPackageName("Remove Conflict Packages"); - } - - return remove(conflictPackages); - } - - private boolean removeDifferentVersionPackages(PackageSet metasToInstall, - IIMProgressMonitor monitor) { - PackageSet updatablePackages = packageManager - .getdifferentVersionFromInstalledPackages(metasToInstall); - - Log.log("Remove packages in snapshot => " + updatablePackages); - - if (monitor != null) { - monitor.setPackageName("Remove updatable Packages"); - } - - return remove(updatablePackages); - } - private boolean removeUpdatablePackages(PackageSet metasToInstall, - IIMProgressMonitor monitor) { - PackageSet updatablePackages = packageManager - .getUpdatablepackagesInUpdate(metasToInstall); - - Log.log("Remove updatable packages => " + updatablePackages); - - if (monitor != null) { - monitor.setPackageName("Remove updatable Packages"); - } - - return remove(updatablePackages); - } - - private boolean remove(PackageSet packages) { - for (Package pkg : packages) { - - if (removePackage(pkg, null)) { - continue; - } else { - Log.err("Cannot remove package => " + pkg); - return false; - } - } - - return true; - } - - /** - * Initializes target directory - * - * @param targetDir - * path to SDK target directory - */ - public void initializeTargetDir(String targetDir) { - Log.log("Initialize target dir. " + targetDir); - // Make target directory - File targetDirFile = new File(targetDir); - if (!targetDirFile.exists()) { - targetDirFile.mkdirs(); - } - - // Keep target path in system - Registry.exportInstallPath(targetDir); - - // Keep target path for later use - mConfig.setTargetDir(targetDir); - - // Make .info directory - if (!mConfig.makeInfoDirectory()) { - Log.err(Config.CONFIG_HOME + " cannot create."); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_CONFIG_FILE); - } - } - - /** - * Save installed SDK version. - */ - public void saveSDKVersion() { - Registry.saveInstallVersion(mConfig.getConfigFile().getInstallManagerVersion()); - } - - /** - * Make tizen menu and installmanager shortcut. - */ - private void installInstallManager() { - Log.log("InstallManager.installInstallManager()"); - - // copy InstallManager to target directory - copyInstallManagerToTargetDirectory(); - - // make icon - StartMenu.createDesktopIcon(); - StartMenu.createInstallManagerIcon(); - - // execute install script. - File installScript = getInstallScript(); - if (installScript != null) { - installScript.setExecutable(true); - - Installer installer = new Installer(); - try { - installer.executeScript(installScript); - } catch (IMShellCommandFail e) { - - } - } else { - // when test works, install script does not need. - } - } - - /** - * Get install script from resource according to each platform. - * - * @return - */ - private File getInstallScript() { - try { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - return PathUtil.getTempFileFromResource( - LINUX_INSTALL_MANAGER_INSTALL_SCRIPT, "install", ".sh"); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return PathUtil.getTempFileFromResource( - WINDOWS_INSTALL_MANAGER_INSTALL_SCRIPT, "install", - ".vbs"); - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - return null; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } catch (IOException e) { - Log.err("Cannot execute InstallManager's install script."); - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_SHORTCUT); - } - } - - private void removeInstallManager() { - Log.log("InstallManager.removeInstallManager"); - - // execute remove script - executeInstallManagerRemoveScript(); - - if (Registry.getInstalledPath().isEmpty()) { - return; - } - // remove InstallManager's file - PathUtil.remove(PathUtil.getFromInstalledPath( - Config.INSTALL_MANAGER_DIRECTORY, - Config.INSTALL_MANAGER_UPDATER_BINARY)); - PathUtil.remove(PathUtil.getFromInstalledPath( - Config.INSTALL_MANAGER_DIRECTORY, - Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER)); - PathUtil.remove(PathUtil.getFromInstalledPath( - Config.INSTALL_MANAGER_DIRECTORY, - Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER_PARTNER)); - PathUtil.remove(PathUtil - .getFromInstalledPath(Config.INSTALL_MANAGER_DIRECTORY, - Config.INSTALL_MANAGER_BINARY)); - - // remove config file - PathUtil.remove(PathUtil.getFromInstalledPath( - Config.INSTALL_MANAGER_DIRECTORY, - Config.INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME)); - - // remove InstallManager Directory - PathUtil.remove(PathUtil.getFromInstalledPath(Config.INSTALL_MANAGER_DIRECTORY)); - } - - private void executeInstallManagerRemoveScript() { - File removeScript = getRemoveScript(); - - if (removeScript == null) { - return; - } - - removeScript.setExecutable(true); - - Installer installer = new Installer(); - try { - installer.executeScript(removeScript); - } catch (IMShellCommandFail e) { - Log.err("Cannot execute InstallManager's remove script."); - Log.ExceptionLog(e); - } - } - - private File getRemoveScript() { - try { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - return PathUtil.getTempFileFromResource( - LINUX_INSTALL_MANAGER_REMOVE_SCRIPT, "remove", ".sh"); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return PathUtil - .getTempFileFromResource( - WINDOWS_INSTALL_MANAGER_REMOVE_SCRIPT, - "remove", ".vbs"); - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - return null; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } catch (IOException e) { - // TODO Auto-generated catch block - Log.err("Cannot get InstallManager's remove script."); - Log.ExceptionLog(e); - return null; - } - } - - private void copyInstallManagerToTargetDirectory() { - Log.log("Copy InstallManager to target"); - - File fromFile = new File(System.getProperty("user.dir")); - String from = fromFile.getAbsolutePath(); - - if (Registry.getInstalledPath() == null - || Registry.getInstalledPath().equals("")) { - Log.err("Cannot find target dir"); - return; - } - - File targetDir = new File(Registry.getInstalledPath() + File.separator - + Config.INSTALL_MANAGER_DIRECTORY); - if (!targetDir.exists()) { - targetDir.mkdirs(); - } - - String to = targetDir.getAbsolutePath(); - - if (from.equals(to)) { - return; - } - - copyInstallManagerFiles(from, to); - } - - private void copyInstallManagerFiles(String from, String to) { - Log.log("Copy InstallManager files from " + from + " to " + to); - //copy execute file. - try { - //copy execute file. - PathUtil.copy( - PathUtil.get(from,Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER), - PathUtil.get(to, Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER)); - - //copy execute file for Parter SDK. - PathUtil.copy( - PathUtil.get(from,Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER_PARTNER), - PathUtil.get(to, Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER_PARTNER)); - - //set executable authority. - new File(to + File.separator - + Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER) - .setExecutable(true); - - //set executable authority. - new File(to + File.separator - + Config.EXECUTE_FILE_NAME_OF_INSTALL_MANAGER_PARTNER) - .setExecutable(true); - - //copy InstallManager.jar - PathUtil.copy( - PathUtil.get(from, "InstallManager.jar"), - PathUtil.get(to, "InstallManager.jar")); - - //copy InstallManagerUpdater.jar - PathUtil.copy( - PathUtil.get(from, "InstallManagerUpdater.jar"), - PathUtil.get(to, "InstallManagerUpdater.jar")); - - //copy installmanager.conf - PathUtil.copy( - PathUtil.get(from, Config.INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME), - PathUtil.get(to, Config.INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME)); - } catch (IOException e) { - Log.err("Failed to copy Install Manager files"); - } - } - - private void removePackagesDir() { - PathUtil.remove(Config.PACKAGE_BINARY_LOCAL_DIRECTORY_PATH); - } - - /** - * Package uninstallation management - * - * @param pkg - * @param monitor - * @return - */ - public boolean removePackage(Package pkg, IIMProgressMonitor monitor) { - Log.log("InstallManager package remove start => " + pkg); - - if (pkg == null) { - return false; - } - - if (monitor != null) { - monitor.setPackageName(pkg.getPackageName()); - } - - Installer installer = new Installer(); - - boolean bResult = installer.uninstall(pkg, monitor); - - // Remove packages in installed package list without result. - // We don't know that failed packages are working well. - packageManager.exceptPackageFromInstalledPackages(pkg); - packageManager.saveInstalledList(PathUtil.get( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY), - Config.INSTALLED_PACKAGE_LIST_FILE_NAME)); - - Log.log(pkg + " remove end => " + bResult); - return bResult; - } - - /** - * Packages uninstallation management - * - * @param pkg - * @param monitor - * @return - */ - public boolean removePackages(PackageSet metasToRemove, - IIMProgressMonitor monitor) { - Log.log("InstallManager Packages remove Start => " + metasToRemove); - - if (metasToRemove == null) { - return false; - } - - PackageSet pkgsToRemove = packageManager - .getToRemovePackagesInRemove(metasToRemove); - Log.log("Remove packages: " + pkgsToRemove); - - if (monitor != null) { - monitor.beginTask("Uninstalling...", pkgsToRemove.size() + 1); - } - - int i = 0; - for (Package pkg : pkgsToRemove) { - if (monitor != null) { - monitor.worked(++i); - } - - if (removePackage(pkg, monitor)) { - continue; - } else { - Log.log("Remove fail but make progress=> " + pkg); - } - } - - // if you remove all packages, delete targetDirectory and config File. - if (!packageManager.existInstalledMetaPackages()) { - Log.log("Installed meta packages do not exist"); - if (monitor != null) { - monitor.setFileName("Remove target directory..."); - monitor.worked(pkgsToRemove.size()); - } - - if (packageManager.existInstalledPackages()) { - Log.log("Installed meta packages do not exist, but some packages exist."); - removeAll(monitor); - } else { - // not exist to remove - removeSDK(); - } - } else { - }// Donothing. - - Log.log("InstallManager packages remove success. return => " + true); - return true; - } - - /** - * Remove all of packages. - * - * @param monitor - */ - public void removeAll(IIMProgressMonitor monitor) { - Log.log("InstallManager.removeAll()"); - - PackageSet removablePackages = packageManager.getInstalledPackages(); - - for (Package pkg : removablePackages) { - if (!removePackage(pkg, monitor)) { - Log.err("InstallManager.removeAll remove fail => " + pkg); - } - } - - removeSDK(); - } - - /** - * Remove All of TizenSDK files. - */ - public void removeSDK() { - Log.log("InstallManager removeSDK start"); - - removeInstallManager(); - removeChangeLog(); - removeInfoDirectory(); - checkTargetDirAndRemove(); - Registry.removeRegistry(); - - // do not remove config home because it has log files - Log.log("InstallManager removeSDK end"); - } - - private void checkTargetDirAndRemove() { - File targetDir = new File(Registry.getInstalledPath()); - if (canRemoveTargetDir(targetDir)) { - removeTargetDirectory(); - } else { - Log.err("Cannot delete target directory => " - + targetDir.getAbsolutePath()); - } - } - - /** - * Check status that target directory can remove or not. - * - * @param targetDir - * @return - */ - private boolean canRemoveTargetDir(File targetDir) { - if (targetDir.exists()) { - File[] fileList = targetDir.listFiles(); - if ((fileList == null || fileList.length <= 0) - || (fileList.length == 1 && fileList[0].getName().equals( - Config.OLD_INSTALL_MANAGER_DIRECTORY))) { - return true; - } else { - ArrayList fileNames = new ArrayList(); - for (File file : fileList) { - fileNames.add(file.getName()); - } - Log.err("The SDK directory is not empty => " + fileNames); - return false; - } - } else { - Log.err("The SDK direcotry is already removed"); - return false; - } - } - - private void removeChangeLog() { - File releaseNoteFile = new File( - PathUtil.getFromInstalledPath(Config.RELEASE_NOTE)); - - if (releaseNoteFile.exists()) { - PathUtil.remove(releaseNoteFile); - } - } - - private void removeInfoDirectory() { - // remove info directory in $HOME/tizen-sdk-data - File infoDirFile = new File( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY)); - if (infoDirFile.exists()) { - PathUtil.remove(infoDirFile); - } - - // remove info directory in target directory - File targetInfoFile = new File( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY)); - - if (targetInfoFile.exists()) { - PathUtil.remove(targetInfoFile); - } - } - - /** - * Remove target directory. - */ - public void removeTargetDirectory() { - Log.log("InstallManager remove target directory start"); - - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - PathUtil.remove(Registry.getInstalledPath()); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - if (!WindowsProgramController.removeRunningDir(Registry - .getInstalledPath())) { - Log.err("Cannot remove target directory"); - } - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - - Log.log("InstallManager remove target directory end"); - } - - /** - * Singleton and global downloader shared and used by every components in IM - * - * @return singleton downloader object - */ - public static Downloader getDownloader() { - return InstallManager.mDownloader; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/Installer.java b/SdkImageCreator/src/org/tizen/installmanager/core/Installer.java deleted file mode 100644 index 63782b7..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/Installer.java +++ /dev/null @@ -1,492 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.core; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Stack; - -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.LoggerShellParser; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.Registry; -import org.tizen.installmanager.lib.SDKPackageFormat; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.pkg.model.Package; -import org.tizen.installmanager.util.IMShellCommandFail; -import org.tizen.installmanager.util.PathUtil; -import org.tizen.installmanager.util.ShellUtil; - -/** - * This class manages lowlevel install/uninstall operations - * - * @author Shihyun Kim - */ -public class Installer { - /** - * Install a package to target directory. - * - * @param pack - * Package to be installed. - * @param targetDir - * Target directory to install. - * @param monitor - * If you want to express in UI, implement IIMProgressMonitor and - * set this parametor. if not, set null. - * @return true, if installation is success. - */ - public boolean install(Package pack, String targetDir, - IIMProgressMonitor monitor) { - Log.log("**** installer install start => " + pack + ", target => " - + targetDir); - - // unzip in temp dir - String tempDir = PathUtil.get(targetDir, Config.TEMP_DIRECTORY); - - long unZipSize = unZipPackage(pack, tempDir, monitor); - - if (unZipSize <= 0) { - Log.err("Unzip failed. => " + pack); - PathUtil.remove(tempDir); - throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE); - } - if (!checkUnzipSize(pack, unZipSize)) { - Log.err("Unzip size error. => " + pack); - PathUtil.remove(tempDir); - throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE); - } - - if (!moveToTargetDirectoryFromTempDirectory(tempDir, targetDir)) { - PathUtil.remove(tempDir); - Log.err("Moving temp to target failed. Remove temp and cancel installing."); - throw new IMFatalException( - ErrorCode.CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY); - } - - List missingFiles = findMissingFiles(pack); - if (missingFiles.size() > 0) { - Log.err("Some files are not moved properly: " + missingFiles); - } - - executeInstallScript(pack, monitor, tempDir); - - // move removeScript file to special Directory - File removeScriptFrom = new File(tempDir + File.separator - + pack.getRemoveScript()); - - if ((pack.getRemoveScript() != null) - && !(pack.getRemoveScript().equals("")) - && (removeScriptFrom.exists())) { - File removeScriptTo = new File(getRemoveScriptLocalPath(pack)); - if (!createRemoveScriptDir(removeScriptTo)) { - Log.err("Cannot create remove script directory in Info directory => " - + pack.getPackageName()); - return false; - } else { - if (removeScriptTo.exists()) { - removeScriptTo.delete(); - } - if (!PathUtil.moveFile(removeScriptFrom, removeScriptTo)) { - Log.err("Cannot move removeScript to targetDir => " - + pack.getPackageName()); - return false; - } - } - } - PathUtil.remove(tempDir); - return true; - } - - /** - * @param pack - * @return list of files which are not moved normally - */ - private List findMissingFiles(Package pack) { - LinkedList missingFiles = new LinkedList(); - File listFile = new File(getInstalledFileListPath(pack)); - InputStream is = null; - BufferedReader in = null; - try { - is = new FileInputStream(listFile); - in = new BufferedReader(new InputStreamReader(is, "UTF-8")); - String line; - while ((line = in.readLine()) != null) { - File tmp = new File(PathUtil.getFromInstalledPath(line)); - if (!tmp.exists()) { - if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32) { - missingFiles.add(tmp); - } else if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - // check if it is broken link - try { - int exitCode = ShellUtil.execute("ls " + tmp, null); - if (exitCode == 0) { - Log.log("broken link " + tmp - + " but no problem"); - } else { - Log.err(tmp + " not exist."); - missingFiles.add(tmp); - } - } catch (IMShellCommandFail e) { - Log.err("Failed to check file exists"); - Log.ExceptionLog(e); - } - } else { - throw new IMFatalException( - ErrorCode.UNSUPPORTED_PLATFORM); - } - } - } - } catch (IOException e) { - Log.err("Installer.findMissingFiles() Cannot check file list: " - + listFile.getAbsolutePath()); - throw new IMFatalException( - ErrorCode.CANNOT_CHECK_INSTLLED_FILE_LIST); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - if (is != null) { - try { - is.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - } - return missingFiles; - } - - /** - * Set script running process' environment variables. - * - * @return Environment variables map - */ - private Map setEnvironmentVariable() { - HashMap env = new HashMap(); - - env.put("INSTALLED_PATH", Registry.getInstalledPath()); - env.put("MAKESHORTCUT_PATH", InstallManager.getInstance() - .getMakeShortCutPath()); - env.put("REMOVE_SHORTCUT", InstallManager.getInstance() - .getRemoveShortCutPath()); - env.put("USER_DATA_PATH", Config.getConfigHome()); - - if (Options.partnerSdk) { - env.put("PARTNER_SDK", "partner"); - } else { - env.put("PARTNER_SDK", ""); - } - - return env; - } - - private long unZipPackage(Package pkg, String tempDir, - IIMProgressMonitor monitor) { - String filePath = PathUtil.getFromCurrDir(pkg.getFileName()); - - File pkgFile = new File(filePath); - if (!pkgFile.exists()) { - Log.err(filePath + " doesn't exist"); - throw new IMFatalException(ErrorCode.CANNOT_FIND_FILE_IN_LOCAL); - } - - SDKPackageFormat format = SDKPackageFormat.createSDKPackageFormat(); - - // Each packages are saved installed list to file - String installedFileListPath = getInstalledFileListPath(pkg); - - format.setFileOutput(installedFileListPath); - - return format.unZip(filePath, tempDir, monitor); - } - - private String getRemoveScriptLocalPath(Package pkg) { - return PathUtil.get( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY), - pkg.getPackageName(), pkg.getRemoveScript()); - } - - private String getInstalledFileListPath(Package pkg) { - return PathUtil.get( - PathUtil.getFromInstalledPath(Config.INFO_DIRECTORY), - pkg.getPackageName(), (pkg.getPackageName() + ".list")); - } - - private boolean moveToTargetDirectoryFromTempDirectory(String tempDir, - String targetDir) { - Log.log("Move temp to target"); - File fromFile = new File(tempDir + File.separator - + Config.DATA_DIRECTORY); - if (!fromFile.exists()) { - Log.err("Data directory is not exist in package."); - return true; - } - File toFile = new File(targetDir); - - File[] fromList = fromFile.listFiles(); - - if (fromList == null) { - return false; - } - - for (int i = 0; i < fromList.length; i++) { - boolean ret = false; - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - ret = PathUtil.copyHardLink(fromList[i], toFile); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - ret = PathUtil.move(fromList[i], - new File(toFile, fromList[i].getName())); - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - ret = PathUtil.copyHardLink(fromList[i], toFile); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - if (!ret) { - return false; - } - } - return true; - } - - /** - * Uninstalls the given package - * - * @param pkg - * package to be uninstalled - * @param monitor - * @return true if success. false if fatal error. delete failure is checked - * and sets error status in ErrorController but still returns true. - * if file to be deleted doesn't exist, it's not considered error. - */ - public boolean uninstall(Package pkg, IIMProgressMonitor monitor) { - Log.log("Installer uninstall start"); - int resultRemoveScript = executeRemoveScript(pkg, monitor); - - if (resultRemoveScript == 0) { - Log.log("Execute remove script success."); - } else if (resultRemoveScript == 1) { - Log.err("Execute remove script fail."); - } else if (resultRemoveScript == 2) { - Log.log("This package does not need a remove script."); - } - - File installedFileList = new File(getInstalledFileListPath(pkg)); - - if (!installedFileList.exists()) { - ErrorController.setError(ErrorCode.CANNOT_FIND_INSTALLED_FILE_LIST); - return false; - } - - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader(installedFileList)); - - String line = null; - Stack dirStack = new Stack(); - while ((line = reader.readLine()) != null) { - File deleteFile = new File(PathUtil.getFromInstalledPath(line)); - - if (deleteFile.isDirectory()) { - File[] listFiles = deleteFile.listFiles(); - - if (listFiles == null || listFiles.length <= 0) { - deleteIfExists(deleteFile); - } else { - dirStack.push(deleteFile); - } - } else { - deleteIfExists(deleteFile); - } - } - - while (!dirStack.isEmpty()) { - File deleteDir = dirStack.pop(); - File[] listFiles = deleteDir.listFiles(); - - if (listFiles == null || listFiles.length <= 0) { - deleteIfExists(deleteDir); - } - } - - } catch (FileNotFoundException e) { - Log.err("File not found => " + installedFileList.getAbsolutePath()); - return false; - } catch (IOException e) { - Log.err("IO Exception => " + installedFileList.getAbsolutePath()); - return false; - } catch (Throwable e) { - Log.ExceptionLog(e); - return false; - } finally { - try { - if (reader != null) { - reader.close(); - deleteIfExists(installedFileList); - } - } catch (IOException ioe) { - Log.err("Close fileoutput fail."); - } - } - - return true; - } - - /** - * Delete the file - * - * @param file - */ - private void deleteIfExists(File file) { - if (!file.delete()) { - Log.err("Delete fail -> " + file.getAbsolutePath()); - } - } - - private boolean checkUnzipSize(Package pack, long size) { - // TODO : impl. not supported - return true; - } - - private boolean createRemoveScriptDir(File removeScript) { - File parentDir = removeScript.getParentFile(); - - if (!parentDir.exists()) { - return parentDir.mkdirs(); - } else { - return true; - } - } - - private boolean executeInstallScript(Package pack, - IIMProgressMonitor monitor, String tempDir) { - if (pack.getInstallScript() != null - && !pack.getInstallScript().equals("")) { - String command = PathUtil.get(tempDir, pack.getInstallScript()); - File scriptFile = new File(command); - - if (scriptFile.exists()) { - Log.log("Execute install script"); - - if (monitor != null) { - monitor.setFileName(scriptFile.getName()); - monitor.workedFileName(); - } - try { - return executeScript(scriptFile); - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - throw new IMFatalException( - ErrorCode.INSTALL_SCRIPT_FATAL_ERROR); - } - } else { - Log.log(pack.getPackageName() + " does not have install script"); - } - } - return true; - } - - private int executeRemoveScript(Package pkg, IIMProgressMonitor monitor) { - Log.log("executeRemoveScript => " + pkg.getRemoveScript()); - - // execute remove script - String script = PathUtil.get(getRemoveScriptLocalPath(pkg)); - File scriptFile = new File(script); - - if (scriptFile.exists()) { - - if (monitor != null) { - monitor.setFileName(scriptFile.getName()); - monitor.workedFileName(); - } - - try { - if (executeScript(scriptFile)) { - return 0; // succeed to execute remove script. - } else { - return 1; // fail to execute remove script. - } - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.REMOVE_SCRIPT_FATAL_ERROR); - } - } - return 2; // package does not need remove script. - } - - /** - * Executes the file with default environment variables - * - * @param scriptFile - * @return true if success - * @throws IMShellCommandFail - */ - public boolean executeScript(File scriptFile) throws IMShellCommandFail { - scriptFile.setExecutable(true); - Map env = setEnvironmentVariable(); - - String command = ShellUtil.addInterpreter(scriptFile.getAbsolutePath()); - - int exitCode = ShellUtil.execute(command, env, null, - new LoggerShellParser()); - - // check exit code - if (exitCode == 0) { - return true; - } else if (exitCode > 0 && exitCode < 10) { - Log.err("Exit code => " + Integer.toString(exitCode)); - return false; - } else { - Log.err("Installer.executeScript() install script error => " - + scriptFile.getAbsolutePath()); - Log.err("Exit code => " + Integer.toString(exitCode)); - throw new IMFatalException(ErrorCode.INSTALL_SCRIPT_FATAL_ERROR); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/Options.java b/SdkImageCreator/src/org/tizen/installmanager/core/Options.java deleted file mode 100644 index 9e1407b..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/Options.java +++ /dev/null @@ -1,248 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.core; - -import java.io.File; -import java.util.Arrays; -import java.util.Iterator; - -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; - - -/** - * This class represents options from command line arguments. - * @author Wooyoung Cho - * - */ -public class Options { - /** - * Do sanity checks including file size and checksum - */ - public static boolean doPackageValidation = true; - /** - * Do auto install without GUI - */ - public static boolean doAutoInstall = true; - - /** - * Do download package file. - */ - public static boolean onlyDownload = false; - - /** - * Do remove temporary installmanager that exist in /tmp/tizensdk - */ - public static boolean doRemoveTempTizenSDK = true; - - /** - * Conf file provided by user - */ - public static String userConfPath = null; - - /** - * update installmanager. - * If doUpdateInstallManager is false, do not update installmanager binary. - */ - public static boolean doUpdateInstallManager = true; - /** - * Do replace repository. - * If doRepository is true, change repository address to repo variable. - */ - public static boolean doReplaceRepository = false; - - /** - * Do remove packages after installation - */ - public static boolean doRemovePackages = true; - - /** - * Do remove old sdk. - * If installer cannot update sdk, doRemoveOldSDK is true. - */ - public static boolean doRemoveOldSDK = false; - /** - * Just check installer is available for update. - */ - public static boolean checkPackageUpdate = false; - - /** - * Prints dependency graph of packages - */ - public static boolean printDepGraph = false; - - /** - * Use Snapshot file. - */ - public static boolean snapshot = false; - - public static String repo = null; - public static String snapshotPath = null; - - /** - * Use only download for making SDK image. - */ - public static String boundary = null; // all, public, partner - public static String platForm = null; - public static int platFormBit = 0; - - /** - * See all snapshots - */ - public static boolean allSnapshots = false; - - /** - * Support Partner SDK - */ - public static boolean partnerSdk = false; - public static String purposeOfInstalling = "public"; - - /** - * Display InstallManager Version - */ - public static boolean showVersion = false; - - /** - * User-provided proxy server - */ - public static String proxy = null; - - public static String[] args; - - /** - * Parses command line arguments and sets corresponding options. - * @param args command line arguments - */ - public static void loadCmdArgs(String[] args) { - Options.args = args; - Iterator iter = Arrays.asList(args).iterator(); - try { - while(iter.hasNext()) { - String arg = iter.next(); - Log.log(arg+" option is specified"); - - if(arg.equals("-noPackageValidation")) { - doPackageValidation = false; - } else if(arg.equals("-doAutoInstall")) { - doAutoInstall = true; - } else if(arg.equals("-conf")) { - if(iter.hasNext()) { - userConfPath = iter.next(); - Log.log("User conf path: "+userConfPath); - File userConf = new File(userConfPath); - if (!userConf.exists()) { - Log.err("There is no user config file in this path : " + userConfPath); - throw new IMFatalException(ErrorCode.CANNOT_FIND_USER_CONFIG_FILE); - } else { - Log.log("Found user config file in this path : " + userConfPath); - } - } else { - Log.err("-conf requires absolute path to the user conf file"); - throw new IMFatalException(ErrorCode.CANNOT_FIND_USER_CONFIG_FILE); - } - } else if(arg.equals("-noRemovePackages")) { - doRemovePackages = false; - } else if(arg.equals("-skipUpdate")) { - doUpdateInstallManager = false; - } else if(arg.equals("-checkPackageUpdate")) { - checkPackageUpdate = true; - } else if(arg.equals("-printDepGraph")) { - printDepGraph = true; - } else if(arg.equals("-proxy")) { - if(iter.hasNext()) { - proxy = iter.next(); - Log.log("User-provided proxy: "+proxy); - } else { - Log.err("-proxy requires proxy description"); - throw new IMFatalException(ErrorCode.PROXY_NOT_PROVIDED); - } - } else if (arg.equals("-snapShot")) { - if(iter.hasNext()) { - snapshot = true; - snapshotPath = iter.next(); - Log.log("User-provided repository: " + repo); - } else { - Log.err("-snapShot requires repository description"); - throw new IMFatalException(ErrorCode.USESNAPSHOT_REPOSITORY_NOT_PROVIDED); - } - } else if (arg.equals("-allSnapshots")) { - allSnapshots = true; - Log.log("Using '-allSnapshots' option, all snapshots are displaying."); - } else if (arg.equals("-onlyDownload")) { - if(iter.hasNext()) { - onlyDownload = true; - boundary = iter.next(); - platForm = iter.next().toLowerCase(); - platFormBit = Integer.parseInt(iter.next()); - Log.log("Only download boundary : "+ boundary); - } else { - Log.err("-onlyDownload requires packageList description"); - throw new IMFatalException(ErrorCode.REPOSITORY_NOT_PROVIDED); - } - onlyDownload = true; - } else if (arg.equals("-version")) { - showVersion = true; - Log.log("Using '-version' option, display InstallManager version on console."); - } else if (arg.equals("-noRemoveTempTizenSDK")) { - doRemoveTempTizenSDK = false; - } else if (arg.equals("-repository")) { - if(iter.hasNext()) { - doReplaceRepository = true; - repo = iter.next(); - Log.log("replace repository : "+repo); - } else { - Log.err("-replaceRepository requires repository description"); - throw new IMFatalException(ErrorCode.REPOSITORY_NOT_PROVIDED); - } - } else if (arg.equals("-removeOldSDK")) { - doRemoveOldSDK = true; - } else { - Log.err("InstallManager do not support '" + arg + "' option"); - throw new IMFatalException(ErrorCode.WRONG_OPTION); - } - } - } catch(Throwable e) { - Log.err("Check your options. => " + Arrays.toString(args)); - System.err.println("Check your options. => " + Arrays.toString(args)); - System.exit(1); - } - } - - /** - * Get options. - * @return - */ - public static String getArgsStr() { - String argsStr = ""; - for(String arg : args) { - argsStr = argsStr + " " + arg; - } - return argsStr; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/SDKExtensionInfo.java b/SdkImageCreator/src/org/tizen/installmanager/core/SDKExtensionInfo.java deleted file mode 100644 index b3f5054..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/SDKExtensionInfo.java +++ /dev/null @@ -1,169 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Shihyun Kim -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.core; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.LinkedHashMap; - -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.ConfigFile; -import org.tizen.installmanager.pkg.model.PackageSet; - -/** - * This class can manages extension information - * - * @author Shihyun Kim - * - */ -public class SDKExtensionInfo { - - private static SDKExtensionInfo sdkExtensionInfo = null; - //member variable - LinkedHashMap userExtensionRepositories = new LinkedHashMap(); - LinkedHashMap builtInExtensionRepositories = new LinkedHashMap(); - - //member func - private SDKExtensionInfo() { - load(); - } - - public boolean add(String name, String packageRepo) { - if (name == null || !checkPackageRepo(packageRepo)) { - return false; - - } else { - if (contains(packageRepo)) { - return false; - } - userExtensionRepositories.put(packageRepo, name); - return true; - } - } - - public boolean contains(String packageRepo) { - return userExtensionRepositories.containsKey(packageRepo); - } - - public boolean containsBuiltIn(String packageRepo) { - return builtInExtensionRepositories.containsKey(packageRepo); - } - - public void remove(String packageRepo) { - if (contains(packageRepo)) { - userExtensionRepositories.remove(packageRepo); - } - } - - public void save() { - ConfigFile confFile = Config.getInstance().getConfigFile(); - - confFile.setExtensionServer(userExtensionRepositories.toString()); - - Config.getInstance().saveConfig(); - } - - public void load() { - String extensionInfo = Config.getInstance().getConfigFile().getExtensionServer(); - String builtInExtensionInfo = Config.getInstance().getConfigFile().getBuiltInExtensionServer(); - - builtInExtensionRepositories = parseLocationInformationToMap(builtInExtensionInfo); - userExtensionRepositories = parseLocationInformationToMap(extensionInfo); - } - - public boolean checkPackageRepo(String packageRepo) { - try { - new URL(packageRepo); - return true; - } catch (MalformedURLException e) { - Log.err("Extension package server is not URL format.(" + packageRepo +")"); - return false; - } - } - - private LinkedHashMap parseLocationInformationToMap(String info) { - LinkedHashMap extensionInformation = new LinkedHashMap(); - if (info.startsWith("{")) { - info = info.substring(1); - } - - if (info.endsWith("}")) { - info = info.substring(0, info.length() -1); - } - - String[] properties = info.split(","); - - for(String property : properties) { - String[] nameValue = property.split("="); - - if (nameValue.length == 2) { - extensionInformation.put(nameValue[0], nameValue[1]); - } - } - return extensionInformation; - } - - public PackageSet getExtensionPackages() { - PackageManager pm = PackageManager.getInstance(); - - if (pm == null) { - return PackageSet.EMPTY; - } else { - try { - //Get all extension repositories. - LinkedHashMap extensionRepositories = new LinkedHashMap(); - extensionRepositories.putAll(builtInExtensionRepositories); - extensionRepositories.putAll(userExtensionRepositories); - - pm.loadExtensionPackages(extensionRepositories.keySet()); - return pm.getRootMetaPackagesOfExtensionServer(); - - } catch (IOException e) { - Log.ExceptionLog(e); - return PackageSet.EMPTY; - } - } - } - - public LinkedHashMap getExtensionRepositories() { - return userExtensionRepositories; - } - - public LinkedHashMap getBuiltInExtensionRepositories() { - return builtInExtensionRepositories; - } - - public static SDKExtensionInfo getInstance() { - if (sdkExtensionInfo == null) { - sdkExtensionInfo = new SDKExtensionInfo(); - } - - return sdkExtensionInfo; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/SnapshotLog.java b/SdkImageCreator/src/org/tizen/installmanager/core/SnapshotLog.java deleted file mode 100644 index f57b587..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/SnapshotLog.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.core; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - -import org.tizen.installmanager.lib.Downloader; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.util.PathUtil; - -/** - * This class loads snapshot's change log. - * - * @author Yongsung Kim - */ -public class SnapshotLog { - String snapshotLog; - String SNAPSHOT_LOG_FILE_SUFFIX = ".log"; - String SNAPSHOT_LOG_FILE_DIRECTORY = "changes"; // snapshot change log directory at repository. - - String repository = null; - - public SnapshotLog(String repo) { - repository = repo; - } - - public String getSnapshotLog(String snapshot) { - String snapshotLogFileName = snapshot + SNAPSHOT_LOG_FILE_SUFFIX; - - if(downloadSnapshotLog(snapshotLogFileName)) { - Log.log("Success to load " + snapshotLogFileName); - return snapshotLog; - } else { - Log.err("Fail to load " + snapshotLogFileName + "(Ignore it)"); - return null; - } - } - - private boolean downloadSnapshotLog(String snapshotLogFileName) { - File tmp = null; - try { - tmp = File.createTempFile("snapshotLog", ".log"); - tmp.deleteOnExit(); - } catch (IOException e) { - Log.ExceptionLog(e); - return false; - } - - //download snapshotLog.log file from repository - Downloader downloader = new Downloader(); - - URL distInfoFileURL = getSnapshotLogFilePath(repository, snapshotLogFileName); - - long size = downloader.download(distInfoFileURL, tmp.getAbsolutePath(), null); - if (size < 0) { - return false; - } - - String snapshotLogText = PathUtil.readAllTextFromFile(tmp.getAbsolutePath()); - - if (snapshotLogText.isEmpty()) { - snapshotLog = "Thers is no log information about " + snapshotLogFileName; - Log.log("Thers is no log information about " + snapshotLogFileName); - } else { - snapshotLog = snapshotLogText; - } - - // temp file cleanup - if (tmp.exists()) { - tmp.delete(); - } - - return true; - } - - private URL getSnapshotLogFilePath(String repo, String snapshotName) { - String snapshotLogFilePath = PathUtil.addURLPath(repo, SNAPSHOT_LOG_FILE_DIRECTORY, snapshotName); - - try { - return new URL(snapshotLogFilePath); - } catch (MalformedURLException e) { - Log.err("Cannot connect snapshot log file in repository(" + snapshotLogFilePath + ")"); - return null; - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/core/UpdateInstallManager.java b/SdkImageCreator/src/org/tizen/installmanager/core/UpdateInstallManager.java deleted file mode 100644 index 5accfe3..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/core/UpdateInstallManager.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.core; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - -import org.tizen.installmanager.lib.Downloader; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.pkg.model.ConfigFile; -import org.tizen.installmanager.pkg.model.Version; -import org.tizen.installmanager.util.PathUtil; -import org.tizen.installmanager.util.ShellUtil; - -/** - * This class checks the update of Install Manager itself, download it, and - * invokes updater process to replace the current binary. - * - * @author Wooyoung Cho - * - */ -public class UpdateInstallManager { - - private ConfigFile mCurrentConfig = null; - private ConfigFile mRepositoryConfig = null; - - private Downloader mDownloader = null; - - public UpdateInstallManager() { - this.mDownloader = InstallManager.getDownloader(); - } - - private boolean setCurrentConfig() { - InstallManager.getInstance().initConfig(); - mCurrentConfig = InstallManager.getInstance().getConfig() - .getConfigFile(); - - if (mCurrentConfig != null) { - return true; - } else { - return false; - } - } - - /** - * Download configuration file from repository and set to instance. - * - * @return true if success - */ - public boolean setRepositoryConfig() { - String repository = mCurrentConfig.getInstallManagerRepository(); - if (repository.isEmpty()) { - return false; - } else { - String repositoryConfigPath = repository + "/" - + Config.INSTALL_MANAGER_DEFAULT_CONFIG_FILE_NAME; - - URL repositoryConfigUrl; - try { - repositoryConfigUrl = new URL(repositoryConfigPath); - } catch (MalformedURLException e) { - Log.log("Invalid repository"); - return false; - } - String downloadedConfigPath = downloadConfigFileFromRepository(repositoryConfigUrl); - if (downloadedConfigPath != null) { - mRepositoryConfig = new ConfigFile(downloadedConfigPath); - return true; - } else { - return false; - } - } - } - - /** - * @param repositoryConfigUrl - * @return path to the conf file downloaded to local from the url. null if - * failed - */ - private String downloadConfigFileFromRepository(URL repositoryConfigUrl) { - Log.log("Download conf file from repo: " + repositoryConfigUrl); - - File tmpFile; - try { - tmpFile = File.createTempFile("installmanager.repository", ".conf"); - tmpFile.deleteOnExit(); - } catch (IOException e) { - Log.log("Cannot create temp file for conf file of repository"); - return null; - } - - String configToLocal = tmpFile.getAbsolutePath(); - - long size = mDownloader.download(repositoryConfigUrl, - configToLocal, null); - - if (size >= 0) { - return configToLocal; - } else { - Log.log("Download failed."); - return null; - } - } - - private boolean downloadInstallManager() { - String downloadInstallManagerPath = PathUtil.getFromCurrDir( - Config.TEMP_DIRECTORY, Config.INSTALL_MANAGER_BINARY); - Log.log("Download install manager: " + downloadInstallManagerPath); - - File downloadInstallManagerFile = new File(downloadInstallManagerPath); - if (downloadInstallManagerFile.exists()) { - downloadInstallManagerFile.delete(); - } else { - } - - File parentDir = downloadInstallManagerFile.getParentFile(); - if (!parentDir.exists()) { - parentDir.mkdirs(); - } else { - } - - URL serverIntallManager = null; - try { - serverIntallManager = new URL( - mCurrentConfig.getInstallManagerRepository() + "/" - + Config.INSTALL_MANAGER_BINARY); - } catch (MalformedURLException e) { - Log.log("Invalid install manager repository url"); - return false; - } - if (mDownloader.download(serverIntallManager, - downloadInstallManagerPath, null) <= 0) { - Log.err("Failed to download install manager binary"); - return false; - } else { - Log.log("install manager binary download success"); - return true; - } - } - - private boolean downloadUpdater() { - String path = PathUtil - .getFromCurrDir(Config.INSTALL_MANAGER_UPDATER_BINARY); - Log.log("Download install manager updater to: " + path); - - File file = new File(path); - if (file.exists()) { - file.delete(); - } else { - } - - File parentDir = file.getParentFile(); - if (!parentDir.exists()) { - parentDir.mkdirs(); - } else { - } - - URL url = null; - try { - url = new URL(mCurrentConfig.getInstallManagerRepository() + "/" - + Config.INSTALL_MANAGER_UPDATER_BINARY); - } catch (MalformedURLException e) { - Log.log("Invalid install manager repository url"); - return false; - } - if (mDownloader.download(url, path, null) <= 0) { - Log.err("Failed to download install manager binary"); - return false; - } else { - Log.log("install manager updater binary download success"); - return true; - } - } - - private void updateInstallManager(String newInstallManager, - String oldInstallManager){ - String updaterPath = PathUtil - .getFromCurrDir(Config.INSTALL_MANAGER_UPDATER_BINARY); - - String command = "java -jar " + updaterPath + " " + newInstallManager - + " " + oldInstallManager; - - if (!Options.getArgsStr().isEmpty()) { - command = command + " " + Options.getArgsStr(); - } - - Process proc = ShellUtil.asyncExecute(command); - - if (proc != null) { - Log.err("Exit for update"); - } else { - Log.err("Running updater failed"); - } - } - - /** - * Reads current config file and new config file. - * - * @return true if success - */ - private boolean init() { - boolean result = setCurrentConfig(); - if (!result) { - // if current config file does not exist, it's fatal error - Log.err("UpdateInstallManager.init() Cannot read config file"); - throw new IMFatalException("Cannot read config file"); - } else { - Log.log("Sucess to read current config file."); - } - - result = setRepositoryConfig(); - if (!result) { - Log.log("Cannot read config file from Install Manager repository. Ignore it."); - return false; - } - - if (mRepositoryConfig.getRepository() != null - && !mRepositoryConfig.getRepository().isEmpty()) { - mCurrentConfig.setRepository(mRepositoryConfig.getRepository()); - } - - if (mCurrentConfig.getDistribution().isEmpty()) { - mCurrentConfig.setDistribution(mRepositoryConfig.getDistribution()); - } - - mCurrentConfig.saveConfig(mCurrentConfig.getConfigPath()); - return true; - } - - /** - * check and try to update install manager itself - * - * @throws IMExitException - * thrown if there's new version of IM - */ - public boolean update(){ - Log.log("check install manager update"); - if (!init()) { - Log.log("Cannot read repository config file"); - return false; - } - - if (isUpdatable()) { - Log.log("Install Manager is updatable"); - - boolean bResult; - bResult = updateUpdater(); - if (bResult == false) { - Log.err("Updating Install Manager Updater failed"); - return false; - } - - bResult = downloadInstallManager(); - - if (bResult == true) { - // update config file - mCurrentConfig.setInstallManagerVersion(mRepositoryConfig - .getInstallManagerVersion()); - mCurrentConfig.saveConfig(mCurrentConfig.getConfigPath()); - - String newInstallManager = PathUtil.getFromCurrDir( - Config.TEMP_DIRECTORY, Config.INSTALL_MANAGER_BINARY); - String oldInstallManager = PathUtil - .getFromCurrDir(Config.INSTALL_MANAGER_BINARY); - - updateInstallManager(newInstallManager, oldInstallManager); - return true; - } else { - return false; - } - } else { - Log.log("no install manager update"); - return false; - } - } - - private boolean updateUpdater() { - boolean result = downloadUpdater(); - if (!result) { - Log.err("Downloading Install Manager Updater failed"); - return false; - } else { - Log.log("Downloading Install Manager Updater success"); - return true; - } - } - - private boolean isUpdatable() { - if (mCurrentConfig == null || mRepositoryConfig == null) { - return false; - } else { - String currentVersion = mCurrentConfig.getInstallManagerVersion(); - String repositoryVersion = mRepositoryConfig - .getInstallManagerVersion(); - - if (currentVersion.equals("") || repositoryVersion.equals("")) { - return false; - } else { - if (Version.compareVersion(repositoryVersion, currentVersion) > 0) { - return true; - } else { - return false; - } - } - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/Checksum.java b/SdkImageCreator/src/org/tizen/installmanager/lib/Checksum.java deleted file mode 100644 index 63d28ca..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/Checksum.java +++ /dev/null @@ -1,137 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -/** - * Manage Checksum digest - * @author Shihyun Kim - * - */ -public class Checksum { - public static final String SHA_256_TYPE = "SHA-256"; - - private static final int BUF_SIZE = 65536; - - /** - * Make SHA256 digest from filePath. - * @param filePath - * @return MessageDigest instance from filePath. - */ - public static MessageDigest getSHA256(String filePath) { - MessageDigest mDigest = null; - try { - mDigest = MessageDigest.getInstance(SHA_256_TYPE); - } catch (NoSuchAlgorithmException e) { - Log.err("No such algorithem => " + filePath); - return null; - } - - InputStream is = null; - try { - is = new FileInputStream(filePath); - } catch (FileNotFoundException fnfException) { - Log.err("Checksum getSHA256 file not found => " + filePath); - return null; - } - - byte[] buf = new byte[BUF_SIZE]; - int readSize = 0; - try { - while ((readSize = is.read(buf)) >= 0) { - mDigest.update(buf, 0, readSize); - } - } catch (IOException e) { - Log.err("Checksum getSHA256 IOException"); - return null; - } finally { - if (is != null) { - try { - is.close(); - } - catch (IOException e) { - Log.err("checksum getSHA256 fail to close output stream"); - } - } - } - - return mDigest; - } - - /** - * Get SHA256 hexdigit code from digest. - * @param digest MessageDigest isntance - * @return - */ - public static String messageDigestToString(MessageDigest digest) { - byte[] bDigest = digest.digest(); - - StringBuffer hexString = new StringBuffer(); - - for (int i = 0; i < bDigest.length; i++) { - hexString.append(hexDigit(bDigest[i])); - } - - return hexString.toString(); - } - - private static String hexDigit(byte x) { - StringBuffer sb = new StringBuffer(); - char c; - - // First nibble - c = (char) ((x >> 4) & 0xf); - if (c > 9) { - c = (char) ((c - 10) + 'a'); - } - else { - c = (char) (c + '0'); - } - sb.append(c); - - // Second nibble - c = (char) (x & 0xf); - if (c > 9) { - c = (char) ((c - 10) + 'a'); - } - else { - c = (char) (c + '0'); - } - sb.append(c); - - return sb.toString(); - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/Documents.java b/SdkImageCreator/src/org/tizen/installmanager/lib/Documents.java deleted file mode 100644 index 56a2f6f..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/Documents.java +++ /dev/null @@ -1,110 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.awt.Desktop; -import java.io.File; -import java.io.IOException; - -import org.eclipse.swt.widgets.Button; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.util.PathUtil; - -/** - * Manages Documents for InstallManager. - * @author Yongsung Kim - * - */ -public class Documents { - public static final String RELEASE_NOTE_FILENAME = "release-note.html"; - private static String OPEN_SOURCE_LICENSE_NAME = "Tizen_OpenSource_License_Information.pdf"; - private static String OPEN_SOURCE_LICENCE_PATH = PathUtil.get("/res", OPEN_SOURCE_LICENSE_NAME); - - private Documents() {} - - /** - * Make sure that the check box is checked. - * @return boolean - */ - public static boolean isChecked() { - Button btn = InstallManagerWindow.getInstallManagerWindow().getCompletePage().getChkBtn(); - return btn.getSelection(); - } - - /** - * show the change log(history). - */ - public static void showChangeLog() { - String releaseNotePath = PathUtil.getFromInstalledPath(RELEASE_NOTE_FILENAME); - File releaseNote = new File(releaseNotePath); - - if (releaseNote.exists()) { - if (Desktop.isDesktopSupported()) { - Log.log("Desktop.isDesktopSupported() is true."); - try { - Desktop.getDesktop().open(releaseNote); - Log.log("Success to open release note. => " + releaseNotePath); - } catch (IOException e) { - Log.err("cannot open release note. => " + releaseNotePath); - Log.ExceptionLog(e); - } - } else { - Log.err("Desktop.isDesktopSupported() is false."); - } - } else { - Log.log("Release note not found. => " + releaseNotePath); - } - } - - /** - * Copy the 'Tizen_OpenSource_License_Information.pdf' to target directory. - */ - public static void copyOpenLicense() { - File openLicenseFile = new File(PathUtil.getFromInstalledPath(OPEN_SOURCE_LICENSE_NAME)); - try { - PathUtil.copyFileFromResource(OPEN_SOURCE_LICENCE_PATH, openLicenseFile); - } catch (IOException e) { - Log.err("Cannot read resource '" + OPEN_SOURCE_LICENCE_PATH + "'"); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_RESOURCE); - } - } - - /** - * Remove the 'Tizen_OpenSource_License_Information.pdf' from target directory. - */ - public static void removeOpenLicense() { - File openLicenseFile = new File(PathUtil.getFromInstalledPath(OPEN_SOURCE_LICENSE_NAME)); - - if (openLicenseFile.exists()) { - PathUtil.remove(openLicenseFile); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/Downloader.java b/SdkImageCreator/src/org/tizen/installmanager/lib/Downloader.java deleted file mode 100644 index a3b6c60..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/Downloader.java +++ /dev/null @@ -1,696 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.lib; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.ConnectException; -import java.net.HttpURLConnection; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.NoRouteToHostException; -import java.net.Proxy; -import java.net.SocketAddress; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.net.URL; -import java.net.URLConnection; -import java.net.UnknownHostException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.List; -import java.util.NoSuchElementException; - -import javax.net.ssl.SSLHandshakeException; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; - - - -/** - * Manages downloading from url. - * - * @author Shihyun Kim - * - */ -public class Downloader { - private static final String PROTOCOL_SEPARATOR = "://"; - private static final String USER_PASSWORD_SEPARATOR = ":"; - private static final String ID_SEPARATOR = "@"; - - final int BUF_SIZE = 65536; - - public static final long ERROR = -1; - - private MessageDigest mDigest; - private URLConnection mConnection = null; - private final int CONNECT_TIMEOUT = 10000; // connection timeout: 10 sec - private final int READ_TIMEOUT = 20000; // connection timeout: 20 sec - private final int CONNECT_THREAD_JOIN_TIMEOUT = 11000; //// connection thread timeout: 11 sec - - private String mUser = ""; - private String mPassword = ""; - - public Downloader() { - try { - mDigest = MessageDigest.getInstance("SHA-256"); - } catch (NoSuchAlgorithmException e) { - Log.err("Downloader No algorithm for SHA-256"); - throw new IMFatalException("No algorithm for SHA-256"); - } - } - - /** - * Downloads the url to the local path - * - * @param sUrl - * url to download - * @param localPath - * local path to save the file from the url - * @param monitor - * @return download size in bytes if success. -1 if fail. - */ - public long download(URL sUrl, String localPath, IIMProgressMonitor monitor) { - Log.log("Downloading: " + sUrl + " -> " + localPath); - - if (localPath == null || localPath.equals("")) { - return ERROR; - } - - if ((sUrl == null || sUrl.toExternalForm().equals(""))) { - return ERROR; - } - - if (!connect(sUrl) || mConnection == null) { - Log.err("Network connection error.\n" + sUrl); - return ERROR; - } - - InputStream input = null; - try { - input = mConnection.getInputStream(); - } catch (FileNotFoundException e) { - Log.ExceptionLog(e); - int index = sUrl.toString().lastIndexOf("/"); - String errUrl =sUrl.toString().substring(0, index); - String errorMsg = ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY.getErrorMessage() - + "\n(URL = " + errUrl + ")"; - ErrorController.setErrorMessage(errorMsg); - return ERROR; - } catch (SocketTimeoutException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT); - return ERROR; - } catch (NoRouteToHostException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.NO_ROUTE_TO_HOST); - Log.err(ErrorController.getErrorMessage()); - return ERROR; - } catch (SocketException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - Log.err(ErrorController.getErrorMessage()); - return ERROR; - } catch (IOException e) { - Log.ExceptionLog(e); - if (e.getClass().toString().indexOf("FtpLoginException") >= 0) { - ErrorController.setError(ErrorCode.NOT_LOGGED_IN); - Log.err(ErrorController.getErrorMessage()); - return ERROR; - } - - ErrorController.setError(ErrorCode.CANNOT_DOWNLOAD_FILE); - Log.err(ErrorController.getErrorMessage()); - return ERROR; - } catch (Throwable e) { - Log.ExceptionLog(e); - ErrorController.setErrorMessage(e.getMessage()); - return ERROR; - } - - File destFile = new File(localPath); - if (!destFile.isAbsolute()) { - return ERROR; - } - - File parentDir = destFile.getParentFile(); - if (!parentDir.exists()) { - parentDir.mkdirs(); - } - - if (destFile.exists()) { - destFile.delete(); - } - - try { - destFile.createNewFile(); - } catch (IOException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.CANNOT_CREATE_DOWNLOAD_FILE); - return ERROR; - } - - FileOutputStream output = null; - try { - output = new FileOutputStream(destFile); - } catch (FileNotFoundException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.CANNOT_CREATE_DOWNLOAD_FILE); - return ERROR; - } - - byte[] buf = new byte[BUF_SIZE]; - long totalWriteSize = 0; - long writeSizePerSecond = 0; - long totalFileSize = getDownloadFileSize(); - - long beginMS = System.currentTimeMillis(); - try { - if (mDigest != null) { - mDigest.reset(); - } else { - //TODO : Consider this condition later. - } - Log.log("File download start."); - while (totalWriteSize < totalFileSize) { - if (input.available() > 0) { - int inputReadSize = input.read(buf); - - output.write(buf, 0, inputReadSize); - - totalWriteSize += inputReadSize; - writeSizePerSecond += inputReadSize; - - if (mDigest != null) { - mDigest.update(buf, 0, inputReadSize); - } - - long endMS = System.currentTimeMillis(); - if (endMS > (beginMS + 100)) { - if (monitor != null) { - if (monitor.isCanceled()) { - ErrorController.setError(ErrorCode.CANCEL); - return ERROR; - } - monitor.workedDownload(writeSizePerSecond); - } - - writeSizePerSecond = 0; - beginMS = endMS; - } - } - - long endMS = System.currentTimeMillis(); - if (endMS > (beginMS + READ_TIMEOUT)) { - Log.err("Can not be read during 20 seconds."); - ErrorController - .setError(ErrorCode.INTERNET_CONNECTION_ERROR); - return ERROR; - } - } - } catch (SocketTimeoutException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT); - return ERROR; - } catch (IOException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.ERROR); - return ERROR; - } catch (Exception e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.ERROR); - return ERROR; - } - finally { - try { - if (input != null) { - input.close(); - } - } catch (IOException e) { - Log.ExceptionLog(e); - } - - try { - if (output != null) { - output.close(); - } - } catch (IOException e) { - Log.ExceptionLog(e); - // ignore - } - } - Log.log("Downloaded size: " + totalWriteSize); - return totalWriteSize; - } - - /** - * Set user name. - * - * @param user - */ - public void setUser(String user) { - mUser = user; - } - - /** - * Set password - * - * @param password - */ - public void setPassword(String password) { - mPassword = password; - } - - /** - * Get MessageDigest instance from downloading file. - * - * @return - */ - public MessageDigest getFileChecksum() { - return mDigest; - } - - /** - * Connect to aUrl and ready to download. - * - * @param aUrl - * @return true if connect success. - */ - public boolean connect(URL aUrl) { - if (isAvailableURL(aUrl)) { - boolean bRet = false; - URL url = null; - try { - if (!mUser.equals("") || !mPassword.equals("")) { - String fullUrl = aUrl.getProtocol() + PROTOCOL_SEPARATOR - + mUser + USER_PASSWORD_SEPARATOR + mPassword - + ID_SEPARATOR + aUrl.getHost() + aUrl.getPath(); - - url = new URL(fullUrl); - } else { - url = aUrl; - } - - bRet = connection(url); - - } catch (MalformedURLException e) { - Log.ExceptionLog(e); - return false; - } catch (Throwable e) { - Log.ExceptionLog(e); - return false; - } - - return bRet; - } else { - return false; - } - } - - private boolean isAvailableURL(URL url) { - if (url.getProtocol().equalsIgnoreCase("file")) { - return true; - } - SocketAddress socketAddress = null; - try { - int port = url.getPort(); - if (port < 0) { - port = url.getDefaultPort(); - } - socketAddress = getSocketAddress(url.getHost(), port); - - } catch (IMFatalException e) { - Log.ExceptionLog(e); - return false; - } - - if (socketAddress == null) { - return false; - } else { - return true; - } - } - - private boolean connection(URL url) { - Log.log("Connect to " + url); - - boolean bRet = false; - if (NetworkProxy.useProxy) { - bRet = connectWithProxy(url); - - if (!bRet) { - bRet = connectWithDirect(url); - - if (bRet) { - NetworkProxy.useProxy = false; - } - } - } else { - bRet = connectWithDirect(url); - - if (!bRet) { - bRet = connectWithProxy(url); - - if (bRet) { - NetworkProxy.useProxy = true; - } - } - } - - return bRet; - } - - private boolean connectWithProxy(URL url) { - String protocol = url.getProtocol(); - Config conf = InstallManager.getInstance().getConfig(); - - boolean bRet = false; - if (protocol.startsWith("file")) { - Log.log("Connect to local path."); - bRet = connectToURL(url, Proxy.NO_PROXY); - - } else if (Options.proxy != null) { - Log.log("Connect to repository with '-proxy' option."); - bRet = connectToURL(url, getOptionalProxy()); - - } else if (conf.hasProxy()) { - Log.log("Connect to repository with config proxy."); - bRet = connectToURL(url, getConfigProxy()); - - } else { // system proxy - Log.log("Connect to repository with system proxy."); - List proxyList = NetworkProxy.getSystemProxyList(url); - - for (Proxy proxy : proxyList) { - if (bRet = connectToURL(url, proxy)) { - break; - } - } - } - - return bRet; - } - - private boolean connectWithDirect(URL url) { - boolean bRet = false; - - String protocol = url.getProtocol(); - if (protocol.startsWith("file")) { - Log.log("Connect to local path."); - bRet = connectToURL(url, Proxy.NO_PROXY); - - } else { - Proxy directProxy = NetworkProxy.getHttpDirectProxy(url); - bRet = connectToURL(url, directProxy); - } - - return bRet; - } - - private boolean connectToURL(final URL url, final Proxy proxy) { - - ConnectionThread connectionThread = new ConnectionThread(url, proxy); - - connectionThread.setDaemon(true); - connectionThread.start(); - - try { - connectionThread.join(CONNECT_THREAD_JOIN_TIMEOUT); - } catch (InterruptedException e) { - Log.ExceptionLog(e); - } - - if (!connectionThread.getConnectionResult()) { - return false; - } - - if (connectionThread.isAlive()) { - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - Log.err("Cannot connect to server (URL => " + url +"). Connection thread still alive."); - Log.err("proxy => " + proxy); - return false; - } - - if (!checkConnectionStatus(mConnection)) { - return false; - } - - if (mConnection.getContentLength() < 0) { - Log.err("Cannot connect to repository(url=>" + url + ", proxy=>" + proxy); - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - return false; - } else { - return true; - } - } - - private boolean checkConnectionStatus(URLConnection connection) { - if (connection == null) { - return false; - } else { - String protocol = connection.getURL().getProtocol(); - if (protocol.equalsIgnoreCase("http")) { - return checkHttpConnectionStatus(connection); - } else if (protocol.equalsIgnoreCase("ftp")) { - return true; - } else { - return true; - } - } - } - - private boolean checkHttpConnectionStatus(URLConnection connection) { - HttpURLConnection httpCon = (HttpURLConnection)connection; - - int responseCode; - String responseMessage = ""; - try { - responseCode = httpCon.getResponseCode(); - responseMessage = httpCon.getResponseMessage(); - } catch (IOException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - return false; - } - - Log.log(Integer.toString(responseCode)); - Log.log(responseMessage); - - switch(responseCode) { - case HttpURLConnection.HTTP_OK : - return true; - case HttpURLConnection.HTTP_NOT_FOUND : - ErrorController.setError(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY); - break; - case HttpURLConnection.HTTP_UNAUTHORIZED : - ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_401); - break; - case HttpURLConnection.HTTP_FORBIDDEN : - ErrorController.setError(ErrorCode.HTTP_ERROR_MESSAGE_403); - break; - case -1 : - Log.err("Http response code returns -1(null). It looks a Linux bug."); - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - break; - default : - String errMsg = "Server connection failed." + - "\nError message : " + - responseMessage + - "(Code number=" + Integer.toString(responseCode) + ")"; - ErrorController.setErrorMessage(errMsg); - break; - } - - return false; - } - - private Proxy getOptionalProxy() { - Config conf = InstallManager.getInstance().getConfig(); - - String[] arr = Options.proxy.split(":"); - try { - Log.log("Use user-provided proxy: " + Options.proxy); - - SocketAddress addr = getSocketAddress(arr[0], arr[1]); - - // save proxy server and port - conf.getConfigFile().setProxyServer(arr[0]); - conf.getConfigFile().setProxyPort(arr[1]); - - return new Proxy(Proxy.Type.HTTP, addr); - } catch (IllegalArgumentException e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.PROXY_SERVER_IS_WRONG); - } catch (ArrayIndexOutOfBoundsException e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.PROXY_SERVER_IS_WRONG); - } catch (IMFatalException e) { - Log.ExceptionLog(e); - throw new IMFatalException(e.getMessage() + "\n(proxy: " + arr[0] - + ":" + arr[1] + ")."); - } - } - - private Proxy getConfigProxy() { - Config conf = InstallManager.getInstance().getConfig(); - - Log.log("Use proxy specified in .conf file: " - + conf.getConfigFile().getProxyServer() + ":" - + conf.getConfigFile().getProxyPort()); - - SocketAddress addr = null; - try { - addr = getSocketAddress(conf.getConfigFile().getProxyServer(), conf - .getConfigFile().getProxyPort()); - } catch (IMFatalException e) { - throw new IMFatalException(e.getMessage() + "\n(proxy:" - + conf.getConfigFile().getProxyServer() + ":" - + conf.getConfigFile().getProxyPort() + ")."); - } - - return new Proxy(Proxy.Type.HTTP, addr); - } - - private SocketAddress getSocketAddress(String address, String port) - throws IMFatalException { - try { - return getSocketAddress(address, Integer.parseInt(port)); - } catch (NumberFormatException e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.URL_PORT_IS_WRONG); - } - } - - private SocketAddress getSocketAddress(String address, int port) - throws IMFatalException { - SocketAddress addr = null; - try { - addr = new InetSocketAddress(InetAddress.getByName(address), port); - } catch (UnknownHostException e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.URL_ADDRESS_IS_WRONG); - - } catch (IllegalArgumentException e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.URL_PORT_IS_WRONG); - - } catch (SecurityException e) { - Log.ExceptionLog(e); - - ErrorController.setErrorMessage(e.getMessage()); - throw new IMFatalException(ErrorCode.URL_SECURITY_EXCEPTION); - } - - return addr; - } - - /** - * Get file size to download. - * - * @return - */ - public int getDownloadFileSize() { - if (mConnection == null) { - return -1; - } - - return mConnection.getContentLength(); - } - - class ConnectionThread extends Thread { - URL url = null; - Proxy proxy = null; - - boolean connectionResult = false; - - public ConnectionThread(URL url, Proxy proxy) { - this.url = url; - this.proxy = proxy; - } - - public void run() { - try { - if (url != null) { - mConnection = url.openConnection(proxy); - } - - // set connetion timeout - if (mConnection != null) { - mConnection.setConnectTimeout(CONNECT_TIMEOUT); - mConnection.setReadTimeout(READ_TIMEOUT); - mConnection.connect(); - } - - connectionResult = true; - } catch (ConnectException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - - } catch (NoRouteToHostException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - - } catch (SocketTimeoutException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.SERVER_CONNECTION_TIME_OUT); - - } catch (SocketException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.INTERNET_CONNECTION_ERROR); - - } catch (FileNotFoundException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.CONFIG_CANNOT_FIND_PACKAGE_LIST_FILE_IN_REPOSITORY); - - } catch (SSLHandshakeException e) { - Log.ExceptionLog(e); - ErrorController.setError(ErrorCode.NOT_SUPPORT_HTTPS_PROTOCOL); - - } catch (NoSuchElementException e) { - Log.ExceptionLog(e); - } catch (IOException e) { - Log.ExceptionLog(e); - } catch (Throwable e) { - Log.ExceptionLog(e); - } - } - - public boolean getConnectionResult() { - return connectionResult; - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/ErrorController.java b/SdkImageCreator/src/org/tizen/installmanager/lib/ErrorController.java deleted file mode 100644 index 93db158..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/ErrorController.java +++ /dev/null @@ -1,254 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import org.tizen.installmanager.core.Config; - -/** - * This class manages error codes and states - * - * @author Shihyun Kim - */ -public class ErrorController { - /** - * Define case of error - * - * @author Shihyun Kim - * - */ - public enum ErrorCode { - CANNOT_FIND_CONFIG_FILE("The installmanager.conf file not found."), - CANNOT_FIND_FILE_IN_REPOSITROY("Cannot connect to SDK package server."), - CANNOT_CREATE_DOWNLOAD_FILE("Download file cannot be created."), - CANNOT_CHECK_INSTLLED_FILE_LIST("Installed file list cannot be checked."), - CANNOT_MOVE_FILE_TO_TARGET_DIRECTORY("File cannot be moved to the target directory."), - CANNOT_CONNECT_TO_PROXY_SERVER("Proxy server connection fails."), - WRONG_PACKAGE_URL("Package URLs are invalid."), - CANCEL("Download canceled."), - ERROR("Unknown error."), - UNKNOWN_PACKAGE_EXTENSION("Package extension not supported."), - INVALID_PACKAGE_VERSION("Invalid package version."), - CANNOT_FIND_INSTALLABLE_OR_REMOVABLE_PACKAGES("Install or uninstall packages not found. Network connection may have failed."), - CANNOT_FIND_FILE_IN_LOCAL("Local file not found."), - CANNOT_SAVE_CONFIG("Configuration file cannot be saved."), - CANNOT_CREATE_SHORTCUT("Shortcut creation failed."), - CANNOT_CREATE_INSTALL_LIST("Install list creation failed."), - CANNOT_CREATE_CONFIG_FILE("Configuration directory or file creation failed."), - CANNOT_FIND_USER_CONFIG_FILE("User configuration file creation failed."), - CANNOT_REGISTER_TARGET_DIR("Target directory registration failed."), - CANNOT_PARSING_TEXT("Configuration file parsing failed."), - CANNOT_SAVE_PROPERTY_FILE("The installmanager.conf or Package file cannot be saved."), - CANNOT_UNPACK_PACKAGE("The package.zip file unpackaging failed."), - CANNOT_CREATE_RESOURCE("Resource file creation failed."), - CANNOT_FIND_PACKAGE("Required packages not found. The package server may be invalid."), - CANNOT_REMOVE_PACKAGE("Package removal failed."), - CANNOT_REMOVE_MISSING_PACKAGE("Missing package cannot be removed."), - CANNOT_ACCESS_FILE("File access failed."), - CANNOT_REMOVE_OLDSDK("Old SDK removal failed."), - COPY_FILE_IS_FAIL("Copying the file to the target directory failed."), - OLD_TIZEN_SDK_EXISTS("Old Tizen SDK is installed. Remove the old SDK and run the Tizen SDK Install Manager again."), - UNSUPPORTED_PLATFORM("Platform not supported."), - REMOVE_SCRIPT_NOT_EXISTS("Removal script not found."), - REMOVE_SCRIPT_FATAL_ERROR("Fatal error occurred while uninstalling the Tizen SDK."), - INSTALLATION_FAIL("Installation failed."), - INSTALL_CANCELED("Installation canceled."), - INSTALLED_VERSION_IS_HIGH("Installation progress failed due to high installed package version."), - CANNOT_CREATE_FILE("File creation failed."), - THREAD_INTERRUPTED("Thread execution interrupted."), - CIRCULAR_PACKAGE_DEPENDENCY("Circular package dependency detected."), - - //Configuration file error - CONFIG_CANNOT_PARSING_PACKAGE_LIST("Package list cannot be read. Check the repository or proxy server."), - CONFIG_CANNOT_FIND_PACKAGE_LIST_FILE_IN_REPOSITORY("Package list file not found in the repository."), - CONFIG_CANNOT_REMOVE_CONFLICT_PACKAGES("Conflict package removal failed."), - CONFIG_CANNOT_REMOVE_UPDATABLE_PACKAGES("Updatable package removal failed."), - CONFIG_CANNOT_READ_SERVER_TYPE("Server type cannot be read. Check the server type in the installmanager.conf file."), - - //Package error - PACKAGE_WRONG_SIZE("Package size incorrect."), - PACKAGE_WRONG_CHECKSUM("Package file checksum error."), - PACKAGE_NOT_EXIST_TO_INSTALL_OR_UNINSTALL("Install or uninstall package not found."), - INSTALL_SCRIPT_NOT_EXISTS("Install script files not found."), - INSTALL_SCRIPT_FATAL_ERROR("Fatal error occurred while installing the Tizen SDK."), - - // Network error - INTERNET_CONNECTION_ERROR("Server connection failed. Check the network status or try again with the '-proxy
:'."), - SERVER_CONNECTION_TIME_OUT("Server connection timed out."), - PROXY_NOT_PROVIDED("Proxy setting missing. Use the '-proxy :' option."), - PROXY_SERVER_IS_WRONG("Proxy server connection failed. Check the proxy server."), - PROXY_CONNECT_ERROR("Proxy server connection failed. Check the proxy server."), - URL_SECURITY_EXCEPTION("Proxy server URL security error."), - URL_ADDRESS_IS_WRONG("Incorrect URL."), - URL_PORT_IS_WRONG("Incorrect port number."), - NO_ROUTE_TO_HOST("Server not found. Check the URL."), - NOT_LOGGED_IN("Login failed."), - NOT_SUPPORT_HTTPS_PROTOCOL("HTTPS not supported."), - - //Http Socket error message - HTTP_ERROR_MESSAGE_403("403 Forbidden is returned by http protocol. " + - "The server can be reached, but the server declined to allow access to the page."), - HTTP_ERROR_MESSAGE_401("Server requires authentication."), - - //option - WRONG_OPTION("Incorrect option. Check it."), - USESNAPSHOT_REPOSITORY_NOT_PROVIDED("Repository setting is missing. Use the '-snapShot ' option."), - REPOSITORY_NOT_PROVIDED("Repository setting is missing. Use the '-repository ' option."), - PACKAGES_NOT_PROVIDED("Repository setting is missing. Use the '-proxy ' option."), - - //etc - CANNOT_FIND_INSTALLED_FILE_LIST("Installation file list not found."), - CANNOT_REMOVE_TARGET_DIR("Target directory removal failed."), - INSTALLATION_STOP("Required packages for the META package not installed."), - UNINSTALLATION_FAIL("Uninstallation failed."), - FILE_NOT_FOUND("File not found."), - REMOVE_OLD_SDK_OK("Old SDK uninstallation completed. Restart Install Manager."), - INVALID_INSTALL_PATH("Invalid installation path."), - DOWNLOAD_AND_EXIT("Packages downloaded successfully. Exit Install Manager."), - CANNOT_DOWNLOAD_FILE("File download failed."), - CANNOT_FIND_JAVA("\'JAVA\' not found. Check the java installation."), - UNKOWN_ERROR("Unknown error."), - NO_ERROR("Install Manager error. Send the log file to the Tizen SDK team."), - ERROR_TEMP("Information retrieval from the default SDK package server failed.\n In Advanced Configuration, select the package server and distribution."), - - SNAPSHOT_PATH_IS_NULL("Snapshot path missing."), - FAIL_TO_EXTRACT_SDK_IMAGE_FILE("SDK image file extraction failed."), - - //Using add extra repository dialog - SPACE_IN_REPOSITORY_NAME("Name cannot contain spaces."), - NOTHING_TO_REPOSITORY_NAME("Name must be more than 1 character long."), - HANGUL_IN_REPOSITORY_NAME("Repository name must be in English."), - WRONG_PACKAGE_SERVER("Package list files not found. Check the package list files on the package server."), - WRONG_PACKAGE_LIST_FORMAT("Mandatory field missing in the package list file."), - WRONG_URL_FORMAT_HTTP("URL must begin with 'http://'."), - WRONG_URL_FORMAT("Incorrect URL format. Enter the URL in the correct format."), - CANNOT_CONNECT_URL_ADDRESS("Connection to the URL failed. Enter the correct URL."), - PACKAGE_NOT_IN_EXTENSION_SERVER("Package file not found on the package server."), - OVERLAP_EXTENSION_REPOSITORY("Extension repository URL already exists.\nEnter a different extension repository URL."), - OVERLAP_BUILT_IN_EXTENSION_REPOSITORY("Built-in extension repository URL already exists.\nEnter a different extension repository URL."); - - private String errorMessage = ""; - - ErrorCode(String arg) { - errorMessage = arg; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String msg) { - errorMessage = msg; - } - } - - static public boolean isInstallManagerUpdatable = false; - - - static private ErrorCode mErrorCode = ErrorCode.NO_ERROR; - static private boolean mInstallationStatus = true; - static private String errorMsg = ""; - - private static int exitCode = Config.EXITCODE_NORMAL; - - /** - * Set error code. - * @param errorCode - */ - static public void setError(ErrorCode errorCode) { - mErrorCode = errorCode; - } - - /** - * - * @return Latest error message. - */ - static public String getErrorMessage() { - if (mErrorCode != null) { - return mErrorCode.getErrorMessage(); - } else { - return errorMsg; - } - } - - static public void setErrorMessage(String msg) { - mErrorCode = null; - errorMsg = msg; - } - - /** - * @return Latest error code. - */ - static public ErrorCode getErrorCode() { - return mErrorCode; - } - - /** - * Set status of installation. - * @param status - */ - static public void setInstallationSuccess(boolean status) { - Log.log("Set installation success: "+status); - if (status == true) { - mErrorCode = null; - } - mInstallationStatus = status; - } - - /** - * Get status of installation. - * @return - */ - static public boolean checkInstallationSuccess() { - return mInstallationStatus; - } - - /** - * Get error message of e - * @param e - * @return - */ - public static String getMessage(ErrorCode e) { - return e.getErrorMessage(); - } - - /** - * Sets exit code to be used on exit - * @param exitCode - */ - public static void setExitCode(int exitCode) { - ErrorController.exitCode = exitCode; - } - - /** - * Gets exit code to be used on exit - */ - public static int getExitCode() { - return ErrorController.exitCode; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/IFileSystemInformation.java b/SdkImageCreator/src/org/tizen/installmanager/lib/IFileSystemInformation.java deleted file mode 100644 index 11c601e..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/IFileSystemInformation.java +++ /dev/null @@ -1,71 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.io.File; -import java.util.List; - -/** - * Provide information of file system. - * - * @author Taeyoung Son - * - */ -public interface IFileSystemInformation { - /** - * @author Taeyoung Son - */ - enum FileSystemType { - - UNKNOWN, - NTFS, - FAT32, - FAT16, - EXT2, - EXT3, - EXT4 - }; - - /** - * Get list of mount drive. - * @return - */ - public List getListMounts(); - /** - * Get list of device. - * @return - */ - public File[] getListDevices(); - /** - * Get file system type. - * @param disk - * @return enum value of FileSystemType. - */ - public FileSystemType getFileSystemType(File disk); -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/IIMProgressMonitor.java b/SdkImageCreator/src/org/tizen/installmanager/lib/IIMProgressMonitor.java deleted file mode 100644 index b6f4a79..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/IIMProgressMonitor.java +++ /dev/null @@ -1,75 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * If you want to express in UI, implement this interface and exchange information from this. - * - * @author Shihyun Kim - * - */ -public interface IIMProgressMonitor extends IProgressMonitor{ - /** - * set name of package. - * @param name - */ - public void setPackageName(String name); - /** - * set file name while installing or uninstalling - * @param name - */ - public void setFileName(String name); - /** - * Display file name to UI. - */ - public void workedFileName(); - /** - * Display download size to UI. - * @param size - */ - public void workedDownload(long size); - /** - * Display checksum size to UI. - * @param size - */ - public void workedChecksum(final long size); - /** - * Set start time to download. - * It can be used remaining time or download speed. - * @param startTime - */ - public void setDownloadStartTime(long startTime); - /** - * Display progressbar to UI. - * @param percent - */ - public void workedProgressbar(int percent); -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/IMError.java b/SdkImageCreator/src/org/tizen/installmanager/lib/IMError.java deleted file mode 100644 index 5086f62..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/IMError.java +++ /dev/null @@ -1,110 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.io.File; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.MessageBox; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.page.CompletePage; - - -/** - * This exception is thrown when error occurs. - * - * @author Wooyoung Cho - * - */ -public class IMError { - - private static Composite mParent; - - - private MessageBox mMessageBox; - - /** - * set composite to display. - * @param parent - */ - public static void setComposite(Composite parent) { - mParent = parent; - } - - /** - * This exception is thrown when error occurs before making UI page. - * @param message - */ - public static void fatalError(final String message) { - final InstallManagerWindow window = InstallManagerWindow.getInstallManagerWindow(); - window.getShell().getDisplay().asyncExec(new Runnable() { - public void run() { - CompletePage completePage = window.getCompletePage(); - completePage.showCheckButton(false); - window.setCancelBtnEnabled(true); - window.showComposite(completePage); - completePage.setTitle("Installation Error"); - completePage.setCustomErrorMessage(message); - } - }); - - } - - /** - * Show warning dialog. - * @param message Display message in dialog. - */ - public void warning(String message) { - warningBox(message); - } - - /** - * Show warning dialog when file is not exist. - * @param file - */ - public void noFile(File file) { - String message = file.getName() + "is not exist"; - - warningBox(message); - } - - private void warningBox(String message) { - mMessageBox = new MessageBox(mParent.getShell(), SWT.ICON_WARNING | SWT.OK); - mMessageBox.setText("Warning"); - - message = "Warning : " + message; - messageBox(message); - } - - private void messageBox(String message) { - mMessageBox.setMessage(message); - mMessageBox.open(); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/Log.java b/SdkImageCreator/src/org/tizen/installmanager/lib/Log.java deleted file mode 100644 index 5bff941..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/Log.java +++ /dev/null @@ -1,229 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.lib; - -import java.io.*; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Date; -import java.text.SimpleDateFormat; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.util.PathUtil; - -/** - * Manages log message. - * - * @author Yongsung Kim - * - */ -public class Log { - private static File mLogFile; - private static String newLine = ""; - - private static FileWriter objfile = null; - private final static Date startTime = new Date(); - private final static String logfileNameHead = "tizen_installmanager"; - - // log file dir - private final static String LOG_FILE_DIRECTORY = "install-log"; - - static { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - newLine = "\n"; - } else { - newLine = "\r\n"; - } - } - - /** - * This function must be before Logging. Create log file. - */ - public static void open() { - removeTooOldLogs(); - - // open log file - mLogFile = new File(PathUtil.get( - Config.CONFIG_HOME, - LOG_FILE_DIRECTORY, - logfileNameHead - + "_" - + new SimpleDateFormat("yyyyMMdd-HHmmss") - .format(startTime) + ".log")); - File parentDir = mLogFile.getParentFile(); - if (!parentDir.exists()) { - parentDir.mkdirs(); - } - - try { - mLogFile.createNewFile(); - } catch (IOException e) { - // log file is not create. - return; - } - - try { - objfile = new FileWriter(mLogFile); - } catch (IOException e1) { - // log file is not create. - return; - } - - } - - /** - * remove logs except latest 5 logs - */ - private static void removeTooOldLogs() { - File confDir = new File(PathUtil.get( - Config.CONFIG_HOME, - LOG_FILE_DIRECTORY)); - - File[] logs = confDir.listFiles(new FileFilter() { - - @Override - public boolean accept(File file) { - return file.getAbsolutePath().contains(logfileNameHead); - } - - }); - if (logs == null) { - return; - } - Arrays.sort(logs, new Comparator() { - - @Override - public int compare(File arg0, File arg1) { - return arg0.compareTo(arg1); - } - - }); - - for (int i = 0; i < logs.length - 5; i++) { - logs[i].delete(); - } - - } - - /** - * This function must be after Logging - */ - public static void close() { - try { - if (objfile != null) { - objfile.flush(); - objfile.close(); - } - } catch (IOException e) { - // ignore - return; - } - } - - /** - * Logging title - */ - public static void LogTitle(String msg) { - if (objfile == null) { - return; - } - StringBuffer bufLogTitle = new StringBuffer(); - - bufLogTitle.append("********************** "); - bufLogTitle.append(msg); - bufLogTitle.append(" **********************"); - - try { - objfile.write(bufLogTitle.toString()); - objfile.write(newLine); - objfile.flush(); - } catch (IOException e) { - } - } - - /** - * Tracing Log Method - */ - public static void log(String msg) { - write("[Trace] " + msg); - } - - /** - * Error Log Method - */ - public static void err(String msg) { - write("[Error] " + msg); - } - - /** - * Exception Log Method - */ - public static void ExceptionLog(Throwable e) { - write("[Excep] " + e); - PrintWriter pw = new PrintWriter(objfile); - e.printStackTrace(pw); - } - - /** - * Write a string to logfile with timestamp - * - * @param str - */ - private static void write(String str) { - if (objfile == null) { - return; - } - - try { - objfile.write(timeStr() + " " + str); - objfile.write(newLine); - objfile.flush(); - } catch (IOException e) { - - } - } - - /** - * @return time string - */ - private static String timeStr() { - return getTimeStr(); - } - - private static String getTimeStr() { - String timeStr = getFormatter().format(new Date()); - return timeStr; - } - - private static SimpleDateFormat getFormatter() { - SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); - return formatter; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/LoggerShellParser.java b/SdkImageCreator/src/org/tizen/installmanager/lib/LoggerShellParser.java deleted file mode 100644 index f444cb8..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/LoggerShellParser.java +++ /dev/null @@ -1,104 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -/** - * Logs shell stdout and stderr - * @author Wooyoung Cho - * - */ -public class LoggerShellParser extends ShellParser { - - public LoggerShellParser() { - } - - public LoggerShellParser(boolean isJoin) { - super(isJoin); - } - - /** - * Logs stdout - * @param input standard out stream - */ - protected void parseStdOut(InputStream input) { - BufferedReader br = null; - try { - InputStreamReader isr = new InputStreamReader(input, Platform.CURRENT_CHARSET); - br = new BufferedReader(isr); - - String line; - while ( (line = br.readLine()) != null) { - Log.log("STDOUT> "+line); - } - } catch (IOException ioe) { - Log.err("LoggerShellParser fail to parse stdout stream."); - } finally{ - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.err("LoggerShellParser fail to close stdout stream."); - } - } - } - } - - /** - * Logs stderr - * @param input standard error stream - */ - protected void parseStdErr(InputStream input) { - BufferedReader br = null; - try { - InputStreamReader isr = new InputStreamReader(input, Platform.CURRENT_CHARSET); - br = new BufferedReader(isr); - - String line; - while ( (line = br.readLine()) != null) { - Log.log("STDERR> "+line); - } - } catch (IOException ioe) { - Log.err("LoggerShellParser fail to parse stderr stream."); - }finally{ - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.err("LoggerShellParser fail to close stderr stream."); - } - } - } - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/NetworkProxy.java b/SdkImageCreator/src/org/tizen/installmanager/lib/NetworkProxy.java deleted file mode 100644 index 941c3c9..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/NetworkProxy.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.tizen.installmanager.lib; - -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.ProxySelector; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.List; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; - - -/** - * - * Get network proxy address from ProxySelector class. - * If you create NetworkProxy instance without ProxySelector instance, - * you can get system proxy from select function. - * @author Shihyun Kim - * - */ -public class NetworkProxy{ - public static boolean useProxy = true; - - private static NetworkProxy netProxy = null; - private static final String PROXY_PROPERTY = "java.net.useSystemProxies"; - - //member variable - private ProxySelector proxySelector = null; - - private NetworkProxy(ProxySelector selector) { - proxySelector = selector; - } - - /** - * Get proxy list from url parameter. - * @param url - * @return list of proxy from ProxySelector. - */ - public List select(URL url) { - - try { - return select(url.toURI()); - } catch (URISyntaxException e) { - Log.err("Cannot get proxy => " + url); - return null; - } - } - - /** - * Get proxy list from uri parameter. - * @param uri - * @return list of proxy from ProxySelector. - */ - public List select(URI uri) { - if (uri == null) { - Log.err("uri is null"); - return null; - } - - - Log.log("proxy select uri => " + uri.toString()); - - try { - if (proxySelector == null) { - return ProxySelector.getDefault().select(uri); - } else { - return proxySelector.select(uri); - } - } catch (IllegalArgumentException e) { - Log.ExceptionLog(e); - return null; - } catch (Exception e) { - Log.ExceptionLog(e); - return null; - } - } - - /** - * Get direct Proxy instance. - * @param url is connected by proxy. - * @return Direct proxy instance. - */ - public static Proxy getHttpDirectProxy(URL url) { - String host = url.getHost(); - int port = url.getPort(); - if (port < 0) { - port = url.getDefaultPort(); - } - - Proxy directProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(host, port)); - return directProxy; - } - - /** - * Get system proxy list to connect. - * @param url - * @return - */ - public static List getSystemProxyList(URL url) { - String proxyPropertyBefore = System.getProperty(PROXY_PROPERTY); - /* - * "useSystemProxies" property set true. - * because get the system proxy in ProxySelector class. - */ - System.setProperty(PROXY_PROPERTY, "true"); - - NetworkProxy netProxy = NetworkProxy.getInstance(ProxySelector.getDefault()); - - // get system proxy from NetworkProxy class - List proxyList = null; - try { - proxyList = netProxy.select(url.toURI()); - } catch (URISyntaxException e) { - Log.ExceptionLog(e); - } - - if (proxyPropertyBefore != null) { - System.setProperty(PROXY_PROPERTY, proxyPropertyBefore); - } else { - System.setProperty(PROXY_PROPERTY, "null"); - } - - if (proxyList == null) { - throw new IMFatalException(ErrorCode.INTERNET_CONNECTION_ERROR); - } else { - Log.log("Proxy list => " + proxyList); - return proxyList; - } - } - - public static NetworkProxy getInstance(ProxySelector selector) { - if (netProxy == null) { - netProxy = new NetworkProxy(selector); - } - - return netProxy; - } -} - - - - diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/OldRegistry.java b/SdkImageCreator/src/org/tizen/installmanager/lib/OldRegistry.java deleted file mode 100644 index 541c939..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/OldRegistry.java +++ /dev/null @@ -1,278 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.prefs.Preferences; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.win.WindowsRegistry; -import org.tizen.installmanager.util.IMShellCommandFail; -import org.tizen.installmanager.util.PathUtil; -import org.tizen.installmanager.util.ShellUtil; - - -/** - * This class purpose to remove old version tizen sdk. - * @author Shihyun Kim - * - */ -public class OldRegistry{ - List oldRegistryInfo = new ArrayList(); - RegistryInfo mCurrentRegistry = null; - - boolean isWindowsRegistry = false; - - private class RegistryInfo { - String mRegistryPath = ""; - String mPathKey = ""; - String mTargetPath = ""; - - RegistryInfo(String registryPath, String pathKey) { - mRegistryPath = registryPath; - mPathKey = pathKey; - } - - void setTargetPath(String targetPath) { - mTargetPath = targetPath; - } - } - - public OldRegistry() { - setOldRegistryInfo(); - mCurrentRegistry = getCurrentRegistry(); - } - - //You have to add additional old IM to this method - private List setOldRegistryInfo() { - //file fist parameter is file path, second parameter is key of installed-path - oldRegistryInfo.add(new RegistryInfo(PathUtil.getFromHome(".slpsdk"), "SLP_SDK_INSTALL_PATH")); - oldRegistryInfo.add(new RegistryInfo(PathUtil.getFromHome(".tizensdk"), "TIZEN_SDK_INSTALL_PATH")); - - //windows registry - oldRegistryInfo.add(new RegistryInfo("", "tizensdk-installpath")); - oldRegistryInfo.add(new RegistryInfo("", "slpsdk-installpath")); - - return oldRegistryInfo; - } - - /** - * Get target directory of old tizen sdk. - * @return - */ - public String getOldTargetPath() { - if (mCurrentRegistry == null) { - return ""; - } else {}//old IM is exists in local - - return mCurrentRegistry.mTargetPath; - } - - /** - * Check the old tizen sdk, exist or not. - * @return true if exist old tizen sdk. - */ - public boolean exists() { - if (mCurrentRegistry == null) { - return false; - } else { - return true; - } - } - - private RegistryInfo getCurrentRegistry() { - for (RegistryInfo info : oldRegistryInfo) { - String targetPath = null; - if (info.mRegistryPath == null || info.mRegistryPath.isEmpty()) { - targetPath = getTargetPathFromWindowsRegistry(info); - - if (targetPath == null) { - continue; - } - } else { - File oldFile = new File(info.mRegistryPath); - if (oldFile.exists()) { - targetPath = getTargetPathFromFile(info); - } else { - continue; - } - } - - File targetDirFile = new File(targetPath); - if (!targetDirFile.exists()) { - Log.log(info.mRegistryPath + " file exists, but " + targetPath + " path doesn't."); - return info; - } else { - info.setTargetPath(targetPath); - return info; - } - } - - return null; - } - - private String getTargetPathFromWindowsRegistry(RegistryInfo info) { - if (Platform.CURRENT_PLATFORM != Platform.WINDOWS_32) { - return null; - } - - String targetPath = Preferences.userRoot().get(info.mPathKey, null); - if (targetPath == null) { - return null; - } else { - return targetPath; - } - } - - private String getTargetPathFromFile(RegistryInfo info) { - String targetPath = getPathFromRegistryKey(info.mRegistryPath, info.mPathKey); - - return targetPath; - } - - private String getPathFromRegistryKey(String path, String registryKey) { - File file = new File(path); - - if (!file.exists() || !file.isFile()) { - return ""; - } - - FileInputStream fis = null; - InputStreamReader isr = null; - BufferedReader br = null; - - String readLine; - String result = ""; - try { - fis = new FileInputStream(file); - isr = new InputStreamReader(fis); - br = new BufferedReader(isr); - - while ((readLine = br.readLine()) != null) { - if (readLine.startsWith(registryKey)) { - int startChar = readLine.indexOf("="); - if(startChar == -1) { - Log.err("OldRegistry.getPathFromRegistryKey() Invalid registry file => " + path + ", " + registryKey); - throw new IMFatalException("Invalid registry file"); - } - result = readLine.substring(startChar+1); - } - } - - return result; - } catch (IOException ioe) { - Log.err("OldRegistry.getPathFromRegistryKey() Cannot read install path from .tizensdk file => " + path + ", " + registryKey); - throw new IMFatalException("Cannot read install path from .tizensdk file"); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - if (isr != null) { - try { - isr.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - } - } - - /** - * Remove old tizen sdk. - */ - public void remove() { - Log.log("Remove Old SDK start"); - if(Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - - try { - File script = PathUtil.getTempFileFromResource("/res/desktop_directory/removeOldSDK.sh", "removeOldSDK", ".sh"); - script.setExecutable(true); - Map env = new HashMap(); - env.put("INSTALLED_PATH", getOldTargetPath()); - try { - ShellUtil.execute(script.getAbsolutePath(), env, null, new LoggerShellParser()); - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.CANNOT_REMOVE_OLDSDK); - } - } catch (IOException e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.CANNOT_REMOVE_OLDSDK); - } - } else if(Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - WindowsRegistry.removeRegistry("slpsdk-installpath"); - WindowsRegistry.removeRegistry("tizensdk-installpath"); - - try { - File script = PathUtil.getTempFileFromResource("/res/desktop_directory/removeOldSDK.vbs", "removeOldSDK", ".vbs"); - script.setExecutable(true); - Map env = new HashMap(); - env.put("INSTALLED_PATH", getOldTargetPath()); - try { - String command = ShellUtil.addInterpreter(script.getAbsolutePath()); - ShellUtil.execute(command, env, null, new LoggerShellParser()); - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.CANNOT_REMOVE_OLDSDK); - } - } catch (IOException e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.CANNOT_REMOVE_OLDSDK); - } - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - Log.log("Remove Old SDK finish"); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/Platform.java b/SdkImageCreator/src/org/tizen/installmanager/lib/Platform.java deleted file mode 100644 index 8fc88df..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/Platform.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.lib; - -import org.tizen.installmanager.util.PathUtil; - -/** - * Check the platform. - * - * @author Shihyun Kim - * - */ -public class Platform { - - // Code for each OS and bits - public static final int UNKNOWN = 0; - public static final int LINUX_32 = 1; // for normal Linux - public static final int LINUX_64 = 1 << 2; - public static final int WINDOWS_32 = 1 << 3; // for MS Windows - public static final int WINDOWS_64 = 1 << 4; - public static final int MACOS_32 = 1 << 5; // for Apple MacOS - public static final int MACOS_64 = 1 << 6; - public static final int UBUNTU_32 = 1 << 7; // for Ubuntu Linux - public static final int UBUNTU_64 = 1 << 8; - - // Code for generic OS - public static final int GENERIC_LINUX = LINUX_32 | LINUX_64 | UBUNTU_32 | UBUNTU_64; - public static final int GENERIC_WINDOWS = WINDOWS_32 | WINDOWS_64; - public static final int GENERIC_MACOS = MACOS_32 | MACOS_64; - public static final int GENERIC_UBUNTU = UBUNTU_32 | UBUNTU_64; - - - public static final int CURRENT_PLATFORM = getCurrentPlatform(); - public static final String CURRENT_CHARSET = getCurrentCharset(); - - //data model - public static final String DATA_MODEL_32 = "32"; - public static final String DATA_MODEL_64 = "64"; - /** - * Get current platform. UNKOWN = 0, LINUX = 1, WINDOWS = 2, MAC_OS = 3 - * TODO must check ubuntu or fedora. - * - * @return - */ - private static int getCurrentPlatform() { - String os = System.getProperty("os.name"); - String dataModel = System.getProperty("sun.arch.data.model"); - - if (os.startsWith("Linux")) { - if (dataModel.equals(DATA_MODEL_32)) { - return LINUX_32; - } else if (dataModel.equals(DATA_MODEL_64)) { - return LINUX_64; - } - } else if (os.startsWith("Windows")) { - if (dataModel.equals(DATA_MODEL_32)) { - return WINDOWS_32; - } else if (dataModel.equals(DATA_MODEL_64)) { - return WINDOWS_64; - } - } else if (os.startsWith("Mac OS")) { - return MACOS_64; - } - - throw new RuntimeException("unknown Platform - " + os); - } - - private static String getCurrentCharset() { - return System.getProperty("sun.jnu.encoding"); - } - - /** - * @return platform information - */ - public static String getPlatformInfo() { - String info = ""; - info = info + "OS Name: " + System.getProperty("os.name") + "\n"; - info = info + "OS Version: " + System.getProperty("os.version") + "\n"; - info = info + "Data Model: " + System.getProperty("sun.arch.data.model") + "\n"; - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32) { - String filePath = "/etc/lsb-release"; - info = info + PathUtil.readAllTextFromFile(filePath) + "\n"; - } - info = info + "java : " + System.getProperty("java.runtime.name") - + "\n"; - info = info + "vm version : " + System.getProperty("java.vm.version") - + "\n"; - - return info; - } - - - /** - * Check whether current platform is linux. - * @return If current platform is linux, return true. If not, return false - */ - public static boolean isLinux() - { - return ( CURRENT_PLATFORM & GENERIC_LINUX ) > 0; - } - - /** - * Check whether current platform is Ubuntu, but not implemented yet. - * TODO must implement soon. - * @return If current platform is Ubunut, return true. If not, return false - */ - public static boolean isUbuntu() - { - return isLinux(); - } - - - /** - * Check whether current platform is MacOS. - * @return If current platform is MacOS, return true. If not, return false - */ - public static boolean isMacOS() - { - return ( CURRENT_PLATFORM & GENERIC_MACOS ) > 0; - } - - - /** - * Check whether current platform is linux. - * @return If current platform is MacOS, return true. If not, return false - */ - public static boolean isWindows() - { - return ( CURRENT_PLATFORM & GENERIC_WINDOWS ) > 0; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/ProgramController.java b/SdkImageCreator/src/org/tizen/installmanager/lib/ProgramController.java deleted file mode 100644 index d115e15..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/ProgramController.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.lib; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.linux.LinuxProgramController; -import org.tizen.installmanager.lib.mac.MacProgramController; -import org.tizen.installmanager.lib.win.WindowsProgramController; - -/** - * Manages process. - * - * @author Shihyun Kim - * - */ -abstract public class ProgramController { - - private static LinuxProgramController linuxController = new LinuxProgramController(); - private static WindowsProgramController windowsController = new WindowsProgramController(); - private static MacProgramController macController = new MacProgramController(); - - /** - * Terminates running SDK processes - */ - abstract public void terminateRunningProgram(); - - /** - * @return list of pid strings. - */ - abstract public List getSDKPidList(); - - /** - * Checks if SDK processes are running - * - * @return true if at least one SDK process is running - */ - abstract public boolean runningProgramExists(); - - /** - * Removes unpack directory - * - * @return true if success - */ - abstract public boolean removeSDKTempDir(); - - /** - * Get instance in accordance with platform - * - * @return - */ - public static ProgramController createProgramController() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - if (linuxController == null) { - linuxController = new LinuxProgramController(); - } - return linuxController; - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - if (windowsController == null) { - windowsController = new WindowsProgramController(); - } - return windowsController; - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - if (macController == null) { - macController = new MacProgramController(); - } - return macController; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - /** - * set environment variable. - * - * @param environmentSet - * save key and value to environmentSet. - * @param key - * @param value - * @return environmentSet. - */ - public static Map setEnvironmentVariable( - Map environmentSet, String key, String value) { - if (environmentSet == null) { - environmentSet = new HashMap(); - } else { - } - - environmentSet.put(key, value); - return environmentSet; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/Registry.java b/SdkImageCreator/src/org/tizen/installmanager/lib/Registry.java deleted file mode 100644 index c9f1902..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/Registry.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.lib; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.util.PathUtil; - -/** - * Manages target path to the registry file. - * - * @author Shihyun Kim - * - */ -public class Registry { - //installed path. - private static final String REGISTRY_FILE_NAME = "tizensdkpath"; - private static final String REGISTRY_FILE_PATH = PathUtil.get( - Config.CONFIG_HOME, REGISTRY_FILE_NAME); - private static final String INSTALLED_PATH_KEY = "TIZEN_SDK_INSTALLED_PATH"; - - //installed version - private static final String INSTALLED_VERSION_FILE_NAME = "version"; - private static final String INSTALLED_VERSION_FILE_PATH = PathUtil.get( - Config.CONFIG_HOME, INSTALLED_VERSION_FILE_NAME); - private static final String INSTALLED_VERSION_KEY = "INSTALLED_VERSION"; - - //registry information seperator - private static final String REGISTRY_SEPERATOR = "="; - - /** - * Exports target path to the registry file. - * - * @param targetPath - */ - public static void exportInstallPath(String targetPath) { - if (targetPath == null || targetPath.isEmpty()) { - Log.err("Install path is invalid: " + targetPath - + ". This might be a bug of IM"); - throw new IMFatalException(ErrorCode.INVALID_INSTALL_PATH); - } - - String parameter = INSTALLED_PATH_KEY + REGISTRY_SEPERATOR + targetPath; - - File installedPathFile = null; - try { - installedPathFile = PathUtil.makeNewFile(REGISTRY_FILE_PATH); - } catch (IOException e) { - Log.ExceptionLog(e); - return; - } - - if (installedPathFile == null) { - return; - } - - BufferedWriter bw = null; - try { - FileWriter fw = new FileWriter(installedPathFile); - bw = new BufferedWriter(fw); - bw.write(parameter); - bw.flush(); - - } catch (Exception e) { - Log.err("Cannot register to file. " + installedPathFile.getAbsolutePath()); - throw new IMFatalException(ErrorCode.CANNOT_REGISTER_TARGET_DIR); - - } finally { - if (bw != null) { - try { - bw.close(); - - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - } - } - - /** - * @return path in which SDK is installed. empty string if not found. - */ - public static String getInstalledPath() { - return getPathFromRegistryKey(REGISTRY_FILE_PATH, INSTALLED_PATH_KEY); - } - - private static String getPathFromRegistryKey(String path, String registryKey) { - File file = new File(path); - - if (!file.exists()) { - return ""; - } - - FileInputStream fis = null; - InputStreamReader isr = null; - BufferedReader br = null; - - String readLine; - String result = ""; - try { - fis = new FileInputStream(file); - isr = new InputStreamReader(fis); - br = new BufferedReader(isr); - - while ((readLine = br.readLine()) != null) { - if (readLine.startsWith(registryKey)) { - int startChar = readLine.indexOf("="); - if (startChar == -1) { - Log.err("OldRegistry.getPathFromRegistryKey() Invalid registry file => " - + path + ", " + registryKey); - throw new IMFatalException("Invalid registry file"); - } - result = readLine.substring(startChar + 1); - } - } - - return result; - } catch (IOException ioe) { - Log.err("OldRegistry.getPathFromRegistryKey() Cannot read install path from .tizensdk file => " - + path + ", " + registryKey); - throw new IMFatalException( - "Cannot read install path from .tizensdk file"); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - if (isr != null) { - try { - isr.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - if (fis != null) { - try { - fis.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - } - } - - /** - * remove target path in the registry file. - */ - public static void removeRegistry() { - File file = new File(REGISTRY_FILE_PATH); - - if (file.exists()) { - file.delete(); - } - - removeOldFiles(); - } - - /** - * Save installed version. - */ - public static void saveInstallVersion(String version) { - File versionFile = null; - try { - versionFile = PathUtil.makeNewFile(INSTALLED_VERSION_FILE_PATH); - } catch (IOException e) { - Log.ExceptionLog(e); - return; - } - - if (versionFile == null) { - return; - } - - - BufferedWriter bw = null; - try { - FileWriter fw = new FileWriter(versionFile); - bw = new BufferedWriter(fw); - - String versionInformation = INSTALLED_VERSION_KEY + REGISTRY_SEPERATOR + version; - bw.write(versionInformation); - bw.flush(); - - } catch (Exception e) { - Log.ExceptionLog(e); - throw new IMFatalException(ErrorCode.CANNOT_REGISTER_TARGET_DIR); - - } finally { - if (bw != null) { - try { - bw.close(); - - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - } - } - - /** - * Get installed version. - * @return - */ - public static String getInstalledVersion() { - return getPathFromRegistryKey(INSTALLED_VERSION_FILE_PATH, INSTALLED_VERSION_KEY); - } - - public static boolean isInstallManagerInstalled() { - String installedPath = getInstalledPath(); - - if (installedPath == null || installedPath.isEmpty()) { - return false; - } else { - return true; - } - } - - /** - * Temporary code to update. - */ - private static void removeOldFiles() { - File file = new File(Config.OLD_CONFIG_HOME); - - if (file.exists()) { - PathUtil.remove(file); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/SDKPackageFormat.java b/SdkImageCreator/src/org/tizen/installmanager/lib/SDKPackageFormat.java deleted file mode 100644 index e24abbd..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/SDKPackageFormat.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.lib; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.linux.LinuxSDKPackageFormat; -import org.tizen.installmanager.lib.win.WindowsSDKPackageFormat; -import org.tizen.installmanager.util.PathUtil; - -/** - * Manages to unpack package of tizen sdk. - * - * @author Shihyun Kim - * - */ -public abstract class SDKPackageFormat { - protected FileOutputStream mFileOutput = null; - protected final String SDK_PACKAGE_ZIP_EXTENTION = ".zip"; - protected final String SDK_PACKAGE_TAR_GZ_EXTENTION = ".gz"; - - public enum PackageType { - ELSE, ZIP, TAR_GZ - }; - - protected final static int ERROR = -1; - protected final static int SUCCESS = 1; - - // abstract method - /** - * Unzip package. - * - * @param fileFullPath - * Absolute path of package file. - * @param targetDir - * @param monitor - * @return - */ - protected abstract long unZip(File fileFullPath, File targetDir, - IIMProgressMonitor monitor); - - /** - * unzip SDK package to target directory - * - * @param fileFullPath - * @param targetDir - * @param monitor - * @return - */ - public long unZip(String fileFullPath, String targetDir, - IIMProgressMonitor monitor) { - return unZip(new File(fileFullPath), new File(targetDir), monitor); - } - - /** - * get package extension type - * - * @param fileFullPath - * @return package extension - */ - public PackageType getPackageType(String fileFullPath) { - String extention = PathUtil.getFileExtension(fileFullPath); - - if (extention.equals(SDK_PACKAGE_ZIP_EXTENTION)) { - return PackageType.ZIP; - } else if (extention.equals(SDK_PACKAGE_TAR_GZ_EXTENTION)) { - return PackageType.TAR_GZ; - } else { - return PackageType.ELSE; - } - } - - /** - * set FileOutput instance It will be used to save installing file list. - * - * @param installedListFilePath - * file path that save installing file list. - */ - public void setFileOutput(String installedListFilePath) { - setFileOutput(new File(installedListFilePath)); - } - - /** - * set FileOutput instance It will be used to save installing file list. - * - * @param installedListFilePath - * file path that save installing file list. - */ - public void setFileOutput(File installedListFile) { - if (installedListFile == null) { - return; - } - - if (installedListFile.exists()) { - installedListFile.delete(); - } - - File installedListDir = installedListFile.getParentFile(); - if (!installedListDir.exists()) { - installedListDir.mkdirs(); - } - - try { - installedListFile.createNewFile(); - } catch (IOException e) { - throw new IMFatalException(ErrorCode.CANNOT_CREATE_INSTALL_LIST); - } - - try { - mFileOutput = new FileOutputStream(installedListFile); - } catch (FileNotFoundException e) { - throw new IMFatalException(ErrorCode.CANNOT_CREATE_INSTALL_LIST); - } - } - - /** - * Close FileOutput instance. - */ - public void closeFileOutput() { - if (mFileOutput != null) { - try { - mFileOutput.close(); - } catch (IOException e) { - Log.err("SDKPackageFormat fail to close output stream."); - } - mFileOutput = null; - } - } - - /** - * Get SDKPackageFormat instance. - * - * @return - */ - public static SDKPackageFormat createSDKPackageFormat() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - return new LinuxSDKPackageFormat(); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return new WindowsSDKPackageFormat(); - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - return new LinuxSDKPackageFormat(); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/ShellParser.java b/SdkImageCreator/src/org/tizen/installmanager/lib/ShellParser.java deleted file mode 100644 index 8eade4e..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/ShellParser.java +++ /dev/null @@ -1,165 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - - -/** - * Parsing standard out message and standard error message. - * @author Shihyun Kim - * - */ -public class ShellParser { - - protected StringBuilder mInputMessage = new StringBuilder(); - protected StringBuilder mErrorMessage = new StringBuilder(); - - private boolean mIsJoinable = true; - - public ShellParser() { - - } - - /** - * @param isJoinable If you set true, shell parsing with synchronization. - */ - public ShellParser(boolean isJoinable) { - mIsJoinable = isJoinable; - } - - - /** - * Parsing standard out and error. - * @param process running process - */ - public void runParsing(final Process process) { - - if (process == null) { - return; - } - - Thread inputThread = new Thread(){ - public void run() { - parseStdOut(process.getInputStream()); - } - }; - inputThread.start(); - - Thread errorThread = new Thread() { - public void run() { - parseStdErr(process.getErrorStream()); - } - }; - errorThread.start(); - - try { - if (mIsJoinable) { - inputThread.join(); - errorThread.join(); - } - } catch (InterruptedException e) { - Log.ExceptionLog(e); - } - - } - - /** - * If you want to parse standard out stream, you must override this method - * @param input standard out stream - */ - protected void parseStdOut(InputStream input) { - BufferedReader br = null; - try { - InputStreamReader isr = new InputStreamReader(input, Platform.CURRENT_CHARSET); - br = new BufferedReader(isr); - - String line; - while ( (line = br.readLine()) != null) { - mInputMessage.append(line.trim() + "\n"); - } - } catch (IOException ioe) { - Log.err("Shellparser fail to parse input stream."); - }finally{ - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.err("ShellParser fail to close output stream."); - } - } - } - } - - /** - * If you want to parse standard error stream, you must override this method - * @param input standard error stream - */ - protected void parseStdErr(InputStream input) { - BufferedReader br = null; - try { - InputStreamReader isr = new InputStreamReader(input, Platform.CURRENT_CHARSET); - br = new BufferedReader(isr); - - String line; - while ( (line = br.readLine()) != null) { - mErrorMessage.append(line.trim() + "\n"); - } - } catch (IOException ioe) { - Log.ExceptionLog(ioe); - }finally{ - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.err("ShellParser fail to close output stream."); - } - } - } - } - - /** - * Get standard out output - * @return stdout message. - */ - public String getStdout() { - return mInputMessage.toString(); - } - - /** - * Get standard error output - * @return stderr message. - */ - public String getStdErr() { - return mErrorMessage.toString(); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/StartMenu.java b/SdkImageCreator/src/org/tizen/installmanager/lib/StartMenu.java deleted file mode 100644 index 694ff30..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/StartMenu.java +++ /dev/null @@ -1,115 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib; - -import java.io.File; -import java.io.IOException; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.util.PathUtil; - - -/** - * This class manages program menu and shortcuts - * - * @author Shihyun Kim - */ -public class StartMenu { - - //linux shortcut - private static final String MENU_ICON = getMenuIcon(); - private static final String INSTALLMANAGER_ICON = getInstallManagerIcon(); - private static final String MENU_ICON_RESOURSE_PATH = "/res/desktop_directory/"+MENU_ICON; - private static final String INSTALLMANAGER_ICON_RESOURCE_PATH = "/res/desktop_directory/"+INSTALLMANAGER_ICON; - - private static String getMenuIcon() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - return "tizen-sdk-menu.png"; - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return "tizen-sdk-menu.ico"; - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64){ - return ""; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - private static String getInstallManagerIcon() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - return "tizen-sdk-installmanager.png"; - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return "tizen-sdk-installmanager.ico"; - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - return ""; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - /** - * Copy menu icon to target directory from resource. - */ - public static void createDesktopIcon() { - Log.log("StartMenu.makeMenuIcon()"); - - String iconPath = PathUtil.getFromInstalledPath(Config.INSTALL_MANAGER_DIRECTORY, StartMenu.MENU_ICON); - File targetIcon = new File(iconPath); - - try { - PathUtil.copyFileFromResource(MENU_ICON_RESOURSE_PATH, targetIcon); - } catch (IOException e1) { - Log.err("Cannot read resource '" + MENU_ICON_RESOURSE_PATH + "'"); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_RESOURCE); - } - } - - /** - * Copy installmanager icon to target directory from resource. - */ - public static void createInstallManagerIcon() { - Log.log("StartMenu.createProgramShortCutIconLinux()"); - - String iconPath = PathUtil.getFromInstalledPath(Config.INSTALL_MANAGER_DIRECTORY, StartMenu.INSTALLMANAGER_ICON); - File targetIcon = new File(iconPath); - - try { - PathUtil.copyFileFromResource(INSTALLMANAGER_ICON_RESOURCE_PATH , targetIcon); - } catch (IOException e) { - Log.err("Create shortcut icon is failed."); - Log.ExceptionLog(e); - } - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxFileSystemInfo.java b/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxFileSystemInfo.java deleted file mode 100644 index 440c04c..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxFileSystemInfo.java +++ /dev/null @@ -1,123 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.linux; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - -import org.tizen.installmanager.lib.IFileSystemInformation; -import org.tizen.installmanager.lib.Log; - - -/** - * Provide information of linux file system. - * - * @author Taeyoung Son - * - */ -public class LinuxFileSystemInfo implements IFileSystemInformation { - - @Override - public List getListMounts() { - List mountList = new ArrayList(); - BufferedReader reader = null; - InputStreamReader ipStream = null; - - try - { - Process p=Runtime.getRuntime().exec("df -k"); - p.waitFor(); - ipStream = new InputStreamReader(p.getInputStream()); - reader = new BufferedReader(ipStream); - - String line = reader.readLine(); - String partition = ""; - List deviceInfo= new ArrayList(); - while(line!=null) - { - partition=""; - StringTokenizer tokens = new StringTokenizer(line, " "); - int deviceNameColumn = tokens.countTokens(); - while(tokens.hasMoreTokens()){ - deviceInfo.add(tokens.nextToken()); - } - for (int i=5; i < deviceNameColumn;i++) { - partition += deviceInfo.get(i); - if(i!=(deviceNameColumn-1)) - partition +=" "; - } - mountList.add(new File(partition)); - deviceInfo.clear(); - line=reader.readLine(); - } - mountList.remove(0); - - } catch(IOException e1) { - Log.ExceptionLog(e1); - } catch(InterruptedException e2) { - Log.ExceptionLog(e2); - } finally { - if (ipStream != null) { - try { - ipStream.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - } - - return mountList; - } - - @Override - public File[] getListDevices() { - // TODO Auto-generated method stub - return null; - } - - @Override - public FileSystemType getFileSystemType(File disk) { - // TODO Auto-generated method stub - return FileSystemType.UNKNOWN; - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxProgramController.java b/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxProgramController.java deleted file mode 100644 index 85a7cba..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxProgramController.java +++ /dev/null @@ -1,192 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.linux; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ProgramController; -import org.tizen.installmanager.lib.Registry; -import org.tizen.installmanager.lib.ShellParser; -import org.tizen.installmanager.util.IMShellCommandFail; -import org.tizen.installmanager.util.PathUtil; -import org.tizen.installmanager.util.ShellUtil; - - -/** - * Manages linux process. - * - * @author Shihyun Kim - * - */ -public class LinuxProgramController extends ProgramController{ - - public void terminateRunningProgram() { - List list = getSDKPidList(); - - if(list==null) { - return; - } - - for(int pid : list) { - String[] command = {"/bin/sh", "-c", "kill -9 " + pid}; - try { - ShellUtil.execute(command); - } catch (IMShellCommandFail e) { - Log.err("Failed to kill "+pid); - // ignore kill failure - } - } - } - - /** - * Check process whether or not pid is tizen sdk process. - * @param pid process id - * @return - */ - private boolean isSDKProcess(int pid) { - Log.log("Check running process for sdk."); - if (checkCommandLine(pid) || checkExecutePath(pid)) { - return true; - } else { - return false; - } - } - - private boolean checkCommandLine(int pid) { - String pidCmd = "cat -A /proc/" + pid + "/cmdline"; - - ShellParser parser = new ShellParser(); - try { - ShellUtil.execute(pidCmd, parser); - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - // ignore - return false; - } - - String output = parser.getStdout(); - - return isProcessRunningInInstalledPath(output); - } - - private boolean checkExecutePath(int pid) { - String pidCmd = "readlink -m /proc/" + pid + "/exe"; - - ShellParser parser = new ShellParser(); - try { - ShellUtil.execute(pidCmd, parser); - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - // ignore - return false; - } - - String output = parser.getStdout(); - return isProcessRunningInInstalledPath(output); - } - - public List getSDKPidList() { - if (Registry.getInstalledPath().isEmpty()) { - return null; - } - List listSDKPIDs = new ArrayList(); - - String[] command = {"/bin/sh", "-c", "ps -ax"}; - LinuxShellRunningProgramParser parser = new LinuxShellRunningProgramParser(); - try { - ShellUtil.execute(command, parser); - } catch (IMShellCommandFail e1) { - Log.log("Failed to get SDK pid's"); - return null; // ignore - } - - List pidList = parser.getPIDList(); - - for (int pid : pidList) { - if(isSDKProcess(pid)) { - listSDKPIDs.add(pid); - } - } - - return listSDKPIDs; - } - - private boolean isProcessRunningInInstalledPath(String output) { - if (output.toString().indexOf(Registry.getInstalledPath()) >= 0) { - if (!isInstallManager(output)) { - Log.log("readlink exe for process => " + output); - return true; - } - } - - return false; - } - - /** - * @param path - * @return true if the path includes the install manager filename - */ - private boolean isInstallManager(String path) { - String fileName = PathUtil.getFileName(path); - - if (fileName.startsWith(Config.INSTALL_MANAGER_FILE_NAME) - || fileName.equalsIgnoreCase(Config.INSTALL_MANAGER_BINARY)) { - return true; - } else { - return false; - } - } - - public boolean runningProgramExists() { - List pidList = getSDKPidList(); - - if (pidList == null || pidList.size() <= 0) { - return false; - } - - return true; - } - - public boolean removeSDKTempDir() { - Log.log("LinuxProgramController.removeSDKTempdir() start"); - File tempDirFile = new File(PathUtil.getFromTempDir(Config.SDK_TEMP_DIR)); - - if (tempDirFile.exists()) { - PathUtil.remove(tempDirFile); - } else { - Log.log("SDK temp directory doesn't exist => " + tempDirFile.getAbsolutePath()); - } - - return true; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxSDKPackageFormat.java b/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxSDKPackageFormat.java deleted file mode 100644 index 364225c..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxSDKPackageFormat.java +++ /dev/null @@ -1,189 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.linux; - -import java.io.File; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.SDKPackageFormat; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.util.IMShellCommandFail; -import org.tizen.installmanager.util.PathUtil; -import org.tizen.installmanager.util.ShellUtil; - - -/** - * Manages to unpack package of tizen sdk for linux. - * @author Shihyun Kim - * - */ -public class LinuxSDKPackageFormat extends SDKPackageFormat{ - private PackageType checkExtension; - - @Override - public long unZip(File fileFullPath, File targetDir, IIMProgressMonitor monitor) { - Log.log("Unpack "+fileFullPath+" to "+targetDir); - - checkExtension = getPackageType(fileFullPath.getAbsolutePath()); - - if (!fileFullPath.exists()) { - Log.err("Package file is not exsisting"); - return ERROR; - } else if (checkExtension == PackageType.ELSE) { - Log.err("Package extension is not '.zip' or '.tar.gz'"); - return ERROR; - } - - if (targetDir == null || !targetDir.isAbsolute()) { - return ERROR; - } - - if (!targetDir.exists()) { - targetDir.mkdirs(); - } - - int exitValue; - - try { - if (checkExtension == PackageType.ZIP) { - exitValue = sendCommand( "unzip -ao "+ fileFullPath.getAbsolutePath() + " -d " + targetDir.getAbsolutePath(), - fileFullPath.getAbsolutePath(), PackageType.ZIP, monitor); - unzipReturnValue(exitValue); - } else if (checkExtension == PackageType.TAR_GZ) { - exitValue = sendCommand( "tar xvf "+ fileFullPath.getAbsolutePath() + " -C " + targetDir.getAbsolutePath(), - fileFullPath.getAbsolutePath(), PackageType.TAR_GZ, monitor); - tarReturnValue(exitValue); - } else { - throw new IMFatalException(ErrorCode.UNKNOWN_PACKAGE_EXTENSION); - } - } catch (IMShellCommandFail e) { - return ERROR; - } - - return SUCCESS; - } - - private int sendCommand(String command, String path, PackageType type, IIMProgressMonitor monitor) throws IMShellCommandFail { - LinuxShellInstalledListParser parser = null; - String fileName = PathUtil.getFileName(path); - - if (mFileOutput != null) { - parser = new LinuxShellInstalledListParser(fileName, type); - parser.setFileOutputStream(mFileOutput); - parser.setProgress(monitor); - } - - int exitValue = ShellUtil.execute(command, null, null, parser); - return exitValue; - } - - /** - * extract tar error case. - * @param exitValue - * @return - * @throws IMShellCommandFail - */ - private static boolean tarReturnValue(int exitValue) throws IMShellCommandFail { - if (exitValue == 0) { - return true; - } else { - throw new IMShellCommandFail(); - } - } - - /** - * extract zip error case. - * @param exitValue - * @return - * @throws IMShellCommandFail - */ - private static boolean unzipReturnValue(int exitValue) throws IMShellCommandFail { - switch(exitValue) { - case 0: - return true; - case 1: - Log.err("one or more warning errors were encountered, but processing completed successfully anyway." + - "This includes zipfiles where one or more files was skipped due to unsupported compression " + - "method or encryption with an unknown password."); - throw new IMShellCommandFail(); - case 2: - Log.err("a generic error in the zipfile format was detected. Processing may have completed" + - "successfully anyway; some broken zipfiles created by other archivers have simple work-arounds."); - throw new IMShellCommandFail(); - case 3: - Log.err("a severe error in the zipfile format was detected. Processing probably failed immediately."); - throw new IMShellCommandFail(); - case 4: - Log.err("unzip was unable to allocate memory for one or more buffers during program initialization."); - throw new IMShellCommandFail(); - case 5: - Log.err("unzip was unable to allocate memory or unable to obtain a tty to read the decryption password(s)."); - throw new IMShellCommandFail(); - case 6: - Log.err("unzip was unable to allocate memory during decompression to disk."); - throw new IMShellCommandFail(); - case 7: - Log.err("unzip was unable to allocate memory during in-memory decompression."); - throw new IMShellCommandFail(); - case 8: - Log.err("[currently not used]"); - throw new IMShellCommandFail(); - case 9: - Log.err("the specified zipfiles were not found."); - throw new IMShellCommandFail(); - case 10: - Log.err("invalid options were specified on the command line."); - throw new IMShellCommandFail(); - case 11: - Log.err("no matching files were found."); - throw new IMShellCommandFail(); - case 50: - Log.err("the disk is (or was) full during extraction."); - throw new IMShellCommandFail(); - case 51: - Log.err("the end of the ZIP archive was encountered prematurely."); - throw new IMShellCommandFail(); - case 80: - Log.err("the user aborted unzip prematurely with control-C (or similar)"); - throw new IMShellCommandFail(); - case 81: - Log.err("testing or extraction of one or more files failed due to unsupported compression methods or unsupported decryption."); - throw new IMShellCommandFail(); - case 82: - Log.err("no files were found due to bad decryption password(s). (If even one file is successfully" + - "processed, however, the exit status is 1.)"); - throw new IMShellCommandFail(); - default: - Log.err("Unknown exit value"); - throw new IMFatalException("Unknown exit value after unzip"); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellInstalledListParser.java b/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellInstalledListParser.java deleted file mode 100644 index bb436ca..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellInstalledListParser.java +++ /dev/null @@ -1,282 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.linux; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.ShellParser; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.SDKPackageFormat.PackageType; -import org.tizen.installmanager.util.PathUtil; - - -/** - * Parsing standard out message and save installed file list. - * @author Shihyun Kim - * - */ -public class LinuxShellInstalledListParser extends ShellParser { - - - IIMProgressMonitor mMonitor = null; - FileOutputStream mFileOut = null; - - final String FILE_PATH_SEPARATOR = ":"; - private String fileName; - private PackageType extension; - - LinuxShellInstalledListParser(String name, PackageType type) { - fileName = name; - extension = type; - } - - @Override - public void parseStdOut(InputStream input) { - // TODO Auto-generated method stub - - BufferedReader br = null; - try { - InputStreamReader isr = new InputStreamReader(input, Platform.CURRENT_CHARSET); - br = new BufferedReader(isr); - - setMonitorFile(); - - String line; - while ( (line = br.readLine()) != null) { - print(line); - } - - closeFileOutputStream(); - } catch (IOException ioe) { - Log.err("Cannot parse shell input stream."); - }finally{ - if (br != null) { - try { - br.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - Log.err("LinuxShellInstalledListParser fail to close fileoutput"); - } - } - } - } - - private void setMonitorFile() { - if (mMonitor != null) { - mMonitor.setFileName(fileName); - mMonitor.workedFileName(); - } - } - - private void print(String line) { - printToProgressBar(line); - printToFile(line); - } - - private void printToProgressBar(String line) { - if (mMonitor != null) { - String name = PathUtil.getFileName(line); - - mMonitor.setFileName(name); - mMonitor.workedFileName(); - } - } - - private void printToFile(String line) { - if (mFileOut == null) { - return; - } - - String filePath = ""; - if (extension == PackageType.ZIP) { - filePath = getFilePathFromValue(line); - } else if (extension == PackageType.TAR_GZ) { - filePath = PathUtil.getFromInstalledPath(Config.TEMP_DIRECTORY, line); - } - - try { - String dataDir = PathUtil.getFromInstalledPath(Config.TEMP_DIRECTORY, Config.DATA_DIRECTORY); - if (filePath.length() <= dataDir.length() || filePath.indexOf(dataDir) < 0) { - return; - } - - int index = dataDir.length() + 1; - - filePath = filePath.substring(index).trim(); - if (!filePath.equals("")) { - filePath = filePath + "\n"; - mFileOut.write(filePath.getBytes()); - } - } catch (IOException e) { - // TODO Auto-generated catch block - Log.err("File write failure(" + filePath + ")"); - Log.err(e.getMessage()); - throw new IMFatalException("File write failure(" + filePath + ")"); - } - } - - private String getFilePathFromValue(String line) { - String value = getValue(line); - - if (value.length() <= 0) { - return ""; - } - - String seperator = ""; - if (isCreatingFile(line)) { - return value.trim(); - } else if (isLinkingFile(line)) { - seperator = "->"; - } else { - seperator = "["; - } - - int index = value.lastIndexOf(seperator); - - if (index < 0) { - return value.trim(); - } - - return value.substring(0, index).trim(); - } - - private String getKey(String line) { - int index = line.indexOf(FILE_PATH_SEPARATOR); - - if (index < 0 ){ - return ""; - } - - return line.substring(0, index).trim(); - } - - private String getValue(String line) { - int index = line.indexOf(FILE_PATH_SEPARATOR); - - if (index < 0 ){ - return ""; - } - - return line.substring(index+1).trim(); - } - - /** - * set file output for saving installed list - * @param path - */ - public void setFileOutputStream(String path) { - setFileOutputStream(new File(path)); - } - - /** - * set file output for saving installed list - * @param filePath - */ - public void setFileOutputStream(File filePath) { - File parentFile = filePath.getParentFile(); - - if (!parentFile.exists()) { - parentFile.mkdirs(); - } - - if (filePath.exists()) { - filePath.delete(); - } - - - try { - filePath.createNewFile(); - } catch (IOException e) { - Log.err("Cannot create install list => " + filePath.getAbsolutePath()); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_INSTALL_LIST); - } - - try { - mFileOut = new FileOutputStream(filePath); - } catch (FileNotFoundException e) { - Log.err("Cannot create install list => " + filePath.getAbsolutePath()); - throw new IMFatalException(ErrorCode.CANNOT_CREATE_INSTALL_LIST); - } - } - - /** - * set file output for saving installed list - * @param fOut - */ - public void setFileOutputStream(FileOutputStream fOut) { - mFileOut = fOut; - } - - /** - * close FileOutput instance. - */ - public void closeFileOutputStream() { - if(mFileOut != null) { - try { - mFileOut.close(); - mFileOut = null; - } catch (IOException e) { - // TODO Auto-generated catch block - Log.err("LinuxShellInstalledListParser fail to close fileoutput."); - } - } - } - - /** - * If you set this, you can get file name to UI. - * @param monitor - */ - public void setProgress(IIMProgressMonitor monitor) { - mMonitor = monitor; - } - - private boolean isLinkingFile(String line) { - String key = getKey(line); - - return key.equals("linking"); - } - - private boolean isCreatingFile(String line) { - String key = getKey(line); - - return key.equals("creating"); - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellRunningProgramParser.java b/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellRunningProgramParser.java deleted file mode 100644 index 41486e4..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/linux/LinuxShellRunningProgramParser.java +++ /dev/null @@ -1,100 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.linux; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; - -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.ShellParser; - - -/** - * Parsing standard out message and get pid. - * @author Shihyun Kim - * - */ -public class LinuxShellRunningProgramParser extends ShellParser{ - - List mPIDList = new ArrayList(); - - @Override - public void parseStdOut(InputStream input) { - BufferedReader br = null; - try { - InputStreamReader isr = new InputStreamReader(input, Platform.CURRENT_CHARSET); - br = new BufferedReader(isr); - - String line; - while ( (line = br.readLine()) != null) { - try { - int pid = Integer.parseInt(getPID(line)); - mPIDList.add(pid); - } catch(NumberFormatException e) { - // ignore non-integer string - } - } - } catch (IOException ioe) { - Log.ExceptionLog(ioe); - }finally{ - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.err("LinuxShellRunningProgramParser fail to close output stream"); - } - } - } - } - - private String getPID(String line) { - String[] info = line.split(" "); - int index = 0; - - while (info[index].equals("")) { - ++index; - } - - return info[index]; - } - - /** - * Get pid list. - * @return - */ - public List getPIDList() { - return mPIDList; - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/mac/MacProgramController.java b/SdkImageCreator/src/org/tizen/installmanager/lib/mac/MacProgramController.java deleted file mode 100644 index 3152379..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/mac/MacProgramController.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.tizen.installmanager.lib.mac; - -import java.util.List; - -import org.tizen.installmanager.lib.ProgramController; - -public class MacProgramController extends ProgramController{ - - @Override - public void terminateRunningProgram() { - // TODO Auto-generated method stub - - } - - @Override - public List getSDKPidList() { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean runningProgramExists() { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean removeSDKTempDir() { - // TODO Auto-generated method stub - return false; - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsFileSystemInfo.java b/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsFileSystemInfo.java deleted file mode 100644 index 6ca72a4..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsFileSystemInfo.java +++ /dev/null @@ -1,72 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.win; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.tizen.installmanager.lib.IFileSystemInformation; - - -/** - * Provide information of windows file system. - * - * @author Taeyoung Son - * - */ -public class WindowsFileSystemInfo implements IFileSystemInformation { - - @Override - public List getListMounts() { - List mountList = new ArrayList(); - File[] roots = File.listRoots(); - if(roots==null) - return null; - - for(int i=0;i -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.win; - -import java.io.File; -import java.io.IOException; -import java.util.List; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ProgramController; -import org.tizen.installmanager.lib.ShellParser; -import org.tizen.installmanager.util.IMShellCommandFail; -import org.tizen.installmanager.util.PathUtil; -import org.tizen.installmanager.util.ShellUtil; - - -/** - * Manages windows process. - * - * @author Shihyun Kim - * - */ -public class WindowsProgramController extends ProgramController{ - - private final String VBSCRIPT_OF_CHECKING_RUNNING_PROGRAM = "/res/desktop_directory/checkRunningTaskList.vbs"; - private final String VBSCRIPT_NAME_OF_CHECKING_RUNNING_PROGRAM = "checkRunningTaskList"; - private final String VBSCRIPT_EXTENTION_OF_CHECKING_RUNNING_PROGRAM = ".vbs"; - - - @Override - public void terminateRunningProgram() { - List pidList = getSDKPidList(); - - for (Integer pid : pidList) { - String command = "TASKKILL /F /PID " + pid; - try { - ShellUtil.execute(command); - } catch (IMShellCommandFail e) { - Log.err("Failed to kill "+pid); - // ignore kill failure - } - } - - findAndKillEmulatorManagerProcess(); - findAndKillWebSimulator(); - } - - @Override - public List getSDKPidList() { - File script; - try { - script = PathUtil.getTempFileFromResource(VBSCRIPT_OF_CHECKING_RUNNING_PROGRAM - , VBSCRIPT_NAME_OF_CHECKING_RUNNING_PROGRAM - , VBSCRIPT_EXTENTION_OF_CHECKING_RUNNING_PROGRAM); - } catch (IOException e) { - Log.err("Failed to crate temp file from resource"); - Log.ExceptionLog(e); - return null; - } - - String command = "cscript " + script.getAbsolutePath(); - WindowsShellRunningProgramParser parser = new WindowsShellRunningProgramParser(); - - try { - ShellUtil.execute(command, null, null, parser); - } catch (IMShellCommandFail e) { - Log.err("Failed to get SDK pid's"); - Log.ExceptionLog(e); - return null; // ignore - } - - return parser.getSDKPid(); - } - - @Override - public boolean runningProgramExists() { - List pidList = getSDKPidList(); - - if (pidList.size() > 0) { - return true; - } else { - return false; - } - } - - @Override - public boolean removeSDKTempDir() { - Log.log("WindowsProgramController.removeSDKTempDir() start"); - - String tempDir = PathUtil.getFromTempDir(Config.SDK_TEMP_DIR); - return WindowsProgramController.removeRunningDir(tempDir); - } - - /** - * Remove running directory in Windows. - * This function execute remove script and remove script process wait for running process to finish. - * If you use System.exit(), All of process that created from your process are killed. - * So this function do not work at this point of time. - * @param targetDir directory to remove. - * @return trueif success - */ - public static boolean removeRunningDir(String targetDir) { -// Log.log("WindowsProgramController.removeRunningDir() start"); -// -// File targetFile = new File(targetDir); -// if (!targetFile.exists()) { -// Log.log("Target directory does not exist => " + targetDir); -// return true; -// } -// -// try { -// File removeScriptFile = PathUtil.getTempFileFromResource("/res/installmanager/removetizentemp.bat", "removetizentemp", ".bat", false); -// -// Map env = setRemoveDirEnvironment(targetDir, removeScriptFile.getAbsolutePath()); -// -// Process proc = ShellUtil.asyncExecute(removeScriptFile.getAbsolutePath() -// , env -// , new File(PathUtil.getTempDir()) -// , new ShellParser(false)); -// -// if (proc != null) { -// return true; -// } else { -// return false; -// } -// } catch (IOException e) { -// Log.err("removetizentemp.bat file doesn't exist"); -// return false; -// } - return true; - } - -// private static Map setRemoveDirEnvironment(String targetDir, String removeScript) { -// Map env = new HashMap(); -// -// setEnvironmentVariable(env, "TARGET_DIR", targetDir); -// setEnvironmentVariable(env, "REMOVE_SCRIPT_PATH", removeScript); -// -// return env; -// } - - private void findAndKillEmulatorManagerProcess() { - ShellParser parser = new ShellParser(); - try { - ShellUtil.execute("tasklist /FI \"WINDOWTITLE eq Emulator Manager\" /FO csv /NH", parser); - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - return; - } - - String pid = getPidFromOutput(parser.getStdout()); - - String command = "TASKKILL /F /PID " + pid; - try { - ShellUtil.execute(command); - } catch (IMShellCommandFail e) { - Log.err("Failed to kill "+pid); - // ignore kill failure - } - - } - - private void findAndKillWebSimulator() { - ShellParser parser = new ShellParser(); - try { - ShellUtil.execute("tasklist /FI \"WINDOWTITLE eq Web Simulator\" /FO csv /NH", parser); - } catch (IMShellCommandFail e) { - Log.ExceptionLog(e); - return; - } - - String pid = getPidFromOutput(parser.getStdout()); - - String command = "TASKKILL /F /PID " + pid; - try { - ShellUtil.execute(command); - } catch (IMShellCommandFail e) { - Log.err("Failed to kill "+pid); - // ignore kill failure - } - - } - - private String getPidFromOutput(String output) { - String[] info = output.split(","); - - if (info.length < 2) { - return ""; - } - - return info[1]; - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsRegistry.java b/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsRegistry.java deleted file mode 100644 index c3be06e..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsRegistry.java +++ /dev/null @@ -1,111 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.win; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.prefs.Preferences; - -import org.tizen.installmanager.lib.Platform; - - -/** - * Manage windows registry. - * @author Shihyun Kim - * - */ -public class WindowsRegistry { - - //Registry Key - public static final String REGISTRY_PATH_OF_SHELL_FOLDER = "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; - - //Shell Folder.name - public static final String REGISTRY_PROGRAMS_OF_SHELL_FOLDER = "Programs"; - public static final String REGISTRY_LOCAL_APP_DATA_OF_SHELL_FOLDER = "\"Local AppData\""; - - //User key - public static final String TARGET_DIRECTORY_KEY = "tizensdk-installpath"; - public static final String OLD_TARGET_DIRECTORY_KEY = "slpsdk-installpath"; - - //Value Column - private static final String REG_SZ = "REG_SZ"; - - /** - * Remove key and value in registry. - * @param key - */ - public static void removeRegistry(String key) { - Preferences.userRoot().remove(key); - } - - /** - * Get value from node and key in registry. - * @param node path of registry - * @param key key of node. - * @return - */ - public static String getRegistryValue(String node, String key) { - if (!Platform.isWindows()) { - return null; - } - BufferedReader br = null; - String value = ""; - - String query = "reg query " + "\"" + node + "\" /v " + key; - try { - Process process = Runtime.getRuntime().exec(query); - - String encoding = Platform.CURRENT_CHARSET; - br = new BufferedReader(new InputStreamReader(process.getInputStream(), encoding)); - - String line = null; - while((line = br.readLine()) != null) { - int index = line.indexOf(REG_SZ); - if (index >= 0) { - value = line.substring(index + REG_SZ.length()).trim(); - } - } - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - - return value; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsSDKPackageFormat.java b/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsSDKPackageFormat.java deleted file mode 100644 index a686291..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsSDKPackageFormat.java +++ /dev/null @@ -1,254 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.win; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.SDKPackageFormat; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.util.PathUtil; - - -/** - * Manages to unpack package of tizen sdk for windows. - * @author Shihyun Kim - * - */ -public class WindowsSDKPackageFormat extends SDKPackageFormat{ - - final static int BUF_SIZE = 65536; - - private final String DATA_DIRECTORY = "data/"; - - @Override - public long unZip(File fileFullPath, File targetDir, IIMProgressMonitor monitor) { - Log.log("Unzip "+fileFullPath+" to "+targetDir); - - PackageType checkExtension = getPackageType(fileFullPath.getAbsolutePath()); - - if (!fileFullPath.exists()) { - Log.err("Package file is not exsisting"); - return ERROR; - } else if (checkExtension != PackageType.ZIP) { - Log.err("Package extension is not '.zip'"); - return ERROR; - } - - if (targetDir == null || !targetDir.isAbsolute()) { - return ERROR; - } - - if (!targetDir.exists()) { - targetDir.mkdirs(); - } - - unZipPackage(fileFullPath, targetDir, monitor); - - closeFileOutput(); - return SUCCESS; - } - - private long unZipPackage(File fileFullPath, File targetDir, - IIMProgressMonitor monitor) { - ZipInputStream zipInStream = null; - FileOutputStream zipOutput = null; - ZipEntry zipEntry = null; - - try { - // mFileOutput = - // getFileListOutput(PathUtil.getFileNameWithOutExtension(fileFullPath)); - zipInStream = new ZipInputStream(new FileInputStream(fileFullPath)); - zipEntry = zipInStream.getNextEntry(); - - long totalUnZipSize = 0; - while (zipEntry != null) { - - if (monitor != null) { - String fileName = PathUtil.getFileName(zipEntry.getName()); - - monitor.setFileName(fileName); - monitor.workedFileName(); - } - - String targetPath = targetDir.getAbsolutePath() - + File.separator + zipEntry.getName(); - - // make directory - File targetFile = new File(targetPath); - if (targetFile.exists() && targetFile.isDirectory()) { - writeFileList(zipEntry.getName()); - zipEntry = zipInStream.getNextEntry(); - continue; - } - - File parentFile = targetFile.getParentFile(); - if (!parentFile.exists()) { - parentFile.mkdirs(); - } - - if (targetPath.endsWith("/")) {// zipEntry.isDirectory()) { - new File(targetPath).mkdir(); - zipInStream.closeEntry(); - writeFileList(zipEntry.getName()); - zipEntry = zipInStream.getNextEntry(); - continue; - } - - zipOutput = new FileOutputStream(targetPath); - - byte[] zipBuf = new byte[BUF_SIZE]; - int readByte = 0; - - while ((readByte = zipInStream.read(zipBuf)) >= 0) { - zipOutput.write(zipBuf, 0, readByte); - zipOutput.flush(); - totalUnZipSize += readByte; - } - - writeFileList(zipEntry.getName()); - - File outFile = new File(targetPath); - if (outFile.isFile() - && (PathUtil.getFileExtension(outFile.getName()) - .equals("") || PathUtil.getFileExtension( - outFile.getName()).equals("sh"))) { - outFile.setExecutable(true); - } - - if (zipOutput != null) { - zipOutput.close(); - } - - if (zipEntry != null) { - zipInStream.closeEntry(); - } - zipEntry = zipInStream.getNextEntry(); - } - - return totalUnZipSize; - - } catch (IOException e) { - if (zipEntry != null) { - Log.err("Fail to unpack" + zipEntry.getName()); - } - - throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE); - } catch (Throwable e) { - Log.ExceptionLog(e); - throw new IMFatalException(e.getMessage()); - } finally { - try { - if (zipOutput != null) { - zipOutput.close(); - } - } catch (IOException e) { - if (zipEntry != null) { - Log.err("Fail to close output stream : " - + zipEntry.getName()); - } else { - Log.ExceptionLog(e); - } - } - - try { - if (zipInStream != null) { - zipInStream.closeEntry(); - } - } catch (IOException e) { - if (zipEntry != null) { - Log.err("Fail to close output stream : " - + zipEntry.getName()); - } else { - Log.ExceptionLog(e); - } - } - - if (zipInStream != null) { - try { - zipInStream.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - try { - if (mFileOutput != null) { - mFileOutput.close(); - } - } catch (IOException e) { - if (zipEntry != null) { - Log.err("Fail to close output stream : " - + zipEntry.getName()); - } else { - Log.ExceptionLog(e); - } - } - - closeFileOutput(); - } - } - - private void writeFileList(String filePath) { - if (filePath == null || filePath.equals("")) { - return; - } - - filePath = removeDataDirectory(filePath); - if (filePath == null || filePath.equals("")) { - return; - } - try { - mFileOutput.write((filePath + "\n").getBytes()); - } catch (IOException e) { - Log.err("Fail to unpack" + filePath); - throw new IMFatalException(ErrorCode.CANNOT_UNPACK_PACKAGE); - } - } - - private String removeDataDirectory(String filePath) { - if (filePath == null || filePath.equals("")) { - return ""; - } - - if (!filePath.startsWith(DATA_DIRECTORY)) { - return ""; - } - - filePath = filePath.substring(DATA_DIRECTORY.length()); - return filePath; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsShellRunningProgramParser.java b/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsShellRunningProgramParser.java deleted file mode 100644 index 901577a..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/lib/win/WindowsShellRunningProgramParser.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.lib.win; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; - -import java.util.ArrayList; -import java.util.List; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.Registry; -import org.tizen.installmanager.lib.ShellParser; - - -/** - * Parsing standard out message and get pid. - * @author Shihyun Kim - * - */ -public class WindowsShellRunningProgramParser extends ShellParser{ - private List mSDKProcessID = new ArrayList(); - - protected void parseStdOut(InputStream input) { - BufferedReader br = null; - try { - InputStreamReader isr = new InputStreamReader(input, Platform.CURRENT_CHARSET); - br = new BufferedReader(isr); - - String line; - while ( (line = br.readLine()) != null) { - setSDKPid(line); - } - } catch (IOException e) { - Log.ExceptionLog(e); - } finally{ - if (br != null) { - try { - br.close(); - } catch (IOException e) { - Log.err("WindowsShellRunningProgramParser fail to close output stream"); - Log.ExceptionLog(e); - } - } - } - } - - private void setSDKPid(String line) { - String[] infos = line.split(" "); - - if (infos.length < 2) { - return; - } else { - File targetPathFile = new File(Registry.getInstalledPath()); - - String executeFilePath = null; - String targetPath = null; - try { - executeFilePath = new File(infos[1]).getCanonicalPath(); - targetPath = targetPathFile.getCanonicalPath(); - } catch (IOException e) { - Log.err("Cannot get canonical paths: " + infos[1] + - ", " + Registry.getInstalledPath()); - Log.ExceptionLog(e); - return; - } - - if ( executeFilePath.startsWith(targetPath) && - !executeFilePath.contains(Config.INSTALL_MANAGER_DIRECTORY)) { - Log.log("running non-IM found: "+executeFilePath); - try { - int pid = Integer.parseInt(infos[0]); - mSDKProcessID.add(pid); - } catch(NumberFormatException e) { - Log.ExceptionLog(e); - } - } else { - return; - } - } - } - - /** - * Get pid list - * @return - */ - public List getSDKPid() { - return mSDKProcessID; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PackageManager.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PackageManager.java deleted file mode 100644 index 93ff623..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PackageManager.java +++ /dev/null @@ -1,1488 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.lib; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Stack; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.DistributionController; -import org.tizen.installmanager.core.IMExitException; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.lib.Downloader; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.pkg.lib.darwin.DarwinPackageManager; -import org.tizen.installmanager.pkg.lib.linux.LinuxPackageManager; -import org.tizen.installmanager.pkg.lib.win.WindowsPackageManager; -import org.tizen.installmanager.pkg.model.IMPackageNotFound; -import org.tizen.installmanager.pkg.model.Package; -import org.tizen.installmanager.pkg.model.PackageSet; -import org.tizen.installmanager.pkg.model.Properties; -import org.tizen.installmanager.pkg.model.PropertySection; -import org.tizen.installmanager.pkg.model.Snapshot; -import org.tizen.installmanager.pkg.model.Version; -import org.tizen.installmanager.util.PathUtil; - - -/** - * Package Manager - *

- * This class provides various methods for managing packages. - * Most of the methods handle packages symbolically. Namely, they are identified by its package name not the object if not specially mentioned. - *

- * Some methods are carefully designed to preserve the order of packages because the order of packages is important sometimes. - * See the details in the documentation of each methods. - * - * @author Shihyun Kim - * - */ -public abstract class PackageManager { - /** - * Packages that are already installed in the system. - */ - private PackageSet installedPackages; - /** - * packages that are available in the repositories(package servers). - */ - private PackageSet repoPackages; - /** - * packages that combines installedPackages and repoPackages. - * This includes only the latest package from the several versions of a package. - * This is used as the universe set(base set) of packages available. - */ - private PackageSet recentPackages; - - /** - * Packages from extension package server.111 - */ - private PackageSet extensionPackages = new PackageSet(); - - private static PackageManager pm = null; - - private enum State { - INSTALL, - UNINSTALL; - } - - //abstract method - /** - * Get package list file name. - * @return - */ - abstract public String getPackageListFileName(); - - /** - * Creates and initializes Package Manager instance. - * This combines installed packages and packages from the repositories. - * - * @param installed a file in which installed packages are specified. This can be null if no packages are installed. - * @param repoPackagesUrls a collection of URLs of repositories(package servers). This cannot be null. - * @throws IOException if temporary file cannot created - */ - protected PackageManager(File installed, Collection repoPackagesUrls) throws IOException { - setInstalledPackageList(installed); - loadRepositoryPackageList(repoPackagesUrls); - getRecentPackages(); - } - - /** - * Initializes package manager with information of installed packages and packages of repository - * @param sectionsInstalled a list of property sections of the installed packages - * @param repoToSectionsMap a map from base url of repository to a list of property sections of the repository - */ - protected PackageManager(List sectionsInstalled, Map> repoToSectionsMap) { - setInstalledPackageList(sectionsInstalled); - setRepoPackages(repoToSectionsMap); - getRecentPackages(); - } - - /** - * set repository url to each package.(reposistory url plus package name is complete url.) - * @param repoPackagesUrls - * @throws IOException - */ - public void loadRepositoryPackageList(Collection repoPackagesUrls) throws IOException { - HashMap> r2sMap = null; - if (Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) { // Using SDK Image - r2sMap = getRepositoryAndPackageList(repoPackagesUrls, false); - } else { - r2sMap = getRepositoryAndPackageList(repoPackagesUrls, true); - } - - setRepoPackages(r2sMap); - } - - /** - * set repository url to each package.(reposistory url plus package name is complete url.) - * @param repoPackagesUrls Packgae server list. - * @throws IOException - */ - public void loadExtensionPackages(Collection repoPackagesUrls) throws IOException { - HashMap> repoToSectionsMap = getRepositoryAndPackageList(repoPackagesUrls, false); - setExtensionPackages(repoToSectionsMap); - setExtensionPackagesToRecentPackages(); - } - - private HashMap> getRepositoryAndPackageList - (Collection repoPackagesUrls, boolean isSnapshotServer) throws IOException { - PropertyParser parser = new PropertyParser(); - HashMap> r2sMap = new HashMap>(); - - if(repoPackagesUrls != null) { - for(String repo : repoPackagesUrls) { - URL packageListURL = getPackageListPath(repo, isSnapshotServer); - - File packageListFile = downloadPackageListFile(packageListURL); - - if(packageListFile != null) { - r2sMap.put(repo, parser.readFromFile(packageListFile)); - } else { - Log.err("Ignore invalid repository: "+repo); - } - } - } else { - Log.log("Cannot find repository. This is local installer."); - } - - return r2sMap; - } - - private File downloadPackageListFile(URL packageListURL) throws IOException { - if (packageListURL == null) { - return null; - } - Downloader dl = InstallManager.getDownloader(); - File tmp = null; - - if (Options.onlyDownload) { - tmp = new File(PathUtil.getFromCurrDir(getPackageListFileName())); - } else { - tmp = File.createTempFile("Packages", ".list"); - tmp.deleteOnExit(); - } - - long size = dl.download(packageListURL, tmp.getAbsolutePath(), null); - - if (size > 0) { - return tmp; - } else { - return null; - } - } - - private void setExtensionPackages(HashMap> repoToSectionsMap) { - extensionPackages = new PackageSet(); - setPackages(extensionPackages, repoToSectionsMap, true); - } - - /** - * Get packages from extension package server. - * @return set of packages - */ - public PackageSet getExtensionPackages() { - return extensionPackages; - } - - public PackageSet getInstalledExtensionPackages() { - PackageSet extensionPackages = new PackageSet(); - - for (Package pkg : extensionPackages) { - if (pkg.isExtensionPackage()) { - extensionPackages.add(pkg); - } - } - - return extensionPackages; - } - - /** - * Set installed packages. - * @param installedPackageListPath - */ - public void setInstalledPackageList(File installedPackageListPath) { - List sectionsInstalled = null; - PropertyParser parser = new PropertyParser(); - - if(installedPackageListPath != null) { - sectionsInstalled = parser.readFromFile(installedPackageListPath); - } else { - sectionsInstalled= new LinkedList(); - } - - setInstalledPackageList(sectionsInstalled); - } - - /** - * Set installed packages - * @param sections - */ - private void setInstalledPackageList(List sections) { - installedPackages = new PackageSet(); - - for(PropertySection sect : sections) { - installedPackages.add(new Package(sect.getProperties())); - } - } - - /** - * Get package list file path from url. - * @param url - * @return Full url path - */ - private URL getPackageListPath(String url, boolean isSnapshotServer) { - if (url == null || url.isEmpty()) { - return null; - } else { - String packageListURL = ""; - - if (isSnapshotServer) { - String snapshotPath = Config.getInstance().getSnapshotPath(); - - if (snapshotPath == null || snapshotPath.isEmpty()) { - String distribution = Config.getInstance().getConfigFile().getDistribution(); - - Snapshot latestSnapshot = DistributionController.getInstance().getLatestSnapshot(distribution); - if (latestSnapshot == null) { - return null; - } else { - snapshotPath = DistributionController.getInstance().getLatestSnapshot(distribution).getPath(); - } - } else {} - - packageListURL = PathUtil.addURLPath(url, - snapshotPath, - getPackageListFileName()); - - } else { - packageListURL = PathUtil.addURLPath(url, getPackageListFileName()); - } - - try { - return new URL(packageListURL); - } catch (MalformedURLException e) { - Log.ExceptionLog(e); - return null; - } - } - } - - - - /** - * @return installed packages - */ - public PackageSet getInstalledPackages() { - return (PackageSet) installedPackages.clone(); - } - - /** - * Set packages of repository - * @param sections - */ - protected void setRepoPackages( Map> repoToSectionsMap) { - repoPackages = new PackageSet(); - setPackages(repoPackages, repoToSectionsMap, false); - } - - /** - * Set packages to destPackages - * @param destPackages It is set of packages. - * @param repoToSectionsMap It is added to destPackages - */ - private void setPackages(PackageSet destPackages, Map> repoToSectionsMap, boolean isExtensionPackage) { - if (destPackages == null) { - destPackages = new PackageSet(); - } - - for(String repoBaseUrl : repoToSectionsMap.keySet()) { - for(PropertySection sect : repoToSectionsMap.get(repoBaseUrl)) { - Package pkg = new Package(sect.getProperties(), repoBaseUrl); - - if (isExtensionPackage) { - if (pkg.getAttribute().equalsIgnoreCase("extra")) { - pkg.setExtensionServer(repoBaseUrl); - destPackages.add(pkg); - } - } else { - destPackages.add(pkg); - } - } - } - } - - /** - * @return packages of repository - */ - public PackageSet getRepoPackages() { - return repoPackages; - } - - /** - * @return root meta packages of repository - */ - public PackageSet getRootMetaPackagesOfRepository() { - return rootMeta(repoPackages); - } - - /** - * Get install meta packages from repository. - * @return - */ - public PackageSet getInstallMetaPackagesOfRepository() { - return installMeta(repoPackages); - } - - /** - * Get root meta package from extension package server() - */ - public PackageSet getRootMetaPackagesOfExtensionServer() { - return rootMeta(extensionPackages); - } - - /** - * @return recent packages. This includes the latest packages among all packages from currently - * installed packages and packages of repository if a package has several versions. - */ - public PackageSet getRecentPackages() { - if(recentPackages == null) { - recentPackages = new PackageSet(); - for(Package ip : installedPackages) { - if(repoPackages != null && repoPackages.contains(ip)) { - Package rp = repoPackages.getPackage(ip); - if(ip.getVersion().compareTo(rp.getVersion()) > 0) { - recentPackages.add(ip); - } else { - recentPackages.add(rp); - } - } else if (extensionPackages != null && extensionPackages.contains(ip)) { - Package ep = extensionPackages.getPackage(ip); - if(ip.getVersion().compareTo(ep.getVersion()) > 0) { - recentPackages.add(ip); - } else { - recentPackages.add(ep); - } - } else { - recentPackages.add(ip); - } - } - - for(Package rp : repoPackages) { - if(!recentPackages.contains(rp)) { - recentPackages.add(rp); - } - } - } - return recentPackages; - } - - private void setExtensionPackagesToRecentPackages() { - if (recentPackages == null) { - recentPackages = new PackageSet(); - } - - for(Package ip : installedPackages) { - if (extensionPackages != null && extensionPackages.contains(ip)) { - Package ep = extensionPackages.getPackage(ip); - if(ip.getVersion().compareTo(ep.getVersion()) > 0) { - recentPackages.add(ip); - } else { - recentPackages.add(ep); - } - } else { - recentPackages.add(ip); - } - } - } - - - - // Methods for update process - /** - * except package from installed package list. - * @param pkg - * @return - */ - public boolean exceptPackageFromInstalledPackages(Package pkg) { - return installedPackages.remove(pkg); - } - - /** - * Add package to installed package list. - * @param pkg - * @return - */ - public boolean addPackageToInstalledPackages(Package pkg) { - installedPackages.remove(pkg); - return installedPackages.add(pkg); - } - - /** - * @return updatable packages among installed packages - */ - public PackageSet getUpdatableInstalledPackages() { - PackageSet updatables = new PackageSet(); - for(Package ip : installedPackages) { - if(repoPackages.contains(ip)) { - Package rp = repoPackages.getPackage(ip); - if(rp.getVersion().compareTo(ip.getVersion()) != 0) { - updatables.add(ip); - } - } - } - return updatables; - } - - /** - * if pkg is updatable, return true. else return false. - * @param pkg - * @return - */ - public boolean isUpdatable(Package pkg) { - PackageSet updatables = getUpdatableInstalledPackages(); - - if (updatables.contains(pkg)) { - return true; - } else { - return false; - } - } - - /** - * If pkg is installed, return true. else return false - * @param pkg - * @return - */ - public boolean isInstalledVersion(Package pkg) { - Package installedPackage = installedPackages.getPackage(pkg); - if (installedPackage == null) { - return false; - } else { - Version installedVersion = installedPackage.getVersion(); - if (installedVersion.compareTo(pkg.getVersion()) == 0) { - return true; - } else { - return false; - } - } - } - - /** - * @return meta packages among installed packages - */ - public PackageSet getInstalledMetaPackages() { - return meta(installedPackages); - } - - /** - * @return meta packages among all recent packages - */ - public PackageSet getAllMetaPackages() { - PackageSet allMeta = new PackageSet(); - - PackageSet recentMeta = meta(recentPackages); - PackageSet extensionMeta = meta(extensionPackages); - - allMeta.addAll(recentMeta); - allMeta.addAll(extensionMeta); - - return allMeta; - } - - public PackageSet getLeafMetaPackages() { - PackageSet allMetas = meta(recentPackages); - - PackageSet leafMetas = new PackageSet(); - for (Package meta : allMetas) { - //if (depends size <= 0) is leaf - if (meta.getDependentPackageNames().size() <= 0) { - leafMetas.add(meta); - } else { - if (!isChildrenAllMeta(meta)) { - leafMetas.add(meta); - } - } - } - - return leafMetas; - } - - private boolean isChildrenAllMeta(Package pkg) { - Collection depends = pkg.getDependentPackageNames(); - - PackageSet dependPackages = null; - try { - dependPackages = recentPackages.getPackagesByNames(depends); - } catch (IMPackageNotFound e) { - Log.ExceptionLog(e); - } - - if (dependPackages == null) { - return true; - } else { - for (Package dPackage : dependPackages) { - if (!dPackage.isMeta()) { - return false; - } - } - return true; - } - } - - /** - * @return partner meta packages among all meta packages. - */ - public PackageSet getPartnerMetaPackages() { - PackageSet allMetas = meta(recentPackages); - - PackageSet partnerMeta = new PackageSet(); - for (Package meta : allMetas) { - if (meta.isPartnerMeta()) { - partnerMeta.add(meta); - } - } - - return partnerMeta; - } - - /** - * @return public meta packages among all meta packages. - */ - public PackageSet getPublicMetaPackages() { - PackageSet allMetas = meta(recentPackages); - - PackageSet publicMeta = new PackageSet(); - for (Package meta : allMetas) { - if (meta.isPublicMeta()) { - publicMeta.add(meta); - } - } - - return publicMeta; - } - - /** - * Get dependency packages of installable package. - * @param pkgs installable packages. - * @return - */ - public PackageSet getDependsPackagesFromRepository(PackageSet pkgs) { - return dep(pkgs, State.INSTALL); - } - - /** - * @return meta packages that have no updates considering its dependents - */ - public PackageSet getNotUpdatableMetaPackages() { - PackageSet noup = new PackageSet(); - for(Package m : getAllMetaPackages()) { - if(!isMetaUpdatable(m)) { - noup.add(m); - } - } - return noup; - } - - public PackageSet getNotInstallableAndNotUpdatablePackages() { - PackageSet notPkg = new PackageSet(); - - for (Package m :getAllMetaPackages()) { - if (isMetaRemovable(m) && !isMetaUpdatable(m)) { - notPkg.add(m); - } - } - - return notPkg; - } - - /** - * @return meta packages thar are updatable among installed packages - */ - public PackageSet getUpdatableMetaPackages() { - PackageSet allMetas = getAllMetaPackages(); - PackageSet notUpdatableMetas = getNotUpdatableMetaPackages(); - return diff(allMetas, notUpdatableMetas); - } - - /** - * @param selectedMetas - * @return packages that will be installed after update/install resulted from the selected meta packages - */ - public PackageSet getResultPackagesAfterUpdate(PackageSet selectedMetas) { - PackageSet deps = dep(selectedMetas, State.INSTALL); - PackageSet conflicts = conflict(selectedMetas); - PackageSet remainedFromConflicts = diff(installedPackages, conflicts); - return union(deps, remainedFromConflicts); - } - - /** - * Get updatable packages in update process except new packages. - * @param selectedMetas - * @return - */ - public PackageSet getUpdatablepackagesInUpdate(PackageSet selectedMetas) { - PackageSet result = dep(selectedMetas, State.INSTALL); - PackageSet up = getUpdatableInstalledPackages(); - return intersect(result, up); - } - - /** - * Get removable packages in snapshot process except new packages. - * @param selectedMetas - * @return - */ - public PackageSet getRemovablePackagesInSnapshot(PackageSet selectedMetas) { - PackageSet result = dep(selectedMetas, State.UNINSTALL); - PackageSet pkgSet = getdifferentVersionFromInstalledPackages(result); - - return pkgSet; - } - - /** - * check version between sourcePackages and installedPackages, and return different version packages. - * @param pkgs - * @return Different version packages among installed packages - */ - public PackageSet getdifferentVersionFromInstalledPackages(PackageSet pkgs) { - PackageSet depPkgs = dep(pkgs, State.INSTALL); - PackageSet otherVersionPackages = new PackageSet(); - for(Package ip : installedPackages) { - if(depPkgs.contains(ip)) { - Package rp = depPkgs.getPackage(ip); - if(rp.getVersion().compareTo(ip.getVersion()) != 0) { - otherVersionPackages.add(ip); - } - } - } - - return otherVersionPackages; - } - - /** - * @param selectedMetas - * @return packages to newly install in update process by the selected meta packages - */ - public PackageSet getInstallablePackages(PackageSet selectedMetas) { - PackageSet result = getResultPackagesAfterUpdate(selectedMetas); - PackageSet installablePkgs = diffPackageWithVersion(result, installedPackages); - return installablePkgs; - } - - /** - * @param selectedMetas - * @return packages to update in update process by the selected meta packages - */ - public PackageSet getToUpdatePackagesInUpdate(PackageSet selectedMetas) { - PackageSet result = getResultPackagesAfterUpdate(selectedMetas); - PackageSet up = getUpdatableInstalledPackages(); - return intersect(result, up); - } - - - /** - * @param selectedMetas - * @return packages to remove in update process by conflicts with the selected meta packages - */ - public PackageSet getConflictPackagesInUpdate(PackageSet selectedMetas) { - PackageSet conflicts = conflict(selectedMetas); - return intersect(conflicts, installedPackages); - } - - // Methods for remove process - - /** - * @return packages that can be removed - */ - public PackageSet getRemovableMetaPackages() { - return getInstalledMetaPackages(); - } - - public PackageSet getInstallableMetaPackagesInSnapshot() { - PackageSet repoMetas = meta(repoPackages); - - PackageSet installableMeta = new PackageSet(); - for (Package metaPackage : repoMetas) { - if (isMetaInstallable(metaPackage)) { - installableMeta.add(metaPackage); - } - } - - return installableMeta; - } - - /** - * @param selectedMetas - * @return packages to remove in remove process - */ - public PackageSet getToRemovePackagesInRemove(PackageSet selectedMetas) { - /* - PackageSet dep = dep(selectedMetas); - PackageSet mayRemove = intersect(installedPackages, dep); - PackageSet remainMetas = diff(getInstalledMetaPackages(), selectedMetas); - PackageSet remainPackages = dep(remainMetas); - PackageSet toRemove = diff(mayRemove, remainPackages); - return reverseSet(toRemove); - */ - PackageSet dep = dep(selectedMetas, State.UNINSTALL); - return reverseSet(dep); - } - - /** - * @param selectedMetas - * @return packages that will be remained after remove resulted from the selected meta packages - */ - public PackageSet getResultPackagesAfterRemove(PackageSet selectedMetas) { - return diff(getInstalledMetaPackages(), selectedMetas); - } - - // set handling methods - - /** - * @param pset - * @return meta packages in the package set - */ - private PackageSet meta(PackageSet pset) { - PackageSet metas = new PackageSet(); - - if (pset == null) { - return metas; - } - - for(Package p : pset) { - if(p.isMeta()) { - metas.add(p); - } - } - return metas; - } - - /** - * @param pset - * @return meta packages in the package set - */ - private PackageSet rootMeta(PackageSet pset) { - PackageSet metas = new PackageSet(); - for(Package p : pset) { - if(p.isRootMeta() || p.isPartnerMeta() || p.isExtraMeta() || p.isPublicMeta()) { - metas.add(p); - } - } - return metas; - } - - /** - * @param pset - * @return meta packages in the package set - */ - private PackageSet installMeta(PackageSet pset) { - PackageSet metas = new PackageSet(); - for(Package p : pset) { - if(p.isInstallMeta()) { - metas.add(p); - } - } - return metas; - } - - /** - * Get dependency package list from p. - * @param p a package - * @return all the packages that the given package depends on directly or indirectly - */ - private PackageSet dep(Package p, State state) { - // depth first traverse on dependency graph - PackageSet dep = new PackageSet(); - Stack pkgStack = new Stack(); - pkgStack.push(p); - while(!pkgStack.isEmpty()) { - Package pkg = pkgStack.pop(); - - if(!dep.contains(pkg)) { - dep.add(pkg); - PackageSet depPackageSet = new PackageSet(); - try { - if (state == State.INSTALL) { - if (repoPackages.contains(pkg)) { - depPackageSet = repoPackages.getPackagesByNames(pkg.getDependentPackageNames()); - } else if (extensionPackages.contains(pkg)) { - depPackageSet = extensionPackages.getPackagesByNames(pkg.getDependentPackageNames()); - } - } else if (state == State.UNINSTALL){ - depPackageSet = installedPackages.getPackagesByNames(pkg.getDependentPackageNames()); - } else { - Log.err("State class have two state(INSTALL/UNINSTALL) "); - throw new IMFatalException(ErrorCode.UNKOWN_ERROR); - } - } catch (IMPackageNotFound e) { - Log.err("Finding dependents: "+p+": Package does not exist: " + e.getPackageName()+ " or "+ pkg.getDependentPackageNames()); - throw new IMFatalException(ErrorCode.CANNOT_FIND_PACKAGE); - } - - for(Package depPkg : depPackageSet) { - if(p.equals(depPkg)) { - Log.err("Circular dependency found: "+p); - throw new IMFatalException(ErrorCode.CIRCULAR_PACKAGE_DEPENDENCY); - } - pkgStack.push(depPkg); - } - } else { - // already visited. - addDependsSet(dep, pkg); - } - } - - return reverseSet(dep); - } - - /** - * Need reverse depends when remove. - * @param p - * @return - */ - private PackageSet reverseDep(Package p) { - // depth first traverse on dependency graph - PackageSet reverseDep = new PackageSet(); - Stack pkgStack = new Stack(); - pkgStack.push(p); - while(!pkgStack.isEmpty()) { - Package pkg = pkgStack.pop(); - - if(!reverseDep.contains(pkg)) { - reverseDep.add(pkg); - - for (Package recentPkg : recentPackages) { - Collection dependsList = recentPkg.getDependentPackageNames(); - for (String pkgName : dependsList) { - if (pkgName.equals(pkg.getPackageName())) { - pkgStack.push(recentPkg); - break; - } - } - - } - } else { - // already visited - addDependsSet(reverseDep, pkg); - } - } - - return reverseDep; - } - - /** - * Remove saved package and save package at the end of set. - * @param dependsSet - * @param pkg - */ - private void addDependsSet(PackageSet dependsSet, Package pkg) { - if (dependsSet.contains(pkg)) { - dependsSet.remove(pkg); - } - - dependsSet.add(pkg); - } - - /** - * reverse package list. - * @param pkgSet - * @return - */ - public PackageSet reverseSet(PackageSet pkgSet) { - if (pkgSet == null) { - return null; - } - - Stack stack = new Stack(); - for (Package pkg : pkgSet) { - stack.push(pkg); - } - - PackageSet reverseSet = new PackageSet(); - - while(!stack.isEmpty()) { - reverseSet.add(stack.pop()); - } - - return reverseSet; - } - - /** - * @param pset package set - * @return all the packages that the given packages depends on directly or indirectly - */ - private PackageSet dep(PackageSet pset, State state) { - PackageSet dep = new PackageSet(); - for(Package p : pset) { - dep.addAll(dep(p, state)); - } - return dep; - } - - /** - * Get conflict package list from p. - * @param p - * @return packages that conflict with the given package directly or indirectly - */ - public PackageSet conflict(Package p) { - PackageSet conflicts = new PackageSet(); - PackageSet dep = dep(p, State.INSTALL); - for(Package pkg : dep) { - Collection conflictPackageNames = pkg.getConflictPackageNames(); - for(String conflictPackageName : conflictPackageNames) { - if(installedPackages.hasPackageByName(conflictPackageName)) { - Package conflictPackage = installedPackages.getPackageByName(conflictPackageName); - conflicts.addAll(reverseDep(conflictPackage)); - } - } - } - return conflicts; - } - - /** - * Get conflict package list. - * @param pset - * @return packages that conflict with the given packages directly or indirectly - */ - private PackageSet conflict(PackageSet pset) { - PackageSet conflicts = new PackageSet(); - for(Package p : pset) { - conflicts.addAll(conflict(p)); - } - return conflicts; - } - - /** - * Adds packages of pset2 to packages of pset1. - * @param pset1 - * @param pset2 - * @return new package set has the union of pset1 and pset2. - */ - private PackageSet union(PackageSet pset1, PackageSet pset2) { - PackageSet union = (PackageSet) pset1.clone(); - union.addAll(pset2); - return union; - } - - /** - * Removes packages of pset2 from packages of pset1. - * @param pset1 - * @param pset2 - * @return new package set that represents (pset1 - pset2). - */ - private PackageSet diff(PackageSet pset1, PackageSet pset2) { - PackageSet diff = new PackageSet(); - for(Package p : pset1) { - if(!pset2.contains(p)) { - diff.add(p); - } - } - return diff; - } - - private PackageSet diffPackageWithVersion(PackageSet pset1, PackageSet pset2) { - PackageSet diff = new PackageSet(); - for(Package p : pset1) { - Package pkg = pset2.getPackage(p); - - if (pkg == null) { - diff.add(p); - } else { - if (Version.compareTo(p.getVersion(), pkg.getVersion()) != 0) { - diff.add(p); - } - } - } - return diff; - } - - /** - * - * @param pset1 - * @param pset2 - * @return new set of intersection of pset1 and pset2. It has the order of pset1. - */ - private PackageSet intersect(PackageSet pset1, PackageSet pset2) { - PackageSet pset = new PackageSet(); - for(Package p : pset1) { - if(pset2.contains(p)) { - pset.add(p); - } - } - return pset; - } - - /** - * @param m meta package to be checked updatable - * @return true if the meta package is updatable. - * ie. the meta package is installed and one of its dependents is already installed and is updatable. - */ - private boolean isMetaUpdatable(Package m) { - // if one of the meta package's dependents is installed and updatable, the meta package is updatable. - PackageSet dep = dep(m, State.INSTALL); - - for(Package p : dep) { - - if(installedPackages.contains(p)) { - Package ip = installedPackages.getPackage(p); - if (ip == null) { - continue; - } - - Package rp = null; - if (repoPackages != null && repoPackages.hasPackage(p)) { - rp = repoPackages.getPackage(p); - } else if (extensionPackages != null && extensionPackages.hasPackage(p)) { - rp = extensionPackages.getPackage(p); - } - - // checks p is updatable - if(rp != null && rp.getVersion().compareTo(ip.getVersion()) != 0) { - return true; - } - } - } - return false; - } - - - - /** - * @param m meta package to be checked removable - * @return true if the meta package is removable - * ie. the meta package is installed and one of its dependents is already installed and is removable. - */ - private boolean isMetaRemovable(Package m) { - // if the meta package is not installed, it's never updatable - if(installedPackages.contains(m)) { - return true; - } else { - return false; - } - } - - /** - * check new installation or upgrade or downgrade. - * @param meta meta package to be checked installable. - * @return true if the meta package is updatable. - * ie. the meta package is installed and one of its dependents is already installed and is updatable. - */ - private boolean isMetaInstallable(Package meta) { - // if one of the meta package's dependents is installed and updatable, the meta package is updatable. - PackageSet dep = dep(meta, State.INSTALL); - - for(Package p : dep) { - //Do not check meta package. It is only used by install-type or category. - if (p.isMeta()) { - continue; - } - - if(installedPackages.contains(p)) { - Package ip = installedPackages.getPackage(p); - if (ip == null) { - continue; - } - - Package rp = repoPackages.getPackage(p); // rp always exists if ip exists - - // checks p is updatable - if(rp.getVersion().compareTo(ip.getVersion()) != 0) { - return true; - } - } else { - return true; - } - } - return false; - } - - // utility methods - /** - * Get installed package. - * @param pkg - * @return If not exist package in installed package list, return empty string. - */ - public Package getInstalledPackageByName(String pkgName) { - Package retPkg = installedPackages.getPackageByName(pkgName); - - return retPkg; - } - - /** - * Get installed packages by package name. - * @param pkgName name of packages - * @return If not exist package in installed package list, return empty string. - */ - public PackageSet getInstalledPackagesByName(List pkgNames) { - PackageSet installedPackages = new PackageSet(); - for (String pkg : pkgNames) { - Package retPkg = getInstalledPackageByName(pkg); - - if (retPkg != null) { - installedPackages.add(retPkg); - } - } - - return installedPackages; - } - - /** - * Get Package instance from package name. - * @param pkgName - * @return - */ - public Package getPackageByName(String pkgName) { - if(repoPackages.hasPackageByName(pkgName)) { - return repoPackages.getPackageByName(pkgName); - } else { - return null; - } - } - /** - * @param packageNames - * @return packages collected by the given package names - */ - public PackageSet getPackagesByNames(Collection packageNames) { - PackageSet pset = new PackageSet(); - for(String name : packageNames) { - if(repoPackages.hasPackageByName(name)) { - Package pkg = repoPackages.getPackageByName(name); - pset.add(pkg); - } else if (extensionPackages.hasPackageByName(name)) { - Package pkg = extensionPackages.getPackageByName(name); - pset.add(pkg); - } else { - throw new IMFatalException(ErrorCode.CANNOT_FIND_FILE_IN_REPOSITROY); - } - } - return pset; - } - - public PackageSet getMandatoryPackages() { - PackageSet pSet = new PackageSet(); - - for (Package pkg : repoPackages) { - if (pkg.isMandatory()) { - pSet.add(pkg); - } - } - - return pSet; - } - - /** - * Check installed meta packages - * @return if installed package exists, return true. if not return false. - */ - public boolean existInstalledMetaPackages() { - if (getInstalledMetaPackages().size() <= 0) { - return false; - } else { - return true; - } - } - - /** - * Check installable meta packages - * @return if installable meta package exists, return true. if not return false. - */ - public boolean existInstallableMetaPackages() { - if (getInstalledMetaPackages().size() <= 0) { - return false; - } else { - return true; - } - } - - /** - * Check installed packages. - * @return if installed package exists, return true. if not return false. - */ - public boolean existInstalledPackages() { - if (installedPackages.size() <= 0) { - return false; - } else { - return true; - } - } - - /** - * Check installable or updatable packages. - * @return if installable package exists, return true. if not return false. - */ - public boolean existInstallablePackages() { - for(Package p : repoPackages) { - if(installedPackages.contains(p)) { - Package ip = installedPackages.getPackage(p); - if (ip == null) { - continue; - } - - Package rp = recentPackages.getPackage(p); // rp always exists if ip exists - // checks p is updatable - if(rp.getVersion().compareTo(ip.getVersion()) > 0) { - return true; - } - } - } - return false; - } - - - /** - * get total size to install. - * @param pkg - * @return - */ - public long getTotalSizeOfInstallablePackages(Package pkg) { - PackageSet pkgs = new PackageSet(); - - pkgs.add(pkg); - PackageSet depPkgSet = getInstallablePackages(pkgs); - - return getTotalSize(depPkgSet); - } - - /** - * get total size to remove. - * @param pkg - * @return - */ - public long getTotalSizeOfRemovablePackages(Package pkg) { - PackageSet pkgs = new PackageSet(); - - pkgs.add(pkg); - PackageSet depPkgSet = getToRemovePackagesInRemove(pkgs); - - return getTotalSize(depPkgSet); - } - - /** - * get total size to install. - * @param pkg - * @return - */ - public long getTotalSizeOfInstallablePackages(PackageSet pkgs) { - PackageSet depPkgSet = getInstallablePackages(pkgs); - - return getTotalSize(depPkgSet); - } - - /** - * get total size to remove. - * @param pkg - * @return - */ - public long getTotalSizeOfRemovablePackages(PackageSet pkgs) { - PackageSet depPkgSet = getRemovablePackagesInSnapshot(pkgs); - - return getTotalSize(depPkgSet); - } - - /** - * get total size to install - * @param pkgs - * @return - */ -// public long getInstallablePackageSize(PackageSet pkgs) { -// return getTotalSize(pkgs); -// } - - private long getTotalSize(PackageSet pkgs) { - long totalSize = 0; - for (Package depPkg : pkgs) { - totalSize += depPkg.getPackageSize(); - } - - return totalSize; - } - - /** - * @return true if installed and repository packages are empty. - */ - public boolean isEmpty() { - - if (installedPackages.size() <= 0 && repoPackages.size() <= 0) { - return true; - } - - return false; - } - - /** - * Get Installable packages. - * @return packages that can be newly installable. - */ - public PackageSet getInstallableMetaPackages() { - return diff(getAllMetaPackages(), getInstalledMetaPackages()); - } - - /** - * @return packages that can be newly installable or updatable. - */ - public PackageSet getInstallableOrUpdatableMetaPackages() { - PackageSet installableMetaPackages = new PackageSet(); - PackageSet allMetaPackages = getAllMetaPackages(); - - for (Package metaPackage : allMetaPackages) { - if (isMetaInstallable(metaPackage)) { - installableMetaPackages.add(metaPackage); - } - } - - return installableMetaPackages; - } - - - /** - * Check missing packages from repository's package list. - * @return packages that is missing in repository's package list. - */ - public PackageSet getMissingPackagesFromRepository() { - PackageSet missingPackages = new PackageSet(); - - if (!repoPackages.isEmpty()) { - missingPackages = diff(installedPackages, repoPackages); - missingPackages = diff(missingPackages, extensionPackages); - } - - return missingPackages; - } - - /** - * save packages to installedpackage.list - * @param filePath - */ - public void saveInstalledList(String filePath) { - if (filePath == null) { - return; - } - PropertyParser parser = new PropertyParser(); - List pSections = saveProperySectionsFromPackages(installedPackages); - parser.writeToFile(pSections, filePath); - } - - public List saveProperySectionsFromPackages(PackageSet packages) { - List pSections = new ArrayList(); - PropertySection pSection = null; - Properties properties = null; - - for (Package pkg : packages) { - properties = (Properties)pkg.getProperties(); - pSection = new PropertySection(); - pSection.setProperties(properties); - pSections.add(pSection); - } - - return pSections; - } - - /** - * Prints dependency graph of packages in dot format to stdout. - * @throws IMExitException - */ - public void printDepGraph() throws IMExitException { - StringBuffer buf = new StringBuffer(); - try { - buf.append("digraph G {\n"); - for(Package p : recentPackages) { - PackageSet dep = dep(p, State.INSTALL); - for(Package d : dep) { - if(!d.equals(p)) { - buf.append("\""+p+"\" -> \"" + d + "\";\n"); - } - } - } - buf.append("}\n"); - System.out.println(buf); - } catch(Exception e) { - System.err.println(ErrorController.getErrorMessage()); // print error message to stderr for alert - Log.ExceptionLog(e); - throw new IMExitException(Config.EXITCODE_DEP_ERROR); - } - } - - public static void dispose() { - if (pm != null) { - pm = null; - } - } - - /** - * Get PackageManager singleton instance. - * @param installed - * @param repoPackagesUrls - * @return - * @throws IOException - */ - public static PackageManager getInstance(File installed, Collection repoPackagesUrls) throws IOException { - if (Options.platForm == null) { - if (pm == null) { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - pm = new LinuxPackageManager(installed, repoPackagesUrls); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - pm = new WindowsPackageManager(installed, repoPackagesUrls); - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - pm = new DarwinPackageManager(installed, repoPackagesUrls); - } else { - return null; - } - } - } else { - if (pm == null) { - if (Options.platForm.equals("ubuntu")) { - pm = new LinuxPackageManager(installed, repoPackagesUrls); - } else if (Options.platForm.equals("windows")) { - pm = new WindowsPackageManager(installed, repoPackagesUrls); - } else { - return null; - } - } - } - return pm; - } - - public static PackageManager getInstance() { - return pm; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PropertyParser.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PropertyParser.java deleted file mode 100644 index 5d252b9..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/PropertyParser.java +++ /dev/null @@ -1,305 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.lib; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.pkg.model.Properties; -import org.tizen.installmanager.pkg.model.Property; -import org.tizen.installmanager.pkg.model.PropertySection; - - -/** - * Paring property from file. - * @author Shihyun Kim - * - */ -public class PropertyParser { - - public static final String DEFAULT_SECTION_SEPARATOR = ""; - public static final String DEFAULT_NAMEVALUE_SEPARATOR = ":"; - - - private String mSectionSeparator = DEFAULT_SECTION_SEPARATOR; - private String mNamevalueSeparator = DEFAULT_NAMEVALUE_SEPARATOR; - - /** - * Set separator among section. - * @param separator - */ - public void setSectionSeparator(String separator) { - mSectionSeparator = separator; - } - - /** - * Set separator between name and value - * @param separator - */ - public void setNamevalueSeparator(String separator) { - mNamevalueSeparator = separator; - } - - - public PropertyParser() { - } - - public PropertyParser(String nameValueSeparator) { - mNamevalueSeparator = nameValueSeparator; - } - - /** - * Read text file and parsing. - * @param propertyFilePath - * @return list of PropertySection - */ - public List readFromFile(String propertyFilePath) { - Log.log("begin parsing the config file. => " + propertyFilePath); - - File file = new File(propertyFilePath); - if(!file.exists()) { - Log.log("Fail to parse the config file"); - return null; - } - - List pSectionReturn = null; - PropertySection pSection = null; - Properties pFieldList = null; - Property pField = null; - Property tempProperty; - FileReader fReader = null; - BufferedReader bReader = null; - String sReadData = null; - - try { - pFieldList = new Properties(); - pSectionReturn = new ArrayList(); - fReader = new FileReader(propertyFilePath); - bReader = new BufferedReader(fReader); - - while (true) { - sReadData = bReader.readLine(); - Log.log(sReadData); - - //end of file. - if (sReadData == null) { - if (pFieldList.size() > 0) { - pSection = new PropertySection(); - pSection.setProperties(pFieldList); - pSectionReturn.add(pSection); - } else {} - break; - } else { - sReadData = sReadData.trim(); - } - - if (this.mSectionSeparator.equals(sReadData)) { - //read control - if (pFieldList.size() > 0) { - pSection = new PropertySection(); - pSection.setProperties(pFieldList); - pSectionReturn.add(pSection); - pFieldList = new Properties(); - } else { - continue; - } - } else { - //read line - tempProperty = parseNameValue(sReadData); - if (tempProperty != null) { - if (null != tempProperty.getName()) { - pFieldList.add(tempProperty); - pField = tempProperty; - } else { - pField.setValue(pField.getValue()+'\n'+sReadData.trim()); - } - } else { - Log.err("Cannot parse name and value from installmanager.conf. (read line => " + sReadData + ")"); - } - } - } - } catch (IOException ie) { - Log.ExceptionLog(ie); - throw new IMFatalException(ErrorCode.CANNOT_PARSING_TEXT); - } catch (Throwable e) { - Log.ExceptionLog(e); - throw new IMFatalException(e.getMessage()); - } finally { - try { - if(bReader != null) { - bReader.close(); - } - } catch(Exception e) { - Log.ExceptionLog(e); - } - } - - Log.log("finish parsing the config file."); - - return pSectionReturn; - } - - /** - * Save name and value to Property. - * @param nameAndValue - * @return Property that has name and value from parameter 'nameAndValue'. - */ - public Property parseNameValue(String nameAndValue) { - - Property property = new Property(); - String sBeforeSetperation = null; - String sAfterSetperation = null; - - int iSetperationCount = nameAndValue.indexOf(mNamevalueSeparator); - int isKeyValueLength = nameAndValue.length(); - - if (" ".equals(nameAndValue.substring(0, 1)) ) { - property.setValue(nameAndValue.trim()); - } - else if (iSetperationCount == -1) { - property.setValue(nameAndValue.trim()); - } - else if (iSetperationCount == isKeyValueLength) { - property.setName(nameAndValue.substring(0, isKeyValueLength-1).trim()); - } - else if (iSetperationCount == 0) { - property.setValue(nameAndValue.substring(1,isKeyValueLength).trim()); - } - else { - //iSetperationCount > isKeyValueLength--> exception - sBeforeSetperation = nameAndValue.substring(0, iSetperationCount).trim(); - sAfterSetperation = nameAndValue.substring(iSetperationCount+ mNamevalueSeparator.length(), nameAndValue.length()).trim(); - - property.setName(sBeforeSetperation); - property.setValue(sAfterSetperation); - } - - return property; - } - - /** - * Write Properties to file. - * @param properties List of PropertySection. - * @param targetPath - * @return true if success. - */ - public boolean writeToFile(List properties, String targetPath) { - if (properties == null || targetPath == null || targetPath.isEmpty()) { - return false; - } - boolean bReturn = false; - FileWriter fWriter = null; - Properties pList = null; - Property pField = null; - String sLine = "\n"; - String sSpace = " "; - String sTemp = null; - String sPrintTemp = null; - - File targetFile = new File(targetPath); - File parentDir = targetFile.getParentFile(); - - if (properties == null || targetPath == null ) { - return false; - } - if (!parentDir.exists()) { - parentDir.mkdirs(); - } - if (!targetFile.exists()) { - try { - targetFile.createNewFile(); - } catch (IOException e) { - throw new IMFatalException(ErrorCode.CANNOT_SAVE_PROPERTY_FILE); - } - } - try { - /*open*/ - fWriter = new FileWriter(targetPath); - if (properties.size() == 0) { - targetFile.delete(); - if (parentDir.getName().equals(".sdkconfig")) { - parentDir.delete(); - } - } else { - for (int i=0;i-1) { - fWriter.write(pField.getName()); - fWriter.write(this.mNamevalueSeparator); - sTemp = pField.getValue(); - while (sTemp.indexOf(sLine) > -1) { - sPrintTemp = sTemp.substring(0,sTemp.indexOf(sLine)+1); - fWriter.write(sSpace +sPrintTemp); - sTemp = sTemp.substring(sTemp.indexOf(sLine)+1, sTemp.length()); - } - fWriter.write(sSpace+sTemp); - fWriter.write(sLine); - } else { - fWriter.write(pField.getName()); - fWriter.write(this.mNamevalueSeparator); - fWriter.write(sSpace +pField.getValue()); - fWriter.write(sLine); - } - } - fWriter.write(sLine); - } - } - } catch (IOException ioe) { - throw new IMFatalException(ErrorCode.CANNOT_SAVE_PROPERTY_FILE); - } catch (Throwable e) { - Log.ExceptionLog(e); - throw new IMFatalException(e.getMessage()); - } finally { - try { - /*close*/ - if (fWriter != null) { - fWriter.close(); - } - } catch (Throwable e) { - Log.ExceptionLog(e); - } - } - return bReturn; - } - - /** - * Read text file and parsing. - * @param propertyFilePath - * @return - */ - public List readFromFile(File installed) { - return readFromFile(installed.getAbsolutePath()); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/darwin/DarwinPackageManager.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/darwin/DarwinPackageManager.java deleted file mode 100644 index cd60b91..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/darwin/DarwinPackageManager.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.tizen.installmanager.pkg.lib.darwin; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.pkg.lib.PackageManager; - -public class DarwinPackageManager extends PackageManager { - - public DarwinPackageManager(File installed, Collection repoPackagesUrls) - throws IOException { - super(installed, repoPackagesUrls); - } - - @Override - public String getPackageListFileName() { - return Config.PACKAGE_LIST_FILE_MACOS_64; - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/linux/LinuxPackageManager.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/linux/LinuxPackageManager.java deleted file mode 100644 index 59f7390..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/linux/LinuxPackageManager.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.tizen.installmanager.pkg.lib.linux; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.pkg.lib.PackageManager; - -/** - * Package Manager for linux. - *

- * This class provides various methods for managing packages. - * Most of the methods handle packages symbolically. Namely, they are identified by its package name not the object if not specially mentioned. - *

- * Some methods are carefully designed to preserve the order of packages because the order of packages is important sometimes. - * See the details in the documentation of each methods. - * - * @author Shihyun Kim - * - */ -public class LinuxPackageManager extends PackageManager { - public LinuxPackageManager(File installed, Collection repoPackagesUrls) - throws IOException { - super(installed, repoPackagesUrls); - } - - @Override - public String getPackageListFileName() { - if (Options.platFormBit != 0) { - if (Options.platFormBit == 32) { - return Config.PACKAGE_LIST_FILE_LINUX_32; - } else if (Options.platFormBit == 64){ - return Config.PACKAGE_LIST_FILE_LINUX_64; - } - } - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32) { - return Config.PACKAGE_LIST_FILE_LINUX_32; - } else { - return Config.PACKAGE_LIST_FILE_LINUX_64; - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/win/WindowsPackageManager.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/win/WindowsPackageManager.java deleted file mode 100644 index e0aa73c..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/lib/win/WindowsPackageManager.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.tizen.installmanager.pkg.lib.win; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.pkg.lib.PackageManager; - -/** - * Package Manager for windows - *

- * This class provides various methods for managing packages. - * Most of the methods handle packages symbolically. Namely, they are identified by its package name not the object if not specially mentioned. - *

- * Some methods are carefully designed to preserve the order of packages because the order of packages is important sometimes. - * See the details in the documentation of each methods. - * - * @author Shihyun Kim - * - */ -public class WindowsPackageManager extends PackageManager { - - public WindowsPackageManager (File installed, - Collection repoPackagesUrls) throws IOException { - super(installed, repoPackagesUrls); - } - - @Override - public String getPackageListFileName() { - if (Options.platFormBit != 0) { - if (Options.platFormBit == 32) { - return Config.PACKAGE_LIST_FILE_WINDOWS_32; - } else if (Options.platFormBit == 64){ - return Config.PACKAGE_LIST_FILE_WINDOWS_64; - } - } - if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32) { - return Config.PACKAGE_LIST_FILE_WINDOWS_32; - } else { - return Config.PACKAGE_LIST_FILE_WINDOWS_64; - } - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/ConfigFile.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/ConfigFile.java deleted file mode 100644 index 4b63aa8..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/ConfigFile.java +++ /dev/null @@ -1,473 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.pkg.model; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.List; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.pkg.lib.PropertyParser; - -/** - * This class describes the installmanager.conf file. - * - * @author Shihyun Kim - * - */ -public class ConfigFile { - private static final String FIELD_REPOSITORY = "Repository"; - private static final String FIELD_Distribution = "Distribution"; - private static final String FIELD_PACKAGE_SERVER = "Package-Server"; - private static final String FIELD_EXTENSION_SERVER = "Extension-Server"; - private static final String FIELD_BUILT_IN_EXTENSION_SERVER = "Built-in-Extension-Server"; - private static final String FIELD_INSTALLMANAGER_REPOSITORY = "InstallManager-Repository"; - private static final String FIELD_INSTALLMANAGER_VERSION = "InstallManager-Version"; - private static final String FIELD_PROXY_SERVER = "Proxy-server"; - private static final String FIELD_PROXY_PORT = "Proxy-port"; - private static final String FIELD_SNAPSHOT_PATH = "Snapshot-Path"; - private static final String FIELD_RELEASE_NOTE = "Release-note"; - - private Properties mProperties; - private String mConfigFilePath; - - public ConfigFile(String confPath) { - mProperties = new Properties(); - if (!loadConfigFile(confPath)) { - Log.err("Fail to load config file in this path : " + confPath); - ErrorController.setError(ErrorCode.CANNOT_FIND_CONFIG_FILE); - } else { - Log.log("Success to load config file in this path : " + confPath); - } - } - - /** - * @return Repository of package list to install. - */ - public String getRepository() { - return getValue(FIELD_REPOSITORY); - } - - /** - * @return Repository of package list to install. - */ - public String getDistribution() { - return getValue(FIELD_Distribution); - } - - /** - * @return Repository of installmanager to update installmanager's binary - */ - public String getInstallManagerRepository() { - return getValue(FIELD_INSTALLMANAGER_REPOSITORY); - } - - /** - * @return Version of installmanager - */ - public String getInstallManagerVersion() { - return getValue(FIELD_INSTALLMANAGER_VERSION); - } - - /** - * @return Version of installmanager - */ - public String getReleaseNoteUrl() { - return getValue(FIELD_RELEASE_NOTE); - } - - /** - * @return proxy-server for connecting to repository. - */ - public String getProxyServer() { - return getValue(FIELD_PROXY_SERVER); - } - - /** - * Set proxy server ip. - * - * @param proxyServer - */ - public void setProxyServer(String proxyServer) { - Property property = getProperty(ConfigFile.FIELD_PROXY_SERVER); - - if (property != null) { - property.setValue(proxyServer); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_PROXY_SERVER); - property.setValue(proxyServer); - - mProperties.add(property); - } - } - - /** - * @return port number for proxy. -1 if not specified. - */ - public int getProxyPort() { - String proxyPortStr = getValue(FIELD_PROXY_PORT); - try { - if (!proxyPortStr.isEmpty()) { - return Integer.parseInt(proxyPortStr); - } else { - return -1; - } - } catch (NumberFormatException e) { - Log.log("Invalid proxy port"); - return -1; - } - } - - /** - * Set proxy port - * - * @param proxyPort - */ - public void setProxyPort(String proxyPort) { - Property property = getProperty(ConfigFile.FIELD_PROXY_PORT); - - if (property != null) { - property.setValue(proxyPort); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_PROXY_PORT); - property.setValue(proxyPort); - - mProperties.add(property); - } - } - - /** - * @return Package-server for downloading packages. - */ - public String getPackageServer() { - return getValue(FIELD_PACKAGE_SERVER); - } - - /** - * Set package server - * - * @param packageServer package server address. - */ - public void setPackageServer(String packageServer) { - Property property = getProperty(ConfigFile.FIELD_PACKAGE_SERVER); - - if (property != null) { - property.setValue(packageServer); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_PACKAGE_SERVER); - property.setValue(packageServer); - - mProperties.add(property); - } - } - - /** - * @return snapshot path from repository. - */ - public String getSnapshotPath() { - return getValue(FIELD_SNAPSHOT_PATH); - } - - /** - * Set snapshot path from repository - * - * @param snapshot path. - */ - public void setSnapshotPath(String snapshotPath) { - Property property = getProperty(ConfigFile.FIELD_SNAPSHOT_PATH); - - if (property != null) { - property.setValue(snapshotPath); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_SNAPSHOT_PATH); - property.setValue(snapshotPath); - - mProperties.add(property); - } - } - - /** - * @return Built-in Extension-server for downloading packages. - */ - public String getBuiltInExtensionServer() { - return getValue(FIELD_BUILT_IN_EXTENSION_SERVER); - } - - /** - * @return Extension-server for downloading packages. - */ - public String getExtensionServer() { - return getValue(FIELD_EXTENSION_SERVER); - } - - /** - * Set package server - * - * @param packageServer package server address. - */ - public void setExtensionServer(String extensionServer) { - Property property = getProperty(ConfigFile.FIELD_EXTENSION_SERVER); - - if (property != null) { - property.setValue(extensionServer); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_EXTENSION_SERVER); - property.setValue(extensionServer); - - mProperties.add(property); - } - } - - /** - * Get Property instance from configuration key. - * - * @param key - * @return - */ - private Property getProperty(String key) { - if (mProperties != null && key != null) { - for (int i = 0; i < mProperties.size(); i++) { - if (key.compareTo(mProperties.get(i).getName()) == 0) { - return mProperties.get(i); - } - } - } - return null; - } - - /** - * @param key - * @return Get value from configuration key. - */ - public String getValue(String key) { - Property property = getProperty(key); - - if (property != null) { - return property.getValue(); - } else { - return ""; - } - } - - /** - * Get properties instance from this class - * - * @return - */ - public Properties getProperties() { - return mProperties; - } - - /** - * Set Properties instance to this class. - * - * @param properties - */ - public void setProperties(Properties properties) { - this.mProperties = properties; - } - - /** - * Set installmanager's version - * - * @param version - */ - public void setInstallManagerVersion(String version) { - Property property = getProperty(ConfigFile.FIELD_INSTALLMANAGER_VERSION); - - if (property != null) { - property.setValue(version); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_INSTALLMANAGER_VERSION); - property.setValue(version); - - mProperties.add(property); - } - } - - /** - * Get sdk repository. - * @param repository - */ - public void setRepository(String repository) { - Property property = getProperty(ConfigFile.FIELD_REPOSITORY); - - if (property != null) { - property.setValue(repository); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_REPOSITORY); - property.setValue(repository); - - mProperties.add(property); - } - } - - /** - * Get current distribution in repository. - * @param distribution - */ - public void setDistribution(String distribution) { - Property property = getProperty(ConfigFile.FIELD_Distribution); - - if (property != null) { - property.setValue(distribution); - } else { - property = new Property(); - property.setName(ConfigFile.FIELD_Distribution); - property.setValue(distribution); - - mProperties.add(property); - } - } - - /** - * Load config file from configFilePath. - * - * @param configFilePath - * @return - */ - private boolean loadConfigFile(String configFilePath) { - List propertySections = null; - - File configFile = new File(configFilePath); - - if (!configFile.exists()) { - return false; - } else { - setConfigPath(configFilePath); - } - - PropertyParser parser = new PropertyParser(); - propertySections = parser.readFromFile(configFilePath); - - return loadFromProperties(propertySections); - } - - /** - * Read PropertySection and make ConfigFile instance - * - * @param propertySections - * @return - */ - public boolean loadFromProperties(List propertySections) { - if ((propertySections == null) || (propertySections.size() == 0)) { - Log.log("(propertySections == null) || (propertySections.size() == 0)"); - return false; - } - - this.setProperties(propertySections.get(0).getProperties()); - return true; - } - - /** - * save config file to configFilePath. - * - * @param configFilePath - * config file path - */ - public void saveConfig(String configFilePath) { - Log.log("Config save config start => " + configFilePath); - if (this == null) { - Log.err("No config object"); - return; - } else { - } - - if (configFilePath == null || configFilePath.equals("")) { - Log.err("Invalid config file path"); - return; - } - - File configFile = new File(configFilePath); - if (configFile.exists()) { - configFile.delete(); - } - - File parentDir = configFile.getParentFile(); - if (!parentDir.exists()) { - parentDir.mkdirs(); - } else { - } - - try { - configFile.createNewFile(); - } catch (IOException e1) { - Log.err("Cannot create config file => " + configFilePath); - throw new IMFatalException(ErrorCode.CANNOT_SAVE_CONFIG); - } - - BufferedWriter writer = null; - try { - writer = new BufferedWriter(new FileWriter(configFile)); - - Properties repoProperties = this.getProperties(); - for (int i = 0; i < repoProperties.size(); i++) { - writer.write(repoProperties.get(i).getName() + ": " - + repoProperties.get(i).getValue() + "\n"); - } - - writer.write("\n"); - } catch (IOException e) { - Log.err("Cannot write config file"); - throw new IMFatalException(ErrorCode.CANNOT_SAVE_CONFIG); - } finally { - try { - if (writer != null) { - writer.close(); - } - } catch (IOException e) { - Log.err("close fileoutput fail"); - } - } - Log.log("Config save config end"); - } - - private void setConfigPath(String configPath) { - mConfigFilePath = configPath; - } - - /** - * @return Config file path that installer is using config file now. - */ - public String getConfigPath() { - return mConfigFilePath; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Distribution.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Distribution.java deleted file mode 100644 index 846665f..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Distribution.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.pkg.model; - -import java.util.List; - -/** - * This class describes a distribution. - * This class cannot change variable. - * - * @author Shihyun Kim - * - */ -public class Distribution { - private static final String FIELD_NAME = "name"; - private static final String FIELD_DATE = "time"; - - private String repository = ""; - private List mProperties; - - /** - * Constructor. - * - * @param properties - * Set properties to member variable. - */ - public Distribution(String repo, List properties) { - this.repository = repo; - this.mProperties = properties; - } - - /** - * Get snapshot name. - * @return - */ - public String getName() { - return getValue(FIELD_NAME); - } - - /** - * Get intended date of snapshot - * @return - */ - public String getDate() { - return getValue(FIELD_DATE); - } - - /** - * Get Property instance from configuration key. - * - * @param key - * @return - */ - private Property getProperty(String key) { - for (Property prop : mProperties) { - if (prop.getName().equals(key)) { - return prop; - } - } - return null; - } - - /** - * @return List of Property instance. - */ - public List getProperties() { - return mProperties; - } - - public String getRepository() { - return this.repository; - } - - /** - * @param key - * @return string value of the property name. empty string if there's no - * such property name - */ - private String getValue(String key) { - Property property = getProperty(key); - if (property == null) { - return null; - } else { - return property.getValue(); - } - } - - public String toString() { - return getName(); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/DistributionSet.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/DistributionSet.java deleted file mode 100644 index 9f436c4..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/DistributionSet.java +++ /dev/null @@ -1,76 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -import java.util.LinkedHashSet; - -/** - * This class describes a snapshot list. - * - * @author Shihyun Kim - * - */ -@SuppressWarnings("serial") -public class DistributionSet extends LinkedHashSet{ - public final static DistributionSet EMPTY = new DistributionSet(); - - /** - * Finds and returns a snapshot in this set with the same name of the given snapshot. - * You have to check the existence with contains() method before calling this method. - * @param p0 - * @return a snapshot that has same name with the given snapshot. - * null when cannot find the snapshot - */ - public Distribution getDistribution(Distribution dist) { - for(Distribution d : this) { - if(d.equals(dist)) { - return d; - } - } - return null; - } - - /** - * @param snapshot Name - * @return snapshot object that has the snapshot name. - * null when cannot find the snapshot - */ - public Distribution getDistributionByName(String distName) { - for(Distribution d : this) { - String name = d.getName(); - - if (name != null) { - if(name.equals(distName)) { - return d; - } - } - } - return null; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/IMPackageNotFound.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/IMPackageNotFound.java deleted file mode 100644 index 12d3b9a..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/IMPackageNotFound.java +++ /dev/null @@ -1,55 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -/** - * This exception is thrown when a package is not found. - * - * @author Wooyoung Cho - * - */ -public class IMPackageNotFound extends Exception { - - private static final long serialVersionUID = -2065916984023295931L; - - private String packageName; - - public IMPackageNotFound(String name) { - this.packageName = name; - } - - /** - * @return Name of package that cannot be found. - */ - public String getPackageName() { - return packageName; - } - - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Package.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Package.java deleted file mode 100644 index 3c903a4..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Package.java +++ /dev/null @@ -1,501 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; - -/** - * This class describes a package. - * - * @author Wooyoung Cho - * - */ -public class Package { - - // fields of package control - // mandatory - public static final String FIELD_PACKAGE = "Package"; - public static final String FIELD_VERSION = "Version"; - public static final String FIELD_LABEL = "Label"; - public static final String FIELD_MAINTAINER = "Maintainer"; - public static final String FIELD_DESCRIPTION = "Description"; - - // etc - public static final String FIELD_DEPENDS = "Install-dependency"; // list of packages that this package depends on - public static final String FIELD_CONFLICTS = "Conflicts"; - public static final String FIELD_PACKAGE_SIZE = "Size"; // size of zipped package - // public static final String FIELD_INSTALLEDSIZE = "Installed-Size"; // TODO implement - - // fields of installed control - public static final String FIELD_ATTRIBUTE = "Attribute"; - - // fields of repository control - public static final String FIELD_SHA256 = "SHA256"; - public static final String FIELD_FILE_PATH = "Path"; // path from the base url - - // fields of ordering for UI - public static final String FIELD_ORDER = "C-Order"; - - // field of Partner SDK - public static final String FIELD_PARTNER = "C-Partner"; - - // fields of script - public static final String INSTALL_SCRIPT_LINUX = "install.sh"; - public static final String REMOVE_SCRIPT_LINUX = "remove.sh"; - public static final String INSTALL_SCRIPT_WINDOWS = "Install.bat"; - public static final String REMOVE_SCRIPT_WINDOWS = "Remove.bat"; - - // fields of ui control - public static final String FIELD_DEFAULT_CHECK = "Default"; - - //field of extension server. this field is used by installed list. - public static final String FIELD_EXTENSION_SERVER = "Extension-server"; - - // attribute value - private static final String ATTRIBUTE_ROOT_META = "root"; - private static final String ATTRIBUTE_EXTRA_META = "extra"; - private static final String ATTRIBUTE_INSTALL_META = "install"; - private static final String ATTRIBUTE_MANDATORY = "mandatory"; - private static final String ATTRIBUTE_PARTNER = "partner"; - private static final String ATTRIBUTE_PUBLIC = "public"; - - //dependency information - private final String START_OF_OS_DEPENDENCY = "["; - - private List mProperties; - private URL url; // url to the package zip file - - private final int LOWEST_ORDER = 100; - - public Package(List properties) { - this.mProperties = properties; - } - - /** - * Make url of package. - * @param properties package - * @param repoBaseUrl url before snapshot path. - */ - public Package(Properties properties, String repoBaseUrl) { - this(properties); - try { - if (Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) { // data from file dialog for local installing - this.url = new URL(repoBaseUrl + "/" + getValue(FIELD_FILE_PATH)); - } else { // data from snapshot and normal 'next' case - this.url = new URL(repoBaseUrl + "/" + getValue(FIELD_FILE_PATH)); - } - } catch (MalformedURLException e) { - Log.err("Invalid package url: "+repoBaseUrl + "/" + getValue(FIELD_FILE_PATH)); - throw new IMFatalException(ErrorCode.WRONG_PACKAGE_URL); - } - } - - /** - * @return version of this package - */ - public Version getVersion() { - return new Version(getValue(FIELD_VERSION)); - } - - /** - * @return package name of this package - */ - public String getPackageName() { - return getValue(FIELD_PACKAGE); - } - - /** - * @return name of package. - */ - public String getLabel() { - return getValue(FIELD_LABEL); - } - - /** - * @return the size of zipped package file - */ - public Long getPackageSize() { - long result = 0; - try { - result = Long.parseLong(getValue(FIELD_PACKAGE_SIZE)); - } catch(NumberFormatException e) { - Log.err(toString() + " size do not exist."); - Log.ExceptionLog(e); - } - - return result; - } - - /** - * @return Path of this package File from repository. - */ - public String getFileName() { - return getValue(FIELD_FILE_PATH); - } - - /** - * @return Description of this package. - */ - public String getDescription() { - return getValue(FIELD_DESCRIPTION); - } - - /** - * @return SHA256 digest of this package file. - */ - public String getSHA256() { - return getValue(FIELD_SHA256); - } - - /** - * @return URL to the package file in repository. - */ - public URL getURL() { - return url; - } - - public String getPartner() { - return getValue(FIELD_PARTNER); - } - - /** - * @return Extension server of this package. - */ - public String getExtensionServer() { - return getValue(FIELD_EXTENSION_SERVER); - } - - /** - * Set extension server to package information. - * @param extensionServer extension server of this packge - */ - public void setExtensionServer(String extensionServer) { - Property property = getProperty(FIELD_EXTENSION_SERVER); - - if (property != null) { - property.setValue(extensionServer); - } else { - property = new Property(); - property.setName(FIELD_EXTENSION_SERVER); - property.setValue(extensionServer); - - mProperties.add(property); - } - } - /** - * Get package order for InstallManager displaying package tree. - * @return package order - */ - public int getOrder() { - String order = getValue(FIELD_ORDER); - if (order.equals("")) { - return LOWEST_ORDER; - } else { - int nOrder = 0; - try { - nOrder = Integer.parseInt(order); - } catch (NumberFormatException e) { - Log.err("C-Order field value is not a integer format."); - return 100; - } - return nOrder; - } - } - - /** - * @return Remove Script name of this package. - */ - public String getRemoveScript() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - return REMOVE_SCRIPT_LINUX; - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return REMOVE_SCRIPT_WINDOWS; - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - return ""; - } else {} - return null; - } - - /** - * @return Install script name of this package. - */ - public String getInstallScript() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_32) { - return INSTALL_SCRIPT_LINUX; - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return INSTALL_SCRIPT_WINDOWS; - } else {} - return null; - } - - /** - * @return List of Property instance. - */ - public List getProperties() { - return mProperties; - } - - /** - * Get Property instance from key. - * - * @param key - * @return - */ - private Property getProperty(String key) { - if (mProperties != null && key != null) { - for (int i = 0; i < mProperties.size(); i++) { - if (key.compareTo(mProperties.get(i).getName()) == 0) { - return mProperties.get(i); - } - } - } - return null; - } - - /** - * @param propertyName - * @return string value of the property name. empty string if there's no such property name - */ - private String getValue(String propertyName) { - for(Property prop : mProperties) { - if(prop.getName().equals(propertyName)) { - return prop.getValue(); - } - } - return ""; - } - - /** - * @return Attribute value. - */ - public String getAttribute() { - return getValue(FIELD_ATTRIBUTE); - } - - /** - * @return true if this package is a meta package. - */ - public boolean isMeta() { - // onlyDownload option, in this case, do not need separate public meta package - // to partner meta package because installmanager should download all meta packages. - if (Options.onlyDownload) { - if (isRootMeta() || isInstallMeta() || isExtraMeta() || - isPublicMeta() || isPartnerMeta() || isMandatory()) { - return true; - } else { - return false; - } - } - - if (!Options.partnerSdk) { // public download case - if (isRootMeta() || isInstallMeta() || isExtraMeta() || isMandatory() || isPublicMeta()) { - return true; - } else { - return false; - } - } else { // partner download case - if (isRootMeta() || isInstallMeta() || isExtraMeta() || isMandatory() || isPartnerMeta()) { - return true; - } else { - return false; - } - } - } - - /** - * @return true if this package is a root meta package. - */ - public boolean isRootMeta() { - String attributeValue = getAttribute().trim(); - - if (attributeValue.equalsIgnoreCase(ATTRIBUTE_ROOT_META)) { - return true; - } else { - return false; - } - } - - /** - * @return true if this package is a extra meta package. - */ - public boolean isExtraMeta() { - String attributeValue = getAttribute().trim(); - - if (attributeValue.equalsIgnoreCase(ATTRIBUTE_EXTRA_META)) { - return true; - } else { - return false; - } - } - - /** - * Check to belong to partner sdk given package - * @return true if this package is a partner package. - */ - public boolean isPartnerMeta() { - String attributeValue = getAttribute().trim(); - - if (attributeValue.equalsIgnoreCase(ATTRIBUTE_PARTNER)) { - return true; - } else { - return false; - } - } - - /** - * Check to belong to partner sdk given package - * @return true if this package is a partner package. - */ - public boolean isPublicMeta() { - String attributeValue = getAttribute().trim(); - - if (attributeValue.equalsIgnoreCase(ATTRIBUTE_PUBLIC)) { - return true; - } else { - return false; - } - } - - /** - * @return true if this meta package is a install meta package. - */ - public boolean isInstallMeta() { - String attributeValue = getAttribute().trim(); - - if (attributeValue.equalsIgnoreCase(ATTRIBUTE_INSTALL_META)) { - return true; - } else { - return false; - } - } - - /** - * @return true, if this package is a mandatory package. This package must install. - */ - public boolean isMandatory() { - String attributeValue = getAttribute().trim(); - - if (attributeValue.equalsIgnoreCase(ATTRIBUTE_MANDATORY)) { - return true; - } else { - return false; - } - } - - public boolean isExtensionPackage() { - String extensionServer = getExtensionServer(); - - if (extensionServer == null || extensionServer.isEmpty()) { - return false; - } else { - return true; - } - } - - /** - * @return package names that this package directly depends on - */ - public Collection getDependentPackageNames() { - HashSet depends = new HashSet(); - String dependsStr = getValue(FIELD_DEPENDS); - String deps[] = dependsStr.split(","); - for(int i = 0; i < deps.length; i++) { - String dep = removeOSInformationOfDepends(deps[i]); - - if(!dep.isEmpty()) { - depends.add(dep); - } - } - return depends; - } - - private String removeOSInformationOfDepends(String info) { - //Log.log("Package.removeOSInformation (info => " + info + ")"); - - if (info.contains(START_OF_OS_DEPENDENCY)) { - int index = info.indexOf(START_OF_OS_DEPENDENCY); - String pkgInfo = info.substring(0, index).trim(); - - return pkgInfo; - } else { - return info.trim(); - } - } - - /** - * @return package names that this package directly conflicts to - */ - public Collection getConflictPackageNames() { - HashSet conflicts = new HashSet(); - String conflictsStr = getValue(FIELD_CONFLICTS); - String confs[] = conflictsStr.split(","); - for(int i = 0; i < confs.length; i++) { - conflicts.add(confs[i].trim()); - } - return conflicts; - } - - public String toString() { - return getPackageName(); - } - - /** - * Checks equality symbolically only using their package names. - * @return true if they have the same package name. - */ - public boolean equals(Object obj) { - if (obj instanceof Package) { - Package pkg2 = (Package)obj; - return this.getPackageName().equals(pkg2.getPackageName()); - } else { - return false; - } - } - - public int hashCode() { - return getPackageName().hashCode(); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/PackageSet.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/PackageSet.java deleted file mode 100644 index 37c9b45..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/PackageSet.java +++ /dev/null @@ -1,120 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -import java.util.Collection; -import java.util.LinkedHashSet; - - -/** - * This class represents a set of packages. - * Even though this is a set, it preserves the order that elements are added. Iteration on this set will be in the order elements are added. - * - * @author Wooyoung Cho - */ -@SuppressWarnings("serial") -public class PackageSet extends LinkedHashSet{ - public final static PackageSet EMPTY = new PackageSet(); - - /** - * Finds and returns a package in this set with the same name of the given package. - * You have to check the existence with contains() method before calling this method. - * @param p0 - * @return a package that has same name with the given package. - * null when cannot find the package - */ - public Package getPackage(Package p0) { - for(Package p : this) { - if(p.equals(p0)) { - return p; - } - } - return null; - } - - /** - * @param packageName - * @return package object that has the package name. - * null when cannot find the package - */ - public Package getPackageByName(String packageName) { - if (packageName == null) { - return null; - } - - for(Package p : this) { - if(p.getPackageName().equals(packageName)) { - return p; - } - } - return null; - } - - /** - * @param packageName - * @return true if there's a package with the package name - */ - public boolean hasPackageByName(String packageName) { - for(Package p : this) { - if(p.getPackageName().equals(packageName)) { - return true; - } - } - return false; - } - - /** - * exist pkg in this package set. - * @param package instance - * @return true if there's a package. - */ - public boolean hasPackage(Package pkg) { - if (getPackage(pkg) == null) { - return false; - } else { - return true; - } - } - - /** - * @param names - * @return packages that have the names among this package set. - * @throws IMPackageNotFound thrown if any one of the name is not found. - */ - public PackageSet getPackagesByNames(Collection names) throws IMPackageNotFound { - PackageSet pset = new PackageSet(); - for(String name : names) { - Package pkg = getPackageByName(name); - if(pkg != null) { - pset.add(pkg); - } - } - return pset; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Properties.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Properties.java deleted file mode 100644 index 825a4db..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Properties.java +++ /dev/null @@ -1,41 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -import java.util.ArrayList; - -/** - * This class describes list of property. - * @author Shihyun Kim - * - */ -@SuppressWarnings("serial") -public class Properties extends ArrayList{ - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Property.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Property.java deleted file mode 100644 index 2f9350b..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Property.java +++ /dev/null @@ -1,73 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -/** - * This class can describes a key and a value from data. - * - * @author Shihyun Kim - * - */ -public class Property { - - private String mName; - private String mValue; - - /** - * @return Name of data. - */ - public String getName() { - return mName; - } - /** - * Set name of data. - * @param name - */ - public void setName(String name) { - this.mName = name; - } - - /** - * @return Value of data. - */ - public String getValue() { - return mValue; - } - /** - * Set value of data - * @param value - */ - public void setValue(String value) { - this.mValue = value; - } - - public String toString() { - return mName+":"+mValue; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/PropertySection.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/PropertySection.java deleted file mode 100644 index a31876e..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/PropertySection.java +++ /dev/null @@ -1,58 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -/** - * This class describes a data section. It means that a data set is saved in this instance. - * @author Shihyun Kim - * - */ -public class PropertySection { - - private Properties mProperties; - - /** - * Set Properties instance - * @param properties - */ - public void setProperties(Properties properties) { - mProperties = properties; - } - - /** - * @return Properties instance - */ - public Properties getProperties() { - return mProperties; - } - - public String toString() { - return "SECTION"+mProperties; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Snapshot.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Snapshot.java deleted file mode 100644 index 66c20c6..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Snapshot.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.pkg.model; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; - -import org.tizen.installmanager.lib.Log; - -/** - * This class describes a snapshot. - * - * @author Shihyun Kim - * - */ -public class Snapshot implements Comparable { - private static final String FIELD_TYPE = "type"; - private static final String FIELD_NAME = "name"; - private static final String FIELD_PATH = "path"; - private static final String FIELD_TIME = "time"; - - private List mProperties; - - /** - * Constructor. - * - * @param properties - * Set properties to member variable. - */ - public Snapshot(List properties) { - this.mProperties = properties; - } - - /** - * Get snapshot type. - * @return - */ - public String getType() { - return getValue(FIELD_TYPE); - } - - /** - * Get snapshot name. - * @return - */ - public String getName() { - return getValue(FIELD_NAME); - } - - /** - * Get snapshot path. - * @return - */ - public String getPath() { - return getValue(FIELD_PATH); - } - - /** - * Get intended date of snapshot - * @return - */ - public Date getTime() { - String strDate = getValue(FIELD_TIME); - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); - Date date = null; - try { - date = sdf.parse(strDate); - } catch (ParseException e) { - Log.err("Snapshot time attribute is not SimpleDateFormat."); - } - //Date date = new Date(lDate); - return date; - } - - /** - * Get Property instance from configuration key. - * - * @param key - * @return - */ - private Property getProperty(String key) { - for (Property prop : mProperties) { - if (prop.getName().equals(key)) { - return prop; - } - } - return null; - } - - /** - * @return List of Property instance. - */ - public List getProperties() { - return mProperties; - } - - /** - * Set Properties instance to this class. - * - * @param properties - */ - public void setProperties(List properties) { - this.mProperties = properties; - } - - /** - * @param key - * @return string value of the property name. empty string if there's no - * such property name - */ - private String getValue(String key) { - Property property = getProperty(key); - if (property == null) { - return null; - } else { - return property.getValue(); - } - } - - @Override - public String toString() { - return getName(); - } - - @Override - public boolean equals(Object arg) { - if (arg != null) { - String argName = ((Snapshot)arg).getName(); - - if (argName.equals(getName())){ - return true; - } else { - return false; - } - } else { - return false; - } - } - - @Override - public int compareTo(Snapshot snapshot) { - //Descending sort. - Date argTime = ((Snapshot)snapshot).getTime(); - return argTime.compareTo(getTime()); - } - - @Override - public int hashCode() { - assert false : "hashCode not designed"; - return 42; // any arbitrary constant will do - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/SnapshotList.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/SnapshotList.java deleted file mode 100644 index 815ee74..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/SnapshotList.java +++ /dev/null @@ -1,81 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -import java.util.ArrayList; - -/** - * This class describes a snapshot list. - * - * @author Shihyun Kim - * - */ -@SuppressWarnings("serial") -public class SnapshotList extends ArrayList { - public final static SnapshotList EMPTY = new SnapshotList(); - - /** - * Finds and returns a snapshot in this list with the same name of the given snapshot. - * You have to check the existence with contains() method before calling this method. - * @param p0 - * @return a snapshot that has same name with the given snapshot. - * null when cannot find the snapshot - */ - public Snapshot getSnapshot(Snapshot snapshot) { - for(Snapshot s : this) { - if(s.equals(snapshot)) { - return s; - } - } - return null; - } - - /** - * @param snapshot Name - * @return snapshot object that has the snapshot name. - * null when cannot find the snapshot - */ - public Snapshot getSnapshotByName(String snapshotName) { - for(Snapshot s : this) { - if(s.getName().equals(snapshotName)) { - return s; - } - } - return null; - } - - public Snapshot getSnapshotByPath(String snapshotPath) { - for(Snapshot s : this) { - if(s.getPath().equals(snapshotPath)) { - return s; - } - } - return null; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Version.java b/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Version.java deleted file mode 100644 index db29571..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/pkg/model/Version.java +++ /dev/null @@ -1,227 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.pkg.model; - -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; - - -/** - * This class represents and manages a version. - * Version must contains at least one up to three numbers concatenated by periods(.). - * Namely, (MajorVersion).(MinorVersion).(Revision) - * - * @author Shihyun Kim - */ -public class Version { - - public static final int EQ = 0; - public static final int LT = -1; - public static final int GT = 1; - - private Integer mMajor = 0; - private Integer mMinor = 0; - private Integer mRevision = 0; - - - /** - * @param version string representation of version - */ - public Version(String version) { - parseVersionString(version); - } - - /** - * @param major major version. this cannot be null. - * @param minor minor version. this can be null. - * @param revision revision. this can be null. - */ - public Version(Integer major, Integer minor, Integer revision) { - this.mMajor = major; - this.mMinor = minor; - this.mRevision = revision; - } - - public static Version create(String aVersion) { - if (aVersion == null) { - return null; - } - Version version = new Version(aVersion); - return version; - } - - /** - * Seperate major, minor and revision from full version and parsing to Integer. - * @param version full version. - */ - private void parseVersionString(String version) { - if (version == null || version.isEmpty()) { - return; - } - String[] dividedVersion = version.split("\\."); - int length = dividedVersion.length; - - if (length < 1 || length > 3) { - Log.err("Invalid package version: "+version); - throw new IMFatalException(ErrorCode.INVALID_PACKAGE_VERSION); - } - - try { - mMajor = Integer.parseInt(dividedVersion[0]); - if(length > 1) { - mMinor = Integer.parseInt(dividedVersion[1]); - } - if(length > 2) { - mRevision = Integer.parseInt(dividedVersion[2]); - } - } catch (NumberFormatException numException) { - Log.err("Invalid package version: "+version); - throw new IMFatalException(ErrorCode.INVALID_PACKAGE_VERSION); - } - } - - /** - * @return major version. - */ - public Integer getMajorVersion() { - return mMajor; - } - - /** - * @return minor version. null means that it's unspecified. - */ - public Integer getMinorVersion() { - return mMinor; - } - - /** - * @return revision. null means that it's unspecified. - */ - public Integer getRevision() { - return mRevision; - } - - /** - * Call compareTo(Version firstVer, Version secondVer) func. - * @param firstVer - * @param secondVer - * @return - */ - public static int compareVersion(String firstVer, String secondVer){ - return compareTo(new Version(firstVer), new Version(secondVer)); - } - - /** - * Compare two versions. - * This function compare major version at first and minor version at second and revision at last. - * Unspecified version component is considered zero. - * @param v1 version 1 - * @param v2 version 2 - * @return 0 means equal. negative means v1 is less than v2. - * positive means v1 is greater than v2. - */ - public static int compareTo(Version v1, Version v2) { - int result = Version.EQ; - - result = compareVersionComponent(v1.getMajorVersion(), v2.getMajorVersion()); - if (result == Version.EQ) { - result = compareVersionComponent(v1.getMinorVersion(), v2.getMinorVersion()); - if (result == Version.EQ) { - result = compareVersionComponent(v1.getRevision(), v2.getRevision()); - return result; - } - } - return result; - } - - /** - * Call compareTo(Version this, Version version) - * @param version - * @return - */ - public int compareTo(Version version) { - // return > 0 if this.version > version - // return < 0 if this.version < version - // return 0 if this.version == version - - return compareTo(this, version); - } - - public int compareTo(String version) { - // return > 0 if this.version > version - // return < 0 if this.version < version - // return 0 if this.version == version - - Version ver2 = new Version(version); - return compareTo(ver2); - } - - /** - * Compare two version components. - * null is considered zero. - * @param vc1 version component 1 - * @param vc2 version component 2 - * @return 0 means equal. negative means vc1 is less than vc2. - * positive means vc1 is greater than vc2. - */ - private static int compareVersionComponent(Integer vc1, Integer vc2) { - if(vc1 == null) { - if(vc2 == null) { - return EQ; - } else { - return LT; - } - } else { - if(vc2 == null) { - return GT; - } else { - if (vc1 > vc2) { - return Version.GT; - } else if (vc1 < vc2) { - return Version.LT; - } else { - return Version.EQ; - } - } - } - } - - public String toString() { - String version = mMajor.toString(); - if(mMinor != null) { - version = version + "." + mMinor; - if(mRevision != null) { - version = version + "." + mRevision; - } - } - return version; - } - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/InstallManagerWindow.java b/SdkImageCreator/src/org/tizen/installmanager/ui/InstallManagerWindow.java deleted file mode 100644 index 0b7b96e..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/InstallManagerWindow.java +++ /dev/null @@ -1,879 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.window.ApplicationWindow; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StackLayout; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.RGB; -import org.eclipse.swt.layout.RowData; -import org.eclipse.swt.layout.RowLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMExitException; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.core.UpdateInstallManager; -import org.tizen.installmanager.lib.Documents; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IMError; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.ProgramController; -import org.tizen.installmanager.lib.Registry; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.Package; -import org.tizen.installmanager.pkg.model.PackageSet; -import org.tizen.installmanager.ui.dialog.AddExtraRepositoryDialog; -import org.tizen.installmanager.ui.dialog.IndeterminateProgressDialog; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType; -import org.tizen.installmanager.ui.model.Item; -import org.tizen.installmanager.ui.page.CompletePage; -import org.tizen.installmanager.ui.page.InstallableListPage; -import org.tizen.installmanager.ui.page.InstallingPage; -import org.tizen.installmanager.ui.page.LicensePage; -import org.tizen.installmanager.ui.page.SetInstallDirectoryPage; -import org.tizen.installmanager.ui.page.UninstallableListPage; -import org.tizen.installmanager.ui.page.UninstallingPage; -import org.tizen.installmanager.ui.page.UpdatableListPage; -import org.tizen.installmanager.ui.page.ViewController; -import org.tizen.installmanager.ui.page.WelcomePage; -import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor; -import org.tizen.installmanager.ui.page.WelcomePage.RADIO_ACTION; -import org.tizen.installmanager.util.PathUtil; - - -/** - * This class is main class for install manager. - * @author Taeyoung Son - */ -public class InstallManagerWindow extends ApplicationWindow { - public static final RGB RGB_BACKGROUND = new RGB(242, 242, 242); - - private static final Point POINT_MAIN_WINDOW = new Point(628, 478); - private static Image IMAGE_WINDOW_ICON; - private static Color COLOR_BACKGROUND; - - private static InstallManagerWindow window; - - private StackLayout sl_composite = new StackLayout(); - private static Button btnClose; - private static Button btnBack; - private static Button btnNext; - private static Button addExtraButton; - - private AddExtraRepositoryDialog extraDialog = null; - - private Composite pageComposite; - private WelcomePage compositeWelcomePage; - private LicensePage compositeLicensePage; - private InstallableListPage compositeInstallablePage; - private UninstallableListPage compositeUninstallablePage; - private InstallingPage compositeInstallingPage; - private UninstallingPage compositeUninstallingPage; - private CompletePage compositeCompletePage; - private SetInstallDirectoryPage compositeSetInstallDirectoryPage; - public UpdatableListPage compositeUpdatableListPage; - - private static ViewController controller; - private SelectionAdapter cancelBtnSelectionAdapter = null; - private SelectionAdapter closeBtnSelectionAdapter = null; - protected boolean cancelButtonClicked; - - /** - * Create the application window. - */ - public InstallManagerWindow() { - super(null); - setShellStyle(SWT.BORDER | SWT.TITLE); - } - - /** - * Get installmanager window background color. - * @return background color - */ - public static Color getBackgroundColor() { - if (COLOR_BACKGROUND == null) { - COLOR_BACKGROUND = new Color(null, RGB_BACKGROUND); - } - return COLOR_BACKGROUND; - } - - private static Image getWindowIconImage() { - if (IMAGE_WINDOW_ICON == null) { - IMAGE_WINDOW_ICON = PathUtil.getImageFromResource("/res/icons/SDK_icon.png"); - } - return IMAGE_WINDOW_ICON; - } - - private void init() throws IMExitException{ - Log.log("Window init start"); - - //make waiting dialog. - final IndeterminateProgressDialog progressbar = IndeterminateProgressDialog.getInstance(); - - final Shell shell = progressbar.getParent(); - shell.getDisplay().asyncExec(new Runnable(){ - public void run() { - //checking installmanager update. - if (Options.doUpdateInstallManager) { - progressbar.updateName("Checking InstallManager update.\nIt may take a minute..."); - shell.getDisplay().asyncExec(new Runnable() { - public void run() { - if (updateInstallManager()) { - Log.log("InstallManager is updatable."); - System.out.println("## Success to update the InstallManager, and restart now."); - ErrorController.isInstallManagerUpdatable = true; - return; - } - } - }); - } else {} - - //initialize installmanager - progressbar.updateName("Connecting to package server.\nIt may take a minute..."); - shell.getDisplay().asyncExec(new Runnable() { - public void run() { - if (!initInstallManager()) { - Log.err("InstallManager init fail."); - ErrorController.setInstallationSuccess(false); - } - } - - }); - - //init end - progressbar.finish(); - } - }); - - if (!shell.isDisposed()) { - progressbar.open(); - } - - if (ErrorController.isInstallManagerUpdatable) { - throw new IMExitException(Config.EXITCODE_HAS_SELF_UPDATE); - } - - Log.log("Window init end"); - } - - private boolean updateInstallManager() { - UpdateInstallManager upInstaller = new UpdateInstallManager(); - - return upInstaller.update(); - - } - - /** - * init IM's configuation and packages information. - * @return - */ - private boolean initInstallManager() { - ErrorController.setInstallationSuccess(true); - - controller = new ViewController(); - boolean bResult = controller.init(); - - return bResult; - } - - /** - * Create contents of the application window. - * - * @param parent - */ - @Override - protected Control createContents(Composite parent) { - - IMError.setComposite(parent); - Composite container = new Composite(parent, SWT.NONE); - container.setBackground(getBackgroundColor()); - RowLayout rl_container = new RowLayout(SWT.VERTICAL); - rl_container.spacing = 0; - rl_container.marginTop = 0; - rl_container.marginRight = 0; - rl_container.marginLeft = 0; - rl_container.marginBottom = 0; - container.setLayout(rl_container); - - pageComposite = new Composite(container, SWT.NONE); - pageComposite.setLayoutData(new RowData(619, 395)); - pageComposite.setLayout(sl_composite); - pageComposite.setBackground(InstallManagerWindow.getBackgroundColor()); - - Composite composite_1 = new Composite(container, SWT.NONE); - composite_1.setLayoutData(new RowData(619, 38)); - composite_1.setBackground(InstallManagerWindow.getBackgroundColor()); - - Label label = new Label(composite_1, SWT.SEPARATOR | SWT.HORIZONTAL); - label.setBounds(0, 0, 620, 2); - - btnClose = new Button(composite_1, SWT.NONE); - btnClose.setText("Cancel"); - cancelBtnSelectionAdapter = new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - int result = MessageBoxDlg.NO; - if (sl_composite.topControl == compositeInstallingPage) { - InstallProgressMonitor mon = compositeInstallingPage.getInstallProgressMonitor(); - mon.setCancelRequested(true); - result = MessageBoxDlg.showDlg( - e.display.getActiveShell(), - "Tizen SDK Install Manager", - "Are you sure you want to quit Install Manager?\n\nIf you click \"Yes\", the installation is stopped.", - DialogType.WARNING, false); - if (result == MessageBoxDlg.YES) { - mon.setCanceled(true); - } else { - mon.setCancelRequested(false); - } - return; - } else if (sl_composite.topControl == compositeUninstallingPage) { - result = MessageBoxDlg.showDlg( - e.display.getActiveShell(), - "Tizen SDK Install Manager", - "Are you sure to quit Install Manager?\n\nIf you click \"Yes\", the uninstallation is stopped.", - DialogType.WARNING, false); - } else if (sl_composite.topControl == compositeCompletePage) { - if (Documents.isChecked()) { - Documents.showChangeLog(); // show the change log(history) - } - result = MessageBoxDlg.YES; - } - else - result = MessageBoxDlg.showDlg(e.display.getActiveShell(), - "Tizen SDK Install Manager", - "Are you sure to quit Install Manager?", - DialogType.WARNING, false); - if (result == MessageBoxDlg.YES) { - e.display.close(); - } - } - }; - - closeBtnSelectionAdapter = new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent arg0) { - arg0.display.close(); - } - }; - - btnClose.addSelectionListener(cancelBtnSelectionAdapter); - btnClose.setBounds(531, 10, 78, 29); - - btnNext = new Button(composite_1, SWT.NONE); - btnNext.setText("Next"); - btnNext.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - if (sl_composite.topControl == compositeWelcomePage) { - addExtraButton.setVisible(false); - if (compositeWelcomePage.getSelectedRadioButton() == RADIO_ACTION.INSTALL) { - if (!ErrorController.checkInstallationSuccess()) - return; - btnNext.setEnabled(compositeLicensePage.getAcceptButton() - .getSelection()); - if (controller.existRemovablePackage()) // Update case - { - boolean hasItem = false; - - hasItem = compositeUpdatableListPage.loadPage(controller); - btnBack.setVisible(true); - addExtraButton.setVisible(true); - - if (hasItem) { - showComposite(compositeUpdatableListPage); - if (controller.existRemovablePackage()) { - btnNext.setText("Install"); - } - btnBack.setVisible(true); - } else { - btnBack.setVisible(false); - btnNext.setVisible(false); - } - } else { - showComposite(compositeLicensePage); - btnBack.setVisible(true); - } - } else if (compositeWelcomePage.getSelectedRadioButton() == RADIO_ACTION.UNINSTALL) { - int resultDialog = MessageBoxDlg.NO; - resultDialog = MessageBoxDlg.showDlg( - e.display.getActiveShell(), - "Tizen SDK Install Manager", - "Are you sure you want to remove the Tizen SDK?\n\nIf you click \"Yes\", the Tizen SDK is uninstalled.", - DialogType.WARNING, false); - if (resultDialog == MessageBoxDlg.YES) { - showComposite(compositeUninstallingPage); - btnBack.setVisible(false); - btnNext.setVisible(false); - btnClose.setEnabled(false); - addExtraButton.setVisible(false); - List items = compositeUninstallablePage.getItems(); - boolean result = compositeUninstallingPage.loadPage(getSelectedPackageNames(items) /* compositeInstallablePage.getCheckedPackageNames()*/, - controller, - window); - if (!result) { - showComposite(compositeWelcomePage); - btnBack.setVisible(true); - btnNext.setVisible(true); - btnClose.setEnabled(true); - } - } else { - return; - } - } - } else if (sl_composite.topControl == compositeLicensePage) { - boolean hasItem = compositeInstallablePage.loadPage(controller); - if (hasItem) { - showComposite(compositeInstallablePage); - btnNext.setEnabled(hasItem); - btnBack.setVisible(hasItem); - addExtraButton.setVisible(true); - if (controller.existRemovablePackage()) { - btnNext.setText("Install"); - } - } else { - // btnNext.setVisible(false); - // MessageBoxDlg.showDlg(Display.getCurrent().getShells()[0], - // "Information", - // "There is nothing to update.", - // DialogType.NOTIFY); - } - } else if (sl_composite.topControl == compositeInstallablePage) { - List items = compositeInstallablePage.getItems(); - if (getSelectedPackageNames(items).size() <= 0) { - return; - } - if (controller.existRemovablePackage()) { - btnBack.setVisible(false); - btnNext.setVisible(false); - showComposite(compositeInstallingPage); - addExtraButton.setVisible(false); - boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items), - controller, - Registry.getInstalledPath(), - window, true); - if (!result) { - showComposite(compositeInstallablePage); - btnBack.setVisible(true); - btnNext.setVisible(true); - btnClose.setEnabled(true); - addExtraButton.setVisible(true); - } - } else { - showComposite(compositeSetInstallDirectoryPage); - compositeSetInstallDirectoryPage.loadPage( - controller, - compositeInstallablePage.getCheckedPackageSize()); - btnNext.setText("Install"); - addExtraButton.setVisible(false); - } - } else if (sl_composite.topControl == compositeUpdatableListPage) { - List items = compositeUpdatableListPage.getItems(); - if (getSelectedPackageNames(items).size() <= 0) { - return; - } - if (controller.existRemovablePackage()) { - btnBack.setVisible(false); - btnNext.setVisible(false); - addExtraButton.setVisible(false); - showComposite(compositeInstallingPage); - boolean result = compositeInstallingPage.loadPage(getSelectedPackageNames(items), controller, Registry.getInstalledPath(), window, true); - - if (!result) { - showComposite(compositeUpdatableListPage); - btnBack.setVisible(true); - btnNext.setVisible(true); - btnClose.setEnabled(true); - addExtraButton.setVisible(true); - } - } else { - showComposite(compositeSetInstallDirectoryPage); - compositeSetInstallDirectoryPage.loadPage(controller, compositeInstallablePage.getCheckedPackageSize()); - btnNext.setText("Install"); - } - } else if (sl_composite.topControl == compositeSetInstallDirectoryPage) { - boolean installable = compositeSetInstallDirectoryPage.isInstallablePath(); - if (!installable) { - MessageBoxDlg.showDlg( - Display.getCurrent().getShells()[0], - "Error", - "Not enough disk space for the installation. Select a different installation path.", - DialogType.ERROR, false); - return; - } - btnBack.setVisible(false); - btnNext.setVisible(false); - addExtraButton.setVisible(false); - List items = compositeInstallablePage.getItems(); - showComposite(compositeInstallingPage); - boolean result = compositeInstallingPage.loadPage( - getSelectedPackageNames(items), - controller, - compositeSetInstallDirectoryPage.getInstallPath(), - window, false); - if (!result) { - showComposite(compositeInstallablePage); - btnBack.setVisible(true); - btnNext.setVisible(true); - btnClose.setEnabled(true); - } - } else if (sl_composite.topControl == compositeUninstallablePage) { - showComposite(compositeUninstallingPage); - btnBack.setVisible(false); - btnNext.setVisible(false); - btnClose.setEnabled(false); - addExtraButton.setVisible(false); - List items = compositeUninstallablePage.getItems(); - boolean result = compositeUninstallingPage.loadPage(getSelectedPackageNames(items) /* compositeInstallablePage.getCheckedPackageNames()*/, - controller, - window); - if (!result) { - showComposite(compositeUninstallablePage); - btnBack.setVisible(true); - btnNext.setVisible(true); - btnClose.setEnabled(true); - } - } - } - }); - btnNext.setBounds(447, 10, 78, 29); - - btnBack = new Button(composite_1, SWT.NONE); - btnBack.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - if (sl_composite.topControl == compositeLicensePage) { - btnNext.setEnabled(true); - btnBack.setVisible(false); - btnNext.setFocus(); - addExtraButton.setVisible(false); - showComposite(compositeWelcomePage); - } else if (sl_composite.topControl == compositeInstallablePage || sl_composite.topControl == compositeUpdatableListPage) { - compositeInstallablePage.getItems().clear(); - addExtraButton.setVisible(false); - if (controller.existRemovablePackage()) { - btnBack.setVisible(false); - showComposite(compositeWelcomePage); - } else { - showComposite(compositeLicensePage); - } - btnNext.setEnabled(true); - btnNext.setText("Next"); - } else if (sl_composite.topControl == compositeSetInstallDirectoryPage) { - showComposite(compositeInstallablePage); - addExtraButton.setVisible(true); - btnNext.setText("Next"); - btnNext.setEnabled(true); - } else if (sl_composite.topControl == compositeUninstallablePage) { - showComposite(compositeWelcomePage); - addExtraButton.setVisible(false); - btnNext.setText("Next"); - btnNext.setEnabled(true); - btnBack.setVisible(false); - } - } - }); - btnBack.setBounds(363, 10, 78, 29); - btnBack.setText("Back"); - btnBack.setVisible(false); - - setAddRepositoryButton(composite_1); - - compositeWelcomePage = new WelcomePage(pageComposite, SWT.NONE); - compositeLicensePage = new LicensePage(pageComposite, SWT.NONE); - compositeCompletePage = new CompletePage(pageComposite, SWT.NONE); - compositeInstallingPage = new InstallingPage(pageComposite, SWT.NONE); - compositeInstallablePage = new InstallableListPage(pageComposite, SWT.NONE); - compositeUninstallingPage = new UninstallingPage(pageComposite, SWT.NONE); - compositeUninstallablePage = new UninstallableListPage(pageComposite, SWT.NONE); - compositeSetInstallDirectoryPage = new SetInstallDirectoryPage(pageComposite, SWT.NONE); - compositeUpdatableListPage = new UpdatableListPage(pageComposite, SWT.NONE); - - registLicensePageListener(); - registCompletePageListener(); - - initWelcomePage(); - - return container; - } - - /** - * Set add Repository button. - */ - private void setAddRepositoryButton(final Composite composite) { - if (addExtraButton == null) { - addExtraButton = new Button(composite ,SWT.NONE); - } - - addExtraButton.setBounds(20, 10, 125, 29); - addExtraButton.setText("Add Repository"); - addExtraButton.setVisible(false); - - addExtraButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - extraDialog = new AddExtraRepositoryDialog(composite.getShell()); - int ret = extraDialog.open(); - - if (ret != 0) { - Log.err("Cannot open extra dialog"); - } else { - if (sl_composite.topControl == compositeInstallablePage) { - compositeInstallablePage.addExtensionPackagesToExtra(extraDialog.getPackagesFromExtraRepository()); - } else if (sl_composite.topControl == compositeUpdatableListPage) { - compositeUpdatableListPage.addExtensionPackagesToExtra(extraDialog.getPackagesFromExtraRepository()); - } - } - } - }); - } - - private void initWelcomePage() { - compositeWelcomePage.setViewController(controller); - - if (ErrorController.checkInstallationSuccess()) { - compositeWelcomePage.setTitle(WelcomePage.STRING_TITLE); - compositeWelcomePage.setSubTitleBounds(20, 190, 600, 40); - compositeWelcomePage.setSubTitle(WelcomePage.STRING_SUBTITLE); - - compositeWelcomePage.setVisibleRadioButton(true); - btnNext.setVisible(true); - btnClose.setText("Cancel"); - - btnClose.removeSelectionListener(closeBtnSelectionAdapter); - btnClose.removeSelectionListener(cancelBtnSelectionAdapter); - btnClose.addSelectionListener(cancelBtnSelectionAdapter); - - compositeWelcomePage.setButtonStatus(); - } else { - compositeWelcomePage.setVisibleRadioButton(false); - btnNext.setVisible(false); - - compositeWelcomePage.setTitle("Cannot start Tizen SDK Install Manager."); - - String errMsg = ErrorController.getErrorMessage(); - String repository = Config.getInstance().getConfigFile().getRepository(); - errMsg = errMsg + "\n(" + repository + ")"; - compositeWelcomePage.setSubTitleBounds(20, 190, 600, 100); - compositeWelcomePage.setErrorSubTitle(errMsg); - - btnClose.setText("Close"); - - btnClose.removeSelectionListener(closeBtnSelectionAdapter); - btnClose.removeSelectionListener(cancelBtnSelectionAdapter); - btnClose.addSelectionListener(closeBtnSelectionAdapter); - } - btnNext.setFocus(); - sl_composite.topControl = compositeWelcomePage; - } - - /** - * Refresh InstallManager. - * Refresh packages and configuration information. - */ - public void refresh() { - initInstallManager(); - initWelcomePage(); - } - - /** - * Checks if there's updatable meta package. - * Then print "updatable" to stdout. - */ - private static void checkMetaPackageUpdate() { - if (PackageManager.getInstance().getUpdatableMetaPackages().size() != 0) { - System.out.println("updatable"); - } - } - - /** - * There is no UI, just download packages. - * @throws IMExitException - */ - private static void onlyDownloadPackages() throws IMExitException { - ViewController controller = new ViewController(); - controller.init(); - - InstallManager installManager = InstallManager.getInstance(); - PackageManager packageManager = installManager.getPackageManager(); - - // Get all meta packages list by boundary.(eg. public, partner, all....) - PackageSet filteredMeta = filterPackageSet(); - PackageSet downloadablePkgs = packageManager.getDependsPackagesFromRepository(filteredMeta); - - // Download all meta packages. - boolean filteredPackages = installManager.downloadPackages(downloadablePkgs, null); - - if (filteredPackages) { - Log.log("Success to download packages from repository"); - } else { - Log.err("Fail to download packages from repository"); - return; - } - } - - private static PackageSet filterPackageSet() { - PackageManager pm = PackageManager.getInstance(); - - PackageSet downloadPackageList = pm.getLeafMetaPackages(); - - String boundary = Options.boundary; - if (boundary.equalsIgnoreCase("public")) { - PackageSet partnerMetaPackages = pm.getPartnerMetaPackages(); - - if (!partnerMetaPackages.isEmpty()) { - downloadPackageList.removeAll(partnerMetaPackages); - } - } else if (boundary.equalsIgnoreCase("partner")) { - PackageSet publicMetaPackages = pm.getPublicMetaPackages(); - - if (!publicMetaPackages.isEmpty()) { - downloadPackageList.removeAll(publicMetaPackages); - } - } - - return downloadPackageList; - } - - private static void showInstallManagerVersion() { - System.out.println("InstallManager Version : " + - Config.getInstance().getInstallManagerVersion().toString()); - } - - /** - * Launch the application. - * - * @param args - */ - public static void main(String args[]) { - InstallManager.deleteTempFile(); - Log.open(); - try { - Log.LogTitle("Installmanager start"); - Log.log(Platform.getPlatformInfo()); - Log.log("Install Manager Jar Build-Version: " + Config.getJarBuildVersion()); - Options.loadCmdArgs(args); - - if (Options.onlyDownload) { - onlyDownloadPackages(); - System.exit(0); - } else if (Options.showVersion) { - showInstallManagerVersion(); - System.exit(0); - } - window = new InstallManagerWindow(); - window.setBlockOnOpen(true); - - window.init(); - - Log.log("after init"); - if (Options.checkPackageUpdate) { - checkMetaPackageUpdate(); - } else if (Options.printDepGraph) { - InstallManager.getInstance().getPackageManager().printDepGraph(); - } else { - window.open(); - if (Display.getCurrent() != null - && !Display.getCurrent().isDisposed()) { - Display.getCurrent().dispose(); - } - } - } catch (IMExitException e) { - // do not remove sdk temp dir if exit for self update - if (ErrorController.getExitCode() == Config.EXITCODE_HAS_SELF_UPDATE) { - Options.doRemoveTempTizenSDK = false; - } - - Log.log("Gracefully exit"); - } catch (Throwable e) { - Log.err("Unexpected error occurred"); - Log.ExceptionLog(e); - - // show error message - if (window != null) { - window.open(); - - if (Display.getCurrent() != null - && !Display.getCurrent().isDisposed()) { - Display.getCurrent().dispose(); - } - } - - ErrorController.setExitCode(Config.EXITCODE_UNKNOWN_ERROR); - } finally { - if (Platform.isWindows()) { - ProgramController.createProgramController().removeSDKTempDir(); - } - - Log.LogTitle("Installmanager finish"); - Log.close(); - - if (ErrorController.getExitCode() != Config.EXITCODE_NORMAL){ - System.exit(ErrorController.getExitCode()); - } - } - } - - @Override - protected void configureShell(Shell newShell) { - newShell.setBackground(getBackgroundColor()); - newShell.setMinimumSize(getInitialSize()); - newShell.setSize(getInitialSize()); - newShell.setImage(getWindowIconImage()); - super.configureShell(newShell); - - newShell.setText("Tizen SDK Install Manager"); - } - - @Override - /** - * Install manager window is close. - */ - public boolean close() { - return false; - } - - /** - * Return the initial size of the window. - */ - @Override - protected Point getInitialSize() { - return POINT_MAIN_WINDOW; - } - - /** - * Show the composite depending on parameter. - * @param composite - */ - public void showComposite(Composite composite) { - StackLayout layout; - if (composite.getParent().getLayout() instanceof StackLayout) { - layout = (StackLayout) composite.getParent().getLayout(); - layout.topControl = composite; - } - composite.getParent().layout(); - } - - private void registLicensePageListener() { - compositeLicensePage.getAcceptButton() - .addSelectionListener(new SelectionAdapter() { - - @Override - public void widgetSelected(SelectionEvent e) { - btnNext.setEnabled(compositeLicensePage.getAcceptButton() - .getSelection()); - } - }); - } - - private void registCompletePageListener() { - compositeCompletePage.addPaintListener(new PaintListener() { - - @Override - public void paintControl(PaintEvent arg0) { - btnClose.setText("Close"); - } - }); - } - - /** - * Get selected package names on installing - * @param items - * @return list of selected package names. - */ - public List getSelectedPackageNames(List items) { - List list = new ArrayList(); - for (int i = 0; i < items.size(); i++) { - items.get(i).getTerminalPackages(list, true); - } - - return list; - } - - /** - * Get install manager window object. - * @return install manager window object. - */ - public static InstallManagerWindow getInstallManagerWindow() { - return window; - } - - /** - * Get complete page composite object - * @return complete page composite object - */ - public CompletePage getCompletePage() { - return compositeCompletePage; - } - - /** - * If parameter is true, 'Next' button will be enabled. but false, 'Next' button will be disabled. - * @param enabled - */ - public static void setNextBtnEnabled(boolean enabled) { - btnNext.setEnabled(enabled); - } - - /** - * If parameter is true, 'Back' button will be enabled. but false, 'Back' button will be disabled. - * @param enabled - */ - public static void setBackBtnEnabled(boolean enabled) { - btnBack.setEnabled(enabled); - } - - /** - * If parameter is true, 'Cancel' button will be enabled. but false, 'Cancel' button will be disabled. - * @param enabled - */ - public void setCancelBtnEnabled(boolean enabled) { - btnClose.setEnabled(enabled); - } - - public ViewController getViewController() { - return controller; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraDialog.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraDialog.java deleted file mode 100644 index 2884395..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraDialog.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.ui.dialog; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.tizen.installmanager.core.SDKExtensionInfo; -import org.tizen.installmanager.lib.Downloader; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.util.PathUtil; - -/** - * This class supports to add extra's repository. - * - * @author Yongsung Kim - */ -public class AddExtraDialog extends Dialog { - private String DIALOG_TITLE = "Add Repository"; - private AddExtraRepositoryDialog rDialog = null; - - private Text nameText = null; - private Text repositoryText = null; - - private Label errLabel = null; - private Button okButton; - - private String thirdPartyName = ""; - private String thirdPartyRepository = ""; - - public AddExtraDialog(Shell parentShell) { - super(parentShell); - setShellStyle(SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL); - } - - /** - * Return the initial size of the dialog. - */ - @Override - protected Point getInitialSize() { - return new Point(400, 195); - } - - /** - * Set to enable OK button. - * - * @param isAvailable - */ - public void okButtonEnable(boolean isAvailable) { - okButton = getButton(Window.OK); - okButton.setEnabled(isAvailable); - } - - /** - * Create contents of the dialog. - * - * @param parent - */ - @Override - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - container.setLayout(null); - container.getShell().setImage(PathUtil.getImageFromResource("/res/icons/SDK_icon.png")); - rDialog = new AddExtraRepositoryDialog(getParentShell()); - - setTitle(); - - setNameText(container); - setRepositoryText(container); - setErrorLabel(container); - setSeparator(container); - - return container; - } - - private void setTitle() { - getShell().setText(DIALOG_TITLE); - } - - @Override - protected void okPressed() { - thirdPartyName = nameText.getText(); - thirdPartyRepository = repositoryText.getText(); - if (!isValidName()) { - errLabel.setText(ErrorController.getErrorMessage()); - } else if (!isOverlapRepository()) { - errLabel.setText(ErrorController.getErrorMessage()); - } else if (!isValidRepository()) { - errLabel.setText(ErrorController.getErrorMessage()); - } else { - this.close(); - } - } - - private void setNameText(Composite composite) { - Label nameLabel = new Label(composite, SWT.NONE); - if (nameText == null) { - nameText = new Text(composite, SWT.BORDER); - } - nameLabel.setBounds(5, 7, 75, 23); - nameLabel.setText("Name :"); - nameText.setBounds(85, 5, 305, 23); - } - - private void setRepositoryText(Composite composite) { - Label repositoryLabel = new Label(composite, SWT.NONE); - if (repositoryText == null) { - repositoryText = new Text(composite, SWT.BORDER); - } - repositoryLabel.setBounds(5, 34, 75, 23); - repositoryLabel.setText("Repository :"); - repositoryText.setBounds(85, 32, 305, 23); - repositoryText.append("http://"); - } - - private void setErrorLabel(Composite composite) { - if (errLabel == null) { - errLabel = new Label(composite, SWT.WRAP); - } - - errLabel.setBounds(5, 60, 380, 50); - errLabel.setForeground(new Color(null, 255, 0, 0)); - errLabel.setEnabled(true); - } - - private void setSeparator(Composite composite) { - Label sep = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); - sep.setBounds(0, 115, 400, 1); - } - - private boolean isValidName() { - if (!hasSpaceInName()) { - return false; - } else if (isOnlyEngName()) { - return true; - } else { - return false; - } - } - - private boolean isOnlyEngName() { - char[] temp = thirdPartyName.toCharArray(); - int tmp = Character.getType(temp[0]); - if (tmp == 5) { - ErrorController.setError(ErrorCode.HANGUL_IN_REPOSITORY_NAME); - return false; - } else { - return true; - } - } - - private boolean hasSpaceInName() { - if (thirdPartyName.length() <= 0) { - ErrorController.setError(ErrorCode.SPACE_IN_REPOSITORY_NAME); - return false; - } else { - for (int i = 0; i < thirdPartyName.length(); i++) { - if (thirdPartyName.charAt(i) == ' ') { - ErrorController.setError(ErrorCode.SPACE_IN_REPOSITORY_NAME); - return false; - } - } - } - - return true; - } - - private boolean isValidRepository() { - URL serverUrl; - - try { - serverUrl = new URL(PathUtil.addURLPath(thirdPartyRepository, - PackageManager.getInstance().getPackageListFileName())); - - Downloader downloader = new Downloader(); - boolean conResult = downloader.connect(serverUrl); - - return conResult; - - } catch (MalformedURLException e) { - // the URL is not in a valid form - ErrorController.setError(ErrorCode.WRONG_URL_FORMAT); - return false; - } - } - - private boolean isOverlapRepository() { - removeSeperator(); - SDKExtensionInfo extensionInfo = rDialog.getSdkExtensionInfo(); - if (extensionInfo.contains(thirdPartyRepository)) { - ErrorController.setError(ErrorCode.OVERLAP_EXTENSION_REPOSITORY); - return false; - } else if (extensionInfo.containsBuiltIn(thirdPartyRepository)) { - ErrorController.setError(ErrorCode.OVERLAP_BUILT_IN_EXTENSION_REPOSITORY); - return false; - } else { - return true; - } - } - - private void removeSeperator() { - if (thirdPartyRepository.endsWith(PathUtil.URL_SEPERATOR)) { - while (thirdPartyRepository.endsWith(PathUtil.URL_SEPERATOR)) { - thirdPartyRepository = thirdPartyRepository.substring(0, thirdPartyRepository.length() - 1); - } - } - } - - public String getThirdPartyName() { - return thirdPartyName; - } - - public String getThirdPartyRepository() { - removeSeperator(); - return thirdPartyRepository; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraRepositoryDialog.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraRepositoryDialog.java deleted file mode 100644 index 8258ec4..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/AddExtraRepositoryDialog.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.ui.dialog; - -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.Set; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.TableItem; -import org.tizen.installmanager.core.SDKExtensionInfo; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.pkg.model.PackageSet; -import org.tizen.installmanager.util.PathUtil; - -/** - * This class supports to control(add, reomove) extra's repository. - * - * @author Yongsung Kim - */ -public class AddExtraRepositoryDialog extends Dialog { - private final String STRING_TITLE = "Add Extra Repository"; - - private AddExtraDialog addDialog = null; - private String thirdPartyName = ""; - private String thirdPartyRepository = ""; - - //Repository table column - public static final int TABLE_COLUMN_NAME = 0; - public static final int TABLE_COLUMN_REPOSITORY = 1; - - private Table repositoryTable = null; - private Button addButton = null; - private Button removeButton = null; - private Button okButton = null; - - // Set of removable item list. - private Set removeRepositorySet; - - private SDKExtensionInfo sdkExtensionInfo = SDKExtensionInfo.getInstance(); - - public AddExtraRepositoryDialog(Shell parentShell) { - super(parentShell); - setShellStyle(SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL); - } - - /** - * Return the initial size of the dialog. - */ - @Override - protected Point getInitialSize() { - return new Point(500, 400); - } - - /** - * Create contents of the dialog. - * - * @param parent - */ - @Override - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - container.setLayout(null); - container.getShell().setImage(PathUtil.getImageFromResource("/res/icons/SDK_icon.png")); - - sdkExtensionInfo.load(); - removeRepositorySet = new HashSet(); - - setTitle(); - setRepositoryTable(container); - addItemToRepositoryTable(sdkExtensionInfo.getExtensionRepositories()); - - setSeparator(container); - - setAddButton(container); - setRemoveButton(container); - - return container; - } - - /** - * Set page title - */ - private void setTitle() { - getShell().setText(STRING_TITLE); - } - - @Override - protected void okPressed() { - this.close(); - } - - /** - * Set 3rd party repository table. - * @param composite - */ - private void setRepositoryTable(Composite composite) { - if (repositoryTable == null) { - repositoryTable = new Table(composite, SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK); - } - - repositoryTable.forceFocus(); - repositoryTable.setBounds(5, 5, 380, 305); - repositoryTable.setLayout(new FillLayout()); - - setTableColumn(); - - repositoryTable.setHeaderVisible(true); - repositoryTable.setLinesVisible(true); - - repositoryTable.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - TableItem selectedItem = (TableItem) e.item; - if (selectedItem.getChecked() == true) { - removeRepositorySet.add(selectedItem); - } else { - removeRepositorySet.remove(selectedItem); - } - - if (removeRepositorySet.isEmpty()) { - removeButton.setEnabled(false); - } else { - removeButton.setEnabled(true); - } - } - }); - } - - /** - * Set table column. - */ - private void setTableColumn() { - TableColumn tcName = new TableColumn(repositoryTable, SWT.CENTER); - TableColumn tcRepository = new TableColumn(repositoryTable, SWT.CENTER); - - tcName.setText("Name"); - tcRepository.setText("Repository"); - - tcName.setWidth(100); - tcName.setResizable(false); - tcRepository.setWidth(270); - tcRepository.setResizable(false); - } - - /** - * Show 3rd party information on table. - * @param type - */ - private void showRepositoryTable() { - repositoryTable.removeAll(); - removeRepositorySet.clear(); - addItemToRepositoryTable(sdkExtensionInfo.getExtensionRepositories()); - } - - /** - * Add 3rd party information to table by row. - * @param - */ - private void addItemToRepositoryTable(LinkedHashMap repositoryInfo) { - Set keys = repositoryInfo.keySet(); - for (String key : keys) { - TableItem item = new TableItem(repositoryTable, SWT.NONE); - item.setText(TABLE_COLUMN_NAME, repositoryInfo.get(key)); - item.setText(TABLE_COLUMN_REPOSITORY, key); - } - } - - private void setSeparator(Composite composite) { - Label sep = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); - sep.setBounds(0, 320, 500, 1); - } - - /** - * Set Add repository button. - * @param composite - */ - private void setAddButton(Composite composite) { - if (addButton == null) { - addButton = new Button(composite, SWT.NONE); - } - - addButton.setBounds(390, 10, 88, 27); - addButton.setText("Add"); - - addButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - addDialog = new AddExtraDialog(getShell()); - - int ret = addDialog.open(); - - if (ret == 0) { - thirdPartyName = addDialog.getThirdPartyName(); // 3rd party name via location dialog. - thirdPartyRepository = addDialog.getThirdPartyRepository(); // 3rd party repository via location dialog. - addRepositoryInformation(); - showRepositoryTable(); - } else { - Log.err("Cannot open add 3rd party repository dialog."); - } - } - }); - } - - /** - * Set button to remove item which is checked. - * @param composite - */ - private void setRemoveButton(Composite composite) { - if (removeButton == null) { - removeButton = new Button(composite, SWT.NONE); - } - - removeButton.setBounds(390, 42, 88, 27); - removeButton.setText("Remove"); - removeButton.setEnabled(false); - - removeButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - removeRepositoryInformation(); - showRepositoryTable(); - } - }); - } - - /** - * Write 3rd party information of adding to installmanager.conf - */ - private void addRepositoryInformation() { - sdkExtensionInfo.add(thirdPartyName, thirdPartyRepository); - sdkExtensionInfo.save(); - } - - /** - * Write 3rd party information of removing to installmanager.conf - */ - private void removeRepositoryInformation() { - for (TableItem removeItem : removeRepositorySet) { - sdkExtensionInfo.remove(removeItem.getText(1)); - } - sdkExtensionInfo.save(); - } - - public PackageSet getPackagesFromExtraRepository() { - return sdkExtensionInfo.getExtensionPackages(); - } - /** - * Set to enable OK button. - * - * @param isAvailable - */ - public void okButtonEnable(boolean isAvailable) { - okButton = getButton(Window.OK); - okButton.setEnabled(isAvailable); - } - - public SDKExtensionInfo getSdkExtensionInfo() { - return sdkExtensionInfo; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ChangeServerDialog.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ChangeServerDialog.java deleted file mode 100644 index c404cf3..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ChangeServerDialog.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.tizen.installmanager.ui.dialog; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.lib.Downloader; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.util.PathUtil; - -public class ChangeServerDialog extends Dialog { - private static final String STRING_TITLE = "Change Server"; - private Label titleLabel = null; - private Text serverText = null; - private Label errLabel = null; - - private String serverUrl = ""; - - public ChangeServerDialog(Shell parentShell) { - super(parentShell); - setShellStyle(SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL); - } - - /** - * Return the initial size of the dialog. - */ - @Override - protected Point getInitialSize() { - return new Point(400, 190); - } - - /** - * Create contents of the dialog. - * @param parent - */ - @Override - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - container.setLayout(null); - container.getShell().setImage(PathUtil.getImageFromResource("/res/icons/SDK_icon.png")); - - setTitle(); - setTitleLabel(container); - setServerUrlText(container); - setErrLabel(container); - - return container; - } - - @Override - protected void okPressed() { - String changeServerUrl = serverText.getText(); - - if (serverUrl.equals(changeServerUrl)) { - this.close(); - } else { - if (isExactFormat(changeServerUrl)) { - serverUrl = changeServerUrl; - this.close(); - } else { - // do not close configuration dialog because of wrong pkg list path. - } - } - } - - /** - * Set page title - */ - private void setTitle() { - getShell().setText(STRING_TITLE); - } - - private void setTitleLabel(Composite composite) { - titleLabel = new Label(composite, SWT.NONE); - titleLabel.setText("Input New Server"); - titleLabel.setBounds(10, 10, 200, 23); - } - - private void setServerUrlText(Composite composite) { - serverText = new Text(composite, SWT.BORDER); - serverText.setBounds(10, 33, 360, 23); - serverText.setEnabled(true); - - if (serverUrl.isEmpty()) { - serverText.setText("http://"); - } else { - serverText.setText(serverUrl); - serverText.selectAll(); - } - } - - private void setErrLabel(Composite composite) { - errLabel = new Label(composite, SWT.WRAP); - errLabel.setBounds(10, 58, 350, 100); - errLabel.setForeground(new Color(null, 255, 0, 0)); - } - - private boolean isExactFormat(String serverUrl) { - boolean result = false; - if (!serverUrl.startsWith("http://")) { - errLabel.setText("Enter the URL in a correct format."); - return false; - } - - try { - URL distInfoFileURL = new URL(PathUtil.addURLPath(serverUrl, Config.REPOSITORY_DISTRIBUTION_INFO_FILE)); - - Downloader downloader = new Downloader(); - result = downloader.connect(distInfoFileURL); - - if (!result) { - errLabel.setText(ErrorController.getErrorMessage()); - } - } catch (MalformedURLException e) { - errLabel.setText("Enter the URL in a correct format."); - return false; - } catch (IllegalArgumentException e) { - errLabel.setText("Connection to the input URL failed."); - // the connection does not work.(wrong URL address) - return false; - } - - return result; - } - - /** - * Set server address to text ui in dialog. - * @param url current server address. - */ - public void setCurrentServer(String url) { - serverUrl = url; - } - - public String getServerUrl() { - return serverUrl; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ConfigurationDialog.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ConfigurationDialog.java deleted file mode 100644 index d7191d3..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/ConfigurationDialog.java +++ /dev/null @@ -1,925 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.ui.dialog; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.window.Window; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.swt.widgets.TableItem; -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.DistributionController; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.core.Config.ServerType; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.SnapshotLog; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.SDKPackageFormat; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.Snapshot; -import org.tizen.installmanager.pkg.model.SnapshotList; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType; -import org.tizen.installmanager.util.PathUtil; - - -/** - * This class supports snapshot, user package server and local install. - * - * @author Yongsung Kim - */ -public class ConfigurationDialog extends Dialog { - //return data - private String snapshotPath = ""; - private String currentDistribution = ""; - private String repository = ""; - private ServerType serverType = ServerType.SNAPSHOT; - -// private ChangeServerDialog changeServerDialog = null; - - private SnapshotLogDialog snapshotDialog = null; - private static final String STRING_TITLE = "Advanced Configuration"; - - private Button buttonSnapshot = null; - private Button buttonLocal = null; - private Button buttonSelectImage = null; - private Button okBtn; - private Button buttonChangeServer; - private Combo distributionCombo = null; - private Button latestVersionCheckBox = null; - private Button buttonSnapshotFilter = null; - - private Table snapshotTable; - - private Label localErrLabel; - private Label textPackageServerUrl; - private Label textLocalServerUrl; - private File imageFile; - private long unzipResult = -1; - - private DistributionController controller = null; - private boolean noErr = true; // flag check to verify pkg list file path. - - //snapshot table column - public static final int TABLE_STATUS = 0; - public static final int TABLE_NAME = 1; - public static final int TABLE_DATE = 2; - - //snapshot table status - public static final String STATUS_LATEST = "Latest"; - - private static final String SDK_IMAGE_ZIP_EXTENSION = ".zip"; - - public ConfigurationDialog(Shell parentShell) { - super(parentShell); - setShellStyle(SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL); - controller = DistributionController.getInstance(); - } - - /** - * Create contents of the dialog. - * - * @param parent - */ - @Override - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - container.setLayout(null); - - setTitle(); - - setSnapshotButton(container); - packageServerLabel(container); - setChangeUrlButton(container); - setDistributionComboBox(container); - setLatestVersionCheckBox(container); - setSnapshotFilter(container); - makeSnapshotTable(container); - showSnapshotTable(currentDistribution); - setSelectionBySnapshotPath(); - - setSeparator(container); - - setLocalButton(container); - setFileDialog(container); - setLocalLabel(container); - setLocalErrorlabel(container); - - return container; - } - - protected Button getOKButton() { - Button button = getButton(IDialogConstants.OK_ID); - return button; - } - - @Override - protected void okPressed() { - - if (buttonLocal.getSelection()) { - if (unzipSDKImageFile(imageFile) > 0) { - this.serverType = ServerType.LOCAL; - } else { - Log.err("unzip SDK IMAGE FILE fail. => " + imageFile.getName()); - throw new IMFatalException(ErrorCode.FAIL_TO_EXTRACT_SDK_IMAGE_FILE); - } - - } else { - this.serverType = ServerType.SNAPSHOT; - } - - if (noErr) { - // everything is good. keep going ahead. - this.close(); - } - } - - /** - * Return the initial size of the dialog. - */ - @Override - protected Point getInitialSize() { - return new Point(580, 485); - } - - public void setComboList(List list) { - - } - - /** - * Set snapshot path by snapshot name. - * @param name snapshot name - */ - public void setSnapshotPathByName(String name) { - SnapshotList snapshotSet = controller.getSnapshotList(currentDistribution); - - if (snapshotSet == null) { - throw new IMFatalException("Selected distribution(" + currentDistribution + ") do not exist in repository"); - } - - Snapshot currentSnapshot = snapshotSet.getSnapshotByName(name); - - if (currentSnapshot != null) { - this.snapshotPath = currentSnapshot.getPath(); - } else { - this.snapshotPath = ""; - } - } - - public void setSnapshotPath(String path) { - SnapshotList snapshotSet = controller.getSnapshotList(currentDistribution); - - if (snapshotSet == null) { - throw new IMFatalException("Selected distribution(" + currentDistribution + ") do not exist in repository"); - } - - Snapshot currentSnapshot = snapshotSet.getSnapshotByPath(path); - - if (currentSnapshot != null) { - this.snapshotPath = currentSnapshot.getPath(); - } else { - this.snapshotPath = ""; - } - } - - public void setRepository(String serverUrl) { - if (serverUrl == null || serverUrl.isEmpty()) { - return; - } - - this.repository = serverUrl; - } - - /** - * Change package server type by install type(normal, snapshot, local). - * @param isConfDialog User push 'OK' button in configuration dialog is true, otherwise is false. - */ - public void setServerType() { - if (buttonSnapshot.getSelection()) { - serverType = ServerType.SNAPSHOT; - } else if (buttonLocal.getSelection()) { - serverType = ServerType.PACKAGE; - } else { - Log.err("Snapshot or package server button is not selection in configuration page."); - serverType = ServerType.SNAPSHOT; - } - } - - /** - * Get package server url from Text widget. - * @return - */ - public String getRepository() { - return repository; - } - - /** - * Set snapshot type - * - * @param type - * selected snapshot type. - */ - public void setCurrentDistribution(String type) { - this.currentDistribution = type; - } - - /** - * Get snapshot type - * - * @return - */ - public String getCurrentDistribution() { - return currentDistribution.toLowerCase(); - } - - /** - * Get snapshot path - * - * @return snapshot path - */ - public String getSnapshotPath() { - return snapshotPath; - } - - /** - * Set page title - */ - private void setTitle() { - getShell().setText(STRING_TITLE); - } - - private void setPackageServerEnv(String packageServerPath) { - this.repository = packageServerPath; - textPackageServerUrl.setText(packageServerPath); - - //refresh information of distribution - refreshDistribution(); - - //refresh combobox of distribution - distributionCombo.removeAll(); - List distributions = controller.getDistributionList(); - addDistributionsToDistributionCombo(distributions); - if (distributions.size() > 0) { - currentDistribution = distributions.get(0); - distributionCombo.select(0); - } - - //refresh snapshot list - snapshotTable.clearAll(); - showSnapshotTable(distributionCombo.getText()); - if (snapshotTable.getItems().length > 0) { - snapshotTable.setSelection(0); - } - } - - private void refreshDistribution() { - Config.getInstance().getConfigFile().setRepository(repository); - InstallManager.getInstance().initDistribution(); - this.controller = DistributionController.getInstance(); - } - - /** - * Set snapshot radio button. - * - * @param composite - */ - private void setSnapshotButton(Composite composite) { - if (buttonSnapshot == null) { - buttonSnapshot = new Button(composite, SWT.RADIO); - } - - buttonSnapshot.setSelection(true); - buttonSnapshot.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - distributionCombo.setEnabled(true); - buttonSnapshotFilter.setEnabled(true); - buttonChangeServer.setEnabled(true); - buttonSelectImage.setEnabled(false); - textLocalServerUrl.setEnabled(false); - textLocalServerUrl.setText(""); - localErrLabel.setText(""); - setOkEnable(false); - } - }); - - buttonSnapshot.setBounds(10, 10, 130, 20); - - buttonSnapshot.setText("Package Server : "); - } - - /** - * Set url label - * - * @param composite - */ - private void packageServerLabel(Composite composite) { - if (textPackageServerUrl == null) { - textPackageServerUrl = new Label(composite, SWT.BORDER); - } - - textPackageServerUrl.setBounds(150, 10, 300, 20); - textPackageServerUrl.setEnabled(false); - textPackageServerUrl.setText(this.repository); - } - - private void setChangeUrlButton(final Composite composite) { - if (buttonChangeServer == null) { - buttonChangeServer = new Button(composite, SWT.PUSH); - } - - buttonChangeServer.setText("Change Server"); - buttonChangeServer.setBounds(455, 7, 115, 27); - buttonChangeServer.setEnabled(true); - - buttonChangeServer.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - ChangeServerDialog changeServerDialog = new ChangeServerDialog(composite.getShell()); - changeServerDialog.setCurrentServer(repository); - int ret = changeServerDialog.open(); - if (ret == 0) { - String changeServerUrl = changeServerDialog.getServerUrl(); - if (!repository.equals(changeServerUrl)) { - setPackageServerEnv(changeServerUrl); - } - } else { - Log.log("ChangeServer dialog is canceled."); - } - } - }); - } - - /** - * Set snapshot type combo box. - * - * @param composite - */ - private void setDistributionComboBox(Composite composite) { - if (distributionCombo == null) { - distributionCombo = new Combo(composite, SWT.READ_ONLY); - } - - addDistributionsToDistributionCombo(controller.getDistributionList()); - - Label distLabel = new Label(composite, SWT.NONE); - distLabel.setBounds(10, 45, 100, 20); - distLabel.setText("Distribution : "); - - distributionCombo.setText(currentDistribution); - distributionCombo.setBounds(104, 40, 90, 20); - distributionCombo.setEnabled(true); - - distributionCombo.addSelectionListener(new SelectionListener() { - @Override - public void widgetSelected(SelectionEvent e) { - String distribution = distributionCombo.getText(); - - if (currentDistribution.equals(distribution)) { - return; - } else { - showSnapshotTable(distribution); - - if (snapshotTable.getItemCount() > 0) { - if (latestVersionCheckBox.getSelection()) { - snapshotTable.deselectAll(); - } else { - snapshotTable.select(0); - setSnapshotPathByName(snapshotTable.getSelection()[0].getText(1)); - } - - currentDistribution = distribution; - Config.fromWhere = Config.ConfDialog.SNAPSHOT; // it means data from table. - } - } - } - - @Override - public void widgetDefaultSelected(SelectionEvent arg0) { - } - }); - } - - private void setLatestVersionCheckBox(Composite composite) { - if (latestVersionCheckBox == null) { - latestVersionCheckBox = new Button(composite, SWT.CHECK); - } - - latestVersionCheckBox.setText("Auto update"); - latestVersionCheckBox.setBounds(205, 45, 100, 20); - latestVersionCheckBox.setEnabled(true); - latestVersionCheckBox.pack(); - - if(this.snapshotPath.isEmpty()) { - latestVersionCheckBox.setSelection(true); - } else { - latestVersionCheckBox.setSelection(false); - } - - latestVersionCheckBox.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - if (latestVersionCheckBox.getSelection()) { - snapshotTable.deselectAll(); - snapshotTable.setEnabled(false); - buttonSnapshotFilter.setEnabled(false); - snapshotPath = ""; - } else { - snapshotTable.setEnabled(true); - buttonSnapshotFilter.setEnabled(true); - - if (snapshotTable.getItemCount() > 0) { - snapshotTable.select(0); - setSnapshotPathByName(snapshotTable.getSelection()[0].getText(1)); - } else {} - } - } - }); - } - - private void addDistributionsToDistributionCombo(Collection distList) { - if (distributionCombo == null || distList == null) { - return; - } - - for (String dist : distList) { - if (dist != null) { - distributionCombo.add(dist); - } - } - } - - private void setSnapshotFilter(Composite composite) { - if (buttonSnapshotFilter == null) { - buttonSnapshotFilter = new Button(composite, SWT.CHECK); - } - - buttonSnapshotFilter.setText("Show all"); - buttonSnapshotFilter.setBounds(480, 45, 100, 20); - buttonSnapshotFilter.pack(); - - if (latestVersionCheckBox.getSelection()) { - buttonSnapshotFilter.setEnabled(false); - } else { - buttonSnapshotFilter.setEnabled(true); - } - - buttonSnapshotFilter.setSelection(false); - buttonSnapshotFilter.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(SelectionEvent e) { - showSnapshotTable(currentDistribution); - } - }); - } - - /** - * Make snapshot table. - * - * @param composite - * @return Snapshot table object. - */ - private Table makeSnapshotTable(Composite composite) { - if (snapshotTable == null) { - snapshotTable = new Table(composite, SWT.BORDER | SWT.FULL_SELECTION); - } - - snapshotTable.forceFocus(); - snapshotTable.setBounds(10, 70, 560, 200); - snapshotTable.setLayout(new FillLayout()); - - if (latestVersionCheckBox.getSelection()) { - snapshotTable.setEnabled(false); - } else { - snapshotTable.setEnabled(true); - } - - TableColumn tcStatus = new TableColumn(snapshotTable, SWT.CENTER); - TableColumn tcLabel = new TableColumn(snapshotTable, SWT.CENTER); - TableColumn tcDate = new TableColumn(snapshotTable, SWT.CENTER); - - tcStatus.setText("Status"); - tcLabel.setText("Name"); - tcDate.setText("Date"); - tcStatus.setWidth(109); - tcLabel.setWidth(193); - tcDate.setWidth(214); - - snapshotTable.addSelectionListener(new SelectionAdapter() { - - @Override - public void widgetSelected(SelectionEvent e) { - snapshotTable.setEnabled(!latestVersionCheckBox.getSelection()); - buttonSnapshot.setSelection(true); - buttonSnapshotFilter.setEnabled(true); - buttonChangeServer.setEnabled(true); - distributionCombo.setEnabled(true); - - buttonLocal.setSelection(false); - textLocalServerUrl.setEnabled(false); - textLocalServerUrl.setText(""); - localErrLabel.setText(""); - buttonSelectImage.setEnabled(false); - - setOkEnable(true); - - setSnapshotPathByName(snapshotTable.getSelection()[0].getText(1)); - Config.fromWhere = Config.ConfDialog.SNAPSHOT; // it means data from table. - } - }); - - snapshotTable.addMouseListener(new MouseListener() { - @Override - public void mouseUp(MouseEvent e) { - // TODO nothing - } - - @Override - public void mouseDown(MouseEvent e) { - // TODO nothing - } - - @Override - public void mouseDoubleClick(MouseEvent e) { - Point point = new Point(e.x, e.y); - TableItem item = snapshotTable.getItem(point); - - String repo = Config.getInstance().getConfigFile().getRepository(); - String dist = distributionCombo.getItem(distributionCombo.getSelectionIndex()); - - SnapshotLog snapshotLog = new SnapshotLog(PathUtil.addURLPath(repo, dist)); - String log = snapshotLog.getSnapshotLog(item.getText(TABLE_NAME)); - - if (log == null) { - MessageBoxDlg.showDlg( - getShell(), - "Notice", - "There is not information for snapshot \'" + item.getText(TABLE_NAME) + "\'.", - DialogType.INFO, true); - } else { - snapshotDialog = new SnapshotLogDialog(getShell(), log, item.getText(TABLE_NAME)); - int ret = snapshotDialog.open(); - if (ret == 0) { - Log.log("Success to open Snapshot Log Dialog"); - } else { - Log.err("Fail to open Snapshot Log Dialog"); - } - } - } - }); - - return snapshotTable; - } - - private void setSelectionBySnapshotPath() { - if (latestVersionCheckBox.getSelection()) { - snapshotTable.deselectAll(); - return; - } - - String distribution = distributionCombo.getText(); - SnapshotList snapshotList = DistributionController.getInstance().getSnapshotList(distribution); - - Snapshot snapshot= snapshotList.getSnapshotByPath(snapshotPath); - - if (snapshot == null) { - snapshotTable.select(0); - } else { - String snapshotName = snapshot.getName(); - - TableItem[] tItems = snapshotTable.getItems(); - for (TableItem tItem : tItems) { - if (snapshotName.equals(tItem.getText(1))) { - snapshotTable.setSelection(tItem); - } - } - } - } - - private void addItemToSnapshotTable(Snapshot snapshot) { - if (snapshot == null) { - return; - } else { - addItemToSnapshotTable(snapshot.getName(), snapshot.getTime()); - } - } - - private void addLatestItemToSnapshotTable(Snapshot snapshot) { - addItemToSnapshotTable(STATUS_LATEST, snapshot.getName(), snapshot.getTime()); - } - - /** - * Add snapshot to snapshot table by row. - * - * @param snapshots - * String[] of snapshot information. - */ - private void addItemToSnapshotTable(String name, Date date) { - addItemToSnapshotTable("", name, date); - } - - private void addItemToSnapshotTable(String status, String name, Date date) { - TableItem item = new TableItem(snapshotTable, SWT.NONE); - - item.setText(TABLE_STATUS, status); - item.setText(TABLE_NAME, name); - item.setText(TABLE_DATE, date.toString()); - } - - /** - * Show snapshot information by combo box selection. - * - * @param distribution - */ - private void showSnapshotTable(String distribution) { - snapshotTable.removeAll(); - snapshotTable.setHeaderVisible(true); - - //add latest snapshot to table. - Snapshot latestSnapshot = controller.getLatestSnapshot(distribution); - if (latestSnapshot != null) { - addLatestItemToSnapshotTable(latestSnapshot); - } - - if (buttonSnapshotFilter.getSelection()) { - SnapshotList allSnapshots = controller.getSnapshotList(distribution); - - if (allSnapshots == null) { - Log.log("Selected distribution(" + distribution + ") do not exist in repository"); - return; - } - - for (Snapshot snapshot : allSnapshots) { - if (!latestSnapshot.equals(snapshot)) { - addItemToSnapshotTable(snapshot); - } - } - } else { - //add snapshots to table - SnapshotList snapshots = controller.getManualSnapshotList(distribution); - - if (snapshots == null) { - Log.log("Selected distribution(" + distribution + ") do not exist in repository"); - return; - } - - for (Snapshot snapshot : snapshots) { - if (!latestSnapshot.equals(snapshot)) { - addItemToSnapshotTable(snapshot); - } - } - } - } - - private void setSeparator(Composite composite) { - Label sep = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL); - sep.setBounds(10, 280, 560, 1); - } - - private void setLocalButton(Composite composite) { - buttonLocal = new Button(composite, SWT.RADIO); - buttonLocal.setSelection(false); - buttonLocal.setBounds(10, 290, 350, 18); - buttonLocal.setText("SDK Image"); - - buttonLocal.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - textLocalServerUrl.setEnabled(true); - buttonSelectImage.setEnabled(true); - localErrLabel.setEnabled(true); - - distributionCombo.setEnabled(false); - buttonChangeServer.setEnabled(false); - buttonSnapshotFilter.setEnabled(false); - - snapshotPath = ""; - } - }); - } - - /** - * Set url label - * - * @param composite - */ - private void setLocalLabel(Composite composite) { - textLocalServerUrl = new Label(composite, SWT.BORDER); - textLocalServerUrl.setBounds(10, 318, 500, 20); - textLocalServerUrl.setEnabled(false); - } - - /** - * Set file dialog button - * - * @param composite - */ - private void setFileDialog(Composite composite) { - buttonSelectImage = new Button(composite, SWT.NONE); - buttonSelectImage.setEnabled(false); - buttonSelectImage.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - String strDir = showSettingInstallpathDlg(); - if (strDir != null) { - if (strDir.endsWith(SDK_IMAGE_ZIP_EXTENSION)) { - imageFile = new File(strDir); - if (validation(strDir)) { - textLocalServerUrl.setText(strDir); - localErrLabel.setText(""); - setOkEnable(true); - Config.fromWhere = Config.ConfDialog.LOCAL_IMAGE; // it means data from file dialog. - } else { - MessageBoxDlg.showDlg(Display.getCurrent().getShells()[0], - "Error", - "No package list file is found in the image file. Check the image file.", - DialogType.ERROR, false); - return; - } - } else { - MessageBoxDlg.showDlg(Display.getCurrent().getShells()[0], - "Error", - "Select the correct SDK image file.", - DialogType.ERROR, false); - return; - } - } - } - }); - - buttonSelectImage.setImage(PathUtil.getImageFromResource("/res/icons/icon_directory_open.png")); - buttonSelectImage.setBounds(520, 313, 35, 29); - } - - @SuppressWarnings("unused") - private boolean validation(String strDir) { - ZipFile zipFile = null; - ZipEntry entry = null; - - try { - zipFile = new ZipFile(strDir); - } catch (IOException e) { - Log.ExceptionLog(e); - - return false; - } - - if (zipFile != null) { - - entry = zipFile.getEntry(PackageManager.getInstance().getPackageListFileName()); - - try { - zipFile.close(); - } catch (IOException e) { - Log.ExceptionLog(e); - } - - return ( entry != null ) ? true : false; - } else { - return false; - } - } - - - private void setLocalErrorlabel(Composite composite) { - localErrLabel = new Label(composite, SWT.WRAP); - localErrLabel.setBounds(20, 343, 475, 45); - localErrLabel.setForeground(new Color(null, 255, 0, 0)); - } - - /** - * Show file path dialog when file dialog button is pushed. - * - * @return File path that selected file. - */ - private String showSettingInstallpathDlg() { - FileDialog dlg = new FileDialog(Display.getCurrent().getShells()[0]); - dlg.setText("Select the package image."); - String strDir = dlg.open(); - - return strDir; - } - - /** - * Unzip SDK ImageFile. - * - * @param imageFile SDK Image File. - * @return if success to unzip is 1, not -1 or 0. - */ - private long unzipSDKImageFile(final File imageFile) { - Log.log("Start to unzip SDK Image File. => " + imageFile.getName()); - - String sdkTempDir = PathUtil.getCurrentDir(); - - final File sdkTempDirFile = new File(sdkTempDir); - if (!sdkTempDirFile.exists()) { - sdkTempDirFile.mkdirs(); - } - - final IndeterminateProgressDialog progressbar = IndeterminateProgressDialog.getInstance(); - progressbar.updateName("Extracting the SDK image file...\n It can take few minutes."); - - Shell shell = progressbar.getParent(); - shell.getDisplay().asyncExec(new Runnable(){ - public void run() { - String imageFilePath = imageFile.getAbsolutePath(); - SDKPackageFormat format = SDKPackageFormat.createSDKPackageFormat(); - unzipResult = format.unZip(imageFilePath, sdkTempDirFile.getAbsolutePath(), null); - progressbar.finish(); - } - }); - - if (!shell.isDisposed()) { - progressbar.open(); - } - - if (unzipResult <= 0) { - repository = ""; - } else { - repository = sdkTempDir; - } - - return unzipResult; - } - - /** - * get serverType. - * - * @return - */ - public ServerType getServerType() { - return serverType; - } - - /** - * Set to enable OK button. - * - * @param isAvailable - */ - public void setOkEnable(boolean isAvailable) { - okBtn = getButton(Window.OK); - okBtn.setEnabled(isAvailable); - } - - /** - * Clear the data. - */ - public void clear() { - if (!distributionCombo.isDisposed()) { - distributionCombo.dispose(); - } - - if (!snapshotTable.isDisposed()) { - snapshotTable.clearAll(); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/IndeterminateProgressDialog.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/IndeterminateProgressDialog.java deleted file mode 100644 index e30138a..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/IndeterminateProgressDialog.java +++ /dev/null @@ -1,185 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.dialog; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Dialog; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Monitor; -import org.eclipse.swt.widgets.ProgressBar; -import org.eclipse.swt.widgets.Shell; -import org.tizen.installmanager.util.PathUtil; - -/** - * Before install manager window shows up, indeterminate dialog is displayed. - * @author Shihyun Kim - */ -public class IndeterminateProgressDialog extends Dialog { - Display mDisplay = null; - Shell mShell = null; - Label mNameLabel = null; - ProgressBar mProgressBar = null; - - boolean bCancel = false; - - private static IndeterminateProgressDialog progressDialog = null; - - private IndeterminateProgressDialog(Shell parent, int style) { - super(parent, style); - } - - private IndeterminateProgressDialog(Shell parent, int style, String title) { - super(parent, style); - mDisplay = getParent().getDisplay(); - setText(title); - parent.getShell().setImage(PathUtil.getImageFromResource("/res/icons/SDK_icon.png")); - } - - /** - * indeterminate dialog open. - */ - public void open() { - createContents(); - setCenterOfMonitor(); - - mShell.open(); - mShell.layout(); - - while (!mShell.isDisposed()) { - if (!mDisplay.readAndDispatch()) { - mDisplay.sleep(); - } - } - } - - /** - * Indeterminate dialog places center of monitor. - */ - public void setCenterOfMonitor() { - if (mShell.isDisposed()) { - return; - } - - Monitor monitor = mDisplay.getPrimaryMonitor(); - - Rectangle monitorRect = monitor.getBounds(); - Rectangle shellRect = mShell.getBounds(); - - int centerX = monitorRect.x + (monitorRect.width - shellRect.width) / 2; - int centerY = monitorRect.y + (monitorRect.height - shellRect.height) / 2; - - mShell.setLocation(centerX, centerY); - } - - public void setLocation(int x, int y) { - if (mShell.isDisposed()) { - return; - } - - mShell.setLocation(x, y); - } - - /** - * Create the indeterminate dialog with basic environments. - */ - private void createContents() { - mShell = new Shell(getParent(), SWT.None | SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); - mShell.setSize(300, 130); - mShell.setText("InstallManager"); - -// mProgressBar = new ProgressBar(mShell, SWT.INDETERMINATE); -// mProgressBar.setBounds(50, 43, 150, 17); - - mNameLabel = new Label(mShell, SWT.NONE | SWT.CENTER); - mNameLabel.setBounds(25, 17, 250, 40); - mNameLabel.setText("file name"); - } - - /** - * Shows title on dialog. - * @param fileName is string that wants to show on dialog - */ - public void updateName(final String fileName) { -// if (!mDisplay.isDisposed()) { -// mNameLabel.setText(fileName); -// } - if (!mDisplay.isDisposed()) { - mDisplay.asyncExec(new Runnable() { - public void run() { - if (!mNameLabel.isDisposed()) { - if (fileName.length() > 30) { - //String name = fileName.substring(0, 29); - String name = fileName + "..."; - mNameLabel.setText(name); - } - else { - mNameLabel.setText(fileName); - } - } - } - }); - } - } - - /** - * Set a display - * @param display - */ - public void setDisplay(Display display) { - mDisplay = display; - } - - /** - * Finish displaying the indeterminate dialog. - */ - public void finish() { - if (mShell == null || mShell.isDisposed()) { - return; - } - - if (!mDisplay.isDisposed()) { - mDisplay.asyncExec(new Runnable() { - public void run() { - mShell.close(); - } - }); - } - } - - public static IndeterminateProgressDialog getInstance() { - if (progressDialog == null) { - Shell shell = new Shell(Display.getCurrent()); - progressDialog = new IndeterminateProgressDialog(shell, SWT.NONE, ""); - } - - return progressDialog; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/LoginDlg.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/LoginDlg.java deleted file mode 100644 index b845357..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/LoginDlg.java +++ /dev/null @@ -1,171 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.dialog; - -import java.net.URL; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType; -import org.tizen.installmanager.util.PathUtil; - - -/** - * Install manager Login dialog. If a server need account, install manager can connect to server via this dialog. - * @author Shihyun Kim - */ -public class LoginDlg extends Dialog { - - private Text idText; - private Text pwText; - private String id; - private String pw; - private String repository = ""; - private Label lblConnecting; - private int POSITION_X = 97; - private int POSITION_Y = 40; - - public LoginDlg(Shell parentShell) { - super(parentShell); - setShellStyle(SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL); - } - - - /** - * Create contents of the dialog. - * @param parent - */ - @Override - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - container.setLayout(null); - - Label idLabel = new Label(container, SWT.NONE); - idLabel.setAlignment(SWT.RIGHT); - idLabel.setBounds(POSITION_X, POSITION_Y + 7, 74, 15); - idLabel.setText("ID :"); - - Label pwLabel = new Label(container, SWT.NONE); - pwLabel.setAlignment(SWT.RIGHT); - pwLabel.setBounds(POSITION_X, POSITION_Y + 40, 74, 15); - pwLabel.setText("Password :"); - - idText = new Text(container, SWT.BORDER); - idText.setBounds(POSITION_X + 80, POSITION_Y + 4, 183, 28); - - pwText = new Text(container, SWT.BORDER | SWT.PASSWORD); - pwText.setBounds(POSITION_X + 80, POSITION_Y + 37, 183, 28); - - Label label = new Label(container, SWT.CENTER); - label.setImage(PathUtil.getImageFromResource("/res/icons/icon_login.png")); - label.setBounds(POSITION_X - 61, POSITION_Y - 1, 64, 64); - - lblConnecting = new Label(container, SWT.WRAP); - lblConnecting.setBounds(19, 15, 328, 71); - lblConnecting.setEnabled(false); - if (repository != null) { - lblConnecting.setText(repository); - lblConnecting.setEnabled(true); - idLabel.setBounds(POSITION_X, POSITION_Y + 7 + 50, 74, 15); - pwLabel.setBounds(POSITION_X, POSITION_Y + 40 + 50, 74, 15); - idText.setBounds(POSITION_X + 80, POSITION_Y + 4 + 50, 183, 28); - pwText.setBounds(POSITION_X + 80, POSITION_Y + 37 + 50, 183, 28); - label.setBounds(POSITION_X - 61, POSITION_Y - 1 + 50, 64, 64); - } - - id = idText.getText(); - pw = pwText.getText(); - - idText.addKeyListener(new KeyAdapter() { - @Override - public void keyReleased(KeyEvent arg0) { - id = idText.getText(); - } - }); - - pwText.addKeyListener(new KeyAdapter() { - @Override - public void keyReleased(KeyEvent arg0) { - pw = pwText.getText(); - } - }); - - return container; - } - - @Override - protected void okPressed() { - if (id == null || id.length() < 1) - MessageBoxDlg.showDlg( - this.getShell(), "Input ID", "Please input your ID.", DialogType.NOTIFY, false); - - else if (pw == null || pw.length() < 1) - MessageBoxDlg.showDlg( - this.getShell(), "Input Password", "Please input your password.", - DialogType.NOTIFY, false); - else - this.close(); - } - - /** - * Return the initial size of the dialog. - */ - @Override - protected Point getInitialSize() { - return new Point(376, 248); - } - - public String getID() { - return id; - } - - public String getPassword() { - return pw; - } - - /** - * Set connecting url. - * @param url - */ - public void setURL(URL url) { - if (url != null) { - repository = "Please input user account for connecting \"" + url.toExternalForm() + "\"."; - if (lblConnecting != null) - lblConnecting.setText(repository); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/MessageBoxDlg.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/MessageBoxDlg.java deleted file mode 100644 index 6d0bbb6..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/MessageBoxDlg.java +++ /dev/null @@ -1,98 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.dialog; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; -import org.tizen.installmanager.lib.Log; - - -/** - * Install manager need message box dialog for explaining state. - * @author Taeyoung Son - */ -public class MessageBoxDlg { - private static int result; - public static final int YES = 64; - public static final int NO = 128; - public static final int OK = 32; - public static final int CANCEL = 256; - - /** - * INFO : Information for installing.
- * NOTIFY : Notification for installing.
- * WARNING : Warning for installing.
- * ERROR : Error for installing. - */ - public enum DialogType { - INFO, - NOTIFY, - WARNING, - ERROR, - } - - public static int showDlg( - final Shell shell, final String title, final String msg, final DialogType dlgType, final boolean onlyOk) { - result = 0; - - try { - if (shell != null) { - shell.getDisplay().syncExec(new Runnable() { - public void run() { - int style = 0; - if (dlgType == null) { - return; - } else if (dlgType == DialogType.INFO) { - style = SWT.OK | SWT.ICON_INFORMATION; - } else if (dlgType == DialogType.NOTIFY) { - style = SWT.OK | SWT.ICON_INFORMATION; - } else if (dlgType == DialogType.WARNING) { - style = SWT.YES | SWT.NO | SWT.ICON_WARNING; - } else if (dlgType == DialogType.ERROR) { - style = SWT.OK | SWT.ICON_ERROR; - } - - if (onlyOk) { - style = style | SWT.OK; - } - MessageBox dialog = new MessageBox(shell, style); - dialog.setText(title); - dialog.setMessage(msg); - result = dialog.open(); - } - }); - } else { - } - } catch (Exception e) { - Log.ExceptionLog(e); - } - return result; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/SnapshotLogDialog.java b/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/SnapshotLogDialog.java deleted file mode 100644 index 20bbeeb..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/dialog/SnapshotLogDialog.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.ui.dialog; - -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.tizen.installmanager.util.PathUtil; - -/** - * This class displays snapshot's change log. - * - * @author Yongsung Kim - */ -public class SnapshotLogDialog extends Dialog { - private String DIALOG_TITLE = null; - - private String snapshotLog = ""; - private Text displayLogText; - - /** - * @param parentShell - * @param log Selected snapshot's change log(information). - * @param snapshot Selected snapshot's name - */ - protected SnapshotLogDialog(Shell parentShell, String log, String snapshot) { - super(parentShell); - snapshotLog = log; - DIALOG_TITLE = snapshot + " information."; - setShellStyle(SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL | SWT.RESIZE); - } - - /** - * Return the initial size of the dialog. - */ - @Override - protected Point getInitialSize() { - return new Point(450, 300); - } - - /** - * Create contents of the dialog. - * - * @param parent - */ - @Override - protected Control createDialogArea(Composite parent) { - Composite container = (Composite) super.createDialogArea(parent); - FillLayout layout = new FillLayout(SWT.RESIZE); - container.setLayout(layout); - container.getShell().setImage(PathUtil.getImageFromResource("/res/icons/SDK_icon.png")); - - setTitle(); - setDisplayLogText(container); - - return container; - } - - @Override - protected void createButtonsForButtonBar(Composite parent) { - createButton(parent, IDialogConstants.OK_ID, "OK", true); - } - - private void setTitle() { - getShell().setText(DIALOG_TITLE); - } - - private void setDisplayLogText(Composite composite) { - if (displayLogText == null) { - displayLogText = new Text(composite, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); - } - - displayLogText.setText(snapshotLog); - displayLogText.setTextLimit(20); - displayLogText.setEnabled(true); - displayLogText.setEditable(false); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/model/Item.java b/SdkImageCreator/src/org/tizen/installmanager/ui/model/Item.java deleted file mode 100644 index 3f9b6b5..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/model/Item.java +++ /dev/null @@ -1,582 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.model; - -import java.util.ArrayList; -import java.util.List; - -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.Package; -import org.tizen.installmanager.pkg.model.PackageSet; - -/** - * This class support items for tree view. - * @author Taeyong Son - */ -public class Item implements Comparable { - private Package latestPackage; - private Package installedPackage; - private Item parent; - private ArrayList children; - private CheckState checkState= CheckState.UNCHECKED; - private InstallState installState = InstallState.INSTALL; - - /** - * Package item status enumeration.
- * INSTALL : This item need to install.
- * UPDATE : This item need to update.
- * UNINSTALL : This item need to uninstall. - */ - public enum InstallState { - INSTALL, - UPDATE, - SNAPSHOT, - UNINSTALL, - } - - /** - * item check status enumeration.
- * CHECKED : this item's check state is checked.
- * GRAYED : this item's check state is grayed.
- * UNCHECKED : this item's check state is unchecked. - */ - public enum CheckState { - CHECKED, - GRAYED, - UNCHECKED - } - - /** - * Construct Item class. - * @param parent - * @param name is item name. - * @param latestVersion is the latest version of item. - * @param installedVersion is a version of installed item already. - * @param size is a item size. - * @param state is a item state. - */ - public Item(Package latestPackage, Package installedPackage, InstallState state) { - setLatestPackage(latestPackage); - setInstalledPackage(installedPackage); - setInstallState(state); - - this.children = new ArrayList(); - } - - /** - * Get display name of item. - * @return - */ - public String getDisplayName() { - if (latestPackage != null) { - return latestPackage.getLabel(); - } else { - return ""; - } - } - - /** - * Get package name of item. - * @return - */ - public String getPackageName() { - if (latestPackage != null) { - return latestPackage.getPackageName(); - } else { - return ""; - } - } - - /** - * Get package item current version. - * @return - */ - public String getLatestVersion() { - if (latestPackage != null) { - return latestPackage.getVersion().toString(); - } else { - return ""; - } - } - - /** - * Get package item installed version - * @return - */ - public String getInstalledVersion() { - if (installedPackage != null) { - return installedPackage.getVersion().toString(); - } else { - return ""; - } - } - - /** - * Get total checked items size - * @return Checked items size - */ - public Long getSize() { - PackageManager pm = PackageManager.getInstance(); - - if (pm == null) { - return 0l; - } else { - long size = 0l; - PackageSet checkedChildPackages = getCheckedPackages(); - - if (installState == InstallState.UNINSTALL) { - size = pm.getTotalSizeOfRemovablePackages(checkedChildPackages); - } else { - size = pm.getTotalSizeOfInstallablePackages(checkedChildPackages); - } - - return size; - } - } - - private ArrayList getCheckedItems() { - ArrayList checkedItems = getCheckedChildItems(); - - if (this.getCheckState() == CheckState.CHECKED) { - checkedItems.add(this); - } - - return checkedItems; - } - - private ArrayList getCheckedChildItems() { - ArrayList checkedItems = new ArrayList(); - - ArrayList childItems = getChildren(); - for (Item childItem : childItems) { - if (childItem.getCheckState() == CheckState.CHECKED) { - checkedItems.add(childItem); - } else if (childItem.getCheckState() == CheckState.GRAYED) { - checkedItems.addAll(childItem.getCheckedChildItems()); - } - } - - return checkedItems; - } - - private PackageSet getCheckedPackages() { - PackageSet checkedPackages = new PackageSet(); - - ArrayList checkedItems = getCheckedItems(); - - for (Item checkedItem : checkedItems) { - if (installState == InstallState.UNINSTALL) { - checkedPackages.add(checkedItem.getInstalledPackage()); - } else { - checkedPackages.add(checkedItem.getLatestPackage()); - } - } - - return checkedPackages; - } - - /** - * Get package item order - * @return item order - */ - public int getPackageOrder() { - if (latestPackage != null) { - return latestPackage.getOrder(); - } else { - return 0; - } - } - - /** - * add child item on current item. - */ - public void addChildItem(Item item) { - this.children.add(item); - } - - /** - * Clear children items on current item. - */ - public void clearChildrenItems() { - this.children.clear(); - } - - /** - * Get dependent package item on current item. - * @return - */ - public ArrayList getChildren() { - return children; - } - - /** - * Check package is checked. - * @return true is checked, false is unchecked. - */ - public CheckState getCheckState() { - return checkState; - } - - /** - * Check package has child package. - * @return If package has children, return true. if not, return false. - */ - public boolean hasChildren() { - return !getChildren().isEmpty(); - } - - /** - * Get parent package. - * @return parent package. - */ - public Item getParent() { - return parent; - } - - /** - * Get latest package. - * @return - */ - public Package getLatestPackage() { - return latestPackage; - } - - /** - * Get installed package. - * @return - */ - public Package getInstalledPackage() { - return latestPackage; - } - - /** - * Get package that depends on the state. - * @return - */ - public Package getPackage() { - if (this.installState == InstallState.UNINSTALL) { - return installedPackage; - } else { - return latestPackage; - } - } - - /** - * Set latest package for tree item. - * @param pkg - */ - public void setLatestPackage(Package pkg) { - this.latestPackage = pkg; - } - - /** - * Set installed package for tree item. - * @param pkg - */ - public void setInstalledPackage(Package pkg) { - this.installedPackage = pkg; - } - - /** - * Set parent package. - * @param parent - */ - public void setParent(Item parentItem) { - parent = parentItem; - } - - /** - * Set package's checked flag. - * @param CHECKED is true, this package is selected by tree view. - */ - public void setCheckState(CheckState state) { - this.checkState = state; - } - - public void setCheckState(boolean state) { - if (state) { - this.checkState = CheckState.CHECKED; - } else { - this.checkState = CheckState.UNCHECKED; - } - } - - /** - * Set item's state. - * @param state - * @see InstallState - */ - public void setInstallState(InstallState state) { - if (state == InstallState.UPDATE) { - this.checkState = CheckState.CHECKED; - } else if (state == InstallState.UNINSTALL) { - this.checkState = CheckState.UNCHECKED; - } - - this.installState = state; - } - - /** - * Get item's state - * @return state - * @see InstallState - */ - public InstallState getInstallState() { - return installState; - } - - /** - * Get item's display order - * @return display order - */ - public int getOrder() { - return latestPackage.getOrder(); - } - - /** - * Set state by children's state - */ - public void setStateByChildren() { - setCheckStateByChildren(this); - setInstallStateByChildren(this); - } - - private void setCheckStateByChildren(Item parentItem) { - if (!parentItem.hasChildren()) { - return; - } else { - for (Item item : parentItem.getChildren()) { - setCheckStateByChildren(item); - } - - if (parentItem.isChildrenAllChecked()) { - parentItem.setCheckState(CheckState.CHECKED); - } else if (parentItem.isChildrenAllUnchecked()) { - parentItem.setCheckState(CheckState.UNCHECKED); - } else { - parentItem.setCheckState(CheckState.GRAYED); - } - } - } - - private void setInstallStateByChildren(Item parentItem) { - if (!parentItem.hasChildren()) { - return; - } else { - for (Item item : parentItem.getChildren()) { - setInstallStateByChildren(item); - } - - if (parentItem.isChildrenAllUpdate()) { - parentItem.setInstallState(InstallState.UPDATE); - } else if (parentItem.isChildrenAllUninstall()) { - parentItem.setInstallState(InstallState.UNINSTALL); - } else { - parentItem.setInstallState(InstallState.INSTALL); - } - } - } - - - /** - * check children's checkbox state. - * @return if true, children's checkbox state is all checked. - */ - public boolean isChildrenAllChecked() { - for (Item item : getChildren()) { - if (item.getCheckState() != CheckState.CHECKED) { - return false; - } - } - return true; - } - - /** - * check children's checkbox state. - * @return if true, children's checkbox state is all unchecked. - */ - public boolean isChildrenAllUnchecked() { - for (Item item : getChildren()) { - if (item.getCheckState() != CheckState.UNCHECKED) { - return false; - } - } - return true; - } - - private boolean isChildrenAllUpdate() { - for (Item item : getChildren()) { - if (item.getInstallState() != InstallState.UPDATE) { - return false; - } - } - return true; - } - - private boolean isChildrenAllUninstall() { - for (Item item : getChildren()) { - if (item.getInstallState() != InstallState.UNINSTALL) { - return false; - } - } - return true; - } - - public String getStateToString() { - if (hasChildren() || getParent() == null) { - return ""; - } else { - switch(installState) { - case INSTALL: - return "Not installed"; - case UPDATE: - return "Updatable"; - case UNINSTALL: - return "Installed"; - default: - return ""; - } - } - } - - /** - * If parent item is checked, child items should be checked. - * @param state is true, every child items' checked flag is true. false is the opposite. - */ - public void setSubItemChecked(boolean state) { - setCheckState(state); - - if (hasChildren()) { - for (int i = 0; i < getChildren().size(); i++) { - ((Item) getChildren().get(i)).setSubItemChecked(state); - } - } - } - - /** - * Check the existing children and checked flag, add to installed package list. - * @param installList is packages list which is installed already. - * @param checked is true, checking in box on tree view. false is the opposite. - */ - public void getTerminalPackages(List installList, boolean checked) { - if (hasChildren()) { - for (Item childItem : getChildren()) { - childItem.getTerminalPackages(installList, checked); - } - } - - if (getChildren().size() <= 0) { - if (getCheckState() == CheckState.CHECKED) { - installList.add(getPackageName()); - } - } - } - - /** - * Get child items list. - * @return child items list. - */ - public List getDescendants() { - List descendants = new ArrayList(); - descendants.add(this); - if (hasChildren()) { - for (int i = 0; i < getChildren().size(); i++) { - descendants.addAll(((Item) getChildren().get(i)).getDescendants()); - } - } - return descendants; - } - - public boolean hasGrayedChild(List grayCheckedItems) { - for (int i = 0; i < grayCheckedItems.size(); i++) { - for (int j = 0; j < getChildren().size(); j++) { - if (grayCheckedItems.get(i) == getChildren().get(j)) - return true; - } - } - return false; - } - - /** - * check children's checkbox state. - * @return if true, child item's checkbox state is grayed. - */ - public boolean hasGrayedChild() { - for (Item item : getChildren()) { - if (item.getCheckState() == CheckState.GRAYED) { - return true; - } - } - return false; - } - - public void checkSuperItemGrayed( - List grayCheckedItems, List checkedItems, List unCheckedItems) { - if (hasChildren()) { - boolean isAllChecked = true; - boolean isAllUnchecked = true; - for (int i = 0; i < getChildren().size(); i++) { - if (((Item) getChildren().get(i)).getCheckState() == CheckState.UNCHECKED) - isAllChecked = false; - else - isAllUnchecked = false; - } - if (isAllChecked == false && isAllUnchecked == false || hasGrayedChild(grayCheckedItems) == true) { - grayCheckedItems.add(this); -// setChecked(true); - } else if (isAllChecked == true && isAllUnchecked == false && hasGrayedChild(grayCheckedItems) == false) { - checkedItems.add(this); - setCheckState(CheckState.CHECKED); - } else if (isAllChecked == false && isAllUnchecked == true && hasGrayedChild(grayCheckedItems) == false) { - unCheckedItems.add(this); - setCheckState(CheckState.UNCHECKED); - } - } - if (getParent() != null) { - getParent().checkSuperItemGrayed(grayCheckedItems, checkedItems, unCheckedItems); - } - } - - public String toString() { - return getPackageName(); - } - - @Override - public int compareTo(Item item) { - int order = item.getOrder(); - if (order > getOrder()) { - return -1; - } else if (order == getOrder()) { - return 0; - } else if (order < getOrder()) { - return 1; - } - return 0; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemLabelProvider.java b/SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemLabelProvider.java deleted file mode 100644 index f8a37bf..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemLabelProvider.java +++ /dev/null @@ -1,150 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.model; - - -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.ILabelProviderListener; -import org.eclipse.jface.viewers.ViewerCell; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Display; -import org.tizen.installmanager.ui.model.Item.CheckState; -import org.tizen.installmanager.ui.model.Item.InstallState; -import org.tizen.installmanager.ui.page.PackageListPage; - - -/** - * This class provide the text and/or image for each column of a given element. Used by PackageListPage. - * @see PackageListPage - * @author Taeyoung Son - */ -public class ItemLabelProvider extends ColumnLabelProvider { - - @Override - public void addListener(ILabelProviderListener listener) { - } - - @Override - public void dispose() { - } - - @Override - public boolean isLabelProperty(Object element, String property) { - return false; - } - - @Override - public void removeListener(ILabelProviderListener listener) { - } - -// public String getToolTipText(Object element) { -// String description = "Tooltip (" + element + ")"; -// if (element instanceof Item && viewController != null) { -// String pkgName = ((Item) element).getPackageName(); -// description = viewController.getDescription(pkgName); -// } -// -// return description; -// } - - public Point getToolTipShift(Object object) { - return new Point(5, 5); - } - - public int getToolTipTimeDisplyed(Object object) { - return 5000; - } - - public void update(ViewerCell cell) { - int columnIndex = cell.getColumnIndex(); - Object element = cell.getElement(); - String result = null; - switch (columnIndex) { - case 0: - if (element instanceof Item) { - result = ((Item) element).getDisplayName(); - } - break; - case 1: - if (element instanceof Item) { - result = ((Item) element).getStateToString(); - } - break; - case 2: - if (element instanceof Item) { - result = displaySize(element); - } - break; - case 3: - if (element instanceof Item) { - result = ((Item) element).getInstalledVersion(); - } - break; - } - - if (result != null) { - cell.setText(result); - } - - if (element instanceof Item) { - InstallState state = ((Item)element).getInstallState(); - if (state == InstallState.UPDATE || state == InstallState.UNINSTALL) { - cell.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY)); - } - } - } - - private String displaySize(Object element) { - Item item = (Item) element; - - if (item.getCheckState() == CheckState.UNCHECKED) { - return ""; - } else { - return sizeToKB(item.getSize()); - } - } - - private String sizeToKB(Long size) { - if (size <= 0) { - return ""; - } - - double sizeB = (double)size; - double sizeK = sizeB / 1024.0; - double sizeM = sizeK / 1024.0; - - String retSize = String.format("%.1f", sizeM) + "M"; - if (retSize.equals("0.0M")) { - retSize = String.format("%.1f", sizeK) + "K"; - } - - return retSize; - } -} \ No newline at end of file diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemTreeContentProvider.java b/SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemTreeContentProvider.java deleted file mode 100644 index f6056e6..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/model/ItemTreeContentProvider.java +++ /dev/null @@ -1,97 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.model; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.Viewer; - -/** - * an interface to content providers for tree-structure-oriented viewers. - * @author Taeyoung Son - */ -public class ItemTreeContentProvider implements ITreeContentProvider { - @Override - public void dispose() { - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - - @Override - public Object[] getElements(Object inputElement) { - ArrayList retElements = new ArrayList(); - - if (inputElement instanceof List) { - List elementList = (List)inputElement; - - for (Object obj : elementList) { - if (obj instanceof Item) { - Item item = (Item)obj; - - if (item.getParent() == null) { - retElements.add(item); - } - } - } - } - - return retElements.toArray(); - } - - @Override - public Object[] getChildren(Object parentElement) { - if (parentElement instanceof Item) { - return ((Item) parentElement).getChildren().toArray(); - } else { - return null; - } - } - - @Override - public Object getParent(Object element) { - if (element instanceof Item) { - return ((Item) element).getParent(); - } else { - return null; - } - } - - @Override - public boolean hasChildren(Object element) { - if (element instanceof Item) { - return ((Item) element).hasChildren(); - } else { - return false; - } - } -} \ No newline at end of file diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/.gitignore b/SdkImageCreator/src/org/tizen/installmanager/ui/page/.gitignore deleted file mode 100644 index 0536a1f..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/PageTemplate.java diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/CompletePage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/CompletePage.java deleted file mode 100644 index 7f17a1d..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/CompletePage.java +++ /dev/null @@ -1,141 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - -import java.io.File; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType; -import org.tizen.installmanager.util.PathUtil; - - -/** - * Complete Page class - * @author Taeyoung Son - */ -public class CompletePage extends PageTemplate { - public static final String RSC_PATH_INSTALL_IMAGE = RESOURCE_PATH + "/install_manager_graphicmotif_004.png"; - public static final String RSC_PATH_UNINSTALL_IMAGE = RESOURCE_PATH + "/uninstaller_graphicmotif_003.png"; - public static final String STRING_TITLE = "Installation Completed"; - private Label lblNewLabel; - public Button checkBtn; - - /** - * Set basic environment of complete page. - * @param parent - * @param style - */ - public CompletePage(Composite parent, int style) { - super(parent, style); - setLeftImageFromResource(RSC_PATH_INSTALL_IMAGE); - setTitle(STRING_TITLE); - - checkBtn = new Button(customComposite, SWT.CHECK); - checkBtn.setBackground(InstallManagerWindow.getBackgroundColor()); - checkBtn.setText("Show Release Note."); - checkBtn.setLocation(10, 150); - checkBtn.pack(); - checkBtn.setSelection(true); - - lblNewLabel = new Label(customComposite, SWT.WRAP); - lblNewLabel.setBounds(10, 0, 400, 244); - lblNewLabel.setText(""); - lblNewLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - } - - public void loadPage() { - } - - /** - * Get check button - * @return check button object - */ - public Button getChkBtn() { - return checkBtn; - } - - /** - * If bStatus is true, check button will be displayed. but false, check button will not be displayed. - * @param bStatus - */ - public void showCheckButton(boolean bStatus) { - checkBtn.setSelection(false); - checkBtn.setVisible(bStatus); - } - - /** - * Show message on complete page. - * @param completeMsg - */ - public void setCustomMessage(String completeMsg) { - lblNewLabel.setText(completeMsg); - } - - public void removeTargetDir() { - String targetDir = Config.getInstance().getTargetDir(); - if (targetDir == null || targetDir.isEmpty()) { - return; - } - - File targetDirFile = new File(targetDir); - if (!targetDirFile.exists()) { - return; - } else { - if (!Platform.isWindows()) { - int confirm = MessageBoxDlg.showDlg(getShell(), - "WARNING", - "Do you want to remove the SDK directory?\n" + - "Your data files in '" + - targetDir + - "' will be removed too.", - DialogType.WARNING, false); - if (confirm == MessageBoxDlg.YES) { - PathUtil.remove(targetDir); - } else {} - } else {}//if(Patform.isWindows()) - } - } - - /** - * Show error message on complete page. - * @param errorMsg - */ - public void setCustomErrorMessage(String errorMsg) { - lblNewLabel.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED)); - lblNewLabel.setText(errorMsg); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/ConfigPathPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/ConfigPathPage.java deleted file mode 100644 index eaf3bf8..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/ConfigPathPage.java +++ /dev/null @@ -1,88 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.jface.viewers.TableViewerColumn; - -/** - * ConfigPath Page class - * @author Taeyoung Son - */ -public class ConfigPathPage extends PageTemplate { - private static final String RSC_PATH_IMAGE = RESOURCE_PATH + "/install_manager_graphicmotif_003.png"; - private static final String STRING_TITLE = "Install"; - private static final String STRING_SUBTITLE = "Select the package installation and update location."; - - private Table table; - - /** - * @param parent - * @param style - */ - public ConfigPathPage(Composite parent, int style) { - super(parent, style); - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - - TableViewer tableViewer = new TableViewer(customComposite, SWT.BORDER | SWT.FULL_SELECTION); - table = tableViewer.getTable(); - table.setBounds(0, 0, 468, 145); - - TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE); - TableColumn tblclmnName = tableViewerColumn.getColumn(); - tblclmnName.setWidth(60); - tblclmnName.setText("Name"); - - TableViewerColumn tableViewerColumn_1 = new TableViewerColumn(tableViewer, SWT.NONE); - TableColumn tblclmnLatestVer = tableViewerColumn_1.getColumn(); - tblclmnLatestVer.setWidth(60); - tblclmnLatestVer.setText("Latest Ver."); - - TableViewerColumn tableViewerColumn_2 = new TableViewerColumn(tableViewer, SWT.NONE); - TableColumn tblclmnInstalledVer = tableViewerColumn_2.getColumn(); - tblclmnInstalledVer.setWidth(60); - tblclmnInstalledVer.setText("Installed Ver."); - - TableViewerColumn tableViewerColumn_3 = new TableViewerColumn(tableViewer, SWT.NONE); - TableColumn tblclmnSize = tableViewerColumn_3.getColumn(); - tblclmnSize.setWidth(60); - tblclmnSize.setText("Size"); - - TableViewerColumn tableViewerColumn_4 = new TableViewerColumn(tableViewer, SWT.NONE); - TableColumn tblclmnDescription = tableViewerColumn_4.getColumn(); - tblclmnDescription.setWidth(100); - tblclmnDescription.setText("Description"); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallableListPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallableListPage.java deleted file mode 100644 index c480caf..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallableListPage.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.ui.page; - -import java.util.ArrayList; -import java.util.Collection; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.core.SDKExtensionInfo; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IMError; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.model.Item; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.Package; - -/** - * This class displays installable package list on page. - * - * @author Yongsung Kim - */ -public class InstallableListPage extends PackageListPage { - - static final String RSC_PATH_IMAGE = RESOURCE_PATH - + "/install_manager_graphicmotif_002.png"; - static final String STRING_TITLE = "Install Type"; - - static final String TYPICAL_BUTTON_NAME = "Typical"; - static final String MINIMAL_BUTTON_NAME = "Minimal"; - static final String CUSTOM_BUTTON_NAME = "Custom"; - - private Composite buttonComposite; - - // Install Type button - private Button typicalButton; - private Button minimalButton; - private Button customButton; - - // Install Type Explain Label - private Label typicalLabel; - private Label minimalLabel; - - /** - * @param parent - * @param style - */ - public InstallableListPage(Composite parent, int style) { - super(parent, style, Type.INSTALL); - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitleBounds(160, 3, 468, 20); - disableSubtitleBounds(); - setTitle(STRING_TITLE); - - buttonComposite = new Composite(this, SWT.NONE); - - buttonComposite.setSize(468, 60); - buttonComposite.setLocation(160, 27); - buttonComposite - .setBackground(InstallManagerWindow.getBackgroundColor()); - - setButtons(); - } - - /** - * Set Install Type radio buttons. - */ - private void setButtons() { - setTypicalButton(); - setMinimalButton(); - setCustomButton(); - } - - /** - * Set Typical Type radio button. - */ - private void setTypicalButton() { - if (typicalButton == null) { - typicalButton = new Button(buttonComposite, SWT.RADIO); - } - - typicalButton.setSelection(true); - - typicalButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - setCheckedByType(TYPICAL_BUTTON_NAME.toUpperCase()); - checkboxTreeViewer.refresh(); - checkboxTreeViewer.getTree().setEnabled(false); - - lblRequiredSize.setText("Total space required : " - + convertToVolumeSize(getCheckedPackageSize())); - - setNextBtnEnabledAboutCheckedPackageCount(); - } - }); - - typicalButton.setBounds(0, 0, 80, 15); - typicalButton.setText(TYPICAL_BUTTON_NAME + ":"); - typicalButton.setBackground(InstallManagerWindow.getBackgroundColor()); - - typicalLabel = new Label(buttonComposite, SWT.NONE); - typicalLabel.setBounds(81, 0, 410, 15); - } - - /** - * Set Minimal Type radio button. - */ - private void setMinimalButton() { - if (minimalButton == null) { - minimalButton = new Button(buttonComposite, SWT.RADIO); - } - - minimalButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - setCheckedByType(MINIMAL_BUTTON_NAME.toUpperCase()); - checkboxTreeViewer.refresh(); - checkboxTreeViewer.getTree().setEnabled(false); - - lblRequiredSize.setText("Total space required : " - + convertToVolumeSize(getCheckedPackageSize())); - - setNextBtnEnabledAboutCheckedPackageCount(); - } - }); - - minimalButton.setBounds(0, 20, 80, 15); - minimalButton.setText(MINIMAL_BUTTON_NAME + ":"); - minimalButton.setBackground(InstallManagerWindow.getBackgroundColor()); - - minimalLabel = new Label(buttonComposite, SWT.NONE); - minimalLabel.setBounds(81, 20, 410, 15); - } - - /** - * Set Custom Type radio button. - */ - private void setCustomButton() { - if (customButton == null) { - customButton = new Button(buttonComposite, SWT.RADIO); - } - - customButton.setBounds(0, 40, 80, 15); - customButton.setText(CUSTOM_BUTTON_NAME); - customButton.setBackground(InstallManagerWindow.getBackgroundColor()); - - customButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - checkboxTreeViewer.getTree().setEnabled(true); - } - }); - } - - /** - * Check tree item by each install type. - */ - private void setCheckedByType(String installType) { - if (installType == null || installType.isEmpty()) { - Log.err("Install type is empty. check install type or package server is old."); - } - Package pkg = InstallManager.getInstance().getPackageManager() - .getPackageByName(installType); - - if (pkg == null) { - Log.err(installType + " do not exist in package list."); - return; - } - - Collection checkedItems = new ArrayList(); - - for (String pkgName : pkg.getDependentPackageNames()) { - Item item = findItem(pkgName, items); - - if (item != null) { - checkedItems.add(item); - } - } - - setCheckedItem(checkedItems); - } - - private void setCheckedItem(Collection itemList) { - checkboxTreeViewer.setCheckedElements(itemList.toArray()); - - // refresh tree item. All of items are unchecked. - setAllChecked(false); - - // check selected item. - for (Item item : itemList) { - setCheckbox(item, true); - } - } - - /** - * Display installable package list from view controller. - */ - public boolean loadPage(ViewController controller) { - this.viewController = controller; - getItems().clear(); - - // back to next on component selection page case. - // in this case, page status should be typical selection case. - if (customButton.getSelection()) { - customButton.setSelection(false); - typicalButton.setSelection(true); - } else if (minimalButton.getSelection()) { - minimalButton.setSelection(false); - typicalButton.setSelection(true); - } - - try { - loadPackagesToTreeViewer(viewController.getRootMetaPackageListOfRepository()); - - SDKExtensionInfo sdkExtensionInfo = SDKExtensionInfo.getInstance(); - addExtensionPackagesToExtra(sdkExtensionInfo.getExtensionPackages()); - } catch (IMFatalException fatalException) { - Log.err(ErrorController.getErrorMessage()); - IMError.fatalError(ErrorController.getErrorMessage()); - } - - checkboxTreeViewer.refresh(); - - if (getItems().size() <= 0) { - return false; - } - - setCheckedByType(TYPICAL_BUTTON_NAME.toUpperCase()); - checkboxTreeViewer.getTree().setEnabled(false); - - checkboxTreeViewer.refresh(); - - setNextBtnEnabledAboutCheckedPackageCount(); - lblRequiredSize.setText("Total space required : " - + convertToVolumeSize(getCheckedPackageSize())); - - initDescriptionToInstallType(); - - return true; - } - - private void initDescriptionToInstallType() { - PackageManager pm = PackageManager.getInstance(); - - //set typical description - String typicalExplain = ""; - Package typicalPackage = pm.getPackageByName(TYPICAL_BUTTON_NAME.toUpperCase()); - if (typicalPackage != null) { - typicalExplain = typicalPackage.getDescription(); - } - - typicalLabel.setText(typicalExplain); - typicalLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - - //set minimal description - String minimalExplain = ""; - Package minimalPackage = pm.getPackageByName(MINIMAL_BUTTON_NAME.toUpperCase()); - if (minimalPackage != null) { - minimalExplain = minimalPackage.getDescription(); - } - - minimalLabel.setText(minimalExplain); - minimalLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - } - - /** - * Find item which should be checked in component tree. - * - * @param name - * the name of item which should be checked. - * @param itemList - * @return item which should be checked in component tree. - */ - private Item findItem(String name, Collection itemList) { - Item retItem = null; - for (Item item : itemList) { - if (name.equalsIgnoreCase(item.getPackageName())) { - return item; - } else { - Collection childItemList = item.getChildren(); - - if (childItemList.size() > 0) { - retItem = findItem(name, childItemList); - - if (retItem != null) { - break; - } - } - } - } - return retItem; - } -} - - - diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallingPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallingPage.java deleted file mode 100644 index 48ed9bd..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/InstallingPage.java +++ /dev/null @@ -1,591 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - -import java.text.DecimalFormat; -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.ProgressBar; -import org.tizen.installmanager.core.IMExitException; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.IMInstallCancelException; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.ProgramController; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType; - -/** - * @author Taeyoung Son - * - */ -public class InstallingPage extends PageTemplate { - static final String RSC_PATH_IMAGE = RESOURCE_PATH - + "/install_manager_graphicmotif_003.png"; - static final String STRING_TITLE = "Installation Progress"; - static final String STRING_SUBTITLE = "Wait while the Tizen SDK installation is being processed."; - - static final double KB_SIZE = 1; - static final double MB_SIZE = KB_SIZE * 1024; - static final double GB_SIZE = MB_SIZE * 1024; - - static final int SEC = 1; - static final int MIN = SEC * 60; - static final int HOUR = MIN * 60; - static final int DAY = HOUR * 24; - - private static String totalSize; - private static String currentSize; - - private List selectedList; - private ProgressBar progressBar; - private Label statusLabel; - private Label mSubTitleOfProgress; - private Label installedNumberLabel; - private Label mDownloadVelocity; - - private ViewController viewController; - private String installPath; - private InstallProgressMonitor monitor; - private InstallManagerWindow mainWindow; - Display display; - - /** - * Set basic environment of installing page. - * @param parent - * @param style - */ - public InstallingPage(Composite parent, int style) { - super(parent, style); - - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - - progressBar = new ProgressBar(customComposite, SWT.NONE); - progressBar.setBounds(30, 110, 406, 20); - - statusLabel = new Label(customComposite, SWT.NONE); - statusLabel.setBounds(30, 65, 340, 23); - statusLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - - mSubTitleOfProgress = new Label(customComposite, SWT.NONE); - mSubTitleOfProgress.setBounds(30, 138, 260, 23); - mSubTitleOfProgress.setForeground(new Color(null, 96, 96, 96)); - mSubTitleOfProgress - .setBackground(InstallManagerWindow.getBackgroundColor()); - mSubTitleOfProgress.setText(""); - - installedNumberLabel = new Label(customComposite, SWT.NONE); - installedNumberLabel.setAlignment(SWT.RIGHT); - installedNumberLabel.setBounds(275, 90, 160, 23); - installedNumberLabel.setForeground(new Color(null, 0, 108, 209)); - installedNumberLabel - .setBackground(InstallManagerWindow.getBackgroundColor()); - installedNumberLabel.setText(""); - - mDownloadVelocity = new Label(customComposite, SWT.NONE); - mDownloadVelocity.setAlignment(SWT.RIGHT); - mDownloadVelocity.setBounds(295, 138, 140, 23); - mDownloadVelocity.setBackground(InstallManagerWindow.getBackgroundColor()); - mDownloadVelocity.setForeground(new Color(null, 0, 108, 209)); - mDownloadVelocity.setText(""); - } - - /** - * First of all this function check package whether update or not and check install path(target directory) - * is empty. - * @param selectedList - * @param viewController - * @param installPath - * @param mainWindow - * @param isUpdate - * @return true is success to install
false is fail to install - */ - public boolean loadPage(List selectedList, - ViewController viewController, String installPath, - InstallManagerWindow mainWindow, boolean isUpdate) { - this.selectedList = selectedList; - this.viewController = viewController; - this.installPath = installPath; - this.mainWindow = mainWindow; - monitor = new InstallProgressMonitor(); - display = customComposite.getDisplay(); - - if (isUpdate == true) { - ProgramController controller = ProgramController - .createProgramController(); - - if (controller.runningProgramExists()) { - int confirm = MessageBoxDlg - .showDlg( - getShell(), - "Warning", - "SDK is running. If you update the SDK, the running SDK version is stopped. Are you sure you want to update the SDK?", - DialogType.WARNING, false); - if (confirm == MessageBoxDlg.YES) { - controller.terminateRunningProgram(); - } else if (confirm == MessageBoxDlg.NO) { - return false; - } - } - } else {} - - new InstallThread(monitor).start(); - - return true; - } - - /** - * This class controls process to install. - * @author Shihyun Kim - */ - class InstallThread extends Thread { - - private InstallProgressMonitor monitor; - - public InstallThread(InstallProgressMonitor monitor) { - this.monitor = monitor; - } - - /** - * Installing thread run - */ - @Override - public void run() { - try { - installProcess(monitor); - ErrorController.setInstallationSuccess(true); - } catch (IMFatalException e) { - Log.err("internal error occurred"); - Log.ExceptionLog(e); - ErrorController.setInstallationSuccess(false); - } catch (Exception e) { - Log.err("Unexpected exception occurred"); - Log.ExceptionLog(e); - ErrorController.setInstallationSuccess(false); - } finally { - monitor.done(); - } - Log.log("finish install thread"); - } - } - - /** - * After set selected package list and install path, start to install. - * @param monitor - * @throws IMExitException - */ - public void installProcess(InstallProgressMonitor monitor) throws IMExitException { - boolean bResult = false; - - try { - bResult = viewController.install(selectedList, installPath, monitor); - ErrorController.setError(ErrorCode.INSTALLATION_FAIL); - } catch (IMInstallCancelException e) { - bResult = false; - ErrorController.setError(ErrorCode.INSTALL_CANCELED); - Log.log("Installation canceled"); - } - - ErrorController.setInstallationSuccess(bResult); - } - - /** - * Get install progress monitor object - * @return install progress monitor object - */ - public InstallProgressMonitor getInstallProgressMonitor() { - return monitor; - } - - /** - * @author Shihyun Kim - */ - public class InstallProgressMonitor implements IIMProgressMonitor { - - private long totalWork; - private double mProgressSize = 0; - private String mProgressTitle; - private String mSubTitle; - private String status; - private long downloadStartTime = 0; - private boolean isCanceled = false; - - private final int MAX_LENGTH = 40; - private final String STRING_ETC = "..."; - private boolean cancelRequested; - - /** - * Set start time to download. - */ - public void setDownloadStartTime(long startTime) { - this.downloadStartTime = startTime; - } - - @Override - public void beginTask(String name, int totalWork) { - if (display == null || display.isDisposed()) { - setCanceled(true); - return; - } - this.totalWork = totalWork; - this.status = name; - display.asyncExec(new Runnable() { - @Override - public void run() { - statusLabel.setText(status); - downloadStartTime = System.currentTimeMillis(); - } - }); - } - - private boolean retContinue = false; - - /** - * Check cancel button - * @return - * true : user press a cancel button - * false : user do nothing - */ - public boolean checkCancelAndDisableCancelButton() { - retContinue = false; - if (display == null || display.isDisposed()) { - setCanceled(true); - return false; - } - display.syncExec(new Runnable() { - @Override - public void run() { - if (!cancelRequested) { - mainWindow.setCancelBtnEnabled(false); - mDownloadVelocity.setVisible(false); - mSubTitleOfProgress.setBounds(30, 138, 360, 23); - retContinue = true; - } - } - }); - return retContinue; - } - - /** - * Control to finish install process - */ - @Override - public void done() { - if (display == null || display.isDisposed()) { - setCanceled(true); - return; - } - display.asyncExec(new Runnable() { - @Override - public void run() { - progressBar.setSelection(100); - - CompletePage completePage = mainWindow.getCompletePage(); - if (ErrorController.checkInstallationSuccess()) { - completePage.setTitle("Installation Completed"); - - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - completePage - .setCustomMessage("Thank you for installing the Tizen SDK. \n\n" + - "To use the SDK, go to Application > Tizen SDK > Tizen IDE."); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - completePage - .setCustomMessage("Thank you for installing the Tizen SDK. \n\n" + - "To use the SDK, go to Start > All Programs > Tizen SDK > Tizen IDE."); - } else { - completePage - .setCustomMessage("Thank you for installing the Tizen SDK. \n\n"); - } - Log.log("installation complete"); - } else { - Log.log("(un)installation failed"); - completePage.setTitle("(Un)Installation failed"); - completePage.setCustomErrorMessage(ErrorController.getErrorMessage() + "\n"); - mainWindow.getCompletePage().showCheckButton(false); - } - - mainWindow.setCancelBtnEnabled(true); - mainWindow.showComposite(completePage); - - } - }); - } - - @Override - public void internalWorked(double work) { - // Do nothing. - } - - @Override - public boolean isCanceled() { - return isCanceled; - } - - @Override - public void setCanceled(boolean value) { - isCanceled = value; - } - - @Override - public void setTaskName(String name) { - // Do nothing. - } - - @Override - public void subTask(String name) { - // Do nothing. - } - - @Override - public void setPackageName(String name) { - mProgressTitle = name; - } - - @Override - public void setFileName(String name) { - if (name.length() > MAX_LENGTH) { - mSubTitle = name.substring(0, MAX_LENGTH - 2); - mSubTitle = mSubTitle + STRING_ETC; - } else { - mSubTitle = name; - } - } - - /** - * set working package name to show during installing - */ - @Override - public void worked(final int work) { - if (display == null || display.isDisposed()) { - setCanceled(true); - return; - } - display.asyncExec(new Runnable() { - @Override - public void run() { - statusLabel.setText("Processing : package \"" - + mProgressTitle + "\""); - installedNumberLabel.setText(work + "/" + (totalWork)); - progressBar.setSelection(100 * work / (int) totalWork); - } - }); - } - - /** - * set working file name to show during installing - */ - @Override - public void workedFileName() { - if (display == null || display.isDisposed()) { - setCanceled(true); - return; - } - display.asyncExec(new Runnable() { - @Override - public void run() { - mSubTitleOfProgress.setText(mSubTitle); - } - }); - } - - /** - * check validation of download - */ - public void workedChecksum(final long size) { - if (display == null || display.isDisposed()) { - setCanceled(true); - return; - } - display.asyncExec(new Runnable() { - private String pattern = ".##"; - private DecimalFormat dformat = new DecimalFormat(pattern); - - public void run() { - /* set total size */ - mProgressSize += size / (double) 1024; - if (totalWork >= GB_SIZE) - totalSize = dformat.format((totalWork / GB_SIZE)) - + "GB"; - else if (totalWork >= MB_SIZE) - totalSize = dformat.format((totalWork / MB_SIZE)) - + "MB"; - else - totalSize = totalWork + "KB"; - - /* set current download size */ - if (mProgressSize >= GB_SIZE) - currentSize = dformat.format((mProgressSize / GB_SIZE)) - + "GB"; - else if (mProgressSize >= MB_SIZE) - currentSize = dformat.format((mProgressSize / MB_SIZE)) - + "MB"; - else - currentSize = dformat.format(mProgressSize) + "KB"; - - statusLabel.setText("File checking : " + mProgressTitle); - installedNumberLabel.setText(currentSize + "/" + totalSize); - mSubTitleOfProgress.setText(""); - mDownloadVelocity.setText(""); - progressBar - .setSelection((int) (100 * mProgressSize / totalWork)); - - } - }); - } - - /** - * Control download and show download information. - */ - @Override - public void workedDownload(final long size) { - if (display == null || display.isDisposed()) { - setCanceled(true); - return; - } - display.asyncExec(new Runnable() { - private String pattern = ".00"; - private DecimalFormat dformat = new DecimalFormat(pattern); - private String remainTimeStr = ""; - private String downloadVelocityStr = ""; - - @Override - public void run() { - /* set total size */ - mProgressSize += size / (double) 1024; - if (totalWork >= GB_SIZE) - totalSize = dformat.format((totalWork / GB_SIZE)) - + "GB"; - else if (totalWork >= MB_SIZE) - totalSize = dformat.format((totalWork / MB_SIZE)) - + "MB"; - else - totalSize = totalWork + "KB"; - - /* set current download size */ - if (mProgressSize >= GB_SIZE) - currentSize = dformat.format((mProgressSize / GB_SIZE)) - + "GB"; - else if (mProgressSize >= MB_SIZE) - currentSize = dformat.format((mProgressSize / MB_SIZE)) - + "MB"; - else - currentSize = dformat.format(mProgressSize) + "KB"; - - long pastTimes = System.currentTimeMillis() - - downloadStartTime; - - /* set download velocity */ - - double downloadVelocity = 0; - - if (pastTimes > 5000) { - downloadVelocity = mProgressSize - / (double) (pastTimes / (double) 1000); - if (downloadVelocity >= GB_SIZE) - downloadVelocityStr = dformat - .format(downloadVelocity / GB_SIZE) - + "GB/s"; - else if (downloadVelocity >= MB_SIZE) - downloadVelocityStr = dformat - .format(downloadVelocity / MB_SIZE) - + "MB/s"; - else - downloadVelocityStr = dformat - .format(downloadVelocity / KB_SIZE) - + "KB/s"; - } - /* set remain time */ - double remainTime = 0; - if (downloadVelocity == 0) - remainTimeStr = "estimating.."; - else { - double remainSize = totalWork - mProgressSize; - remainTime = remainSize / downloadVelocity; - int day = (int) (remainTime / DAY); - int hour = (int) ((remainTime % DAY) / HOUR); - int min = (int) ((remainTime % HOUR) / MIN); - int sec = (int) (remainTime % MIN); - - if (day > 0) - remainTimeStr = day + "day "; - if (hour > 0) - remainTimeStr += hour + "hour "; - if (min > 0) - remainTimeStr += min + "min "; - if (sec > 0) - remainTimeStr += sec + "sec"; - } - - statusLabel.setText("Downloading : " + mProgressTitle); - installedNumberLabel.setText(currentSize + "/" + totalSize); - mSubTitleOfProgress.setText("Remaining time : " - + remainTimeStr); - mDownloadVelocity.setText(downloadVelocityStr); - progressBar - .setSelection((int) (100 * mProgressSize / totalWork)); - } - }); - } - - - /** - * Show percentage for progress bar - */ - @Override - public void workedProgressbar(final int percent) { - if (display == null || display.isDisposed()) { - setCanceled(true); - return; - } - display.asyncExec(new Runnable() { - @Override - public void run() { - progressBar.setSelection(percent); - } - }); - } - - public void setCancelRequested(boolean b) { - cancelRequested = b; - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/LicensePage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/LicensePage.java deleted file mode 100644 index 66d45af..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/LicensePage.java +++ /dev/null @@ -1,86 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.StyledText; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.util.PathUtil; - - -/** - * @author Taeyoung Son - * - */ -public class LicensePage extends PageTemplate { - private static final String RSC_PATH_IMAGE = RESOURCE_PATH + "/install_manager_graphicmotif_001.png"; - private static final String STRING_TITLE = "License Agreement"; - private static final String STRING_SUBTITLE = "To continue, accept the terms of this agreement."; - - private StyledText txtLicense; - private Button btnAccept; - - /** - * Set basic environment of license page. - * @param parent - * @param style - */ - public LicensePage(Composite parent, int style) { - super(parent, style); - - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - - txtLicense = new StyledText( - customComposite, SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI); - txtLicense.setBounds(0, 0, 437, 264); - - btnAccept = new Button(customComposite, SWT.CHECK); - btnAccept.setBounds(7, 275, 428, 22); - btnAccept.setSelection(false); - btnAccept.setText("I accept the terms of this agreement."); - btnAccept.setBackground(InstallManagerWindow.getBackgroundColor()); - - String txt = PathUtil.readAllTextFromResource("/res/COPYING"); - txtLicense.setText(txt); - txtLicense.setLineAlignment(1, 1, SWT.CENTER); - } - - /** - * Get accept button object - * @return accept button object - */ - public Button getAcceptButton() { - return btnAccept; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/PackageListPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/PackageListPage.java deleted file mode 100644 index d0c4e86..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/PackageListPage.java +++ /dev/null @@ -1,591 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.ui.page; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import org.eclipse.jface.viewers.CheckStateChangedEvent; -import org.eclipse.jface.viewers.CheckboxTreeViewer; -import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; -import org.eclipse.jface.viewers.ICheckStateListener; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseMoveListener; -import org.eclipse.swt.events.MouseTrackAdapter; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeColumn; -import org.eclipse.swt.widgets.TreeItem; -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.pkg.model.Package; -import org.tizen.installmanager.pkg.model.PackageSet; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.model.Item; -import org.tizen.installmanager.ui.model.ItemLabelProvider; -import org.tizen.installmanager.ui.model.ItemTreeContentProvider; -import org.tizen.installmanager.ui.model.Item.CheckState; -import org.tizen.installmanager.ui.model.Item.InstallState; - -/** - * Display install or uninstall package lists via tree view. - * - * @author Taeyoung Son - */ -public abstract class PackageListPage extends PageTemplate { - - private Text mDescriptionText; - protected Tree tree; - private Label lblSelectPackage; - protected Label lblRequiredSize; - protected List items; - protected Label lblDescriptions; - CheckboxTreeViewer checkboxTreeViewer; - ViewController viewController = null; - - Type mType = null; - - private static final String EXTRAS_OF_TREE_ITEM = "EXTRAS"; - public enum Type { - INSTALL, UNINSTALL, UPDATE - } - - /** - * Set environments for packagelist page, such as style, adding listener. - * - * @param parent - * @param style - */ - public PackageListPage(Composite parent, int style, final Type type) { - super(parent, style); - - mType = type; - - items = new ArrayList(); - - setDescriptionText(customComposite); - - lblDescriptions = new Label(getCustomComposite(), SWT.NONE); - lblDescriptions.setBounds(0, 235, 124, 17); - if (Platform.isUbuntu()) { - lblDescriptions.setFont((new Font(Display.getCurrent(), new FontData("Dejavu Sans", 11, SWT.BOLD)))); - } else if (Platform.isWindows()) { - lblDescriptions.setFont((new Font(Display.getCurrent(), new FontData("Verdana", 11, SWT.BOLD)))); - } - lblDescriptions.setText("Description"); - lblDescriptions.setBackground(InstallManagerWindow.getBackgroundColor()); - - checkboxTreeViewer = new CheckboxTreeViewer(customComposite, SWT.BORDER | SWT.H_SCROLL | SWT.LEFT); - tree = checkboxTreeViewer.getTree(); - tree.setBounds(0, 0, 447, 230); - tree.setHeaderVisible(true); - tree.setLayoutData(new GridData(GridData.FILL_BOTH)); - tree.addMouseTrackListener(new MouseTrackAdapter() { - @Override - public void mouseExit(MouseEvent arg0) { - mDescriptionText.setText("Position your mouse pointer over an item to view its description."); - mDescriptionText.setForeground(new Color(null, 96, 96, 96)); - } - }); - - tree.addMouseMoveListener(new MouseMoveListener() { - @Override - public void mouseMove(MouseEvent arg0) { - Point mousePoint = new Point(arg0.x, arg0.y); - TreeItem item = tree.getItem(mousePoint); - if (item != null) { - mDescriptionText.setForeground(new Color(null, 0, 0, 0)); - Item it = (Item)item.getData(); - String packageName = it.getPackageName(); - String description = viewController.getDescription(packageName); - - if (!description.isEmpty()) - mDescriptionText.setText(description); - else - mDescriptionText.setText("\"" + packageName + "\" category."); - } else { - mDescriptionText.setText("Position your mouse pointer over an item to view its description."); - mDescriptionText.setForeground(new Color(null, 96, 96, 96)); - } - } - }); - - TreeColumn trclmnA = new TreeColumn(tree, SWT.LEFT); - trclmnA.setWidth(260); - trclmnA.setText("Name"); - - TreeColumn trclmnB = new TreeColumn(tree, SWT.CENTER); - trclmnB.setWidth(110); - trclmnB.setText("Status"); - - TreeColumn trclmnC = new TreeColumn(tree, SWT.CENTER); - trclmnC.setWidth(50); - trclmnC.setText("Size"); - - checkboxTreeViewer = new CheckboxTreeViewer(tree); - - ColumnViewerToolTipSupport.enableFor(checkboxTreeViewer); - - lblSelectPackage = new Label(getCustomComposite(), SWT.NONE); - lblSelectPackage.setBounds(0, 225, 402, 17); - lblSelectPackage.setText(""); - lblSelectPackage.setBackground(InstallManagerWindow.getBackgroundColor()); - lblSelectPackage.setVisible(false); - - if (Config.status == Config.Status.INSTALL) { - lblRequiredSize = new Label(getCustomComposite(), SWT.NONE); - lblRequiredSize.setBounds(250, 235, 210, 23); - lblRequiredSize.setBackground(InstallManagerWindow.getBackgroundColor()); - } - - checkboxTreeViewer.setContentProvider(new ItemTreeContentProvider()); - checkboxTreeViewer.setLabelProvider(new ItemLabelProvider()); - - checkboxTreeViewer.setInput(getItems()); - - checkboxTreeViewer.addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent e) { - if (e.getElement() instanceof Item) { - - Item item = (Item) e.getElement(); - if (item.getPackageName().equals(Config.SDK_NAME)) { - checkboxTreeViewer.setSubtreeChecked(item, !e.getChecked()); - setCheckbox(item, e.getChecked()); - setNextBtnEnabledAboutCheckedPackageCount(); - return; - } else { - setCheckbox(item, e.getChecked()); - checkboxTreeViewer.refresh(); - - setNextBtnEnabledAboutCheckedPackageCount(); - if (type == Type.INSTALL || type == Type.UPDATE) { - lblRequiredSize.setText("Total space required : " - + convertToVolumeSize(getCheckedPackageSize())); - } - } - } - } - }); - } - - private void setDescriptionText(Composite composite) { - mDescriptionText = new Text( - composite, - SWT.BORDER | SWT.READ_ONLY | SWT.WRAP | SWT.H_SCROLL | SWT.CANCEL | SWT.MULTI); - mDescriptionText.setForeground(new Color(null, 96, 96, 96)); - mDescriptionText.setText("Position your mouse pointer over an item to view its description."); - mDescriptionText.setEditable(false); - mDescriptionText.setEnabled(false); - - if (Platform.isUbuntu()) { - mDescriptionText.setFont((new Font(Display.getCurrent(), new FontData("Dejavu Sans", 9, SWT.NONE)))); - } else if (Platform.isWindows()) { - mDescriptionText.setFont((new Font(Display.getCurrent(), new FontData("Verdana", 9, SWT.NONE)))); - } - - if (mType == Type.INSTALL) { - mDescriptionText.setBounds(0, 257, 447, 45); - } else if (mType == Type.UPDATE) { - mDescriptionText.setBounds(0, 287, 447, 45); - } - } - - protected void setNextBtnEnabledAboutCheckedPackageCount() { - if (getCheckedPackageNumber() > 0) - InstallManagerWindow.setNextBtnEnabled(true); - else - InstallManagerWindow.setNextBtnEnabled(false); - } - - protected void setCheckbox(Item item, boolean checked) { - if (item == null) { - return; - } else { - setChildCheckbox(checkboxTreeViewer, item, checked); - if (item.getParent() != null) { - setParentCheckbox(item.getParent()); - } - - setCheckbox(items); - } - } - - private void setChildCheckbox(CheckboxTreeViewer checkboxTreeViewer, - Item selectedItem, boolean checked) { - if (!selectedItem.hasChildren()) { - setCheckState(selectedItem, checked); - } else { - for (Item item : selectedItem.getChildren()) { - setChildCheckbox(checkboxTreeViewer, item, checked); - } - setCheckStateByChildren(selectedItem); - } - } - - private void setCheckState(Item selectedItem, boolean checked) { - if (selectedItem.getInstallState() == InstallState.INSTALL) { - selectedItem.setCheckState(checked); - } - } - - private void setParentCheckbox(Item parentItem) { - if (parentItem == null) { - return; - } - - setCheckStateByChildren(parentItem); - - if (parentItem.getParent() != null) { - setParentCheckbox(parentItem.getParent()); - } - } - - private void setCheckStateByChildren(Item treeItem) { - if (treeItem.isChildrenAllChecked()) { - treeItem.setCheckState(true); - } else if (treeItem.isChildrenAllUnchecked()) { - treeItem.setCheckState(false); - } else { - treeItem.setCheckState(CheckState.GRAYED); - } - } - - protected void setCheckbox(List itemList) { - checkboxTreeViewer.setCheckedElements(itemList.toArray()); - - for (Item item : itemList) { - if (item.getCheckState() == CheckState.CHECKED) { - checkboxTreeViewer.setGrayed(item, false); - checkboxTreeViewer.setChecked(item, true); - } else if (item.getCheckState() == CheckState.UNCHECKED) { - checkboxTreeViewer.setGrayed(item, false); - checkboxTreeViewer.setChecked(item, false); - } else { - checkboxTreeViewer.setGrayed(item, true); - } - } - } - - /** - * Get items list. - * - * @return items list. - */ - public List getItems() { - return items; - } - - abstract public boolean loadPage(ViewController controller); - - protected void loadPackagesToTreeViewer(PackageSet packageSet) { - //make tree items from package set. - List treeItems = makeTreeItem(packageSet); - - items.addAll(treeItems); - - // make relation for item tree. - makeRelation(items); - makeState(); - } - - public void addExtensionPackagesToExtra(PackageSet packageSet) { - Item extraItem = getExtraTreeItem(); - if (extraItem == null) { - return; - } - - //Always refresh Extra component whatever add and remove. - removeChildrenOfExtra(); - - setDisableExtra(); - - List extensionItems = makeTreeItem(packageSet); - - makeRelation(extensionItems); - - //Add top items of extension items to extra. - for (Item extensionItem : extensionItems) { - if (extensionItem.getParent() == null) { - extraItem.addChildItem(extensionItem); - extensionItem.setParent(extraItem); - } - } - - for (Item item : items) { - if (item.getPackageName().equals(EXTRAS_OF_TREE_ITEM)) { - item.setStateByChildren(); - } - } - - items.addAll(extensionItems); - checkboxTreeViewer.refresh(); - } - - private List makeTreeItem(PackageSet packageSet) { - List treeItemList = new ArrayList(); - - if (packageSet == null) { - return treeItemList; - } - - for (Package pkg : packageSet) { - if (!pkg.isRootMeta() && !pkg.isPartnerMeta() && !pkg.isExtraMeta() && !pkg.isPublicMeta()) { - continue; - } - - if (!Options.partnerSdk) { // Public SDK case - if (pkg.isPartnerMeta()) { - continue; - } - } else { // Partner SDK case - if (pkg.isPublicMeta()) { - continue; - } - } - - String packageName = pkg.getPackageName(); - Package installedPackage = viewController.getInstalledPackage(packageName); - - InstallState itemState = getState(pkg); - - Item newItem = new Item(pkg, installedPackage, itemState); - treeItemList.add(newItem); - } - - return treeItemList; - } - - private Item getExtraTreeItem() { - for (Item tItem : items) { - if (tItem.getPackageName().equalsIgnoreCase(EXTRAS_OF_TREE_ITEM)) { - return tItem; - } - } - return null; - } - - private void setDisableExtra() { - checkboxTreeViewer.addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent e) { - Item item = (Item) e.getElement(); - if (item.equals(getExtraTreeItem())) { - if (!item.hasChildren()) { - checkboxTreeViewer.setChecked(item, false); - setNextBtnEnabledAboutCheckedPackageCount(); - } - } - } - }); - } - - private void removeChildrenOfExtra() { - Item extraItem = getExtraTreeItem(); - - for (Item childItem : extraItem.getChildren()) { - removeTreeItem(childItem); - } - - extraItem.clearChildrenItems(); - } - - private void removeTreeItem(Item item) { - if (item.hasChildren()) { - for (Item childItem : item.getChildren()) { - removeTreeItem(childItem); - } - } - - items.remove(item); - } - private InstallState getState(Package pkg) { - if (viewController.getInstallableMetaPackageList().contains(pkg)) { - return InstallState.INSTALL; - } else if (viewController.getUpdatableMetapackageList().contains(pkg)) { - return InstallState.UPDATE; - } else { - return InstallState.UNINSTALL; - } - } - - private void makeRelation(List treeItems) { - // set relation of items. - for (Item item : treeItems) { - setRelationOfItem(item, treeItems); - } - - Collections.sort(treeItems); - } - - private void makeState() { - for (Item item : items) { - item.setStateByChildren(); - } - } - - private void setRelationOfItem(Item parentItem, List compareList) { - Package packageOfParentItem = parentItem.getPackage(); - Collection theChildPackage = packageOfParentItem.getDependentPackageNames(); - - for (String childPackage : theChildPackage) { - for (Item treeItem : compareList) { - String packageNameOfTreeItem = treeItem.getPackageName(); - - if (packageNameOfTreeItem.equalsIgnoreCase(childPackage)) { - parentItem.addChildItem(treeItem); - treeItem.setParent(parentItem); - break; - } - } - } - } - - protected void setAllChecked(boolean checked) { - List items = getItems(); - if (items == null) { - return; - } - - for (Item treeItem : items) { - setCheckbox(treeItem, checked); - } - } - - protected void setDisableChecked(List items, boolean checked) { - if (items == null) { - return; - } - - for (Item item : items) { - setDisableChecked(item, checked); - } - } - - protected void setDisableChecked(Item item, boolean checked) { - if (item == null) { - return; - } - - setChildCheckbox(checkboxTreeViewer, item, checked); - setParentCheckbox(item); - } - - /** - * Get checked packages count. - * - * @return checked packages count. - */ - public int getCheckedPackageNumber() { - int result = 0; - if (checkboxTreeViewer != null) { - Object[] items = checkboxTreeViewer.getCheckedElements(); - result = items.length; - } - return result; - } - - /** - * Get checked packages size. - * - * @return checked packages size. - */ - public long getCheckedPackageSize() { - List listPkgName = new ArrayList(); - - if (checkboxTreeViewer != null) { - Object[] items = checkboxTreeViewer.getCheckedElements(); - - for (Object item : items) { - Item checkedItem = (Item)item; - if (checkedItem.getCheckState() == CheckState.CHECKED) { - listPkgName.add(checkedItem.getPackageName()); - } - } - } - - return viewController.getTotalSizeWithDepends(listPkgName); - } - - public List getCheckedPackageNames() { - List listPkgName = new ArrayList(); - - if (checkboxTreeViewer != null) { - Object[] items = checkboxTreeViewer.getCheckedElements(); - - for (int i = 0; i < items.length; i++) { - Item item = (Item) items[i]; - if (item.getParent() != null) { - listPkgName.add(item.getPackageName()); - } - } - } - - return listPkgName; - } - - /** - * Calculate byte to GB, MB, KB. - * - * @param byteSize - * @return Converted byte to GB, MB, KB - */ - public String convertToVolumeSize(long byteSize) { - final double KB_SIZE = 1024; - final double MB_SIZE = KB_SIZE * 1024; - final double GB_SIZE = MB_SIZE * 1024; - - String sizeStr; - String pattern = ".#"; - DecimalFormat dformat = new DecimalFormat(pattern); - - if (byteSize >= GB_SIZE) - sizeStr = dformat.format((byteSize / GB_SIZE)) + "GB"; - else if (byteSize >= MB_SIZE) - sizeStr = dformat.format((byteSize / MB_SIZE)) + "MB"; - else if (byteSize >= KB_SIZE) - sizeStr = dformat.format((byteSize / KB_SIZE)) + "KB"; - else - sizeStr = byteSize + "byte"; - return sizeStr; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/SetInstallDirectoryPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/SetInstallDirectoryPage.java deleted file mode 100644 index 3141c4a..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/SetInstallDirectoryPage.java +++ /dev/null @@ -1,404 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - -import java.io.File; -import java.text.DecimalFormat; -import java.util.List; -import java.util.regex.PatternSyntaxException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.IFileSystemInformation; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.linux.LinuxFileSystemInfo; -import org.tizen.installmanager.lib.win.WindowsFileSystemInfo; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType; -import org.tizen.installmanager.util.PathUtil; - - - -/** - * @author Taeyoung Son - * - */ -public class SetInstallDirectoryPage extends PageTemplate { - - private static final String RSC_PATH_IMAGE = RESOURCE_PATH + "/install_manager_graphicmotif_002.png"; - private static final String STRING_TITLE = "Location"; - private static final String STRING_SUBTITLE = "Select the installation location."; - private static final String WINDOWS_DEFAULT_TARGET_PATH = "C:\\tizen-sdk"; - - private Text installDirectoryText; - private Label installDirectoryLabel; - private Label installDirectoryErrLabel; - private Label spaceRequiredLabel; - private Label spaceAvailableLabel; - private Button selectPathBtn; - ViewController viewController = null; - private long requiredSpace = 0; - private File selectedDisk = null; - - /** - * @param parent - * @param style - */ - public SetInstallDirectoryPage(Composite parent, int style) { - super(parent, style); - initPage(); - } - - /** - * Set default install target directory depends on platform. - */ - private void setTargetDirectory() { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - installDirectoryText.setText(System.getProperty("user.home") + File.separator + Config.SDK_DIRECTORY); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - installDirectoryText.setText(WINDOWS_DEFAULT_TARGET_PATH); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - /** - * Set basic environment of complete page. and check available space to install. - */ - public void initPage() { - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - - installDirectoryLabel = new Label(customComposite, SWT.NONE); - installDirectoryLabel.setBounds(20, 80, 150, 17); - installDirectoryLabel.setText("Install " + Config.SDK_NAME + " to :"); - installDirectoryLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - - installDirectoryErrLabel = new Label(customComposite, SWT.WRAP); - installDirectoryErrLabel.setBounds(20, 140, 400, 50); - installDirectoryErrLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - installDirectoryErrLabel.setForeground(new Color(null, 255, 0, 0)); - - spaceRequiredLabel = new Label(customComposite, SWT.NONE); - spaceRequiredLabel.setBounds(20, 240, 250, 17); - spaceRequiredLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - - spaceAvailableLabel = new Label(customComposite, SWT.NONE); - spaceAvailableLabel.setBounds(20, 265, 250, 17); - spaceAvailableLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - - installDirectoryText = new Text(customComposite, SWT.BORDER); - installDirectoryText.setBounds(10, 105, 390, 27); - installDirectoryText.addModifyListener(new ModifyListener() { - - @Override - public void modifyText(ModifyEvent arg0) { - boolean availablePath = checkAvailablePath(); - InstallManagerWindow.setNextBtnEnabled(availablePath); - } - }); - - setTargetDirectory(); - - selectPathBtn = new Button(customComposite, SWT.NONE); - selectPathBtn.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - boolean isAvailablePath = true; - do { - String strDir = showSettingInstallpathDlg(); - if (strDir != null) { - if (requiredSpace > getAvailableSpaceSize(strDir)) { - isAvailablePath = false; - MessageBoxDlg.showDlg( - e.display.getShells()[0], - "Error", - "Not enough disk space for the installation. Select a different installation path.", - DialogType.ERROR, false); - } else - isAvailablePath = true; - - if (isAvailablePath == true) { - File strFile = new File(strDir + File.separator + Config.SDK_DIRECTORY); - installDirectoryText.setText(strFile.getAbsolutePath()); - setAvailableSpace(strDir); - spaceAvailableLabel.setText("Space available : " + convertToVolumeSize(selectedDisk.getUsableSpace())); - } - } else - isAvailablePath = true; - } while (isAvailablePath == false); - } - }); - selectPathBtn.setImage(PathUtil.getImageFromResource("/res/icons/icon_directory_open.png")); - selectPathBtn.setBounds(408, 105, 35, 29); - } - - private boolean checkAvailablePath() { - if (installDirectoryText.getText().equals("")) { - installDirectoryErrLabel.setText("Set the installation path."); - spaceAvailableLabel.setText("Space available : "); - return false; - } - - try { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - if (!installDirectoryText.getText().matches("[^= ]+")) { - installDirectoryErrLabel.setText("Value cannot contain the '=' character or spaces."); - return false; - } else { - if (!installDirectoryText.getText().startsWith(System.getProperty("user.home"))) { - installDirectoryErrLabel.setText("Set the installation path to the home directory."); - return false; - } - } - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - if (!installDirectoryText.getText().matches("[^`~!@#$%^&*=? ]+")) { - installDirectoryErrLabel.setText("Value cannot contain special characters or spaces."); - return false; - } - } - } catch (PatternSyntaxException e) { - } - - long availableSize = getAvailableSpaceSize(installDirectoryText.getText()); - if (availableSize >= 0) - spaceAvailableLabel.setText("Space available : " + convertToVolumeSize(availableSize)); - else { - installDirectoryErrLabel.setText("Set the installation path correctly."); - spaceAvailableLabel.setText("Space available : "); - return false; - } - if (requiredSpace > availableSize) { - installDirectoryErrLabel.setText("Not enough disk space for the installation. Select a different installation path."); - return false; - } - installDirectoryErrLabel.setText(""); - return true; - } - - /** - * Display install directory page, if space is not available for install, page will show warning dialog. - * @param controller - * @param requiredSize - * @return - */ - public boolean loadPage(ViewController controller, long requiredSize) { - boolean result = true; - viewController = controller; - requiredSpace = requiredSize; - - InstallManagerWindow.setNextBtnEnabled(checkAvailablePath()); - setAvailableSpace(installDirectoryText.getText()); - - spaceRequiredLabel.setText("Total space required : " + convertToVolumeSize(requiredSize)); - if (selectedDisk != null) - spaceAvailableLabel.setText("Space available : " + convertToVolumeSize(selectedDisk.getUsableSpace())); - else { - MessageBoxDlg.showDlg( - Display.getCurrent().getShells()[0], "Notify", - "Select the installation path.", DialogType.ERROR, false); - } - return result; - } - - /** - * Get install path. - * @return install path. - */ - public String getInstallPath() { - String temp = installDirectoryText.getText(); - String installPath = installDirectoryText.getText(); - if (temp.startsWith("~")) { - installPath = temp.replaceFirst("~", System.getProperty("user.home")); - } - return installPath; - } - - /** - * Calculating byte to GB, MB, KB - * @param byteSize - * @return converted byte size. - */ - public String convertToVolumeSize(long byteSize) { - final double KB_SIZE = 1024; - final double MB_SIZE = KB_SIZE * 1024; - final double GB_SIZE = MB_SIZE * 1024; - - String sizeStr; - String pattern = ".#"; - DecimalFormat dformat = new DecimalFormat(pattern); - - if (byteSize >= GB_SIZE) - sizeStr = dformat.format((byteSize / GB_SIZE)) + "GB"; - else if (byteSize >= MB_SIZE) - sizeStr = dformat.format((byteSize / MB_SIZE)) + "MB"; - else if (byteSize >= KB_SIZE) - sizeStr = dformat.format((byteSize / KB_SIZE)) + "KB"; - else - sizeStr = byteSize + "byte"; - return sizeStr; - } - - private void setAvailableSpace(String selectedPath) { - IFileSystemInformation fsInfo; - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) - fsInfo = new LinuxFileSystemInfo(); - else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) - fsInfo = new WindowsFileSystemInfo(); - else - fsInfo = new IFileSystemInformation() { - - @Override - public List getListMounts() { - // TODO Auto-generated method stub - return null; - } - - @Override - public File[] getListDevices() { - // TODO Auto-generated method stub - return null; - } - - @Override - public FileSystemType getFileSystemType(File disk) { - // TODO Auto-generated method stub - return FileSystemType.UNKNOWN; - } - }; - - List mountList = fsInfo.getListMounts(); - if (mountList == null) - return; - String selectedRoot = ""; - for (int i = 0; i < mountList.size(); i++) { - if (selectedPath.toLowerCase().startsWith( - mountList.get(i).getAbsolutePath().toLowerCase())) { - if (!selectedRoot.startsWith(mountList.get(i).getAbsolutePath())) { - selectedRoot = mountList.get(i).getAbsolutePath(); - selectedDisk = mountList.get(i); - } - } - } - } - - private long getAvailableSpaceSize(String selectedPath) { - IFileSystemInformation fsInfo; - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) - fsInfo = new LinuxFileSystemInfo(); - else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) - fsInfo = new WindowsFileSystemInfo(); - else - fsInfo = new IFileSystemInformation() { - - @Override - public List getListMounts() { - // TODO Auto-generated method stub - return null; - } - - @Override - public File[] getListDevices() { - // TODO Auto-generated method stub - return null; - } - - @Override - public FileSystemType getFileSystemType(File disk) { - // TODO Auto-generated method stub - return FileSystemType.UNKNOWN; - } - }; - - List mountList = fsInfo.getListMounts(); - if (mountList == null) - return 0; - String selectedRoot = ""; - long freeSpaceSize = -1; - for (int i = 0; i < mountList.size(); i++) { - if (selectedPath.toLowerCase().startsWith( - mountList.get(i).getAbsolutePath().toLowerCase())) { - if (!selectedRoot.startsWith(mountList.get(i).getAbsolutePath())) { - selectedRoot = mountList.get(i).getAbsolutePath(); - freeSpaceSize = mountList.get(i).getUsableSpace(); - } - } - } - return freeSpaceSize; - } - - private String showSettingInstallpathDlg() { - DirectoryDialog dlg = new DirectoryDialog(Display.getCurrent().getShells()[0]); - dlg.setFilterPath(getInstallPath()); - dlg.setText("Install Manager Directory"); - dlg.setMessage("Select a directory"); - - String strDir = dlg.open(); - - return strDir; - } - - /** - * Check install path validation for space. - * @return - * true : available
- * false : unavailable - */ - public boolean isInstallablePath() { - if (requiredSpace > getAvailableSpaceSize(installDirectoryText.getText())) - return false; - return true; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallableListPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallableListPage.java deleted file mode 100644 index 2a9dfeb..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallableListPage.java +++ /dev/null @@ -1,145 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.viewers.CheckStateChangedEvent; -import org.eclipse.jface.viewers.ICheckStateListener; -import org.eclipse.swt.widgets.Composite; -import org.tizen.installmanager.ui.model.Item; - - -/** - * This class displays uninstallable package list on page. - * @author Taeyoung Son - */ -public class UninstallableListPage extends PackageListPage { - static final String RSC_PATH_IMAGE = RESOURCE_PATH + "/uninstaller_graphicmotif_001.png"; - static final String STRING_TITLE = "Uninstall Items"; - static final String STRING_SUBTITLE = "You can see the items to uninstall."; - - /** - * Display packages tree structure and add check state listener. a package is selected by check, - * if selected package has child packages, tree will be expanded and show children of selected package. - * @param parent - * @param style - */ - public UninstallableListPage(Composite parent, int style) { - super(parent, style, Type.UNINSTALL); - - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - - checkboxTreeViewer.addCheckStateListener(new ICheckStateListener() { - @Override - public void checkStateChanged(CheckStateChangedEvent e) { - if (e.getChecked()) { - checkboxTreeViewer.setSubtreeChecked(e.getElement(), true); - if (e.getElement() instanceof Item) { - Item item = (Item) e.getElement(); - item.setSubItemChecked(true); - Object[] descendants = item.getDescendants().toArray(); - for (int i = 0; i < descendants.length; i++) - checkboxTreeViewer.setGrayed(descendants[i], false); - } - } else { - checkboxTreeViewer.setSubtreeChecked(e.getElement(), false); - if (e.getElement() instanceof Item) { - Item item = (Item) e.getElement(); - item.setSubItemChecked(false); - Object[] descendants = item.getDescendants().toArray(); - for (int i = 0; i < descendants.length; i++) - checkboxTreeViewer.setGrayed(descendants[i], false); - } - } - if (e.getElement() instanceof Item) { - List grayCheckedItems = new ArrayList(); - List checkedItems = new ArrayList(); - List unCheckedItems = new ArrayList(); - Item item = (Item) e.getElement(); - if (item.getParent() != null) { - item.getParent().checkSuperItemGrayed( - grayCheckedItems, checkedItems, unCheckedItems); - for (int i = 0; i < grayCheckedItems.size(); i++) { - checkboxTreeViewer.setGrayChecked(grayCheckedItems.get(i), true); - } - for (int i = 0; i < checkedItems.size(); i++) { - checkboxTreeViewer.setGrayed(checkedItems.get(i), false); - checkboxTreeViewer.setChecked(checkedItems.get(i), true); - } - for (int i = 0; i < unCheckedItems.size(); i++) { - checkboxTreeViewer.setGrayed(unCheckedItems.get(i), false); - checkboxTreeViewer.setChecked(unCheckedItems.get(i), false); - } - } - } - } - }); - } - - /** - * Display uninstallable list page. - */ - public boolean loadPage(ViewController controller) { - this.viewController = controller; - getItems().clear(); - - loadPackagesToTreeViewer(viewController.getRemovableMetaPackageList()); - - if (getItems().size() <= 0) { - setUninstallAll(); - } - - setUninstallColumn(); - checkboxTreeViewer.refresh(); - setAllChecked(true); - return true; - } - - /** - * Change column in uninstallable list page. - */ - protected void setUninstallColumn() { - tree.getColumn(1).setText("Status"); -// tree.getColumn(1).setWidth(0); -// tree.getColumn(2).setText("Installed version"); -// tree.getColumn(3).setWidth(0); - } - - /** - * When all packages must be removed, Set TIZEN SDK item in uninstallable list page - */ - protected void setUninstallAll() { - //TODO impl -// getItems().add(new Item(null, Config.SDK_NAME, "", "unknown", 0, State.UNINSTALL)); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallingPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallingPage.java deleted file mode 100644 index 3fa42c8..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/UninstallingPage.java +++ /dev/null @@ -1,344 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.ProgressBar; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.ProgramController; -import org.tizen.installmanager.pkg.model.PackageSet; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg; -import org.tizen.installmanager.ui.dialog.MessageBoxDlg.DialogType; -import org.tizen.installmanager.pkg.model.Package; - -/** - * @author Taeyoung Son - * @author Shihyun Kim - */ -public class UninstallingPage extends PageTemplate { - static final String RSC_PATH_IMAGE = RESOURCE_PATH + "/uninstaller_graphicmotif_002.png"; - static final String STRING_TITLE = "Uninstalling..."; - static final String STRING_SUBTITLE = ""; - - - private ProgressBar progressBar; - private Label statusLabel; - private Label uninstalledNumberLabel; - private Label mSubTitleOfProgress; - - private ViewController viewController; - private UninstallProgressMonitor monitor; - private InstallManagerWindow mainWindow; - Display display; - - /** - * Set basic environment of uninstalling page. - * @param parent - * @param style - */ - public UninstallingPage(Composite parent, int style) { - super(parent, style); - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - - progressBar = new ProgressBar(customComposite, SWT.NONE); - progressBar.setBounds(40, 110, 396, 20); - - statusLabel = new Label(customComposite, SWT.NONE); - statusLabel.setBounds(40, 80, 343, 23); - statusLabel.setForeground(new Color(null, 96, 96, 96)); - statusLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - - mSubTitleOfProgress = new Label(customComposite, SWT.NONE); - mSubTitleOfProgress.setBounds(40, 138, 250, 23); - mSubTitleOfProgress.setBackground(InstallManagerWindow.getBackgroundColor()); - mSubTitleOfProgress.setText(""); - - uninstalledNumberLabel = new Label(customComposite, SWT.CENTER); - uninstalledNumberLabel.setBounds(353, 138, 80, 23); - uninstalledNumberLabel.setBackground(InstallManagerWindow.getBackgroundColor()); - uninstalledNumberLabel.setText(""); - } - - /** - * Display uninstalling page, if sdk is running during uninstalling, page will show warning dialog. - * @param selectedList - * @param vController - * @param mainWindow - * @return - */ - public boolean loadPage( - List selectedList, ViewController vController, - InstallManagerWindow mainWindow) { - this.viewController = vController; - this.mainWindow = mainWindow; - monitor = new UninstallProgressMonitor(); - display = customComposite.getDisplay(); - - //kill running process. - ProgramController controller = ProgramController.createProgramController(); - if (controller.runningProgramExists()) { - int confirm = MessageBoxDlg.showDlg( - getShell(), - "Warning", - "SDK is running now. If you update the SDK, the running is stopped. Are you sure to uninstall the SDK?", - DialogType.WARNING, false); - if (confirm == MessageBoxDlg.YES) { - controller.terminateRunningProgram(); - } else if (confirm == MessageBoxDlg.NO) { - return false; - } - } else {} - - //start uninstall. - final UninstallThread uninstallThread = new UninstallThread(monitor); - uninstallThread.start(); - - return true; - } - - /** - * This class controls process to uninstall. - * @author Shihyun Kim - */ - class UninstallThread extends Thread { - private IIMProgressMonitor monitor; - - public UninstallThread(IIMProgressMonitor monitor) { - this.monitor = monitor; - } - - /** - * Uninstalling thread run - */ - @Override - public void run() { - try { - uninstallProcess(monitor); - } catch (IMFatalException e) { - Log.err("internal error occurred"); - Log.ExceptionLog(e); - ErrorController.setInstallationSuccess(false); - } catch (Exception e) { - Log.err("Unexpected exception occurred"); - Log.ExceptionLog(e); - ErrorController.setInstallationSuccess(false); - } finally { - monitor.done(); - } - Log.log("finish uninstall thread"); - } - } - - /** - * After check selected package list size, start to uninstall. - * @param monitor - */ - public void uninstallProcess(IIMProgressMonitor monitor) { - boolean result = false; - - PackageSet pkgs = InstallManager.getInstance().getPackageManager().getInstalledPackages(); - List installedList = new ArrayList(); - for (Package pkg : pkgs) { - installedList.add(pkg.getPackageName()); - } - - if (installedList.size() <= 0) { - return; - } else { - result = viewController.uninstall(installedList, monitor); - } - - ErrorController.setInstallationSuccess(result); - } - - /** - * @author Shihyun Kim - */ - public class UninstallProgressMonitor implements IIMProgressMonitor { - - private int totalWork; - private String mProgressTitle = ""; - private String mSubTitle = ""; - - private final int MAX_LENGTH = 40; - private final String STRING_ETC = "..."; - - @Override - public void beginTask(final String name, int totalWork) { - this.mProgressTitle = name; - this.totalWork = totalWork; - display.asyncExec(new Runnable() { - - @Override - public void run() { - statusLabel.setText(name); - } - }); - } - - /** - * Control to finish uninstall process - */ - @Override - public void done() { - display.asyncExec(new Runnable() { - @Override - public void run() { - progressBar.setSelection(100); - - CompletePage completePage = mainWindow.getCompletePage(); - completePage.setLeftImageFromResource(CompletePage.RSC_PATH_UNINSTALL_IMAGE); - completePage.showCheckButton(false); - mainWindow.setCancelBtnEnabled(true); - mainWindow.showComposite(completePage); - - if (ErrorController.checkInstallationSuccess()) { - completePage.setTitle("Uninstallation Completed!"); - if (!viewController.existRemovablePackage()) { - completePage.removeTargetDir(); - } else {}; - - String msg = "Thank you for using Tizen SDK. "; - - completePage.setCustomMessage(msg); - } else { - completePage.setTitle("Uninstallation Failed!"); - completePage.setCustomErrorMessage("Sorry, Uninstallation was not success. Please try uninstall again."); - } - } - }); - } - - @Override - public void internalWorked(double work) { - // Do nothing. - } - - @Override - public boolean isCanceled() { - return false; - } - - @Override - public void setCanceled(boolean value) { - // Do nothing. - } - - @Override - public void setTaskName(String name) { - // Do nothing. - } - - @Override - public void subTask(String name) { - // Do nothing. - } - - @Override - public void setPackageName(String name) { - mProgressTitle = name; - } - - @Override - public void setFileName(String name) { - if (name.length() > MAX_LENGTH) { - mSubTitle = name.substring(0, MAX_LENGTH - 2); - mSubTitle = mSubTitle + STRING_ETC; - } else { - mSubTitle = name; - } - } - - /** - * set working package name to show during uninstalling - */ - @Override - public void worked(final int work) { - display.asyncExec(new Runnable() { - @Override - public void run() { - statusLabel.setText("Processing : package \"" + mProgressTitle + "\""); - mSubTitleOfProgress.setText(mSubTitle); - uninstalledNumberLabel.setText(work + "/" + totalWork); - progressBar.setSelection(100 * work / totalWork); - } - }); - } - - /** - * set working file name to show during uninstalling - */ - @Override - public void workedFileName() { - display.asyncExec(new Runnable() { - @Override - public void run() { - mSubTitleOfProgress.setText(mSubTitle); - } - }); - } - - @Override - public void workedDownload(long size) { - // TODO Auto-generated method stub - - } - - @Override - public void setDownloadStartTime(long startTime) { - // TODO Auto-generated method stub - - } - - @Override - public void workedChecksum(long size) { - // TODO Auto-generated method stub - - } - - @Override - public void workedProgressbar(int percent) { - progressBar.setSelection(percent); - } - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/UpdatableListPage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/UpdatableListPage.java deleted file mode 100644 index 73e7609..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/UpdatableListPage.java +++ /dev/null @@ -1,102 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - - - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.widgets.Composite; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.SDKExtensionInfo; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IMError; -import org.tizen.installmanager.lib.Log; - -/** - * This class displays installable package list on page. - * @author Yongsung Kim - */ -public class UpdatableListPage extends PackageListPage { - - static final String RSC_PATH_IMAGE = RESOURCE_PATH + "/install_manager_graphicmotif_002.png"; - static final String STRING_TITLE = "Update"; - static final String STRING_SUBTITLE = "Updated components are installed.\n" + - "You can select additional components for installation as well."; - - /** - * @param parent - * @param style - */ - public UpdatableListPage(Composite parent, int style) { - super(parent, style, Type.UPDATE); - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitleBounds(160, 3, 468, 20); - setSubTitleBounds(160, 25, 468, 30); - setCustomCompositeBounds(160, 60, 468, 334); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - setSubTitleFont(new FontData("Dejavu Sans", 9, SWT.NONE)); - tree.setBounds(0, 0, 447, 260); - lblRequiredSize.setBounds(250, 265, 210, 23); - lblDescriptions.setBounds(0, 265, 124, 17); - } - - /** - * Display installable package list from view controller. - */ - public boolean loadPage(ViewController controller) { - this.viewController = controller; - getItems().clear(); - - try { - loadPackagesToTreeViewer(viewController.getRootMetaPackageListOfRepository()); - - SDKExtensionInfo sdkExtensionInfo = SDKExtensionInfo.getInstance(); - addExtensionPackagesToExtra(sdkExtensionInfo.getExtensionPackages()); - - } catch (IMFatalException fatalException) { - Log.err(ErrorController.getErrorMessage()); - IMError.fatalError(ErrorController.getErrorMessage()); - } - - if (getItems().size() <= 0) { - return false; - } - - setCheckbox(items); - - checkboxTreeViewer.refresh(); - - setNextBtnEnabledAboutCheckedPackageCount(); - lblRequiredSize.setText("Total space required : " + convertToVolumeSize(getCheckedPackageSize())); - - return true; - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/ViewController.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/ViewController.java deleted file mode 100644 index 3cf7d47..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/ViewController.java +++ /dev/null @@ -1,439 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - -import java.io.File; -import java.util.Collection; -import java.util.List; - -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMExitException; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.core.Config.ServerType; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.IIMProgressMonitor; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.Registry; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.Package; -import org.tizen.installmanager.pkg.model.PackageSet; -import org.tizen.installmanager.ui.page.InstallingPage.InstallProgressMonitor; -import org.tizen.installmanager.util.PathUtil; - - -/** - * This class is a connector between Model and View. Model and View can communicate each other via ViewController. - * @author Taeyoung Son - */ -public class ViewController { - - private InstallManager installManager; - private PackageManager packageManager; - - /** - * Initialize objects which need to install. - * @return - * true : Success to Initialize
- * false : Fail to Initialize - */ - public boolean init() { - Log.log("ViewController init"); - - try { - installManager = InstallManager.getInstance(); - installManager.init(); - packageManager = installManager.getPackageManager(); - - if (packageManager == null) { - throw new IMFatalException("Cannot read package information."); - } else { - if (existInstallableOrRemovablePackages()) { - return true; - } else { - ErrorController.setInstallationSuccess(false); - return false; - } - } - } catch(IMFatalException e) { - Log.ExceptionLog(e); - return false; - } - } - - /** - * Get meta packages that are available to install or to update. - * @return Meta package set - */ - public PackageSet getInstallableOrUpdatableMetaPackages() { - if (packageManager == null) { - return null; - } else { - return packageManager.getInstallableOrUpdatableMetaPackages(); - } - } - - /** - * Get meta packages that are available to install. - * @return Meta package set - */ - public PackageSet getInstallableMetaPackageList() { - if (packageManager == null) { - return null; - } else { - return packageManager.getInstallableMetaPackages(); - } - } - - /** - * Get meta packages in repository. - * @return Meta package set - */ - public PackageSet getRootMetaPackageListOfRepository() { - if (packageManager == null) { - return null; - } else { - return packageManager.getRootMetaPackagesOfRepository(); - } - } - - /** - * Get meta packages that are available to update. - * @return Meta package set - */ - public PackageSet getUpdatableMetapackageList() { - if (packageManager == null) { - return null; - } else { - return packageManager.getUpdatableMetaPackages(); - } - } - - /** - * Get meta packages that are available to update. - * @return Meta package set - */ - public PackageSet getNotUpdatableMetapackageList() { - if (packageManager == null) { - return null; - } else { - return packageManager.getNotInstallableAndNotUpdatablePackages(); - } - } - - /** - * Get meta packages that are available to remove. - * @return Meta package set - */ - public PackageSet getRemovableMetaPackageList() { - if (packageManager == null) { - return null; - } else { - return packageManager.getRemovableMetaPackages(); - } - } - - public PackageSet getInstallablePackageListInSnapshot() { - if (packageManager == null) { - return null; - } else { - return packageManager.getInstallableMetaPackagesInSnapshot(); - } - } - - /** - * Get packages that are available to remove. - * @return package set - */ - public PackageSet getRemovablePackageList() { - if (packageManager == null) { - return null; - } else { - return packageManager.getInstalledPackages(); - } - } - - /** - * Check to exist removable packages. - * @return if installed package exists, return true. if not return false. - */ - public boolean existRemovablePackage() { - if (packageManager == null) { - return false; - } else { - return packageManager.existInstalledPackages(); - } - } - - /** - * Start to install and update. - * @param installList : selected mata packages - * @param targetPath : install path - * @param monitor - * @return If installation is succeeded, return true. if not return false. - * @throws IMExitException - */ - public boolean install(Collection installList, String targetPath, - InstallProgressMonitor monitor) throws IMExitException { - - Log.log("======== Start Installing ========"); - Log.log("ViewController install => Selected package list: " + installList); - - if (packageManager == null) { - Log.err("Package list does not exist."); - return false; - } - - if (installList.size() == 0) { - Log.log("Package install success."); - return true; - } - - PackageSet selectedMetas = packageManager.getPackagesByNames(installList); - - //add mandotory packages - selectedMetas.addAll(packageManager.getMandatoryPackages()); - - //get package set by pusrpose. - selectedMetas = getMetaPackagesByPurpose(selectedMetas); - - return installManager.install(selectedMetas, targetPath, monitor); - - } - - private PackageSet getMetaPackagesByPurpose(PackageSet metaPackages) { - for (Package pkg : metaPackages) { - String attribute = pkg.getAttribute(); - - if (!attribute.equalsIgnoreCase("root") && attribute.equals("extra")) { - if (!attribute.equalsIgnoreCase(attribute)) { - metaPackages.remove(pkg); - } - } - } - - return metaPackages; - } - - /** - * Start to uninstall - * @param uninstallList - * @param monitor - * @return If uninstallation is succeed, return true. if not return false. - * @see ViewController#uninstallPackages(PackageSet, IIMProgressMonitor) - */ - public boolean uninstall(List uninstallList, IIMProgressMonitor monitor) { - Log.log("ViewController Uninstall Start => " + uninstallList); - if (packageManager == null || uninstallList.size() == 0) { - Log.err("ViewController.uninstall() uninstalllist does not exist. => " + uninstallList); - ErrorController.setError(ErrorCode.ERROR); - return false; - } - - if (Options.doRemoveOldSDK || (uninstallList.size() == 1 && uninstallList.get(0).equals(Config.SDK_NAME))) { - uninstallAll(monitor); - return true; - } else { - PackageSet removablePackages = packageManager.getInstalledPackagesByName(uninstallList); - - return uninstallPackages(removablePackages, monitor); - } - } - - /** - * Uninstall removable packages. - * @param removableMetapkgs - * @param monitor - * @return If removable packages can success to uninstall, return true. if not return false. - */ - public boolean uninstallPackages(PackageSet removableMetapkgs, IIMProgressMonitor monitor) { - boolean bRet = installManager.removePackages(removableMetapkgs, monitor); - - Log.log("ViewController Uninstall End => " + bRet); - return bRet; - } - - /** - * Remove all packages. - * @param monitor - */ - public void uninstallAll(IIMProgressMonitor monitor) { - Log.log("ViewController Unintall All"); - installManager.removeAll(monitor); - Registry.removeRegistry(); - } - - /** - * Get package version that is installed already. - * @param pkgName is installed packages already. - * @return version - */ - public Package getInstalledPackage(String pkgName) { - return packageManager.getInstalledPackageByName(pkgName); - } - - /** - * Get total size depends on a package. - * @param packageName is string. - * @return size - */ - public long getTotalSizeWithDepends(String packageName) { - Package pkg = packageManager.getPackageByName(packageName); - return getInstallablePackagesSize(pkg); - } - - /** - * Get total size depends on a package list. - * @param pkgList is list. - * @return size - */ - public long getTotalSizeWithDepends(Collection pkgList) { - PackageSet pkgSet = packageManager.getPackagesByNames(pkgList); - return getTotalSizeWithDepends(pkgSet); - } - - /** - * Get total size depends on a package format. - * @param pkg is package format. - * @return size - */ - public long getInstallablePackagesSize(Package pkg) { - return packageManager.getTotalSizeOfInstallablePackages(pkg); - } - - /** - * Get total size depends on a package format. - * @param pkg is package format. - * @return size - */ - public long getRemovablePackagesSize(Package pkg) { - return packageManager.getTotalSizeOfRemovablePackages(pkg); - } - - /** - * Get total size depends on a package set. - * @param pkgs is package set - * @return size - */ - public long getTotalSizeWithDepends(PackageSet pkgs) { - return packageManager.getTotalSizeOfInstallablePackages(pkgs); - } - - /** - * Get installed path. - * @return Installed target path - */ - public String getInstalledPath() { - return Registry.getInstalledPath(); - } - - /** - * Check to exist package which can install or remove. - * @return There are packages to install or remove, return true. if not false. - */ - public boolean existInstallableOrRemovablePackages() { - return (getRemovablePackageList().size() > 0 || getInstallableOrUpdatableMetaPackages().size() > 0); - } - - /** - * Check to exist package which can install or update. - * @return There are packages to install or remove, return true. if not false. - */ - public boolean existInstallableOrUpdatablePackages() { - if (Options.snapshot || Config.fromWhere == Config.ConfDialog.LOCAL_IMAGE) { - return (getInstallablePackageListInSnapshot().size() > 0); - } else { - return (getInstallableOrUpdatableMetaPackages().size() > 0); - } - } - - /** - * Get Install configure. - * @return configure object. - */ - public Config getConfig() { - return installManager.getConfig(); - } - - /** - * Get description of package. - * @param pkgName - * @return decription of package. - */ - public String getDescription(String pkgName) { - Package pkg = packageManager.getPackageByName(pkgName); - - if (pkg == null) { - return ""; - } else { - return pkg.getDescription(); - } - } - - /** - * Check to exist files in target directory. - * @param targetDir is installed directory. - * @return If there are files in directory, return true. if not false. - */ - public boolean existFilesInTargetDirectory(String targetDir) { - File targetFile = new File(targetDir); - - if (!targetFile.exists()) { - return false; - } - - File[] targetFileList = targetFile.listFiles(); - if (targetFileList == null || targetFileList.length <= 0) { - return false; - } else { - return true; - } - } - - /** - * Remove file or directory from parameter - * @param targetPath - */ - public void removeTargetPath(String targetPath) { - PathUtil.remove(targetPath); - } - - /** - * save information of server. - * @param repository Base-repository of sdk. if repository is null, it do not save repository. - * @param type type of repository. if type is null, it do not save type. - * @param packageServer package server of sdk. if packageServer is null, it do not save packageServer. - * @param packageType set ServerType.snapshot or ServerType.package. if serverType is null, it do not save serverType. - */ - public void saveConfiguration(String repository, String distribution, ServerType packageType, String snapshotPath) { - Config.getInstance().saveConfiguration(repository, distribution, packageType, snapshotPath); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/ui/page/WelcomePage.java b/SdkImageCreator/src/org/tizen/installmanager/ui/page/WelcomePage.java deleted file mode 100644 index f683a43..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/ui/page/WelcomePage.java +++ /dev/null @@ -1,270 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.ui.page; - - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.tizen.installmanager.core.Config; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.core.InstallManager; -import org.tizen.installmanager.core.Options; -import org.tizen.installmanager.lib.ErrorController; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.pkg.lib.PackageManager; -import org.tizen.installmanager.pkg.model.ConfigFile; -import org.tizen.installmanager.ui.InstallManagerWindow; -import org.tizen.installmanager.ui.dialog.ConfigurationDialog; - -/** - * This class displays welcome page. - * @author Taeyoung Son - */ -public class WelcomePage extends PageTemplate { - - static final String RSC_PATH_IMAGE = RESOURCE_PATH + "/install_manager_graphicmotif_welcome.png"; - public static final String STRING_TITLE = "Welcome to Tizen SDK"; - public static final String STRING_SUBTITLE = "Tizen SDK will be installed on your computer. " + - "Close all other applications before starting the installation."; - - private RADIO_ACTION selectedRadioBtn = RADIO_ACTION.INSTALL; - Button buttonInstall = null; - Button buttonUninstall = null; - Button configurationButton = null; - - ViewController viewController = null; - - ConfigurationDialog rDialog = null; - - public enum RADIO_ACTION { - INSTALL, - UNINSTALL - } - - /** - * INSTALLED_NOTHING : Nothing to install before
- * INSTALLED_SOME_PACKAGES : Some packages are installed before
- * INSTALLED_ALL_PACKAGES : All packages are installed before
- * INSTALLED_AND_INSTALLABLE_NOTHING : Nothing to install before and now
- * INSTALLED_OLDSDK : There is no compatible old sdk and current sdk
- */ - public enum InstalledStatus { - INSTALLED_NOTHING, - INSTALLED_SOME_PACKAGES, - INSTALLED_ALL_PACKAGES, - INSTALLED_AND_INSTALLABLE_NOTHING, - INSTALLED_OLDSDK - } - - - /** - * Create the composite. - * @param parent - * @param style - */ - public WelcomePage(Composite parent, int style) { - super(parent, style); - setImageBounds(0, 0, 620, 144); - setTitleBounds(20, 160, 400, 20); - setSubTitleBounds(20, 190, 600, 40); - setCustomCompositeBounds(0, 220, 620, 173); - setLeftImageFromResource(RSC_PATH_IMAGE); - setTitle(STRING_TITLE); - setSubTitle(STRING_SUBTITLE); - - setButton(); - } - - private void setButton() { - setInstallButton(); - setUninstallButton(); - setConfigurationButton(); - } - - private void setInstallButton() { - buttonInstall = new Button(customComposite, SWT.RADIO); - buttonInstall.setSelection(true); - buttonInstall.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - selectedRadioBtn = RADIO_ACTION.INSTALL; - } - }); - buttonInstall.setBounds(26, 40, 500, 15); - buttonInstall.setText("Install the new " + Config.SDK_NAME + " version."); - buttonInstall.setBackground(InstallManagerWindow.getBackgroundColor()); - } - - private void setUninstallButton() { - buttonUninstall = new Button(customComposite, SWT.RADIO); - buttonUninstall.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - selectedRadioBtn = RADIO_ACTION.UNINSTALL; - } - }); - buttonUninstall.setBounds(26, 85, 500, 22); - buttonUninstall.setText("Uninstall the " + Config.SDK_NAME); - buttonUninstall.setBackground(InstallManagerWindow.getBackgroundColor()); - } - - private void setConfigurationButton() { - configurationButton = new Button(customComposite, SWT.PUSH); - configurationButton.setText("Advanced"); - configurationButton.setBackground(InstallManagerWindow.getBackgroundColor()); - - configurationButton.setBounds(509, 120, 100, 29); - configurationButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - rDialog = new ConfigurationDialog(customComposite.getShell()); - - //set information to configuration dialog. - ConfigFile confFile = Config.getInstance().getConfigFile(); - rDialog.setRepository(confFile.getRepository()); - rDialog.setCurrentDistribution(confFile.getDistribution()); - rDialog.setSnapshotPath(confFile.getSnapshotPath()); - - int ret = rDialog.open(); - if (ret == 0){ - viewController.saveConfiguration(rDialog.getRepository(), rDialog.getCurrentDistribution(), rDialog.getServerType(), rDialog.getSnapshotPath()); - - PackageManager.dispose(); - InstallManagerWindow.getInstallManagerWindow().refresh(); - } else { - Log.log("Configuration dialog is canceled."); - } - rDialog.clear(); - } - }); - } - - /** - * Set install status, and set radio button. - * @param status - */ - public void setButtonStatus() { - - if (Options.doRemoveOldSDK) { - setErrorSubTitle("Old version SDK(Tizen SDK) is installed. " + - "Tizen SDK can be installed after removing old Tizen SDK."); - buttonInstall.setSelection(false); - buttonUninstall.setSelection(true); - - buttonInstall.setEnabled(false); - buttonUninstall.setEnabled(true); - - selectedRadioBtn = RADIO_ACTION.UNINSTALL; - return; - } - - if (viewController == null) { - return; - } - - if (!viewController.existRemovablePackage()) { - buttonInstall.setText("Install the new " + Config.SDK_NAME + " version."); - buttonInstall.setBounds(26, 40, 500, 22); - - buttonInstall.setSelection(true); - buttonUninstall.setSelection(false); - - buttonInstall.setEnabled(true); - buttonUninstall.setEnabled(false); - - selectedRadioBtn = RADIO_ACTION.INSTALL; - - Config.status = Config.Status.INSTALL; - } else if (!viewController.existInstallableOrUpdatablePackages()) { - buttonInstall.setSelection(false); - buttonUninstall.setSelection(true); - - buttonInstall.setEnabled(false); - buttonUninstall.setEnabled(true); - - selectedRadioBtn = RADIO_ACTION.UNINSTALL; - - Config.status = Config.Status.UNINSTALL; - } else { - buttonInstall.setText("Install or update the " + Config.SDK_NAME); - buttonInstall.setSelection(true); - buttonUninstall.setSelection(false); - - buttonInstall.setEnabled(true); - buttonUninstall.setEnabled(true); - - selectedRadioBtn = RADIO_ACTION.INSTALL; - - Config.status = Config.Status.UPDATE; - } - } - - /** - * Get selected radio button object. - * @return radio button object - */ - public RADIO_ACTION getSelectedRadioButton() { - RADIO_ACTION result = this.selectedRadioBtn; - return result; - } - - /** - * If selection is true, button will be displayed. - * @param selection - */ - public void setVisibleRadioButton(boolean selection) { - buttonInstall.setVisible(selection); - buttonUninstall.setVisible(selection); - } - - /** - * Set ViewController instance - * @param controller - */ - public void setViewController(ViewController controller) { - if (controller != null) { - viewController = controller; - } else { - Log.err("viewcontroller is null."); - ErrorController.setErrorMessage("Cannot initialize controller."); - throw new IMFatalException("Can not read package informaion."); - } - } - - /** - * refresh welcome page. - */ - public void refresh() { - InstallManager.getInstance().initPackageList(); - setButtonStatus(); - } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/util/IMShellCommandFail.java b/SdkImageCreator/src/org/tizen/installmanager/util/IMShellCommandFail.java deleted file mode 100644 index 17e5d88..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/util/IMShellCommandFail.java +++ /dev/null @@ -1,40 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.util; - -/** - * Exception thrown when shall command fails. - * @author Wooyoung Cho - * - */ -public class IMShellCommandFail extends Exception { - - private static final long serialVersionUID = 4284105845749661999L; - -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/util/PathUtil.java b/SdkImageCreator/src/org/tizen/installmanager/util/PathUtil.java deleted file mode 100644 index 39f5207..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/util/PathUtil.java +++ /dev/null @@ -1,820 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.util; - -import java.io.*; -import java.net.URL; - -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Display; -import org.tizen.installmanager.core.IMFatalException; -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.LoggerShellParser; -import org.tizen.installmanager.lib.Platform; -import org.tizen.installmanager.lib.Registry; -import org.tizen.installmanager.lib.ErrorController.ErrorCode; -import org.tizen.installmanager.lib.win.WindowsRegistry; - - -/** - * Common function related path. - * @author Shiyun Kim - * - */ -public class PathUtil { - - private final static String FILE_EXTENSION_SEPERATOR = "."; - private final static String DIRECTORY_SEPERATOR = "/"; - public final static String URL_SEPERATOR = "/"; - private final static int BUF_SIZE = 65536; - - /** - * Separate path from unit separator and get the back part. - * @param path path to separate - * @param Seperator unit separator - * @return - */ - public static String getLastNameFromLastSeperator(String path, String Seperator){ - int lastIndex = path.lastIndexOf(Seperator); - - if (lastIndex < 0) - return path; - - return path.substring(lastIndex+1); - } - - /** - * Separate path from unit separator and get the front part. - * @param path path to separate - * @param Seperator unit separator - * @return - */ - public static String getFirstNameFromLastSeperator(String path, String Seperator){ - int lastIndex = path.lastIndexOf(Seperator); - - if (lastIndex < 0) - return path; - - return path.substring(0, lastIndex); - } - - /** - * Get file extension. - * @param path - * @return file extension - */ - public static String getFileExtension(String path) { - int lastIndex = path.lastIndexOf(FILE_EXTENSION_SEPERATOR); - - if (lastIndex < 0) - return ""; - - return path.substring(lastIndex); - } - - /** - * Get file name. - * @param path - * @return file name. - */ - public static String getFileName(String path) { - return getLastNameFromLastSeperator(path, DIRECTORY_SEPERATOR); - } - - /** - * Get file name without extension - * @param path - * @return file name. - */ - public static String getFileNameWithOutExtension(String path) { - String fileName = getLastNameFromLastSeperator(path, DIRECTORY_SEPERATOR); - - return getFirstNameFromLastSeperator(fileName, FILE_EXTENSION_SEPERATOR); - } - - /** - * Get parent directory. - * @param path - * @return Parent directory path - */ - public static String getParentDirectory(String path) { - return PathUtil.getFirstNameFromLastSeperator(path, DIRECTORY_SEPERATOR); - } - - /** - * Get parent directory with parent depth. - * If you set parentDepth=3, you can get 3rd parent directory. - * @param path - * @param parentDepth depth of parent directory. - * @return - */ - public static String getParentDirectory(String path, int parentDepth) { - for (int i=parentDepth; i>0; i--) { - path = PathUtil.getParentDirectory(path); - } - return path; - } - - /** - * hard link files instead of copying for merging existed 'toFile' side directory. - * @param fromFile - * @param toFile - * @return - */ - public static boolean copyHardLink(File fromFile, File toFile) { - Log.log("Copy from " + fromFile + " to " + toFile); - String fromPath = fromFile.getAbsolutePath(); - String toPath = toFile.getAbsolutePath(); - String command[] = null; - - command = getCopyShellCommand(fromPath, toPath); - - try { - ShellUtil.execute(command); - } catch (IMShellCommandFail e) { - Log.err("Failed to copy " + fromFile + "to" + toFile); - Log.ExceptionLog(e); - return false; - } - - return true; - } - - private static String[] getCopyShellCommand(String fromPath, String toPath) { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64) { - String command[] = {"cp", "-rl", fromPath, toPath}; - return command; - } else if (Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - String command[] = {"cp", "-a", fromPath, toPath}; - return command; - } else { - return null; - } - } - - //Copy file - /** - * copy file or directory. - * @param from source file path - * @param to destination file path - * @return - * @throws IOException - */ - public static boolean copy(String from, String to) throws IOException { - return copy(new File(from), new File(to)); - } - - /** - * copy file or directory. - * @param from source file - * @param to destination file - * @return - * @throws IOException - */ - public static boolean copy(File fromFile, File toFile) throws IOException { - Log.log("Copy from "+fromFile+" to "+toFile); - if (!fromFile.exists() /*|| !fromFile.getName().equals(toFile.getName())*/) { - Log.log("Copy failed"); - return false; - } - - if (!fromFile.isDirectory()) { - if (toFile.exists()) { - toFile.delete(); - } - - return copyFile(fromFile, toFile); - } - - if (toFile.exists()) { - return true; - } - - toFile.mkdirs(); - - File[] fileList = fromFile.listFiles(); - if (fileList == null || fileList.length == 0) { - return true; - } - - for (int i=0; itrue if success - */ - public static boolean remove(File file) { - if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - return removeForLinux(file); - } else if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - return removeForWindows(file); - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - /** - * Remove given file by bash command in linux system. If it's directory, remove every files and directories in it recursively. - * @param filePath filePath File or directory to remove. - * @return true if success - */ - private static boolean removeForLinux(File filePath) { - try { - int exitCode = ShellUtil.execute( - "rm -rf " + filePath.getAbsolutePath(), new LoggerShellParser()); - return (exitCode == 0); - } catch (IMShellCommandFail e) { - return false; - } - } - - /** - * Remove given file in windows system. If it's directory, remove every files and directories in it recursively. - * Remove continuously regardless of fail. - * @param filePath File or directory to remove. - * @return true if all of files are removed or target file to remove does not exist. - */ - private static boolean removeForWindows(File filePath) { - boolean ret = true; - if (!filePath.exists()) { - return true; - } - - if (filePath.isDirectory()) { - File[] listFile = filePath.listFiles(); - - for (File childFile : listFile) { - ret = removeForWindows(childFile) && ret; - } - - } else {}//filePath is file. - - System.gc(); // delete() method does not work exactly sometimes. so, there is gc() before delete(). - return filePath.delete() && ret; - } - - public static File makeNewFile(String filePath) throws IOException{ - File file = new File(filePath); - if (file.exists()) { - if (!file.delete()) { - return null; - } - } - - File parentDir = file.getParentFile(); - if (!parentDir.exists()) { - if (!parentDir.mkdirs()) { - return null; - } - } - - if (!file.createNewFile()) { - return null; - } - - return file; - } - - /** - * Make hidden file. - * @param file - * @return - */ - public static boolean makeHiddenFile(String file) { - if (Platform.CURRENT_PLATFORM == Platform.WINDOWS_32 - || Platform.CURRENT_PLATFORM == Platform.WINDOWS_64) { - String[] command = {"c:\\windows\\system32\\attrib.exe", - "+H", - file}; - - try { - return (ShellUtil.execute(command) == 0); - } catch (IMShellCommandFail e) { - return false; - } - } else if (Platform.CURRENT_PLATFORM == Platform.LINUX_32 - || Platform.CURRENT_PLATFORM == Platform.LINUX_64 - || Platform.CURRENT_PLATFORM == Platform.MACOS_64) { - return true; - } else { - throw new IMFatalException(ErrorCode.UNSUPPORTED_PLATFORM); - } - } - - /** - * Make hidden file. - * @param file - * @return - * @throws IOException - */ - public static boolean makeHiddenFile(File file) throws IOException{ - return makeHiddenFile(file.getCanonicalPath()); - } - - /** - * @param path_components the path components - * @return a path string made by concatenating the path components. empty string if there are no path components. - */ - public static String get(String... path_components) { - String path = ""; - - for(int i = 0; i < path_components.length; i++) { - if( i == 0 ) { - path = path_components[0]; - } else { - path = path + File.separator + path_components[i]; - } - } - return path; - } - - /** - * @param path_components the path components - * @return a path string made by concatenating the path components. empty string if there are no path components. - */ - public static String addURLPath(String... path_components) { - if (path_components == null) { - return ""; - } - - String path = ""; - for(int i = 0; i < path_components.length; i++) { - if (path_components[i] == null || path_components[i].isEmpty()) { - continue; - } - if( i == 0 ) { - path = path_components[0]; - } else { - path = path + PathUtil.URL_SEPERATOR + path_components[i]; - } - } - return path; - } - - /** - * @param path_components - * @return a path string made by the path components relative to the home directory - */ - public static String getFromHome(String... path_components) { - return System.getProperty("user.home") + File.separator + get(path_components); - } - - /** - * @param path_components - * @return a path string made by the path components relative to the install path. empty string if install path not found - */ - public static String getFromInstalledPath(String... path_components) { - String installPath = Registry.getInstalledPath(); - if(installPath.equals("")) { - return ""; - } else { - return installPath + File.separator + get(path_components); - } - } - - /** - * @return current working directory. - */ - public static String getCurrentDir() { - return System.getProperty("user.dir"); - } - - /** - * @param path_components - * @return a path string made by the path components relative to the current working directory - */ - public static String getFromCurrDir(String... path_components) { - return PathUtil.get(getCurrentDir(), get(path_components)); - } - - /** - * get temp directory - * @return - */ - public static String getTempDir() { - return System.getProperty("java.io.tmpdir"); - } - - /** - * - * @param path_components - * @return - */ - public static String getFromTempDir(String... path_components) { - return PathUtil.get(getTempDir() + File.separator + get(path_components)); - } - - /** - * Get LocalAppData Path. - * @return - */ - public static String getLocalAppData() { - if (Platform.isWindows()) { - return WindowsRegistry.getRegistryValue( - WindowsRegistry.REGISTRY_PATH_OF_SHELL_FOLDER - , WindowsRegistry.REGISTRY_LOCAL_APP_DATA_OF_SHELL_FOLDER); - } else { - return ""; - } - } - - /** - * Get path from AppData - * @param path_components - * @return - */ - public static String getFromAppData(String... path_components) { - return PathUtil.get(getLocalAppData() + File.separator + get(path_components)); - } - /** - * @param resourcePath - * @return string of whole content of the resource in UTF-8 charset - */ - public static String readAllTextFromResource(String resourcePath) { - InputStream is = null; - StringBuffer txt = new StringBuffer(); - is = PathUtil.getResourceAsStream(resourcePath); - BufferedReader in = null; - - try { - in = new BufferedReader(new InputStreamReader(is, "UTF-8")); - String strLicense; - while((strLicense = in.readLine()) != null) { - txt.append(strLicense); - txt.append("\n"); - } - } catch(IOException e) { - throw new IMFatalException("Cannot read resource: "+resourcePath); - } finally { - try { - if (in != null) { - in.close(); - } - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - - return txt.toString(); - } - - /** - * Read text from file. - * @param filePath target file. - * @return StringBuffer instance that contains whole text from filePath. - */ - public static String readAllTextFromFile(String filePath) { - StringBuffer txt = new StringBuffer(); - InputStream is = null; - BufferedReader in = null; - try { - is = new FileInputStream(filePath); - in = new BufferedReader(new InputStreamReader(is, "UTF-8")); - String strLicense; - while((strLicense = in.readLine()) != null) { - txt.append(strLicense); - txt.append("\n"); - } - } catch(IOException e) { - throw new IMFatalException("Cannot read resource: " + filePath); - } finally { - try { - if (in != null) { - in.close(); - } - } catch (IOException e) { - Log.ExceptionLog(e); - } - - try { - if (is != null) { - is.close(); - } - } catch (IOException e) { - Log.ExceptionLog(e); - } - } - return txt.toString(); - } - - /** - * @param resourcePath - * @return URL of the resource. This URL does not mean a file. It just shows how to locate the resource. - */ - public static URL getResourceUrl(String resourcePath) { - return Class.class.getResource(resourcePath); - } - /** - * @param resourcePath - * @return input stream of the resource. - */ - public static InputStream getResourceAsStream(String resourcePath) { - return Class.class.getResourceAsStream(resourcePath); - } - - /** - * Writes the text in UTF-8 to the file. - * @param text UTF-8 string to be written - * @param toFile - * @throws IOException - */ - public static void writeStringToFile(String text, File toFile) throws IOException { - try { - InputStream is = new ByteArrayInputStream(text.getBytes("UTF-8")); - PathUtil.writeFileFromInputStream(is, toFile); - } catch (UnsupportedEncodingException e) { - throw new IMFatalException("Unsupported encoding UTF-8"); - } - } - - /** - * @param resourcePath - * @return image object made of the resource - */ - public static Image getImageFromResource(String resourcePath) { - return new Image(Display.getCurrent(), PathUtil.getResourceAsStream(resourcePath)); - } - - /** - * Create a temp file whose content is from the resource. The temp file will be removed automatically after install manager exits. - * @param resourcePath - * @param prefix prefix of the temp file name. should be at least 3 characters - * @param suffix suffix of the temp file name - * @return temp file whose content is from the resource. - * @throws IOException - */ - public static File getTempFileFromResource(String resourcePath, String prefix, String suffix) throws IOException { - return getTempFileFromResource(resourcePath, prefix, suffix, true); - } - - /** - * Create a temp file whose content is from the resource. The temp file will be removed automatically after install manager exits. - * @param resourcePath - * @param prefix prefix of the temp file name. should be at least 3 characters - * @param suffix suffix of the temp file name - * @param deleteOnExit if set true, delete on exit. - * @return temp file whose content is from the resource. - * @throws IOException - */ - public static File getTempFileFromResource(String resourcePath, String prefix, String suffix, boolean deleteOnExit) throws IOException { - File file = File.createTempFile(prefix, suffix); - PathUtil.writeFileFromInputStream(PathUtil.getResourceAsStream(resourcePath), file); - - if(deleteOnExit) { - file.deleteOnExit(); - } - - return file; - } - - /** - * Copy the resource to the file - * @param resourcePath - * @param toFile - * @return true if succeed - * @throws IOException - */ - public static boolean copyFileFromResource(String resourcePath, File toFile) throws IOException { - Log.log("copy file from resource: "+resourcePath + " -> " + toFile); - if(toFile.exists()) { - if(!toFile.delete()) { - return false; - } - } - if(!toFile.createNewFile()) - return false; - - PathUtil.writeFileFromInputStream(PathUtil.getResourceAsStream(resourcePath), toFile); - return true; - } - - /** - * Moves the file of path fromFilePath to the file of path toFilePath - * @param fromFilePath - * @param toFilePath - */ - public static void moveFile(String fromFilePath, String toFilePath) { - PathUtil.moveFile(new File(fromFilePath), new File(toFilePath)); - } - - /** - * Get parent path of temporary file.(makeshortcut script, Packages list, Installer log) - * @return parent path of temporary file - */ - public static String getTempFileParent() { - try { - File tmp = File.createTempFile("tizen_installmanager", ".tmp"); - tmp.deleteOnExit(); - return tmp.getParent(); - } catch (IOException e) { - throw new IMFatalException("Cannot create file"); - } - } - -// public static URL addURLPath(URL url, String additionalPath) { -// return addURLPath(url.toExternalForm(), additionalPath); -// } -// -// public static URL addURLPath(String url, String additionalPath) { -// if (url == null || url.isEmpty()) { -// return null; -// } else { -// try { -// return new URL(url + "/" + additionalPath); -// } catch (MalformedURLException e) { -// Log.err("Cannot add url path." + url + " + " + additionalPath); -// return null; -// } -// } -// } -} diff --git a/SdkImageCreator/src/org/tizen/installmanager/util/ShellUtil.java b/SdkImageCreator/src/org/tizen/installmanager/util/ShellUtil.java deleted file mode 100644 index 4003dce..0000000 --- a/SdkImageCreator/src/org/tizen/installmanager/util/ShellUtil.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * InstallManager - * - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: - * Wooyoung Cho - * Shihyun Kim - * Taeyoung Son - * Yongsung kim - * - * 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. - * - * Contributors: - * - S-Core Co., Ltd - * - */ - -package org.tizen.installmanager.util; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.Map; -import java.util.StringTokenizer; - -import org.tizen.installmanager.lib.Log; -import org.tizen.installmanager.lib.LoggerShellParser; -import org.tizen.installmanager.lib.ShellParser; - -/** - * Utility methods for executing shell commands - * - * @author Wooyoung Cho - * - */ -public class ShellUtil { - - private ShellUtil() { - } - - public static int execute(String cmd) throws IMShellCommandFail { - return execute(cmd, null, null, new LoggerShellParser()); - } - - public static int execute(String cmd, ShellParser parser) - throws IMShellCommandFail { - return execute(cmd, null, null, parser); - } - - public static int execute(String[] command) throws IMShellCommandFail { - return execute(command, null, null, new LoggerShellParser()); - } - - public static int execute(String[] command, ShellParser parser) - throws IMShellCommandFail { - return execute(command, null, null, parser); - } - - public static int execute(String cmd, Map env, - File workingDir, ShellParser parser) throws IMShellCommandFail { - StringTokenizer token = new StringTokenizer(cmd); - - int length = token.countTokens(); - String command[] = new String[length]; - - for (int i = 0; i < length; i++) { - command[i] = token.nextToken(); - } - return execute(command, env, workingDir, parser); - } - - /** - * Executes the shell command synchronously with the environment in the dir. - * - * @param cmd - * @param env - * @param workingDir - * @return process object if success. null if failed. - * @throws IMShellCommandFail - */ - public static int execute(String cmd[], Map env, - File workingDir, ShellParser parser) throws IMShellCommandFail { - - Log.log("execute command => " + Arrays.toString(cmd)); - ProcessBuilder pb = new ProcessBuilder(cmd); - - if (env != null) { - Map pbEnv = pb.environment(); - pbEnv.putAll(env); - } - - if (workingDir != null) { - pb.directory(workingDir); - } - - Process proc = null; - try { - proc = pb.start(); - if (parser != null) { - parser.runParsing(proc); - } - int exitCode = proc.waitFor(); - Log.log("Command exit code => " + exitCode); - - return exitCode; - } catch (IOException e) { - Log.err("Command exec error => " + Arrays.toString(cmd)); - throw new IMShellCommandFail(); - } catch (InterruptedException e) { - Log.err("Command exec error => " + Arrays.toString(cmd)); - throw new IMShellCommandFail(); - } - } - - /** - * Executes shell command and return without waiting for exiting. - * - * @param cmd - * @return process object of the execution. null if - * IOException occurrs. - */ - public static Process asyncExecute(String cmd) { - return asyncExecute(cmd, null, null, new ShellParser(false)); - } - - /** - * Executes shell command and return without waiting for exiting. - * - * @param cmd - * executable command - * @param env - * environment variable - * @param workingDir - * working directory - * @param parser - * ShellParser instance that can process stdout and stderr. - * @return process object of the execution. null if - * IOException occurrs. - */ - public static Process asyncExecute(String cmd, Map env, - File workingDir, ShellParser parser) { - Log.log("command exec = > " + cmd); - - StringTokenizer token = new StringTokenizer(cmd); - - int length = token.countTokens(); - String command[] = new String[length]; - - for (int i = 0; i < length; i++) { - command[i] = token.nextToken(); - } - - ProcessBuilder pb = new ProcessBuilder(command); - // set working directory - if (workingDir != null) { - pb.directory(workingDir); - } - - // set environment variable - if (env != null) { - Map pbEnv = pb.environment(); - pbEnv.putAll(env); - } - - try { - Process proc = pb.start(); - parser.runParsing(proc); - - return proc; - } catch (IOException e) { - Log.ExceptionLog(e); - return null; - } - } - - /** - * Add interpreter from extension. - * If extension is ".vbs", add "wscript.exe " in front of command - * If extensino is ".bat", add "cmd.exe /C " in front of command - * @param command - * @return combined command of interpreter. - */ - public static String addInterpreter(String command) { - String extension = PathUtil.getFileExtension(command); - - if (extension.equalsIgnoreCase(".vbs")) { - command = "wscript.exe " + command; - } else if (extension.equalsIgnoreCase(".bat")) { - command = "cmd.exe /C " + command; - } else {} - - return command; - } - -} diff --git a/SdkImageCreator/src/res/COPYING b/SdkImageCreator/src/res/COPYING deleted file mode 100644 index 74375c3..0000000 --- a/SdkImageCreator/src/res/COPYING +++ /dev/null @@ -1,12 +0,0 @@ - -Tizen SDK - -Tizen SDK contains software portions licensed under various open source licenses as well as proprietary components.  All open source software portions (“Open Source Software”) are licensed under the open source licenses that accompany such Open Source Software.  - -The licenses governing the Open Source Software are available at: http://developer.tizen.org/download/tizen_sdk_opensource_license.html - -Except for the Open Source Software contained in Tizen SDK, all other software portions contained in Tizen SDK are governed by the terms and conditions of the Tizen Software Development Kit License Agreement, available at: http://developer.tizen.org/download/samsung_sdk_license.html - -You may access and download Tizen SDK Open Source Software at: http://developer.tizen.org/download/tizenopensdk.tar.gz - -BY CLICKING THE "I AGREE" BUTTON OR BY USING ANY PART OF TIZEN SDK, YOU AGREE (ON BEHALF OF YOURSELF AND/OR YOUR COMPANY) TO THE OPEN SOURCE SOFTWARE LICENSE TERMS AND THE TIZEN SOFTWARE DEVELOPMENT KIT LICENSE AGREEMENT. If you do not agree with the Open Source Software license terms or the TIZEN SOFTWARE DEVELOPMENT KIT LICENSE AGREEMENT, you may not download or use Tizen SDK. \ No newline at end of file diff --git a/SdkImageCreator/src/res/desktop_directory/ExecuteInstallManager.vbs b/SdkImageCreator/src/res/desktop_directory/ExecuteInstallManager.vbs deleted file mode 100644 index 7e74a68..0000000 --- a/SdkImageCreator/src/res/desktop_directory/ExecuteInstallManager.vbs +++ /dev/null @@ -1,3 +0,0 @@ -Dim oShell -set oShell = WScript.CreateObject ("WScript.shell") -oShell.Run "java -jar InstallManager.jar", 0 \ No newline at end of file diff --git a/SdkImageCreator/src/res/desktop_directory/checkJavaInstallation.sh b/SdkImageCreator/src/res/desktop_directory/checkJavaInstallation.sh deleted file mode 100644 index c2e6d26..0000000 --- a/SdkImageCreator/src/res/desktop_directory/checkJavaInstallation.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -x - -which java - -exit $? diff --git a/SdkImageCreator/src/res/desktop_directory/checkRunningTaskList.vbs b/SdkImageCreator/src/res/desktop_directory/checkRunningTaskList.vbs deleted file mode 100644 index f3e1348..0000000 --- a/SdkImageCreator/src/res/desktop_directory/checkRunningTaskList.vbs +++ /dev/null @@ -1,21 +0,0 @@ -' Print absolute paths of executables of all processes - -strComputer = "." - -' Get WMI Service object -Set objWMIService = GetObject("winmgmts:" _ - & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") - -' Get all process list -Set colProcessList = objWMIService.ExecQuery _ - ("Select * from Win32_Process") - -' Get Debug privilege -Set Service = GetObject( _ - "winmgmts:{impersonationLevel=impersonate, (Debug)}") - -' Print process information -For Each objProcess in colProcessList - Wscript.Echo ( objProcess.ProcessId & " " & objProcess.ExecutablePath) - -Next diff --git a/SdkImageCreator/src/res/desktop_directory/install.sh b/SdkImageCreator/src/res/desktop_directory/install.sh deleted file mode 100644 index 8e71ad2..0000000 --- a/SdkImageCreator/src/res/desktop_directory/install.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -x - -SHORTCUT_DIR_PATH=${HOME}/.local/share -MENU_DIRECTORY_PATH=${SHORTCUT_DIR_PATH}/desktop-directories -MENU_FILE_PATH=${MENU_DIRECTORY_PATH}/tizen-sdk-menu.directory -MENU_ICON_FILE_PATH=${INSTALLED_PATH}/install-manager/tizen-sdk-menu.png -MENU_NAME="Tizen SDK" -MENU_COMMENT="Tizen SDK" -MENU_VERSION=1.0 -PARTNER=${PARTNER_SDK} - -##if not exist 'desktop-directories' directory -if [ ! -e ${MENU_DIRECTORY_PATH} ]; then - mkdir ${MENU_DIRECTORY_PATH} -fi - -if [ -e ${MENU_FILE_PATH} ]; then - rm -rf ${MENU_FILE_PATH} -fi - -##create 'Tizen SDK' menu -cat >> ${MENU_FILE_PATH} << END -[Desktop Entry] -Type=Directory -Version=${MENU_VERSION} -Name=${MENU_NAME} -Comment=${MENU_COMMENT} -Icon=${MENU_ICON_FILE_PATH} -END - -APPLICATION_DIR_PATH=${SHORTCUT_DIR_PATH}/applications -DESKTOP_FILE_PATH=${APPLICATION_DIR_PATH}/tizen-sdk-installmanager.desktop -if [ -n "${PARTNER}" ] ; then - DESKTOP_EXECUTE_FILE_PATH=${INSTALLED_PATH}/install-manager/InstallManagerP -else - DESKTOP_EXECUTE_FILE_PATH=${INSTALLED_PATH}/install-manager/InstallManager -fi -DESKTOP_ICON_FILE_PATH=${INSTALLED_PATH}/install-manager/tizen-sdk-installmanager.png -DESKTOP_NAME="Install Manager" -DESKTOP_COMMENT="Install Manager for Tizen SDK" - -##if not exist 'applications' directory -if [ ! -e ${APPLICATION_DIR_PATH} ]; then - mkdir ${APPLICATION_DIR_PATH} -fi - -##create 'Install Manager' shortcut -${MAKESHORTCUT_PATH} \ --f "${DESKTOP_FILE_PATH}" \ --e "${DESKTOP_EXECUTE_FILE_PATH}" \ --i "${DESKTOP_ICON_FILE_PATH}" \ --n "${DESKTOP_NAME}" \ --c "${DESKTOP_COMMENT}" - diff --git a/SdkImageCreator/src/res/desktop_directory/install.vbs b/SdkImageCreator/src/res/desktop_directory/install.vbs deleted file mode 100644 index e611153..0000000 --- a/SdkImageCreator/src/res/desktop_directory/install.vbs +++ /dev/null @@ -1,19 +0,0 @@ -Set wshShell = Wscript.CreateObject("Wscript.Shell") -programsPath = wshShell.SpecialFolders("Programs") -TizenSDKPath = programsPath & "\Tizen SDK" - -'create Tizen SDK directory in Programs special folder -Set objFSO = CreateObject("Scripting.FileSystemObject") - -if not objFSO.FolderExists(TizenSDKPath) then - objFSO.CreateFolder(TizenSDKPath) -end if - -Set WshEnv = wshShell.Environment("Process") -installedPath = WshEnv("INSTALLED_PATH") -makeShortcutPath = WshEnv("MAKESHORTCUT_PATH") -partner = WshEnv("PARTNER_SDK") -targetPath = installedPath & "\install-manager\InstManager.exe" -iconPath = installedPath & "\install-manager\tizen-sdk-installmanager.ico" -shortcutName = "Install Manager" -wshShell.Run "wscript.exe " & chr(34) & makeShortcutPath & chr(34) & " /target:" & chr(34) & targetPath & chr(34) & " /icon:" & chr(34) & iconPath & chr(34) & " /shortcut:" & chr(34) & shortcutName & chr(34) diff --git a/SdkImageCreator/src/res/desktop_directory/makeshortcut.sh b/SdkImageCreator/src/res/desktop_directory/makeshortcut.sh deleted file mode 100644 index 19a8b68..0000000 --- a/SdkImageCreator/src/res/desktop_directory/makeshortcut.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -x - -MENU_DIRECTORY_PATH=${HOME}/.local/share/desktop-directories/tizen-sdk-menu.directory - -SHORTCUT_FILE_PATH= -EXEC_FILE_PATH= -ICON_PATH= - -NAME= -COMMENT= - -parseParameter() -{ - while [ $# -gt 0 ] - do - case $1 in - -f|--filepath) - shift - SHORTCUT_FILE_PATH=$1 - ;; - -e|--executefilepath) - shift - EXEC_FILE_PATH=$1 - ;; - -i|--iconpath) - shift - ICON_PATH=$1 - ;; - -n|--name) - shift - NAME=$1 - ;; - -c|--comment) - shift - COMMENT=$1 - ;; - *) - exit 12 - ;; - esac - shift - done -} - -##exist unconditionally -checkParameter() -{ - if [ ! -e ${EXEC_FILE_PATH} ]; then - exit 13 - fi - - if [ ! -e ${ICON_PATH} ]; then - exit 13 - fi -} - -makeShortcut() -{ - checkParameter - - UBUNTU_VER=`awk 'BEGIN {FS="="}; /DISTRIB_RELEASE.*/ {print $2}' /etc/lsb-release` - - case ${UBUNTU_VER} in - 11.04) - categories="Tizen SDK;Development;" - ;; - 11.10) - categories="Tizen SDK;Development;" - ;; - *) - categories="Tizen SDK" - ;; - esac - - if [ -e ${SHORTCUT_FILE_PATH} ]; then - rm -rf ${SHORTCUT_FILE_PATH} - fi - - ## Create .desktop file - mkdir -p ${HOME}/.local/share/applications - cat >> ${SHORTCUT_FILE_PATH} << END -[Desktop Entry] -Encoding=UTF-8 -Version=1.0 -Type=Application -Terminal=false -Comment=${COMMENT} -Name=${NAME} -Categories=$categories -StartupNotify=true -NoDisplay=false -Icon=${ICON_PATH} -Exec=${EXEC_FILE_PATH} -END - - ## Register .desktop file - xdg-desktop-menu install ${MENU_DIRECTORY_PATH} ${SHORTCUT_FILE_PATH} -} - -parseParameter "$@" -makeShortcut diff --git a/SdkImageCreator/src/res/desktop_directory/makeshortcut.vbs b/SdkImageCreator/src/res/desktop_directory/makeshortcut.vbs deleted file mode 100644 index ad042b4..0000000 --- a/SdkImageCreator/src/res/desktop_directory/makeshortcut.vbs +++ /dev/null @@ -1,15 +0,0 @@ -set WshShell = WScript.CreateObject("WScript.Shell") - -programsPath = wshShell.SpecialFolders("Programs") -TizenSDKPath = programsPath & "\Tizen SDK" -linkFilePath = TizenSDKPath & "\" & Wscript.Arguments.Named("shortcut") & ".lnk" - -set filesys = CreateObject("Scripting.FileSystemObject") -filename = Wscript.Arguments.Named("target") -partner = Wscript.Arguments.Named("partnerSdk") -set oShellLink = WshShell.CreateShortcut(linkFilePath) -oShellLink.TargetPath = filename -oShellLink.IconLocation = Wscript.Arguments.Named("icon") -oShellLink.WorkingDirectory = filesys.GetParentFolderName(filename) -oShellLink.WindowStyle = 1 -oShellLink.Save diff --git a/SdkImageCreator/src/res/desktop_directory/remove.sh b/SdkImageCreator/src/res/desktop_directory/remove.sh deleted file mode 100644 index 78429f7..0000000 --- a/SdkImageCreator/src/res/desktop_directory/remove.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -x - -##remove installmanager shortcut -INSTALLMANAGER_DESKTOP_FILE_PATH=${HOME}/.local/share/applications/tizen-sdk-installmanager.desktop -${REMOVE_SHORTCUT} ${INSTALLMANAGER_DESKTOP_FILE_PATH} - -##remove menu directory -MENU_DIRECTORY_PATH=${HOME}/.local/share/desktop-directories/tizen-sdk-menu.directory -rm ${MENU_DIRECTORY_PATH} - -##remove icon file -IM_ICON_FILE_PATH=${INSTALLED_PATH}/InstallManager/tizen-sdk-installmanager.png -MENU_ICON_FILE_PATH=${INSTALLED_PATH}/InstallManager/tizen-sdk-menu.png - -rm -f ${IM_ICON_FILE_PATH} -rm -f ${MENU_ICON_FILE_PATH} - -##remove old icon file -IM_ICON_FILE_PATH_OLD=${HOME}/.local/share/icons/tizen-sdk-installmanager.png -MENU_ICON_FILE_PATH_OLD=${HOME}/.local/share/icons/tizen-sdk-menu.png - -rm -f ${IM_ICON_FILE_PATH_OLD} -rm -f ${MENU_ICON_FILE_PATH_OLD} diff --git a/SdkImageCreator/src/res/desktop_directory/remove.vbs b/SdkImageCreator/src/res/desktop_directory/remove.vbs deleted file mode 100644 index 42d65b3..0000000 --- a/SdkImageCreator/src/res/desktop_directory/remove.vbs +++ /dev/null @@ -1,27 +0,0 @@ -Set wshShell = Wscript.CreateObject("Wscript.Shell") -programsPath = wshShell.SpecialFolders("Programs") -TizenSDKPath = programsPath & "\Tizen SDK" - -Set WshEnv = wshShell.Environment("Process") -installedPath = WshEnv("INSTALLED_PATH") - -Set fso = CreateObject("Scripting.FileSystemObject") - -''Remove shortcut menu -if fso.FolderExists(TizenSDKPath) then - fso.DeleteFolder(TizenSDKPath) -end if - -''Remove icon file -IM_ICON_FILE_PATH = installedPath & "\InstallManager\tizen-sdk-installmanager.ico" -MENU_ICON_FILE_PATH = installedPath & "\InstallManager\tizen-sdk-menu.ico" - -if fso.FileExists(IM_ICON_FILE_PATH) then - Set aFile = fso.GetFile(IM_ICON_FILE_PATH) - aFile.Delete -end if - -if fso.FileExists(MENU_ICON_FILE_PATH) then - Set aFile = fso.GetFile(MENU_ICON_FILE_PATH) - aFile.Delete -end if \ No newline at end of file diff --git a/SdkImageCreator/src/res/desktop_directory/removeOldSDK.sh b/SdkImageCreator/src/res/desktop_directory/removeOldSDK.sh deleted file mode 100644 index a8b101a..0000000 --- a/SdkImageCreator/src/res/desktop_directory/removeOldSDK.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh -x - -echo Remove old sdk - -if [ "x$INSTALLED_PATH" != "x" ] -then - if [ -e $INSTALLED_PATH ] - then - rm -rf $INSTALLED_PATH - else - echo installed path does not exists: $INSTALLED_PATH - fi - -else - echo installed path not provided -fi - -# remove old Tizen SDK -rm -rf $HOME/.slpsdk -rm -rf $HOME/.local/share/applications/samsung-sdk-* -rm -rf $HOME/.local/share/applications/wac-ide.desktop -rm -rf $HOME/.local/share/desktop-directories/samsung-sdk_menu.directory -rm -rf $HOME/.config/menus/applications-merged/user-samsung-sdk_menu.menu - -# remove tizen sdk -rm -rf $HOME/.tizensdk -rm -rf $HOME/.local/share/applications/tizen-sdk-* -rm -rf $HOME/.local/share/desktop-directories/tizen-sdk-menu.directory -rm -rf $HOME/.config/menus/applications-merged/user-tizen-sdk-menu.menu - -exit 0 - - - diff --git a/SdkImageCreator/src/res/desktop_directory/removeOldSDK.vbs b/SdkImageCreator/src/res/desktop_directory/removeOldSDK.vbs deleted file mode 100644 index 0e33703..0000000 --- a/SdkImageCreator/src/res/desktop_directory/removeOldSDK.vbs +++ /dev/null @@ -1,24 +0,0 @@ -Set wshShell = Wscript.CreateObject("Wscript.Shell") - -Set WshEnv = wshShell.Environment("Process") -installedPath = WshEnv("INSTALLED_PATH") - -Set fso = CreateObject("Scripting.FileSystemObject") - -''Remove target directory -if fso.FolderExists(installedPath) then - fso.DeleteFolder(installedPath) -end if - -''Remove shortcut menu -programsPath = wshShell.SpecialFolders("Programs") - -oldSamsungShortcutPath = programsPath & "\Samsung Linux Platform" -if fso.FolderExists(oldSamsungShortcutPath) then - fso.DeleteFolder(oldSamsungShortcutPath) -end if - -oldTizenShortcutPath = programsPath & "\Tizen SDK" -if fso.FolderExists(oldTizenShortcutPath) then - fso.DeleteFolder(oldTizenShortcutPath) -end if \ No newline at end of file diff --git a/SdkImageCreator/src/res/desktop_directory/removeshortcut.sh b/SdkImageCreator/src/res/desktop_directory/removeshortcut.sh deleted file mode 100755 index 48dcf11..0000000 --- a/SdkImageCreator/src/res/desktop_directory/removeshortcut.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -x - -MENU_DIRECTORY_NAME=tizen-sdk-menu.directory - -xdg-desktop-menu uninstall ${MENU_DIRECTORY_NAME} $@ - diff --git a/SdkImageCreator/src/res/desktop_directory/removeshortcut.vbs b/SdkImageCreator/src/res/desktop_directory/removeshortcut.vbs deleted file mode 100644 index af8e933..0000000 --- a/SdkImageCreator/src/res/desktop_directory/removeshortcut.vbs +++ /dev/null @@ -1,10 +0,0 @@ -Set wshShell = Wscript.CreateObject("Wscript.Shell") -programsPath = wshShell.SpecialFolders("Programs") -TizenSDKPath = programsPath & "\Tizen SDK" -linkFilePath = TizenSDKPath & "\" & Wscript.Arguments.Named("shortcut") & ".lnk" - -Set fso = CreateObject("Scripting.FileSystemObject") -if fso.FileExists(linkFilePath) then - Set aFile = fso.GetFile(linkFilePath) - aFile.Delete -end if diff --git a/SdkImageCreator/src/res/desktop_directory/tizen-sdk-installmanager.ico b/SdkImageCreator/src/res/desktop_directory/tizen-sdk-installmanager.ico deleted file mode 100644 index e622ccf0cd8eb46d26df908527e67b60fa4796bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149216 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�^dqpV*Abr<)%eFLBz2d+ zmLdP@DfAlCg2)MlH)XQNq|LxkF*)ZL#NQZX`pSl zm1-6EiLaOAAI$zL+SxZeuh6fc@Z#E{BVwEX#kWsBn`@iD_XFaKcyNNddZy2;s^EBW zaB{Klx5k&JzXbWz&?aXV&;j;#Gv__|%$?@Na=aC&hl2|B&GXdJpPd>*P7a;5<$ zNo?7T-}wa%22UFb$O-P+P{Z+e?ip;YJGE8}h|p64?XP5{6f&^toeZTB=~Lzcih}gw zNLUtmU;XZ*EQb31<3aKdEP+<10w@iEhlPo~g^59Iee+j0zc~YI((zLTgl`8)`;?&4 z72zpO@L(qiLl{Gy94p7}%MOm|cyxV+fs2*OAx#bJv25%(Z#1B*a9OOe7K{j{-$2%t zX+GfxgWkLhBGs3aY}%DsG^yc)<8F&%r1^Ws7oR8sW)`?7DRo7tkVuao=&j$cHF);Z zQMfY%0V%5GC(KmHUjgIh*;^VJ9Kd!`gZ(neu3pAE$eLenh$>|5^U%n!I=nBa z;rTqnmTtq&{Gq}Ik`!aW&2D-RZr1?1UiC+#wnnsh2j>D6Yxb9R?XO%mAl4t zF&f}KpHKSIO`0QtTzs%3!?#Q$6(NKJRkEy$j1{?40?y6)wTZK@B+q#T$|Ll@X z_WO{DTefkC>1sVL0V7{-OgN#})Ix_G4u_MYvY8`bA;$qmueldV(~M%?co9GzL(6`h zatMo*2TsKe!zcH@vo&5fDQf5$@8@Yp}$*vkvlW?(SWwBeafnYvD4&aRR0ogP^gz4j~h ztL*O;_Peu8`T}*xEB7~_O03n+e^2v;bBn%)-L({;3D^qq3YH8L{{}q*qjgI9d#=f> zv;~DCa<8h$lYY({caA$sd0NthS8Q;YA$O>zW}3IYb2noe@5Ki)a-5|O1Av=x97XQa z#y)l2fRsHcdymj*hO;J%OASee2bH5Zcam7N-uSk5_RnVzHZ~>O-BH=xBt0cu{H1gk zM_`lC?p&(o^iKcw&S$f^dy*f&{i>`?G>Dl56~OhYBG>chfV+m{xB-fr`^1`N_iuyz z_0LMS!6&v*+3zM--}$Wb4EKFC8p%~QhmGH66uFRj(p(^*vJ>_eoSGsk>8e=Un7_up z(S1@!;h`;CA&#jAGY-W{i_%MtYxFhno;~@I;G<$T9XX;S<#ASuv`XJPxPUhnxzuY}z zda@tCLQ=c+)@EbRJ`c({x8|B8bPOCul*i<`NAu;63}b3ruL3wOAw-8f4)h{O=8XelttN*=Uo4tFt3o?4mxdspSN}97EAsb{p5t^y?etn zH+clL-{$*`2%K-Mb|j^NVm≦(=!Z02@U!xgIPcB815Ko)5 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 diff --git a/SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.directory b/SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.directory deleted file mode 100644 index ff01f60..0000000 --- a/SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.directory +++ /dev/null @@ -1,6 +0,0 @@ -[Desktop Entry] -Type=Directory -Version=1.0 -Name=Tizen SDK -Comment=Tizen SDK -Icon=$$ICON_PATH$$ \ No newline at end of file diff --git a/SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.ico b/SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.ico deleted file mode 100644 index 6241105f95dd6b364924ef89e328fdc3dcf00c76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143332 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

;xXb!%c9(xbQGA=v=$!NaeRK4?vH7oHs}$QP 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 diff --git a/SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.png b/SdkImageCreator/src/res/desktop_directory/tizen-sdk-menu.png deleted file mode 100755 index 728efe0f7381852f0ed89bdc6a96b51f6abbda5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18038 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 b20sS?i(2izA^vi100000NkvXXu0mjfWF8Iq diff --git a/SdkImageCreator/src/res/icons/icon_error.png b/SdkImageCreator/src/res/icons/icon_error.png deleted file mode 100644 index bc6bf09035a9424ac323a097a88788e0db605e27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5913 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 IM6N<$f=`D^`2YX_ diff --git a/SdkImageCreator/src/res/icons/icon_login.png b/SdkImageCreator/src/res/icons/icon_login.png deleted file mode 100644 index 0c1f057507c607d568e517e019f52da4b75df5f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6271 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 diff --git a/SdkImageCreator/src/res/icons/icon_messages.png b/SdkImageCreator/src/res/icons/icon_messages.png deleted file mode 100644 index 7a4848ec2fdc2362f6ad0ba87ccc0d0f9c87a125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6327 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 diff --git a/SdkImageCreator/src/res/icons/icon_notify.png b/SdkImageCreator/src/res/icons/icon_notify.png deleted file mode 100644 index d286dd05e0d46d8822107bf5b0468c8e69af0e69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6295 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 N002ovPDHLkV1nVWC~N=# diff --git a/SdkImageCreator/src/res/icons/icon_permission.png b/SdkImageCreator/src/res/icons/icon_permission.png deleted file mode 100644 index f7ffe9d135eb2f0259d8798d00770c03b13e3638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6334 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 ATmS$7 diff --git a/SdkImageCreator/src/res/icons/icon_repositories.png b/SdkImageCreator/src/res/icons/icon_repositories.png deleted file mode 100644 index c3353f8cd5391c451a1d0f830488c225e59b927c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8232 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 diff --git a/SdkImageCreator/src/res/images/install_manager_graphicmotif_001.png b/SdkImageCreator/src/res/images/install_manager_graphicmotif_001.png deleted file mode 100644 index 762809952df3cb0d7a6fd56d832e9b483ccab046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45492 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 diff --git a/SdkImageCreator/src/res/images/install_manager_graphicmotif_003.png b/SdkImageCreator/src/res/images/install_manager_graphicmotif_003.png deleted file mode 100644 index e84c825b620119af68f63388655cccf2888a8c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45554 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: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 KMNUMnLSTZEnaNlH diff --git a/SdkImageCreator/src/res/images/install_manager_graphicmotif_004.png b/SdkImageCreator/src/res/images/install_manager_graphicmotif_004.png deleted file mode 100644 index 021c39a850647a59ec1ae53345ac8475b12dad64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45495 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 JPDHLkV1fX_z;plr diff --git a/SdkImageCreator/src/res/images/install_manager_graphicmotif_welcome.png b/SdkImageCreator/src/res/images/install_manager_graphicmotif_welcome.png deleted file mode 100644 index ce75786de9c65772ddfb962dccbd27196041f844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55243 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 diff --git a/SdkImageCreator/src/res/images/uninstaller_graphicmotif_002.png b/SdkImageCreator/src/res/images/uninstaller_graphicmotif_002.png deleted file mode 100644 index f6aa70ecc63ac1adbd88116d5b7969afe4648fc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45686 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

teB|ud#quHXY0CI?S*o6kmdm@6BsQ$C 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 {42gs=(=2EDH_ z+SmY(hH&%S8pdyx+Hg*=Vk9UX4b*So#QUzneP=!|wzC{H)wWlRI4|CCOY>rGqD0$< z8!X<7eK))VgXKd>p|q`X9gE38u+`m2m96O@h1R1o$gmTbCO63LJaP&Hq*nBC^1=g| zFnRpF!udGcp;6wh?hQdwNOlA?OVPPnh^IBaP=Hhwi99duv(PK$yOg0q3{M=X^|t*+ z%KO>xNm8!ylIfzGTm2UHJoH%{Iq^yGs+Yey(H$EKK zs;0x(M3q{QMM;G6W+>0YRZejuqrn92m-hT8f&r`L+~W;0FKoU&9#GM)y6%(Si}yTH zyV@#bmEaynP1m5=-#bv_pn8)z7rm>^1;gS#7e)YL3l8yTBErV<5~^y@=6;pZEsQ|4 z(}rj_x$ipkIjk+5hSlw7w1fk0a6Ru0U7-c>sW}dAw2s|h{I8flc4v+la6$&0*{@d; z6Y}iiqQj!zuGsp{tw8!@28oWs=Gz#8yXfv+xuV=$Nd=?kLTJxIbJ&n%loQIhpke${ zHT7J4o`X@Ph4em_2kG zcHZ`0&~Oc?awRZoqekd0M?ocFh|aajW$fED!$;#$UaZTDbQt6$dE~dv0CSMB{{_QA zfFYxXJWRqj5wPxJ$WSh-Jq-`Y8T?VM^NJpbQ!8<_u?9cdfScLg_IV+9|=Y=aMS+ZT3Nxbp*;zvol!XBP9-(rLLuFWnG5LW_}A5hCm> zgx;12F{we0%_BF*2b|Dyg=SolWo+|1!Kmn4m1XHPi;Hm8KvAz^p+PAxl-xjd@gNlo0Aqgf>)3JdMl7B9crZ0kRJ(Er0Apt5 zA#D5F|HNSB{$do+(K2|alslKuh?oY2^;(odrOek;WNk$@jX~;CBhMo6jBoOUkw;8FYX~Vj6uCU1oid-5_ip>GTbCCM@$v}rI%cv^X zbUvJ@fGcfuiI7l`R5jrDjt4%4^@TGqTsWyIcIu|(Rvo?t+wc4kFj_MjIVo%+TV2+6 zbBL98w!~8-d#U9l#sUV-$gC_bl<63Q1m#AEaR&Kthu{RQl<~r-nBKK|wP!tptyJyi z&1NWCwCEIITxIXmXCnhiCq_$#Xiu34;e?HqCCo$*Sn1A(3dxmN2P?gwUU3g*&}a?2 z?*2O*KJP{FgKZ$cj@i5Z7K3A7?~EpDNeon`kaqo2DnLpbp%ApQ8^&ugpD7G7X^V_8 zNd7hzA!+!iyt2UxfoH{r*mfk1xHL-=bfv?@91D#TI|p1!BTBpKBzxNyEw-Skha2F! zhMS#>-mj`86`yqFTl9VjWMm;mG+288+W~MekI(P>1XgyPkLvCZU@$r+G-)U!a3mHH zbqA}^!#4S~ZwnAe4+vycY^OmY!7LLSBu$wEa*z5z5i(JOONGrk%$;lB`#UdsgZH@1 zAkGP+Ir!l`sSQf%gp^kaDArEZ-z^k}9UC_DCV_nIv(2Sa)V@z^#v)nF$T$0Z32i6;HCGG1>CnO zeO#4Hy_GYJfH)^5PF2NuAxO!+yX#W;uXyk8PsAH68IJ6hSj}e{lI1#hxer9Qm(} zbhyL06aQDmgYuC2KFI@8TX{>Bd;-tRf(J9xuWQW{`AKM3ImLbFxff#JB~NS)0&|aN zq?p5y(I}Bdt%#|jr4%JT!~rKEbZ+I;6dz8k)3ShhxNR&iHS{aWM=(iz6-9VN;SnyM zv@DR74F;nej7F%;2tzJ^m%oH$2!#tjY%bScG#I~E8=SoGcu*eF3(qD!r0?*MEpcLg z+tkCs0~xA_Xe=IG8cLekz7tRQ zC(i`HZLGu3&BsL4i+w0I|FyrfWZ*z;3(yr2VFclY30aR<784{3k_gR^-RdnoB;dAh zZ+b~S4WoT~U>KF7G`~ONnJ>Tzmpn0sj%r~iPP_7XIQ8kz#c+8M4}9hT9{TLHc<8eS zI(1~UM-6)^T0D;uA;De*VY1FjZP@&<6pAy|hW7h#WfiltGc5yJ=Y5hHlVN@^baWGL z(>6^}qy%GPMzy}45_s{rOy~(H_RTHvLVad6-9{Y^Fd3Q+V$)@iV9<^oKs7)GL=QZb z0ZQ4k;+rgbu#_^K^rUAr^B0h*PJ3l9?8M1W`!SsKv>$_K;GxePz`@U5i^HEgfO>63 zwBA^O$3YpY#5}Vof1JpJRbgmxDLaf*Fu-Q6kucg=2m2A6n~NO}D&~JK$Nc&V4_Otf zB1OPfqakR6;Adth-nmAF{ML?01YllP)wTleYVVi4r2L8I=Ha$26cuJCGQbjxcp5?j zGvnwtzJxs&KT#PTo9#T|-+Q0%bnJP;)4}|!IP|$|apZ=N;Na)3gu>0CDHXrd7v#uilMio@L=N!wK?kIj5gMRssh@gB!gg7 zzN;0(s;W{sp!}-QGw?4XTgfQ943ZpXcI?bW=cg?~?8+e1&Dwxg7||DY zqao=Z@BW^r;jDl5T0HJQe;DWf>)*i%Pkj#N_Mc{kqjhUd?z@!+8)l2`UgK~ADlrd2 zg)WW+pu^N#WxiaThO5e5a$9%^%+CVSHayE@pH^4&Xe?W5J<2Vwf_P^-uU_cD7zoA; zE_J~&tY8<$%$~jRvpS)Q>)gYX19pM9_O^KYm$7>Pw=jFsX=6NK?jeH;=&r{<4LdKp z0t{gFuCLneT->CE%nK4{h!R+iTs%jvN zP7+e9i3<dru0rQ{Pcu3E{>>20dq!<4J&ik#u#M%Gh zPq60)UW~yBrz9x}_Sx)1k`n6%#KY#yC|&0CcFxhp2DlzI9&a#EUa&F5bafXCk51fA zLosrw8{&B&4R&n}7;a=npjL?4mWTO!?q$7b3EHLFJh6wQ!2p9DJ5kql3h{NVx1vrQ zg0qd2?R<#m-raB3%{=s(1A0^U7{gPWAAP|P+beqJjPtSYMX$h_zy27zl-iA~5SsKu1kRZbB3H!2R+`HPfw+J!p5*gk~p;zTi;_pXp`7Ab; zj-guEsaH^Sgxy3cVt)q&|wCos;X8AD-|H)$OaIYp9H;=VG2nzqdb*03z^}U7U6d75yT5Y+BHjM zB3-UjC5wF)tmZmw$-%I3By~U-b0?e#5(N?$TB}n{#igFBA4@n;tuJ#QBEmzTxd!{6 z_PowKuhS4!v=VCXJ%&nqPr=k~$FcU=4}kCey7780VvEiZ>NaEAKNNVCi=7vj?#6isyEE zId32tl`^4RtoSj8$^dBZ$(XzRD$HJf73xFxVdLhHV|dFa;BUW4hXl`^%$ni)8hky1 za|^on8$z+!b0-DR*}^M@!b3{`vVv$to`~{lh3<2nJg&HWQfwuK-%5{IprT3Rj$wRag9PSI*auRJ9+76C zp_fQ{KjpGQJ77MZh|mq&9Q^Dx*mwDJH=XD88e+)<7CmZvs^@lqE_)WL$2}9gx(xo( zC*Z#HN#M3m<)4Wll&?(qjn(EPWCMxQp~!&gD?HTiWR>kbhDQ%$X74_=jx0M*A;%3V zLm^KqI-4$o}-sNvS|@0ay+FfRuKp6suZVjt4BU}E%rY3$0o}2%7&PCPi&|j zTild#%K7c!$2}AL*k^**mVqyS67=Oyg6_NtSX;*2_MKRrnQe-X_%&#DqnRO}E|#;@ zUzxV>Fr!(<&fBVZbp>vA7K0r-GXbVx6jDJf7>nyCIrSRkVA}#_cJ69grM_;oc0|e` zTcp7drv{?s!Wli2;l-HUWOBJjuW!Tf!p?^^&$EB?Q&iQ=CX~-DfG_=l=8FM$+b1#j z=$~W9>I!&eIfdVuL0X7dVmSkf<;-l1W{Sc?!!zRX#&R}}90twKMdf}A7?WWgJ&TM$Xmn!}gw(FZgRudgRXE)*a^(6030U@1 z8e-}G$h#%Mc$j+(ktZ}nX4G>FSbo84fWZvb2Lr5lkJZr-b-Si?8kTcc;bFJ)>Y_wI zb>d6I^kkZ3UBp5rJX_3wC*^8NN+ceLRHTErq&!|sPb+RI)%=;_R z?z2XS(RW$A{s4x{$KbZ@{9l{rO;}ZTLPNVwLVeP?s2;c-Lto?Y(juI5m>mo-HyB{H z8bm!8%Yd1fY%opXA-tjOJdIYCQEl6XnT74*T#3A04SiuMrgAmgKrW^ID?~uuuC|bK z$gLR3cuzQIJ zV@Qnvuyo@`vIWcE_B_w`=XsMD;%L`N7@hP8bd7MzvDA_GSZBsEdo0&A)?`SZ0P{mB z^k!kWKc)A>4XhtMl7Z7U<8*@=Y(M=>Y&&s3X14Dr8sp6N9T;p|5Tpm6aS|oLmwj#a zyCB<^FcBTgDvxR+Bg0K$(E*jOmycoTh6BP=^;Eu{o(jf;Zld6THN^3S(aJ?vX4E1g z^l~F>cx-r&Rp+o;ISid(YJ$cuzKE;;y5E^TbJT?Eal0Fk^m<;hanM$v$Gh^&Y>R6z$-XsbA`uv zZ=zRGNUbml_fhW0ka_OP;6xkMe zBJj)%u&^Dpdk@^g4$#buVaD_q9@z<;nZfMty=oFJyls-2eJ0l@!*nSCc>uyZHe+}uQkhlEUK_v{;^(bHZktU+#8KZLH0 zZ*`|xbTry!KCz1TQGLRXM%Y+9hSdk|$I>_N#`@ty7_F{OMM-cp#rP$9VHy-^IBTE( z$n-RQKcyl1LMR{OZ6!3sW;_7iV|c>Z8139I;02$JE(i{`$lXoLauO(u2-UU)%O=foOM%8izOT$Dm4=kOpG*?Zctwz1|fFIRZJ9-3*-})vN@3{+W zhY!IIH>OG%3?n*Uxt_Rx1%aQ=9&iUwaCH%DU$_o4ms~NP+t)`{=<8?{9@|S+D0WsF zD?$d`Svm|TGv=#UczW)8TH17x%f~b?@vd`?-Qf!y6UI7 zZG7=MRFAn_8;IibP1Zj1Q?%uZ;{c@=ps?a#c*Gv$87t>sf!()$&_En=0gk@rn*7`r zZ=@x?7^D2*(dHd`sxiSL@F*|zwvY#o9|#lkDWg*yjJjdXpN3IctMZR z-ZSBM><2AAARq|WK9&rBF4mb*Znwm#w5!YP^jcS5%>b(Tc~tZB1+hxof#@EujXT@p zqDJlcA{ z+`$oyFX+t>C3!S%d(rKc+phcSSf<_P)5T*i_5BJRCRL#ps@q@&)K;iA2jpUOD~nxD zYX?2k-2!NIQ*Z6Cie}N)FyTK z42Q(Ku1Bc8aLt75XmtF&pJdu6hy*|womXGZb8B=As#ExNt#@2M^YL0>+yc{ zD$nCCuhx_2G4#*jVhQ24`Qj`Lr+;(&-jWP4I^jI+@dSO%3(8aIfd=9AQW1b25F;9) zOkHfA2SYlI@70gR8;b-}6x8=Od*kEqfP#LZj3x*Hm4s?&a+WFpVCC=w*zu*0O-(YL zCeKUUJelhWd{277@Vh$Q2g3LQ9J6uirNHch3awqHq$S^gY$2N_`gLFYAypWY-l%-f z7^P+^bA(!=TpjWdJT=;8`ry+Vp-WFd0v8*HG@LX-Yo+(1)*T$)rW}k<_DqJSxWVp(;c{O)byT}I7J9EGeaze3yH2FIPUSIU+ z4SAqZ3KMd7V9|DLuA6FZeseC6H{k)tC7o&NNss+a3(3@9`7Ekq5B21E6VUWad7kom zrmJDT8l$RJwX42r@xA@`@TA8SFRIdFZ32O7FDG_7E@Ccvv#bHY3_luSw7i7%BZsiD zc(mAJ%YGL3p^i`-hnl1sR(spF@5B}a|Mo@Ufi$MBu1czm#O5M&tt{hC{ELXNy0(gi zkNr8;e(2}TFwq3&tj4*yQMp7>dW*695N9_V6K%n_miGe##r27WLP8m@u> zjOr!~R~4hGD%h50vjc?E>R7dogAHa!Wg1*vW3;vkzqSTH8ft8HIK=!3CuV3vxwt44 zGVRH5At;rlIvQ8URDK4eexx-FbGY2iS?CAG^@F-@-jgR@V;(5 zP+eoRvW)eE4`J=02QXS%%#05J{Kf``ON%DQ>&9s%q9GN|@_i{TTXsXvVX$oh+fLYr z-DjSKh5aXW()y3z0Eznjsq}DDOy0}Ty|{D?Cw}am9m7Op@VwStYR_hjj!k7-`*OII zzps6QVuayA6fX7ti{fXggj#B3Pj_@SWc{J$EP_WLjZm+wV0ict)*pHR!^LAoqqDc+ z(jrFdYsHJ-GLu-GUluEGd-HZn$7?V2*=-A0IN=2BKI1GboVXt|3)_V;@+LyC=-rkY z<5p#fpeOMoJkc@Kl!YB;tY7~DEL{2{SUmZHF+xPFStsEt7RsY3T-12z)KZ3j~zJKDHy9r)fUlVA}#_7PdFB2ybp`d> z+U7i9Ic#=&!EwSxeV%c3Z51c|{U3tXmy2F5F4OZyfxxrwW`y5Kc%@Du)Y-7BykFgV zzd98rwE(E=wor-BSED}hB5_!{uuf44CZ$2#==P_Z_WUx!61tqvoW(H_IF3`xD_W~ z|5p*vO#rh`{YXWVk{-&7{;f2c6jGHj%I|gEezkvZb3d~8kzu<1yWe|ZHb>os&pAg; zH)S+JwY~;gTWyxn1TRFC)=nIU5!P#KSy!Z+>cu@#3Z^iUqNKV(!JK<1snj)n2#)go zc70VTvE|5hlcdThlvp4}mafLpXo&5fdKdPb@+cfS<5E@q5{u18VI`FO&Zg4k+*skY z!8$K~Cqe2$HLTb%F}!=!`!B|zH6SO18l?eLqPR)J=mu(O_v}U_E)F@N2*>n01J_## z%OR(52I|oWetiw2)m4nv*D;vihWWjF0Sfy*NJ-7f)?>;P$k6mc|9e_(7^RmimqfQO z*IEQ&xVMjHCIp;92V~pfdsHH-vHR3@b>dEj7>h~wr+&l&g+sl(} zNCif{x{8$t?!(5hqnYtZBivY8Qh9gWwa20WbX4ptvS-wz8lx#ltgdek)#{>*#lFWZ ziS9z{eO=@JyS|DGKKQ$>5r+ILFD#mZp$4^I$%w?)sQs#wL55sU-k)SXII5G8*M;tg zXSmTCwjH_|JCA+|d*s~ zs^yN`2k!YA9{Hi)!`Y#!6*vt)$_?)e(dIPhld zzW9gntw%l+^aQIoWN0Ip2#Tdht?ixX8R6QvopnmDVGOM+9GRD26bOgb{SyWG*tEw za_doa19m^OqUNv6C92Up;>D`g+vMeuQFgJ(6{I+sR)`oXSc`tdI7Tq9o zu>$&-mK{qdOn`}PKIveWL$RDYK6>m3mRG)rQy#n%?(EBO_~ggp@F|beoeov4TJP6- zNrs_ZrTfpVJ%nwG-@wAs?U>y-*i*GPp_So4!3A*c)d>AY87h2B6I2E^2A%h{m52#V2^aNxKr&v;=7L4Ul8n9xcUXTRpCl7wRKGEd zbB>01=IZUz5Lru;h9bO|MF^Tqkv9#`%;`GKh=Sy%Sya;n6e~|P!7Omx4`FEg)UkuM*Sp%#PlOHf zxc$pFVEwZn!H!*fu;+w**u8B5*n2j3FyCNT)jWpV_G4lBn~j$7Xao#bF|+zW+v2O^ z9=JLzAFQfSI%Ft*42s0!kQW@FNZbPcXG5+wvc{7tFGtAMZZ#=D$}tD?^X7w-=uu4zaPch}j)Gjre6_exZ6FC-vMLf=hWBbrKWAdlf$@ISAO5Pe{@M zB@~DHbHk?FP+`{z`!U?U6N`rqV(E^rH@iFrUunM&;%cq6%Ap#}#FeWXtIml5oV~D&jSQfXHu~iuqGAQBiq5y#?NT{k%ZCe=AtDjCG zJTp9@g&3t-2&h+9;pgU2&CV(sfB1}AHG-!P!6iA~tc0IX5g~s*W3YvayGYgy&2(e5 zGjsDe;ndTyeDnyGj~r@x$O9k0*LCCNyl3#t096%uP*q|S#a2aC21lJ!qTZ6zr#zha zkW4x-CI7$xJAjS@o&lj+*j_mPEI2FLa=R|%Zf~azFkz6*_u=9q+}^#iSJ=FisFF7m z_6Nl`+cVdZRm)O{NEww{pOe;#w*St1!+BMmU+n4mx9{GAh26Vx^#1#>vAPnCu#p#; zNrT^m#*nLuwc)81y23!)tGIGHpSACm<)JFVGji{44$m}rVRs=TFGM##pDhZ^XGo|M z;|e``>Ik#a+d=O85Wj=>7%eSfuw#dMo&fjAuT7E>jQ1h*R>P_evEI=X6bg)(!i$nM z@VJyY^(gn8avFwft2p|={TObn!&Oye((sIrGY`x&sF=ZyoA1UTgJ*QU$qPg6Yd3-0 zUAmivXP9YxuE-1;41mEPEeSLiM1otmKp27QuAtZ$$h{q;Hy4GN9}ZEktzl+iA?Wcb z;;Z+5`gN^xlQ;^%sP%S4G&UNST6&7m(C(LInh>}&UN%+HO^BY|wty4PI1?*J4rBSq z;bxT6dkomaS000w>cxWrs^Aer3$kjj+={_mwT798GKBsdPcJAAc`5im4c<>>NHr5-%8h8;NJUn|0s(~`XsuGI_QDtwB z1i1RY6rP!#%@ylS_(dj8>01&6DKI*DLgVd}k!b@gp%`e14WJ;Psm04t7zY?1g3X5Q z_#uV*dtZ64(!G*AmntSqZdjygg)Rz>HFCQaU}kO}drv(bYm3LQc<7;|5arW%9{6N@ zQgcP%YxXl#$_T%G@Qj0p2Q_IxyD+9pct}>Cax@_JvtuqAvY$N6ru2_`jV^U+n$XJ| z8^GLLG+gc=p-f%{_b_Os5ym{sas(xTv}?&tp?Hz}!^yhk9Y$ziqlMjjFu!vrjy?DQ zHda?eF36FA-FU}A3&VI+&KvcIs!dWTH^OfdJj1OaG*A&wBr=2v_VhY(&8i3~{YK-x zoxG0%sfVMcFd7Ud3SeVfaq7vHdM1P66Fqx06b#qaaP-0Zu(7e;fa&x%k)RBRz}&2^ zxHp3X+I%fcFyWxX*!D?ysEN6R>mNiCEaR8%G|v4;yQ1 z@G~nktLtiR%BJvYchH_#GVLn?m zGlPAnpNW-YN3nG9!A6n5&%#x0fx;esz%e(hvZd7NomLo_;q=YJGc_|tLDp9Q^-4fA z;%%I3KZkX#0ksfOEQ%Iz{LAcqMOVj8Sw; zf+1ElV?@5(?;lUcD(eb&78C{2LSGM$pFM$oGSLaU4=a-or1L; zJ8|s6`kZVsN=@FUbMg^Jl6Qv(cbdIpUeAi6)y z_IbNPj%d0k0|rLZ79pj57LwCtlWk_skoE%hkXNmsV#^Oi-Lobg;kCOHBc@xd2oU>b zY=A-tOHVMrupQgZ2}R10X7%W-hxc`pBYGcu$_b`nI3C3EHyYuT@XV;Lu~Cmyr0JMh zP{!GuBZ2P~^5RVW)b$h<1#efXgw@ZWtg^0*H=fV~YA7YVSZNqV_8|N4J0f&&#Ejvl z4KIpW0o6AxRBhZD-8+(Z%6gTW*$Yvm+>iCuRm{xJw(=l8w)Uiwd^HdUj3A6~GI)j= zSRHK$N|O^8B*tFw@$*n&4!Dpbk|81#!RO4|*&?M(VhF#V0bz(~J0bCdB@Gago=|v` z(y&V=12G{Q8I7%djc%jvenJa9q@1uR6H4AeP6FEXW7W(IPB`rhtS%nK;=zMWSe^;} zNv>e2yTL-dI_nB}E`)rY zJK0a8IzSy4iE|Zp?>_|_t1CG6-~*`Z5xk#kJYZd8Fgt6m1QxQrGpMRT5uVu?)mYtF z%e=ReM(q!(OiYr`Q6L?MyLhI(a zGDa~)M^jX~rLbfB*?mi15-lx1hI0!G*njppSUhwPYm3Jk6@bA^f@@-*S?e+b)X4XW zB%K*pT3L#+7woxENc82k5M76GT)EgVP>*Z#Y$`w~lX*KRFIqBU`5c?d0lV2Ql1fiy z0!vr^#^^Y}NsTKzSl(x-ee@Dkt~_L8z>a<<{8ADtScNn#PeLW$1a_XV4+}eY;m8B` zV{LUM$?9^;H*5!=yjnHTc)|eBEUql0_C6m;DEAn(CyaR^7a$fg4k7n}uGsnLFDi=P zjkn7@r%hBEH~durJikLQ?XF-5r1>8ZzTd1n>E$! zEcTsoCe{{@;n;%@U^EJNIMWm+E2}G5TVE53sbwmfs&4x_ zN1Ug93%Ui zcR&*0&xM&|no!eP=7y319ta9V!2FJ#m|fV8#X|?NvUm)m(Fij$vzVEk!>pf+q1gMn zF(_AIae1j}l?iFzQW}stQbDaA+7ouHbjUGO$;2Vu`yJ=)#sbj-|0~XxJd8z1cDlvv zuU(cW(R{fOIcoel>QL>ZuClwx4AFXql%3E7r*$y3iQs*zl1nEt8l0o7CJ3Q@_x_Wx z(RNaX>+6`A+rVhJ(HP>~JbXQik*_gqiLp`1s=fFeoY@VhTcb(pmxN%apy+oZ^k#H| zC7uBcM(;&E#yDPPR!IKvpNKLz1m)Lw9M&DfNxJ`?6Sd4HCF7t(e|z62UAPE}M)>g{A|=6w(` z-%JSZiG+F(E63=l)Dh{mY;+W?BspnzDf08 z{tj#R!YwaPP*ilmH2ENtTz*rxhL=?Ir!m0Nz-N?-318ij=q8$$`^5zpBZv}m*&gLFxBWJTNoS4$7q?o{*aeNj zE7n*28(`axX8R5lVI~$1oq0~E=*0{NN5kXHOR^=J3LnA(*V8j0(-jpOl&D*r(>JZj zHtg2*uoWoZz-TzyL=ITgeVM$gVvV3{lB?68y1D@oE2IMOOe!yAlMt8NhoYlG`MioZ zDg-h;phBVI1)Bu`@cl0YE_!NQ7)@&31jRT^NENK~kkX)7(&*#Q?NE~tGMCn!j8jus z2`;hRCoC%LIjCzNi;QG=qZE2aBaDVaj3(G~*NFpmF)jMAyNsq~DE+pA4y=!9NBDYU ztO@r#PT{qubJOSj(`t%BT5#(5;Aj6_Nt+~AuxX}@6GATxks*zVL_Vku(dL8%5t74~ zz-aX9hsnI1t!zVwCmLSegx}F97~ckl!y$$n>(dyZh_{6tr+?rmr}GzOI5NZT?mhRv zW(nHS!xhxR8r>Ya5K36hRM?BIAqn(cfb3JaWCktlgnQAyg*V=8{4hLDZ`UHFH4Sn}a&OG~hu}mwR=2I^6P500G;BOy>-|Q=ao6+EE~@$mOWx0w_|~Gnuo3L|kW2I=xZ%oSy@ocD`;z z+p4#R+eX50L!!vCt0UD=TLa=y^pIGHC@bVFy(||MCBtjfBkJ^BKrFTJdi7|C;cx@P z;RfpA2y1IAIPtX8v3TsrCR=eOmhA*AXUm3BQg5AbNtt9iNoba#P#JoMcA@R!bSc1E zus!yL+t1+&_@le{si>a#BkdY15e$jTRj;j%%^f&;Csv_2hVAJ6kh~x@h8df7l#jNK z-3#m+@uuYQ8oF5swY9Ic*Bgy6+Gvb#G~B>&G{pWh&cu%0dpDZ{j+v0_^Za{eX132fVu z45=4pL2hvJxmheHjA0le?}I8nNL9?K`ehIZ<02NDaO>M4{on;t$n~w~8^vn3F}~q& z1H+AVkRzP=$VW|t%TC6I2}W3&ikpaTlMjkVfg-a%tqU&cGVXCQ9a-qL7ePmOwiSOq zL5JAU34fdWp_igMW+`~dJS4XR?W*!kg;idNKzT>I!wm(&0GJ#vRJzdv z2ICXCU)_=`Ms2k_8V<3sv5sv!cHpEl&+dS~#^3(G0RS1zf!>qB)VBZt002ovPDHLk FV1itB=JEgl diff --git a/SdkImageCreator/src/res/images/uninstaller_graphicmotif_003.png b/SdkImageCreator/src/res/images/uninstaller_graphicmotif_003.png deleted file mode 100644 index 38195f09cd44295f9b441cdc31950efea3ee1546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45733 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 - - InstallManagerUpdater - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/UpdateInstallManager/.settings/org.eclipse.jdt.core.prefs b/UpdateInstallManager/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b6a010f..0000000 --- a/UpdateInstallManager/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Fri Nov 11 13:51:11 KST 2011 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/UpdateInstallManager/src/org/tizen/installmanager/updater/InstallManagerUpdater.java b/UpdateInstallManager/src/org/tizen/installmanager/updater/InstallManagerUpdater.java deleted file mode 100644 index 92d0375..0000000 --- a/UpdateInstallManager/src/org/tizen/installmanager/updater/InstallManagerUpdater.java +++ /dev/null @@ -1,183 +0,0 @@ -/* -* InstallManager -* -* Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. -* -* Contact: -* Wooyoung Cho -* Shihyun Kim -* Taeyoung Son -* Yongsung kim -* - * 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. -* -* Contributors: -* - S-Core Co., Ltd -* -*/ - -package org.tizen.installmanager.updater; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.PrintWriter; - -public class InstallManagerUpdater { - //old version configuration directory - private final String OLD_CONFIGURATION_DIRECTORY_NAME = ".TizenSDK"; - private final String OLD_CONFIGURATION_DIRECTORY_PATH = - System.getProperty("user.home") + File.separator + OLD_CONFIGURATION_DIRECTORY_NAME; - private final String SDK_PATH_FILE_NAME = "tizensdkpath"; - private final String OLD_SDK_PATH_FILE = OLD_CONFIGURATION_DIRECTORY_PATH + File.separator + SDK_PATH_FILE_NAME; - - //current configuration directory - private final String CONFIGURATION_DIRECTORY_NAME= "tizen-sdk-data"; - private final String CONFIGURATION_DIRECTORY_PATH = - System.getProperty("user.home") + File.separator + CONFIGURATION_DIRECTORY_NAME; - - private static PrintWriter writer; - - private static void initWriter() { - try { - writer = new PrintWriter(new File(System.getProperty("user.dir") + - File.separator +"updater.log")); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - public boolean moveFile(String from, String to) { - return moveFile(new File(from), new File(to)); - } - - public boolean moveFile(File from, File to) { - writer.println("Move " + from + " to " + to); - if (!from.exists()) { - writer.println("File not found: "+from); - return false; - } else {} //nothing - - if (to.exists()) { - writer.println("File exists. try to delete : "+to); - if(to.delete()) { - writer.println("deleted"); - } else { - writer.println("delete fail"); - return false; - } - } else {} - - return from.renameTo(to); - } - - /** - * Moves new IM to old IM and run the IM. - * @param args args[0] is path of new IM. args[1] is path of old IM. - */ - public static void main(String[] args) { - initWriter(); - - if (args.length < 2) { - return; - } - - try { - writer.println("sleep 3000"); - Thread.sleep(3000); - } catch (InterruptedException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - String[] imargs = new String[args.length-2]; - for(int i = 0; i < args.length-2; i++) { - imargs[i] = args[i+2]; - } - - InstallManagerUpdater upInstallManager = new InstallManagerUpdater(); - - if (upInstallManager.checkUpdatable()) { - upInstallManager.update(args[0], args[1], imargs, true); - } else { - writer.println("Installed installmanager is not updatable version."); - upInstallManager.convert(args[1]); - upInstallManager.update(args[0], args[1], imargs, false); - } - - writer.close(); - } - - private void update(String newIM, String oldIM, String[] imargs, boolean isUpdatable) { - boolean bResult = moveFile(newIM, oldIM); - String imarg = ""; - for(String a : imargs) { - imarg = imarg + " " + a; - } - - if (bResult) { - try { - File toFile = new File(oldIM); - toFile.setExecutable(true); - writer.println("run IM"); - - if (isUpdatable) { - Runtime.getRuntime().exec("java -jar " + toFile.getAbsolutePath() + " -updated " + imarg); - } else { - Runtime.getRuntime().exec("java -jar " + toFile.getAbsolutePath() + " -removeOldSDK"); - } - } catch (IOException e) { - writer.println("run failed"); - } - } else { - writer.println("move failed"); - } - } - - /** - * Check that installmanager is updatable. - * @return if true, installmanager can update. - */ - public boolean checkUpdatable() { - //temporary code to update - File oldSDKPathFile = new File(OLD_SDK_PATH_FILE); - - if (oldSDKPathFile.exists()) { - return false; - } else { - return true; - } - } - - private boolean makeNewConfigDir() { - File oldConfigHome = new File(OLD_CONFIGURATION_DIRECTORY_PATH); - File currentConfigHome = new File(CONFIGURATION_DIRECTORY_PATH); - - try { - return PathUtil.copy(oldConfigHome, currentConfigHome); - } catch (IOException e) { - return false; - } - } - - /** - * Temporary function to update. - * @param executableFile - */ - private void convert(String executableFile) { - if (!makeNewConfigDir()) { - writer.println("Make new config direcotry is fail."); - } - } - -} diff --git a/UpdateInstallManager/src/org/tizen/installmanager/updater/PathUtil.java b/UpdateInstallManager/src/org/tizen/installmanager/updater/PathUtil.java deleted file mode 100644 index f14b216..0000000 --- a/UpdateInstallManager/src/org/tizen/installmanager/updater/PathUtil.java +++ /dev/null @@ -1,93 +0,0 @@ -package org.tizen.installmanager.updater; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - - -public class PathUtil { - private final static int BUF_SIZE = 65536; - /** - * copy file or directory. - * @param from source file - * @param to destination file - * @return - * @throws IOException - */ - public static boolean copy(File fromFile, File toFile) throws IOException { - if (!fromFile.exists()) { - return false; - } - - if (!fromFile.isDirectory()) { - if (toFile.exists()) { - toFile.delete(); - } - - return copyFile(fromFile, toFile); - } else { - if (!toFile.exists()) { - toFile.mkdirs(); - } - } - - File[] fileList = fromFile.listFiles(); - if (fileList == null || fileList.length == 0) { - return true; - } - - for (int i=0; i - - unittest - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/unittest/.settings/org.eclipse.jdt.core.prefs b/unittest/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index da5a3ba..0000000 --- a/unittest/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Wed Nov 30 17:51:35 KST 2011 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/unittest/src/com/samsung/installmanager/tests/InstallManagerTest.java b/unittest/src/com/samsung/installmanager/tests/InstallManagerTest.java deleted file mode 100644 index 6e9c126..0000000 --- a/unittest/src/com/samsung/installmanager/tests/InstallManagerTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.samsung.installmanager.tests; - -import static org.junit.Assert.*; - -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import org.junit.Test; - -import com.samsung.installmanager.pkg.lib.PackageManager2; -import com.samsung.installmanager.pkg.lib.PropertyParser; -import com.samsung.installmanager.pkg.model.Package2; -import com.samsung.installmanager.pkg.model.PackageSet; -import com.samsung.installmanager.pkg.model.PropertySection; -import com.samsung.installmanager.util.PathUtil; - -public class InstallManagerTest { - - private List parse(String resource) { - File file; - try { - file = PathUtil.getTempFileFromResource(resource, "test", ".list"); - PropertyParser parser = new PropertyParser(); - List propertySections = parser.readFromFile(file); - return propertySections; - } catch (IOException e) { - fail(); - } - return null; - } - - @Test - public void testPackageManager() { - List installed = parse("/com/samsung/installmanager/tests/installedpackage.list"); - List repo = parse("/com/samsung/installmanager/tests/Packages_repo.list"); - HashMap> repoMap = new HashMap>(); - repoMap.put("http://some.where/", repo); - PackageManager2 pm = new PackageManager2(installed, repoMap); - PackageSet recent = pm.getRecentPackages(); - //check depends - for(Package2 p : recent) { - pm.dep(p); - } - //check conflicts - for(Package2 p : recent) { - pm.conflict(p); - } - System.out.println(recent); - System.out.println(pm.getUpdatableInstalledPackages()); - System.out.println(pm.getInstalledMetaPackages()); - System.out.println(pm.getAllMetaPackages()); - System.out.println(pm.getNotUpdatableMetaPackages()); - System.out.println(pm.getUpdatableMetaPackages()); - LinkedList Msel = new LinkedList(); - Msel.add("EMULATOR"); - System.out.println(pm.getResultPackagesAfterUpdate(pm.getPackagesByNames(Msel))); - } - -} diff --git a/unittest/src/com/samsung/installmanager/tests/Packages_repo.list b/unittest/src/com/samsung/installmanager/tests/Packages_repo.list deleted file mode 100644 index e71209b..0000000 --- a/unittest/src/com/samsung/installmanager/tests/Packages_repo.list +++ /dev/null @@ -1,319 +0,0 @@ -Package : toolchain-gcc-4.5.3 -Version : 0.16.6 -Maintainer : ha taejun -Description : gnu tool chain for SLP SDK -Depends : slp-base-toolchain, i386-linux-gnueabi-gcc-4.5.3, i386-linux-gnueabi-gdb-7.2, arm-linux-gnueabi-gcc-4.5.3, arm-linux-gnueabi-gdb-7.2 -Category : SDK/build-system/toolchains -Size: 5068 -Path: /toolchain-gcc-4.5.3_0.16.6_windows.zip -SHA256: bd77070bb6f2ba35d27929084cc4738c04bd07a89a9ad2826812a22e947fd9aa - -Package : GUIBuilder -Version : 0.3.6 -Maintainer : Changhun Lim , Hyunjun Son -Description : GUIBuilder -Category : GUIBuilder -Depends : -Install-script : install.sh -Remove-script : remove.sh -Size: 7662078 -Path: /GUIBuilder_0.3.6_windows.zip -SHA256: 63b2264b369f27d4c9d6e553587a67d921b151e87a3ed9cdde2917e6d658dcc0 - -Package:slp-ide -Version:1.16.245 -Maintainer:hoon Kang , taeyoung Son, sihyun Kim -Description:Samsung Liux Platform IDE -Category:IDE/SLP IDE/Workbench -Install-script:install.bat -Remove-script:remove.bat -Size: 112081040 -Path: /slp-ide_1.16.245_windows.zip -SHA256: 93512e98eab1fdbfdf57a86964b201d68a54a57816e131b94db56d5d4e394237 - -Package : arm-linux-gnueabi-gdb-7.2 -Version : 0.10.0 -Maintainer : ha taejun -Description : gnu debug tool 7.2 for SLP SDK -Depends : -Category : SDK/build-system/toolchains -Size: 10639372 -Path: /arm-linux-gnueabi-gdb-7.2_0.10.0_windows.zip -SHA256: f797baa924170c6dd66aa0cf52d56313e65749998c8ea61de22a79ce06482e64 - -Package : smart-build-interface -Version : 0.13.0 -Maintainer : taejun ha -Description : smart build interface for SLP SDK -Depends : -Category : SDK/build-system/base -Size: 1688171 -Path: /smart-build-interface_0.13.0_windows.zip -SHA256: 093808411cdd0cb8dccac4bbfc84ada7392c4630052df0b4b50f856ac014a539 - -Package: slp-emulator-image -Version: 1.1.91 -Maintainer: Yeong-Kyoon, Lee Dong-Kyun, Yun -Description: Samsung Linux Platform Emulator Image -Remove-script: remove.bat -Category: SDK/Emulator -Size: 221298348 -Path: /emulator-image_1.1.91_windows.zip -SHA256: f3a480a88ec2ce628d7530e11bfa6697d719fe521ad99874c4c2ad5f43b15387 - -Package : rootstrap-slp-emulator-1.0 -Version : 0.14.162 -Maintainer : hyoun jiil -Description : i386 rootstrap for SLP SDK -Depends : -Category : SDK/build-system/rootstraps -Size: 160261762 -Path: /rootstrap-slp-emulator-1.0_0.14.162_windows.zip -SHA256: 1acea77cc051ef3d7e1439396979a11ea3d614d054bf0e24e014b378788f28eb - -Package : arm-linux-gnueabi-gcc-4.5.3 -Version : 0.10.0 -Maintainer : ha taejun -Description : gnu compiler 4.5.3 for SLP SDK -Depends : -Category : SDK/build-system/toolchains -Size: 114253719 -Path: /arm-linux-gnueabi-gcc-4.5.3_0.10.0_windows.zip -SHA256: 0f48917ba380137de02415dcece5b816f6ed77f1fe8f8a6153591a7db7d871ce - -Package : slp-base-toolchain -Version : 0.16.2 -Maintainer : ha taejun -Description : base tool chain for SLP SDK -Depends : -Install-script:install.bat -Category : SDK/build-system/toolchains -Size: 289526856 -Path: /base-toolchain_0.16.2_windows.zip -SHA256: befcef30c59b6c046c7c8318652140474401b98e0e31a0b43c15723236d4b929 - -Package : NATIVE_IDE -Version : 0.16.71 -Maintainer : JongHwan Park -Depends : CodeCoverage, rootstrap-slp-device-1.0, arm-linux-gnueabi-gdb-7.2, Profiler, smart-build-interface, UnitTest, arm-linux-gnueabi-gcc-4.5.3, i386-linux-gnueabi-gcc-4.5.3, info, toolchain-gcc-4.5.3, EventInjector, rootstrap-slp-emulator-1.0, slp-base-toolchain, document, i386-linux-gnueabi-gdb-7.2, slp-ide, sdb, GUIBuilder, GUIBuilderPlugins, Efl -Description : Install NATIVE IDE. -Attribute : root -Category : / -Size: 633 -Path: /NATIVE_IDE_0.16.71_windows.zip -SHA256: 226a848d5865d40b1175aaee4445e33b0c24b779ae0d390d8cf27af984f61586 - -Package : i386-linux-gnueabi-gcc-4.5.3 -Version : 0.10.0 -Maintainer : ha taejun -Description : gnu compiler 4.5.3 for SLP SDK -Depends : -Category : SDK/build-system/toolchains -Size: 120422681 -Path: /i386-linux-gnueabi-gcc-4.5.3_0.10.0_windows.zip -SHA256: ba9601d18a228e83ae8df97adc1007176f65326cbe7dcc40fd4de11312270830 - -Package : Efl -Version : 0.3.35 -Maintainer : Changhun Lim -Description : Efl -Category : Efl -Depends : -Size: 46924949 -Path: /Efl_0.3.35_windows.zip -SHA256: 8e55b402087e192d32942fdab21c91c2e020dfb74f714821ff03b08981b6f739 - -Package : rootstrap-slp-device-1.0 -Version : 0.14.162 -Maintainer : hyoun jiil -Description : arm rootstrap for SLP SDK -Depends : -Category : SDK/build-system/rootstraps -Size: 209315907 -Path: /rootstrap-slp-device-1.0_0.14.162_windows.zip -SHA256: ff800d4b70153f110383e6842ea9b44fb9e9562e25878342701c549dcf7b077e - -Package:sdb -Version:0.1.35 -Maintainer:Hoon Kang , Joogwan Kim -Description:Smart Development Bridge for device management -Remove-script:remove.bat -Size: 146872 -Path: /sdb_0.1.35_windows.zip -SHA256: 1dffb8554c1a15682313dec96039bc1f3eb2177ed276ec1f15061583987217f4 - -Package : EMULATOR -Version : 0.16.71 -Maintainer : JongHwan Park -Depends : slp-emulator, slp-emulator-image -Description : Install EMULATOR. -Attribute : root -Category : / -Size: 476 -Path: /EMULATOR_0.16.71_windows.zip -SHA256: 598e026e437b75837a68f96d5b69d9bada060387ed96a7fc937a70fc5c972d64 - -Package: slp-emulator -Version: 1.1.221 -Maintainer: Yeong-Kyoon, Lee Dong-Kyun, Yun -Description: Samsung Linux Platform Emulator -Install-script: install.bat -Remove-script: remove.bat -Category: SDK/Emulator -Size: 27050568 -Path: /emulator_1.1.221_windows.zip -SHA256: b35a229ca04ab7b96b733939388dbe2f0a2b4ffc3f63cf4c20f890f7a88a5831 - -Package : info -Version : 1.0.224 -Maintainer : JongHwan Park -Description : information document for sdk-slp -Category : SDK -Size: 42649 -Path: /info_1.0.224_windows.zip -SHA256: f5c91a5a05f59b0dd03e1a3cfb3022b48ca4146295b09e8b43947b595ee69a32 - -Package:EventInjector -Version:1.1 -Architecture:i386 -Maintainer:juyung Kim , jaewon lim , sungmin Ha -Description:EventInjector for emulator -Install-script: -Remove-script: -Category:IDE/SLP IDE/Plugins/EventInjector -Depends: -Size: 223135 -Path: /eventinjector_1.1.254_windows.zip -SHA256: 991e094481ce3ef285c0e0a88c3ac0ae882ce778efb2191d9b7c722d39413d92 - -Package : WAC_IDE -Version : 0.16.71 -Maintainer : JongHwan Park -Depends : wac-ide, EventInjector_Wac, info, sdb -Description : Install WAC IDE. -Attribute : root -Category : / -Size: 487 -Path: /WAC_IDE_0.16.71_windows.zip -SHA256: 62f972aef511cf72145823ad8d44b86e7ec5c7490056159ba18e0e72e28b947b - -Package:EventInjector_Wac -Version:1.1 -Architecture:i386 -Maintainer:juyung Kim , jaewon lim , sungmin Ha -Description:EventInjector for emulator -Install-script: -Remove-script: -Category:IDE/WAC IDE/Plugins/EventInjector -Size: 223133 -Path: /eventinjector_wac_1.1.254_windows.zip -SHA256: 60ff7fa5da778f4997a361a500dc7488c883e7dc529dd559a91efd9674a97499 - -Package : wac-ide -Version : 1.16.221 -Maintainer : kangho kim jihoon song -Description : Samsung Linux Platform WAC IDE -Category : IDE/WAC IDE/Workbench -Install-script : install.bat -Remove-script : remove.bat -Size: 181060397 -Path: /wac-ide_0.16.221_windows.zip -SHA256: 3d4169b08a067bb0ffa582a2f96b05e3784249d6a3de4f0ba278952da33ffcec - -Package: document -Version: 1.2.147 -Architecture: i386 -Maintainer: Shingil Kang -Description: Samsung API Document. Provides API document for Samsung SDK developers. -Category: SDK/Documents -Size: 27098678 -Path: /document_1.2.147_windows.zip -SHA256: a2936d618bf6f92e4c68f566c7817920575bb416fec35db3f8f39ec3b1d58001 - -Package : i386-linux-gnueabi-gdb-7.2 -Version : 0.10.0 -Maintainer : ha taejun -Description : gnu debugger 7.2 for SLP SDK -Depends : -Category : SDK/build-system/toolchains -Size: 8984057 -Path: /i386-linux-gnueabi-gdb-7.2_0.10.0_windows.zip -SHA256: e6a836794e7697e5d4bf16591b3b08e1b6b434ac9100fd0303538224a63ab260 - -Package:UnitTest -Version:1.16.246 -Maintainer:jooyoung Kim , sanghyun Lee, gun Kim -Description:Unit test for SLP IDE -Category:IDE/SLP IDE/Plugins/UnitTest -Depends: -Size: 2085403 -Path: /UnitTest_1.16.246_windows.zip -SHA256: 8176c23c1885cfb1e464030f6bbb0bd8daaf2e1bbd805bd97b49ab05f8660592 - -Package: Profiler -Version: 1.0 -Architecture: i386 -Maintainer: Jaewon Lim , Juyoung Kim -Description: Samsung Linux Platform IDE -Category: IDE/SLP IDE/Plugins/Dynamic analysis -Size: 43006227 -Path: /profiler_1.0.247_windows.zip -SHA256: d35b8bf41bfe9f3a4662a9e4c184c64d033fc55de97a2108432c0fc94ed84008 - -Package:CodeCoverage -Version:1.0 -Maintainer:juyung Kim , jeonghwan Kim -Description:CodeCoverage -Category:IDE/SLP IDE/Plugins/CodeCoverage -Depends: -Size: 326181 -Path: /CodeCoverage_1.0.258_windows.zip -SHA256: 86e47fc38a1cae8011ab2872db0ac7f772354cb4307c00e28cdb46636ad27a07 - -Package:GUIBuilderPlugins -Version:0.3.294 -Maintainer: Changhun Lim , Hyunjun Son , Jaeyeol Lee , Yonghwan Jeon -Description: GUI Builder PlugIns -Category: IDE/SLP IDE/Plugins/GUIBuilderPlugins -Depends: slp-ide , GUIBuilder -Size: 71394 -Path: /GUIBuilderPlugins_0.3.294_windows.zip -SHA256: 39f4f687f3664a53885a7a07dfb467f1663154af437d93c09ee23e95ec1119e8 - -Package: meta1 -Version: 0.1 -Maintainer: cho -Description: meta1 -Depends: p1 -Conflict: -Size: 0 -Path: /meta1.zip -Attribute: root - -Package: p1 -Version: 0.1 -Maintainer: cho -Description: p1 -Depends: p2 -Conflict: -Size: 0 -Path: /p1.zip - -Package: p2 -Version: 0.1 -Maintainer: cho -Description: p2 -Depends: meta1 -Conflict: -Size: 0 -Path: /p2.zip - -Package: p3 -Version: 0.1 -Maintainer: cho -Description: p3 -Depends: nopackage -Conflict: -Size: 0 -Path: /p3.zip - diff --git a/unittest/src/com/samsung/installmanager/tests/installedpackage.list b/unittest/src/com/samsung/installmanager/tests/installedpackage.list deleted file mode 100644 index d0be0c7..0000000 --- a/unittest/src/com/samsung/installmanager/tests/installedpackage.list +++ /dev/null @@ -1,100 +0,0 @@ -Package: EventInjector_Wac -Version: 1.1 -Architecture: i386 -Maintainer: juyung Kim , jaewon lim , sungmin Ha -Description: EventInjector for emulator -Install-script: -Remove-script: -Category: IDE/WAC IDE/Plugins/EventInjector -Size: 206116 -Path: ./eventinjector_wac_1.1.245_windows.zip -SHA256: e50c8b54d46d119468b36850b98ae8e53c81a628668d6f5fbc59493a2704d2f8 -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - -Package: slp-emulator-image -Version: 1.1.86 -Maintainer: Yeong-Kyoon, Lee Dong-Kyun, Yun -Description: Samsung Linux Platform Emulator Image -Remove-script: remove.bat -Category: SDK/Emulator -Size: 221007566 -Path: ./emulator-image_1.1.86_windows.zip -SHA256: 68fcc94883592e1d3b8366ed703165c12ec76e560f2ebab8caba487d55667f53 -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - -Package: sdb -Version: 0.1.35 -Maintainer: Hoon Kang , Joogwan Kim -Description: Smart Development Bridge for device management -Remove-script: remove.bat -Size: 146872 -Path: /sdb_0.1.35_windows.zip -SHA256: 1dffb8554c1a15682313dec96039bc1f3eb2177ed276ec1f15061583987217f4 -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - -Package: EMULATOR -Version: 0.16.63 -Maintainer: JongHwan Park -Depends: slp-emulator, slp-emulator-image -Description: Install EMULATOR. -Attribute: root -Category: / -Size: 476 -Path: ./EMULATOR_0.16.63_windows.zip -SHA256: cb1914c7d2a0318327cce3f5a398eb289a2361d1def4827d5a1c83108f0f03fd -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - -Package: slp-emulator -Version: 1.1.213 -Maintainer: Yeong-Kyoon, Lee Dong-Kyun, Yun -Description: Samsung Linux Platform Emulator -Install-script: install.bat -Remove-script: remove.bat -Category: SDK/Emulator -Size: 24493356 -Path: ./emulator_1.1.213_windows.zip -SHA256: 793ac5e692faecc7e8749392fc93883078954c058a298171ad9da2909591c458 -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - -Package: info -Version: 1.0.224 -Maintainer: JongHwan Park -Description: information document for sdk-slp -Category: SDK -Size: 42649 -Path: /info_1.0.224_windows.zip -SHA256: f5c91a5a05f59b0dd03e1a3cfb3022b48ca4146295b09e8b43947b595ee69a32 -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - -Package: WAC_IDE -Version: 0.16.71 -Maintainer: JongHwan Park -Depends: wac-ide, EventInjector_Wac, info, sdb -Description: Install WAC IDE. -Attribute: root -Category: / -Size: 487 -Path: /WAC_IDE_0.16.71_windows.zip -SHA256: 62f972aef511cf72145823ad8d44b86e7ec5c7490056159ba18e0e72e28b947b -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - -Package: wac-ide -Version: 1.16.221 -Maintainer: kangho kim jihoon song -Description: Samsung Linux Platform WAC IDE -Category: IDE/WAC IDE/Workbench -Install-script: install.bat -Remove-script: remove.bat -Size: 181060397 -Path: /wac-ide_0.16.221_windows.zip -SHA256: 3d4169b08a067bb0ffa582a2f96b05e3784249d6a3de4f0ba278952da33ffcec -Status: INSTALLED_OK -Installed-directory: c:/samsung-sdk - diff --git a/unittest/src/org/tizen/installmanager/util/TestResourceHandler.java b/unittest/src/org/tizen/installmanager/util/TestResourceHandler.java deleted file mode 100644 index 1683527..0000000 --- a/unittest/src/org/tizen/installmanager/util/TestResourceHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.tizen.installmanager.util; - -import static org.junit.Assert.*; - -import java.io.*; - -import org.junit.Test; - -public class TestResourceHandler { - - /** - * Test for closeSilently method. - * - * @author Sungho Park - * @throws Exception - */ - @Test - public void testCloseObjectSilently() throws Exception { - - FileOutputStream fos = new FileOutputStream("testfile"); - FileInputStream fis = new FileInputStream("testfile"); - File file = new File("testfile"); - - file.deleteOnExit(); - - ResourceHandler.closeObjectSilently(fis); - ResourceHandler.closeObjectSilently(fos); - ResourceHandler.closeObjectSilently(file); - } - -} -- 2.7.4