--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmserv/sts/stsserver/src/stsserver.cpp Tue Aug 31 15:43:02 2010 +0300
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 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:
+ * This file is the implementation of the Symbian STS Server. This
+ * file handles the Symbian specific server creation/deletation
+ * activities, and adding/removing sessions. The actual STS
+ * functionality is handled in the STS class.
+ */
+
+// Include Files
+#include "stsserver.h"
+#include "stsserversession.h"
+#include "sts.h"
+
+// Total number of ranges
+const TUint KStsRangeCount = 3;
+
+// Definition of the ranges of IPC numbers
+const TInt KStsRanges[KStsRangeCount] =
+ {
+ 0, 2, KStsCmdLast + 1
+ };
+
+// Policy to implement for each of the above ranges
+const TUint8 KStsElementsIndex[KStsRangeCount] =
+ {
+ CPolicyServer::EAlwaysPass,
+ CPolicyServer::ECustomCheck,
+ CPolicyServer::ENotSupported
+ };
+
+// Package all the above together into a policy
+const CPolicyServer::TPolicy KStsPolicy =
+ {
+ CPolicyServer::EAlwaysPass, // specifies all connect attempts should pass
+ KStsRangeCount, // number of ranges
+ KStsRanges, // ranges array
+ KStsElementsIndex, // elements<->ranges index
+ NULL
+ };
+
+// CStsServer IMPLEMENTATION
+
+CStsServer* CStsServer::NewLC()
+ {
+ CStsServer* self = new (ELeave) CStsServer();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+ }
+
+CStsServer::CStsServer() :
+ CPolicyServer(0, KStsPolicy, ESharableSessions), iSts(0)
+ {
+ }
+
+void CStsServer::ConstructL()
+ {
+ StartL(KStsServerName);
+ iSts = CSts::Create();
+ if (iSts == 0)
+ {
+ User::Leave(KErrNoMemory);
+ }
+ }
+
+CStsServer::~CStsServer()
+ {
+ iSessions.ResetAndDestroy();
+ CSts::Delete(iSts);
+ }
+
+// Performs security checks based on the tone or Alarm type.
+CPolicyServer::TCustomResult CStsServer::CustomSecurityCheckL(
+ const RMessage2& aMsg, TInt& /*aAction*/, TSecurityInfo& aMissing)
+ {
+ CPolicyServer::TCustomResult result;
+
+ switch (aMsg.Function())
+ {
+ case StsMsg_PlayTone:
+ case StsMsg_PlayToneAlarm:
+ {
+ CSystemToneService::TToneType tone =
+ (CSystemToneService::TToneType) aMsg.Int0();
+ result = SecurityCheckTone(tone, aMsg, aMissing);
+ }
+ break;
+ case StsMsg_PlayAlarm:
+ {
+ CSystemToneService::TAlarmType alarm =
+ (CSystemToneService::TAlarmType) aMsg.Int0();
+ result = SecurityCheckAlarm(alarm, aMsg, aMissing);
+ }
+ break;
+ default:
+ result = CPolicyServer::EFail;
+ }
+
+ return result;
+ }
+
+CPolicyServer::TCustomResult CStsServer::SecurityCheckAlarm(
+ CSystemToneService::TAlarmType aAlarm, const RMessage2& /*aMsg*/,
+ TSecurityInfo& /*aMissing*/)
+ {
+ CPolicyServer::TCustomResult result;
+ switch (aAlarm)
+ {
+ default:
+ result = CPolicyServer::EPass;
+ }
+ return result;
+ }
+
+CPolicyServer::TCustomResult CStsServer::SecurityCheckTone(
+ CSystemToneService::TToneType aTone, const RMessage2& /*aMsg*/,
+ TSecurityInfo& /*aMissing*/)
+ {
+ CPolicyServer::TCustomResult result;
+ switch (aTone)
+ {
+ default:
+ result = CPolicyServer::EPass;
+ }
+ return result;
+ }
+
+CSession2* CStsServer::NewSessionL(const TVersion& aVersion, const RMessage2& /*aMessage*/) const
+ {
+ if (aVersion.iMajor != KStsServerMajorVersion || aVersion.iMinor
+ != KStsServerMinorVersion || aVersion.iBuild != KStsServerBuild)
+ {
+ User::Leave(KErrNotSupported);
+ }
+ else
+ {
+ //TODO: Add trace here
+ }// end if
+
+ CStsServer& nonConstThis = *const_cast<CStsServer*> (this);
+
+ // Construct a new session, passing it a pointer to the server object. This function
+ // is const, so the const-ness must be cast away from the this pointer.
+ CSession2* returnValue = new (ELeave) CStsServerSession(nonConstThis,
+ *iSts);
+
+ return returnValue;
+ }
+
+void CStsServer::AddSession(CStsServerSession* aSession)
+ {
+ iSessions.Append(aSession);
+ }
+
+void CStsServer::DropSession(CStsServerSession* aSession)
+ {
+ // Find the current session in the list of sessions.
+ TInt index = iSessions.Find(aSession);
+
+ if (index != KErrNotFound)
+ {
+ // Remove the session from the list of sessions.
+ iSessions.Remove(index);
+ }
+ else
+ {
+ //TODO: Add trace here
+ } // end if
+
+ if (iSessions.Count() == 0)
+ {
+ // No more clients. Shutdown the server.
+ CActiveScheduler::Stop();
+ }
+ }
+
+// SERVER LAUNCHING FUNCTIONALITY
+
+EXPORT_C void CStsServer::RunServerL()
+ {
+ // naming the server thread after the server helps to debug panics
+ User::LeaveIfError(User::RenameThread(KStsServerName));
+
+ // create and install the active scheduler
+ CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
+ CleanupStack::PushL(scheduler);
+ CActiveScheduler::Install(scheduler);
+
+ // create the server (leave it on the cleanup stack)
+ CStsServer* server = CStsServer::NewLC();
+
+ // Initialisation complete, now signal the client.
+ RProcess::Rendezvous(KErrNone);
+
+ // Ready to run
+ // Start wait loop, will return when server is shutdown
+ CActiveScheduler::Start();
+
+ // Cleanup the server
+ CleanupStack::PopAndDestroy(server);
+
+ // Cleanup scheduler after shutdown
+ CleanupStack::PopAndDestroy(scheduler);
+ }