⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpudp.cpp

📁 基于symbian的收发SMS、MMS消息
💻 CPP
字号:
//
//	Module: tcpudp.cpp
//
//	Copyright (C) 2001, Forum Nokia - The Developer Community
//
//
////////////////////////////////////////////////////////////////
#include "tcpudp.h"


//
// EXPORTed functions
//

EXPORT_C CApaApplication* NewApplication()
	{
	return new CTcpUdpApplication;
	}

GLDEF_C TInt E32Dll(TDllReason)
	{
	return KErrNone;
	}


////////////////////////////////////////////////////////////////
//
// Application class, CTcpUdpApplication
//
////////////////////////////////////////////////////////////////

TUid CTcpUdpApplication::AppDllUid() const
	{
	return KUidTcpUdpApp;
	}


CApaDocument* CTcpUdpApplication::CreateDocumentL()
	{
	return new (ELeave) CTcpUdpDocument(*this);
	}


////////////////////////////////////////////////////////////////
//
// Document class, CTcpUdpDocument
//
////////////////////////////////////////////////////////////////

CTcpUdpDocument::CTcpUdpDocument(CEikApplication& aApp)
		: CEikDocument(aApp)
	{
	}

CEikAppUi* CTcpUdpDocument::CreateAppUiL()
	{
    return new(ELeave) CTcpUdpAppUi;
	}


////////////////////////////////////////////////////////////////
//
// App UI class, CTcpUdpAppUi
//
////////////////////////////////////////////////////////////////

void CTcpUdpAppUi::ConstructL()
    {
    BaseConstructL();

    iAppView=new(ELeave) CTcpUdpView;
	CleanupStack::PushL(iAppView);
    iAppView->ConstructL(ClientRect());
	CleanupStack::Pop();

	// Read the ini-file
	TPreferences param;
	RestorePreferencesL(param); 
	iAppView->Engine()->SetPreferences(param);

    // add app view to stack; enables key event handling.
    AddToStackL(iAppView);

}


CTcpUdpAppUi::~CTcpUdpAppUi()
{
    delete iAppView;
}


void CTcpUdpAppUi::DynInitMenuPaneL(TInt aMenuId,CEikMenuPane* aMenuPane)
{
	iAppView->DynInitMenuPaneL(aMenuId, aMenuPane);
}


void CTcpUdpAppUi::HandleCommandL(TInt aCommand)
{
	switch (aCommand)
	{
		case ESocketStart:
			iAppView->Start();
			break;
		case ESocketStop:
			iAppView->Stop();
			break;
		case ESocketOptions:
		    if (LaunchOptionsDialogL(iAppView->Engine()))
			{	
				TPreferences param;
				iAppView->Engine()->GetPreferences(param);
				StorePreferencesL(param);
			}	
			break;
		case ESocketClearScreen:
			iAppView->ClearScreen();
			break;
		case ESocketAbout:
			LaunchAboutDialogL();
			break;
		case EEikCmdExit:
			iAppView->Stop();
			Exit();
			break;
		default:	//Console Specific Commands
			break;
	}
}
	
void CTcpUdpAppUi::RestorePreferencesL(TPreferences &aPreferences)
{
	CDictionaryStore *iniFile = Application()->OpenIniFileLC(iCoeEnv->FsSession());
	TBool found = iniFile->IsPresentL(KUidTcpUdpApp);
	TInt error = KErrNone;

	if (found) 
	{
		RDictionaryReadStream readStream;
		readStream.OpenLC (*iniFile, KUidTcpUdpApp);
		// ignore any reads off the end of the file etc - clear later on

		TRAP(error, aPreferences.iProtocol      = readStream.ReadUint16L());
		TRAP(error, aPreferences.iRemotePort    = readStream.ReadUint16L());
		TRAP(error, aPreferences.iLocalPort     = readStream.ReadUint16L());
		TRAP(error, aPreferences.iCount         = readStream.ReadUint16L());
		TRAP(error, aPreferences.iTrace         = readStream.ReadUint32L());
		TRAP(error, aPreferences.iPacketSize    = readStream.ReadUint16L());

		// aPreferences.iRemoteAddr
		TInt length=0;
		TRAP(error, length = readStream.ReadInt16L());
		TRAP(error, readStream.ReadL(aPreferences.iRemoteAddr,length));

		// aPreferences.iLocalAddr
		length=0;
		TRAP(error, length = readStream.ReadInt16L());
		TRAP(error, readStream.ReadL(aPreferences.iLocalAddr,length));

		CleanupStack::PopAndDestroy(); // readStream
	}

	CleanupStack::PopAndDestroy(); // iniFile

	if (error!=KErrNone || !found) 
	{
		// missing stream initialise
		CRunEngine::DefaultPreferences(aPreferences);
		
		//.... // and whatever is appropriate for all the other fields
		StorePreferencesL(aPreferences); // store the default ones - update inifile
	}
}


void CTcpUdpAppUi::StorePreferencesL(const TPreferences &aPreferences)
{
	CDictionaryStore *iniFile = Application()->OpenIniFileLC(iCoeEnv->FsSession());
	RDictionaryWriteStream writeStream;
	writeStream.AssignLC(*iniFile, KUidTcpUdpApp);
	
	writeStream.WriteUint16L (aPreferences.iProtocol);
	writeStream.WriteUint16L (aPreferences.iRemotePort);
	writeStream.WriteUint16L (aPreferences.iLocalPort);
	writeStream.WriteUint16L (aPreferences.iCount);
	writeStream.WriteUint32L (aPreferences.iTrace);
	writeStream.WriteUint16L (aPreferences.iPacketSize);

	// iRemoteAddr
	writeStream.WriteInt16L (aPreferences.iRemoteAddr.Length());
	writeStream.WriteL (aPreferences.iRemoteAddr);

	// iLocalAddr
	writeStream.WriteInt16L (aPreferences.iLocalAddr.Length());
	writeStream.WriteL (aPreferences.iLocalAddr);

	writeStream.CommitL();
	CleanupStack::PopAndDestroy(); // write stream

	// in this replace XXVersionUid with another unique UID - usually the next one up from XXUid
	writeStream.AssignLC(*iniFile, KUidTcpUdpVersionUid); // write version 1.0 (major.minor)
	writeStream.WriteInt8L(1); // major
	writeStream.WriteInt8L(0); // minor
	writeStream.CommitL(); // flush
	CleanupStack::PopAndDestroy(); // writeStream;

	// commit changes to the store
	if (iniFile->Commit()!=KErrNone)
		iniFile->RevertL();

	CleanupStack::PopAndDestroy();
}
	
   
// Launches a dialog to ask for new options
TBool CTcpUdpAppUi::LaunchOptionsDialogL(CRunEngine* aEngine)
{
	COptionsDialog *dialog = new (ELeave) COptionsDialog(aEngine);
	CleanupStack::PushL(dialog);
	TInt button=dialog->ExecuteLD(R_TCPUDP_OPTIONS_DIALOG);	//Final D means the dialog is destructed by itself
	CleanupStack::Pop();
	return (button==EEikBidOk);	
	// If button is CANCEL then no peration is made
}


// Launches a dialog to show an about box
void CTcpUdpAppUi::LaunchAboutDialogL()
{
	CEikDialog* dialog = new (ELeave) CEikDialog();
	CleanupStack::PushL(dialog);
	dialog->ExecuteLD(R_TCPUDP_ABOUT);	//Final D means the dialog is destructed by itself
	CleanupStack::Pop();
}


////////////////////////////////////////////////////////////////
//
// Application view class, CTcpUdpView
//
////////////////////////////////////////////////////////////////

void CTcpUdpView::ConstructL(const TRect& aRect)
{
    CreateWindowL();
    SetRect(aRect);

    iContext=this;
	iBrushStyle=CGraphicsContext::ESolidBrush;
    iBrushColor=KRgbWhite;

	// create the engine
	iEngine= new (ELeave) CRunEngine;
	CleanupStack::PushL(iEngine);
	iEngine->ConstructL(this);
	CleanupStack::Pop();

	CreateBigConsoleL(CEikConsoleScreen::ENoInitialCursor);
	
    ActivateL();
}


CTcpUdpView::~CTcpUdpView()
{
	delete iConsole;
	delete iEngine;
}


void CTcpUdpView::DynInitMenuPaneL(TInt aMenuId,CEikMenuPane* aMenuPane)
{
	if (aMenuId == R_TCPUDP_TOOLS_MENU)
	{
		if (iEngine->Running())
			aMenuPane->SetItemDimmed(ESocketOptions, ETrue);
		else
			aMenuPane->SetItemDimmed(ESocketOptions, EFalse);
	}
}


void CTcpUdpView::CreateBigConsoleL(TInt aFlags)
{

	iConsole=new(ELeave) CConsoleControl;
	TRect rect=Rect();

	TSize size;
	size.iHeight = rect.iBr.iY - rect.iTl.iY;     // 
	size.iWidth = rect.iBr.iX - rect.iTl.iX - 90; // 
												  
	TPoint position;
	position.iY = rect.iTl.iY;   // 
	position.iX = 90;            // 
	
	CleanupStack::PushL(iConsole);
	iConsole->ConstructL(position, size, aFlags);
	CleanupStack::Pop();
}


void CTcpUdpView::Draw(const TRect& ) const
{
	CWindowGc& gc = SystemGc();

	gc.SetPenStyle(CGraphicsContext::ESolidPen);
	TSize penSizeBold(3,3);
	gc.SetPenSize(penSizeBold);
	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	
	TRect rect=iConsole->Rect();	//Lines around the Console
	rect.Grow(3,3);
	gc.DrawRect(rect);

}


void CTcpUdpView::Write(const TDesC &aMsg)
{
	iConsole->Write(aMsg);
}


void CTcpUdpView::Start()
{
	TInt err;

    if (iEngine->Running())
	{
		CEikonEnv::Static()->InfoMsg(_L("Already Running!"));
		return;
	}
		
	err = iEngine->Start();
	if (err != KErrNone)
	{
		Write(_L("Error initializing TcpUdp\n"));
	}
    UpdateBusyMsg();
}


void CTcpUdpView::Stop()
{
	if (iEngine->Running())
		iEngine->Stop();
    else
		CEikonEnv::Static()->InfoMsg(_L("Already Stopped!"));
    UpdateBusyMsg();
}


void CTcpUdpView::ClearScreen()
{
	delete iConsole;
	iConsole=NULL;
	CreateBigConsoleL(CEikConsoleScreen::ENoInitialCursor);	
}


void CTcpUdpView::UpdateBusyMsg()
{
	CEikButtonGroupContainer *cba = iEikonEnv->AppUiFactory()->ToolBar();

	if (iEngine->Running())
	{	
		// Running
		CEikonEnv::Static()->BusyMsgL(R_BUSY);
		cba->DimCommand(ESocketOptions, ETrue) ;
	}	
	else
	{
		// NOT running
		CEikonEnv::Static()->BusyMsgCancel();
		cba->DimCommand(ESocketOptions, EFalse) ;
	}
	cba->DrawNow() ;
}


//// DIALOG CLASSES ////

COptionsDialog::COptionsDialog(CRunEngine* aEngine)
{
	iEngine=aEngine;
}


TBool COptionsDialog::OkToExitL(TInt)
{
	iEngine->iProtocol    = ChoiceListCurrentItem(EProtocol);
    iEngine->iLocalPort   = NumberEditorValue(ELocalPort);

	iEngine->iRemotePort  = NumberEditorValue(ERemotePort);
	STATIC_CAST( CEikEdwin*, Control( ERemoteAddr ) )->GetText( iEngine->iRemoteAddr );
	iEngine->iCount       = NumberEditorValue(ECount);
	iEngine->iPacketSize  = NumberEditorValue(EPacketSize);

	iEngine->iTrace       = ChoiceListCurrentItem(ETrace);
	
	return ETrue;
}

void COptionsDialog::PreLayoutDynInitL()
{
	SetChoiceListCurrentItem(EProtocol,iEngine->iProtocol);
	SetNumberEditorValue(ELocalPort, iEngine->iLocalPort);

	SetNumberEditorValue(ERemotePort, iEngine->iRemotePort);
	CEikEdwin* edwin=(CEikEdwin*)Control(ERemoteAddr);
	edwin->SetTextL(&iEngine->iRemoteAddr);

	SetNumberEditorValue(ECount, iEngine->iCount);
	SetNumberEditorValue(EPacketSize, iEngine->iPacketSize);

	SetChoiceListCurrentItem(ETrace,iEngine->iTrace);
}



//
// CConsoleControl
//

void CConsoleControl::ConstructL(TPoint aTopLeft,const TSize& aSize,TInt aFlags)
{

	TRect rect(aTopLeft,aTopLeft + aSize.AsPoint());
    SetRect(rect);
	
    iConsole=new(ELeave) CEikConsoleScreen;
	CleanupStack::PushL(iConsole);
	iConsole->ConstructL(_L("TEST"),aTopLeft,aSize,aFlags,EEikConsWinInPixels);
	CleanupStack::Pop();
	iConsole->SetHistorySizeL(200,0);
	iHistory=200;
}


CConsoleControl::~CConsoleControl()
{
	delete iConsole;
}


void CConsoleControl::ActivateL()
{
	CCoeControl::ActivateL();
	iConsole->SetKeepCursorInSight(TRUE);
	iConsole->DrawCursor();
	iConsole->SetAtt(ATT_NORMAL);
}

void CConsoleControl::FocusChanged(TDrawNow aDrawNow)
{
	iConsole->ConsoleControl()->SetFocus(IsFocused(), aDrawNow);
}

void CConsoleControl::DrawCursor()
{
	iConsole->DrawCursor();
}


void CConsoleControl::Write(const TDesC &aMsg)
{
	iConsole->Write(aMsg);
	iConsole->FlushChars();

}


CEikConsoleControl *CConsoleControl::ConsoleControl()
{
	return iConsole->ConsoleControl();
}

TBool CConsoleControl::UpdateScrollBars()
{
	return iConsole->UpdateScrollBars();
}

void CConsoleControl::ClearScreen()
{
	iConsole->ClearScreen();
}


void CConsoleControl::Redraw(const TRect &aRect)
{
	iConsole->Redraw(aRect);
}

void CConsoleControl::Lf()
{
	iConsole->Lf();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -