diff -r 000000000000 -r f979ecb2b13e notepad/txtrecog/src/TxtRecog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notepad/txtrecog/src/TxtRecog.cpp Tue Feb 02 10:12:19 2010 +0200 @@ -0,0 +1,324 @@ +/* +* Copyright (c) 2002 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: Implementation of text recognizer class. +* +*/ + + +#include +#include +#include +#include + +#include "TxtRecog.h" +#include +#include +#include +#include + +#include + + +// CONSTANTS +_LIT8(KTextMimeType, "text/plain"); +const TInt KMaxBufferSize(512); +_LIT(KTextExtension, ".txt"); + + +_LIT( KResourceFile, "TxtRecog.rsc" ); + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::CKthreeTextRecognizer +// ----------------------------------------------------------------------------- +// +CKthreeTextRecognizer::CKthreeTextRecognizer() + :CApaDataRecognizerType( + TDataType(KTextMimeType).Uid(), + CApaDataRecognizerType::ELow ) + { + iCountDataTypes = 1; + } +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::NewL +// ----------------------------------------------------------------------------- +// +CKthreeTextRecognizer* CKthreeTextRecognizer::NewL() + { + CKthreeTextRecognizer* self = new(ELeave) CKthreeTextRecognizer(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::ConstructL() +// ----------------------------------------------------------------------------- +// +void CKthreeTextRecognizer::ConstructL() + { + TInt err = 0; + RFs fs; + RResourceFile resourceFile; + TResourceReader theReader; + TBuf<254> resourceFileName; + + err = fs.Connect(); + + if (err) + { + fs.Close(); + User::LeaveIfError( err ); + } + + TParse* fp = new(ELeave) TParse(); + fp->Set(KResourceFile, &KDC_APP_RESOURCE_DIR, NULL); + + + resourceFileName.Copy(fp ->FullName()); + TPtrC driveLetter = TParsePtrC( RProcess().FileName() ).Drive(); + + TFileName fileName( driveLetter ); + fileName.Append( resourceFileName ); + + TRAP(err, resourceFile.OpenL(fs, fileName)); + if (err) + { + fs.Close(); + delete fp; + fp =NULL; + User::LeaveIfError( err ); + } + + delete fp; + fp =NULL; + + HBufC8* res = resourceFile.AllocReadL( R_BLACK_LIST_EXTENSIONS_LIST ); + theReader.SetBuffer(res); + + TInt count = theReader.ReadInt16() ; + + for( TInt i = 0 ; i < count ; i++) + { + HBufC* blExt = theReader.ReadHBufCL() ; + iResListData.Append( blExt ); + } + + + delete res; + res = NULL; + resourceFile.Close(); + fs.Close(); + + + } + + +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::PreferredBufSize +// ----------------------------------------------------------------------------- +// +CKthreeTextRecognizer::~CKthreeTextRecognizer() + { + //iResListData.Close(); + iResListData.ResetAndDestroy(); + } +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::PreferredBufSize +// ----------------------------------------------------------------------------- +// +TUint CKthreeTextRecognizer::PreferredBufSize() + { + return KMaxBufferSize; + } + +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::SupportedDataTypeL +// ----------------------------------------------------------------------------- +// +TDataType CKthreeTextRecognizer::SupportedDataTypeL(TInt ) const + { + return TDataType(KTextMimeType); + } + +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::DoRecognizeL +// ----------------------------------------------------------------------------- +// +void CKthreeTextRecognizer::DoRecognizeL( + const TDesC& aName, + const TDesC8& aBuffer ) + { + iConfidence = ENotRecognized; + TBool isTextExtension(EFalse); + + + /* If extension is .txt and the buffer is empty return Probable */ + if ( aName.Length() > KTextExtension().Length() ) + { + TPtrC extension = aName.Right(KTextExtension().Length()); + + if (IsInBlackListL(extension)) + { + iConfidence = ENotRecognized; + return ; + } + + if ( extension.CompareF(KTextExtension) == 0 ) + { + isTextExtension = ETrue; + iDataType = TDataType(KTextMimeType); + iConfidence = EProbable; + /* There may be a buffer of characters available for + us to scan through and we might get more confident */ + } + } + + const TInt size(aBuffer.Size()); + + /* This is the second call where we also get data in the buffer */ + if ( size > 0 ) + { + /* If BOM and .txt -> Certain. If BOM only -> Probable */ + if ( size > 1 && + (( aBuffer[0] == 0xfe && aBuffer[1] == 0xff ) || + ( aBuffer[0] == 0xff && aBuffer[1] == 0xfe ) )) + { + iDataType = TDataType(KTextMimeType); + iConfidence = isTextExtension ? ECertain : EProbable; + } + + /* If No BOM. It is ASCII */ + else + { + /* See if all characters are valid ASCII. Any invalid ASCII chars make this non UNICODE file not a text file */ + TInt i(0); + while ( i < size && !IsInvalidChar(aBuffer[i])) + { + i++; + } + if ( i == size )// chars in aBuffer are all valid. + { + iDataType = TDataType(KTextMimeType); + + if ( i >= KMaxBufferSize ) // we were given at least as many samples as we asked for + { + if (isTextExtension) + { + iConfidence = ECertain; // No BOM but .txt and losts of ascii characters + } + else + { + iConfidence = EProbable; // No BOM or .txt but lots of ascii characters + } + } + else //not enough samples to be certain + { + if (isTextExtension) + { + iConfidence = EProbable; // No BOM but .txt and a few ascii characters + } + else + { + iConfidence = EPossible; // No BOM or .txt but some ascii characters + } + } + } //end all valid chars + } //end no BOM + } //end size > 0 + } +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::IsInvalidChar +// ----------------------------------------------------------------------------- +// +TBool CKthreeTextRecognizer::IsInvalidChar( const TUint8& aByte ) + { + return aByte == 0x7f || aByte <= 0x07 || + ( aByte >= 0x0e && aByte <= 0x1f && aByte != 0x1b ); + } + +// ----------------------------------------------------------------------------- +// CKthreeTextRecognizer::IsInBlackListL +// ----------------------------------------------------------------------------- +// +TBool CKthreeTextRecognizer::IsInBlackListL(TPtrC aExt) + + { + TBool ret = EFalse; + + TInt count = iResListData.Count(); + + for ( TInt index = 0; index < count; index++) + { + if (aExt.CompareF(*iResListData[index]) == 0 ) + { + ret = ETrue ; + break ; + } + } + return ret; + } + + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// ----------------------------------------------------------------------------- +// CApaDataRecognizerType* CreateRecognizer +// The gate function - ordinal 1 +// ----------------------------------------------------------------------------- +// +#ifdef EKA2 +CApaDataRecognizerType* CKthreeTextRecognizer::CreateRecognizerL() + { + //return new (ELeave) CKthreeTextRecognizer(); + return CKthreeTextRecognizer::NewL(); + } + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KTxtRecognizerImplementationUid, + CKthreeTextRecognizer::CreateRecognizerL) + }; + +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } + +#else +EXPORT_C CApaDataRecognizerType* CreateRecognizer() + { + CApaDataRecognizerType* thing=new CKthreeTextRecognizer(); + return thing; // NULL if new failed + } + +#endif +// ----------------------------------------------------------------------------- +// E32Dll +// DLL entry point +// ----------------------------------------------------------------------------- +// + +#ifndef EKA2 +GLDEF_C TInt E32Dll(TDllReason /*aReason*/) + { + return KErrNone; + } +#endif + +// End of File