landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp44.cpp
branchRCL_3
changeset 44 2b4ea9893b66
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarks/locationlandmarks/tsrc/LandmarkTestModule/src/FT_CPosTp44.cpp	Tue Aug 31 15:37:04 2010 +0300
@@ -0,0 +1,730 @@
+/*
+* Copyright (c) 2005 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: 
+*   ?description_line
+*
+*/
+
+
+//  INCLUDES
+
+#include "FT_CPosTp44.h"
+#include <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLMCategoryManager.h>
+#include <EPos_CPosLandmarkEncoder.h>
+#include <e32std.h>
+#include <bautils.h>
+
+_LIT8(KNonExistingMimeType1, "Application/vnd.nokia.landmarkcollection+xml");
+_LIT8(KNonExistingMimeType2, "application/vnd.nokia.kokoibollen");
+_LIT8(KEmptyMimeType, "");
+_LIT(KFileName, "c:\\documents\\SomeDummyFile.xml");
+_LIT(KFileName2, "c:\\documents\\SomeDummyFile2.xml");
+_LIT(KFileName3, "c:\\documents\\SomeDummyFile3.xml");
+_LIT(KFileName4, "c:\\documents\\SomeDummyFile4.xml");
+_LIT(KFileName5, "c:\\documents\\SomeDummyFile5.xml");
+_LIT(KFileName6, "c:\\documents\\SomeDummyFile6.xml");
+_LIT(KFileName7, "c:\\documents\\SomeDummyFile7.xml");
+_LIT(KFileName8, "c:\\documents\\SomeDummyFile8.xml");
+_LIT(KFileName9, "c:\\documents\\SomeDummyFile9.xml");
+_LIT(KFileName9a, "c:\\documents\\SomeDummyFile9a.xml");
+_LIT(KFileName10, "c:\\documents\\SomeDummyFile10.xml");
+_LIT(KFileName11, "c:\\documents\\SomeDummyFile11.xml");
+_LIT(KFileName12, "c:\\documents\\SomeDummyFile12.xml");
+_LIT(KFileName13, "c:\\documents\\SomeDummyFile13.xml");
+_LIT(KFileName14, "c:\\documents\\SomeDummyFile14.xml");
+_LIT(KFileName15, "c:\\documents\\SomeDummyFile15.xml");
+_LIT(KFileName16, "c:\\documents\\SomeDummyFile16.xml");
+_LIT(KFileName17, "c:\\documents\\SomeDummyFile17.xml");
+_LIT(KFileName18, "c:\\documents\\SomeDummyFile18.xml");
+
+
+
+// More than 255 characters
+_LIT(KLongFileName, "c:\\SomeDummeFilewithVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongVeryLongFileName.xml");
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// ---------------------------------------------------------
+// CPosTp44::StartL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp44::StartL()
+    {
+
+    BaflUtils::EnsurePathExistsL( iFileSession, KFileName );
+    
+    MakeSurePanicDebugFileExistsL();
+    // Use same lm db as in composite search test
+    iDatabase = UseCompositeLandmarksDbFileL();   
+    if (iDatabase->IsInitializingNeeded())
+       {
+       ExecuteAndDeleteLD(iDatabase->InitializeL());
+       }
+
+    delete iDatabase;
+    iDatabase = NULL;
+    iDatabase = CPosLandmarkDatabase::OpenL();
+    	
+    if (iDatabase->IsInitializingNeeded())
+       {
+       ExecuteAndDeleteLD(iDatabase->InitializeL());
+       }
+    // Do reset so that global categories are included
+    CPosLmCategoryManager* categoryManager = CPosLmCategoryManager::NewL(*iDatabase);
+    CleanupStack::PushL(categoryManager);   
+    ExecuteAndDeleteLD(categoryManager->ResetGlobalCategoriesL());
+    CleanupStack::PopAndDestroy(categoryManager);
+
+    // <<<<<<<<<<<<<<Panic testing below>>>>>>>>>>>>>>>>>>>
+    iLog->Log(_L(">>>>>>>Start Panic test<<<<<<<<<"));
+       
+    iExpectedExitType = ExitPanic;
+    // Add collection data after landmarks has been added to encoder
+    iLog->Log(_L("Panic test 1"));
+//    DeleteFileL(KFileName);
+    iTestCase = 1;
+    iExpectedErrorCode = EPosLmProtocolBreak;
+    ResumeThreadAndVerifyExit();
+
+    // Add collection data after landmarks has been added to encoder
+    iLog->Log(_L("Panic test 2"));
+    //DeleteFileL(KFileName);
+    iTestCase = 2;
+    iExpectedErrorCode = EPosLmProtocolBreak;
+    ResumeThreadAndVerifyExit();
+
+    // Try to use encoder after finalization
+    iLog->Log(_L("Panic test 3"));
+    //DeleteFileL(KFileName);
+    iTestCase = 3;
+    iExpectedErrorCode = EPosLmProtocolBreak;
+    ResumeThreadAndVerifyExit();
+
+    // 4 The client deletes the operation object before the encoding has been 
+    // finalized and then tries to use the encoder object.Should cause Panic and FileLock should have been released
+    iLog->Log(_L("Panic test 4"));
+    //DeleteFileL(KFileName);
+    iTestCase = 4;
+    iExpectedErrorCode = EPosLmProtocolBreak;
+    ResumeThreadAndVerifyExit();
+    // Check that fileLock has been released
+    RFile file;
+    CleanupClosePushL(file);
+    // Make sure that file exist
+    TInt err = file.Open(iFileSession, KFileName, EFileShareAny);
+    if (err != KErrNone) //LogErrorAndLeave(_L("File should be able to open"));
+    {
+    iLog->Log(_L("File should be able to open"));
+    User::Leave(err);
+
+    }
+    CleanupStack::PopAndDestroy(&file);
+    iLog->Log(_L("FileLock has been released"));
+
+    // 5 The client tries to specify a collection id already added. Should cause a leave with -11
+    iLog->Log(_L("Leave test 5"));
+//    DeleteFileL(KFileName);
+    iTestCase = 5;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrAlreadyExists;
+    ResumeThreadAndVerifyExit();
+
+    // 6 The client tries to specify a mime type that does not exist. Should cause a leave with KErrNotSupported
+    iLog->Log(_L("Leave test 6"));
+//    DeleteFileL(KFileName);
+    iTestCase = 6;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrNotSupported;
+    ResumeThreadAndVerifyExit();
+    
+    // 7 The client tries to specify a output file that already exists. Shoule leave with KErrAlreadyExists
+    iLog->Log(_L("Leave test 7"));
+    iTestCase = 7;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrAlreadyExists;
+    ResumeThreadAndVerifyExit();
+
+    // 8 The client only specifies a collection and then finalize the encoding.
+    iLog->Log(_L("Panic test 8"));
+//    DeleteFileL(KFileName);
+    iTestCase = 8;
+    iExpectedExitType = ExitPanic;
+    iExpectedErrorCode = EPosLmProtocolBreak;
+    ResumeThreadAndVerifyExit();
+
+    // 9a Export landmark with nonexisting id (positive id), should leave with KErrNotFound
+    iLog->Log(_L("Panic test 9a"));
+//    DeleteFileL(KFileName);
+    iTestCase = 9;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrNotFound;
+    ResumeThreadAndVerifyExit();
+
+    // 9b Export landmark with nonexisting id (negative id), should leave with KErrNotFound
+    iLog->Log(_L("Leave test 9b"));
+//    DeleteFileL(KFileName);
+    iTestCase = 10;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrNotFound;
+    ResumeThreadAndVerifyExit();
+
+    // 10 Delete export object before completion and then finalize
+    iLog->Log(_L("Leave test 10"));
+//    DeleteFileL(KFileName);
+    iTestCase = 11;
+    iExpectedExitType = ExitPanic;
+    iExpectedErrorCode = EPosLmProtocolBreak;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrNone;
+    ResumeThreadAndVerifyExit();
+
+    // 11 The client creates an encoder and by using the Landmark API 
+    // tries to export landmarks with invalid transfer option. Should cause Panic
+    iLog->Log(_L("Panic test 11"));
+//    DeleteFileL(KFileName);
+    iTestCase = 12;
+    iExpectedExitType = ExitPanic;
+    iExpectedErrorCode = EPosLmInvalidArgument;
+    ResumeThreadAndVerifyExit();
+
+    // 12 The client creates an encoder by using the file option and 
+    // adds some landmarks but instead of finalizing the encoding a new file is set.
+    iLog->Log(_L("Leave test 12"));
+//    DeleteFileL(KFileName);
+//    DeleteFileL(KFileName2);
+    iTestCase = 13;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrNone;
+    ResumeThreadAndVerifyExit();
+
+    // 13 The client creates an encoder by using the file option and 
+    // adds a collection data with EPosLmCollDataNone, should Panic with EPosLmInvalidArgument
+    iLog->Log(_L("Leave test 13"));
+//    DeleteFileL(KFileName);
+//    DeleteFileL(KFileName2);
+    iTestCase = 14;
+    iExpectedExitType = ExitPanic;
+    iExpectedErrorCode = EPosLmInvalidArgument;
+    ResumeThreadAndVerifyExit();
+
+    // 14 The client tries to specify a mime type that does not exist. Should cause a leave with KErrNotSupported
+    // the mime type name is similar to KLmxMimeType but contains capital letters
+    iLog->Log(_L("Leave test 14"));
+//    DeleteFileL(KFileName);
+    iTestCase = 15;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrNotSupported;
+    ResumeThreadAndVerifyExit();
+    
+    // 15 The client creates an encoder and by using the Landmark API 
+    // tries to export landmarks with invalid transfer option. Should cause Panic
+    iLog->Log(_L("Panic test 15"));
+//    DeleteFileL(KFileName);
+    iTestCase = 16;
+    iExpectedExitType = ExitPanic;
+    iExpectedErrorCode = EPosLmInvalidArgument;
+    ResumeThreadAndVerifyExit();
+    
+    // 16 Export landmark with empty subset of ids, should leave with KErrArgument
+    iLog->Log(_L("Leave test 16"));
+//    DeleteFileL(KFileName);
+    iTestCase = 17;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrArgument;
+    ResumeThreadAndVerifyExit();
+
+#if 0
+    // 17 Try to create encoder with empty mime type
+    // TE: the REComSession::CreateImplementationL( leaves with KErrArgument which I think is acceptable
+    // Nokia: This is not part of API definition, case removed
+    iLog->Log(_L("Leave test 17"));
+//    DeleteFileL(KFileName);
+    iTestCase = 18;
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrArgument;
+    ResumeThreadAndVerifyExit();
+#endif    
+
+#ifdef __WINS__    
+    // 18 Try to create encoder with a very long file name and export one landmark
+    iLog->Log(_L("Leave test 18"));
+    iTestCase = 19;
+
+    iExpectedExitType = ExitLeave;
+    iExpectedErrorCode = KErrBadName;
+
+    ResumeThreadAndVerifyExit();
+#endif    
+    iLog->Log(_L(">>>>>>>Panic test Done<<<<<<<<<"));
+    }
+
+// ---------------------------------------------------------
+// CPosTp44::ResumeThreadAndVerifyExit
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp44::ResumeThreadAndVerifyExit()
+    {
+    iLog->Log(_L("ResumeThreadAndVerifyExit"));
+    _LIT(KPanicErr, "Method didn't Panic when expected"); 
+    _LIT(KPanicCodeErr, "Paniced with unexpected panic code");
+    _LIT(KLeaveErr, "Method didn't end correctly"); 
+    _LIT(KLeaveCodeErr, "Unexpected leave error");
+
+    CreateThreadL();
+    TRequestStatus status;
+    iThread.Logon(status);
+    iThread.Resume();
+    User::WaitForRequest(status);
+        
+    
+    // Used for debugging
+    TBuf<100> buf;
+    buf.Format(_L("ExitType %d Exit reason %d"), iThread.ExitType(), iThread.ExitReason());
+    iLog->Log(buf);
+
+    if (iExpectedExitType == ExitPanic)
+        {
+        AssertTrueSecL(iThread.ExitType() == EExitPanic, KPanicErr);
+        AssertTrueSecL(iThread.ExitReason() == iExpectedErrorCode, KPanicCodeErr);
+        }
+    else if (iExpectedExitType == ExitLeave)
+        {
+        AssertTrueSecL(iThread.ExitType() == EExitKill, KLeaveErr);
+        AssertTrueSecL(iThread.ExitReason() == iExpectedErrorCode, KLeaveCodeErr);
+        }
+       
+    iThread.Close();
+    }
+
+// ---------------------------------------------------------
+// CPosTp44::CloseTest
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp44::CloseTest()
+    {
+    iLog->Log(_L("CloseTest"));
+    iThread.Close();
+
+    delete iDatabase;
+    iDatabase = NULL;
+    
+    iLog->Log(_L("CloseTest Done"));
+	}
+
+// ---------------------------------------------------------
+// CPosTp44::DeleteEncoderCallback
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//	
+TInt CPosTp44::DeleteEncoderCallback(TAny* aSelf)
+	{
+	CPosLandmarkEncoder* encoder = static_cast<CPosLandmarkEncoder*>(aSelf);
+	delete encoder;
+	return 0;
+	}
+	
+// ---------------------------------------------------------
+// CPosTp44::RunPanicTestL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+void CPosTp44::RunPanicTestL(TAny* aData)
+    {
+    CPosTp44* self = reinterpret_cast<CPosTp44*>(aData);
+
+     if (self->iTestCase == 1)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder *landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName);
+        // Add landmark to be encoded
+        CPosLandmark* lm = database->ReadLandmarkLC(1);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        // Add one more landmark to be encoded
+        lm = database->ReadLandmarkLC(2);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        // Add collection data after that landmarks has been added, should cause Panic
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 2)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName3);
+        CPosLmCategoryManager* categoryManager = CPosLmCategoryManager::NewL(*database);
+        CleanupStack::PushL(categoryManager);
+        CPosLandmarkCategory* landmarkCategory = categoryManager->ReadCategoryLC(1);
+        // Add one category when no landmark has been addded , should cause Panic        
+        landmarkEncoder->AddCategoryForLatestLandmarkL(*landmarkCategory);
+        CleanupStack::PopAndDestroy(landmarkCategory);
+        CleanupStack::PopAndDestroy(categoryManager);
+     }
+     else if (self->iTestCase == 3)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName4);
+        // Add landmark to be encoded
+        CPosLandmark* lm = database->ReadLandmarkLC(1);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        // Finalize
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        // Try to use encoder after finalization, should cause Panic
+        lm = database->ReadLandmarkLC(2);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        }
+     else if (self->iTestCase == 4)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName5);
+        // Add landmark to be encoded
+        CPosLandmark* lm = database->ReadLandmarkLC(1);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        // Finalize
+        CPosLmOperation* op = landmarkEncoder->FinalizeEncodingL();
+        delete op;
+        op = NULL;
+        // Try to use encoder after deletion of object, should cause Panic
+        lm = database->ReadLandmarkLC(2);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        }
+     else if (self->iTestCase == 5)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName6);
+        // Add collection data
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        // Add same collection data again, should cause leave
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName2"));
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 6)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        // Create encoder with invalid MIME type, should leave with KErrNotSupported
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KNonExistingMimeType2);
+        landmarkEncoder->SetOutputFileL(KFileName7);
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 7)
+        {
+         RFs fs;
+         RFile file;
+         User::LeaveIfError(fs.Connect());
+         CleanupClosePushL(fs);
+         CleanupClosePushL(file);
+         
+         // Make sure that file exist
+         TInt err = file.Create(fs, KFileName8, EFileShareAny);
+         // Should never happen
+         if (err != KErrNone) User::Leave(666);
+         
+         CleanupStack::PopAndDestroy(&file);
+         CleanupStack::PopAndDestroy(&fs);
+         
+         CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+         CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+         // Use same file for encoding, set output file should leave
+         landmarkEncoder->SetOutputFileL(KFileName8);
+         CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 8)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName9);
+        // Add collection data
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        // Finalize without adding any landmarks, should cause panic
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 9 || self->iTestCase == 10)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        if(self->iTestCase == 9) 
+            landmarkEncoder->SetOutputFileL(KFileName9a);
+        if(self->iTestCase == 10) 
+            landmarkEncoder->SetOutputFileL(KFileName10);
+        
+        // Add collection data
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        
+        RArray<TPosLmItemId> arr;
+        CleanupClosePushL(arr);
+        arr.Append(1);
+        arr.Append(15);
+        arr.Append(21);
+        arr.Append(38);
+        arr.Append(32);
+        arr.Append(12);
+
+        if (self->iTestCase == 9)
+            {
+            // 9a
+            // Should never exist
+            arr.Append(666);
+            }
+        else if (self->iTestCase == 10)
+            {
+            // 9b
+            // Should never exist,
+            TInt dummy = -666;
+            arr.Append(dummy);
+            }
+        // Should leave with KErrNotFound
+        ExecuteAndDeleteLD(database->ExportLandmarksL(*landmarkEncoder, arr, CPosLandmarkDatabase::EDefaultOptions));
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        CleanupStack::PopAndDestroy(&arr);
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 11)
+        {
+        // Delete export object before completion and then finalize
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName11);
+        // Add collection data
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        
+        RArray<TPosLmItemId> arr;
+        CleanupClosePushL(arr);
+        arr.Append(1);
+        arr.Append(15);
+        arr.Append(21);
+        arr.Append(38);
+        arr.Append(32);
+        arr.Append(12);
+
+        // Delete encoder from callback
+    	TCallBack callback(DeleteEncoderCallback, landmarkEncoder);
+    	CPeriodic* periodicTimer = CPeriodic::NewL(CActive::EPriorityHigh);
+    	CleanupStack::PushL(periodicTimer);
+    	periodicTimer->Start(1, 1, callback);
+    	
+        ExecuteAndDeleteLD(database->ExportLandmarksL(*landmarkEncoder, arr, CPosLandmarkDatabase::EDefaultOptions));
+        // Try to FinalizeEncodingL
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        
+        CleanupStack::PopAndDestroy(periodicTimer);
+        CleanupStack::PopAndDestroy(&arr);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 12)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName12);
+        // Add collection data
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        
+        RArray<TPosLmItemId> arr;
+        CleanupClosePushL(arr);
+        arr.Append(1);
+        arr.Append(15);
+        arr.Append(21);
+        arr.Append(38);
+        arr.Append(32);
+        arr.Append(12);
+
+        // Export with invalid transfer options, should panic
+        ExecuteAndDeleteLD(database->ExportLandmarksL(*landmarkEncoder, arr, 666));
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 13)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        CleanupStack::PushL(landmarkEncoder);
+        landmarkEncoder->SetOutputFileL(KFileName13);
+        // Add landmark to be encoded
+        CPosLandmark* lm = database->ReadLandmarkLC(1);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        // Set new output file instead of finalization
+        landmarkEncoder->SetOutputFileL(KFileName2);
+
+        // Check that filelock has been released
+        RFs fs;
+        RFile file;
+        User::LeaveIfError(fs.Connect());
+        CleanupClosePushL(fs);
+        CleanupClosePushL(file);
+        // Make sure that file exist
+        TInt err = file.Open(fs, KFileName13, EFileShareAny);
+        if (err != KErrNone) User::Leave(667);
+        CleanupStack::PopAndDestroy(&file);
+        CleanupStack::PopAndDestroy(&fs);
+
+        // Add landmark to be encoded
+        lm = database->ReadLandmarkLC(11);
+        landmarkEncoder->AddLandmarkL(*lm);
+        CleanupStack::PopAndDestroy(lm);
+        // Finalize
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 14)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        CleanupStack::PushL(landmarkEncoder);
+        landmarkEncoder->SetOutputFileL(KFileName14);
+        // Add collection data of type EPosLmCollDataNone, should panic
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataNone, _L("TP44CollectionDataName"));
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 15)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        // Create encoder with invalid MIME type, should leave with KErrNotSupported
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KNonExistingMimeType1);
+        landmarkEncoder->SetOutputFileL(KFileName15);
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+     else if (self->iTestCase == 16)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName16);
+        // Add collection data
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        
+        RArray<TPosLmItemId> arr;
+        CleanupClosePushL(arr);
+        arr.Append(1);
+        arr.Append(15);
+        arr.Append(21);
+        arr.Append(38);
+        arr.Append(32);
+        arr.Append(12);
+
+        // Export with invalid transfer options, should panic
+        ExecuteAndDeleteLD(database->ExportLandmarksL(*landmarkEncoder, arr, 0x04));
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+    else if (self->iTestCase == 17)
+        {
+        // Export with empty landmark array
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName17);
+        // Add collection data
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        
+        RArray<TPosLmItemId> arr;
+        CleanupClosePushL(arr);
+        
+        ExecuteAndDeleteLD(database->ExportLandmarksL(*landmarkEncoder, arr, CPosLandmarkDatabase::EDefaultOptions));
+        ExecuteAndDeleteLD(landmarkEncoder->FinalizeEncodingL());
+        CleanupStack::PopAndDestroy(&arr);
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+    else if (self->iTestCase == 18)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        // Create encoder with empty MIME type, should leave with KErrArgument
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KEmptyMimeType);
+        landmarkEncoder->SetOutputFileL(KFileName18);
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+    else if (self->iTestCase == 19)
+        {
+        CPosLandmarkDatabase* database = self->OpenDatabaseLC();
+        // Create encoder with long file name, should leave with KErrBadName
+        CPosLandmarkEncoder* landmarkEncoder = CPosLandmarkEncoder::NewL(KLmxMimeType);
+        // Should leave here
+        landmarkEncoder->SetOutputFileL(KLongFileName);
+        landmarkEncoder->AddCollectionDataL(EPosLmCollDataCollectionName, _L("TP44CollectionDataName"));
+        CleanupStack::PopAndDestroy(landmarkEncoder);
+        CleanupStack::PopAndDestroy(database);
+        }
+    }
+
+// ---------------------------------------------------------
+// LOCAL_C ThreadFunction
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+LOCAL_C TInt ThreadFunction(TAny* aData)
+    {
+    CTrapCleanup* cleanup=CTrapCleanup::New(); 
+
+    CActiveScheduler* actSch = new (ELeave) CActiveScheduler;
+    CActiveScheduler::Install(actSch);
+
+    TRAPD(err, CPosTp44::RunPanicTestL(aData));
+    
+    delete actSch;
+    delete cleanup;
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CPosTp44::CreateThreadL
+//
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CPosTp44::CreateThreadL()
+    {
+    _LIT(KThreadName, "Tp44testthread%d");
+    _LIT(KCreateThreadErr, "Create thread failed with %d");
+	TBuf<100> buf;
+	buf.Format(KThreadName, iTestCase);
+	
+     TInt err=0;
+     err = iThread.Create(buf, ThreadFunction, KDefaultStackSize, KMinHeapSize, KMaxHeapSize, this);
+     AssertTrueSecL(err == KErrNone, KCreateThreadErr, err);
+    }
+
+//  End of File