--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/obex/obexcommserver/src/NSmlObexCommSession.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,411 @@
+/*
+* Copyright (c) 2002-2004 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: SyncML Obex server internal server module
+*
+*/
+
+
+// INCLUDE FILES
+#include <nsmldebug.h>
+#include "nsmlobexcommserver.h"
+#include "nsmlobexdefs.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CNSmlObexCommSession* CNSmlObexCommSession::NewL( CNSmlObexCommServer& aServer )
+ {
+ CNSmlObexCommSession* self = new (ELeave) CNSmlObexCommSession( aServer);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ServiceL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ServiceL( const RMessage2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::ServiceL(): begin");
+ TRAP_IGNORE(DispatchMessageL(aMessage));
+ _DBG_FILE("CNSmlObexCommSession::ServiceL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::DispatchMessageL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::DispatchMessageL( const RMessage2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::DispatchMessageL(): begin");
+ switch( aMessage.Function() )
+ {
+ case ENSmlObexCommCommandDisconnect:
+ Disconnect(aMessage);
+ break;
+ case ENSmlObexCommCommandSend:
+ SendL(aMessage);
+ break;
+ case ENSmlObexCommCommandReceive:
+ ReceiveL(aMessage);
+ break;
+ case ENSmlObexCommCommandCancelReceive:
+ CancelReceive(aMessage);
+ break;
+ case ENSmlObexCommCommandSetReceivePacket:
+ SetReceivedPacketL(aMessage);
+ break;
+ case ENSmlObexCommCommandGetSendPacket:
+ GetSendPacketL(aMessage);
+ break;
+ case ENSmlObexCommCommandCancelGetSendPacket:
+ CancelGetSendPacket(aMessage);
+ break;
+ case ENSmlObexCommCommandListenDisconnect:
+ ListenDisconnect(aMessage);
+ break;
+ case ENSmlObexCommCommandCancelListenDisconnect:
+ CancelListenDisconnect(aMessage);
+ break;
+ default:
+ PanicClient(KErrNotSupported);
+ }
+ _DBG_FILE("CNSmlObexCommSession::DispatchMessageL(): end");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::Disconnect
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::Disconnect( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::Disconnect(): begin");
+ iServer.iClientReceiveTimeOut->Cancel();
+ iServer.iServerGetSendTimeOut->Cancel();
+ iServer.iClientDisconnected = ETrue;
+ if( iServer.iServerListeningDisconnect )
+ {
+ ServerHandleDisconnect(KErrNone);
+ }
+ aMessage.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::Disconnect(): end");
+ }
+
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::SendL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::SendL( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::SendL(): begin");
+
+ HBufC8* tempPtr = NULL;
+ TRAP_IGNORE( tempPtr = HBufC8::NewL(aMessage.GetDesLength(0)) );
+ iServer.iSendBuffer = tempPtr;
+
+ TPtr8 sendBufferPtr = iServer.iSendBuffer->Des();
+ aMessage.ReadL(0, sendBufferPtr, 0);
+ if( iServer.iServerWaitingSendPacket )
+ {
+ ServerGetSendPacketL();
+ }
+ else
+ {
+ iServer.iSendReady = ETrue;
+ }
+ aMessage.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::SendL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ReceiveL( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::ReceiveL(): begin");
+ iServer.iClientReceiveTimeOut->StartTimeoutHandling(this, &CNSmlObexCommSession::ReceiveTimeout);
+ iServer.iClientReceiveMsg = aMessage;
+
+ if( iServer.iClientDisconnected )
+ {
+ DBG_FILE_CODE(iServer.iSessionCount, _S8("CNSmlObexCommSession::Receive(): canceling"));
+ iServer.iClientReceiveMsg.Complete( KErrCancel );
+ }
+ else if( iServer.iRecvReady )
+ {
+ _DBG_FILE("CNSmlObexCommSession before ClientReceivePacketL()");
+ ClientReceivePacketL();
+ }
+ else
+ {
+ _DBG_FILE("CNSmlObexCommSession:: updating iClientWaitingReceivePacket");
+ iServer.iClientWaitingReceivePacket = ETrue;
+ }
+ _DBG_FILE("CNSmlObexCommSession::ReceiveL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::CancelReceive
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::CancelReceive( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::CancelReceive(): begin");
+ if( iServer.iClientWaitingReceivePacket )
+ {
+ iServer.iClientReceiveMsg.Complete(KErrCancel);
+ iServer.iClientWaitingReceivePacket = EFalse;
+ }
+ aMessage.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::CancelReceive(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ReceiveTimeout
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ReceiveTimeout()
+ {
+ _DBG_FILE("CNSmlObexCommSession::ReceiveTimeout(): begin");
+ iServer.iClientWaitingReceivePacket = EFalse;
+ iServer.iClientReceiveMsg.Complete(KErrTimedOut);
+ _DBG_FILE("CNSmlObexCommSession::ReceiveTimeout(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::SetReceivedPacketL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::SetReceivedPacketL( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::SetReceivedPacketL(): begin");
+ TInt err(0);
+ HBufC8* tempPtr = NULL;
+ TRAP( err, tempPtr = HBufC8::NewL(aMessage.GetDesLength(0)) );
+ iServer.iRecvBuffer = tempPtr;
+ TPtr8 recvBufferPtr = iServer.iRecvBuffer->Des();
+ aMessage.ReadL(0, recvBufferPtr, 0);
+
+ if( iServer.iClientWaitingReceivePacket )
+ {
+ ClientReceivePacketL();
+ }
+ else
+ {
+ iServer.iRecvReady = ETrue;
+ }
+ aMessage.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::SetReceivedPacketL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::GetSendPacketL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::GetSendPacketL( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::GetSendPacketL(): begin");
+ iServer.iServerGetSendTimeOut->StartTimeoutHandling(this, &CNSmlObexCommSession::GetSendTimeout);
+ iServer.iServerGetSendMsg = aMessage;
+ if( iServer.iSendReady )
+ {
+ ServerGetSendPacketL();
+ }
+ else
+ {
+ iServer.iServerWaitingSendPacket = ETrue;
+ }
+ _DBG_FILE("CNSmlObexCommSession::GetSendPacketL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::CancelGetSendPacket
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::CancelGetSendPacket( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::CancelGetSendPacket(): begin");
+ DoCancelGetSendPacket();
+ aMessage.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::CancelGetSendPacket(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::DoCancelGetSendPacket
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::DoCancelGetSendPacket()
+ {
+ _DBG_FILE("CNSmlObexCommSession::DoCancelGetSendPacket(): begin");
+ if( iServer.iServerWaitingSendPacket )
+ {
+ iServer.iServerGetSendMsg.Complete(KErrCancel);
+ iServer.iServerWaitingSendPacket = EFalse;
+ }
+ _DBG_FILE("CNSmlObexCommSession::DoCancelGetSendPacket(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::GetSendTimeout
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::GetSendTimeout()
+ {
+ _DBG_FILE("CNSmlObexCommSession::GetSendTimeout(): begin");
+ iServer.iServerWaitingSendPacket = EFalse;
+ iServer.iServerGetSendMsg.Complete(KErrTimedOut);
+ _DBG_FILE("CNSmlObexCommSession::GetSendTimeout(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ListenDisconnect
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ListenDisconnect( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::ListenDisconnect(): begin");
+ iServer.iServerListenDisconnectMsg = aMessage;
+ if( iServer.iClientDisconnected )
+ {
+ ServerHandleDisconnect(KErrNone);
+ }
+ else
+ {
+ iServer.iServerListeningDisconnect = ETrue;
+ }
+ _DBG_FILE("CNSmlObexCommSession::ListenDisconnect(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::CancelListenDisconnect
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::CancelListenDisconnect( const RMessagePtr2& aMessage )
+ {
+ _DBG_FILE("CNSmlObexCommSession::CancelListenDisconnect(): begin");
+ if( iServer.iServerListeningDisconnect )
+ {
+ ServerHandleDisconnect(KErrCancel);
+ }
+ aMessage.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::CancelListenDisconnect(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ConstructL
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ConstructL()
+ {
+ _DBG_FILE("CNSmlObexCommSession::ConstructL(): begin");
+ iServer.IncrementSessions();
+ _DBG_FILE("CNSmlObexCommSession::ConstructL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::CNSmlObexCommSession
+// -----------------------------------------------------------------------------
+//
+CNSmlObexCommSession::CNSmlObexCommSession( CNSmlObexCommServer& aServer ) : iServer(aServer)
+ {
+ _DBG_FILE("CNSmlObexCommSession::CNSmlObexCommSession(): begin");
+ _DBG_FILE("CNSmlObexCommSession::CNSmlObexCommSession(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::~CNSmlObexCommSession
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CNSmlObexCommSession::~CNSmlObexCommSession()
+ {
+ _DBG_FILE("CNSmlObexCommSession::~CNSmlObexCommSession(): begin");
+ iServer.DecrementSessions();
+ _DBG_FILE("CNSmlObexCommSession::~CNSmlObexCommSession(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::PanicClient
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::PanicClient( TInt /*aReason*/ ) const
+ {
+ _DBG_FILE("CNSmlObexCommSession::PanicClient(): begin");
+ _DBG_FILE("CNSmlObexCommSession::PanicClient(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ClientReceivePacketL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ClientReceivePacketL()
+ {
+ _DBG_FILE("CNSmlObexCommSession::ClientReceivePacketL(): begin");
+ iServer.iClientReceiveTimeOut->Cancel();
+ iServer.iClientWaitingReceivePacket = EFalse;
+ iServer.iRecvReady = EFalse;
+ iServer.iClientReceiveMsg.WriteL(0, *iServer.iRecvBuffer, 0);
+ delete iServer.iRecvBuffer;
+ iServer.iRecvBuffer = 0;
+ iServer.iClientReceiveMsg.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::ClientReceivePacketL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ServerGetSendPacketL
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ServerGetSendPacketL()
+ {
+ _DBG_FILE("CNSmlObexCommSession::ServerGetSendPacketL(): begin");
+ iServer.iServerGetSendTimeOut->Cancel();
+ iServer.iServerWaitingSendPacket = EFalse;
+ iServer.iSendReady = EFalse;
+ iServer.iServerGetSendMsg.WriteL(0, *iServer.iSendBuffer, 0);
+ delete iServer.iSendBuffer;
+ iServer.iSendBuffer = 0;
+ iServer.iServerGetSendMsg.Complete(KErrNone);
+ _DBG_FILE("CNSmlObexCommSession::ServerGetSendPacketL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// CNSmlObexCommSession::ServerHandleDisconnect
+// -----------------------------------------------------------------------------
+//
+void CNSmlObexCommSession::ServerHandleDisconnect( TInt aResult )
+ {
+ _DBG_FILE("CNSmlObexCommSession::ServerHandleDisconnect(): begin");
+ DoCancelGetSendPacket();
+ iServer.iServerListenDisconnectMsg.Complete(aResult);
+ iServer.iServerListeningDisconnect = EFalse;
+
+ if( iServer.iClientWaitingReceivePacket )
+ {
+ DBG_FILE_CODE(aResult, _S8("CNSmlObexCommSession::ServerHandleDisconnect() - signal client"));
+ iServer.iClientReceiveMsg.Complete( KErrCancel );
+ iServer.iClientWaitingReceivePacket = EFalse;
+ }
+ _DBG_FILE("CNSmlObexCommSession::ServerHandleDisconnect(): end");
+ }