⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connectionmgrdlg.cpp

📁 基于widcomm的蓝牙传输功能程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    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 + -