williamr@2: // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // please do not delete williamr@2: // williamr@2: // williamr@2: williamr@2: /** williamr@2: @file CProtocolHandler.h williamr@2: @warning : This file contains Rose Model ID comments williamr@2: */ williamr@2: williamr@2: #ifndef __CPROTOCOLHANDLER_H__ williamr@2: #define __CPROTOCOLHANDLER_H__ williamr@2: williamr@2: // System includes williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: // Forward declarations williamr@2: class CHeaderCodec; williamr@2: class CProtTransaction; williamr@2: class CSecurityPolicy; williamr@2: class MProtHandlerInterface; williamr@2: williamr@2: /** williamr@2: The ECom protocol handler plugin interface UID. williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TUid KUidProtocolHandlerPluginInterface = {0x1000A449}; williamr@2: williamr@2: // williamr@2: /** williamr@2: Defined active object priorities for the Protocol Handler williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KProtocolHandlerActivePriority = CActive::EPriorityStandard; williamr@2: /** williamr@2: Defined active object priorities for the Transaction williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KTransactionActivePriority = KProtocolHandlerActivePriority+1; williamr@2: williamr@2: williamr@2: //##ModelId=3C4C186A02A3 williamr@2: class CProtocolHandler : public CActive, public MHTTPFilter williamr@2: /** williamr@2: An abstract protocol handler. Protocol handlers are required to williamr@2: act as the bridge between abstract representations of sessions, transactions and williamr@2: headers (the client side of the HTTP architecture) and specific comms transports williamr@2: (the network side of the architecture). williamr@2: williamr@2: Each instance of a concrete subclass of CProtocolHandler is associated williamr@2: with a specific client session, and hence with a particular choice of proxy type, williamr@2: and by implication, transport type. It is designed to appear like a filter in williamr@2: order to be placed at the end of a session's filter queue. This allows it to williamr@2: receive transaction-related events in the same way that any other filter williamr@2: (or indeed, the client) does. An active object, it may implement a queuing williamr@2: system for submitted transactions, according to the chosen internal service williamr@2: model. williamr@2: williamr@2: In order to divide the abstract functionality associated with handling the HTTP williamr@2: protocol handler from the specifics needed for a particular choice of transport, williamr@2: this class defines a number of pure virtual methods which allow it to defer williamr@2: transport-specific choices or mechamisms. These are mainly concerned with the williamr@2: service model (ie. allocation of transactions to objects that can handle them), the williamr@2: codec model (ie. on-demand encoding/decoding of HTTP header data) and general williamr@2: housekeeping (eg. instantiation and cleanup of objects at particular points in williamr@2: a transaction lifecycle). williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: public: // Methods williamr@2: williamr@2: /** williamr@2: Standard factory constructor. This is the ECOM interface class from williamr@2: which concrete protocol handlers are derived. The method queries williamr@2: ECOM for the protocol handler plugin that matches the protocol williamr@2: description passed in. williamr@2: @param aProtocol (in) The name of the protocol required. williamr@2: @param aSession (in) The HTTP session on which this protocol handler williamr@2: will be installed. williamr@2: @leave KErrNoMemory if there was not enough memory to create the object. williamr@2: */ williamr@2: //##ModelId=3C4C186B007E williamr@2: static CProtocolHandler* NewL(const TDesC8& aProtocol, RHTTPSession aSession); williamr@2: williamr@2: /** williamr@2: Intended Usage: Class destructor. williamr@2: */ williamr@2: //##ModelId=3C4C186B0075 williamr@2: IMPORT_C virtual ~CProtocolHandler(); williamr@2: williamr@2: /** williamr@2: Obtain the protocol handler's header codec. williamr@2: @return The header codec owned by this protocol handler, or NULL if one williamr@2: has not yet been created. williamr@2: @see CHeaderCodec williamr@2: */ williamr@2: //##ModelId=3C4C186B0074 williamr@2: IMPORT_C CHeaderCodec* Codec() const; williamr@2: williamr@2: williamr@2: /** williamr@2: Get the Server Certificate for the current session. williamr@2: @return The certificate information or NULL if it is not available williamr@2: */ williamr@2: IMPORT_C const CCertificate* SessionServerCert(); williamr@2: williamr@2: /** williamr@2: Get the Server Certificate for the specified transaction. williamr@2: @param aTransaction The transaction for which the certificate is requested williamr@2: @return The certificate information or NULL if it is not available williamr@2: */ williamr@2: IMPORT_C const CCertificate* TransactionServerCert( RHTTPTransaction aTransaction); williamr@2: williamr@2: public: // Methods to be implemented in specific protocol handlers williamr@2: williamr@2: /** williamr@2: Intended Usage: Get the Server Certificate for the current session. williamr@2: @param aServerCert A TCertInfo which will be filled with the certificate information williamr@2: @return An error code. KErrNone if aServerCert has been completed, otherwise one of williamr@2: the system wide error codes williamr@2: */ williamr@2: virtual TInt SessionServerCert(TCertInfo& aServerCert) = 0; williamr@2: williamr@2: /** williamr@2: Intended Usage: Get the Server Certificate for the specified transaction. williamr@2: @param aServerCert A TCertInfo which will be filled with the certificate information williamr@2: @param aTransaction The transaction for which the certificate is requested williamr@2: @return An error code. KErrNone if aServerCert has been completed, otherwise one of williamr@2: the system wide error codes williamr@2: */ williamr@2: virtual TInt TransactionServerCert(TCertInfo& aServerCert, RHTTPTransaction aTransaction) = 0; williamr@2: williamr@2: public: // Methods from MHTTPFilterBase williamr@2: williamr@2: /** williamr@2: Intended Usage: Called when the filter's registration conditions are satisfied for events that williamr@2: occur on a transaction. Any Leaves must be handled by the appropriate MHFRunError. williamr@2: Note that this function is not allowed to leave if called with certain events. williamr@2: @see THTTPEvent williamr@2: @param aTransaction The transaction that the event has occurred on. williamr@2: @param aEvent aEvent The event that has occurred. williamr@2: @leave Standard Symbian OS error codes. e.g. KErrNoMemory. williamr@2: @see MHTTPFilterBase williamr@2: */ williamr@2: //##ModelId=3C4C186B0061 williamr@2: IMPORT_C virtual void MHFRunL(RHTTPTransaction aTransaction, const THTTPEvent& aEvent); williamr@2: williamr@2: /** williamr@2: Intended Usage: Called when the filters registration conditions are satisfied for events that occur williamr@2: on the session. Any leaves must be handled by the appropriate MHFRunError. williamr@2: @param aEvent The session event that has occured. williamr@2: @leave KErrNoMemory if an attempt to allocate memory has failed williamr@2: @leave KErrHttpCantResetRequestBody if the request body needed to be rewound by the client williamr@2: but it doesn't support this williamr@2: @see MHTTPFilterBase williamr@2: */ williamr@2: //##ModelId=3C4C186B0057 williamr@2: IMPORT_C virtual void MHFSessionRunL(const THTTPSessionEvent& aEvent); williamr@2: williamr@2: /** williamr@2: Intended Usage: Called when RunL leaves from a transaction event. This works in the same williamr@2: way as CActve::RunError; return KErrNone if you have handled the error. williamr@2: If you don't completely handle the error, a panic will occur. williamr@2: @param aError The leave code that RunL left with. williamr@2: @param aTransaction The transaction that was being processed. williamr@2: @param aEvent The Event that was being processed. williamr@2: @return KErrNone if the error has been cancelled or the code williamr@2: of the continuing error otherwise. williamr@2: @see MHTTPFilterBase williamr@2: */ williamr@2: //##ModelId=3C4C186B0043 williamr@2: IMPORT_C virtual TInt MHFRunError(TInt aError, RHTTPTransaction aTransaction, const THTTPEvent& aEvent); williamr@2: williamr@2: /** williamr@2: Intended Usage: Called when MHFRunL leaves from a session event. This works in the same williamr@2: way as CActve::RunError. If you don't completely handle the error, a panic will occur. williamr@2: @param aError The leave code that RunL left with. williamr@2: @param aEvent The Event that was being processed. williamr@2: @return KErrNone if the error has been cancelled or the code williamr@2: of the continuing error otherwise. williamr@2: @see MHTTPFilterBase williamr@2: */ williamr@2: //##ModelId=3C4C186B0038 williamr@2: IMPORT_C virtual TInt MHFSessionRunError(TInt aError, const THTTPSessionEvent& aEvent); williamr@2: williamr@2: public: // Methods from MHTTPFilter williamr@2: williamr@2: /** williamr@2: Intended Usage: Called when the filter is being removed from a session's filter queue. williamr@2: @param aSession The session it's being removed from williamr@2: @param aHandle The filter handle. Complex filters may need to williamr@2: refer to this to keep track of which particular registration is williamr@2: being unloaded. williamr@2: @see MHTTFilter williamr@2: */ williamr@2: //##ModelId=3C4C186B0025 williamr@2: IMPORT_C virtual void MHFUnload(RHTTPSession aSession, THTTPFilterHandle aHandle); williamr@2: williamr@2: /** williamr@2: Intended Usage: Called when the filter is being added to the session's filter queue. williamr@2: @param aSession The session it's being added to. williamr@2: @param aHandle The filter handle. Complex filters may need to keep williamr@2: track of this, for instance if generating events in response to williamr@2: external stimuli williamr@2: @see MHTTFilter williamr@2: */ williamr@2: //##ModelId=3C4C186B001A williamr@2: IMPORT_C virtual void MHFLoad(RHTTPSession aSession, THTTPFilterHandle aHandle); williamr@2: williamr@2: protected: // callbacks/methods for sub-classes williamr@2: williamr@2: /** williamr@2: Callback method for concrete protocol handler sub-classes to williamr@2: inform the base protocol handler that a transaction has completed. williamr@2: The concrete protocol handler must call this method in order to williamr@2: supply a completion event that will be sent to the client. williamr@2: In addition, the method allows the base protocol handler to do some williamr@2: queue management. williamr@2: @param aTrans (in) the completed transaction williamr@2: @param aEventStatus (in) an event to be sent back to the client along williamr@2: the filter queue williamr@2: @leave THTTPPanic::EInvalidFilterHandle if unable to send event. williamr@2: */ williamr@2: //##ModelId=3C4C186B0010 williamr@2: IMPORT_C void TransactionCompletedL(RHTTPTransaction aTrans, THTTPEvent aEventStatus); williamr@4: IMPORT_C TInt TransactionCompleted(RHTTPTransaction aTrans, THTTPEvent aEventStatus); williamr@2: /** williamr@2: Obtain the number of currently active transactions williamr@2: @return The number of currently active transactions williamr@2: */ williamr@2: //##ModelId=3C4C186B0006 williamr@2: IMPORT_C TInt NumActiveTransactions() const; williamr@2: williamr@2: /** williamr@2: Callback method for concrete protocol handler sub-classes to williamr@2: inform the base protocol handler that a transaction has failed williamr@2: utterly. (i.e. the sub-class used aTrans.Fail().) The base protocol williamr@2: handler sets the transaction state to be cancelled. williamr@2: @param aTrans (in) the completed transaction williamr@2: */ williamr@2: //##ModelId=3C4C186A03E5 williamr@2: IMPORT_C void TransactionFailed(RHTTPTransaction aTrans); williamr@2: williamr@2: /** williamr@2: Completes this active object - allows the protocol handler to williamr@2: reevaluate the queue of pending transactions and service new ones williamr@2: if possible. williamr@2: */ williamr@2: //##ModelId=3C4C186A03E4 williamr@2: IMPORT_C void CompleteSelf(); williamr@2: williamr@2: /** williamr@2: Searches the array of CProtTransaction objects to if the williamr@2: aTransaction object is wrapped by one of them. If one is found aProtTransaction is set to it williamr@2: @param aTransaction The transaction to search for. williamr@2: @param aProtTransaction Reference to a CProtTransaction which will be set to the williamr@2: CProtTransaction which wraps the RHTTPTransaction. williamr@2: @return If a CProtTransaction object is found, a positive value is williamr@2: returned that is the index to that object in the array. If williamr@2: no object is found, KErrNotFound is returned. williamr@2: */ williamr@2: IMPORT_C TInt FindTransaction(RHTTPTransaction aTransaction, const CProtTransaction*& aProtTransaction) const; williamr@2: williamr@4: IMPORT_C CProtTransaction* FindProtocolTransaction(RHTTPTransaction aTransaction) const; williamr@2: private: // methods to be implemented in specific protocol handlers williamr@2: williamr@2: /** Intended usage: Creates the specific type of codec required for a specific type williamr@2: of protocol handler. williamr@2: williamr@2: This must be implemented by a concrete protocol handler sub-class. williamr@2: */ williamr@2: //##ModelId=3C4C186A03DC williamr@2: virtual void CreateCodecL() = 0; williamr@2: williamr@2: /** Intended Usage: Creates a representation of a client transaction to be used in the williamr@2: protocol handler. Since the protocol handler deals with the low- williamr@2: level data for a transaction as sent over a particular transport, williamr@2: an appropriate CProtTransaction-derived class is used that owns a williamr@2: CRxData and a CTxData to handle the low-level data. williamr@2: williamr@2: This must be implemented by a concrete protocol handler sub-class. williamr@2: @leave KErrNoMemory if there was not enough memory to create the object. williamr@2: create the object. williamr@2: @param aTransaction The RHTTPTransaction object associated with williamr@2: this CProtTransaction object. williamr@2: @return A pointer to a created CProtTransaction-derived class. williamr@2: @see CRxData williamr@2: @see CTxData williamr@2: */ williamr@2: //##ModelId=3C4C186A03DA williamr@2: virtual CProtTransaction* CreateProtTransactionL(RHTTPTransaction aTransaction) = 0; williamr@2: williamr@2: /** Intended Usage: Attempt to service the transaction. This implies that the concrete williamr@2: protocol handler will allocate some transport resources to the williamr@2: transaction - which could fail if the protocol handler has hit an williamr@2: internal limit of resources or bandwidth. williamr@2: Implementations of this interface may leave with any of KErrHttpInvalidUri, williamr@2: KErrGeneral, KErrNoMemory williamr@2: williamr@2: This must be implemented by a concrete protocol handler sub-class. williamr@2: @param aTrans The pending protocol transaction object which is to be williamr@2: serviced. williamr@2: @return A flag that indicates if the transaction can be serviced immediately. williamr@2: */ williamr@2: //##ModelId=3C4C186A03D0 williamr@2: virtual TBool ServiceL(CProtTransaction& aTrans) = 0; williamr@2: williamr@2: /** Intended Usage: Called when the RHTTPTransaction object corresponding to aTrans has williamr@2: been closed by the client. This allows the concrete protocol handler williamr@2: to do any cleanup required for this particular transaction. williamr@2: williamr@2: Ownership of the CProtTransaction object is transferred back to the williamr@2: concrete protocol handler, which then has deletion responsibility williamr@2: for it. By the time this function has been called, the base williamr@2: protocol handler will have dequeued the transaction. williamr@2: williamr@2: The client's RHTTPTransaction will be closed when this function williamr@2: returns, so it is not possible to send events to the client during williamr@2: the function's execution. williamr@2: williamr@2: This must be implemented by a concrete protocol handler sub-class. williamr@2: @param aTrans (in) A pointer to the transaction about to be closed. williamr@2: */ williamr@2: //##ModelId=3C4C186A03C6 williamr@2: virtual void ClosedTransactionHook(CProtTransaction* aTrans) = 0; williamr@2: williamr@2: /** Intended Usage: Called when the RHTTPTransaction object corresponding to aTrans has williamr@2: been cancelled by the client or an intermediate filter. This allows williamr@2: the concrete protocol handler to do any cleanup and to perform the williamr@2: necessary actions for cancellation on its transport layer. williamr@2: williamr@2: This must be implemented by a concrete protocol handler sub-class. williamr@2: @param aTrans (in) A reference to the transaction being cancelled. williamr@2: */ williamr@2: //##ModelId=3C4C186A03B3 williamr@2: virtual void CancelTransactionHook(CProtTransaction& aTransaction) = 0; williamr@2: williamr@2: /** Intended Usage: Called to notify the concrete protocol handler that new request williamr@2: body data is available for transmission. williamr@2: williamr@2: This must be implemented by a concrete protocol handler sub-class. williamr@2: @param aTrans (in) A reference to the transaction whose request body williamr@2: has new data available. williamr@2: */ williamr@2: //##ModelId=3C4C186A03A8 williamr@2: virtual void NotifyNewRequestBodyPart(CProtTransaction& aTransaction) = 0; williamr@2: williamr@2: protected: // Methods inherited from CActive williamr@2: williamr@2: /** Intended Usage: Do some processing when a previous asynchronous request made by williamr@2: this object has completed. williamr@2: */ williamr@2: //##ModelId=3C4C186A0377 williamr@2: IMPORT_C virtual void RunL(); williamr@2: williamr@2: /** Intended Usage: Do any cleanup required should RunL leave williamr@2: @param aError (in) The error code that RunL left with williamr@2: @return A final error code - KErrNone if the error was handled by this williamr@2: method. williamr@2: */ williamr@2: //##ModelId=3C4C186A036E williamr@2: IMPORT_C virtual TInt RunError(TInt aError); williamr@2: williamr@2: /** Intended Usage: Cancel outstanding asynchronous requests that this object has made williamr@2: */ williamr@2: //##ModelId=3C4C186A036D williamr@2: IMPORT_C virtual void DoCancel(); williamr@2: williamr@2: protected: // Methods williamr@2: williamr@2: /** williamr@2: Constructs a protocol handler associated with the supplied HTTP williamr@2: client session. williamr@2: @param aSession (in) The session on which the new protocol handler will williamr@2: be installed. williamr@2: */ williamr@2: IMPORT_C CProtocolHandler(RHTTPSession aSession); williamr@2: williamr@2: /** williamr@2: Second phase construction in which any necessary allocation is done williamr@2: Implementations of this interface may leave with KErrNoMemory williamr@2: @param aSession The HTTP session on which this protocol handler williamr@2: will be installed. williamr@2: */ williamr@2: //##ModelId=3C4C186A036C williamr@2: IMPORT_C void ConstructL(RHTTPSession aSession); williamr@2: williamr@2: protected: // Attributes williamr@2: williamr@2: /** The session to which this protocol handler is dedicated williamr@2: */ williamr@2: //##ModelId=3C4C186A033C williamr@2: RHTTPSession iSession; williamr@2: williamr@2: /** The codec used for this protocol handler (to be specialised in subclasses) williamr@2: */ williamr@2: //##ModelId=3C4C186A032F williamr@2: CHeaderCodec* iCodec; williamr@2: williamr@2: /** HTTP logger handle (debug only) williamr@2: */ williamr@2: __DECLARE_LOG williamr@2: williamr@2: /** An interface providing the security policy. This may be NULL if there is no security policy plugin */ williamr@2: //##ModelId=3C4C186A031D williamr@2: CSecurityPolicy* iSecurityPolicy; williamr@2: williamr@2: private: // Methods williamr@2: williamr@2: /** williamr@2: Called after a client RHTTPTransaction::SubmitL(), this method williamr@2: enqueues the supplied client transaction. It checks to see if there williamr@2: already exists a CProtTransaction for this transaction. If there is williamr@2: and its state is ECancelled, then the associated request data is williamr@2: reset and the state changed to EPending. A CompleteSelf() is issued. williamr@2: In the case of an existing CProtTransaction that has not been williamr@2: cancelled, the submit event is ignored. If no CProtTransaction williamr@2: object existed, then one is created for the transaction and a williamr@2: CompleteSelf() is issued. williamr@2: @leave KErrHttpCantResetRequestBody if the request body data cannot williamr@2: be reset. KErrNoMemory if a new CProtTransaction cannot be williamr@2: created or added to the transaction queue. williamr@2: @param aTransaction The submitted transaction. williamr@2: @pre None williamr@2: @post If there is a new pending CProtTransaction object the protocol williamr@2: handler will have been self-completed (i.e. the RunL will be williamr@2: called). williamr@2: */ williamr@2: //##ModelId=3C4C186A0362 williamr@2: void SubmitTransactionL(RHTTPTransaction aTransaction); williamr@2: williamr@2: /** williamr@2: Sets the state of the CProtTransaction object for this williamr@2: transaction to ECancelled, and resets the object. This williamr@2: object can be reused if the transaction is resubmitted. williamr@2: @param RHTTPTransaction aTrans williamr@2: @pre A CProtTransaction object exists for this transaction. williamr@2: @post The state of the CProtTransaction object is set to ECancelled williamr@2: and it has been reset. williamr@2: */ williamr@2: //##ModelId=3C4C186A0359 williamr@2: void HandleCancelTransaction(RHTTPTransaction aTrans); williamr@2: williamr@2: /** williamr@2: Removes the CProtTransaction object for the transaction williamr@2: from the queue of CProtTransaction objects. williamr@2: @param RHTTPTransaction aTrans williamr@2: @pre A CProtTransaction object exists for this transaction. williamr@2: @post The CProtTransaction object has been removed from the queue. williamr@2: */ williamr@2: //##ModelId=3C4C186A034F williamr@2: void HandleClosedTransaction(RHTTPTransaction aTrans); williamr@2: williamr@2: /** williamr@2: Searches the array of CProtTransaction objects to if the williamr@2: aTransaction object is wrapped by one of them. williamr@2: @param aTransaction The transaction to search for. williamr@2: @return If a CProtTransaction object is found, a positive value is williamr@2: returned that is the index to that object in the array. If williamr@2: no object is found, KErrNotFound is returned. williamr@2: */ williamr@2: //##ModelId=3C4C186A0346 williamr@2: TInt FindTransaction(RHTTPTransaction aTransaction) const; williamr@2: williamr@2: protected: williamr@2: /** williamr@2: Intended Usage: This is a mechanism for allowing future change to CProtocolHandler API williamr@2: without breaking BC. williamr@2: @param aInterfaceId the UID of the API function being called. williamr@2: @param aInterfacePtr reference to pointer to actual function implementation (in the derived class) williamr@2: */ williamr@2: inline virtual void GetInterfaceL(TUid aInterfaceId, MProtHandlerInterface*& aInterfacePtr); williamr@2: williamr@2: public: williamr@2: /** Intended Usage: Reserve a slot in the v-table to preserve future BC williamr@2: */ williamr@2: //##ModelId=3C4C186A0344 williamr@2: inline virtual void Reserved2(); williamr@2: williamr@2: williamr@2: private: // Attributes williamr@2: williamr@2: /** A list of transactions. Each transaction has a list state, e.g. pending, williamr@2: active, etc. williamr@2: */ williamr@2: //##ModelId=3C4C186A0313 williamr@2: RPointerArray iTransactions; williamr@2: williamr@2: /** The transaction which is currently being serviced - used in RunError so williamr@2: we know which transaction caused RunL to leave. williamr@2: */ williamr@2: //##ModelId=3C4C186A02FF williamr@2: RHTTPTransaction iCurrentTransaction; williamr@2: williamr@2: /** The destructor key UID indentification required by ECom williamr@2: */ williamr@2: //##ModelId=3C4C186A02F5 williamr@2: TUid iDtor_ID_Key; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: Interface for adding to ProtocolHandler API williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: williamr@2: const TInt KProtHandlerSessionServerCertUid = 0x1028180D; williamr@2: const TInt KProtHandlerTransactionServerCertUid = 0x1028180E; williamr@2: williamr@2: class MProtHandlerInterface williamr@2: { williamr@2: public: williamr@2: /** williamr@2: Intended Usage: Get the Server Certificate for the current session. williamr@2: @return The certificate information or NULL if it is not available williamr@2: */ williamr@2: virtual const CCertificate* SessionServerCert() = 0; williamr@2: williamr@2: /** williamr@2: Intended Usage: Get the Server Certificate for the specified transaction. williamr@2: @param aTransaction The transaction for which the certificate is requested williamr@2: @return The certificate information or NULL if it is not available williamr@2: */ williamr@2: virtual const CCertificate* TransactionServerCert( RHTTPTransaction aTransaction) = 0; williamr@2: }; williamr@2: williamr@2: inline void CProtocolHandler::GetInterfaceL(TUid, MProtHandlerInterface*&) williamr@2: {} williamr@2: williamr@2: inline void CProtocolHandler::Reserved2() williamr@2: {} williamr@2: williamr@2: #endif // __CPROTOCOLHANDLER_H__