textandlocutils/nearestlangutils/src/LangUtilImpl.h
author hgs
Tue, 07 Sep 2010 16:39:34 +0800
changeset 59 7d891bb52a7d
permissions -rw-r--r--
201033_04
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     1
// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     2
// All rights reserved.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     7
//
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     8
// Initial Contributors:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    10
//
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    11
// Contributors:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    12
//
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    13
// Description:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    14
//
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    15
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    16
#ifndef __LANGUTILIMPL_H__
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    17
#define __LANGUTILIMPL_H__
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    18
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    19
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    20
#include <f32file.h>
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    21
#include <e32std.h>
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    22
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    23
/**
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    24
Specifies the maximum length of the numerical part of the suffix.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    25
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    26
If this is changed the documentation of the following functions 
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    27
must also be updated:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    28
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    29
	LangUtil::NearestLanguageFile()
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    30
	TNearestLanguageFileFinder::CountDigitsFromEndInValidSuffix()
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    31
	TNearestLanguageFileFinder::SetFileName()
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    32
*/
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    33
const TInt KMaxSuffixLength = 5;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    34
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    35
class RDirectoryScanner
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    36
/**
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    37
@internalAll
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    38
*/
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    39
    {
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    40
public:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    41
    virtual TInt Open(RFs& aFs, const TDesC& aMatchPattern) = 0;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    42
    virtual TInt Next(TEntry& aOut) = 0;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    43
    virtual void Close() = 0;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    44
    virtual ~RDirectoryScanner() {}
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    45
    };
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    46
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    47
NONSHARABLE_CLASS(RRealDirectoryScanner) : public RDirectoryScanner
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    48
/**
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    49
@internalAll
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    50
*/
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    51
    {
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    52
public:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    53
    virtual TInt Open(RFs& aFs, const TDesC& aMatchPattern);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    54
    virtual TInt Next(TEntry& aOut);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    55
    virtual void Close();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    56
private:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    57
    RDir iDir;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    58
    };
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    59
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    60
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    61
/**
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    62
 * Add a language to the end of the language path, unless it is already
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    63
 * present. On entry, the language path must have an ELangNone entry at its
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    64
 * end. This will be true on exit also.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    65
 * @internalAll
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    66
 */
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    67
void AddLanguage(TLanguagePath& aPath, TLanguage aNewLanguage);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    68
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    69
/**
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    70
 * Create a language path from the current language, ideal language and locale. 
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    71
 * The path may have up to eight entries in it.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    72
 * @internalAll
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    73
 */
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    74
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    75
void MakeLanguageDowngradePath(TLanguagePath& aPath,
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    76
	TLanguage aCurrent, TLanguage aIdeal, const TLocale& aLocale);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    77
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    78
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    79
/**
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    80
 * This class contains all the functions for working out the nearest language
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    81
 * file. It can be derived from for test code purposes.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    82
 * @internalAll
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    83
 */
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    84
NONSHARABLE_CLASS(TNearestLanguageFileFinder)
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    85
	{
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    86
public:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    87
	TNearestLanguageFileFinder(const RFs& aFs);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    88
	TBool SetFileName(TFileName& aFileName);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    89
	TLanguage Language();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    90
	// put back the original suffix and drive letter
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    91
	void RepairFileName();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    92
	// add the preset custom resource drive, if any, to iDrives.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    93
	TInt AddCustomResourceDrive();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    94
	// add all remaining drives to iDrives. iDrives must not have more than one
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    95
	// drive in it on entry.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    96
	void AddAllDrives();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    97
	// Tries to append the language code to iFileName. This is 00..09 or just the number.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    98
	// If there was not enough space, EFalse is returned.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
    99
	TBool AppendLanguageCode(TLanguage aLanguage);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   100
	// Search the drives in iDrives for the file named iFileName.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   101
	// iFileName must have a drive specifier, which will be overwritten.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   102
	TBool FindDrive();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   103
	// Search for files across all drives in all languages in the path plus the
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   104
	// language-neutral file.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   105
	// On entry, iFileName should be the original name with a drive specifier
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   106
	// minus the suffix. On return, iFileName will be untouched if EFalse is
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   107
	// returned, but contain the result if ETrue is returned.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   108
	TBool FindLanguageAndDrive();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   109
	// Test whether the filename passed in matches the stem given + numbers
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   110
	// added to the end. Returns the number if it does, or KErrNotFound if not.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   111
	// aFileName must not end in a digit.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   112
	static TInt LanguageNumberFromFile(const TDesC& aFileName, const TDesC& aStem);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   113
	// Find lowest numbered file that matches iFileName, which must be without
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   114
	// its suffix.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   115
	TInt FindFirstLanguageFile(RFs&);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   116
	// Try each drive for any language files that match iFileName.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   117
	// iFileName must have a directory specifier and be without its suffix.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   118
	// returns KErrNotFound, KErrNone or error code.
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   119
	TInt FindFirstLanguageFileAndDrive();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   120
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   121
	virtual TInt GetCustomResourceDriveNumber() const;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   122
	
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   123
	virtual TInt FileExists(const TDesC& aFileName) const;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   124
	// return our member that is our directory scanning class
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   125
	virtual RDirectoryScanner& DirectoryScanner();
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   126
	virtual ~TNearestLanguageFileFinder() {}
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   127
	
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   128
private:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   129
	TInt CountDigitsFromEnd(const TDesC& aFilename);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   130
	TInt CountDigitsFromEndInSuffix (const TDesC& aFilename);
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   131
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   132
public:
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   133
	const RFs& iFs;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   134
	TFileName* iFileName;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   135
	TLanguage  iLanguage;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   136
	TBuf<26> iDrives;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   137
	TLanguagePath iPath;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   138
	TBuf<KMaxSuffixLength> iSuffix;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   139
	TInt iInitialDriveLetter;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   140
	// length minus the removed suffix
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   141
	TInt iOriginalBaseLength;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   142
	// length plus added drive letter minus removed suffix
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   143
	TInt iBaseLength;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   144
	RRealDirectoryScanner iDirScanner;
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   145
	};
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   146
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   147
#endif // __LANGUTILIMPL_H__
7d891bb52a7d 201033_04
hgs
parents:
diff changeset
   148