uiacceltk/hitchcock/Client/src/alflayoutmetrics.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/Client/src/alflayoutmetrics.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,713 @@
+/*
+* Copyright (c) 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:   Layout metrics
+*
+*/
+
+
+
+#include "alf/alflayoutmetrics.h"
+#include "alf/alftextstylemanager.h"
+#include "alf/alftextstyle.h"
+#include "alf/alftextvisual.h"
+#include "alf/alfvisual.h"
+#include "alf/alfutil.h"
+#include "alf/alfenv.h"
+#include "alfclient.h"
+
+#include <e32debug.h>
+#include <avkon.hrh>
+#include <flogger.h>
+#include <AknFontCategory.hrh>
+
+
+_LIT(KHeader,"Comp Type|id|variety|name|Alias|type|Width|Height|Left|Right|Top|Bottom|Remarks|parent_id|parent_variety|Multi Row|Number of rows|style 1|style 2|style 3|Concatenated rows");
+_LIT(KDelimeterChar,"|");
+_LIT(KTypeText,"Text");
+_LIT(KTypePane,"Pane");
+_LIT(KVariety,"0");
+_LIT(KFontPrimary,"qfn_primary");
+_LIT(KFontPrimarySmall,"qfn_primary_small"); 
+_LIT(KFontSecondary,"qfn_secondary");
+_LIT(KFontTitle,"qfn_title");
+_LIT(KFontDigital,"qfn_digital");
+_LIT(KFontEmpty," ");
+_LIT(KFontUnknown,"unknown font");
+_LIT(KRemarks," ");
+_LIT(KParentVariety,"0");
+_LIT(KMultiRowYes,"true");
+_LIT(KMultiRowNo,"-");
+_LIT(KNumberOfRowsNone,"-");
+_LIT(KStyle1Plain,"plain");
+_LIT(KStyle1Bold,"bold");
+_LIT(KStyle1Empty,"-");
+_LIT(KStyle2Regular,"regular");
+_LIT(KStyle2Italic,"italic");
+_LIT(KStyle2Empty,"-");
+_LIT(KStyle3None,"none");
+_LIT(KStyle3Empty,"-");
+_LIT(KStyleConcatenatedRowsDefault,"true");
+_LIT(KStyleConcatenatedRowsEmpty,"-");
+_LIT(KNewLine,"\n");
+_LIT(KReportFileNameDefaultStart, "\\pqp_apps_"); 
+_LIT(KReportFileNameDefaultLscEnd, "_lsc.txt"); 
+_LIT(KReportFileNameDefaultPrtEnd, "_prt.txt"); 
+
+
+
+const TInt KParentIdStart = 200000;
+const TInt KIdStart = 100000;
+
+
+struct TMarkedVisualEntry
+    {    
+    public:
+    	~TMarkedVisualEntry()
+        {
+        }
+    	TMarkedVisualEntry(): 
+    	    iLogicalName(NULL), 
+    	    iAlias(NULL),
+    	    iVisual(NULL),
+    	    iTextSize(0,0),
+    	    iMaxLineCount(0),
+    	    iFontId(0),
+    	    iTextStyle(EAlfTextStyleNotAHuiStyle),
+    	    iVisualPosition(0,0),
+    	    iVisualSize(0,0)                                           
+        {                            
+        }
+    
+    HBufC* iLogicalName; 
+    HBufC* iAlias; 
+    CAlfTextVisual* iVisual;
+    TSize iTextSize;
+    TInt iMaxLineCount;
+    TInt iFontId;
+    TAlfPreconfiguredTextStyle iTextStyle;
+    TPoint iVisualPosition;
+    TPoint iVisualSize;
+    };
+
+struct CAlfLayoutMetricsUtility::TMetricsPrivateData
+    {
+    RArray<TMarkedVisualEntry> iEntries; // Owned
+    TBool iAutoMarking;
+    CAlfEnv* iEnv;
+    };
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CAlfLayoutMetricsUtility::CAlfLayoutMetricsUtility()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CAlfLayoutMetricsUtility::~CAlfLayoutMetricsUtility()
+    {
+    if ( iMetricsData )
+        {
+        TInt count = iMetricsData->iEntries.Count();
+        for(TInt i = 0; i < count; i++)
+          	{
+          	delete iMetricsData->iEntries[i].iLogicalName;
+          	iMetricsData->iEntries[i].iLogicalName = NULL;
+        	
+        	delete iMetricsData->iEntries[i].iAlias;
+        	iMetricsData->iEntries[i].iAlias = NULL;
+        	}
+        iMetricsData->iEntries.Close();   
+        }
+        
+    delete iMetricsData;
+    iMetricsData = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+CAlfLayoutMetricsUtility* CAlfLayoutMetricsUtility::NewL(CAlfEnv& aEnv)
+	{
+	CAlfLayoutMetricsUtility* self = 
+		CAlfLayoutMetricsUtility::NewLC(aEnv);        
+    CleanupStack::Pop( self );
+    return self;		
+	}
+	
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+CAlfLayoutMetricsUtility* CAlfLayoutMetricsUtility::NewLC(CAlfEnv& aEnv)
+	{
+    CAlfLayoutMetricsUtility* self = new( ELeave ) CAlfLayoutMetricsUtility;
+    CleanupStack::PushL( self );
+    self->ConstructL(aEnv);
+    return self;	
+	}
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+void CAlfLayoutMetricsUtility::ConstructL(CAlfEnv& aEnv)
+	{
+    iMetricsData = new (ELeave) TMetricsPrivateData;
+    iMetricsData->iAutoMarking = EFalse;
+    iMetricsData->iEnv = &aEnv;
+	}
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfLayoutMetricsUtility::MarkVisual(TDesC* aLogicalName, 
+    CAlfTextVisual* aVisual)
+    {
+    TRAP_IGNORE(MarkVisualL(aLogicalName, aVisual))
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CAlfLayoutMetricsUtility::MarkVisualL(TDesC* aLogicalName, 
+    CAlfTextVisual* aVisual)
+    {
+    TInt count = iMetricsData->iEntries.Count();
+    for(TInt i = 0; i < count; i++)
+      	{
+      	if (aVisual == iMetricsData->iEntries[i].iVisual)
+      	    {
+          	delete iMetricsData->iEntries[i].iLogicalName;
+          	iMetricsData->iEntries[i].iLogicalName = NULL;
+        	
+        	delete iMetricsData->iEntries[i].iAlias;
+        	iMetricsData->iEntries[i].iAlias = NULL;
+
+            iMetricsData->iEntries.Remove(i);
+            break;      	        
+      	    }
+    	}
+
+    TMarkedVisualEntry entry;
+    if (aLogicalName)
+        {
+        entry.iLogicalName = aLogicalName->AllocL();        
+        }
+    
+    entry.iVisual = aVisual;
+    iMetricsData->iEntries.Append(entry);        
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfLayoutMetricsUtility::UnmarkVisual(CAlfTextVisual* aVisual)
+    {
+    TInt count = iMetricsData->iEntries.Count();
+    for(TInt i = 0; i < count; i++)
+      	{
+      	if (aVisual == iMetricsData->iEntries[i].iVisual)
+      	    {
+          	delete iMetricsData->iEntries[i].iLogicalName;
+          	iMetricsData->iEntries[i].iLogicalName = NULL;
+        	
+        	delete iMetricsData->iEntries[i].iAlias;
+        	iMetricsData->iEntries[i].iAlias = NULL;
+            
+            iMetricsData->iEntries.Remove(i);
+            break;      	        
+      	    }
+    	}
+        
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfLayoutMetricsUtility::MeasureVisuals()
+    {
+    TRAP_IGNORE(MeasureVisualsL())
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CAlfLayoutMetricsUtility::MeasureVisualsL()
+    {
+    TInt count = iMetricsData->iEntries.Count();
+    for(TInt i = 0; i < count; i++)
+      	{
+      	CAlfTextVisual* visual = iMetricsData->iEntries[i].iVisual;
+    	if (visual->EffectiveOpacity() > 0.0)
+    	    {
+        	iMetricsData->iEntries[i].iTextSize = 
+        	    TSize(visual->Size().IntValueNow().iX - visual->HorizontalPadding()*2, 
+        	    visual->TextExtents().iHeight);        	
+        	
+        	iMetricsData->iEntries[i].iMaxLineCount = visual->MaxLineCount();    	        
+    	    // iMetricsData->iEntries[i].iFontId = visual->FontId();
+    	    // CAlfTextVisual::FontId() has been deprecated for long and returns only zero.
+    	    iMetricsData->iEntries[i].iFontId = 0;
+    	    iMetricsData->iEntries[i].iTextStyle = visual->Style();      	        
+    	    iMetricsData->iEntries[i].iVisualPosition = visual->Pos().IntValueNow();
+    	    iMetricsData->iEntries[i].iVisualPosition.iX += visual->HorizontalPadding(); 
+    	    iMetricsData->iEntries[i].iVisualSize = visual->Size().IntValueNow();
+    	    iMetricsData->iEntries[i].iVisualSize.iX -= visual->HorizontalPadding(); 
+
+        	delete iMetricsData->iEntries[i].iAlias;
+        	iMetricsData->iEntries[i].iAlias = NULL;
+            iMetricsData->iEntries[i].iAlias = visual->Text().AllocL();                 
+
+            if (!iMetricsData->iEntries[i].iLogicalName)
+                {
+                iMetricsData->iEntries[i].iLogicalName = visual->Text().AllocL();         
+                }
+                
+            // If max linecount has not been set to textvisual, 
+            // we kindly here calculate it.    
+            if (iMetricsData->iEntries[i].iMaxLineCount > 1)
+                {
+                if (iMetricsData->iEntries[i].iMaxLineCount == KMaxTInt && 
+                    iMetricsData->iEntries[i].iTextSize.iHeight)
+                    {                
+                    iMetricsData->iEntries[i].iMaxLineCount = 
+                        iMetricsData->iEntries[i].iVisualSize.iY/iMetricsData->iEntries[i].iTextSize.iHeight;
+                    }
+                }
+    	    }
+    	}        
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfLayoutMetricsUtility::EnableAutoMarking(TBool aEnabled)
+    {
+    iMetricsData->iAutoMarking = aEnabled;        
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CAlfLayoutMetricsUtility::AutoMarking()
+    {
+    return iMetricsData->iAutoMarking;                
+    }
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAlfLayoutMetricsUtility::WriteReport()
+    {  	   	
+   	TBuf<512> b;
+    
+    b.Zero();
+    b.Append(KHeader);
+    b.Append(KNewLine);    
+    
+    PrintToFile(b);
+
+    TInt count = iMetricsData->iEntries.Count();
+    for(TInt i = 0; i < count; i++)
+      	{
+  	    TMarkedVisualEntry e = iMetricsData->iEntries[i];
+
+        TSize screensize = AlfUtil::ScreenSize();
+        
+        const TDesC* multiRow = &KMultiRowNo;
+    	TBuf<12> rows;
+        rows.Zero();
+    	
+        if (e.iMaxLineCount > 1)
+            {
+            multiRow = &KMultiRowYes;
+            rows.AppendNum(e.iMaxLineCount);        
+            }
+        else
+            {
+            rows.Append( KNumberOfRowsNone );    
+            }    
+
+
+    	TBuf<64> font;
+        font.Zero();
+
+    	TBuf<64> style1;
+        style1.Zero();
+
+    	TBuf<64> style2;
+        style2.Zero();
+
+    	TBuf<64> style3;
+        style3.Zero();
+        
+        if (e.iFontId)
+            {
+            // We use secret knowledge to decode font id
+        	const TUint encodedMask = 0x80000000; // 1 bits starting at bit 31 = 1000.0000.0000.0000.0000.0000.0000.0000
+        	const TUint categoryMask = 0x0000000F; // 4 bits starting at bit 0 = 0000.0000.0000.0000.0000.0000.0000.1111
+        	const TUint weightMask = 0x00000010; // 1 bits starting at bit 4 = 0000.0000.0000.0000.0000.0000.0001.0000
+        	const TUint postureMask = 0x00000020; // 1 bits starting at bit 5 = 0000.0000.0000.0000.0000.0000.0010.0000        
+
+            if ((e.iFontId & encodedMask) != 0)
+                {
+                TInt category = (e.iFontId & categoryMask);
+                    {
+                    if (category == KAknFontCategoryPrimary)
+                        {
+                        font.Append(KFontPrimary);                                                                                                                                        
+                        }
+                    else if (category == KAknFontCategorySecondary)
+                        {
+                        font.Append(KFontSecondary);                                                                                                            
+                        }
+                    else if (category == KAknFontCategoryTitle)
+                        {
+                        font.Append(KFontTitle);                                                                                
+                        }
+                    else if (category == KAknFontCategoryPrimarySmall)
+                        {
+                        font.Append(KFontPrimarySmall);                                                    
+                        }
+                    else if (category == KAknFontCategoryDigital)
+                        {
+                        font.Append(KFontDigital);                        
+                        }
+                    else
+                        {
+                        font.Append(KFontUnknown);                                                
+                        }                            
+                    }
+                
+                TInt weight = (e.iFontId & weightMask) >> 4;
+                if (weight == EStrokeWeightBold)
+                    {
+                    style1.Append(KStyle1Bold);                                                
+                    }
+                else
+                    {
+                    style1.Append(KStyle1Plain);                        
+                    }    
+                
+                TInt posture = (e.iFontId & postureMask) >> 5;
+                if (posture == EPostureItalic)
+                    {
+                    style2.Append(KStyle2Italic);                        
+                    }
+                else
+                    {                    
+                    style2.Append(KStyle2Regular);
+                    }    
+                                    
+                style3.Append(KStyle3None);                    
+                }
+            else
+                {
+                font.Append(KFontUnknown);                    
+                style1.Append(KStyle1Plain);
+                style2.Append(KStyle2Regular);
+                style3.Append(KStyle3None);                    
+                }
+            }
+        else
+            {
+            TInt fontStyleId = 0;
+            iMetricsData->iEnv->Client().LayoutMetricsTextStyleData(fontStyleId, e.iTextStyle);
+
+            CAlfTextStyleManager* tsm = &iMetricsData->iEnv->TextStyleManager();                                
+            CAlfTextStyle* ts = tsm->TextStyle(e.iTextStyle);
+
+            if (ts->IsBold())
+                {
+                style1.Append(KStyle1Bold);                        
+                }
+            else
+                {                        
+                style1.Append(KStyle1Plain);
+                }
+
+            if (ts->IsItalic())
+                {
+                style2.Append(KStyle2Italic);                        
+                }
+            else
+                {
+                style2.Append(KStyle2Regular);                        
+                }    
+                    
+            style3.Append(KStyle3None);
+
+            switch (fontStyleId)
+                {                                
+                case EAknLogicalFontPrimaryFont:
+                    {
+                    font.Append(KFontPrimary);
+                    break;    
+                    }
+                case EAknLogicalFontSecondaryFont:
+                    {
+                    font.Append(KFontSecondary);                    
+                    break;    
+                    }
+                case EAknLogicalFontTitleFont:
+                    {
+                    font.Append(KFontTitle);                                        
+                    break;    
+                    }
+                case EAknLogicalFontPrimarySmallFont:
+                    {
+                    font.Append(KFontPrimarySmall);
+                    break;    
+                    }
+                case EAknLogicalFontDigitalFont:
+                    {
+                    font.Append(KFontDigital);                    
+                    break;    
+                    }
+                default:
+                    {
+                    font.Append(KFontPrimary);                    
+                    break;    
+                    }                                                                                      
+                }    
+            }
+
+    	b.Zero();
+        b.Append( KTypeText );    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( i + KIdStart );    
+        b.Append( KDelimeterChar );    
+        b.Append( KVariety );    
+        b.Append( KDelimeterChar );    
+        b.Append( (_L("%S"), *e.iLogicalName));    
+        b.Append( KDelimeterChar );    
+        b.Append( (_L("%S"), *e.iAlias));    
+        b.Append( KDelimeterChar );    
+        b.Append( font );    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( e.iTextSize.iWidth );    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( e.iTextSize.iHeight );    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( e.iVisualPosition.iX );    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( screensize.iWidth - e.iVisualPosition.iX - e.iVisualSize.iX );    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( e.iVisualPosition.iY );    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( screensize.iHeight -  e.iVisualPosition.iY - e.iVisualSize.iY );    
+        b.Append( KDelimeterChar );    
+        b.Append( KRemarks );    
+        b.Append( KDelimeterChar );    
+        if (e.iMaxLineCount > 1)
+            {
+            b.AppendNum( i + KParentIdStart );        
+            }
+        else
+            {
+            b.Append( KParentVariety );                    
+            }    
+        b.Append( KDelimeterChar );    
+        b.AppendNum( 0 );    // Parent variety, always 0
+        b.Append( KDelimeterChar );    
+	    b.Append( KMultiRowNo ); // Multi row attribute is in the parent pane
+        b.Append( KDelimeterChar );    
+	    b.Append( KNumberOfRowsNone ); // Number of rows attribute is in the parent pane
+        b.Append( KDelimeterChar );    
+        b.Append( style1 );    
+        b.Append( KDelimeterChar );    
+        b.Append( style2 );    
+        b.Append( KDelimeterChar );    
+        b.Append( style3 );    
+        b.Append( KDelimeterChar );    
+        b.Append( KStyleConcatenatedRowsDefault );    
+        b.Append( KNewLine );    
+
+        PrintToFile(b);
+
+        // For multirow texts a parent pane is needed.
+        if (e.iMaxLineCount > 1)
+            {
+            b.Zero(); 
+            b.Append( KTypePane );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum( i + KParentIdStart );    
+            b.Append( KDelimeterChar );    
+            b.Append( KVariety );    
+            b.Append( KDelimeterChar );    
+            b.Append( (_L("%S"), *e.iLogicalName));    
+            b.Append( _L("_parent_pane"));    
+            b.Append( KDelimeterChar );    
+            b.Append( _L("Parent pane for "));    
+            b.Append( (_L("%S"), *e.iLogicalName));    
+            b.Append( _L(" (multirow text)"));                
+            b.Append( KDelimeterChar );    
+            b.Append( KFontEmpty );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum( e.iTextSize.iWidth );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum(e.iVisualSize.iY );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum( e.iVisualPosition.iX );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum( screensize.iWidth - e.iVisualPosition.iX - e.iVisualSize.iX );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum( e.iVisualPosition.iY );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum( screensize.iHeight -  e.iVisualPosition.iY - e.iVisualSize.iY );    
+            b.Append( KDelimeterChar );    
+            b.Append( KRemarks );    
+            b.Append( KDelimeterChar );    
+            b.AppendNum( 0 );    
+            b.Append( KDelimeterChar );    
+            b.Append( KParentVariety );    
+            b.Append( KDelimeterChar );    
+    	    b.Append( *multiRow );
+            b.Append( KDelimeterChar );    
+    	    b.Append( rows );
+            b.Append( KDelimeterChar );    
+            b.Append( KStyle1Empty );    
+            b.Append( KDelimeterChar );    
+            b.Append( KStyle2Empty );    
+            b.Append( KDelimeterChar );    
+            b.Append( KStyle3Empty );    
+            b.Append( KDelimeterChar );    
+            b.Append( KStyleConcatenatedRowsEmpty );    
+            b.Append( KNewLine );                    
+            PrintToFile(b);
+            }
+    	}        
+    }
+    
+
+// ---------------------------------------------------------------------------
+// ?description
+// ---------------------------------------------------------------------------
+//
+void CAlfLayoutMetricsUtility::PrintToFile( TDesC16& aBuf )
+    {
+    RFs fs;
+   	TBuf<512> filename;
+    filename.Zero();
+    TSize screensize = AlfUtil::ScreenSize();
+    filename.Append( KReportFileNameDefaultStart );
+    if (screensize == TSize(240,320))
+        {
+        filename.Append(_L("qvga"));    
+        filename.Append(KReportFileNameDefaultPrtEnd);
+        }
+    else if (screensize == TSize(320,240))
+        {
+        filename.Append(_L("qvga"));    
+        filename.Append(KReportFileNameDefaultLscEnd);            
+        }
+    else if (screensize == TSize(480,640))
+        {
+        filename.Append(_L("vga"));    
+        filename.Append(KReportFileNameDefaultPrtEnd);                                    
+        }
+    else if (screensize == TSize(640,480))
+        {
+        filename.Append(_L("vga"));    
+        filename.Append(KReportFileNameDefaultLscEnd);                        
+        }
+    else if (screensize == TSize(360,640))
+        {
+        filename.Append(_L("qhd"));    
+        filename.Append(KReportFileNameDefaultPrtEnd);                                    
+        }
+    else if (screensize == TSize(640,360))
+        {
+        filename.Append(_L("qhd"));    
+        filename.Append(KReportFileNameDefaultLscEnd);                        
+        }
+    else if (screensize == TSize(320,480))
+        {
+        filename.Append(_L("hvga"));    
+        filename.Append(KReportFileNameDefaultPrtEnd);                                    
+        }
+    else if (screensize == TSize(480,320))
+        {
+        filename.Append(_L("hvga"));    
+        filename.Append(KReportFileNameDefaultLscEnd);                        
+        }
+    else
+        {
+        filename.AppendNum(screensize.iWidth);    
+        filename.Append(_L("x"));    
+        filename.AppendNum(screensize.iHeight);    
+        if (screensize.iWidth < screensize.iHeight)
+            {
+            filename.Append(KReportFileNameDefaultPrtEnd);                                                    
+            }
+        else
+            {
+            filename.Append(KReportFileNameDefaultLscEnd);                                                                    
+            }                
+        }    
+        
+    
+    if ( fs.Connect() == KErrNone )
+        {
+        RFile file;
+
+        // Open file in an exclusive mode so that only one thread 
+        // can acess it simultaneously
+        TUint fileMode = EFileWrite | EFileShareExclusive;
+       
+        TInt err = file.Open( fs, filename, fileMode );
+
+        // Create a file if it doesn't exist
+        if ( err == KErrNotFound )
+            {
+            err = file.Create( fs, filename, fileMode );
+            }
+
+        // Check if we have access to a file
+        if ( err == KErrNone )
+            {
+            TInt offset = 0;
+            if ( file.Seek( ESeekEnd, offset ) == KErrNone )
+                {
+                // Append text to the end of file
+                TPtr8 ptr8( (TUint8*)aBuf.Ptr(), aBuf.Size(), aBuf.Size() );
+                file.Write( ptr8 );
+                }
+            file.Close();
+            }
+
+        fs.Close();
+        }
+    }
+
+
+