skins/AknSkins/sdcsrc/SDCData.cpp
author William Roberts <williamr@symbian.org>
Tue, 23 Mar 2010 16:09:27 +0000
branchSymbian3_Theme
changeset 35 838be9535c06
parent 0 05e9090e2422
child 32 d9c996538b26
permissions -rw-r--r--
Start integration branch for Symbian^3 Theme The theme has been built using Carbide.ui on S60 5th Edition using the N97 plugin The source code in sf/mw/uiresources/skins/Symbian/srcdata was used to generate the installable SIS file which lives in the group directory, but the aim here is to build the theme for delivery in the ROM (preferrably as the default theme). Running "sbs -b bld.inf -c winscw" should build cleanly and deliver a matched set of files which then show up in the Settings | Themes | General list. Attempting to install it produces "Theme Corrupted".

/*
* Copyright (c) 2003-2008 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:  Data classs and structures.
*
*/


#include <string.h>
#include <sys/stat.h>

#include "SDCGlobals.h"
#include "SDCData.h"
#include "SDCException.h"
#include "SDCInput.h"

// Make std namespace available for compatibility
namespace std {}
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSDCData::CSDCData()
    {
    iNextOwnMinor = 0x1000;
    iAHOverridePid.iPID1 = 0;
    iAHOverridePid.iPID2 = 0;
    iParentPid.iPID1 = 0;
    iParentPid.iPID2 = 0;
    iPalettePid.iPID1 = 0;
    iPalettePid.iPID2 = 0;
    iProtection = 0;
    iAuthor[0] = 0;
    iCopyright[0] = 0;
    iTool[0] = 0;
    iBmpPath[0] = 0;
    iCurrentRestriction = 0;

    iNextIconIndex = 16384;
    }

CSDCData::~CSDCData()
    {
    while( iNameVector.size()>0 )
        {
        delete iNameVector.back();
        iNameVector.pop_back();
        }
    while( iMbmVector.size()>0 )
        {
        delete iMbmVector.back();
        iMbmVector.pop_back();
        }
    while( iBitmapDefVector.size()>0 )
        {
        delete iBitmapDefVector.back();
        iBitmapDefVector.pop_back();
        }
    while( iColorTableDefVector.size()>0 )
        {
        delete iColorTableDefVector.back();
        iColorTableDefVector.pop_back();
        }
    while( iFrameDefVector.size()>0 )
        {
        delete iFrameDefVector.back();
        iFrameDefVector.pop_back();
        }
    while( iAppIconDefVector.size()>0 )
        {
        delete iAppIconDefVector.back();
        iAppIconDefVector.pop_back();
        }
    while( iBmpAnimDefVector.size()>0 )
        {
        delete iBmpAnimDefVector.back();
        iBmpAnimDefVector.pop_back();
        }
    while( iTargetDeviceVector.size()>0 )
        {
        delete iTargetDeviceVector.back();
        iTargetDeviceVector.pop_back();
        }
    while( iStringDefVector.size()>0 )
        {
        delete iStringDefVector.back();
        iStringDefVector.pop_back();
        }
    while( iScalableItemDefVector.size()>0 )
        {
        delete iScalableItemDefVector.back();
        iScalableItemDefVector.pop_back();
        }
    while( iAnimationDefVector.size()>0 )
        {
        delete iAnimationDefVector.back();
        iAnimationDefVector.pop_back();
        }
    while( iLanguageVector.size()>0 )
        {
        iLanguageVector.pop_back();
        }
    }

//////////////////////////////////////////////////////////////////////
// Other methods
//////////////////////////////////////////////////////////////////////

bool CSDCData::IsScalable()
    {
    if( iSkinType == 0x80 ) return true;
    return false;
    }

bool CSDCData::IsDefined( const TSDCIID aIID )
    {
    int i;
    for( i=0; i<iBitmapDefVector.size(); i++ )
        {
        TSDCBitmapDef* entry = iBitmapDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    for( i=0; i<iColorTableDefVector.size(); i++ )
        {
        TSDCColorTableDef* entry = iColorTableDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    for( i=0; i<iFrameDefVector.size(); i++ )
        {
        TSDCFrameDef* entry = iFrameDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    for( i=0; i<iAppIconDefVector.size(); i++ )
        {
        TSDCAppIconDef* entry = iAppIconDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    for( i=0; i<iBmpAnimDefVector.size(); i++ )
        {
        TSDCBmpAnimDef* entry = iBmpAnimDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    for( i=0; i<iStringDefVector.size(); i++ )
        {
        TSDCStringDef* entry = iStringDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    for( i=0; i<iScalableItemDefVector.size(); i++ )
        {
        TSDCScalableItemDef* entry = iScalableItemDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    for( i=0; i<iAnimationDefVector.size(); i++ )
        {
        TSDCAnimationDef* entry = iAnimationDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return true;
        }
    return false;
    }

bool CSDCData::IsDefined( const TSDCIID aIID, const int aRestriction )
    {
    int i;
    for( i=0; i<iBitmapDefVector.size(); i++ )
        {
        TSDCBitmapDef* entry = iBitmapDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    for( i=0; i<iColorTableDefVector.size(); i++ )
        {
        TSDCColorTableDef* entry = iColorTableDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    for( i=0; i<iFrameDefVector.size(); i++ )
        {
        TSDCFrameDef* entry = iFrameDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    for( i=0; i<iAppIconDefVector.size(); i++ )
        {
        TSDCAppIconDef* entry = iAppIconDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    for( i=0; i<iBmpAnimDefVector.size(); i++ )
        {
        TSDCBmpAnimDef* entry = iBmpAnimDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    for( i=0; i<iStringDefVector.size(); i++ )
        {
        TSDCStringDef* entry = iStringDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    for( i=0; i<iScalableItemDefVector.size(); i++ )
        {
        TSDCScalableItemDef* entry = iScalableItemDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    for( i=0; i<iAnimationDefVector.size(); i++ )
        {
        TSDCAnimationDef* entry = iAnimationDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) && (entry->iRestriction==aRestriction) ) return true;
        }
    return false;
    }

void CSDCData::AppendNameEntry( const int aLanguageID, const wchar_t* aName )
    {
    for( int i=0; i<iNameVector.size(); i++ )
        {
        TSDCNameEntry* entry = iNameVector[i];
        if( entry->iLanguageID == aLanguageID ) throw CSDCException( ESDCContentError, "Name for the language ID has already been specified" );
        }

    TSDCNameEntry* entry = new TSDCNameEntry();
    entry->iLanguageID = aLanguageID;
    wcscpy( entry->iName, aName );
    iNameVector.push_back( entry );
    }

void CSDCData::AppendTargetDeviceEntry( const wchar_t* aDeviceName )
    {
    TSDCTargetDeviceEntry* entry = new TSDCTargetDeviceEntry();
    wcscpy( entry->iDeviceName, aDeviceName );
    iTargetDeviceVector.push_back( entry );
    }

bool CSDCData::HasMbmEntry( const TSDCColorDepth aColorDepth, const wchar_t* aFilename )
    {
    return FindMbmEntry(aColorDepth,aFilename)?true:false;
    }

TSDCMBMEntry* CSDCData::FindMbmEntry( const TSDCColorDepth aColorDepth, const wchar_t* aFilename )
    {
    for( int i=0; i<iMbmVector.size(); i++ )
        {
        TSDCMBMEntry* entry = iMbmVector[i];
        if( (_wcsicmp(entry->iSourcePath,iBmpPath)==0) &&
            (entry->iColorDepth==aColorDepth) &&
            (_wcsicmp(entry->iSourceFilename,aFilename)==0) ) return entry;
        }
    return NULL;
    }

TSDCMBMEntry* CSDCData::AppendMbmEntry( const bool aSvg,
    const TSDCColorDepth aColorDepth, const wchar_t* aFilename,
    const bool aSvgAnim )
    {
    TSDCMBMEntry* entry = FindMbmEntry( aColorDepth, aFilename );
    if( entry ) return entry;

    entry = new TSDCMBMEntry();
    
    //check file
   	if( !CheckFile( iBmpPath , aFilename ) )
		   	{
			  char filename[512];
			  CSDCInput::ConvertToAscii( filename, aFilename );
		    printf("NOTE: item %s not add beacuse file not exist!!\n",filename);
		    return entry;
		   	}

    entry->iIndex = iNextIconIndex;
    iNextIconIndex += 2;

    wcscpy( entry->iSourceFilename, aFilename );

    entry->iColorDepth = aColorDepth;
    wcscpy( entry->iSourcePath, iBmpPath );

    entry->iMaskColorDepth = ESDCColorDepthNone;
    wcscpy( entry->iMaskSourceFilename, L"" );

    entry->iSvgAnim = aSvgAnim;

    iMbmVector.push_back( entry );
    return entry;
    }

void CSDCData::SetBmpPath( const wchar_t* aPath )
    {
    if( !aPath )
        {
        wcscpy( iBmpPath, L"" );
        }
    else
        {
        wcscpy( iBmpPath, aPath );
        if( wcslen( iBmpPath ) &&
            wcscmp( iBmpPath+wcslen(iBmpPath)-1, L"\\" ) )
            {
            wcscat( iBmpPath, L"\\" );
            printf("NOTE: Trailing backslash appended to bitmap path\n");
            }
        }
    }

void CSDCData::CreateBitmapDef( const TSDCIID aIID, const int aIndex, const int aMaskIndex, const TSDCImageAttributes aAttributes, const bool aAppIcon, const int aRestriction )
   {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCBitmapDef* entry = new TSDCBitmapDef();
    entry->iIID = aIID;
    entry->iMBMIndex = aIndex;
    entry->iMaskMBMIndex = aMaskIndex;
    entry->iAttributes = aAttributes;
    entry->iAppIconBitmap = aAppIcon;
    entry->iRestriction = aRestriction;
    iBitmapDefVector.push_back( entry );
    }

TSDCBitmapDef* CSDCData::GetBitmapDef( const TSDCIID aIID )
    {
    for( int i=0; i<iBitmapDefVector.size(); i++ )
        {
        TSDCBitmapDef* entry = iBitmapDefVector[i];
        if( (entry->iIID.iMajor==aIID.iMajor) && (entry->iIID.iMinor==aIID.iMinor) ) return entry;
        }
    return NULL;
    }

void CSDCData::CreateColorTableDef( const TSDCIID aIID, const vector<TSDCColorTableEntry> aColors, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCColorTableDef* entry = new TSDCColorTableDef();
    entry->iIID = aIID;
    entry->iColors = aColors;
    entry->iRestriction = aRestriction;
    iColorTableDefVector.push_back( entry );
    }

void CSDCData::CreateFrameDef( const TSDCIID aIID, const vector<TSDCIID> aElements, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );
    if( aElements.size() != 9 ) throw CSDCException( ESDCContentError, "Frame must have 9 elements" );

    TSDCFrameDef* entry = new TSDCFrameDef();
    entry->iIID = aIID;
    entry->iElements = aElements;
    entry->iRestriction = aRestriction;
    iFrameDefVector.push_back( entry );
    }

void CSDCData::CreateAppIconDef( const TSDCIID aIID, const vector<TSDCIID> aIcons, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCAppIconDef* entry = new TSDCAppIconDef();
    entry->iIID = aIID;
    entry->iIcons = aIcons;
    entry->iRestriction = aRestriction;
    iAppIconDefVector.push_back( entry );
    }

void CSDCData::CreateBmpAnimDef( const TSDCIID aIID, const int aInterval, const int aPlayMode, const int aFlash, const vector<TSDCBmpAnimFrame> aFrames, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCBmpAnimDef* entry = new TSDCBmpAnimDef();
    entry->iIID = aIID;
    entry->iInterval = aInterval;
    entry->iPlayMode = aPlayMode;
    entry->iFlash = aFlash;
    entry->iFrames = aFrames;
    entry->iRestriction = aRestriction;
    iBmpAnimDefVector.push_back( entry );
    }

void CSDCData::CreateStringDef( const TSDCIID aIID, const wchar_t* aString, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCStringDef* entry = new TSDCStringDef();
    entry->iIID = aIID;
    entry->iRestriction = aRestriction;
    wcscpy( entry->iString, aString );
    iStringDefVector.push_back( entry );
    }

void CSDCData::CreateScalableItemDef( const TSDCIID aIID, const int aInput, const int aOutput, const vector<TSDCEffectCommand> aCommands, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCScalableItemDef* entry = new TSDCScalableItemDef();
    entry->iIID = aIID;
    entry->iRefIID.iMajor = 0;
    entry->iRefIID.iMinor = 0;
    entry->iInput = aInput;
    entry->iOutput = aOutput;
    entry->iCommands = aCommands;
    entry->iRestriction = aRestriction;
    iScalableItemDefVector.push_back( entry );
    }

void CSDCData::CreateScalableItemRefDef( const TSDCIID aIID, const TSDCIID aRefIID, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCScalableItemDef* entry = new TSDCScalableItemDef();
    entry->iIID = aIID;
    entry->iRefIID = aRefIID;
    entry->iInput = 0;
    entry->iOutput = 0;
    entry->iRestriction = aRestriction;
    iScalableItemDefVector.push_back( entry );
    }

void CSDCData::CreateAnimationDef( const TSDCIID aIID, const int aInput, const int aOutput, const int aMinInterval,
    const vector<TSDCEffectCommand> aPreprocessCommands, const vector<TSDCEffectCommand> aAnimCommands,
    const vector<TSDCAnimParamGroup> aValues, const vector<TSDCAnimParamGroup> aTimingModels,
    const vector<TSDCAnimParamGroup> aSizeBoundParams, const bool aMorphing, const int aRestriction )
    {
    if( IsDefined( aIID, aRestriction ) ) throw CSDCException( ESDCContentError, "Item already defined" );

    TSDCAnimationDef* entry = new TSDCAnimationDef();
    entry->iIID = aIID;
    entry->iInput = aInput;
    entry->iOutput = aOutput;
    entry->iMinInterval = aMinInterval;
    entry->iMorphing = aMorphing;
    entry->iPreprocessCommands = aPreprocessCommands;
    entry->iAnimCommands = aAnimCommands;
    entry->iValues = aValues;
    entry->iTimingModels = aTimingModels;
    entry->iSizeBoundParams = aSizeBoundParams;
    entry->iRestriction = aRestriction;
    iAnimationDefVector.push_back( entry );
    }
    
    
bool CSDCData::CheckFile( const wchar_t* aPath , const wchar_t* aFileName )
		{
		char asciiPatch[512];
		CSDCInput::ConvertToAscii( asciiPatch, aPath );
		char asciiFileName[512];
		CSDCInput::ConvertToAscii( asciiFileName, aFileName );
		
		strcat(asciiPatch,asciiFileName);

    struct _stat buf;
    int result = _stat( asciiPatch, &buf );
    if(result == -1)
		    {
		    return false;
		    }
    return true;
    
		}

// End of file