cbs/CbsServer/ServerSrc/CCbsSession.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbs/CbsServer/ServerSrc/CCbsSession.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,506 @@
+/*
+* Copyright (c) 2003 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:  This module contains the implementation of CCbsSession class 
+*                member functions.
+*    
+*                This class represents a server-side session.
+*
+*                The instances of the class are responsible of handling 
+*                the requests of client-side RCbs and RCbsMcnSession objects.
+*
+*                This class contains handlers for opening subsessions and
+*                retrieving some general CBS information.
+*
+*                Client will be panicked, if a request is invalid. 
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include "CbsCommon.h"
+#include "CbsServerConstants.h"
+#include "CbsServerPanic.h"
+#include "CCbsServer.h"
+#include "CCbsSession.h"
+#include "CCbsObject.h"
+#include "CCbsRecEtel.h"
+#include "CCbsSettings.h"
+#include "CCbsTopicList.h"
+#include "CCbsTopicCollection.h"
+#include "CCbsTopicMessages.h"
+#include "CCbsMcnSession.h"
+
+#include "CCbsDbImp.H"
+#include "CbsLogger.h"
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CCbsSession::CCbsSession
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCbsSession::CCbsSession( 
+    CCbsServer& aServer )
+    : CSession2(), 
+    iCbsServer( aServer )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCbsSession::ConstructL()
+    {
+    CBSLOGSTRING("CBSSERVER: >>> CCbsSession::ConstructL()");
+    CBSLOGSTRING("CBSSERVER: <<< CCbsSession::ConstructL()");
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSession2* CCbsSession::NewL(     
+    CCbsServer& aServer )
+    {
+    CCbsSession* self = new ( ELeave ) CCbsSession( aServer );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+    
+// Destructor
+// Session destructor is called when the client-side session
+// object makes a Close()-call. There's no need to send
+// a "close session" request to the server.
+CCbsSession::~CCbsSession()
+    {
+    CBSLOGSTRING("CBSSERVER: >>> CCbsSession::~CCbsSession()");    
+    CBSLOGSTRING("CBSSERVER: <<< CCbsSession::~CCbsSession()"); 
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::DispatchMessageL
+// Finds the appropriate message service method and calls it to 
+// handle the request. 
+// 
+// Relays a message to a proper message handling method. 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsSession::DispatchMessageL( 
+    const RMessage2& aMessage )
+    {
+    if ( !HandleSessionRequestsL( aMessage ) ) 
+        {
+        // The request was not for the session. Submit requests to 
+        // the correct subsessions.
+        CCbsObject* object = iCbsServer.ReturnObjectByHandle( aMessage.Int3() );
+
+        if ( object )
+            {
+            // Let the subsession to handle the request
+            if ( !object->HandleRequestsL( aMessage ) )
+                {
+                aMessage.Complete( KErrNotSupported );
+                }
+            }
+        else
+            {
+            PanicClient( ECbsBadRequest );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::HandleSessionRequestsL
+// Handles the session-based requests.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CCbsSession::HandleSessionRequestsL( 
+    const RMessage2& aMessage )
+    {
+    TBool result( ETrue );
+    TCbsServerRequest request( ( TCbsServerRequest ) aMessage.Function() );    
+
+    // Handle requests for the session.
+    switch ( request ) 
+        {
+        case EMcnCloseSession:
+            {
+            // Close the session
+            aMessage.Complete( KErrNone );
+            }            
+            break;
+
+        case ECbsCloseSession:
+            {
+            // Close the session
+            aMessage.Complete( KErrNone );                
+            }
+            break;
+                
+        case EMcnGetCellInfo:
+        case EMcnGetInfoMessage:
+            {
+            GetCurrentMcnInfoL();
+            }            
+            break;
+
+        case ECbsCreateSettingsSubsession:
+            {
+            NewSettingsL();                
+            }            
+            break;
+
+        case ECbsCreateTopicListSubsession:            
+            {
+            NewTopicListL();
+            }
+            
+            break;
+
+        case ECbsCreateTopicMessagesSubsession:            
+            {
+            NewTopicMessagesL();
+            }
+            break;
+
+        case ECbsCreateTopicCollectionSubsession:            
+            {
+            NewTopicCollectionL();
+            }                    
+            break;
+
+        case EMcnCreateSubsession:
+            {
+            NewMcnSubsessionL();
+            }            
+            break;
+           
+        case ECbsShutdown:        
+            {
+            iCbsServer.Shutdown();
+            aMessage.Complete( KErrNone );
+            }                                
+            break;        
+
+        default:
+            // The request was not for the session.
+            result = EFalse;
+        }
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::PanicClient
+// Panics the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsSession::PanicClient( 
+    TCbsSessionPanic aPanic ) const
+    {    
+    // Panic
+    iCurrentMessage.Panic( KCbsServerName, aPanic );
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::TotalTopicsDetected
+// Returns the number of new topics detected. 
+// The counter will be reset after a call.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCbsSession::TotalTopicsDetected()
+    {
+    return iCbsServer.TotalTopicsDetected();
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::Message
+// Returns the current message in process 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+RMessage2& CCbsSession::Message()
+    {
+    return iCurrentMessage;
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::ServiceL
+// Handles the received message.
+// The method simply calls DispatchMessageL to process a
+// message and informs the client if the handling failed.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCbsSession::ServiceL( 
+    const RMessage2& aMessage )
+    {
+    iCurrentMessage = aMessage;
+
+    TRAPD( result, DispatchMessageL( aMessage ) );
+
+    if ( result != KErrNone )
+        {
+        // Inform the client
+        aMessage.Complete( result );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::NewSettingsL
+// Create a new subsession, settings, for the session.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//  
+void CCbsSession::NewSettingsL()
+    {
+    // Create a new settings object
+    CCbsSettings* object = 
+        CCbsSettings::NewL( *this, iCbsServer.Database().SettingsL(), 
+            iCbsServer.Receiver() );
+    
+    // Add the object to the object container to generate unique id
+    iCbsServer.Container().AddL( object );
+
+    // Add object to object index; this returns a unique handle so 
+    // we can get it again
+    TInt handle( iCbsServer.ObjectIx().AddL( object ) );
+
+    // Write the handle to client
+    TPckg< TInt > handlePckg( handle );
+    TRAPD( result, iCurrentMessage.WriteL( 3, handlePckg ) );
+
+    if ( result != KErrNone )
+        {
+        // Writing failed, the client called the server in a wrong way
+        iCbsServer.ObjectIx().Remove( handle );
+        PanicClient( ECbsBadDescriptor );
+        }
+    else
+        {
+        Message().Complete( KErrNone );
+        }        
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::NewTopicListL
+// Create a new subsession, topic list, for the session.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//  
+void CCbsSession::NewTopicListL()
+    {
+    // Create a new topic list object
+    CCbsTopicList* object = 
+        CCbsTopicList::NewL( *this, iCbsServer.Database().TopicListL(),
+            iCbsServer.Receiver() );
+
+    // Add the object to the object container to generate unique id
+    iCbsServer.Container().AddL( object );
+
+    // Add object to object index; this returns a unique handle 
+    // so we can get it again
+    TInt handle( iCbsServer.ObjectIx().AddL( object ) );
+
+    // Write the handle to client
+    TPckg< TInt > handlePckg2( handle );
+    TRAPD( result, iCurrentMessage.WriteL( 3, handlePckg2 ) );
+
+    if ( result != KErrNone )
+        {
+        // Writing failed, the client called the server in a wrong way
+        iCbsServer.ObjectIx().Remove( handle );
+        PanicClient( ECbsBadDescriptor );
+        }
+    else
+        {
+        Message().Complete( KErrNone );
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::NewTopicCollectionL
+// Create a new subsession, topic collection, for the session.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CCbsSession::NewTopicCollectionL()
+    {
+    // Create a new topic list object
+    CCbsTopicCollection* object = 
+        CCbsTopicCollection::NewL( *this, 
+            iCbsServer.Database().TopicCollectionL(),
+            iCbsServer.Database().TopicListL() );
+
+    // Add the object to the object container to generate unique id
+    iCbsServer.Container().AddL( object );
+
+    // Add object to object index; this returns a unique handle 
+    // so we can get it again
+    TInt handle( iCbsServer.ObjectIx().AddL( object ) );    
+
+    // Write the handle to client
+    TPckg< TInt > handlePckg2( handle );
+    TRAPD( result, iCurrentMessage.WriteL( 3, handlePckg2 ) );
+
+    if ( result != KErrNone )
+        {
+        // Writing failed, the client called the server in a wrong way
+        iCbsServer.ObjectIx().Remove( handle );
+        PanicClient( ECbsBadDescriptor );
+        }
+    else
+        {
+        Message().Complete( KErrNone );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::NewTopicMessagesL
+// Create a new subsession, topic messages, for the session.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CCbsSession::NewTopicMessagesL()
+    {
+    // Create a new topic list object
+    CCbsTopicMessages* object = 
+        CCbsTopicMessages::NewL( *this, 
+            iCbsServer.Database().TopicMessagesL(),
+            iCbsServer.Receiver() );
+
+    // Add the object to the object container to generate unique id
+    iCbsServer.Container().AddL( object );
+
+    // Add object to object index; this returns a unique handle 
+    // so we can get it again
+    TInt handle( iCbsServer.ObjectIx().AddL( object ) );
+
+    // Write the handle to client
+    TPckg< TInt > handlePckg2( handle );
+    TRAPD( result, iCurrentMessage.WriteL( 3, handlePckg2 ) );
+
+    if ( result != KErrNone )
+        {
+        // Writing failed, the client called the server in a wrong way
+        iCbsServer.ObjectIx().Remove( handle );
+        PanicClient( ECbsBadDescriptor );
+        }
+    else
+        {
+        Message().Complete( KErrNone );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::NewMcnSubsessionL
+// Create a new MCN subsession.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CCbsSession::NewMcnSubsessionL()
+    {
+    // Create a new settings object
+    CCbsMcnSession* object = 
+        CCbsMcnSession::NewL( *this, iCbsServer.Receiver() );
+    
+    // Add the object to the object container to generate unique id
+    iCbsServer.Container().AddL( object );
+
+    // Add object to object index; this returns a unique handle so 
+    // we can get it again
+    TInt handle( iCbsServer.ObjectIx().AddL( object ) );
+
+    // Write the handle to client
+    TPckg< TInt > handlePckg( handle );
+    TRAPD( result, iCurrentMessage.WriteL( 3, handlePckg ) );
+
+    if ( result != KErrNone )
+        {
+        // Writing failed, the client called the server in a wrong way
+        iCbsServer.ObjectIx().Remove( handle );
+        PanicClient( ECbsBadDescriptor );
+        }   
+    else
+        {
+        Message().Complete( KErrNone );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::GetCurrentMcnInfoL
+// Return the current cell info message to the client.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+void CCbsSession::GetCurrentMcnInfoL()
+    {
+    TBuf<KCbsMcnMessageMaxLength> buf;    
+    
+    // First, read topic number from the client
+
+    TInt topicNumber( 0 );
+    topicNumber = iCurrentMessage.Int1();
+
+    TInt infoReceived( KErrNone );
+    if ( topicNumber == KCellInfoTopic )
+        {
+        infoReceived = iCbsServer.Receiver().GetCurrentMessage( buf, KCellInfoTopic );
+        }
+    else if ( topicNumber == KHomeZoneTopic )
+        {
+        infoReceived = iCbsServer.Receiver().GetCurrentMessage( buf, KHomeZoneTopic );
+        }
+    else
+        {
+        infoReceived = KErrNotSupported;
+        }
+
+    TRAPD( result, iCurrentMessage.WriteL( 0, buf ) );
+    
+    if ( result != KErrNone )
+        {
+        PanicClient( ECbsBadDescriptor );
+        }
+    else
+        {
+        Message().Complete( infoReceived );
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CCbsSession::Server
+// Return the server instance
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+// 
+CCbsServer& CCbsSession::Server()
+    {
+    return iCbsServer;
+    }
+
+//  End of File