diff -r b4183b61e0c7 -r 58764cb313d3 themeinstaller/source/src/com/nokia/tools/themeinstaller/installationmanager/ResourceInstaller.java --- a/themeinstaller/source/src/com/nokia/tools/themeinstaller/installationmanager/ResourceInstaller.java Tue Jan 26 13:19:36 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,329 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Class for installing theme resources - * -*/ - - -package com.nokia.tools.themeinstaller.installationmanager; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Observable; -import java.util.Observer; -import java.util.Vector; - -import com.nokia.tools.themeinstaller.defrep.IDefinitionRepository; -import com.nokia.tools.themeinstaller.defrep.operations.FileOperationEvent; -import com.nokia.tools.themeinstaller.defrep.operations.FileOperationUtils; -import com.nokia.tools.themeinstaller.mediaconverter.MediaConverter; -import com.nokia.tools.themeinstaller.odtconverter.MimeTypeResolver; -import com.nokia.tools.themeinstaller.odtconverter.ODTHeader; -import com.nokia.tools.themeinstaller.odtconverter.ODTResource; -import com.nokia.tools.themeinstaller.odtconverter.ThemeStatusResolver; - -/** - * Class for installing theme resources. - */ -public class ResourceInstaller implements IResourceInstaller - { - - // CONSTANTS - private static final String MBM_SUFFIX = "mbm"; - private static final char FILE_EXT_SEPARATOR = '.'; - - // Definition repository for accessing the file storage services - private IDefinitionRepository iDefRep; - - // File operation event for observing file operations - private FileOperationEvent iEvent; - - // Destination root directory - private File iDestinationDir; - - // Data directory - private String iDataDir; - - // Media converter for converting resources - private MediaConverter iMediaConverter; - - // Mime type resolver for resolving resource type - private MimeTypeResolver iMimeResolver; - - // Observer for monitoring file operation completions - private Observer iFileCopyObserver; - - // For storing temporary files. - private Vector iTempFiles; - - // Lock for asynchronous operations. - private Lock iLock; - - /** - * Constructor. - * @param aDefRep Definition Repository for accessing the file storage - * @param aDestinationDir Destination root directory - * @param aDataDir Data directory containing the theme sources - * @param aNameSpace Theme name space - * @throws IOException if Media Converter can not be created - */ - public ResourceInstaller( IDefinitionRepository aDefRep, - File aDestinationDir, - String aDataDir ) throws IOException - { - iDefRep = aDefRep; - iDestinationDir = aDestinationDir; - iDataDir = aDataDir; - iMediaConverter = new MediaConverter(); - iMimeResolver = new MimeTypeResolver(); - iTempFiles = new Vector(); - iLock = new Lock(); - - // Create an observer for monitoring file copy operation completions - iFileCopyObserver = new Observer() - { - public void update( Observable aFileOperation, Object aEvent ) - { - // Store the event - iEvent = ( FileOperationEvent ) aEvent; - // Open the lock - iLock.unLock(); - } - }; - } - - /* (non-Javadoc) - * @see com.nokia.tools.odtconverter.installationmanager.IResourceInstaller#installResources(java.util.Vector, com.nokia.tools.odtconverter.ODTHeader) - */ - public Vector installResources( - Vector aResources, - ODTHeader aHeader ) throws IOException - { - Vector result = new Vector(); - Enumeration resources = aResources.elements(); - - // Process all resource files - while ( resources.hasMoreElements() ) - { - result.add( installResource( ( ThemeResource ) resources.nextElement(), aHeader ) ); - } - - return result; - } - - /* (non-Javadoc) - * @see com.nokia.tools.odtconverter.installationmanager.IResourceInstaller#installResource(com.nokia.tools.odtconverter.installationmanager.ThemeResource, com.nokia.tools.odtconverter.ODTHeader) - */ - public ODTResource installResource( ThemeResource aResource, - ODTHeader aHeader ) throws IOException - { - // Create the ODT resource - ODTResource res = createResource( iDataDir, aResource ); - - // Copy file to correct location - File f = new File( - iDataDir + ( String )res.get( ODTResource.TempFileName ) ); - iDefRep.copyResource( - f, - iDestinationDir, - aHeader, - iFileCopyObserver ); - // Wait for file copying - iLock.lock(); - - if ( iEvent.getErrorCode() == FileOperationEvent.OPERATION_SUCCESSFUL ) - { - deleteTemporaryFile( iEvent.getFile().getName() ); - } - else - { - throw new IOException( "Resource file copying failed: " - + f.getPath() ); - } - - // Set the actual resource location (in Symbian file system) to resource - res.put( ODTResource.FileName, iEvent.getDestPath() ); - return res; - } - - /** - * Delete temporary file. - * - * @param aFileName The file name - * - * @throws IOException Signals that an I/O exception has occurred. - */ - private void deleteTemporaryFile( String aFileName ) throws IOException - { - Enumeration fileObjects = iTempFiles.elements(); - - while ( fileObjects.hasMoreElements() ) - { - File temp = ( File ) fileObjects.nextElement(); - if ( temp.getName().equals( aFileName ) ) - { - if ( !temp.delete() ) - { - throw new IOException( "Temporary file deletion failed: " - + aFileName ); - } - else - { - iTempFiles.remove( temp ); - deleteTemporaryFile( aFileName ); - } - } - } - } - - - /* (non-Javadoc) - * @see com.nokia.tools.odtconverter.installationmanager.IResourceInstaller#createODTResource(com.nokia.tools.odtconverter.ODTHeader) - */ - public ODTResource createODTResource( ODTHeader aHeader, String aNameSpace ) - { - ODTResource res = new ODTResource(); - String odtPath = null; - - // Create ODT file path - odtPath = iDefRep.createODTPath( iDestinationDir, aHeader ); - - // Convert the path to Symbian OS file system format - odtPath = FileOperationUtils.parseSymbianFSPath( odtPath ); - - res.put( ODTResource.FileName, odtPath ); - res.put( ODTResource.CacheType, - new Integer( ManifestFactory.CACHE_TYPE_CACHE_FILE ) ); - - // If EXnThemeStatusLicenceeDefault flag is set, - // locking policy is E_XN_LOCKED - int flags = ( ( Integer )aHeader.get( ODTHeader.Flags ) ).intValue(); - if ( ( flags & ThemeStatusResolver.E_XN_THEME_STATUS_LICENCEE_DEFAULT ) != 0 ) - { - res.put( ODTResource.LockingPolicy, - new Integer( ManifestFactory.E_XN_LOCKED ) ); - } - else - { - res.put( ODTResource.LockingPolicy, - new Integer( ManifestFactory.E_XN_UNLOCKED ) ); - } - - // ODT file's mime type is "unknown" - res.put( ODTResource.MimeType, MimeTypeResolver.UNKNOWN_MIME_TYPE ); - res.put( ODTResource.NameSpace, aNameSpace ); - res.put( ODTResource.ResourceID, aHeader - .get( ODTHeader.ThemeShortName ) ); - res.put( ODTResource.ResourceType, new Integer( - MimeTypeResolver.E_RESOURCEODT ) ); - return res; - } - - - /** - * Creates ODT resource from given node - * @param aItem DOM Node to be added - * @param aDataDirectory Resource directory - * @return new ODTResource object - * @throws IOException if media file can not be converter - */ - private ODTResource createResource( String aDataDirectory, - ThemeResource aItem ) throws IOException - { - ODTResource res = new ODTResource(); - - String tempFileName = null; - String filename = aItem.getFileName(); - int cacheType = aItem.getCacheType(); - - // Determine the need for media conversion - if( cacheType == ManifestFactory.CACHE_TYPE_CACHE_FILE || - cacheType == ManifestFactory.CACHE_TYPE_CACHE_MEMORY ) - { - // Convert the media file - tempFileName = convertMedia( aDataDirectory + filename ); - } - else - { - // No media conversion - tempFileName = filename; - } - - // Remove directories and separators from the file name - int fileNameIndex = tempFileName.lastIndexOf( File.separatorChar ); - if( fileNameIndex > -1 ) - { - tempFileName = tempFileName.substring( fileNameIndex + 1 ); - } - - // Update resource type after media conversion - aItem.setResourceType( iMimeResolver.getResourceType( tempFileName ) ); - aItem.setMimeType( iMimeResolver.getMimeType( tempFileName ) ); - - // Set temporary file name that is not externalized. It is required - // only for copying the resource file in a case that media conversion - // has changed the file name and extension. - res.put( ODTResource.TempFileName, tempFileName ); - - // Set properties that are externalized. The file name is set after the - // resource file is copied to the correct location. - res.put( ODTResource.CacheType, new Integer(cacheType )); - res.put( ODTResource.ResourceID, filename ); - res.put( ODTResource.LockingPolicy, new Integer(aItem.getLockingPolicy() )); - res.put( ODTResource.NameSpace, aItem.getNameSpace() ); - res.put( ODTResource.MimeType, aItem.getMimeType() ); - res.put( ODTResource.ResourceType, new Integer(aItem.getResourceType() )); - return res; - } - - /** - * Uses MediaConverter to converts media to MBM - * @param aFilename File to convert - * @return Filename of converted resource - * @throws IOException File conversion fails - */ - private String convertMedia( String aFilename ) throws IOException - { - ArrayList files = new ArrayList(); - files.add( aFilename ); - int dotPosition = aFilename.lastIndexOf( FILE_EXT_SEPARATOR ) + 1; - String destinationImage = - aFilename.substring( 0, dotPosition ) + MBM_SUFFIX; - - if ( dotPosition == 0 ) - { - destinationImage = aFilename + FILE_EXT_SEPARATOR + MBM_SUFFIX; - } - - String filePrefix = destinationImage.substring( 0, - destinationImage.lastIndexOf( FILE_EXT_SEPARATOR ) ); - File destFile = new File( destinationImage ); - int index = 1; - - // create unique name to not overwrite any existing files - while( destFile.exists() ) - { - destinationImage = - filePrefix + index++ + FILE_EXT_SEPARATOR + MBM_SUFFIX; - destFile = new File( destinationImage ); - } - - iMediaConverter.convertMedia( files, destinationImage ); - iTempFiles.add( destFile ); - return destinationImage; - } - - }