void StdCompilerINIWrite::PrepareForValue()
{
	// Put name (value-type), if not already done so
	if (fPutName) PutName(false);
	// No data allowed inside of sections
	assert(!fInSection);
	// No values allowed on top-level - must be contained in at least one section
	assert(iDepth > 1);
}
bool StdCompilerINIWrite::Separator(Sep eSep)
{
	if (fInSection)
	{
		// Re-put section name
		PutName(true);
	}
	else
	{
		PrepareForValue();
		Buf.AppendChar(SeparatorToChar(eSep));
	}
	return true;
}
bool StdCompilerINIWrite::Name(const char *szName)
{
	// Sub-Namesections exist, so it's a section. Write name if not already done so.
	if (fPutName) PutName(true);
	// Push struct
	Naming *pnNaming = new Naming;
	pnNaming->Name.Copy(szName);
	pnNaming->Parent = pNaming;
	pNaming = pnNaming;
	iDepth++;
	// Done
	fPutName = true; fInSection = false;
	return true;
}
void CHCEmulator::ReadRemoteNameCompleteEvent(TUint8 aError, const TBTDevAddr& aAddr, const TDesC8& aName)
	{
	ClearPacket();
	
	iConsole.Printf(_L("Sending C.C.E (opcode ReadRemoteName, error 0x%02x)...\n"), aError);

	PutBytes(KHCIUARTEventHeader);
	PutBytes(KHCIRemoteNameRequestCompleteEventCode);
	PutBytes(KHCIRemoteNameReqCompleteEventPacketLength);
	PutBytes(aError);
	PutAddress(aAddr);
	PutName(aName);
	
	WritePacket();
	}
void CHCEmulator::BuildAndWriteCommandPacket(TPacketType aType, TUint16 aOpcode, TUint8 aError)
/**
	For 'easy' packets
**/
	{
	iPacket.Zero();

	TUint8 numpackets = 1;					// <--- adjustable

	switch (aType)
		{
		case ECommandStatusEvent:
			{
			PutBytes(KHCIUARTEventHeader);
			PutBytes(KHCICommandStatusEventCode);
			PutBytes(KHCICommandStatusEventLength);
			PutBytes(aError);
			PutBytes(numpackets);
			PutBytes(aOpcode,2);
			break;
			}
		case ECommandCompleteEvent:
			{
			switch (aOpcode)
				{
				case KReadBufferSizeOpcode:
					{
					PutBytes(KHCIUARTEventHeader);
					PutBytes(KHCICommandCompleteEventCode);
					PutBytes(KHCIReadBufferSizeCommandCompleteEventLength);
					PutBytes(numpackets);
					PutBytes(aOpcode,2);
					PutBytes(aError);
					PutBytes(KEmulatedHCSizeACLBuffers,2);
					PutBytes(KEmulatedHCSizeSCOBuffers,1);
					PutBytes(KEmulatedHCNumberACLBuffers,2);
					PutBytes(KEmulatedHCNumberSCOBuffers,2);
					break;
					}
				case KReadBdaddrOpcode:
					{
					PutBytes(KHCIUARTEventHeader);
					PutBytes(KHCICommandCompleteEventCode);
					PutBytes(KHCIReadBdaddrCommandCompleteEventLength);
					PutBytes(numpackets);
					PutBytes(aOpcode,2);
					PutBytes(aError);
					PutAddress(KEmulatedHCAddress);
					break;
					}
				case KReadLocalNameOpcode:
					{
					PutBytes(KHCIUARTEventHeader);
					PutBytes(KHCICommandCompleteEventCode);
					PutBytes(KHCIReadLocalNameCommandCompleteEventLength);
					PutBytes(numpackets);
					PutBytes(aOpcode,2);
					PutBytes(aError);
					PutName(iLocalName);
					break;
					}
				case KResetOpcode:
				case KSetHostControllerToHostFlowOpcode:
				case KWritePageTimeoutOpcode:
				case KHostBufferSizeOpcode:
				case KWriteScanEnableOpcode:
				case KWriteConnectionAcceptTimeoutOpcode:
				case KChangeLocalNameOpcode:
				case KInquiryCancelOpcode:
				case KWriteVoiceSettingOpcode:
				case KWriteCurrentIACLAPOpcode:
				case KSetEventMaskOpcode:
				case KNopOpcode:
					{
					PutBytes(KHCIUARTEventHeader);
					PutBytes(KHCICommandCompleteEventCode);
					PutBytes(KHCIDefaultCommandCompleteEventLength);
					PutBytes(numpackets);
					PutBytes(aOpcode,2);
					PutBytes(aError);
					}
					break;
					
				case KReadLocalSupportedFeaturesOpcode:
					{
					PutBytes(KHCIUARTEventHeader);
					PutBytes(KHCICommandCompleteEventCode);
					PutBytes(KHCIReadLocalSupportedFeaturesLength);
					PutBytes(numpackets);
					PutBytes(aOpcode,2);
					PutBytes(aError);
					PutBytes(KEmulatedLocalSupportedFeatures1,4);
					PutBytes(KEmulatedLocalSupportedFeatures2,4);
					}
					break;
					
				case KReadLocalVersionInfoOpcode:
					{
					PutBytes(KHCIUARTEventHeader);
					PutBytes(KHCICommandCompleteEventCode);
					PutBytes(KHCIReadLocalVersionInformationLength);
					PutBytes(numpackets);
					PutBytes(aOpcode,2);
					PutBytes(aError);
					PutBytes(KEmulatedLocalVersion1,4);
					PutBytes(KEmulatedLocalVersion2,4);
					}
					break;
					
				case KReadClassOfDeviceOpcode:
					{
					PutBytes(KHCIUARTEventHeader);
					PutBytes(KHCICommandCompleteEventCode);
					PutBytes(KHCIReadCoDLength);
					PutBytes(numpackets);
					PutBytes(aOpcode,2);
					PutBytes(aError);
					PutBytes(KEmulatedCoD,3);	
					}
					break;
					
				}
			break;
			}
		}
	WritePacket();
	}
Exemple #6
0
int CConnectMR::Connect()
{
	long ret;
	int nPort = SERVER_PORT;
	char szBuffer[BUFFER_SIZE];

	int nAddrLen;
	int nRet;
	SOCKET s;
	SOCKADDR_IN sa;

	WSAData wsaData;
	WORD wVersion = MAKEWORD(2,2);
	nRet = WSAStartup(wVersion, &wsaData);
	if (SOCKET_ERROR == nRet)
	{
		TRACEMSG("Socket init error\n");
		ret = STATE_CONNECT_SOCKET;
		PutState(&ret);
		return ret;
	}

	s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == s)
	{
		TRACEMSG("Socket was created failse:%d\n", WSAGetLastError());
		ret = STATE_CONNECT_SOCKET;
		PutState(&ret);
		WSACleanup();
		return ret;
	}

	int timeout=6000;     //收发超时6秒
	if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)))
	{
		TRACEMSG("socket setsockopt() failse:%d\n", WSAGetLastError());
		ret = STATE_CONNECT_SOCKET;
		PutState(&ret);
		closesocket(s);
		WSACleanup();
		return ret;
	}

	nAddrLen = sizeof(SOCKADDR_IN);
	memset(&sa, 0, nAddrLen);
	sa.sin_family = AF_INET;
	sa.sin_port	  = htons(nPort);
	//sa.sin_addr.s_addr = inet_addr("127.0.0.1");
	sa.sin_addr.s_addr = inet_addr(_ip);

	nRet = connect(s, (LPSOCKADDR)&sa, nAddrLen);
	if (SOCKET_ERROR == nRet)
	{
		TRACEMSG("socket connect() failse:%d\n", WSAGetLastError());
		ret = STATE_CONNECT_CONNECTSVR;
		PutState(&ret);
		closesocket(s);
		WSACleanup();
		return ret;
	}

	memset(szBuffer, 0, BUFFER_SIZE);
	szBuffer[0] = '1';
	szBuffer[1] = _type + '0'; //身份
	strcpy(&szBuffer[2], _name);

	nRet = send(s, szBuffer, 2+strlen(_name), 0);
	if (SOCKET_ERROR == nRet)
	{
		TRACEMSG("Socket send() failse:%d\n", WSAGetLastError());
		ret = STATE_CONNECT_SEND;
		PutState(&ret);
		closesocket(s);
		WSACleanup();
		return ret;
	}

	_connecting = true;
	while (_connecting)
	{
		//_connecting = false;

		memset(szBuffer, 0, BUFFER_SIZE);
		nRet = recv(s, szBuffer, BUFFER_SIZE, 0);
		if (nRet == -1 && WSAGetLastError() == WSAETIMEDOUT)
		{
			if (_connecting)
			{
				// 超时
				ret = STATE_CONNECT_TIMEOUT;
			}
			else
			{
				ret = STATE_CONNECT_CLOSE;
				closesocket(s);
				WSACleanup();
				return ret;
			}
		}
		else if (nRet <= 0) //断开连接
		{
			printf("Sokcet:%d, was disconnected.\n", s);
			ret = STATE_CONNECT_RECV;
			break;
		}
		else
		{
			printf("Socket:%d, %d, send data:%s\n", s, nRet, szBuffer);

			// 处理数据
			if (nRet > 0)
			{
				char flag = *(char*)szBuffer;
				TRACE("Server ECHO back:%c\n", flag);
				if (flag == '0')
				{
					if (_type == IDENTITY_EXPERT || _type == IDENTITY_LISTENER)
					{
						// 等待作业员来连接
						ret = STATE_CONNECT_WAITFOR;
						PutState(&ret);
						continue;
					}
					else
					{
						// 木有找到接线员,等等再说
						//MessageBox(NULL, _T("木有找到接线员,请稍候再连接!"), _T("Frss"), MB_OK);
						ret = STATE_CONNECT_NOLISTENER;
						break;
					}
				}
				else if (flag == '1')
				{
					if (nRet > 4)
					{
						char* tarIp = inet_ntoa(*(in_addr*)(szBuffer+1));
						TRACE("Server ECHO back: ip: %s\n",  tarIp);

						if (nRet > 5)
						{
							char name[256];
							strncpy(name, szBuffer+5, nRet-5);
							name[nRet-5] = '\0';
							PutName(CA2T(name));
						}

						if (_type == IDENTITY_EXPERT || _type == IDENTITY_LISTENER)
						{
							//if (MessageBox(NULL, _T("来自用户的通话将被接入!\n是否允许?"), _T("Frss"), MB_YESNO) == IDYES)
							{
								int ret1 = InitATMR(tarIp);
								if (ret1 != 0)
								{
									TRACE("udp error: %d\n", ret1);
									ret = STATE_CONNECT_UDPERROR;
								}
								else
								{
									ret = STATE_CONNECT_OK;
								}
								break;
							}
							//else
							//{
							//	ret = STATE_CONNECT_CLOSE;
							//	break;
							//}
						}
						else
						{
							int ret1 = InitATMR(tarIp);
							if (ret1 != 0)
							{
								TRACE("udp error: %d\n", ret1);
								ret = STATE_CONNECT_UDPERROR;
							}
							else
							{
								ret = STATE_CONNECT_OK;
							}
							break;
						}
					}
					else
					{
						ret = STATE_CONNECT_WRONGDATA;
						break;
					}
				}
				else
				{
					ret = STATE_CONNECT_WRONGDATA;
					break;
				}
			}
			else
			{
				ret = STATE_CONNECT_WRONGDATA;
				break;
			}
		}
	}

	PutState(&ret);
	closesocket(s);
	WSACleanup();
	return ret;
}