--- a/idlefw/plugins/shortcutplugin/src/taiscutparser.cpp Mon Mar 08 21:43:47 2010 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,816 +0,0 @@
-/*
-* Copyright (c) 2005-2006 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: Shortcut definition parser
-*
-*/
-
-
-#include "taiscutparser.h"
-#include "aiscutdefs.h"
-
-#include "debug.h"
-
-
-// ======== LOCAL FUNCTIONS ========
-/**
- * Extract a value with the given name from a URI query string.
- * For example a query string of ?view=1234&iconid=3;5&foo=bar
- * and we wanted iconid from that string. Function places the 3;5
- * into aValue and if needed deletes the "iconid=3;5&" string from the
- * query string.
- *
- * @param aQueryString The querystring
- * @param aParameterName The name of the parameter to find
- * @param aValue Where to place the value
- * @param aRemoveNameAndValue ETrue to remove the name=value from the querystring
- * @return KErrNone on succesful extraction. KErrNotFound if the parameter was not found
-*/
-TInt ExtractValueFromQueryString( TDes &aQueryString, const TDesC &aParameterName,
- TDes &aValue, TBool aRemoveNameAndValue )
- {
- TInt err = KErrNone;
- HBufC *tempBuffer = aQueryString.Alloc();
- if ( !tempBuffer )
- {
- return KErrNoMemory;
- }
-
- TPtr temp = tempBuffer->Des();
-
- TInt foundStartPos = 0;
- TInt foundStopPos = 0;
- foundStartPos = aQueryString.FindC(aParameterName);
- if ( foundStartPos != KErrNotFound )
- {
- // remove the beginning of the string from temp, so no additional &-marks are found
- // at the start of string
- temp.Delete(0,foundStartPos);
-
- foundStopPos = temp.Locate(KParamNextSeparator);
- // stop either at the eos or at the next & mark
- foundStopPos = (foundStopPos != KErrNotFound ) ? (foundStopPos): (temp.Length() );
- // start after the = separator and stop either on eos or at & mark
- TInt from = (aParameterName.Length() + 1);
- TInt length = foundStopPos - from;
-
- // Get just the value part
- if ( aValue.MaxLength() >= length )
- {
- aValue = temp.Mid( from, length );
- }
- else // Can't place the value to aValue string
- {
- err = KErrNoMemory;
- }
-
- if ( err == KErrNone && aRemoveNameAndValue )
- {
- // Delete the aParameterName=aValue string from the querystring
- // If eos reached then we need to delete the & before us also
- // Don't try to delete if this is an only parameter
- if ( foundStopPos == temp.Length() && foundStartPos > 0 )
- {
- aQueryString.Delete(foundStartPos - 1, (foundStopPos + 1));
- }
- else
- {
- aQueryString.Delete(foundStartPos, (foundStopPos + 1));
- }
- }
- }
- else
- {
- err = KErrNotFound;
- }
-
- delete tempBuffer;
- return err;
- }
-
-/**
- * Tests if string ends with given pattern
- *
- * @param aString input string
- * @param aPattern test pattern
- * @return ETrue if string ends with given pattern.
- */
-TBool EndsWith( const TDesC& aString, const TDesC& aPattern )
- {
- TBuf<10> temp(aString.Right(aPattern.Length()));
- return ( aString.Right( aPattern.Length() ) == aPattern );
- }
-
-/**
- * Resolves skin item id from pattern majorId;minorId;colourGroupId.
- * The colourGroupId in the syntax is optional, and if no value found then
- * aColourValue will be -1
- *
- * @param aPath skin item id string
- * @param aItemId skin item id to fill
- * @param aColourValue colour value to fill.
- *
- * @return ETrue if id was succesfully parsed.
- */
-TBool ResolveSkinItemId( const TDesC& aPath, TAknsItemID& aItemId, TInt& aColourValue )
- {
- // Syntax: major;minor;colourgroup
- aColourValue = -1;
-
- // Initialize lexer
- TLex lex( aPath );
- lex.SkipSpace();
-
- TInt majorId( 0 );
- TInt minorId( 0 );
-
- // Resolve major id
- TInt error = lex.Val( majorId );
-
- // Resolve minor id
- if ( lex.Eos())
- return KErrNotFound;
-
- lex.Inc();
- error |= lex.Val( minorId );
-
- // initilize skin item id object
- aItemId.Set( majorId, minorId );
-
- if ( lex.Eos())
- return KErrNotFound;
- lex.Inc();
-
- TInt colorError = lex.Val( aColourValue );
- if ( colorError != KErrNone || aColourValue < 0)
- {
- aColourValue = -1;
- }
-
- // Check error
- return ( error == KErrNone );
-
- }
-
-/**
-* Resolves filename and id from syntax
-* filename.ext;id. If the syntax is incorrect
-* aId is -1 and filename zeroed and EFalse is returned
-* MIF and MBM supported.
-*
-* @param aPath The path to extract the data from
-* @param aId Id to fill
-* @param aFilename Filename to fill
-* @return ETrue if id and path was succesfully parsed.
-*/
-TBool ResolveFileIdAndPath( const TDesC& aPath, TInt& aId, TDes& aFilename )
-{
- // Syntax: filename.ext;index
- // Supported: MIF, MBM
- TInt pos = aPath.FindF( KScutSkinItemSeparator );
- aFilename.Zero();
- if( pos != KErrNotFound )
- {
- aFilename = (aPath.Left(pos));
-
- if ( ( !EndsWith(aFilename, KScutMIFExtension ) ) &&
- ( !EndsWith(aFilename, KScutMBMExtension ) ) )
- {
- aFilename.Zero();
- return EFalse;
- }
-
- TLex lex(aPath.Mid(pos+1));
- TInt error = lex.Val(aId);
- if ( error != KErrNone )
- {
- aId = -1;
- return EFalse;
- }
- return ETrue;
- }
- return EFalse;
-}
-
-TInt CreateChecksumFromString( const TDesC& aString )
- {
- TInt checksum = 0;
-
- for ( TInt i = 0; i < aString.Length(); i++ )
- {
- checksum += aString[i] * ( i + 1);
- }
- return checksum;
- }
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-//
-// ---------------------------------------------------------------------------
-//
-TAiScutParser::TAiScutParser() : iType(EScutUnknown), iUid(KNullUid)
-{
-}
-
-
-// -----------------------------------------------------------------------------
-// Static utility function to parse an uid from the given descriptor.
-// -----------------------------------------------------------------------------
-//
-TUid TAiScutParser::ParseUid(const TDesC& aDesC)
-{
- TRadix radix(EDecimal);
-
- // Check if the number is in hexadecimal format.
- _LIT(KHexPrefix, "0x");
- const TInt prefixLen = 2;
- TPtrC ptr(aDesC);
-
- if (ptr.Left(prefixLen).CompareC(KHexPrefix) == 0)
- {
- // Strip the '0x' prefix.
- ptr.Set(ptr.Right(ptr.Length() - prefixLen));
-
- radix = EHex;
- }
-
- // Do the actual parsing.
- TUint uint;
- TUid uid(KNullUid);
- TLex lexer(ptr);
- TInt err = lexer.Val(uint, radix);
- if (err == KErrNone)
- {
- uid.iUid = uint;
- }
-
- return uid;
-}
-
-
-// ---------------------------------------------------------------------------
-// Parses a shortcut definition.
-// ---------------------------------------------------------------------------
-//
-TInt TAiScutParser::Parse(const TDesC& aDefinition)
-{
- iType = EScutUnknown;
- iDefinition.Set(aDefinition);
-
- // Default values for the icon
- iIcon.iIconId = KErrNotFound;
- iIcon.iPath.Zero();
- iIcon.iSkinId.iMajor = -1;
- iIcon.iSkinId.iMinor = -1;
- iIcon.iColourGroup = -1;
-
- iIcon.iType = EScutIconNone;
- iIcon.iDestination = EScutDestinationNormal;
- iIcon.iShortcutType = EScutUnknown;
- iIcon.iAppUid = TUid::Uid(0);
- iIcon.iViewId = TUid::Uid(0);
-
- TInt err = iUriParser.Parse(aDefinition);
- if (err != KErrNone)
- {
- return err;
- }
-
- TPtrC scheme(iUriParser.Extract(EUriScheme));
-
- if (scheme.Length() == 0 ||
- scheme.Compare(KScutURISchemeHttp) == 0 ||
- scheme.Compare(KScutURISchemeHttps) == 0)
- {
- ParseParams();
- iType = EScutWebAddress;
-
- if ( iIcon.iType != EScutIconNone )
- {
- // create a checksum for unique identifying
- TInt checksum = CreateChecksumFromString( aDefinition );
- iIcon.iViewId = TUid::Uid( checksum );
- iIcon.iShortcutType = iType;
- iIcon.iAppUid = KScutBrowserUid;
- }
- err = KErrNone;
- }
- else if (scheme.Compare(KScutURISchemeLocalApp) == 0)
- {
- iType = EScutApplication;
-
- if (!ParseAlias())
- {
- iUid = ParseUid(iUriParser.Extract(EUriPath));
- }
-
- if (iUid == KScutAppShellUid)
- {
- // appshell shortcut is always of type app view.
- iType = EScutApplicationView;
- }
-
- // ParseParams() parses params from an URL. If it encounters
- // iconid, iconmifpath or cba parameter from the URL, then it
- // places the values to iIcon and removes the parameters from
- // the URL. It also extract the additional viewid if needed.
- // For example bookmarks and apps with views use them.
-
- ParseParams();
- // Icon found so apply the appuid and type to icon.
- if ( iIcon.iType != EScutIconNone )
- {
- iIcon.iShortcutType = iType;
-
- // If we are dealing with messaging icons then the
- // appuid needs to be changed in order to match it against
- // the shortcuts appuid
- switch( iType )
- {
- case EScutNewMessage:
- iIcon.iAppUid.iUid = KScutUnifiedEditorUidValue;
- break;
-
- case EScutNewEmail:
- iIcon.iAppUid.iUid = KScutEmailEditorUidValue;
- break;
-
- #ifdef __SYNCML_DS_EMAIL
- case EScutNewSyncMLMail:
- iIcon.iAppUid.iUid = KScutEmailEditorUidValue;
- iIcon.iViewId.iUid = KScutSyncMlEmailUidValue;
- break;
- #endif
-
- case EScutNewPostcard:
- iIcon.iAppUid.iUid = KScutPostcardEditorUidValue;
- break;
-
- case EScutNewAudioMsg:
- iIcon.iAppUid.iUid = KScutAmsEditorUidValue;
- break;
-
- case EScutNewMsgType:
- iIcon.iAppUid.iUid = KScutMessagingCenterUidValue;
- iIcon.iViewId.iUid = KScutMessagingCenterUidValue;
- break;
-
- default:
- iIcon.iAppUid = iUid;
- break;
-
- }
-
- }
- err = KErrNone;
- }
- else
- {
- err = KErrCorrupt;
- }
-
- __PRINTS( "XAI: TAiScutParser::Parse");
- __PRINT( __DBG_FORMAT( "XAI: type = %d, definition = '%S', err = %d"), iType, &aDefinition, err);
- return err;
-}
-
-
-// ---------------------------------------------------------------------------
-// Checks if the shortcut definition was valid.
-// ---------------------------------------------------------------------------
-//
-TBool TAiScutParser::IsValid() const
-{
- return iType != EScutUnknown;
-}
-
-
-// -----------------------------------------------------------------------------
-// Returns the shortcut target type.
-// -----------------------------------------------------------------------------
-//
-TShortcutType TAiScutParser::Type() const
-{
- return iType;
-}
-
-
-// -----------------------------------------------------------------------------
-// Returns the shortcut target uid. Used for application shortcuts.
-// -----------------------------------------------------------------------------
-//
-TUid TAiScutParser::Uid() const
-{
- return iUid;
-}
-
-
-TAiScutIcon TAiScutParser::Icon() const
- {
- return iIcon;
- }
-// -----------------------------------------------------------------------------
-// Returns a shortcut definition component value.
-// -----------------------------------------------------------------------------
-//
-TPtrC TAiScutParser::Get(TScutDefComponent aComponent) const
-{
- TPtrC componentValue;
-
- switch (aComponent)
- {
- case EScutDefScheme:
- componentValue.Set(iUriParser.Extract(EUriScheme));
- break;
-
- case EScutDefTarget:
- componentValue.Set(iUriParser.Extract(EUriPath));
- break;
-
- case EScutDefParamName:
- componentValue.Set(iParamName);
- break;
-
- case EScutDefParamValue:
- componentValue.Set(iParamValue);
- break;
-
- case EScutDefParamNameAndValue:
- componentValue.Set(iUriParser.Extract(EUriQuery));
- break;
-
- case EScutDefComplete:
- componentValue.Set(iDefinition);
- break;
-
- default:
- break;
- }
-
- return componentValue;
-}
-
-
-// ---------------------------------------------------------------------------
-// Composes a shortcut definition string from given parameters.
-// ---------------------------------------------------------------------------
-//
-void TAiScutParser::ComposeL(HBufC*& aDes, const TUid aUid,
- const TDesC& aParamName, const TDesC& aParamValue)
-{
- HBufC* temp = HBufC::NewLC(KMaxDefinitionLength);
- TPtr ptr = temp->Des();
-
- if (aParamName.Length() && aParamValue.Length())
- {
- ptr.Format(KScutFormatApplicationWithParams, aUid.iUid, &aParamName, &aParamValue);
- }
- else
- {
- ptr.Format(KScutFormatApplication, aUid.iUid);
- }
-
- aDes = temp->AllocL();
- CleanupStack::PopAndDestroy(temp);
-}
-
-
-// ---------------------------------------------------------------------------
-// Composes a shortcut definition string from given parameters.
-// ---------------------------------------------------------------------------
-//
-void TAiScutParser::ComposeL(HBufC*& aDes, const TUid aUid,
- const TDesC& aParamString)
-{
- HBufC* temp = HBufC::NewLC(KMaxDefinitionLength);
- TPtr ptr = temp->Des();
-
- if (aParamString.Length())
- {
- ptr.Format(KScutFormatApplicationWithParamString, aUid.iUid, &aParamString);
- }
- else
- {
- ptr.Format(KScutFormatApplication, aUid.iUid);
- }
-
- aDes = temp->AllocL();
- CleanupStack::PopAndDestroy(temp);
-}
-
-
-// ---------------------------------------------------------------------------
-// Checks if an alias was used in shortcut definition and parses an uid from it.
-// ---------------------------------------------------------------------------
-//
-TBool TAiScutParser::ParseAlias()
-{
- TPtrC ptr(iUriParser.Extract(EUriPath));
-
- // "localapp:msg?..." is an alias for messaging application.
- if (ptr.CompareC(KScutTargetAliasMessaging) == 0)
- {
- iUid = KScutMessagingUid;
- return ETrue;
- }
- // "localapp:keylock?..." is an alias for keylock
- else if (ptr.CompareC(KScutTargetAliasKeylock) == 0)
- {
- iUid = KScutKeyLockUid;
- return ETrue;
- }
-
- // "localapp:voicedial..." is an alias for voicedial
- else if (ptr.CompareC(KScutTargetAliasVoiceDial) == 0)
- {
- iUid = KScutVoiceDialUid;
- return ETrue;
- }
-
- // "localapp:logs?..." is an alias for logs
- else if (ptr.CompareC(KScutTargetAliasLogs) == 0)
- {
- iUid = KScutLogsUid;
- return ETrue;
- }
- else
- {
- return EFalse;
- }
-}
-
-
-// ---------------------------------------------------------------------------
-// Parses the possible application shortcut parameters.
-// ---------------------------------------------------------------------------
-//
-void TAiScutParser::ParseParams()
-{
- TPtrC params(iUriParser.Extract(EUriQuery));
-
- if (params.Length() > 0)
- {
- HBufC *tempParams = params.Alloc();
- // value can't be longer than the params
- // but in some cases it can be equally long
- HBufC *value = HBufC::New(params.Length());
-
- // low memory or similar situation so cannot do anything
- if ( !value || !tempParams )
- {
- return;
- }
-
- TPtr valuePtr = value->Des();
- TPtr tempParamsPtr = tempParams->Des();
-
- TBool addonFound = EFalse;
- TInt err = KErrNone;
-
- // First extract the CBA
- err = ExtractValueFromQueryString(tempParamsPtr,KScutParamNameCBAIcon,valuePtr, ETrue);
- if ( err == KErrNone )
- {
- iIcon.iDestination = EScutDestinationSoftkey;
- }
- // Then the toolbar
-
- err = ExtractValueFromQueryString(tempParamsPtr,KScutParamNameToolbarIcon,valuePtr, ETrue);
-
- if ( err == KErrNone )
- {
- iIcon.iDestination = EScutDestinationToolbar;
- }
-
- // then extract the iconskinid
- err = ExtractValueFromQueryString(tempParamsPtr,
- KScutParamNameIconSkinId,valuePtr, ETrue);
- if ( err == KErrNone &&
- ResolveSkinItemId(valuePtr,iIcon.iSkinId,iIcon.iColourGroup))
- {
- iIcon.iType = EScutIconSkin;
- addonFound = ETrue;
- }
- // Then extract the iconmifpath
- // Iconmifpath extraction left here for backward compatibility
- valuePtr.Zero();
- err = ExtractValueFromQueryString(tempParamsPtr,
- KScutParamNameIconMifPath,valuePtr, ETrue);
- if ( err == KErrNone &&
- ResolveFileIdAndPath(valuePtr,iIcon.iIconId,iIcon.iPath) )
- {
- iIcon.iType = EScutIconMif;
- addonFound = ETrue;
- }
-
- // Then extract the iconpath.
- valuePtr.Zero();
- err = ExtractValueFromQueryString(tempParamsPtr,
- KScutParamNameIconPath,valuePtr, ETrue);
- if ( err == KErrNone &&
- ResolveFileIdAndPath(valuePtr,iIcon.iIconId,iIcon.iPath) )
- {
- if ( EndsWith(iIcon.iPath, KScutMIFExtension ))
- {
- iIcon.iType = EScutIconMif;
- }
- else if ( EndsWith(iIcon.iPath, KScutMBMExtension ))
- {
- iIcon.iType = EScutIconMbm;
- }
- addonFound = ETrue;
- }
-
- // Use the new params string where the addons
- // have been removed
- if( addonFound )
- {
- params.Set(tempParamsPtr);
- // no need to process anything because there are no
- // parameters left after our addons have been taken out
- if ( params.Length() <= 0)
- {
- delete value;
- delete tempParams;
- return;
- }
- }
-
- delete value;
-
- iType = EScutApplicationWithParams;
-
- const TInt valueSeparatorPos = params.Locate(KParamValueSeparator);
-
- if (valueSeparatorPos >= 0)
- {
- iParamName.Set(params.Left(valueSeparatorPos));
- }
- if (valueSeparatorPos >= 0)
- {
- iParamValue.Set(params.Mid(valueSeparatorPos + 1));
- }
- if (valueSeparatorPos == -1)
- {
- iParamName.Set(params);
- }
-
- if (iParamName.CompareC(KScutParamNameView) == 0)
- {
- iType = EScutApplicationView;
-
- if (iUid == KScutPersonalisationUid)
- {
- TUid uid = ParseUid(iParamValue);
- if (uid == KScutChangeThemeViewId)
- {
- iType = EScutChangeTheme;
- }
- iIcon.iViewId = uid;
- }
-
- if (iUid == KScutLogsUid)
- {
- if (iParamValue.CompareC(KScutParamValueMissedCalls) == 0)
- {
- iType = EScutLogsMissedCallsView;
- }
- else if (iParamValue.CompareC(KScutParamValueDialledCalls) == 0)
- {
- iType = EScutLogsDialledCallsView;
- }
- else if (iParamValue.CompareC(KScutParamValueReceivedCalls) == 0)
- {
- iType = EScutLogsReceivedCallsView;
- }
- else if (iParamValue.CompareC(KScutParamValueMainView) == 0)
- {
- iType = EScutLogsMainView;
- }
- }
-
- if (iUid == KScutGeneralSettingsUid)
- {
- if (ParseUid(iParamValue) == KScutParamValueConnectivityView)
- {
- iType = EScutConnectivityStatusView;
- }
- else if (ParseUid(iParamValue) == KScutInstallationViewId)
- {
- iType = EScutApplicationManagerView;
- }
- }
-
-
- }
- else if (iUid == KScutMessagingUid)
- {
- if (iParamName.CompareC(KScutParamNameNew) == 0)
- {
- if (iParamValue.CompareC(KScutParamValueMsg) == 0)
- {
- iType = EScutNewMessage;
- }
- else if (iParamValue.CompareC(KScutParamValueEmail) == 0)
- {
- iType = EScutNewEmail;
- }
-#ifdef __SYNCML_DS_EMAIL
- else if (iParamValue.CompareC(KScutParamValueSyncMLMail) == 0)
- {
- iType = EScutNewSyncMLMail;
- }
-#endif
- else if (iParamValue.CompareC(KScutParamValuePostcard) == 0)
- {
- iType = EScutNewPostcard;
- }
- else if (iParamValue.CompareC(KScutParamValueAudioMsg) == 0)
- {
- iType = EScutNewAudioMsg;
- }
- else
- {
- iType = EScutNewMsgType;
- }
- }
- else if (iParamName.CompareC(KScutParamNameMailbox) == 0)
- {
- iType = EScutMailbox;
- }
- }
- else if (iUid == KScutKeyLockUid)
- {
- iType = EScutKeylock;
- }
- else if (iUid == KScutSettingsDllUid || iUid == KScutBrowserUid)
- {
- if (iParamName.CompareC(KScutParamNameBookmark) == 0)
- {
- iType = EScutBookmark;
- iIcon.iViewId = ParseUid(iParamValue);
- }
- else if (iParamName.CompareC(KScutParamNoEffect) == 0)
- {
- iType = EScutNoEffect;
- }
- }
- delete tempParams;
- }
-}
-
-TInt TAiScutParser::ChecksumForString( const TDesC& aDefinition) const
- {
- return CreateChecksumFromString( aDefinition );
- }
-
-TInt TAiScutParser::CustomTitle( TDes& aTarget ) const
- {
- TPtrC params(iUriParser.Extract(EUriQuery));
- HBufC *tempParams = params.Alloc();
- if ( !tempParams )
- {
- return KErrNoMemory;
- }
-
- TPtr tempParamsPtr = tempParams->Des();
-
- TInt err = ExtractValueFromQueryString(tempParamsPtr,
- KScutParamNameCustomTitle, aTarget, EFalse);
-
- delete tempParams;
- return err;
- }
-
-void TAiScutParser::RemoveExtraDefinitionsL( TDes &aString ) const
- {
- HBufC *temp = HBufC::NewL( aString.Length( ));
- TPtr tempPtr = temp->Des();
- ExtractValueFromQueryString(aString,
- KScutParamNameCBAIcon, tempPtr, ETrue);
-
- ExtractValueFromQueryString(aString,
- KScutParamNameIconSkinId,tempPtr, ETrue);
-
- ExtractValueFromQueryString(aString,
- KScutParamNameIconMifPath,tempPtr, ETrue);
-
- ExtractValueFromQueryString(aString,
- KScutParamNameCustomTitle, tempPtr, ETrue);
- ExtractValueFromQueryString(aString,
- KScutParamNameIconPath, tempPtr, ETrue);
- delete temp;
- }
-
-// End of File.