diff -r 9f5ae1728557 -r db3f5fa34ec7 messagingfw/sendas/client/src/rsendas.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/sendas/client/src/rsendas.cpp Wed Nov 03 22:41:46 2010 +0530 @@ -0,0 +1,246 @@ +// Copyright (c) 2004-2009 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: +// + +#include + +#include + +#include "sendasservername.h" +#include "sendasserverdefs.h" +#include +#include +#include + +const TUid KSendAsServerExeUid = {0x10204286}; +const TInt KSendAsRetryTimeout = 100000; +const TInt KSendAsRetryCount = 10; + +static TInt StartServer() + { + const TUidType serverUid(KNullUid, KNullUid, KSendAsServerExeUid); + RProcess server; + TInt r = server.Create(KSendAsServerExe, KNullDesC, serverUid); + + if( r != KErrNone ) + { + return r; + } + + TRequestStatus status; + server.Rendezvous(status); + if( status != KRequestPending ) + { + server.Kill(0); // abort start-up + } + else + { + server.Resume(); // wait for server start-up. + } + User::WaitForRequest(status); + + // If the server panics on start-up, then exit reason may still be zero, + // which is not distinguishable from KErrNone. + r = (server.ExitType() == EExitPanic ) ? KErrGeneral : status.Int(); + server.Close(); + return r; + } + +/** +Establishes a connection to the SendAs Server. + +@return +KErrNone on success, a system wide error code otherwise. +*/ +EXPORT_C TInt RSendAs::Connect() + { + return Connect(KSendAsDefaultMessageSlots); + } + + +/** +Establishes a connection to the SendAs Server. + + +@param aMessageSlots +The number of message slots available to this session. This determines the +number of outstanding requests the client may have with the server at any one +time. The maximum number of slots is 255. If aMessageSlots==-1 then this +indicates that the RSendAs connection should use messages from the global free +pool of messages. + +@return +KErrNone on success, a system wide error code otherwise. +*/ +EXPORT_C TInt RSendAs::Connect(TInt aMessageSlots) + { + TInt retry = KSendAsRetryCount; + TVersion version(KSendAsServerVersionMajor, KSendAsServerVersionMinor, KSendAsServerVersionBuild); + FOREVER + { + TInt r = CreateSession(KSendAsServerName, version, aMessageSlots); + if( r != KErrNotFound && r != KErrServerTerminated && r != KErrServerBusy ) + { + return r; + } + if( --retry == 0 ) + { + return r; + } + if( r == KErrServerBusy ) + { + User::After(KSendAsRetryTimeout); + } + r = StartServer(); + if( r != KErrNone && r != KErrAlreadyExists ) + { + return r; + } + } + } + +/** +Retrieves the connected session's available message types from the SendAs Server. +This will filter all MTMs that can send messages. This list can be refined +by applying filters using FilterAgainstCapability. + + +@param aMessageTypeInfo +This is the CSendAsMessageType into which the session's MTM list information +will be stored. + +@see CSendAsMessageTypes +*/ +EXPORT_C void RSendAs::FilteredMessageTypesL(CSendAsMessageTypes& aMessageTypeInfo) + { + TPckgBuf desLen(0); + + // request needed buffer size for the UID/name list + User::LeaveIfError(SendReceive(ESASGetMessageTypeListLength, TIpcArgs(&desLen))); + if (desLen() > 0) + { + HBufC8* clientBuf = HBufC8::NewLC(desLen()); + TPtr8 ptr(clientBuf->Des()); + + // request server populate list + User::LeaveIfError(SendReceive(ESASGetMessageTypes, TIpcArgs(&ptr))); + + RDesReadStream readStream; + readStream.Open(*clientBuf); + CleanupClosePushL(readStream); + + aMessageTypeInfo.InternalizeL(readStream); + CleanupStack::PopAndDestroy(2, clientBuf); // clientBuf, readStream. + } + } + +/** +Refines the connected session's available message types. Applying a filter will +remove all mtms which do not support the supplied capability + + +@param aMessageCapability +This defines the capability describing which of the available MTMs held by the +SendAs session should remain. + +@return +KErrNone on success, a system wide error code otherwise. +*/ +EXPORT_C TInt RSendAs::FilterAgainstCapability(TUid aMessageCapability) + { + TSendAsMessageTypeFilter filter(aMessageCapability); + TPckg buf(filter); + + return SendReceive(ESASSetFilter,TIpcArgs((TDes8*)&buf)); + } + +/** +Refines the connected session's available message types. Applying a filter will +remove all mtms which do not satisfy the supplied condition. + + +@param aMessageCapability +This defines the capability describing which MTMs held by the SendAs session +should be filtered. Other mtms will be removed. + +@param aValue +The value to be applied to the available MTMs in combination with the filter +condition. MTMs which satify the condition will not be removed from the +available MTM list. + +@param aConditionType +The condition which to apply to the list of MTMs. + +@return +KErrNone on success, a system wide error code otherwise. + +@see TSendAsConditionType +*/ +EXPORT_C TInt RSendAs::FilterAgainstCapability(TUid aMessageCapability, TInt aValue, TSendAsConditionType aConditionType) + { + TSendAsMessageTypeFilter filter(aMessageCapability, aValue, aConditionType); + TPckg buf(filter); + + return SendReceive(ESASSetFilter,TIpcArgs((TDes8*)&buf)); + } + +/** +Refreshes the connected session's available message types to all MTMs which can +send messages. + + +@return +KErrNone on success, a system wide error code otherwise. +*/ +EXPORT_C TInt RSendAs::ResetMessageFilter() + { + return SendReceive(ESASClearFilter, TIpcArgs()); + } + + +/** +Returns the connected session's available accounts for message types. + + +@param aMessageType +The message type UID which the accounts should support. + +@param aAccounts +On success this will be populated with the available accounts which support the +supplied message type. +*/ +EXPORT_C void RSendAs::AvailableAccountsL(TUid aMessageType, CSendAsAccounts& aAccounts) + { + TPckgBuf desLen(0); + TPckgBuf sendUid(aMessageType); + + // request needed buffer size for the UID/name list + User::LeaveIfError(SendReceive(ESASGetAccountListLength, TIpcArgs(&desLen, &sendUid))); + if(desLen() > 0) + { + HBufC8* clientBuf = HBufC8::NewLC(desLen()); + TPtr8 ptr(clientBuf->Des()); + + // request server populate list + User::LeaveIfError(SendReceive(ESASGetAccountList,TIpcArgs(&ptr, &sendUid))); + + RDesReadStream readStream; + readStream.Open(*clientBuf); + CleanupClosePushL(readStream); + + aAccounts.InternalizeL(readStream); + CleanupStack::PopAndDestroy(2, clientBuf); // clientBuf, readStream. + } + } +