void CWII_IPC_HLE_WiiMote::SendCommandToACL(u8 _Ident, u8 _Code, u8 _CommandLength, u8* _pCommandData)
{
	u8 DataFrame[1024];
	u32 Offset = 0;

	l2cap_hdr_t* pHeader = (l2cap_hdr_t*)&DataFrame[Offset]; Offset += sizeof(l2cap_hdr_t);
	pHeader->length = sizeof(l2cap_cmd_hdr_t) + _CommandLength;
	pHeader->dcid = L2CAP_SIGNAL_CID;

	l2cap_cmd_hdr_t* pCommand = (l2cap_cmd_hdr_t*)&DataFrame[Offset]; Offset += sizeof(l2cap_cmd_hdr_t);
	pCommand->code = _Code;
	pCommand->ident = _Ident;
	pCommand->length = _CommandLength;

	memcpy(&DataFrame[Offset], _pCommandData, _CommandLength);

	INFO_LOG(WII_IPC_WIIMOTE, "Send ACL Command to CPU");
	DEBUG_LOG(WII_IPC_WIIMOTE, "    Ident: 0x%02x", _Ident);
	DEBUG_LOG(WII_IPC_WIIMOTE, "    Code: 0x%02x", _Code);

	// send ....
	m_pHost->SendACLPacket(GetConnectionHandle(), DataFrame, pHeader->length + sizeof(l2cap_hdr_t));

	//Debugger::PrintDataBuffer(LogTypes::WIIMOTE, DataFrame, pHeader->length + sizeof(l2cap_hdr_t), "m_pHost->SendACLPacket: ");
}
void CWII_IPC_HLE_WiiMote::ReceiveL2capData(u16 scid, const void* _pData, u32 _Size)
{

	// Allocate DataFrame
	u8 DataFrame[1024];
	u32 Offset = 0;
	l2cap_hdr_t* pHeader = (l2cap_hdr_t*)DataFrame;
	Offset += sizeof(l2cap_hdr_t);

	// Check if we are already reporting on this channel
	_dbg_assert_(WII_IPC_WIIMOTE, DoesChannelExist(scid));
	SChannel& rChannel = m_Channel[scid];

	// Add an additional 4 byte header to the Wiimote report
	pHeader->dcid = rChannel.DCID;
	pHeader->length = _Size;

	// Copy the Wiimote report to DataFrame
	memcpy(DataFrame + Offset, _pData, _Size);
	// Update Offset to the final size of the report
	Offset += _Size;

	// Update the status bar
	Host_SetWiiMoteConnectionState(2);

	// Send the report
	m_pHost->SendACLPacket(GetConnectionHandle(), DataFrame, Offset);
}
Esempio n. 3
0
// bCheckOnly : isoLevel이 적당한 값인지만 체크한다.
HRESULT CCUBRIDSession::SetCASCCIIsoLevel(ISOLEVEL isoLevel, bool bCheckOnly)
{
	int hConn;
	if(!bCheckOnly)
	{
		HRESULT hr = GetConnectionHandle(&hConn);
		if(FAILED(hr)) return E_FAIL;
	}

	int cci_isolevel;
	switch(isoLevel)
	{
	case ISOLATIONLEVEL_READCOMMITTED:
		cci_isolevel = TRAN_READ_COMMITTED; break;
	case ISOLATIONLEVEL_REPEATABLEREAD:
		cci_isolevel = TRAN_REPEATABLE_READ; break;
	case ISOLATIONLEVEL_SERIALIZABLE:
		cci_isolevel = TRAN_SERIALIZABLE; break;
	default:
		return XACT_E_ISOLATIONLEVEL;
	}

	if(!bCheckOnly)
	{
		T_CCI_ERROR err_buf;
		int rc = cci_set_db_parameter(hConn, CCI_PARAM_ISOLATION_LEVEL, &cci_isolevel, &err_buf);
		if(rc<0) return E_FAIL;
		m_isoLevel = isoLevel;
	}

	ATLTRACE(atlTraceDBProvider, 2, "Current Isolation Level:[%ld]\n", isoLevel);

	return S_OK;
}
void CWII_IPC_HLE_WiiMote::SDPSendServiceSearchResponse(u16 cid, u16 TransactionID, u8* pServiceSearchPattern, u16 MaximumServiceRecordCount)
{
	// verify block... we handle search pattern for HID service only
	{
		CBigEndianBuffer buffer(pServiceSearchPattern);
		_dbg_assert_(WII_IPC_WIIMOTE, buffer.Read8(0) == SDP_SEQ8);   // data sequence
		_dbg_assert_(WII_IPC_WIIMOTE, buffer.Read8(1) == 0x03);       // sequence size

		// HIDClassID
		_dbg_assert_(WII_IPC_WIIMOTE, buffer.Read8(2) == 0x19);
		_dbg_assert_(WII_IPC_WIIMOTE, buffer.Read16(3) == 0x1124);
	}

	u8 DataFrame[1000];
	CBigEndianBuffer buffer(DataFrame);

	int Offset = 0;
	l2cap_hdr_t* pHeader = (l2cap_hdr_t*)&DataFrame[Offset]; Offset += sizeof(l2cap_hdr_t);
	pHeader->dcid = cid;

	buffer.Write8 (Offset, 0x03);          Offset++;
	buffer.Write16(Offset, TransactionID); Offset += 2; // Transaction ID
	buffer.Write16(Offset, 0x0009);        Offset += 2; // Param length
	buffer.Write16(Offset, 0x0001);        Offset += 2; // TotalServiceRecordCount
	buffer.Write16(Offset, 0x0001);        Offset += 2; // CurrentServiceRecordCount
	buffer.Write32(Offset, 0x10000);       Offset += 4; // ServiceRecordHandleList[4]
	buffer.Write8(Offset, 0x00);           Offset++;    // No continuation state;


	pHeader->length = (u16)(Offset - sizeof(l2cap_hdr_t));
	m_pHost->SendACLPacket(GetConnectionHandle(), DataFrame, pHeader->length + sizeof(l2cap_hdr_t));
}
Esempio n. 5
0
HRESULT CCUBRIDSession::DoCASCCICommit(bool bCommit)
{
	int hConn;
	HRESULT hr = GetConnectionHandle(&hConn);
	if(FAILED(hr)) return E_FAIL;

	T_CCI_ERROR err_buf;
	int rc = cci_end_tran(hConn, bCommit?CCI_TRAN_COMMIT:CCI_TRAN_ROLLBACK, &err_buf);
	if(rc<0) return bCommit?XACT_E_COMMITFAILED:E_FAIL;

	// TxnCallback을 호출해 좀비로 만든다.
	POSITION pos = m_grpTxnCallbacks.GetHeadPosition();
	while(pos)
		m_grpTxnCallbacks.GetNext(pos)->TxnCallback(0);

	return S_OK;
}
Esempio n. 6
0
STDMETHODIMP CCUBRIDSession::GetTransactionInfo(XACTTRANSINFO *pinfo)
{
	ATLTRACE(atlTraceDBProvider, 2, "CCUBRIDSession::GetTransactionInfo\n");

	if(!pinfo) return E_INVALIDARG;
	if(m_bAutoCommit) return XACT_E_NOTRANSACTION;

	int hConn;
	HRESULT hr = GetConnectionHandle(&hConn);
	if(FAILED(hr)) return E_FAIL;

	memset(pinfo, 0, sizeof(*pinfo));
	memcpy(&pinfo->uow, &hConn, sizeof(int));
	pinfo->isoLevel = m_isoLevel;
	pinfo->grfTCSupported = XACTTC_NONE;

	return S_OK;
}
Esempio n. 7
0
int CNetManager::getIPinfo(IPinfo *info, string &strErr)
{
	int ret = checkConnect();
	if (ret == CONNECT_ON_L2)
	{
		CNetConnection *p=GetConnectionHandleL2();
		return p->performGetIPinfo(info, strErr);
	}
	else if (ret == CONNECT_ON_L1)
	{
		CNetConnection *p=GetConnectionHandle();
		return p->performGetIPinfo(info, strErr);
	}
	else
	{
		strErr = "网络尚未接通,无IP信息";
		return NET_CONNECT_FAIL;
	}
}
Esempio n. 8
0
void CWII_IPC_HLE_WiiMote::SDPSendServiceAttributeResponse(u16 cid, u16 TransactionID,
	u32 ServiceHandle, u16 startAttrID,
	u16 endAttrID,
	u16 MaximumAttributeByteCount,
	u8* pContinuationState)
{
	if (ServiceHandle != 0x10000)
	{
		ERROR_LOG(WII_IPC_WIIMOTE, "Unknown service handle %x", ServiceHandle);
		PanicAlert("Unknown service handle %x", ServiceHandle);
	}

	// _dbg_assert_(WII_IPC_WIIMOTE, ServiceHandle == 0x10000);

	u32 contState = ParseCont(pContinuationState);

	u32 packetSize = 0;
	const u8* pPacket = GetAttribPacket(ServiceHandle, contState, packetSize);

	// generate package
	u8 DataFrame[1000];
	CBigEndianBuffer buffer(DataFrame);

	int Offset = 0;
	l2cap_hdr_t* pHeader = (l2cap_hdr_t*)&DataFrame[Offset];
	Offset += sizeof(l2cap_hdr_t);
	pHeader->dcid = cid;

	buffer.Write8(Offset, 0x05);
	Offset++;
	buffer.Write16(Offset, TransactionID);
	Offset += 2;  // Transaction ID

	memcpy(buffer.GetPointer(Offset), pPacket, packetSize);
	Offset += packetSize;

	pHeader->length = (u16)(Offset - sizeof(l2cap_hdr_t));
	m_pHost->SendACLPacket(GetConnectionHandle(), DataFrame, pHeader->length + sizeof(l2cap_hdr_t));

	// Debugger::PrintDataBuffer(LogTypes::WIIMOTE, DataFrame, pHeader->length + sizeof(l2cap_hdr_t),
	// "test response: ");
}
Esempio n. 9
0
int CNetManager::checkConnect()
{
	CNetConnection *pL1=GetConnectionHandle();
	CNetConnection *pL2=GetConnectionHandleL2();

	//如果PL2为null(说明没有实体),则认为第二层未连接
	if (pL2 != NULL)
	{
		if ( pL2->performCheck() == CHECK_OK )
		{
			return CONNECT_ON_L2;
		}
	}
	//第一层类同
	if (pL1 != NULL)
	{
		if ( pL1->performCheck() == CHECK_OK )
		{
			return CONNECT_ON_L1;
		}
	}

	return CONNECT_OFF;
}