00001 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). 00002 // All rights reserved. 00003 // This component and the accompanying materials are made available 00004 // under the terms of "Eclipse Public License v1.0" 00005 // which accompanies this distribution, and is available 00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". 00007 // 00008 // Initial Contributors: 00009 // Nokia Corporation - initial contribution. 00010 // 00011 // Contributors: 00012 // 00013 // Description: 00014 // 00015 00016 #if !defined(__ComplexServer_H__) 00017 #define __ComplexServer_H__ 00018 00019 //needed for creating server thread. 00020 const TUint KDefaultHeapSize=0x10000; 00021 00022 // panic reasons 00023 enum TCountServPanic 00024 { 00025 EBadRequest = 1, 00026 EBadDescriptor, 00027 EDescriptorNonNumeric, 00028 EMainSchedulerError, 00029 ESvrCreateServer, 00030 ESvrStartServer, 00031 ECreateTrapCleanup, 00032 EBadCounterRemove, 00033 EBadSubsessionHandle 00034 }; 00035 00036 00037 00038 00039 /* 00040 CCountServer class 00041 00042 Represents the server. 00043 00044 The server starts with the first client connect call. 00045 Start includes setting up active scheduler, the server active object, 00046 and the object container index which produces object object containers for each session. 00047 */ 00048 class CCountServer : public CServer2 00049 { 00050 public: 00051 00052 00053 // Creates a new session with the server; the function 00054 // implements the pure virtutal function 00055 // defined in class CServer2 00056 CSession2* NewSessionL(const TVersion &aVersion,const RMessage2& aMessage) const; 00057 00058 public: 00059 // Creats a new server object 00060 static CCountServer* NewL(CActive::TPriority aActiveObjectPriority); 00061 00062 // The thread function executed by the server 00063 static TInt ThreadFunction(TAny* aStarted); 00064 00065 // utility function to panic the server. 00066 static void PanicServer(TCountServPanic aPanic); 00067 00068 public : 00069 // Constructor 00070 CCountServer(CActive::TPriority aActiveObjectPriority); 00071 00072 // Second phase constructor 00073 void ConstructL(); 00074 00075 // Returns an object container, and guaranteed 00076 // to produce object containers with unique 00077 // ids within the server. 00078 // Called by a new session to create a container 00079 CObjectCon* NewContainerL(); 00080 00081 // Removes container from the container list 00082 void RemoveContainer(CObjectCon *aCon); 00083 00084 // Destructor; exists to do some tidying up. 00085 ~CCountServer(); 00086 00087 private: 00088 // The server has an object container index that 00089 // creates an object container for each session. 00090 CObjectConIx* iContainerIndex; 00091 }; 00092 00093 00094 00095 00096 /* 00097 CCountSession class 00098 00099 Represents a session with the server. 00100 00101 Functions are provided to respond appropriately to client messages. 00102 A session can own any number of subsession objects. 00103 */ 00104 class CCountSubSession; 00105 class CCountSession : public CSession2 00106 { 00107 public: 00108 // Create the session 00109 static CCountSession* NewL(); 00110 00111 public: 00112 // Constructor 00113 CCountSession(); 00114 00115 // Called by client/server framework after 00116 // session has been successfully created 00117 void CreateL(); 00118 00119 // Service request 00120 void ServiceL(const RMessage2& aMessage); 00121 void DispatchMessageL(const RMessage2& aMessage); 00122 00123 // Creates new subsession 00124 void NewCounterL(const RMessage2& aMessage); 00125 00126 // Closes the session 00127 void CloseSession(); 00128 00129 // Gets the number of resources (i.e. CCountSubSession objects) 00130 void NumResourcesL(const RMessage2& aMessage); 00131 00132 // Utility to return the CCountSubSession (subsession) object 00133 CCountSubSession* CounterFromHandle(const RMessage2& aMessage,TInt aHandle); 00134 00135 // Delete the subsession object through its handle. 00136 void DeleteCounter(TInt aHandle); 00137 00138 // Gets the number of server-side subsession objects. 00139 TInt CountResources(); 00140 00141 // Panics client 00142 void PanicClient(const RMessage2& aMessage,TInt aPanic) const; 00143 00144 private: 00145 // Object container for this session. 00146 CObjectCon *iContainer; 00147 00148 // Object index which stores objects 00149 // (CCountSubSession instances) for this session. 00150 CObjectIx* iCountersObjectIndex; 00151 00152 // Total number of resources. In this example 00153 // a resource is just the number of CCountSubSession objects. 00154 TInt iResourceCount; 00155 }; 00156 00157 00158 00159 00160 /* 00161 CCountSubSession class 00162 00163 Represents a subsession of CCountSession. 00164 */ 00165 class CCountSubSession : public CObject 00166 { 00167 public: 00168 // creates a new CCountSubSession object. 00169 static CCountSubSession* NewL(CCountSession* aSession); 00170 00171 public: 00172 CCountSubSession(CCountSession* aSession); 00173 void ConstructL(CCountSession* aSession); 00174 void SetFromStringL(const RMessage2& aMessage); 00175 void Increase(); 00176 void IncreaseBy(const RMessage2& aMessage); 00177 void Decrease(); 00178 void DecreaseBy(const RMessage2& aMessage); 00179 void Reset(); 00180 void CounterValueL(const RMessage2& aMessage); 00181 00182 protected: 00183 // The session that owns this CCountSubSession object. 00184 CCountSession* iSession; 00185 00186 private: 00187 // The counter value 00188 TInt iCount; 00189 }; 00190 00191 #endif
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.