diff -r 11e2bb0d14ba -r 7d891bb52a7d textandlocutils/nearestlangutils/tsrc/T_LangUtilsTestShareFunc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textandlocutils/nearestlangutils/tsrc/T_LangUtilsTestShareFunc.cpp Tue Sep 07 16:39:34 2010 +0800 @@ -0,0 +1,408 @@ +// Copyright (c) 1997-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: +// + +#include +#include "T_LangUtilsTestShareFunc.h" + +void DoCopyFileL(RFs& aFs, const TDesC& aSourceFullName, const TDesC& aTargetFullName, TUint aSwitch) + { + CFileMan* fileMan=CFileMan::NewL(aFs); + CleanupStack::PushL(fileMan); + User::LeaveIfError(fileMan->Copy(aSourceFullName,aTargetFullName,aSwitch)); + CleanupStack::PopAndDestroy(); // fileMan + } + + +TInt LangUtilsTest::CopyFile(RFs& aFs, const TDesC& aSourceFullName, const TDesC& aTargetFullName, TUint aSwitch) +/** Copies one or more files. + +For more details, +@see CFileMan::Copy() +@since 5.1 +@param aFs File server session +@param aSourceFullName Path indicating the file(s) to be copied. Any path +components that are not specified here will be taken from the session path. +@param aTargetFullName Path indicating the directory into which the file(s) +are to be copied +@param aSwitch=CFileMan::EOverWrite Set this to zero for no overwriting and +no recursion; CFileMan::EOverWrite to overwrite files with the same name; or +CFileMan::ERecurse for recursion. +@return KErrNone if successful, otherwise another of the system-wide error +codes.*/ + { + TRAPD(err,DoCopyFileL(aFs,aSourceFullName,aTargetFullName,aSwitch)); + return err; + } + +TBool LangUtilsTest::FileExists(const RFs& aFileSession,const TDesC& aFileName) +/** Checks if the specified file exists. + +@param aFs File server session +@param aFileName File to check +@return ETrue if the file exists, otherwise EFalse */ + { // static + TEntry entry; + return(aFileSession.Entry(aFileName,entry)==KErrNone); + } + +void DoDeleteFileL(RFs& aFs, const TDesC& aSourceFullName, TUint aSwitch) + { + CFileMan* fileMan=CFileMan::NewL(aFs); + CleanupStack::PushL(fileMan); + User::LeaveIfError(fileMan->Delete(aSourceFullName,aSwitch)); + CleanupStack::PopAndDestroy(); // fileMan + } + + +EXPORT_C TInt LangUtilsTest::DeleteFile(RFs& aFs, const TDesC& aSourceFullName, TUint aSwitch) +/** Deletes one or more files. + +For more details, +@see CFileMan::Delete(). +@since 5.1 +@param aFs File server session +@param aSourceFullName Path indicating the file(s) to be deleted. May either +be a full path, or relative to the session path. Use wildcards to specify +more than one file. +@param aSwitch=0 Specify CFileMan::ERecurse for recursion, +zero for no recursion. +@return KErrNone if successful, otherwise another of the system-wide error +codes. */ + { + TRAPD(err,DoDeleteFileL(aFs,aSourceFullName,aSwitch)); + return err; + } + +NONSHARABLE_CLASS(TKeyDesC16Array) : public TKeyArrayFix + { +public: + TKeyDesC16Array(TKeyCmpText aType); +private: // from TKey + TInt Compare(TInt aLeft,TInt aRight) const; + }; + +TKeyDesC16Array::TKeyDesC16Array(TKeyCmpText aType) + : TKeyArrayFix(0,aType,0) + { + } + +TInt TKeyDesC16Array::Compare(TInt aLeft,TInt aRight) const + { + TDesC16* left=(*(TDesC16**)At(aLeft)); + TDesC16* right=(*(TDesC16**)At(aRight)); + switch (iCmpType) + { + case ECmpFolded: + return(left->CompareF(*right)); + case ECmpCollated: + return(left->CompareC(*right)); + default: + break; + } + return(left->Compare(*right)); + } + +EXPORT_C CDesC16Array::CDesC16Array(TBufRep aRep,TInt aGranularity) + : CArrayFixBase(aRep,sizeof(HBufC16*),aGranularity) + { + } + +EXPORT_C CDesC16Array::~CDesC16Array() +/** Frees all resources owned by the object, prior to its destruction. In particular, +it deletes all descriptors from the array and frees the memory allocated to +the array buffer. */ + { + Reset(); + } + +EXPORT_C void CDesC16Array::Reset() +/** Deletes all descriptors from the array and frees the memory allocated to the +array buffer. + +@see CDesC16Array::Delete() */ + { + Delete(0,Count()); + } + +EXPORT_C void CDesC16Array::Delete(TInt aIndex) + { + Delete(aIndex,1); + } + +/** + * + * Deletes one or more logically contiguous descriptor elements from the + * array. + * + * The deletion starts at the specified position.Deleting descriptor + * elements from the array frees the memory occupied by the associated + * heap descriptors and removes their pointers from the array buffer but + * does not cause the array buffer to be automatically compressed. Call + * the Compress() function to return excess space in the array buffer to + * the heap. + * + * @param " TInt aPos " + * The starting position in the array from which + * descriptor elements are to be deleted. The position is + * relative to zero, i.e. zero implies the first + * descriptor element. This value must not be negative + * and must not be greater than the number of descriptor + * elements currently in the array, otherwise the + * functions raise an E32USER-CBase 21 panic. + * @param " TInt aCount " + * If specified, the number of contiguous descriptor + * elements to be deleted from the array. This value must + * not be negative otherwise the function raises an + * E32USER-CBase 22 panic. This value must not be + * negative otherwise the function raises an + * E32USER-CBase 22 panic. This value must not be + * negative otherwise the function raises an + * E32USER-CBase 22 panic. This value plus the value of + * the starting position must not be greater than the + * number of descriptor elements in the array, otherwise + * the function raises an E32USER-CBase 29 panic. If not + * specified, one element is assumed. + */ +EXPORT_C void CDesC16Array::Delete(TInt aIndex,TInt aCount) + { + TInt count=aCount; + for (TInt ii=aIndex; count--; ii++) + User::Free(*(HBufC16**)At(ii)); + CArrayFixBase::Delete(aIndex,aCount); + } + +EXPORT_C TInt CDesC16Array::MdcaCount() const +/** Returns the number of descriptor elements in the array. The function implements +the function interface MDesC16Array::MdcaCount(). + +@return The number of descriptor elements. */ + { + return Count(); + } + +EXPORT_C TPtrC16 CDesC16Array::MdcaPoint(TInt anIndex) const +/** Indexes into a descriptor array. The function implements the interface MDesC16Array::MdcaPoint(). + + @param aIndex The position of the descriptor element within the array. The + position is relative to zero; i.e. zero implies the first descriptor element + in the array. This value must be non-negative and less than the number of + descriptors currently within the array otherwise the operator panics with + EArrayIndexOutOfRange. + @return A non-modifiable pointer descriptor representing the descriptor element + located at position aIndex within the array. */ + { + HBufC16* temp=(*(HBufC16**)At(anIndex)); + return (TPtrC16)(*temp); + } + +EXPORT_C void CDesC16Array::AppendL(const TDesC16& aPtr) +/** Appends a descriptor onto the end of any existing descriptor elements in the +array. + +@param aPtr A reference to the descriptor to be appended to the array. */ + { + InsertL(Count(),aPtr); + } + +EXPORT_C void CDesC16Array::InsertL(TInt aPos,const TDesC16& aPtr) +/** Inserts a descriptor into the array at the specified position. + +If the specified position is the same as the current number of descriptor +elements in the array, this has the effect of appending the element. + +@param aPos The position within the array where the descriptor element is +to be inserted. The position is relative to zero, i.e. zero implies the first +descriptor element. This value must not be negative and must not be greater +than the number of descriptor elements currently in the array, otherwise the +function raises an E32USER-CBase 21 panic. +@param aPtr The descriptor to be inserted into the array. */ + { + HBufC16* bufPtr=aPtr.AllocLC(); + CArrayFixBase::InsertL(aPos,&bufPtr); + CleanupStack::Pop(); + } + +EXPORT_C TInt CDesC16Array::InsertIsqL(const TDesC16& aPtr,TKeyCmpText aTextComparisonType) +/** Inserts a descriptor into the array at a position which maintains the sequence +of the descriptors. + +The sequence is determined by comparing descriptors using one of the TDesC +comparison functions. The enumeration aTextComparisonType governs how the +descriptors are to be compared. + +The array should already be in sequence, otherwise the position of the new +descriptor element is unpredictable. Descriptor elements which are the same +are not permitted. + +@param aPtr A reference to the descriptor to be inserted into the array. +@param aTextComparisonType An enumeration which determines the type of comparison +to be made between descriptors for the purpose of choosing the insertion position. +If no parameter is explicitly passed, ECmpFolded is used by default. +@return The position within the array of the inserted descriptor. */ + { + HBufC16* bufPtr=aPtr.AllocLC(); + TKeyDesC16Array key(aTextComparisonType); + TInt found=CArrayFixBase::InsertIsqL(&bufPtr,key); + CleanupStack::Pop(); + return(found); + } + +EXPORT_C TInt CDesC16Array::InsertIsqAllowDuplicatesL(const TDesC16& aPtr,TKeyCmpText aTextComparisonType) +/** Inserts a descriptor into the array at a position which maintains the sequence +of the descriptors; allows duplicates. + +The sequence is determined by comparing descriptors using one of the TDesC +comparison functions. The enumeration aTextComparisonType governs how the +descriptors are to be compared. + +The array should already be in sequence, otherwise the position of the new +descriptor element is unpredictable. Descriptor elements which are the same +are permitted; if the descriptor aPtr is a duplicate of an existing descriptor +within the array, then the new descriptor element is positioned after the +existing descriptor element. + +@param aPtr A reference to the descriptor to be inserted into the array. +@param aTextComparisonType An enumeration which determines the type of comparison +to be made between descriptors for the purpose of choosing the insertion position. +If no parameter is explicitly passed, ECmpFolded is used by default. +@return The position within the array of the inserted descriptor. */ + { + HBufC16* bufPtr=aPtr.AllocLC(); + TKeyDesC16Array key(aTextComparisonType); + TInt found=CArrayFixBase::InsertIsqAllowDuplicatesL(&bufPtr,key); + CleanupStack::Pop(); + return(found); + } + +EXPORT_C void CDesC16Array::Sort(TKeyCmpText aTextComparisonType) +/** Sorts the descriptor elements into sequence. + +The sequence is determined by comparing descriptors using one of the member +functions of the descriptor base class TDesC. + +@param aTextComparisonType An enumeration which defines the type of comparison +to be made between descriptors. By default the comparison type is ECmpFolded. */ + { + TKeyDesC16Array key(aTextComparisonType); + CArrayFixBase::Sort(key); + } + +EXPORT_C TInt CDesC16Array::Find(const TDesC16& aPtr,TInt& aPos,TKeyCmpText aTextComparisonType) const +/** Finds the position of a descriptor element within the array which matches the +specified descriptor, using a sequential search. + +The array is searched sequentially for a matching descriptor element, starting +with the first descriptor element in the array. Descriptors are compared using +one of the TDesC comparison functions. The enumeration aTextComparisonType +governs how the descriptors are to be compared. + +Where an array has duplicate descriptor elements, the function only supplies +the position of the first descriptor element. + +@param aPtr A reference to a descriptor to be used for comparison. +@param aPos If the descriptor element is found, this reference is set to the +position of that descriptor element within the array. The position is relative +to zero, (i.e. the first descriptor element in the array is at position 0). +If the descriptor element is not found and the array is not empty, then the +value of the reference is set to the number of descriptor elements in the +array. If the descriptor element is not found and the array is empty, then +the reference is set to zero. +@param aTextComparisonType An enumeration which determines the type of comparison +to be made between descriptors. If no parameter is explicitly passed,ECmpFolded +is used by default. +@return Zero, if a matching descriptor element is found. Non-zero, if no matching +descriptor element can be found. */ + { + TKeyDesC16Array key(aTextComparisonType); + const TDesC16* tmp=(&aPtr); + return(CArrayFixBase::Find(&tmp,key,aPos)); + } + +EXPORT_C TInt CDesC16Array::FindIsq(const TDesC16& aPtr,TInt& aPos,TKeyCmpText aTextComparisonType) const +/** Finds the position of a descriptor element within the array which matches the +specified descriptor, using a binary search technique. The array must +be in sequence, otherwise the outcome is unpredictable. + +Descriptors are compared using one of the TDesC comparison functions. The +enumeration aTextComparisonType governs how the descriptors are to be compared. + +Where an array has duplicate descriptor elements, the function cannot guarantee +which matching descriptor element it will return; except that it will find +one of them. + +@param aPtr A reference to a descriptor to be used for comparison. +@param aPos If the descriptor element is found, the reference is set to the +position of that descriptor element within the array. The position is relative +to zero, (i.e. the first descriptor element in the array is at position 0). +If the descriptor element is not found and the array is not empty, then the +reference is set to the position of the first descriptor element in the array +whose content is greater than the content of aPtr. If the descriptor element +is not found and the array is empty, then the reference is set to zero. +@param aTextComparisonType An enumeration which determines the type of comparison +to be made between descriptors. If no parameter is explicitly passed, ECmpFolded +is used by default. +@return Zero, if a matching descriptor element is found. Non-zero, if no matching +descriptor element can be found. */ + { + TKeyDesC16Array key(aTextComparisonType); + const TDesC16* tmp=(&aPtr); + return(CArrayFixBase::FindIsq(&tmp,key,aPos)); + } + + +EXPORT_C CDesC16ArraySeg::CDesC16ArraySeg(TInt aGranularity) + : CDesC16Array((TBufRep)CBufSeg::NewL,aGranularity) +/** Construct a segmented descriptor array with the specified granularity. + +No memory is allocated to the array buffer by this C++ constructor. + +@param aGranularity The granularity of the array. This value must be positive +otherwise the constructor raises an E32USER-CBase 18 panic. */ + { + __DECLARE_NAME(_S("CDesC16ArraySeg")); + } + +EXPORT_C CDesC16ArraySeg::~CDesC16ArraySeg() +/** Frees all resources owned by the object, prior to its destruction. */ + {} + + +/* The following 3 function is defined so that the functions IdealLanguage, +SetIdealLanguage, ReleaseIdealLanguage will compile as part as an .exe +These functions use a global TAny* to store the data that would have been +stored in the TLS under normal compilation (ie If the BaUtils was compilled +as part of a DLL). +*/ + +TAny* ptr(NULL); + +TAny* Dll::Tls() + { + return ptr; + } + +TInt Dll::SetTls(TAny* aPtr) + { + ptr = aPtr; + return KErrNone; + } + +void Dll::FreeTls() + { + ptr = NULL; + } + + +