landmarksui/uicontrols/src/CLmkSender.cpp
branchRCL_3
changeset 17 1fc85118c3ae
parent 16 8173571d354e
child 18 870918037e16
equal deleted inserted replaced
16:8173571d354e 17:1fc85118c3ae
     1 /*
       
     2  * Copyright (c) 2002-2010 Nokia Corporation and/or its subsidiary(-ies).
       
     3  * All rights reserved.
       
     4  * This component and the accompanying materials are made available
       
     5  * under the terms of "Eclipse Public License v1.0"
       
     6  * which accompanies this distribution, and is available
       
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8  *
       
     9  * Initial Contributors:
       
    10  * Nokia Corporation - initial contribution.
       
    11  *
       
    12  * Contributors:
       
    13  *
       
    14  * Description:    LandmarksUi Sender class implementation
       
    15  *
       
    16  */
       
    17 
       
    18 // INCLUDE FILES
       
    19 
       
    20 #include <e32std.h>
       
    21 #include <StringLoader.h>
       
    22 #include <f32file.h>
       
    23 
       
    24 #include <AknWaitDialog.h>
       
    25 #include <coemain.h>
       
    26 #include <eikmenup.h>
       
    27 #include <AknQueryDialog.h>
       
    28 #include <sendui.h>
       
    29 #include <SenduiMtmUids.h>
       
    30 #include <CMessageData.h>
       
    31 #include <EPos_CPosLandmarkDatabase.h>
       
    32 #include <EPos_CPosLandmark.h>
       
    33 #include <EPos_CPosLmCategoryManager.h>
       
    34 #include <lmkui.rsg>
       
    35 #include "LmkConsts.h"
       
    36 #include "CLmkEncoder.h"
       
    37 #include "landmarks.hrh"
       
    38 #include "CLmkUiUtils.h"
       
    39 #include "LmkFileUtils.h"
       
    40 #include "Debug.h"
       
    41 #include "CLmkSender.h"
       
    42 #include "CLmkFields.h"
       
    43 #include "LmkConsts.h"
       
    44 #include "CLmkDbUtils.h"
       
    45 #include <CSendingServiceInfo.h>
       
    46 #include <lmkerrors.h>
       
    47 
       
    48 // CONSTANTS
       
    49 //for the sendui query
       
    50 const static TInt KBluetooth = 0x10009ed5;
       
    51 const static TInt KInfrared = 0x100053A4;
       
    52 const static TInt KEmail = 0x10001028;
       
    53 const static TInt KMessaging = 0x102072D6;
       
    54 
       
    55 const TInt KNumOfReplaceChars(25);
       
    56 
       
    57 /// Unnamed namespace for local definitions
       
    58 namespace
       
    59     {
       
    60     const TInt KLmkMtmFilterGranularity(8);
       
    61 #if defined(_DEBUG)
       
    62     _LIT( KPanicMsg, "CLmkSender" );
       
    63 
       
    64     void Panic(TPanicCode aReason)
       
    65         {
       
    66         User::Panic(KPanicMsg, aReason);
       
    67         }
       
    68 #endif
       
    69     } // namespace
       
    70 
       
    71 // ============================ MEMBER FUNCTIONS ===============================
       
    72 
       
    73 // -----------------------------------------------------------------------------
       
    74 // CLmkSender::CLmkSender
       
    75 // C++ default constructor can NOT contain any code, that
       
    76 // might leave.
       
    77 // -----------------------------------------------------------------------------
       
    78 //
       
    79 CLmkSender::CLmkSender(CPosLandmarkDatabase& aDb) :
       
    80     iLastOperationResult(KErrNone), iDb(aDb)
       
    81     {
       
    82     }
       
    83 
       
    84 // ----------------------------------------------------
       
    85 // CLmkSender::ConstructL
       
    86 // ----------------------------------------------------
       
    87 //
       
    88 void CLmkSender::ConstructL(CPosLandmarkDatabase& aDb)
       
    89     {
       
    90     iSendUi = CSendUi::NewL();
       
    91     iEncoder = CLmkEncoder::NewL(aDb, *this, ETrue);
       
    92     }
       
    93 
       
    94 // -----------------------------------------------------------------------------
       
    95 // CLmkSender::NewL
       
    96 // Two-phased constructor.
       
    97 // -----------------------------------------------------------------------------
       
    98 //
       
    99 EXPORT_C CLmkSender* CLmkSender::NewL(CPosLandmarkDatabase& aDb)
       
   100     {
       
   101     CLmkSender* self = new (ELeave) CLmkSender(aDb);
       
   102     CleanupStack::PushL(self);
       
   103     self->ConstructL(aDb);
       
   104     CleanupStack::Pop();
       
   105     return self;
       
   106     }
       
   107 
       
   108 // ----------------------------------------------------
       
   109 // CLmkSender::~CLmkSender
       
   110 // ----------------------------------------------------
       
   111 //
       
   112 CLmkSender::~CLmkSender()
       
   113     {
       
   114     if (iWaitNote)
       
   115         {
       
   116         TRAPD( err, iWaitNote->ProcessFinishedL() );
       
   117         if (err != KErrNone)
       
   118             {
       
   119             delete iWaitNote;
       
   120             iWaitNote = NULL;
       
   121             }
       
   122         }
       
   123     delete iEncoder;
       
   124     delete iSendUi;
       
   125     }
       
   126 
       
   127 // ---------------------------------------------------------
       
   128 // CLmkSender::DisplaySendMenuL
       
   129 // ---------------------------------------------------------
       
   130 //
       
   131 EXPORT_C void CLmkSender::DisplaySendMenuL(CEikMenuPane& aMenuPane,
       
   132         TInt aVisibleCount, TInt aMenuTextResource) const
       
   133     {
       
   134     TInt pos(0);
       
   135     aMenuPane.ItemAndPos(ELmkCmdSendDummy, pos);
       
   136     // Set dummy command dimmed anyway. It was only needed because
       
   137     // SendUI needs to know the right position:
       
   138     aMenuPane.SetItemDimmed(ELmkCmdSendDummy, ETrue);
       
   139 
       
   140     // Now if there are items visible then let SendUi check whether
       
   141     // option can be shown:
       
   142     if (aVisibleCount > 0)
       
   143         {
       
   144         TSendingCapabilities capabilities(0, 0,
       
   145                 TSendingCapabilities::EAllServices);
       
   146         iSendUi->AddSendMenuItemL(aMenuPane, pos, ELmkCmdSend, capabilities);
       
   147 
       
   148         // Set menu item text to desired value since previous operation
       
   149         // overrides it with SendUI default value.
       
   150         if (aMenuTextResource != KZeroResourceId)
       
   151             {
       
   152             aMenuPane.SetItemTextL(ELmkCmdSend, aMenuTextResource);
       
   153             }
       
   154         }
       
   155     }
       
   156 
       
   157 // ---------------------------------------------------------
       
   158 // CLmkSender::DisplaySendCascadeMenuL
       
   159 // ---------------------------------------------------------
       
   160 //
       
   161 EXPORT_C void CLmkSender::DisplaySendCascadeMenuL(CEikMenuPane& /*aMenuPane*/) const
       
   162     {
       
   163     // Construct the MTM filter
       
   164     CArrayFixFlat<TUid>* mtmFilter = new (ELeave) CArrayFixFlat<TUid> (
       
   165             KLmkMtmFilterGranularity);
       
   166     CleanupStack::PushL(mtmFilter);
       
   167     mtmFilter->AppendL(KSenduiMtmSmsUid); // hide SMS
       
   168     mtmFilter->AppendL(KSenduiMtmFaxUid); // hide fax
       
   169     CleanupStack::PopAndDestroy(); // mtmFilter
       
   170     }
       
   171 
       
   172 // ----------------------------------------------------
       
   173 // CLmkSender::CreateAndSendL
       
   174 // ----------------------------------------------------
       
   175 //
       
   176 void CLmkSender::CreateAndSendL(TInt aCommandId,
       
   177         const RArray<TPosLmItemId>& aMarkedIds, TPosLmItemId aSelectedId)
       
   178     {
       
   179     DEBUG( CLmkSender::CreateAndSendL entered );
       
   180     HBufC* filePath;
       
   181     PrepareSendFilePathL(filePath);
       
   182     TPtr ptr = filePath->Des();
       
   183     TInt markedCount = aMarkedIds.Count();
       
   184     if (markedCount == 0 || markedCount == 1)
       
   185         {
       
   186         // One item only marked or unmarked
       
   187         RArray<TPosLmItemId> lmIdArray(1);
       
   188         CleanupClosePushL(lmIdArray);
       
   189         User::LeaveIfError(lmIdArray.Append(aSelectedId));
       
   190         CPosLandmark* landmark = iDb.ReadLandmarkLC(aSelectedId);
       
   191         HBufC* webUrl = HBufC::NewL(KMaxBufferLen);
       
   192         CleanupStack::PushL(webUrl);
       
   193         TPtrC urlDes = webUrl->Des();
       
   194         landmark->GetPositionField(ELmkPositionFieldWebAddress, urlDes);
       
   195         if (urlDes.Length() > KMaxUrlFieldLenWithDefaultProtocol)
       
   196             {
       
   197             TInt pos = urlDes.Find(KProtocol);
       
   198             if (pos == KErrNotFound)
       
   199                 {
       
   200                 webUrl = webUrl->ReAllocL(KHttp().Length() + urlDes.Length());
       
   201                 TPtr url = webUrl->Des();
       
   202                 webUrl->Des().Copy(urlDes);
       
   203                 webUrl->Des().Insert(0, KHttp);
       
   204                 landmark->SetPositionFieldL(ELmkPositionFieldWebAddress,
       
   205                         webUrl->Des());
       
   206                 }
       
   207             }
       
   208         CleanupStack::PopAndDestroy();//webUrl
       
   209         TPtrC landmarkName;
       
   210         TInt retVal(0);
       
   211         retVal = landmark->GetLandmarkName(landmarkName);
       
   212         if (retVal == KErrNone)
       
   213             {
       
   214             iEncoder->StartEncodingL(landmarkName, lmIdArray);
       
   215             ptr.Append(landmarkName);
       
   216             }
       
   217         else
       
   218             {
       
   219             iEncoder->StartEncodingL(KLmkEncodedDataFileName, lmIdArray);
       
   220             ptr.Append(KLmkEncodedDataFileName);
       
   221             }
       
   222         SendL(ptr, aCommandId);
       
   223         CleanupStack::PopAndDestroy(2); //landmark, lmIdArray
       
   224         }
       
   225     else
       
   226         {
       
   227         HBufC* pckgName;
       
   228         TPtrC currentPckgName;//not really used, only for passing to the func.
       
   229         if (QueryNewPackageNameLC(currentPckgName, pckgName))
       
   230             {
       
   231             TPtr name = pckgName->Des();
       
   232             iEncoder->StartEncodingL(name, aMarkedIds);
       
   233             ptr.Append(name);
       
   234             SendL(ptr, aCommandId);
       
   235             }
       
   236         CleanupStack::PopAndDestroy();
       
   237         }
       
   238     CleanupStack::PopAndDestroy(filePath); //filePath       
       
   239     }
       
   240 // ----------------------------------------------------
       
   241 // CLmkSender::HandleOperationL
       
   242 // ----------------------------------------------------
       
   243 //
       
   244 void CLmkSender::HandleOperationL(TOperationTypes /*aType*/,
       
   245         TReal32 /*aProgress*/, TInt aStatus)
       
   246     {
       
   247     if (aStatus != KPosLmOperationNotComplete)
       
   248         {
       
   249         __ASSERT_DEBUG( iWaitNote, Panic( KLmkPanicNullMember ) );
       
   250         iWaitNote->ProcessFinishedL();
       
   251         iWaitNote = NULL;
       
   252         iLastOperationResult = aStatus;
       
   253         }
       
   254     }
       
   255 
       
   256 // ----------------------------------------------------
       
   257 // CLmkSender::SendLandmarksL
       
   258 // ----------------------------------------------------
       
   259 //
       
   260 void CLmkSender::SendLandmarksL(TInt aCommandId, const TDesC& aPackageName,
       
   261         const RPointerArray<CLmkLandmark>& aLandmarks)
       
   262     {
       
   263     DEBUG( CLmkSender::SendMultipleLandmarkL entered );
       
   264     TInt lmkCount = aLandmarks.Count();
       
   265     __ASSERT_DEBUG(lmkCount > 0, Panic( KLmkPanicNullMember ) );
       
   266     if (lmkCount == 1)
       
   267         {
       
   268         SendSingleLandmarkL(aCommandId, aLandmarks);
       
   269         }
       
   270     else
       
   271         {
       
   272         SendLandmarksPackageL(aCommandId, aPackageName, aLandmarks);
       
   273         }
       
   274     }
       
   275 	
       
   276 // ----------------------------------------------------
       
   277 // CLmkSender::SendSingleLandmarkL
       
   278 // ----------------------------------------------------
       
   279 //
       
   280 void CLmkSender::SendSingleLandmarkL(const CPosLandmark& alandmark)
       
   281     {
       
   282     CLmkLandmark* lmkLandmark;
       
   283     LmkLandmarkFromPosLandmarkL(lmkLandmark, alandmark);
       
   284     SendSingleLandmarkL(ELmkCmdSend, *lmkLandmark);
       
   285     CleanupStack::PopAndDestroy();//landMarkLmk
       
   286     }
       
   287 	
       
   288 // ----------------------------------------------------
       
   289 // CLmkSender::SendSingleLandmarkL()
       
   290 // ----------------------------------------------------
       
   291 //
       
   292 void CLmkSender::SendSingleLandmarkL(TInt aCommandId,
       
   293         const CLmkLandmark& alandmark)
       
   294     {
       
   295     TPtrC ptr;
       
   296     RPointerArray<CLmkLandmark> landmark;
       
   297     landmark.Append(&alandmark);
       
   298     SendLandmarksL(aCommandId, ptr, landmark);
       
   299     landmark.Close();
       
   300     }
       
   301 	
       
   302 // ----------------------------------------------------
       
   303 // CLmkSender::SendSingleLandmarkL()
       
   304 // ----------------------------------------------------
       
   305 //
       
   306 void CLmkSender::SendSingleLandmarkL(TInt aCommandId, const RPointerArray<
       
   307         CLmkLandmark>& aLandmarks)
       
   308     {
       
   309     HBufC* filePath;
       
   310     PrepareSendFilePathL(filePath);
       
   311     TPtr ptr = filePath->Des();
       
   312     CLmkLandmark* lmk = aLandmarks[0];
       
   313     CPosLandmark* landmark = lmk->PosLandmark();
       
   314     CLmkDbUtils::AddDefaultProtocolL(landmark);
       
   315     TPtrC landmarkName;
       
   316     TInt retVal(KErrNone);
       
   317     retVal = landmark->GetLandmarkName(landmarkName);
       
   318 
       
   319     if (retVal == KErrNone && LmkFileUtils::IsValidPathL(landmarkName))
       
   320         {
       
   321         TRAP(retVal,iEncoder->StartEncodingL(landmarkName,aLandmarks));
       
   322         if (retVal == KErrNone)
       
   323             {
       
   324             ptr.Append(landmarkName);
       
   325             }
       
   326         }
       
   327     else
       
   328         {
       
   329         retVal = KErrBadName;
       
   330         }
       
   331 
       
   332     if (retVal != KErrNone)
       
   333         {
       
   334         TPtr lmName = ReplaceSpecialCharactersL(landmarkName);
       
   335         TRAP(retVal,iEncoder->StartEncodingL(lmName,aLandmarks));
       
   336         if (retVal == KErrNone)
       
   337             {
       
   338             ptr.Append(lmName);
       
   339             }
       
   340         else
       
   341             {
       
   342             iEncoder->StartEncodingL(KLmkEncodedDataFileName, aLandmarks);
       
   343             ptr.Append(KLmkEncodedDataFileName);
       
   344             }
       
   345         }
       
   346     SendL(ptr, aCommandId);
       
   347     CleanupStack::PopAndDestroy(filePath); //filePath
       
   348     }
       
   349 	
       
   350 // ----------------------------------------------------
       
   351 // CLmkSender::SendLandmarksPackageL
       
   352 // ----------------------------------------------------
       
   353 //
       
   354 void CLmkSender::SendLandmarksPackageL(TInt aCommandId,
       
   355         const TDesC& aPackageName,
       
   356         const RPointerArray<CLmkLandmark>& aLandmarks)
       
   357     {
       
   358     HBufC* pckgName;
       
   359     HBufC* filePath;
       
   360     PrepareSendFilePathL(filePath);
       
   361     TPtr ptr = filePath->Des();
       
   362     if (QueryNewPackageNameLC(aPackageName, pckgName))
       
   363         {
       
   364         TPtr desName = pckgName->Des();
       
   365         iEncoder->StartEncodingL(desName, aLandmarks);
       
   366         ptr.Append(desName);
       
   367         SendL(ptr, aCommandId);
       
   368         }
       
   369     CleanupStack::PopAndDestroy(2);
       
   370     }
       
   371 	
       
   372 // ----------------------------------------------------
       
   373 // CLmkSender::SendL()
       
   374 // ----------------------------------------------------
       
   375 //
       
   376 void CLmkSender::SendL(TDes& aFilePath, TInt aCommandId)
       
   377     {
       
   378     aFilePath.Append(KLmkEncodedDataFileExtension);
       
   379     iWaitNote = new (ELeave) CAknWaitDialog(NULL, ETrue);
       
   380     if (iWaitNote->ExecuteLD(R_LMK_ENCODING_WAIT_NOTE))
       
   381         {
       
   382         if (iLastOperationResult == KErrNone)
       
   383             {
       
   384             RFs fs;
       
   385             User::LeaveIfError(fs.Connect());
       
   386             CleanupClosePushL(fs);
       
   387             User::LeaveIfError(fs.ShareProtected());
       
   388             RFile fileHandle;
       
   389             User::LeaveIfError(fileHandle.Open(fs, aFilePath, EFileShareAny));
       
   390             CleanupClosePushL(fileHandle);
       
   391             TRAPD( err, SendFileL( aCommandId, fileHandle, ETrue));
       
   392             if (err != KErrNone)
       
   393                 {
       
   394                 CleanupStack::PopAndDestroy(); // fileHandle
       
   395                 LmkFileUtils::DeleteFileL(aFilePath);
       
   396                 CleanupStack::PopAndDestroy(); // fs
       
   397                 User::LeaveIfError(err);
       
   398                 }
       
   399             CleanupStack::PopAndDestroy(); // fileHandle
       
   400             LmkFileUtils::DeleteFileL(aFilePath);
       
   401             CleanupStack::PopAndDestroy(); // fs
       
   402             }
       
   403         else
       
   404             { // error situation
       
   405             CCoeEnv::Static()->HandleError(iLastOperationResult);
       
   406             }
       
   407         }
       
   408     else
       
   409         {
       
   410         //making iWaitNote null, since framework destroys waitnote
       
   411         //dialog on pressing cancel.
       
   412         iWaitNote = NULL;
       
   413         iEncoder->CancelEncodeOperationL();
       
   414         }
       
   415     }
       
   416 	
       
   417 // ----------------------------------------------------
       
   418 // CLmkSender::SendFileL
       
   419 // ----------------------------------------------------
       
   420 //
       
   421 void CLmkSender::SendFileL(TInt /*aCommandId*/, const TDesC& aFile,
       
   422         TBool aDeleteSentFile)
       
   423     {
       
   424     DEBUG( CLmkSender::SendFileL entered );
       
   425 
       
   426     // one attachment only:
       
   427     CMessageData * messageData = CMessageData::NewL();
       
   428     CleanupStack::PushL( messageData );
       
   429     messageData->AppendAttachmentL( aFile );
       
   430     DEBUG( CLmkSender::SendFileL: calling SendUI );
       
   431     LoadFilteredSendListQueryL(messageData);
       
   432     DEBUG( CLmkSender::SendFileL: SendUI returned );
       
   433 
       
   434     // Delete the file since it is no more needed
       
   435     if( aDeleteSentFile )
       
   436         {
       
   437         LmkFileUtils::DeleteFileL( aFile );
       
   438         }
       
   439     CleanupStack::PopAndDestroy( messageData );
       
   440     }
       
   441 
       
   442 // ----------------------------------------------------
       
   443 // CLmkSender::SendFileL -- FileHandle version
       
   444 // ----------------------------------------------------
       
   445 //
       
   446 void CLmkSender::SendFileL(TInt /*aCommandId*/, RFile& aFile, TBool /*aDeleteSentFile*/)
       
   447     {
       
   448     DEBUG( CLmkSender::SendFileL entered );
       
   449 
       
   450     // one attachment only:
       
   451     CMessageData * messageData = CMessageData::NewL();
       
   452     CleanupStack::PushL(messageData);
       
   453     messageData->AppendAttachmentHandleL(aFile);
       
   454     DEBUG( CLmkSender::SendFileL: calling SendUI );
       
   455     LoadFilteredSendListQueryL(messageData);
       
   456     CleanupStack::PopAndDestroy(); //messageData
       
   457     DEBUG( CLmkSender::SendFileL: SendUI returned );
       
   458     }
       
   459 	
       
   460 // ----------------------------------------------------
       
   461 // CLmkSender::QueryPackageName
       
   462 // ----------------------------------------------------
       
   463 //
       
   464 TBool CLmkSender::QueryNewPackageNameLC(const TDesC& aCurrentPckgName,
       
   465         HBufC*& aNewPackageName)
       
   466     {
       
   467     TBool retVal = EFalse;
       
   468     HBufC* pkgName = StringLoader::LoadL(R_LMK_DEFAULT_PACKAGE_NAME,
       
   469             CEikonEnv::Static());
       
   470 
       
   471     if (aCurrentPckgName.Length() > pkgName->Des().Length())
       
   472         {
       
   473         delete pkgName;
       
   474         pkgName = NULL;
       
   475         pkgName = HBufC::NewL(aCurrentPckgName.Length());
       
   476         pkgName->Des().Copy(aCurrentPckgName);
       
   477         }
       
   478 
       
   479     TPtr desName = pkgName->Des();
       
   480 
       
   481     CAknTextQueryDialog* dlg = new (ELeave) CAknTextQueryDialog(desName,
       
   482             CAknQueryDialog::ENoTone);
       
   483     if (dlg->ExecuteLD(R_LMK_PACKAGE_NAME_QUERY))
       
   484         {
       
   485         retVal = ETrue;
       
   486         if (!LmkFileUtils::IsValidPathL(desName))
       
   487             {
       
   488             delete pkgName;
       
   489             pkgName = NULL;
       
   490 
       
   491             TInt len = KLmkEncodedDataFileName().Length();
       
   492             aNewPackageName = HBufC::NewLC(len);
       
   493             aNewPackageName->Des().Copy(KLmkEncodedDataFileName);
       
   494             return retVal;
       
   495             }
       
   496         }
       
   497     aNewPackageName = HBufC::NewLC(pkgName->Des().Length());
       
   498     aNewPackageName->Des().Copy(pkgName->Des());
       
   499 
       
   500     delete pkgName;
       
   501     pkgName = NULL;
       
   502 
       
   503     return retVal;
       
   504     }
       
   505 
       
   506 // ----------------------------------------------------
       
   507 // CLmkSender::LmkLandmarkFromPosLandmarkL()
       
   508 // ----------------------------------------------------
       
   509 //
       
   510 void CLmkSender::LmkLandmarkFromPosLandmarkL(CLmkLandmark*& aLmkLandmark,
       
   511         const CPosLandmark& aPosLandmark)
       
   512     {
       
   513     RArray<TPosLmItemId> categoryIdArray;
       
   514     RPointerArray<CPosLandmarkCategory> categories;
       
   515     aPosLandmark.GetCategoriesL(categoryIdArray);
       
   516 
       
   517     CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL(iDb);
       
   518     CleanupStack::PushL(categoryMgr);
       
   519     TInt catCount = categoryIdArray.Count();
       
   520     for (TInt i = 0; i < catCount; i++)
       
   521         {
       
   522         TPosLmItemId catId = categoryIdArray[i];
       
   523         CPosLandmarkCategory* category = categoryMgr->ReadCategoryLC(catId);
       
   524         categories.Append(category);
       
   525         CleanupStack::Pop();
       
   526         }
       
   527     categoryIdArray.Close();
       
   528     CleanupStack::PopAndDestroy();//categoryMgr
       
   529     aLmkLandmark = CLmkLandmark::NewL(&aPosLandmark, categories);
       
   530     CleanupStack::PushL(aLmkLandmark);
       
   531     categories.ResetAndDestroy();
       
   532     }
       
   533 	
       
   534 // ----------------------------------------------------
       
   535 // CLmkSender::PrepareSendFilePathL()
       
   536 // ----------------------------------------------------
       
   537 //
       
   538 void CLmkSender::PrepareSendFilePathL(HBufC*& aFilePath)
       
   539     {
       
   540     // Full path name (private path c:\\private\\UID3 + pacakge File name + File bname Extension)
       
   541     aFilePath = HBufC::NewLC(2 * KLmkPackageNameMaxLen
       
   542             + KLmkEncodedDataFileExtension().Length());
       
   543     TPtr ptr = aFilePath->Des();
       
   544 
       
   545     // Create the private path(c:\\private\\UID3) for Landmarks UI application
       
   546     TFileName fileName;
       
   547     RFs fs;
       
   548     User::LeaveIfError(fs.Connect());
       
   549     CleanupClosePushL(fs);
       
   550     fs.SessionPath(fileName);
       
   551     fs.MkDirAll(fileName);
       
   552     aFilePath->Des().Append(fileName);
       
   553     CleanupStack::PopAndDestroy(); // fs
       
   554     }
       
   555 	
       
   556 // ----------------------------------------------------
       
   557 // CLmkSender::PrepareMultipleLandmarkForSendL()
       
   558 // ----------------------------------------------------
       
   559 //
       
   560 void CLmkSender::PrepareMultipleLandmarkForSendL(
       
   561         RPointerArray<CLmkLandmark>& aLmkLandmark,
       
   562         const RArray<TPosLmItemId>& aMarkedIds)
       
   563     {
       
   564     /*
       
   565      This function prepares an array of CLmkLandmark from given
       
   566      landmark ids.
       
   567      */
       
   568     for (TInt i = 0; i < aMarkedIds.Count(); i++)
       
   569         {
       
   570         CPosLandmark* landmark = iDb.ReadLandmarkLC(aMarkedIds[i]);
       
   571         CLmkLandmark* lmk;
       
   572         LmkLandmarkFromPosLandmarkL(lmk, *landmark);
       
   573         CleanupStack::Pop(lmk);
       
   574         User::LeaveIfError(aLmkLandmark.Append(lmk));
       
   575         CleanupStack::PopAndDestroy();//landmark
       
   576         }
       
   577     }
       
   578 
       
   579 // ----------------------------------------------------
       
   580 // CLmkSender::LoadFilteredSendListQueryL()
       
   581 // ----------------------------------------------------
       
   582 //
       
   583 void CLmkSender::LoadFilteredSendListQueryL(const CMessageData* aMessageData)
       
   584     {
       
   585     /**
       
   586      * Currently we need to show only four services in the sendui query
       
   587      * 1.via messaging
       
   588      * 2.via bluetooth
       
   589      * 3.via infrared
       
   590      * 4.via email
       
   591      */
       
   592     RPointerArray<CSendingServiceInfo> serviceList;
       
   593     CleanupClosePushL(serviceList);
       
   594     //load all the available services
       
   595     iSendUi->AvailableServicesL(serviceList);
       
   596     TInt count = serviceList.Count();
       
   597     CArrayFixFlat<TUid>* serviceFilter = new (ELeave) CArrayFixFlat<TUid> (
       
   598             count);
       
   599     CleanupStack::PushL(serviceFilter);
       
   600     for (TInt i = 0; i < count; i++)
       
   601         {
       
   602         CSendingServiceInfo* info = serviceList[i];
       
   603         TPtrC ptr = info->ServiceName();
       
   604         CleanupStack::PushL(info);
       
   605         TUid id = info->ServiceId();
       
   606         //check if this service is not one of the required list
       
   607         if (id.iUid != KBluetooth && id.iUid != KInfrared && id.iUid
       
   608                 != KEmail && id.iUid != KMessaging)
       
   609             {
       
   610             //unwanted serivce list for filtering.
       
   611             serviceFilter->AppendL(info->ServiceId());
       
   612             }
       
   613         CleanupStack::PopAndDestroy();//info
       
   614         }
       
   615     TSendingCapabilities capabilities(0, 0,
       
   616             TSendingCapabilities::ESupportsAttachments);
       
   617     iSendUi->ShowQueryAndSendL(aMessageData, capabilities, serviceFilter);
       
   618     CleanupStack::PopAndDestroy(2);//serviceList,serviceFilter
       
   619     }
       
   620 
       
   621 // ----------------------------------------------------
       
   622 // CLmkSender::ReplaceSpecialCharactersL
       
   623 // ----------------------------------------------------
       
   624 //
       
   625 TPtr CLmkSender::ReplaceSpecialCharactersL(TPtrC aText)
       
   626     {
       
   627     TBuf<KNumOfReplaceChars> replaceChars;
       
   628     replaceChars.Zero();
       
   629 
       
   630     // special chars from Unicode/Character reference
       
   631     replaceChars.Append(0x0022); // """
       
   632     replaceChars.Append(0x002A); // "*"
       
   633     replaceChars.Append(0x002F); // "/"
       
   634 
       
   635     replaceChars.Append(0x003A); // ":"
       
   636     replaceChars.Append(0x003C); // "<"
       
   637     replaceChars.Append(0x003E); // ">"
       
   638     replaceChars.Append(0x003F); // "?"
       
   639     replaceChars.Append(0x005C); // "\"
       
   640     replaceChars.Append(0x007C); // "|"
       
   641 
       
   642     TInt nameLength = KLmkEncodedDataFileName.iTypeLength;
       
   643     if (nameLength < aText.Length())
       
   644         {
       
   645         nameLength = aText.Length();
       
   646         }
       
   647     HBufC* buffer = HBufC::NewLC(nameLength);
       
   648     TPtr des1 = buffer->Des();
       
   649     des1.Copy(aText);
       
   650     AknTextUtils::ReplaceCharacters(des1, replaceChars, TChar(' '));
       
   651 
       
   652     TInt spaceCount = 0;
       
   653     for (TInt i = 0; i < des1.Length(); i++)
       
   654         {
       
   655         if (des1[i] == TChar(' '))
       
   656             spaceCount++;
       
   657         }
       
   658 
       
   659     if (spaceCount == des1.Length())
       
   660         {
       
   661         des1.Copy(KLmkEncodedDataFileName);
       
   662         }
       
   663 
       
   664     CleanupStack::Pop(buffer);
       
   665     return des1;
       
   666     }
       
   667 
       
   668 //  End of File
       
   669