diff -r 000000000000 -r f453ebb75370 gfxconversion/mifconv/src/mifconv_bitmapconverter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfxconversion/mifconv/src/mifconv_bitmapconverter.cpp Tue Feb 02 01:11:11 2010 +0200 @@ -0,0 +1,277 @@ +/* +* Copyright (c) 2009 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: Mifconv bitmap converters class. +* +*/ + + +#include "mifconv.h" +#include "mifconv_bitmapconverter.h" +#include "mifconv_util.h" +#include "mifconv_exception.h" +#include "mifconv_argumentmanager.h" +#include + +const MifConvString BMCONV_DEFAULT_PATH(EPOC_TOOLS_PATH); + +/** + * + */ +MifConvBitmapConverter::MifConvBitmapConverter() +{ + MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance(); + // Output file: + iTargetFilename = MifConvUtil::FilenameWithoutExtension(argMgr->TargetFile()) + "." + MifConvString(MBM_FILE_EXTENSION); +} + +/** + * + */ +MifConvBitmapConverter::~MifConvBitmapConverter() +{ +} + +/** + * + */ +void MifConvBitmapConverter::Init() +{ + CleanupTargetFiles(); +} + +/** + * + */ +void MifConvBitmapConverter::CleanupTargetFiles() +{ + if( MifConvUtil::FileExists(iTargetFilename) ) + { + // Try to remove file MIFCONV_MAX_REMOVE_TRIES times, no exception in case of failure: + MifConvUtil::RemoveFile(iTargetFilename, MIFCONV_MAX_REMOVE_TRIES, true); + } +} + +/** + * + */ +void MifConvBitmapConverter::AppendFile( const MifConvSourceFile& sourcefile ) +{ + if( MifConvUtil::FileExtension( sourcefile.Filename() ) == BMP_FILE_EXTENSION ) + { + iSourceFiles.push_back( sourcefile ); + } +} + +/** + * + */ +void MifConvBitmapConverter::Convert() +{ + if( iSourceFiles.size() > 0 ) + { + ConvertToMbm(); + } +} + +/** + * + */ +void MifConvBitmapConverter::Cleanup(bool err) +{ + CleanupTempFiles(); + if( err ) + { + CleanupTargetFiles(); + } +} + +/** + * + */ +void MifConvBitmapConverter::ConvertToMbm() +{ + RunBmconv(); +} + +/** + * + */ +void MifConvBitmapConverter::InitTempFile() +{ + MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance(); + // Construct temp file name + iTempDir = MifConvUtil::DefaultTempDirectory(); + const MifConvString& tempDirArg = argMgr->StringValue(MifConvTempPathArg); + if( tempDirArg.length() > 0 ) + { + iTempDir = tempDirArg; + } + + if( iTempDir.length() > 0 && iTempDir.at(iTempDir.length()-1) != DIR_SEPARATOR2 ) + { + iTempDir.append(DIR_SEPARATOR); + } + + // Generate new temp-filename: + iTempDir.append(MifConvUtil::TemporaryFilename()); + + // append tmp at as postfix + // this is needed because the generated name can contain a single period '.' + // character as the last character which is eaten away when the directory created. + iTempDir.append(MifConvString("tmp")); + + MifConvUtil::EnsurePathExists(iTempDir); + + iTempDir.append(DIR_SEPARATOR); + + iTempFilename = iTempDir + MifConvUtil::FilenameWithoutExtension(MifConvUtil::FilenameWithoutPath(argMgr->TargetFile())); + iTempFilename += BMCONV_TEMP_FILE_POSTFIX; + + // Create temp file + fstream tempFile(iTempFilename.c_str(), ios::out|ios::binary|ios::trunc); + if (!tempFile.is_open()) + { + throw MifConvException(MifConvString("Unable to create tmp file! ") + iTempFilename); + } + + try { + // quiet mode + tempFile << BMCONV_OPTION_PREFIX << BMCONV_QUIET_PARAMETER << " "; + // Palette argument + const MifConvString& paletteArg = argMgr->StringValue(MifConvPaletteFileArg); + if( paletteArg.length() > 0 ) + { + tempFile << BMCONV_OPTION_PREFIX << BMCONV_PALETTE_PARAMETER; + tempFile << MifConvString(paletteArg + " "); + } + + tempFile << iTargetFilename << " "; + // Add filenames to the temp file + for( MifConvSourceFileList::iterator i = iSourceFiles.begin(); i != iSourceFiles.end(); ++i ) + { + AppendBmpToTempFile(tempFile, *i); + } + } + catch(...) { + tempFile.close(); + throw; + } + + tempFile.close(); +} + +/** + * + */ +void MifConvBitmapConverter::RunBmconv() +{ + MifConvArgumentManager* argMgr = MifConvArgumentManager::Instance(); + // Create and initialize the temp file: + InitTempFile(); + + // Build bmconv command + MifConvString bmconvCommand("\""); // Open " mark + + const MifConvString& bmconvPath = argMgr->StringValue(MifConvBmconvPathArg); + const MifConvString& defaultBmconvPath = GetDefaultBmConvPath(); + if( bmconvPath.length() > 0 ) + { + bmconvCommand += bmconvPath; // If the path is given, use it. + } + else + { + bmconvCommand += defaultBmconvPath; // Use default path + } + + // Ensure that the last char of the path is dir-separator: + if( bmconvCommand.length() > 1 && bmconvCommand.at(bmconvCommand.length()-1) != DIR_SEPARATOR2 ) + bmconvCommand += DIR_SEPARATOR; + + // Then add bmconv executable call and close the " mark + bmconvCommand += BMCONV_EXECUTABLE_NAME + MifConvString("\" "); + bmconvCommand += "\"" + iTempFilename + "\""; + + MifConvUtil::EnsurePathExists(iTargetFilename, true); + + cout << "Writing mbm: " << iTargetFilename << endl; + int err = 0; + +#ifdef __linux__ + if ((err = system (MifConvString(bmconvCommand).c_str())) != 0) // Returns 0 if success +#else + if ((err = system (MifConvString("\""+bmconvCommand+"\"").c_str())) != 0) // Returns 0 if success +#endif + { + THROW_ERROR_COMMON("Executing BMCONV failed", MifConvString(__FILE__), __LINE__); + } +} + +/** + * + */ +void MifConvBitmapConverter::CleanupTempFiles() +{ + if( iTempFilename.length() > 0 && remove( iTempFilename.c_str() ) != 0 ) + { + perror( "Error deleting temporary file (bitmap conversion)" ); + } + + if( iTempDir.length() > 0 && MifConvUtil::RemoveDirectory( iTempDir ) != 0 ) + { + perror( "Error deleting temporary directory (bitmap conversion)" ); + } +} + +/** + * + */ +const MifConvString& MifConvBitmapConverter::GetDefaultBmConvPath() +{ + if( iDefaultBmConvPath.length() == 0 ) + { + // Check if the EPOCROOT is given + MifConvString epocRoot(MifConvArgumentManager::Instance()->EpocRoot()); + if( epocRoot.length() > 0 ) + { + // EPOCROOT environment variable defined. + iDefaultBmConvPath = epocRoot + BMCONV_DEFAULT_PATH; + } + } + + return iDefaultBmConvPath; +} + +/** + * + */ +void MifConvBitmapConverter::AppendBmpToTempFile(fstream& aStream, const MifConvSourceFile& bmpFile) + { + cout << "Loading file: " << bmpFile.Filename() << endl; + + aStream << BMCONV_OPTION_PREFIX; + aStream << bmpFile.DepthString(); + aStream << bmpFile.Filename(); + aStream << " "; + + // Prepare also for the case that mask is not used at all. + const MifConvString& maskName = bmpFile.BmpMaskFilename(); + if (maskName.length() > 0 ) + { + cout << "Loading file: " << maskName << endl; + aStream << BMCONV_OPTION_PREFIX; + aStream << bmpFile.MaskDepthString(); + aStream << maskName; + } + aStream << " "; + }