notepad/notepad1/LibSrc/NpdUtil.cpp
changeset 0 f979ecb2b13e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/notepad/notepad1/LibSrc/NpdUtil.cpp	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,515 @@
+/*
+* 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 Static Utility functions of Notepad Library.
+*
+*/
+
+
+// INCLUDE FILES
+#include <sysutil.h>
+#include <AknGlobalNote.h>
+#include <coemain.h>
+#include <txtetext.h>
+#include <s32file.h>
+#include <charconv.h>
+#include <NpdLib.rsg>
+#include "NpdUtil.h"
+#include <StringLoader.h>
+
+static const TInt KMaxSampleLengthForAutoDetection(1024);
+//static const TInt KDbCorruptedMessageMaxLength(256);
+//0x21B2 is the Linefeed symbol
+//const TChar linefeed(0x21B2);
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::LeaveIfCriticalLevelL
+// -----------------------------------------------------------------------------
+//
+void NotepadUtil::LeaveIfCriticalLevelL( 
+    CCoeEnv& aCoeEnv,
+    TInt aBytesToWrite )
+    {
+    if ( SysUtil::FFSSpaceBelowCriticalLevelL(&(aCoeEnv.FsSession()), 
+            aBytesToWrite) )
+        {
+        User::Leave(KErrDiskFull);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::ShowCorruptedNoteL
+// -----------------------------------------------------------------------------
+//
+void NotepadUtil::ShowCorruptedNoteL(CCoeEnv& /*aCoeEnv*/)
+    {
+    CAknGlobalNote* note = CAknGlobalNote::NewLC();
+    
+    HBufC* buf = StringLoader::LoadLC(R_NOTEPAD_QTN_MEMLO_DATABASE_CORRUPTED);
+    note->ShowNoteL(EAknGlobalInformationNote, *buf);
+    CleanupStack::PopAndDestroy(buf); 
+    CleanupStack::PopAndDestroy(note); // note
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::IsEmpty
+// -----------------------------------------------------------------------------
+//
+TBool NotepadUtil::IsEmpty(const TDesC& aText)
+    {
+    const TChar linefeed(0x21B2);
+    for ( TInt i(0); i < aText.Length(); i++ )
+        {
+        TChar c(aText[i]);
+        if ( !c.IsControl() && !c.IsSpace()&& c != linefeed )
+            {
+            return EFalse;
+            }
+        }
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::AppendLabel
+// Perl like semantics:
+//     $x = aText;
+//     if ( aRemoveHeadingSpaces ) { $x =~ s/^\s+//g; }
+//     else { $x =~ s/\s/ /g; }
+//     aBuf .= $x;
+// Because when the caption contains edwin newline code (0x2029)
+// 'pinboard' shows only last one line in it's link name form,
+// we must replace Edwin newline code (0x2029) with ' '.
+//
+//               IsSpace?   IsControl?  IsHead? -> Write
+// -----------------------------------------------------
+// \n,\t,\r,' '    Yes         Yes        Yes      nothing 
+//                 Yes         Yes        No        ' '
+// other control   No          Yes        Yes      nothing
+//   characters    No          Yes        No       nothing
+// normal chars    No          No         Yes      the char
+//                 No          No         No       the char
+// -----------------------------------------------------------------------------
+//
+void NotepadUtil::AppendLabel(
+    TDes& aBuf, 
+    const TDesC& aText,
+    const TBool aRemoveHeadingSpaces )
+    {
+    TInt i(0);
+    TInt j(aBuf.Length());
+    TBool isHeading(aRemoveHeadingSpaces);
+    while (i <  aText.Length() && j < aBuf.MaxLength())
+        {
+        TChar c(aText[i]);
+        if ( c.IsSpace() )
+            {
+            if ( !isHeading )
+                {
+                aBuf.Append(' ');
+                j++;
+                }
+            }
+        else if ( !c.IsControl() )
+            {
+            aBuf.Append(c);
+            j++;
+            isHeading = EFalse;
+            }
+        i++;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::LoadFileL
+// -----------------------------------------------------------------------------
+//
+void NotepadUtil::LoadFileL(
+    CCoeEnv& aCoeEnv,
+    const TDesC& aFileName, 
+    TBool aGuessEncoding,
+    TUint aEncoding, 
+    CPlainText& aText )
+    {
+    RFile file;
+    User::LeaveIfError(file.Open(aCoeEnv.FsSession(), aFileName, EFileRead));
+    CleanupClosePushL(file);
+    TInt size(0);
+    User::LeaveIfError( file.Size(size) );
+    if ( size > 0 )
+        {
+        CPlainText::TImportExportParam param;
+        if ( !aGuessEncoding )
+            {
+            param.iForeignEncoding = aEncoding;
+            }
+        else
+            {
+            TBuf8<KMaxSampleLengthForAutoDetection> sample;
+
+            User::LeaveIfError( file.Read(sample, 
+                size > KMaxSampleLengthForAutoDetection ? 
+                KMaxSampleLengthForAutoDetection : size) );
+
+            if (IsBigEndianUnicodeText(sample))
+                {
+                param.iForeignEncoding = KCharacterSetIdentifierUnicodeBig; 
+                }
+            else if (IsLittleEndianUnicodeText(sample))
+                {
+                param.iForeignEncoding = KCharacterSetIdentifierUnicodeLittle; 
+                }
+            else if (IsUTF8Text(sample))
+                {
+                param.iForeignEncoding = KCharacterSetIdentifierUtf8; 
+                }
+            else if ( IsShiftJisText(sample) )
+                {
+                param.iForeignEncoding = KCharacterSetIdentifierShiftJis; 
+                }
+            else
+                {
+                param.iForeignEncoding = GuessEncodingFromLanguage();
+                if (param.iForeignEncoding == 0) // Variant not found
+                    {
+                    CArrayFix<CCnvCharacterSetConverter::SCharacterSet>* 
+                        lists = CCnvCharacterSetConverter::
+                        CreateArrayOfCharacterSetsAvailableLC(
+                        aCoeEnv.FsSession() );
+                    
+                    TInt confidence(0);
+                    TUint charset(0);
+                    CCnvCharacterSetConverter::AutoDetectCharacterSetL(
+                        confidence, charset, *lists, sample);
+                    CleanupStack::PopAndDestroy();
+                    
+                    if ( confidence < 95)
+                        {
+                        param.iForeignEncoding = KCharacterSetIdentifierAscii;
+                        }
+                    else 
+                        {
+                        param.iForeignEncoding = charset;
+                        }  
+                    }
+                }
+            }
+
+        CPlainText::TImportExportResult result;
+        RFileReadStream stream(file);
+        CleanupClosePushL(stream);
+		TInt err;
+		TRAP(err, aText.ImportTextL(0, stream, param, result));
+        stream.Release();
+
+        CleanupStack::PopAndDestroy(); // stream
+        }
+    CleanupStack::PopAndDestroy(); // file*/
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::LoadFileL file handle
+// -----------------------------------------------------------------------------
+//
+TBool NotepadUtil::LoadFileL(
+    CCoeEnv& aCoeEnv,
+    RFile& aFile, 
+    TBool aGuessEncoding,
+    TUint aEncoding, 
+    CPlainText& aText )
+    {
+    TInt size(0);
+    User::LeaveIfError( aFile.Size(size) );
+    
+    CleanupClosePushL(aFile);
+    TBool returnErr = KErrNone;
+    
+    if ( size > 0 )
+        {
+        CPlainText::TImportExportParam param;
+        if ( !aGuessEncoding )
+            {
+            param.iForeignEncoding = aEncoding;
+            }
+        else
+            {
+            TBuf8<KMaxSampleLengthForAutoDetection> sample;
+            User::LeaveIfError( aFile.Read(sample, 
+                size > KMaxSampleLengthForAutoDetection ? 
+                KMaxSampleLengthForAutoDetection : size) );
+                
+            CArrayFix<CCnvCharacterSetConverter::SCharacterSet>* 
+            lists = CCnvCharacterSetConverter::
+            CreateArrayOfCharacterSetsAvailableLC(
+            aCoeEnv.FsSession() );
+            
+            TInt confidence(0);
+            TUint charset(0);
+            CCnvCharacterSetConverter::AutoDetectCharacterSetL(
+                confidence, charset, *lists, sample);
+            CleanupStack::PopAndDestroy();
+            
+            if ( confidence > 50)
+                {
+                param.iForeignEncoding = charset;
+                }
+            else 
+                {
+                
+	            if (IsBigEndianUnicodeText(sample))
+	                {
+	                param.iForeignEncoding = KCharacterSetIdentifierUnicodeBig; 
+	                }
+	            else if (IsLittleEndianUnicodeText(sample))
+	                {
+	                param.iForeignEncoding = KCharacterSetIdentifierUnicodeLittle; 
+	                }
+	            else if (IsUTF8Text(sample))
+	                {
+	                param.iForeignEncoding = KCharacterSetIdentifierUtf8; 
+	                }
+	            else if ( IsShiftJisText(sample) )
+	                {
+	                param.iForeignEncoding = KCharacterSetIdentifierShiftJis; 
+	                }
+	            else
+	                {
+	                param.iForeignEncoding = GuessEncodingFromLanguage();
+	                if (param.iForeignEncoding == 0) // Variant not found
+	                    {
+	                    param.iForeignEncoding = KCharacterSetIdentifierAscii;
+	                    }
+
+	                }
+                }
+            }
+        
+        CPlainText::TImportExportResult result;
+        
+        RFile tempFile;
+        tempFile.Duplicate( aFile );
+        
+        RFileReadStream stream(tempFile);
+        CleanupClosePushL(stream);
+	    
+	    TInt err = KErrNone;
+		TRAP(err, aText.ImportTextL(0, stream, param, result));
+		
+	
+		stream.Release();// closing of tempfile
+
+		CleanupStack::PopAndDestroy(); // stream 
+		
+		aFile.Close();
+		
+		CleanupStack::PopAndDestroy(&aFile); // afile 
+
+
+	   switch ( err )
+        {
+        case KErrCorrupt:
+             returnErr = KErrCorrupt;
+        case KErrNone: 
+            break;
+        default:
+            User::Leave(err);
+            break;
+        }
+	         
+	  	  
+	    
+        
+    }//size > 0
+    else
+    {
+    	  aFile.Close();
+    	  CleanupStack::PopAndDestroy(&aFile);
+    }
+        
+      return returnErr;  
+    }
+
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::IsBigEndianUnicodeText
+// -----------------------------------------------------------------------------
+//
+bool NotepadUtil::IsBigEndianUnicodeText(TDesC8& aText)
+    {
+    if (( aText.Length() >= 2) && ( aText[0] == 0xfe && aText[1] == 0xff ) )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::IsLittleEndianUnicodeText
+// -----------------------------------------------------------------------------
+//
+bool NotepadUtil::IsLittleEndianUnicodeText(TDesC8& aText)
+    {
+    if (( aText.Length() >= 2) && ( aText[0] == 0xff && aText[1] == 0xfe ) )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::IsUTF8Text
+// -----------------------------------------------------------------------------
+//
+bool NotepadUtil::IsUTF8Text(TDesC8& aText)
+    {
+    if ( (aText.Length() >= 3) &&
+       ( aText[0] == 0xef && aText[1] == 0xbb && aText[2] == 0xbf ) )
+        {
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::IsShiftJisText
+// -----------------------------------------------------------------------------
+//
+bool NotepadUtil::IsShiftJisText(TDesC8& aText)
+    {
+    TInt maxlength = aText.Length();//(aText.Length() < 10 ? aText.Length() : 10);
+
+    if(maxlength < 2)
+        {
+        return EFalse;
+        }
+    TInt charsneeded = ((maxlength / 6 > 0 ? (maxlength/6) : 1));
+    TInt charcount = 0;
+
+    for(TInt i = 0; i+1 < maxlength ; i++)
+        {
+        if(IsShiftJisChar(aText[i], aText[i+1]))
+            {
+            charcount += 1;
+            i++; // Skip the second byte so its not re-checked.
+            if (charcount >= charsneeded)
+                {
+                return ETrue;
+                }
+            }
+        }
+
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// NotepadUtil::IsShiftJisChar
+// -----------------------------------------------------------------------------
+//
+bool NotepadUtil::IsShiftJisChar(const TUint& aFirst, const TUint& aSecond)
+    {
+    if (  // Type 1 
+        ( (129 <= aFirst && aFirst <= 159) && 
+        ( 64 <= aSecond && aSecond <= 158 && aSecond != 127) 
+        ||  // Type 2
+        ( (224 <= aFirst && aFirst <= 239) && 
+        ( 64 <= aSecond && aSecond <= 158 && aSecond != 127) )
+        ||  // Type 3
+        ( (129 <= aFirst && aFirst <= 159) && 
+        (159 <= aSecond && aSecond <= 252) )
+        ||  // Type 4
+        ( (224 <= aFirst && aFirst <= 239) && 
+        (159 <= aSecond && aSecond <= 252) )
+        ) )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+TUint NotepadUtil::GuessEncodingFromLanguage()
+    {
+    TLanguage language = User::Language();
+
+    return GetISO8859Variant(language);
+    }
+
+TUint NotepadUtil::GetISO8859Variant(TLanguage aLanguage)
+    {  
+    switch (aLanguage)
+        {
+        case ELangEnglish:
+        case ELangCatalan:
+        case ELangDanish:
+        case ELangGerman:
+        case ELangIcelandic:
+        case ELangIrish:
+        case ELangItalian:
+        case ELangNorwegian:
+        case ELangPortuguese:
+        case ELangSpanish:
+        case ELangAlbanian:
+        case ELangAfrikaans:
+        case ELangSwahili:
+        case ELangSwedish:
+        case ELangFinlandSwedish:
+            return KCharacterSetIdentifierIso88591;
+
+        case ELangPolish:
+        case ELangCzech:
+        case ELangSlovak:
+        case ELangSlovenian:
+        case ELangHungarian:
+            return KCharacterSetIdentifierIso88592;
+
+        case ELangEstonian:
+        case ELangLatvian:
+        case ELangLithuanian:
+            return KCharacterSetIdentifierIso88594;
+
+        case ELangBulgarian:
+        case ELangMacedonian:
+        case ELangRussian:
+        case ELangSerbian:
+        case ELangUkrainian:
+            return KCharacterSetIdentifierIso88595;
+
+        case ELangArabic:
+            return KCharacterSetIdentifierIso88596;
+
+        case ELangGreek:
+        case ELangCyprusGreek:
+            return KCharacterSetIdentifierIso88597;
+
+        case ELangHebrew:
+            return KCharacterSetIdentifierIso88598;
+
+        case ELangTurkish:
+            return KCharacterSetIdentifierIso88599;
+
+        case ELangScotsGaelic:
+        case ELangWelsh:
+            return KCharacterSetIdentifierIso885914;
+
+        case ELangFrench:
+        case ELangFinnish:
+            return KCharacterSetIdentifierIso885915;
+
+        default:
+            return 0;
+        }
+    }
+
+// End of File