亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gsdpserver.cpp

?? 《SymbianOSC手機應用開發》源碼
?? CPP
字號:
// gsdpserver.cpp
//
// Copyright (c) 2000 Symbian Ltd.  All rights reserved.

#include "gsdpserver.h"
#include <ecom\ecom.h>

#include <e32math.h>
#include <e32std.h>

void PanicServer(TInt aPanic)
	{
	_LIT(KPanicCategory,"GSDP Server");
	User::Panic(KPanicCategory, aPanic);
	}

void CGsdpScheduler::TServerStart::SignalL()
//
// Signal the owning thread that the server has started successfully
// This may itself fail
//
	{
	RThread starter;
	User::LeaveIfError(starter.Open(iId));
	starter.RequestComplete(iStatus,KErrNone);
	starter.Close();
	}

/*
	class CGsdpScheduler
*/

TInt CGsdpScheduler::LaunchFromClient()
	{
	TRequestStatus started;
	TServerStart start(started);

	const TUidType serverUid(KNullUid,KNullUid,KNullUid);

#ifdef __WINS__
		//
	// To deal with the unique thread (+semaphore!) naming in EPOC,
	// and that we may be trying to restart a server that has just
	// exited we attempt to create a unique thread name for the
	// server.  This uses Math::Random() to generate a 32-bit random
	// number for the name
	//
	TName name(KGsdpServerName);
	name.AppendNum(Math::Random(),EHex);
	RThread server;
	TInt r=server.Create(name,ThreadFunction,
						 KDefaultStackSize*2, KMinHeapSize, 100000,
						 &start, EOwnerProcess);
#else
	//
	// EPOC is easy, we just create a new server process. Simultaneous
	// launching of two such processes should be detected when the
	// second one attempts to create the server object, failing with
	// KErrAlreadyExists.
	//
	RProcess server;
	TInt r=server.Create(KGsdpServerExe,start.AsCommand(),serverUid);
#endif
	if (r!=KErrNone)
		return r;
	TRequestStatus died;
	server.Logon(died);
	if (died!=KRequestPending)
		{
		// logon failed - server is not yet running, so cannot have terminated
		User::WaitForRequest(died);	// eat signal
		server.Kill(0);				// abort startup
		server.Close();
		return died.Int();
		}
	//
	// logon OK - start the server
	server.Resume();
	User::WaitForRequest(started,died);		// wait for start or death
	if (started==KRequestPending)
		{
		// server has died, never made it to the startup signal
		server.Close();
		return died.Int();
		}
	//
	// server started (at last). Cancel and consume the death-notification
	// before reporting success
	server.LogonCancel(died);
	server.Close();
	User::WaitForRequest(died);		// eat the signal (from the cancel)
	return KErrNone;
	}

#ifdef __WINS__
TInt CGsdpScheduler::ThreadFunction(TAny* aThreadParms)
	{
	// get a handle to our code to prevent yank on client death
	RLibrary lib;
	lib.Load(_L("gsdp.dll")); // this ought to work, so no error handling
	// go with the thread
	return ThreadStart(*static_cast<TServerStart*>(aThreadParms));
	}
#endif

EXPORT_C TInt CGsdpScheduler::ThreadStart(TServerStart& aStart)
	{
	// get cleanup stack
	CTrapCleanup* cleanup=CTrapCleanup::New();
#ifdef _DEBUG
	TRAPD(terr, 
		for(TInt i=0; i< 20; i++)
			CleanupStack::PushL((TAny*)NULL);
		CleanupStack::Pop(20);
		);
#endif
	__UHEAP_MARK;
	// initialize all up to and including starting scheduler
	TInt err = KErrNoMemory;
	if (cleanup)
		{
		TRAP(err, ConstructL(aStart));
		delete cleanup;
		}
	__UHEAP_MARKEND;
	return err;
	}

void CGsdpScheduler::ConstructL(TServerStart& aStart)
	{
	// construct active scheduler
	CGsdpScheduler* self=new(ELeave) CGsdpScheduler;
	CleanupStack::PushL(self);
	CActiveScheduler::Install(self);
	// construct server
	self->iServer=new(ELeave) CGsdpServer;
	self->iServer->ConstructL();
	// Let the client know we've started OK
	aStart.SignalL();
	CActiveScheduler::Start();
	// Destroy the scheduler
	CleanupStack::PopAndDestroy(self);
	}

CGsdpScheduler::~CGsdpScheduler()
	{
	delete iServer;
	}

void CGsdpScheduler::Error(TInt /*aError*/) const
	{
	__DEBUGGER();
	PanicServer(EErrorFromNonClientObject);
	}

/*
	class CGsdpServer
*/

// construct

CGsdpServer::CGsdpServer()
	: CServer(0, ESharableSessions)
	{
	}

void CGsdpServer::ConstructL()
	{
	// construct receive queue
	iReceiveQueue= CGsdpReceiveQueue::NewL(*this);
	// construct shutdown timer
	iShutdown=new(ELeave) CGsdpDelayedShutdown();
	iShutdown->ConstructL();
	// construct port allocator
	iPortAllocator=new(ELeave) CGsdpPortAllocator;
	iPortAllocator->ConstructL();

	// Initialise the protocol info
	InitProtocolsL();
	iProtoUpdater = CGsdpProtocolUpdater::NewL(*this);
	// identify ourselves and open for service
	StartL(KGsdpServerName);
	// initiate shut down unless we get client connections
	iShutdown->Start();
	}

void CGsdpServer::InitProtocolsL()
	/**
	   Initialise the server protocol information structures and
	   instantiate the loopback protocol.
	*/
	{
	REComSession::ListImplementationsL(KGdpProtocolImpl, iProtocolInfo);
	CGsdpGdpAdapter* adapter = CGsdpGdpAdapter::NewL(*this);
	CleanupStack::PushL(adapter);
	CGdpSession* loop = CGdpSession::NewL(KGdpLoopbackUid);
	adapter->SetProtocolL(loop);  // Takes ownership before leaving
	User::LeaveIfError(iAdapters.Append(adapter));
	CleanupStack::Pop(adapter);
	}

void CGsdpServer::UpdateProtocolInfo()
	{
	RImplInfoPtrArray imps;
	TRAPD(err,REComSession::ListImplementationsL(KGdpProtocolImpl, imps));
	if(err == KErrNone)
		{
		iProtocolInfo.ResetAndDestroy();
		iProtocolInfo = imps;
		}
	else
		imps.ResetAndDestroy();
	}


CGsdpServer::~CGsdpServer()
	{
	iAdapters.ResetAndDestroy();
	iProtocolInfo.ResetAndDestroy();
	delete iReceiveQueue;
	delete iPortAllocator;
	delete iShutdown;
	delete iProtoUpdater;
	}

// from CServer

CSharableSession* CGsdpServer::NewSessionL(const TVersion& /* aVersion */) const
	{
	CGsdpSession* session=new(ELeave) CGsdpSession();
	CleanupStack::PushL(session);
	session->ConstructL(*const_cast<CGsdpServer*>(this));
	CleanupStack::Pop(session);
	const_cast<CGsdpServer*>(this)->IncrementSessions();
	return session;
	}

TInt CGsdpServer::RunError(TInt aErr)
	/**
	   Handle leaves from ServiceL.

	   Any leave from a ServiceL() will land up here.
	*/
	{
	// if it's a bad descriptor, panic the client
	if (aErr==KErrBadDescriptor)	// client had a bad descriptor
		{
		PanicClient(EBadDescriptor);
		}
	// anyway, complete the outstanding message
	Message().Complete(aErr);
	ReStart(); // really means just continue reading client requests
	return KErrNone;
	}

// Protocol support

TInt CGsdpServer::CountProtocols()
	/**
	   Return a count of the available protocol implementations.
	*/
	{
	return iProtocolInfo.Count();
	}

void CGsdpServer::GetProtocolInfoL(TInt aProto, TGdpProtocolInfo& aInfo)
	{
	if(aProto < 0 || aProto >= iProtocolInfo.Count())
		User::Leave(KErrArgument);
	
	aInfo.iUid = iProtocolInfo[aProto]->ImplementationUid();
	aInfo.iDisplayName = iProtocolInfo[aProto]->DisplayName();
	TLex8 lexer(iProtocolInfo[aProto]->OpaqueData());
	User::LeaveIfError(lexer.Val(aInfo.iNetworked));
	}

CGsdpGdpAdapter* CGsdpServer::GetProtocolL(TUid aProtocol)
	/**
	   Returns the protocol adapter for the specified protocol.

	   Leaves if there is a problem.
	*/
	{
	// Check if we already have an adaptor
	// TODO: Use Find()?
	TInt i;
	for(i=0; i < iAdapters.Count(); i++)
		{
		if(iAdapters[i]->ProtocolUid() == aProtocol)
			{
			return iAdapters[i];
			}
		}
	
	// if not, then create one
	CGsdpGdpAdapter* adapter = CGsdpGdpAdapter::NewL(*this);
	CleanupStack::PushL(adapter);
	CGdpSession* protocol = CGdpSession::NewL(aProtocol);
	adapter->SetProtocolL(protocol);
	User::LeaveIfError(iAdapters.Append(adapter));
	CleanupStack::Pop(adapter);
	return adapter;
	}

TUint32 CGsdpServer::MyNextPort()
	/**
	   Return the next port.
	*/
	{
	return iPortAllocator->NextPortId();
	}

/**
   session count support
*/
void CGsdpServer::IncrementSessions()
	{	
	iSessionCount++;
	iShutdown->Cancel();
	}

void CGsdpServer::DecrementSessions()
	{
	iSessionCount--;
	if (iSessionCount>0)
		return;
	iShutdown->Start();
	}

// receive queue support

CGsdpSession* CGsdpServer::SessionForPacket(const TGsdpPacket& aPacket)
	{
	CSharableSession* session;
	// iterate through sessions with non-zero port id
	iSessionIter.SetToFirst();
	for (session=iSessionIter++; session; session=iSessionIter++)
		{
		if (static_cast<CGsdpSession*>(session)->GetMyPort()==0)
			continue;
		if (static_cast<CGsdpSession*>(session)->CanReceivePacket(aPacket))
			break;
		}
	if (session)
		return static_cast<CGsdpSession*>(session);
	// iterate through sessions with zero port id
	iSessionIter.SetToFirst();
	for (session=iSessionIter++; session; session=iSessionIter++)
		{
		if (static_cast<CGsdpSession*>(session)->GetMyPort()!=0)
			continue;
		if (static_cast<CGsdpSession*>(session)->CanReceivePacket(aPacket))
			break;
		}
	return static_cast<CGsdpSession*>(session);
	}

// utility

void CGsdpServer::PanicClient(TInt aPanic) const
	{
	// let's have a look before we panic the client
	__DEBUGGER()
	// ok, go for it
	const_cast<RThread&>(Message().Client()).Panic(_L("GSDP-Server"),aPanic);
	}

/*
  class CGsdpProtocolUpdater
*/
CGsdpProtocolUpdater* CGsdpProtocolUpdater::NewL(CGsdpServer& aServer)
	{
	CGsdpProtocolUpdater* self = new (ELeave) CGsdpProtocolUpdater(aServer);
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	return self;
	}

CGsdpProtocolUpdater::CGsdpProtocolUpdater(CGsdpServer& aServer)
	: CActive(EPriorityLow), iServer(aServer)
	{
	}

void CGsdpProtocolUpdater::ConstructL()
	{
	iEcomSession = REComSession::OpenL();
	CActiveScheduler::Add(this);
	Start();
	}

CGsdpProtocolUpdater::~CGsdpProtocolUpdater()
	{
	Cancel();
	iEcomSession.Close();
	}

void CGsdpProtocolUpdater::Start()
	{
	iEcomSession.NotifyOnChange(iStatus);
	SetActive();
	}

void CGsdpProtocolUpdater::RunL()
	{
	if(iStatus == KErrNone)
		{
		iServer.UpdateProtocolInfo();
		}
	Start();
	}

void CGsdpProtocolUpdater::DoCancel()
	{
	iEcomSession.CancelNotifyOnChange(iStatus);
	}


/*
	class CGsdpDelayedShutdown
*/

CGsdpDelayedShutdown::CGsdpDelayedShutdown()
	:	CActive(0)
	{
	}

void CGsdpDelayedShutdown::ConstructL()
	{
	CActiveScheduler::Add(this);
	User::LeaveIfError(iTimer.CreateLocal());
	}

CGsdpDelayedShutdown::~CGsdpDelayedShutdown()
	{
	Cancel();
	iTimer.Close();
	}

void CGsdpDelayedShutdown::Start()
	{
	iTimer.After(iStatus, KGsdpShutdownInterval);
	SetActive();
	}

void CGsdpDelayedShutdown::DoCancel()
	{
	iTimer.Cancel();
	}

void CGsdpDelayedShutdown::RunL()
	{
	CActiveScheduler::Stop();
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品福利一区二区三区免费视频| 日韩高清中文字幕一区| 亚洲一卡二卡三卡四卡无卡久久| 男女性色大片免费观看一区二区| 成人国产亚洲欧美成人综合网| 欧美日韩一区二区三区视频 | 日本一区二区综合亚洲| 亚洲亚洲精品在线观看| 成人丝袜18视频在线观看| 日韩三级av在线播放| 夜夜嗨av一区二区三区网页| 丰满少妇在线播放bd日韩电影| 欧美一三区三区四区免费在线看| 亚洲精品久久嫩草网站秘色| 成人综合婷婷国产精品久久| 欧美电影免费观看高清完整版在| 亚洲成av人片在www色猫咪| 99re亚洲国产精品| 欧美国产日产图区| 国产精品996| 久久久影视传媒| 精品一区二区三区视频在线观看| 欧美精品777| 日本免费在线视频不卡一不卡二 | 91精品国产日韩91久久久久久| 亚洲欧美视频在线观看| 99国产精品久久久久| 国产精品三级视频| 国产+成+人+亚洲欧洲自线| 久久只精品国产| 激情六月婷婷久久| 久久久99久久| 国产成人免费视频网站| 中文字幕精品—区二区四季| 丁香婷婷深情五月亚洲| 国产欧美综合色| 成人av电影免费在线播放| 国产精品国产三级国产aⅴ中文| 波多野结衣一区二区三区| 国产精品久久久久久久久动漫 | 奇米色777欧美一区二区| 欧美日韩亚洲综合在线| 天天av天天翘天天综合网| 欧美日韩精品一区二区| 日本aⅴ免费视频一区二区三区| 日韩精品一区二| 国产成人高清在线| 亚洲精品乱码久久久久久黑人| 欧美日韩一级黄| 经典三级视频一区| 国产欧美精品日韩区二区麻豆天美| 国产成a人亚洲精品| 最近中文字幕一区二区三区| 欧美性视频一区二区三区| 免费视频一区二区| 久久夜色精品国产噜噜av | 欧美日韩国产综合一区二区| 天天亚洲美女在线视频| 久久免费电影网| 91久久精品午夜一区二区| 免费观看久久久4p| 国产精品久久久久aaaa| 欧美日韩国产123区| 精品一区二区三区av| 亚洲欧美偷拍卡通变态| 欧美一区二区私人影院日本| 国产福利精品一区二区| 亚洲一区二区偷拍精品| 久久久亚洲国产美女国产盗摄| 日本电影亚洲天堂一区| 精品伊人久久久久7777人| 亚洲欧美日韩国产成人精品影院| 欧美精品v国产精品v日韩精品| 国产成人精品亚洲777人妖| 亚洲不卡一区二区三区| 国产校园另类小说区| 欧美精品三级在线观看| av成人动漫在线观看| 美女视频黄频大全不卡视频在线播放| 中文字幕av免费专区久久| 欧美一区二区三区在| 91老师片黄在线观看| 国产一区不卡在线| 偷拍日韩校园综合在线| 亚洲免费观看视频| 国产午夜精品美女毛片视频| 欧美人体做爰大胆视频| 色一情一乱一乱一91av| 国产成人在线网站| 美洲天堂一区二卡三卡四卡视频| 18成人在线视频| 国产欧美一区二区精品性| 日韩一二三区不卡| 欧美中文字幕久久| k8久久久一区二区三区| 国产尤物一区二区在线| 蜜臀精品久久久久久蜜臀| 亚洲午夜激情网站| 亚洲欧美日韩电影| 亚洲欧洲性图库| 中文字幕精品一区二区精品绿巨人 | 久久久精品免费免费| 91精品国产综合久久婷婷香蕉 | 琪琪一区二区三区| 亚洲va欧美va人人爽| 亚洲精品成a人| 综合激情成人伊人| 17c精品麻豆一区二区免费| 国产精品网站一区| 中文字幕不卡在线播放| 国产精品丝袜黑色高跟| 国产精品欧美综合在线| 国产精品福利影院| 中文字幕一区二区三区在线播放| 国产夜色精品一区二区av| 欧美精品一区二区高清在线观看 | 在线精品国精品国产尤物884a| 成人app下载| 色偷偷一区二区三区| 欧美在线一区二区三区| 欧美专区在线观看一区| 欧美精品九九99久久| 91精品国产综合久久久久| 日韩精品最新网址| 久久久99精品免费观看不卡| 国产精品美女久久久久久久网站| 国产精品视频九色porn| 亚洲乱码精品一二三四区日韩在线| 综合色天天鬼久久鬼色| 亚洲国产欧美在线| 热久久一区二区| 国产成人精品aa毛片| 一本到高清视频免费精品| 欧美日韩你懂的| 欧美精品一区二区三区很污很色的| 国产日韩精品一区二区三区| 亚洲三级免费电影| 日韩二区三区四区| 国产成人av资源| 欧美影院午夜播放| 欧美v亚洲v综合ⅴ国产v| 国产精品麻豆视频| 日韩精品1区2区3区| 国产麻豆一精品一av一免费| 91免费观看在线| 91精品国产综合久久久久久久久久 | 天使萌一区二区三区免费观看| 视频一区视频二区在线观看| 国产一区亚洲一区| 91网站黄www| 精品福利在线导航| 亚洲综合一区二区| 国产一区二区精品久久91| 在线亚洲精品福利网址导航| 精品国产凹凸成av人导航| 亚洲精品老司机| 国产精品一区二区三区四区| 91久久国产综合久久| 久久综合狠狠综合| 五月婷婷欧美视频| 成人禁用看黄a在线| 日韩免费成人网| 亚洲综合精品自拍| 成人av电影在线播放| 亚洲精品一区二区精华| 午夜激情一区二区三区| 91网站在线观看视频| 久久久一区二区三区捆绑**| 亚洲福利一二三区| av电影一区二区| 国产日韩精品一区二区浪潮av| 日韩和欧美一区二区三区| 色悠久久久久综合欧美99| 国产亚洲一区二区在线观看| 美女视频第一区二区三区免费观看网站| 99国产精品久久久| 国产欧美日产一区| 国精产品一区一区三区mba视频| 欧美视频一区在线| 日韩码欧中文字| 成人午夜av在线| 国产免费观看久久| 国产aⅴ综合色| 精品国产露脸精彩对白| 蜜桃视频在线一区| 日韩欧美国产一区在线观看| 亚洲成人av一区二区| 日本福利一区二区| 一区二区三区中文字幕电影| 波波电影院一区二区三区| 国产欧美久久久精品影院| 国产盗摄视频一区二区三区| 91精品国产91久久久久久一区二区| 亚洲国产三级在线| 欧美亚洲动漫另类| 亚洲国产裸拍裸体视频在线观看乱了 | 日韩av成人高清| 欧美高清视频在线高清观看mv色露露十八 | 日韩欧美在线综合网| 日本午夜一区二区|