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

📄 connectionmgrdlg.cpp

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