diff -r 63be7eb3fc78 -r f28ada11abbf wlanutilities/wlansniffer/engine/server/src/wsfserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlanutilities/wlansniffer/engine/server/src/wsfserver.cpp Wed Sep 01 12:20:32 2010 +0100 @@ -0,0 +1,351 @@ +/* +* Copyright (c) 2007-2008 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: Implementation of CWsfServer +* +*/ + + +// CLASS HEADER +#include "wsfserver.h" + +// INTERNAL INCLUDES +#include "wsfengine.h" +#include "wsfsession.h" +#include "wsfservercommon.h" +#include "wsflogger.h" + + +// LOCAL DEFINITIONS +/** +* Number of security ranges +*/ +static const TInt KRangeCount = 1; + + +/** +* Security ranges +*/ +static const TInt KSecurityRanges[KRangeCount] = + { + 0, + }; + + +/** +* Policy for the security ranges +*/ +static const TUint8 KSecurityRangesPolicy[KRangeCount] = + { + CPolicyServer::ECustomCheck + }; + + +/** +* The complete policy structure +*/ +static const CPolicyServer::TPolicy KPolicy = + { + CPolicyServer::EAlwaysPass, + KRangeCount, + KSecurityRanges, + KSecurityRangesPolicy, + NULL, + }; + + +/** +* Secure ID of the Active Idle (ailaunch.exe) +*/ +static _LIT_SECURE_ID( KSidActiveIdle, 0x102750F0 ); + + + +// --------------------------------------------------------------------------- +// CWsfServer::NewLC +// --------------------------------------------------------------------------- +// +CWsfServer* CWsfServer::NewLC() + { + CWsfServer* snifferServer = new (ELeave) CWsfServer( + CActive::EPriorityHigh ); + CleanupStack::PushL( snifferServer ); + snifferServer->ConstructL(); + snifferServer->StartL( KWlanSnifferServerName ); + + return snifferServer; + } + + +// --------------------------------------------------------------------------- +// CWsfServer::NewSessionL +// --------------------------------------------------------------------------- +// +CSession2* CWsfServer::NewSessionL( const TVersion& aVersion, + const RMessage2& /*aMessage*/) const + { + LOG_ENTERFN( "CWsfServer::NewSessionL" ); + // check we're the right version + TVersion v( KWlanSnifferServerMajor, + KWlanSnifferServerMinor, + KWlanSnifferServerBuild ); + + if ( !User::QueryVersionSupported( v, aVersion ) ) + { + User::Leave( KErrNotSupported ); + } + + // make new session + CSession2* newSession = CWsfSession::NewL( + const_cast( *this ) ); + + return newSession; + } + + +// --------------------------------------------------------------------------- +// CWsfServer::CWsfServer +// --------------------------------------------------------------------------- +// +CWsfServer::CWsfServer( TInt aPriority ): + CPolicyServer( aPriority, KPolicy ), + iClientCount( 0 ) + { + } + + +// --------------------------------------------------------------------------- +// CWsfServer::~CWsfServer +// --------------------------------------------------------------------------- +// +CWsfServer::~CWsfServer() + { + delete iCloser; + delete iEngine; + } + + +// --------------------------------------------------------------------------- +// CWsfServer::ConstructL +// --------------------------------------------------------------------------- +// +void CWsfServer::ConstructL() + { + iCloser = CWsfServerCloser::NewL(); + + iEngine = CWsfEngine::NewL( *iCloser ); + + // start the closing up procedure + // so we won't be left running if no clients would appear + iCloser->WaitForClients( EFalse ); + + } + + +// --------------------------------------------------------------------------- +// CWsfServer::ClientRelease +// --------------------------------------------------------------------------- +// +void CWsfServer::ClientRelease() + { + LOG_ENTERFN( "CWsfServer::ClientRelease" ); + --iClientCount; + + // even if there are no clients, we might need to keep the server alive + // to maintain the connection or clean up IAPs properly + if ( !iClientCount ) + { + + // The last client is released. + // Iap deletion must not suppress anymore. Make sure the flag is off. + iEngine->ResetSuppressIapDeletion(); + + // From this point on, the server is kept alive to wait for connection notifications if necessary. + // E.g. browser could be launched by sniffer and WLAN connection still exists after sniffer shut down, + // server waits for connection lost callback and cleans up temporary IAPs when connection is closed. + + // If no connections are available, make sure the the server is NOT kept alive to wait + // browser exit, because the server is not set to monitor those notifications directly. + if( !iEngine->IsConnected() ) + { + iCloser->WaitForBrowserExit( EFalse ); + } + + iCloser->WaitForClients( EFalse ); + } + } + + +// --------------------------------------------------------------------------- +// CWsfServer::ClientAttach +// --------------------------------------------------------------------------- +// +void CWsfServer::ClientAttach() + { + LOG_ENTERFN( "CWsfServer::ClientAttach" ); + iCloser->Cancel(); + ++iClientCount; + + iCloser->WaitForClients( ETrue ); + } + + +// --------------------------------------------------------------------------- +// CWsfServer::Engine +// --------------------------------------------------------------------------- +// +CWsfEngine* CWsfServer::Engine() + { + return iEngine; + } + + +// --------------------------------------------------------------------------- +// CWsfServer::RunServer +// --------------------------------------------------------------------------- +// +TInt CWsfServer::RunServer() + { + CTrapCleanup* cleanup = CTrapCleanup::New(); + TInt ret = KErrNoMemory; + if ( cleanup ) + { + TRAP( ret, CWsfServer::RunServerL() ); + delete cleanup; + } + + if ( ret != KErrNone ) + { + // Signal the client that server creation failed + RProcess::Rendezvous( ret ); + } + + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// CWsfServer::RunServerL +// --------------------------------------------------------------------------- +// +void CWsfServer::RunServerL() + { + // Create and install the active scheduler we need + CActiveScheduler *as = new (ELeave) CActiveScheduler; + CleanupStack::PushL( as ); + CActiveScheduler::Install( as ); + + // Create server + CWsfServer::NewLC(); + + // Initialisation complete, now signal the client + User::LeaveIfError( RThread().RenameMe( KWlanSnifferServerName ) ); + RProcess::Rendezvous( KErrNone ); + + // Ready to run + CActiveScheduler::Start(); + + // Cleanup the server and scheduler + CleanupStack::PopAndDestroy( 2, as ); + } + + +// --------------------------------------------------------------------------- +// CWsfServer::RunError +// --------------------------------------------------------------------------- +// +TInt CWsfServer::RunError( TInt /*aError*/ ) + { + return KErrNone; + } + + +// --------------------------------------------------------------------------- +// CWsfServer::E32Main +// --------------------------------------------------------------------------- +// +TInt E32Main() + { + TInt error( KErrNone ); + error = CWsfServer::RunServer(); + return error; + } + + +// --------------------------------------------------------------------------- +// CWsfServer::CustomSecurityCheckL +// --------------------------------------------------------------------------- +// +CPolicyServer::TCustomResult CWsfServer::CustomSecurityCheckL( + const RMessage2& aMsg, + TInt& /*aAction*/, + TSecurityInfo& /*aMissing*/ ) + { + TCustomResult ret = EFail; + + switch ( aMsg.Function() ) + { + // NULL CAPABILITIES + case ESnifferCmdNotifyEvents: + case ESnifferCmdCancelNotifyEvents: + case ESnifferCmdIsScanEnabled: + case ESnifferCmdCancelAll: + case ESnifferCmdConnectionName: + case ESnifferCmdIsConnected: + case ESnifferCmdMonitorAp: + { + ret = EPass; + break; + } + + // CAPABILITY NEEDED + case ESnifferCmdActivateScan: + case ESnifferCmdDisableScan: + case ESnifferCmdWlanDataSize: + case ESnifferCmdGetWlanInfo: + case ESnifferCmdConnectedDetails: + case ESnifferCmdConnect: + case ESnifferCmdDisconnect: + case ESnifferCmdRequestScan: + case ESnifferCmdAbortScanning: + case ESnifferCmdAbortConnecting: + case ESnifferCmdSetIapPersistence: + case ESnifferCmdControlDisconnectTimer: + { + // if it is called from ailaunch.exe + // disgusting workaround + if ( aMsg.SecureId() == KSidActiveIdle ) + { + ret = EPass; + } + else + { + ret = ( aMsg.HasCapability( ECapabilityNetworkServices ) && + aMsg.HasCapability( ECapabilityNetworkControl ) )? + EPass : EFail; + } + break; + } + + default: + { + ret = EPass; + break; + } + + } + + + return ret; + } +