📄 connectionmgrdlg.cpp
字号:
msg.Format("ERROR: %d", code); // limit in case array not terminated
return msg;
}
}
CString GetResponseString( tOBEX_RESPONSE_CODE response)
{
if (response == OBEX_RSP_OK)
return "OK"; // just show failures
else
{
CString msg;
msg.Format("RESPONSE: %d", response); // limit in case array not terminated
return msg;
}
}
CString GetTargetString(UINT8 * p_m_target)
{
if (p_m_target == NULL)
return "target: NULL";
else
{
CString msg;
msg.Format("target: \'%20.20s\'", p_m_target); // limit in case array not terminated
return msg;
}
}
CString GetHeadersString(CObexHeaders *p_headers)
{
CString msg;
if (p_headers == NULL)
return "headers NULL";
else
{
UINT32 length;
// object name?
if (p_headers->GetNameLength(&length))
{
WCHAR * p_object_name = (WCHAR *) malloc (length * sizeof (WCHAR));
p_headers->GetName(p_object_name);
char * p_object_name_char = (char *) malloc (length*2);
wcstombs(p_object_name_char, p_object_name, length);
msg.Format("Name: \'%*.*s\'", length, length, p_object_name_char);
free (p_object_name);
free (p_object_name_char);
return msg;
}
else
return "No object name header";
}
}
CString GetBodyString(CObexHeaders *p_headers)
{
if (p_headers == NULL)
return "headers NULL";
else
{
UINT32 length;
CString msg;
// object name?
if (p_headers->GetBodyLength(&length))
{
UINT8 * p_object_body = (UINT8 *) malloc (length);
BOOL body_end;
p_headers->GetBody(p_object_body, &body_end);
msg.Format("Body: \'%*.*s\' %s", length, length, p_object_body, body_end ? "BODY END" : "");
free (p_object_body);
return msg;
}
else
return "No object body header";
}
}
///////////////////////////////////////////////////////////
//////////////// Methods derived from CObexClient ////////
///////////////////////////////////////////////////////////
void CConnectionMgrDlg::OnOpen(CObexHeaders *p_confirm, UINT16 tx_mtu, tOBEX_ERRORS code, tOBEX_RESPONSE_CODE response)
{
CString msg;
msg.Format("%s %s %s tx_mtu: %d", GetErrorString(code), GetResponseString(response), GetHeadersString(p_confirm), tx_mtu);
AddLogText("<< OPEN CONFIRM: " + msg);
msg.Format("Code %s %s", GetErrorString(code), GetResponseString(response));
SetDlgItemText(IDC_STATUS_TEXT, msg);
// init client msg index
client_list_max = (int) m_client_list.GetSize();
client_list_index = 0;
// To test SetWriteTimeOut, put breakpoint in SendNextServerObject on server side before one of the object response cases
// Should see client side timeout after 10 seconds, instead of expected 20 (default HCI link supervision timeout)
SetWriteTimeOut(10);
SendNextClientObject();
}
void CConnectionMgrDlg::OnClose(CObexHeaders *p_confirm, tOBEX_ERRORS code, tOBEX_RESPONSE_CODE response)
{
CString msg;
msg.Format("%s %s %s", GetErrorString(code), GetResponseString(response), GetHeadersString(p_confirm));
AddLogText("<< CLOSE CONFIRM: " + msg);
msg.Format("Code %s %s", GetErrorString(code), GetResponseString(response));
SetDlgItemText(IDC_STATUS_TEXT, "Close confirm. " + msg);
if (!m_isServer)
StopSession();
}
void CConnectionMgrDlg::OnAbort (CObexHeaders *p_confirm, tOBEX_ERRORS code, tOBEX_RESPONSE_CODE response)
{
CString msg;
msg.Format("%s %s, %s", GetErrorString(code), GetResponseString(response), GetHeadersString(p_confirm));
AddLogText("<< ABORT CONFIRM: " + msg);
msg.Format("Code %s %s", GetErrorString(code), GetResponseString(response));
SetDlgItemText(IDC_STATUS_TEXT, "Abort confirm. " + msg);
SendNextClientObject();
}
void CConnectionMgrDlg::OnPut (CObexHeaders *p_confirm, tOBEX_ERRORS code, tOBEX_RESPONSE_CODE response)
{
CString msg;
msg.Format("%s %s %s", GetErrorString(code), GetResponseString(response), GetHeadersString(p_confirm));
AddLogText("<< PUT CONFIRM: " + msg);
SendNextClientObject();
}
void CConnectionMgrDlg::OnGet (CObexHeaders *p_confirm, tOBEX_ERRORS code, BOOL final, tOBEX_RESPONSE_CODE response)
{
CString msg;
msg.Format("%s %s %s %s %s", GetErrorString(code), GetResponseString(response), GetHeadersString(p_confirm), final ? "FINAL" : "", GetBodyString(p_confirm));
AddLogText("<< GET CONFIRM: " + msg);
SendNextClientObject();
}
void CConnectionMgrDlg::OnSetPath (CObexHeaders *p_confirm, tOBEX_ERRORS code, tOBEX_RESPONSE_CODE response)
{
CString msg;
msg.Format("%s %s %s", GetErrorString(code), GetResponseString(response), GetHeadersString(p_confirm));
AddLogText("<< SET PATH CONFIRM: " + msg);
SendNextClientObject();
}
///////////////////////////////////////////////////////////
//////////////// Methods derived from CObexServer ////////
///////////////////////////////////////////////////////////
void CConnectionMgrDlg::OnOpenInd(CObexHeaders *p_request)
{
CString msg;
BD_ADDR bd_addr;
GetRemoteBDAddr(bd_addr);
msg.Format("Open Indication from %s, %s", BdAddrToString(bd_addr), GetHeadersString(p_request));
SetDlgItemText(IDC_STATUS_TEXT, msg);
msg.Format("From %s: %s", BdAddrToString(bd_addr), GetHeadersString(p_request));
AddLogText("<< OPEN IND: " + msg);
#if 0
// test for user-defined target/who fix - disabled - modification of a received headers object and then tx it back caused mem leak - CR 51402
CObexUserDefined ud;
UINT32 cid = 0x12345678; // a value for testing
BOOL bResult = ud.SetHeader(0x33, cid);
UINT8 user_type;
UINT8 user_id;
user_type = ud.GetUserType(&user_id);
TRACE("Type ID of ConnectionID: type:0x%02x id:0x%02x\n", user_type, user_id);
// user_type & user_id are set and retrieved currectly
ASSERT(bResult); // return TRUE
bResult = p_request->AddUserDefined(&ud);
ASSERT(bResult); // return TRUE
bResult = p_request->SetWho((UINT8 *)"target", (UINT32) strlen("target"));
ASSERT(bResult); // return TRUE
bResult = p_request->SetDescription(L"Description"); // for testing only
ASSERT(bResult); // return TRUE
#endif
tOBEX_ERRORS rsp;
// send back the open confirm with the request headers
rsp = CObexServer::OpenCnf(OBEX_SUCCESS, OBEX_RSP_OK, p_request);
msg.Format("%d %s", rsp, GetHeadersString(p_request));
AddLogText(">> OPEN CNF: rtn: " + msg);
SetDlgItemText(IDC_STATUS_TEXT, "Connection Opened");
// init server msg index
server_list_max = (int) m_server_list.GetSize();
server_list_index = 0;
SwitchRole(NEW_MASTER);
}
void CConnectionMgrDlg::OnSetPathInd (CObexHeaders * p_request, BOOL backup, BOOL create)
{
CString msg;
msg.Format("%s %s %s", GetHeadersString(p_request), backup ? "BACKUP" : "", create ? "CREATE" : "");
AddLogText("<< SET PATH IND: " + msg);
SendNextServerObject(OBEX_REQ_SETPATH);
}
void CConnectionMgrDlg::OnPutInd (CObexHeaders * p_request, BOOL final)
{
CString msg;
msg.Format("%s %s %s", GetHeadersString(p_request), final ? "FINAL" : "", GetBodyString(p_request));
AddLogText("<< PUT IND: " + msg);
SendNextServerObject(OBEX_REQ_PUT);
}
void CConnectionMgrDlg::OnPutCreateInd(CObexHeaders * p_request)
{
CString msg;
msg.Format("%s", GetHeadersString(p_request));
AddLogText("<< PUT CREATE IND: " + msg);
SendNextServerObject(OBEX_REQ_PUT, TRUE);
}
void CConnectionMgrDlg::OnPutDeleteInd (CObexHeaders * p_request)
{
CString msg;
msg.Format("%s", GetHeadersString(p_request));
AddLogText("<< PUT DELETE IND: " + msg);
SendNextServerObject(OBEX_REQ_PUT, FALSE, TRUE);
}
void CConnectionMgrDlg::OnGetInd (CObexHeaders * p_request, BOOL final)
{
CString msg;
msg.Format("%s %s", GetHeadersString(p_request), final ? "FINAL" : "");
AddLogText("<< GET IND: " + msg);
SendNextServerObject(OBEX_REQ_GET);
}
void CConnectionMgrDlg::OnAbortInd (CObexHeaders * p_request)
{
CString msg;
msg.Format("%s", GetHeadersString(p_request));
AddLogText("<< ABORT IND: " + msg);
SendNextServerObject(OBEX_REQ_ABORT);
}
void CConnectionMgrDlg::OnCloseInd(CObexHeaders *p_request)
{
CString msg;
msg.Format("%s", GetHeadersString(p_request));
AddLogText("<< CLOSE IND: " + msg);
tOBEX_ERRORS rsp;
// send back the open confirm with the request headers
rsp = CObexServer::CloseCnf(OBEX_SUCCESS, OBEX_RSP_OK, p_request);
msg.Format("%d %s", rsp, GetHeadersString(p_request));
AddLogText(">> CLOSE CNF: rtn: " + msg);
SetDlgItemText(IDC_STATUS_TEXT, "Client Closed. Waiting for a new client connection");
}
void CConnectionMgrDlg::SendNextClientObject()
{
tOBEX_ERRORS result = OBEX_SUCCESS;
CString msg;
CString operation;
if (client_list_index < client_list_max)
{
switch (m_client_list[client_list_index].obex_req_resp)
{
case OBEX_REQ_PUT:
operation = "PUT";
result = Put( m_client_list[client_list_index].p_object, m_client_list[client_list_index].final);
break;
case OBEX_REQ_GET:
operation = "GET";
result = Get( m_client_list[client_list_index].p_object, m_client_list[client_list_index].final);
break;
case OBEX_REQ_SETPATH:
operation = "SET PATH";
result = SetPath( m_client_list[client_list_index].p_object, m_client_list[client_list_index].backup, m_client_list[client_list_index].create);
break;
case OBEX_REQ_ABORT:
operation = "ABORT";
result = Abort( m_client_list[client_list_index].p_object);
break;
}
UINT32 length;
if (m_client_list[client_list_index].p_object->GetNameLength(&length))
{
WCHAR * buf = (WCHAR *) malloc (length * sizeof (WCHAR));
m_client_list[client_list_index].p_object->GetName(buf);
char * buf_char = (char *) malloc (length*2);
wcstombs(buf_char, buf, length);
msg.Format("%d Client object %d, %s \'%*s\'", result, client_list_index, operation, length, buf_char);
free (buf);
free (buf_char);
}
else
msg.Format("%d Client object %d No Name", result, client_list_index);
AddLogText(">> " + operation + " rtn: " + msg);
client_list_index++;
}
}
void CConnectionMgrDlg::SendNextServerObject(UINT8 request_code, BOOL create_req, BOOL delete_req)
{
tOBEX_ERRORS result = OBEX_SUCCESS;
CString msg;
BOOL send_response = TRUE;
if (server_list_index < server_list_max)
{
switch (request_code)
{
case OBEX_REQ_PUT:
if (create_req)
result = PutCreateCnf( OBEX_SUCCESS, (tOBEX_RESPONSE_CODE)m_server_list[server_list_index].obex_req_resp, m_server_list[server_list_index].p_object);
else if (delete_req)
result = PutDeleteCnf( OBEX_SUCCESS, (tOBEX_RESPONSE_CODE)m_server_list[server_list_index].obex_req_resp, m_server_list[server_list_index].p_object);
else
result = PutCnf( OBEX_SUCCESS, (tOBEX_RESPONSE_CODE)m_server_list[server_list_index].obex_req_resp, m_server_list[server_list_index].p_object);
break;
case OBEX_REQ_GET:
result = GetCnf (OBEX_SUCCESS, (tOBEX_RESPONSE_CODE)m_server_list[server_list_index].obex_req_resp, m_server_list[server_list_index].final, m_server_list[server_list_index].p_object);
break;
case OBEX_REQ_SETPATH:
result = SetPathCnf (OBEX_SUCCESS, (tOBEX_RESPONSE_CODE)m_server_list[server_list_index].obex_req_resp, m_server_list[server_list_index].p_object);
break;
case OBEX_REQ_ABORT:
result = AbortCnf (OBEX_SUCCESS, (tOBEX_RESPONSE_CODE)m_server_list[server_list_index].obex_req_resp, m_server_list[server_list_index].p_object);
break;
default:
send_response = FALSE;
break;
}
UINT32 length;
if (m_server_list[server_list_index].p_object->GetNameLength(&length))
{
WCHAR * buf = (WCHAR *) malloc (length * sizeof (WCHAR));
m_server_list[server_list_index].p_object->GetName(buf);
char * buf_char = (char *) malloc (length*2);
wcstombs(buf_char, buf, length);
msg.Format("%d Server object %d \'%*s\'", result, server_list_index, length, buf_char);
free (buf);
free (buf_char);
}
else
msg.Format("%d Server object %d No Name", result, server_list_index );
if (send_response)
AddLogText(">> RESPONSE: rtn: " + msg);
else
AddLogText("-- No response sent");
server_list_index++;
}
}
LRESULT CConnectionMgrDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DefWindowProc(message, wParam, lParam);
}
BOOL CConnectionMgrDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::OnCommand(wParam, lParam);
}
void CConnectionMgrDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
CDialog::OnClose();
}
void CConnectionMgrDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -