--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/remotestoragefw/gsplugin/src/rsfwgsremotedrivesend.cpp Thu Dec 17 09:07:59 2009 +0200
@@ -0,0 +1,298 @@
+/*
+* 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: Sending remote drive configuration entries
+*
+*/
+
+
+#include <eikenv.h>
+#include <sendui.h>
+#include <CMessageData.h>
+#include <SendUiConsts.h>
+#include <txtrich.h>
+#include <utf.h> // for CnvUtfConverter
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <sysutil.h>
+#include <rsfwgspluginrsc.rsg>
+#include <rsfwmountentry.h>
+
+#include "rsfwgsremotedrivesend.h"
+#include "rsfwmountutils.h"
+#include "rsfwgsplugin.hrh"
+
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::NewL
+// Static constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CRsfwGsRemoteDriveSend* CRsfwGsRemoteDriveSend::NewL(TInt aMenuCommandId)
+ {
+ CRsfwGsRemoteDriveSend* self = new (ELeave) CRsfwGsRemoteDriveSend();
+ CleanupStack::PushL(self);
+ self->ConstructL(aMenuCommandId);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::CRsfwGsRemoteDriveSend
+// C++ constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CRsfwGsRemoteDriveSend::CRsfwGsRemoteDriveSend()
+ {
+ }
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::ConstructL
+// 2nd phase constructor
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CRsfwGsRemoteDriveSend::ConstructL(TInt aMenuCommandId)
+ {
+ iSendUi = CSendUi::NewL();
+ iSendAsCmdId=aMenuCommandId;
+ iSendMtmsToDim = new (ELeave) CArrayFixFlat<TUid>(4);
+
+ // for the time being, dim everything else but SMS
+ // for some reason technology-group UIDs do not seem to work
+ // e-mail Mtmss
+ iSendMtmsToDim->AppendL(KSenduiMtmSmtpUid);
+ iSendMtmsToDim->AppendL(KSenduiMtmImap4Uid);
+ iSendMtmsToDim->AppendL(KSenduiMtmPop3Uid);
+
+ // MMS, BT, Irda, Postcard
+ iSendMtmsToDim->AppendL(KSenduiMtmMmsUid);
+ iSendMtmsToDim->AppendL(KSenduiMtmPostcardUid);
+ iSendMtmsToDim->AppendL(KSenduiMtmBtUid);
+ iSendMtmsToDim->AppendL(KSenduiMtmIrUid);
+
+ // Audio Message
+ iSendMtmsToDim->AppendL(KSenduiMtmAudioMessageUid);
+
+ iSendMtmsToDim->AppendL(KSenduiMtmSyncMLEmailUid );
+
+ // filters out EMail Via Exchange, as we only support SMS
+ // for some reason this cannot be found from headers currently
+ const TUid KEmailViaExchange = { 0x102826F8 };
+ iSendMtmsToDim->AppendL(KEmailViaExchange );
+
+ }
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::~CRsfwGsRemoteDriveSend
+// Destructor
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+CRsfwGsRemoteDriveSend::~CRsfwGsRemoteDriveSend()
+ {
+ delete iSendUi;
+ delete iSendMtmsToDim;
+ }
+
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::CanSendL
+// Check wheter sending is possible
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+TBool CRsfwGsRemoteDriveSend::CanSend()
+ {
+ if( iSelectedMtmUid != KNullUid )
+ {
+ return ETrue;
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::DisplaySendMenuItemL
+// Show sendui menu
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CRsfwGsRemoteDriveSend::DisplaySendMenuItemL(CEikMenuPane& aMenuPane,
+ TInt aIndex)
+ {
+ iSendUi->AddSendMenuItemL( aMenuPane, aIndex, iSendAsCmdId, TSendingCapabilities() );
+ }
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::DisplaySendCascadeMenuL
+// Show send quesry / cascaded menu
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CRsfwGsRemoteDriveSend::DisplaySendCascadeMenuL()
+ {
+ iSelectedMtmUid = iSendUi->ShowSendQueryL( NULL, KCapabilitiesForAllServices, iSendMtmsToDim, KNullDesC );
+ }
+
+
+
+// ---------------------------------------------------------
+// CRsfwGsRemoteDriveSend::SendL
+// Send a remote drive entry via SendUi
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CRsfwGsRemoteDriveSend::SendL(const CRsfwMountEntry& anEntry)
+ {
+
+ // the old entry can be deleted in the middle of the operation
+ // e.g. from the File Manager
+ CRsfwMountEntry* entryToBeSent = anEntry.CloneL();
+ CleanupStack::PushL(entryToBeSent);
+
+ CEikonEnv* eikonEnv = CEikonEnv::Static();
+ CRichText* text = CRichText::NewL(
+ eikonEnv->SystemParaFormatLayerL(),
+ eikonEnv->SystemCharFormatLayerL());
+ CleanupStack::PushL(text);
+
+
+ // if user name has been set
+ // ask user whether he would like to send the login credentials
+ TBool sendCredentials = EFalse;
+ if ((entryToBeSent->Item(EMountEntryItemUserName))->Length() > 0)
+ {
+ HBufC* myDisplayMessage = NULL;
+ myDisplayMessage = StringLoader::LoadLC(R_STR_RSFW_SEND_CREDENTIALS_QUERY);
+ CAknQueryDialog* query = CAknQueryDialog::NewL
+ (CAknQueryDialog::EConfirmationTone);
+ sendCredentials =
+ query->ExecuteLD( R_CONFIRMATION_QUERY, *myDisplayMessage);
+ CleanupStack::PopAndDestroy(myDisplayMessage);
+ }
+
+
+ // Encode configuration entry
+ HBufC* vcal = HBufC::NewLC(KMaxMountConfLength);
+ TPtr p = vcal->Des();
+ RsfwMountUtils::ExportMountEntryL(*entryToBeSent, sendCredentials, p);
+
+ // convert to 8-bit
+ // note that safe conversion is needed both when sending
+ // as an attachement and when sending as message text
+ HBufC8* temp = ConvertToUtf7LC(p);
+
+ TUid mtmUid = iSelectedMtmUid;
+ TSendingCapabilities capabilities;
+ iSendUi->ServiceCapabilitiesL( mtmUid, capabilities );
+ if (capabilities.iFlags & TSendingCapabilities::ESupportsAttachments)
+ {
+ // send as Attachment
+ RFs fs;
+ User::LeaveIfError( fs.Connect() );
+ CleanupClosePushL( fs );
+ // must share the handle between processes
+ User::LeaveIfError( fs.ShareProtected() );
+ TInt err = fs.MkDirAll(KRemoteDriveAttachmentFilename);
+ RFile file;
+ err = file.Replace(fs,KRemoteDriveAttachmentFilename,EFileWrite | EFileShareAny );
+ CleanupClosePushL(file);
+ TInt spaceNeeded = vcal->Size();
+ if ( SysUtil::FFSSpaceBelowCriticalLevelL( &fs, spaceNeeded ) )
+ {
+ // don't show any own notes here
+ User::Leave( KErrDiskFull );
+ }
+
+ User::LeaveIfError(file.Write(*temp));
+
+ TParse parse;
+ User::LeaveIfError(parse.SetNoWild(KRemoteDriveAttachmentFilename,
+ NULL, NULL));
+
+ CMessageData* messageData = CMessageData::NewL();
+ CleanupStack::PushL( messageData );
+ messageData->AppendAttachmentHandleL(file);
+ iSendUi->CreateAndSendMessageL( iSelectedMtmUid, messageData, KUidBIOMountConfMsg, ETrue );
+
+ CleanupStack::PopAndDestroy( 2 ); // messageData, file
+ fs.Delete(parse.FullName());
+ CleanupStack::PopAndDestroy( &fs );;
+ }
+ else
+ {
+ // send as message body
+ // message data interface is 16-bit
+ // however, along the way 8-bit interface is used
+ // to pass the data without safe conversion
+ // so the unicode conversion above is still needed
+ HBufC* bufCnv = HBufC::NewLC(temp->Length());
+ TPtr16 des(bufCnv->Des());
+ des.Copy(p);
+ text->InsertL(0, des);
+
+ CMessageData* messageData = CMessageData::NewL();
+ CleanupStack::PushL( messageData );
+ messageData->SetBodyTextL( text );
+ iSendUi->CreateAndSendMessageL( iSelectedMtmUid, messageData, KUidBIOMountConfMsg, ETrue );
+ CleanupStack::PopAndDestroy(2); // messageData, bufCnv
+ }
+
+ CleanupStack::PopAndDestroy(4); // entryToBeSent, text, vcal, temp
+
+ }
+
+// ------------------------------------------------------------------------------------------------
+// HBufC* CRsfwGsRemoteDriveSend::ConvertToUtf7LC
+// Encodes from Unicode UCS-2 to UTF-8
+// ------------------------------------------------------------------------------------------------
+HBufC8* CRsfwGsRemoteDriveSend::ConvertToUtf7LC(const TDesC16& aText)
+ {
+ TPtrC16 remainder( aText );
+ TBuf8<20> utfBuffer;
+ HBufC8 *ret = 0;
+ CBufFlat *buffer = CBufFlat::NewL( 128 );
+ CleanupStack::PushL( buffer );
+
+ TBool finish = EFalse;
+ while( !finish )
+ {
+ utfBuffer.Zero();
+ TInt unconverted = CnvUtfConverter::ConvertFromUnicodeToUtf7(utfBuffer, remainder, EFalse );
+ if( unconverted >= 0 )
+ {
+ remainder.Set( remainder.Right( unconverted ) );
+ buffer->InsertL( buffer->Size(), utfBuffer );
+ finish = (unconverted == 0);
+ }
+ else
+ {
+ User::Leave( unconverted );
+ }
+ }
+
+ buffer->Compress();
+ ret = buffer->Ptr( 0 ).Alloc();
+ CleanupStack::PopAndDestroy( buffer );
+ CleanupStack::PushL( ret );
+ return ret;
+ }
+
+
+
+// end of file