// 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 the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
// which accompanies this distribution, and is available
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#ifndef __RSENDAS_H__
#define __RSENDAS_H__

#include <e32base.h>

class CSendAsMessageTypes;
class CSendAsAccounts;

/**
The default number of message slots available to a session. This determines the
number of outstanding requests the client may have with the server at any one
time.
*/
const TInt KSendAsDefaultMessageSlots = 4;

/**
Encapsulates a session with the SendAs Server.

This class allows a user to determine the message types available to the SendAs
server and also provides functionality for clients to filter this list to find 
the UIDs required to create messages.

@publishedAll
@released
*/
class RSendAs : public RSessionBase
	{
public:

/**
Defines the condition-checking of message capabilities. These are progressively
added to refine the list of available MTMs.
*/
	enum TSendAsConditionType
		{
		/**
		No MTMs are removed as a result of applying this condition to the
		filtering.
		*/
		ESendAsNoCondition,
		/**
		Only MTMs whose capabilities match the given value will remain as a
		result of applying this condition to the filtering.
		*/
		ESendAsEquals,
		/**
		Only MTMs whose capabilities do not match the given value will remain 
		as a result of applying this condition to the filtering.
		*/
		ESendAsNotEquals,
		/**
		Only MTMs whose capabilities greater than the given value will remain
		as a result of applying this condition to the filtering.
		*/
		ESendAsGreaterThan,
		/**
		Only MTMs whose capabilities less than the given value will remain as a
		result of applying this condition to the filtering.
		*/
		ESendAsLessThan,
		/**
		Only MTMs whose capabilities result non-zero value when bitwise ANDed
		with the given value will remain as a result of applying this condition
		to the filtering.
		*/
		ESendAsBitwiseAnd,
		/**
		Only MTMs whose capabilities result non-zero value when bitwise ORed
		with the given value will remain as a result of applying this condition
		to the filtering.
		*/
		ESendAsBitwiseOr,
		/**
		Only MTMs whose capabilities result non-zero value when bitwise NANDed
		with the given value will remain as a result of applying this condition
		to the filtering.
		*/
		ESendAsBitwiseNand,
		/**
		Only MTMs whose capabilities result non-zero value when bitwise NORed
		with the given value will remain as a result of applying this condition
		to the filtering.
		*/
		ESendAsBitwiseNor
		};

public:
	IMPORT_C TInt Connect();
	IMPORT_C TInt Connect(TInt aMessageSlots);
	
	IMPORT_C void FilteredMessageTypesL(CSendAsMessageTypes& aMessageTypeInfo);
	IMPORT_C TInt FilterAgainstCapability(TUid aMessageCapability);
	IMPORT_C TInt FilterAgainstCapability(TUid aMessageCapability, TInt aValue, TSendAsConditionType aConditionType);
	IMPORT_C TInt ResetMessageFilter();
	
	IMPORT_C void AvailableAccountsL(TUid aMessageType, CSendAsAccounts& aAccounts);

private:
	TAny* iAny; // Future proofing.
	};

#endif	//  __RSENDAS_H__
