📄 connectionmgrdlg.cpp
字号:
m_client_list[8].final = TRUE;
m_client_list[8].obex_req_resp = OBEX_REQ_GET;
WCHAR c_object_name_9[] = L"Simple Put Request";
m_client_list.Add(CHeadersListEntry(c_object_name_9));
char c_object_body_9[] = "Simple Put Request Body";
m_client_list[9].p_object->SetBody((UINT8 *)c_object_body_9, (UINT32) strlen (c_object_body_9), TRUE);
m_client_list[9].obex_req_resp = OBEX_REQ_PUT;
m_client_list[9].final = TRUE;
#endif
// three part PUT - the body is sent in the 2nd and 3rd part, no body in the 1st part
WCHAR c_object_name_10[] = L"Put Request Part 1 of 3";
m_client_list.Add(CHeadersListEntry(c_object_name_10));
char c_object_body_10a[] = "Put Body Part 1 of 2";
char c_object_body_10b[] = "Put Body Part 2 of 2";
// total length of all body parts sent in 1st block
m_client_list[10].p_object->SetLength((UINT32) strlen(c_object_body_10a) + (UINT32) strlen(c_object_body_10b));
m_client_list[10].final = FALSE; // no body in first PUT request
m_client_list[10].obex_req_resp = OBEX_REQ_PUT;
WCHAR c_object_name_11[] = L"Put Request Part 2 of 3";
m_client_list.Add(CHeadersListEntry(c_object_name_11));
m_client_list[11].p_object->SetBody((UINT8 *)c_object_body_10a, (UINT32) strlen (c_object_body_10a), FALSE);
m_client_list[11].final = FALSE;
m_client_list[11].obex_req_resp = OBEX_REQ_PUT;
WCHAR c_object_name_12[] = L"Put Request Part 3 of 3";
m_client_list.Add(CHeadersListEntry(c_object_name_12));
m_client_list[12].p_object->SetBody((UINT8 *)c_object_body_10b, (UINT32) strlen (c_object_body_10b), TRUE);
m_client_list[12].final = TRUE;
m_client_list[12].obex_req_resp = OBEX_REQ_PUT;
// Server responses to the client sequence above
WCHAR s_object_name_0[] = L"ServerResponse0";
m_server_list.Add(CHeadersListEntry(s_object_name_0));
m_server_list[0].final = TRUE;
WCHAR s_object_description_0[] = L"Server Description 0";
m_server_list[0].p_object->SetDescription(s_object_description_0);
m_server_list[0].obex_req_resp = OBEX_RSP_OK;
WCHAR s_object_name_1[] = L"ServerResponse1";
m_server_list.Add(CHeadersListEntry(s_object_name_1));
m_server_list[1].final = TRUE;
WCHAR s_object_description_1[] = L"Server Description 1";
m_server_list[1].p_object->SetDescription(s_object_description_1);
char s_object_body_1[] = "Get Response Body";
m_server_list[1].p_object->SetBody((UINT8 *)s_object_body_1, (UINT32) strlen (s_object_body_1), TRUE);
m_server_list[1].obex_req_resp = OBEX_RSP_OK;
WCHAR s_object_name_2[] = L"ServerResponse2";
m_server_list.Add(CHeadersListEntry(s_object_name_2));
m_server_list[2].final = TRUE;
m_server_list[2].obex_req_resp = OBEX_RSP_OK;
WCHAR s_object_name_3[] = L"ServerResponse3";
m_server_list.Add(CHeadersListEntry(s_object_name_3));
m_server_list[3].p_object->SetBody(NULL, 0, TRUE);
m_server_list[3].final = TRUE;
m_server_list[3].obex_req_resp = OBEX_RSP_OK;
WCHAR s_object_name_4[] = L"ServerResponse4";
m_server_list.Add(CHeadersListEntry(s_object_name_4));
m_server_list[4].final = TRUE;
m_server_list[4].obex_req_resp = OBEX_RSP_OK;
WCHAR s_object_name_5[] = L"Get Response Part 1 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_5));
char s_server_body_5[] = "Get Response Body Part 1 of 3 ";
char s_server_body_6[] = "Get Response Body Part two of three ";
char s_server_body_7[] = "Get Response Body Part three of three";
m_server_list[5].p_object->SetBody((UINT8 *)s_server_body_5, (UINT32) strlen (s_server_body_5), FALSE);
m_server_list[5].p_object->SetLength((UINT32)(strlen(s_server_body_5) + strlen(s_server_body_6) + strlen(s_server_body_7)));
m_server_list[5].final = TRUE;
m_server_list[5].obex_req_resp = OBEX_RSP_CONTINUE;
WCHAR s_object_name_6[] = L"Get Response Part 2 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_6));
m_server_list[6].p_object->SetBody((UINT8 *)s_server_body_6, (UINT32) strlen (s_server_body_6), FALSE);
m_server_list[6].final = TRUE;
m_server_list[6].obex_req_resp = OBEX_RSP_CONTINUE;
WCHAR s_object_name_7[] = L"Get Response Part 3 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_7));
m_server_list[7].p_object->SetBody((UINT8 *)s_server_body_7, (UINT32) strlen (s_server_body_7), TRUE);
m_server_list[7].final = TRUE;
m_server_list[7].obex_req_resp = OBEX_RSP_OK;
#ifndef OBEX_ABORT_NOT_OK
WCHAR s_object_name_8[] = L"Get Response Part 1 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_5));
char s_server_body_8a[] = "Get Response (ABORT) Body Part 1 of 3 ";
char s_server_body_8b[] = "Get Response (ABORT) Body Part two of three "; // never sent
char s_server_body_8c[] = "Get Response (ABORT) Body Part three of three"; // never sent
m_server_list[8].p_object->SetBody((UINT8 *)s_server_body_8a, (UINT32) strlen (s_server_body_8a), FALSE);
m_server_list[8].p_object->SetLength((UINT32)(strlen(s_server_body_8a) + strlen(s_server_body_8b) + strlen(s_server_body_8c)));
m_server_list[8].final = TRUE;
m_server_list[8].obex_req_resp = OBEX_RSP_CONTINUE;
WCHAR s_object_name_9[] = L"Response to Abort";
m_server_list.Add(CHeadersListEntry(s_object_name_9));
m_server_list[9].final = TRUE;
m_server_list[9].obex_req_resp = OBEX_RSP_OK;
#else
WCHAR s_object_name_8[] = L"Get Response Part 1 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_5));
char s_server_body_8a[] = "Simple Get Response";
m_server_list[8].p_object->SetBody((UINT8 *)s_server_body_8a, strlen (s_server_body_8a), TRUE);
m_server_list[8].p_object->SetLength(strlen(s_server_body_8a));
m_server_list[8].final = TRUE;
m_server_list[8].obex_req_resp = OBEX_RSP_OK;
WCHAR s_object_name_9[] = L"Response to Simple Put";
m_server_list.Add(CHeadersListEntry(s_object_name_9));
m_server_list[9].final = TRUE;
m_server_list[9].obex_req_resp = OBEX_RSP_OK;
#endif
WCHAR s_object_name_10[] = L"Put Response Part 1 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_10));
m_server_list[10].final = TRUE;
m_server_list[10].obex_req_resp = OBEX_RSP_CONTINUE;
WCHAR s_object_name_11[] = L"Put Response Part 2 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_11));
m_server_list[11].final = TRUE;
m_server_list[11].obex_req_resp = OBEX_RSP_CONTINUE;
WCHAR s_object_name_12[] = L"Put Response Part 3 of 3";
m_server_list.Add(CHeadersListEntry(s_object_name_12));
m_server_list[12].final = TRUE;
m_server_list[12].obex_req_resp = OBEX_RSP_OK;
}
void CConnectionMgrDlg::StartSession ()
{
CString status;
// If we are an Obex Server create the service record. If
// it fails then get out now.
//
if ( m_isServer && ! DoCreateServiceRecord())
return;
// Set the security level.
//
UINT8 sec_level = BTM_SEC_NONE;
if (! m_RfCommIf.SetSecurityLevel(m_serviceName, sec_level , m_isServer))
{
SetDlgItemText(IDC_STATUS_TEXT, "Error setting security level");
return;
}
// Prepare for connection
//
if ( m_isServer )
{
tOBEX_ERRORS rsp;
rsp = Register(m_scn, p_m_target);
CString msg;
msg.Format(" scn: %d, %s, %s", m_scn, GetErrorString(rsp), GetTargetString(p_m_target));
AddLogText(">> REGISTER: " + msg);
if (rsp != OBEX_SUCCESS)
{
CString error;
error.Format("CObexServer::OBEX_ServerRegister, error code %i!", rsp);
SetDlgItemText(IDC_STATUS_TEXT, error);
return;
}
status.Format("Server is now waiting for client connection");
}
else
{
tOBEX_ERRORS rsp;
rsp = CObexClient::Open(m_scn, m_BdAddr, &client_open_headers, m_mtu);
status = "Attempting a connection with BDA: " + BdAddrToString(m_BdAddr);
CString msg;
msg.Format(" scn: %d, %s, server is: %s", m_scn, GetErrorString(rsp), BdAddrToString(m_BdAddr));
AddLogText(">> OPEN: " + msg);
if (rsp != OBEX_SUCCESS)
{
CString error;
error.Format("CObexClient::Open failed, error code %i!", rsp);
SetDlgItemText(IDC_STATUS_TEXT, error);
return;
}
}
// Set text on button and flag to redefine it as the
// way to stop an active session.
//
SetDlgItemText(IDC_START_BUTTON, "Stop Session");
m_ServerCheck.EnableWindow( FALSE );
SetDlgItemText(IDC_STATUS_TEXT, status);
m_isSessionStarted = TRUE;
}
void CConnectionMgrDlg::StopSession ()
{
// Depending on our mode close the port
//
if ( m_isServer )
{
tOBEX_ERRORS rsp;
rsp = Unregister();
if (rsp != OBEX_SUCCESS)
{
CString error;
error.Format("CObexServer::Unregister failed,, error code %i", rsp);
SetDlgItemText(IDC_STATUS_TEXT, error);
Sleep (5000);
}
}
else
{
m_isConnected = FALSE;
SetDlgItemText(IDC_STATUS_TEXT, "Session closed by user");
tOBEX_ERRORS rsp;
rsp = CObexClient::Close(&client_close_headers);
if (rsp != OBEX_SUCCESS)
{
CString error;
error.Format("CObexClient::Close, error code %i", rsp);
SetDlgItemText(IDC_STATUS_TEXT, error);
}
else
{
AddLogText(">> CLOSE: ");
}
}
// Set text on button and flag to redefine it as the
// way to restart a session.
//
SetDlgItemText(IDC_START_BUTTON, "Start Session");
// It should now be possible to change from Client
// mode to Server, and vice-versa.
//
m_ServerCheck.EnableWindow( TRUE );
// Delete the SDP object (if created). This
// removes the service from the 'available' list.
//
if (m_pSdpService)
{
delete m_pSdpService;
m_pSdpService = NULL;
}
SetDlgItemText(IDC_STATUS_TEXT, "Session has been stopped.");
m_isSessionStarted = FALSE;
}
void CConnectionMgrDlg::AddLogText(const CString &new_text)
{
CString current_text;
m_SendReceiveLog.GetWindowText(current_text);
m_SendReceiveLog.SetWindowText(current_text + new_text + crlf);
m_SendReceiveLog.LineScroll(m_SendReceiveLog.GetLineCount());
}
BOOL CConnectionMgrDlg::DoChooseServer()
{
CChooseServerDlg dlg;
// The dialog needs the GUID.
dlg.m_pServiceGuid = &service_guid;
if (dlg.DoModal() == IDOK)
{
// From the dialog, set the BD Address so that
// it can be used in the client connect.
//
memcpy(m_BdAddr, dlg.m_BdAddr, BD_ADDR_LEN);
// memcpy(m_serviceName, dlg.m_serviceName, BT_MAX_SERVICE_NAME_LEN + 1);
m_Name = dlg.m_Name; // friendly name
m_scn = dlg.m_Scn; // scn used by selected server
// Assign the SCN associating it with the GUID.
// If return is FALSE then there was a problem.
//
if (! m_RfCommIf.AssignScnValue(&service_guid, dlg.m_Scn))
{
CString error;
error.Format("RFCOMM Interface failed to assign SCN %d with GUID", dlg.m_Scn);
SetDlgItemText(IDC_STATUS_TEXT, error);
return FALSE;
}
CString msg;
msg.Format("Try connecting to %s with service %s on scn %d",
m_Name, m_serviceName, m_scn);
SetDlgItemText(IDC_STATUS_TEXT, msg);
Sleep(3000);
return TRUE;
}
//
// else the user cancelled.
//
else
return FALSE;
}
BOOL CConnectionMgrDlg::DoCreateServiceRecord()
{
SDP_RETURN_CODE sdp_rc;
CString error;
// Assign a SCN for the service.
//
if ( ! m_RfCommIf.AssignScnValue(&service_guid))
{
SetDlgItemText(IDC_STATUS_TEXT, "ERROR - SCN assignment failed");
return FALSE;
}
m_scn = m_RfCommIf.GetScn();
// Create a SDP Service object.
//
if (m_pSdpService)
delete m_pSdpService;
m_pSdpService = new CSdpService();
// Create a service record in the database and add the
// sequence to that record.
//
sdp_rc = m_pSdpService->AddServiceClassIdList (1, &service_guid);
if ( SDP_OK != sdp_rc )
{
error.Format("AddServiceClassIdList() failed, error code %i", sdp_rc);
SetDlgItemText(IDC_STATUS_TEXT, error);
return FALSE;
}
// Add Service Name attribute to the service record.
//
sdp_rc = m_pSdpService->AddServiceName (m_serviceName);
if ( SDP_OK != sdp_rc )
{
error.Format("AddServiceName() failed, error code %i", sdp_rc);
SetDlgItemText(IDC_STATUS_TEXT, error);
return FALSE;
}
// Add the protocol descriptor.
//
sdp_rc = m_pSdpService->AddRFCommProtocolDescriptor (m_RfCommIf.GetScn());
if ( SDP_OK != sdp_rc )
{
error.Format("AddRFCommProtocolDescriptor() failed, error code %i", sdp_rc);
SetDlgItemText(IDC_STATUS_TEXT, error);
return FALSE;
}
// Make service browsable.
//
sdp_rc = m_pSdpService->MakePublicBrowseable();
if ( SDP_OK != sdp_rc )
{
error.Format("MakePublicBrowseable() failed, error code %i", sdp_rc);
SetDlgItemText(IDC_STATUS_TEXT, error);
return FALSE;
}
// Activate the record.
//
sdp_rc = m_pSdpService->CommitRecord();
if ( SDP_OK != sdp_rc )
{
error.Format("CommitRecord() failed, error code %i", sdp_rc);
SetDlgItemText(IDC_STATUS_TEXT, error);
return FALSE;
}
return TRUE;
}
///////////////////////////////////////
////////// Utility Functions //////////
///////////////////////////////////////
// Return a CString based on a
// a BD Address (BD_ADDR type).
//
CString BdAddrToString(BD_ADDR bd_addr)
{
CString s;
s.Format("%x:%x:%x:%x:%x:%x",
bd_addr[0],
bd_addr[1],
bd_addr[2],
bd_addr[3],
bd_addr[4],
bd_addr[5]);
return s;
}
CString GetErrorString( tOBEX_ERRORS code)
{
if (code == OBEX_SUCCESS)
return "SUCCESS"; // just show failures
else
{
CString msg;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -