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

📄 sipengine.cpp

📁 基于SIP协议的即时消息聊天功能设计,Symbian平台下实现
💻 CPP
字号:
/*
============================================================================
 Name        : CSIPEngine from SIPEngine.h
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : CSIPEngine LIB source
============================================================================
*/

//  Include Files  

#include "SIPEngine.h"

#include <sys/time.h>#include <e32math.h>#include <ESIMAppUi.h>#include <es_sock.h>
#include <CommDbConnPref.h>
#include <stdio.h>
#include <utf.h>
#include <string.h>

const TUint32	KIAPID = 3;

extern char* my_itoa2(int num, char* str);
extern char* my_itoa(int aInt, int aLength, char* str);
CSIPEngine* CSIPEngine::NewLC(CESIMAppUi* aCESIMAppUi)
    {
    CSIPEngine* self = new (ELeave) CSIPEngine;
    CleanupStack::PushL(self);
    self->ConstructL(aCESIMAppUi);
    return self;
    }


CSIPEngine* CSIPEngine::NewL(CESIMAppUi* aCESIMAppUi)
    {
    CSIPEngine* self = CSIPEngine::NewLC(aCESIMAppUi);
    CleanupStack::Pop(self);
    return self;
    }


CSIPEngine::CSIPEngine()
    {
    // note, CBase initialises all member variables to zero
    }

// second phase constructor, anything that may leave must be constructed here
void CSIPEngine::ConstructL(CESIMAppUi* aCESIMAppUi)
    {
		iBuffer = HBufC8::NewL(4000 * sizeof (char) + 1);

		iListenBuffer = CListenBuffer::NewL();

		iCESIMAppUi = aCESIMAppUi;
    }


CSIPEngine::~CSIPEngine()
{
	if (iBuffer != NULL)
	{
		delete iBuffer;
		iBuffer = NULL;
	}

	if(iSocketEngine)
	{
		iSocketEngine->Cancel();
		delete iSocketEngine;
		iSocketEngine = NULL;
	}

	if (iListenBuffer)
	{
		iListenBuffer->Cancel();
		delete iListenBuffer;
		iListenBuffer = NULL;
	}
}

void CSIPEngine::SocketData(TDesC8& aData)
{
	iBuffer->Des().Zero();
	iBuffer->Des().Append(aData);

	TBuf<100> msg16;
	CnvUtfConverter::ConvertToUnicodeFromUtf8(msg16, aData);
	iCESIMAppUi->my_MessageDialog(msg16, _L("Neusoft"));
}

void CSIPEngine::SocketState(TInt aNewState)
{
}

void CSIPEngine::ShowMessage(TInt aType)
{
}

int CSIPEngine::StartL(int aProtocol, int aLocalPort, char *aRemoteAddress, int aRemotePort)
{
	TBuf8<50> remoteAddr8;
	TBuf<50> remoteAddr16;

	remoteAddr8.Copy((unsigned char*)aRemoteAddress);
	CnvUtfConverter::ConvertToUnicodeFromUtf8(remoteAddr16, remoteAddr8);

	iRemoteInetAddr.Input(remoteAddr16);
	iRemoteInetAddr.SetPort(aRemotePort);

	iSocketEngine = CSocketEngine::NewL(*this, EUDP, aLocalPort, remoteAddr16, aRemotePort);

	ResolveLocalIPAddressL();

	iListenBuffer->StartL(1000000, aProtocol, aLocalPort, aRemoteAddress, aRemotePort, iBuffer);
}

/*
把 TDesC8 转化成 char
注意:函数不为 abuf 分配内存
*/
int CSIPEngine::TDesC8_to_char (char* abuf, TDesC8& aTDes)
{
	char* ptr;
	if (!abuf)
		return -1;
	if (aTDes.Length() == 0)
		return 0;
	strncpy(abuf, (const char*)aTDes.Ptr(), aTDes.Length());
	ptr = abuf + aTDes.Length();
	*ptr = 0;
	return 0;
}

void CSIPEngine::sip_message(char* aMessage, char* aTo, char* aFrom, int msgtype, char* aTimed)
{
	SendMessage(aMessage, strlen(aMessage));
}

void CSIPEngine::sip_group_message(char* aMessage, char* aTo, char* aFrom, char* aUserListBuf)
{

}

//获得本机IP地址
void CSIPEngine::ResolveLocalIPAddressL()
{
	TInetAddr localAddr;
	localAddr = iSocketEngine->LocalIPAddress();

	TBuf<50> localIP;
	localAddr.Output(localIP);

	TBuf8<25> buf;
	buf.Copy(localIP);
	buf.ZeroTerminate();

	//iCESIMAppUi->ShowInfoL(buf);

	//memcpy((char*)eXosip.locip, (char*)buf.Ptr(), buf.Length());
}

int my_rand()
{
	TInt KAknExNoteInitializeTime = 0;
	TInt KAknExNoteRandomNumberRange = 20;

	TTime theTime( KAknExNoteInitializeTime );
	theTime.UniversalTime();
	TInt64 randSeed( theTime.Int64() );
	TInt number( Math::Rand( randSeed ) );

	return number;
}

void CSIPEngine::SendMessage(char* strMessage, int len)
{
	TPtr8 pBuf((unsigned char*)strMessage, len);
	pBuf.SetLength(len);
	
	iSocketEngine->Write(pBuf);
}

char* my_itoa(int num, int aLength, char* str)
{
	TBuf8<32> buf;

	_LIT8(KItoaForamt, "%d");

	buf.Format(KItoaForamt, num);

	//osip_strncpy(str, (char*)buf.PtrZ(), buf.Length());
	strcpy(str, (char*)buf.PtrZ());

	return str;
}

char* my_itoa2(int num, char* str)
{
	TBuf8<32> buf;

	_LIT8(KItoaForamt, "%d");

	buf.Format(KItoaForamt, num);

	//osip_strncpy(str, (char*)buf.PtrZ(), buf.Length());
	strcpy(str, (char*)buf.PtrZ());

	return str;
}

char* my_rand2(char* aStr, int aLength)
{
	char CCH[] = "0123456789abcdefghijklmnopqrstuvwxyz";
	
	for (int i = 0; i < aLength; ++i)
	{
		int x = Math::Random() % (sizeof(CCH) - 1);  
		aStr[i] = CCH[x];
	}

	return aStr;
}

int GetCurrentUserIndex()
{
	CESIMAppUi* pUi = (CESIMAppUi*)CCoeEnv::Static()->AppUi();
	
	return pUi->GetCurrentUserIndex();
}

int GetCurrentGroupIndex()
{
	CESIMAppUi* pUi = (CESIMAppUi*)CCoeEnv::Static()->AppUi();

	return pUi->GetCurrentGroupIndex();
}

⌨️ 快捷键说明

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