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); }
// 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)); }
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; }
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; }
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; } }
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: "); }
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; }