Msrp/MsrpServer/inc/CMSRPMessageHandler.h
branchMSRP_FrameWork
changeset 25 505ad3f0ce5c
child 58 cdb720e67852
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Msrp/MsrpServer/inc/CMSRPMessageHandler.h	Sat Jun 12 14:30:11 2010 +0530
@@ -0,0 +1,242 @@
+/*
+* Copyright (c) 2009-2010 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:
+* MSRP Implementation
+*
+*/
+
+#ifndef CMSRPMESSAGEHANDLER_H_
+#define CMSRPMESSAGEHANDLER_H_
+
+// INCLUDES
+#include <e32base.h>
+#include <f32file.h> 
+
+#include "MSRPCommon.h"
+#include "MMSRPMessageHandler.h"
+#include "MMSRPIncomingMessage.h"
+#include "MMSRPOutgoingMessage.h"
+#include "MMSRPWriterObserver.h"
+#include "CMSRPMessageChunkState.h"
+
+// Forward declarations
+class MMSRPMessageHandler;
+class MMSRPIncomingMessage;
+class MMSRPOutgoingMessage;
+class MMSRPWriterObserver;
+class MMSRPMessageObserver;
+class CMSRPMessage;
+class CMSRPResponse;
+class CMSRPReport;
+class CMSRPMessageBase;
+class RStringF;
+
+// Constants
+const TInt KMaxBufferSize = 2500;
+const TInt KSmallBuffer = 1024;
+const TInt KMaxChunkReadSize =  65000;
+// Class declaration
+
+/* MSRP Message handler
+ * 
+ */
+
+class CMSRPMessageHandler : public CBase, public MMSRPMessageHandler, 
+                            public MMSRPIncomingMessage, public MMSRPOutgoingMessage, 
+                            public MMSRPWriterObserver
+    {
+public:
+    
+    enum TMSRPMessageState
+        {
+        EIdle,
+        EInProgress,
+        EChunkSent,
+        EMessageSent,
+        EWaitingForResponse,
+        EWaitingForReport,        
+        EMessageDone
+        };
+        
+    /* Two-Phased constructor
+     * 
+     */
+    static CMSRPMessageHandler* NewL( MMSRPMessageObserver* aMessageObserver, 
+            const TDesC8& aMessage );
+    
+    static CMSRPMessageHandler* NewLC( MMSRPMessageObserver* aMessageObserver, 
+            const TDesC8& aMessage );
+    
+    static CMSRPMessageHandler* NewL( TMSRPMessageType aMessageType );
+    
+    static CMSRPMessageHandler* NewLC( TMSRPMessageType aMessageType );
+    
+    /**
+     * Destructor.
+     */
+    ~CMSRPMessageHandler();
+
+	static TInt LinkOffset();		
+	TSglQueLink iLink;	
+    
+public: // From base classes
+    
+    // From MMSRPWriterObserver
+	TWriteStatus GetSendBufferL( TPtrC8& aData, TBool aInterrupt ); 
+    
+    MMSRPWriterObserver::TMsgStatus WriteDoneL( TInt aStatus );
+    
+    // From MMSRPMessageHandler
+    void AddHeaderL( TMsrpHeaderType aHeaderType, TPtrC8& aHeaderValue, 
+            TPtrC8& aHeaderTypeAndValue );
+    
+    void AddContentL( TPtrC8& aContent );
+    
+    void SetTransactionId( TPtrC8& aTransactionId );
+    
+    void SetStatusOfResponseL( TPtrC8& aStatusCode, TPtrC8& aStatusMessage );
+    
+    void EndOfMessageL( TMsrpMsgEndStatus aStatus );
+    
+    // From MMSRPIncomingMessage
+    TMSRPMessageType MessageType( );
+       
+    CMSRPMessage* GetIncomingMessage( );
+    
+    TBool SendResponseL( MMSRPMessageObserver* aMessageObserver,
+								MMSRPConnection& aConnection, TUint aResponseCode );
+    
+    TDesC8& TransactionId( );
+        
+    CMSRPResponse* GetIncomingResponse( );
+        
+    // From MMSRPOutgoingMessage
+    void SendMessageL( MMSRPConnection& aConnection );
+        
+    TBool IsOwnerOfResponse( MMSRPIncomingMessage& aIncomingMessage );
+    
+    TBool ConsumeResponseL( MMSRPIncomingMessage& aIncomingMessage );
+
+    TBool IsMessageComplete();
+    
+    TBool GetSendResultL( TUint &aErrorCode, HBufC8* &aMessageId );
+    
+    void SendFileL( MMSRPConnection& aConnection );
+        
+    void ConsumeFileResponseL( MMSRPIncomingMessage& aIncomingMessage );
+       
+
+
+    TBool IsInFile();
+       
+    void ReceiveFileL( );
+       
+    TBool FileTransferComplete( );
+       
+    void WritetoFileL(CMSRPMessageHandler *aIncomingMsgHandler );
+       
+    void UpdateResponseStateL(CMSRPMessageHandler *incomingMsgHandler);
+       
+    TBool IfResponseReqL();
+private:
+    // Constructor
+    CMSRPMessageHandler( MMSRPMessageObserver* aMessageObserver );
+    
+    CMSRPMessageHandler( );
+    
+    void ConstructL( const TDesC8& aMessage );
+    
+    void ConstructL( TMSRPMessageType aMessageType );
+    
+    // Member Functions
+    void CreateByteRangeHeaderL();
+    
+    void CreateTransactionId();
+    
+    void WriteInitialLineToBufferL();
+    
+    void WriteHeadersToBufferL();
+    
+    void WriteContentToBuffer();
+    
+    void WriteFileContentToBufferL();
+    
+    void WriteEndLineToBuffer(TMsrpMsgEndStatus = EMessageEnd );
+    
+    TInt ExtractByteRangeParams( TDesC8& aHeaderValue, TInt& aStartPos, 
+            TInt& aEndPos, TInt& aTotal );
+    
+    RStringF GetStatusStringL( TUint aStatusCode );
+    
+    TUint CheckValidityOfMessage( TMSRPMessageType aMessageType, 
+            CMSRPMessageBase* aMessage );
+    
+    TInt FillFileBufferL();
+         
+    void SendFileChunkL( MMSRPConnection& aConnection );
+       
+        
+
+    void SendFileStateL( TInt aBytes );
+        
+    void ReceiveFileStateL( TInt aBytes );
+        
+    void WriteChunkToFileL(const TDesC8& aFileChunk ,TDesC8& aTransactionId);  
+private:
+    
+    // Server interface
+    MMSRPMessageObserver* iMSRPMessageObserver;
+    
+    // Transaction Id
+    TBuf8< KMaxLengthOfTransactionIdString > iTransactionId;
+            
+    // MSRP Message
+    CMSRPMessage* iMessage;
+
+    // MSRP response;
+    CMSRPResponse* iResponse;
+    
+    TBool iResponseNeeded;
+    
+    RBuf8 iBuffer;
+    
+    TPtrC8 iContentPtr;
+    
+    TBool iWriteDone;    
+    
+    TMSRPMessageType iActiveMsgType;
+    
+    TMSRPMessageState iState;
+    
+    TMsrpMsgEndStatus iMsgEndStatus;        
+    
+    /* For File Use Case */
+    TBool isFile; 
+    RFile iFile;
+    RFs iFs;
+    TInt iFileSize;
+    
+    TBool iInterrupt;
+    HBufC8* iFileBuffer;
+    TBool iFileTransferComplete;
+    RPointerArray <CMSRPMessageChunkState> iChunkList;       
+    TInt iBufPosInFile; //file buffer start pos in file
+    TInt iEndPosInBuffer;    
+    TInt iStartPosInBuffer;
+    TInt iFileBytesSent;
+
+    TBool iProgress;
+    TInt iNotifiedBytes;
+    TInt iPendingBytes;
+    };
+
+#endif /* CMSRPMESSAGEHANDLER_H_ */