📄 obexsampledlg.cpp
字号:
// ObexSampleDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ObexSample.h"
#include "ObexSampleDlg.h"
#include <bt_sdp.h>
#include <atlbase.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define dim(x) (sizeof(x) / sizeof(x[0]))
/////////////////////////////////////////////////////////////////////////////
// CObexSampleDlg dialog
CObexSampleDlg::CObexSampleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CObexSampleDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CObexSampleDlg)
m_sFile = _T("\\mf.pdb");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CObexSampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CObexSampleDlg)
DDX_Control(pDX, IDC_LIST_LOG, m_LogList);
DDX_Control(pDX, IDC_LIST_DEV, m_DevList);
DDX_Text(pDX, IDC_EDIT_FILE, m_sFile);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CObexSampleDlg, CDialog)
//{{AFX_MSG_MAP(CObexSampleDlg)
ON_BN_CLICKED(IDC_BUTTON_SEARCH, OnButtonSearch)
ON_MESSAGE(WM_OBEX_INFO,OnObexInfo)
ON_MESSAGE(WM_OBEX_EVENT,OnObexEvent)
ON_BN_CLICKED(IDC_BUTTON_FILE, OnButtonFile)
ON_BN_CLICKED(IDC_BUTTON_SEND, OnButtonSend)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CObexSampleDlg message handlers
BOOL CObexSampleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
m_bSearchStatus = m_oObex.InitObex(m_hWnd);
return TRUE; // return TRUE unless you set the focus to a control
}
void CObexSampleDlg::OnButtonSearch()
{
if ( m_bSearchStatus )
{
((IObex2 *)m_oObex.GetObex())->PauseDeviceEnum (FALSE);
m_bSearchStatus = FALSE;
((CButton*)GetDlgItem(IDC_BUTTON_SEARCH))->SetWindowText(L"Start");
}
else
{
m_oObex.InitObex(m_hWnd);
m_bSearchStatus = TRUE;
((CButton*)GetDlgItem(IDC_BUTTON_SEARCH))->SetWindowText(L"Stop");
}
}
LRESULT CObexSampleDlg::OnObexInfo(WPARAM,LPARAM lParam)
{
CString* pMsg = (CString*)lParam;
m_LogList.AddString(*pMsg);
return 0;
}
int CObexSampleDlg::FindDevInList(POBEXDEVICEINFO pDev)
{
int i, nCnt = m_DevList.GetCount();
for (i = 0; i < nCnt; i++)
{
POBEXDEVICEINFO pData = (POBEXDEVICEINFO)m_DevList.GetItemDataPtr(i);
if ((int)pData == (int)pDev)
return i;
}
return LB_ERR;
}
LRESULT CObexSampleDlg::OnObexEvent(WPARAM wParam, LPARAM lParam)
{
int i;
HRESULT hr;
TCHAR szDevStr[128];
POBEXDEVICEINFO pFoundDev;
OBEXDEVICEINFO diDev;
memset (&diDev, 0, sizeof (diDev));
IPropertyBag *pDeviceBag = (IPropertyBag *)lParam;
VARIANT var;
VariantInit (&var);
hr = pDeviceBag->Read(_T("Name"), &var, NULL);
if (SUCCEEDED(hr))
{
diDev.dwFlags |= DEV_FLAG_NAME;
lstrcpy (diDev.szName, var.bstrVal);
}
VariantClear(&var);
hr = pDeviceBag->Read(_T("Address"), &var, NULL);
if (SUCCEEDED(hr))
{
diDev.dwFlags |= DEV_FLAG_ADDRESS;
if (var.vt == VT_BSTR)
lstrcpy (diDev.szAddr, var.bstrVal);
else if (var.vt == VT_I4)
_stprintf (diDev.szAddr, _T("%08x"), var.ulVal);
else
diDev.dwFlags &= ~DEV_FLAG_ADDRESS;
}
VariantClear(&var);
hr = pDeviceBag->Read(_T("Port"), &var, NULL);
if (SUCCEEDED(hr))
{
diDev.dwFlags |= DEV_FLAG_PORT;
if (var.vt == VT_BSTR)
lstrcpy (diDev.szAddr, var.bstrVal);
else if (var.vt == VT_I4)
_stprintf (diDev.szAddr, _T("%08x"), var.ulVal);
else
diDev.dwFlags &= ~DEV_FLAG_PORT;
}
VariantClear(&var);
hr = pDeviceBag->Read(_T("Transport"), &var, NULL);
if (SUCCEEDED(hr))
{
if (var.vt == VT_BSTR)
{
TCHAR szTran[40];
memset (szTran, 0, sizeof (szTran));
wcsncpy (szTran, var.bstrVal, 38);
wcslwr (szTran);
LPOLESTR lpszIrDATransport = NULL;
LPOLESTR lpszBthTransport = NULL;
if ( SUCCEEDED(StringFromCLSID(CLSID_IrdaTransport,&lpszIrDATransport)) &&
SUCCEEDED(StringFromCLSID(CLSID_BthTransport,&lpszBthTransport)) )
{
if (wcsicmp (lpszIrDATransport, szTran) == 0)
diDev.dwFlags |= DEV_TRANS_IRDA;
else if (wcsicmp (lpszBthTransport, szTran) == 0)
diDev.dwFlags |= DEV_TRANS_BTOOTH;
}
if ( lpszIrDATransport )
CoTaskMemFree(lpszIrDATransport);
if ( lpszBthTransport )
CoTaskMemFree(lpszBthTransport);
}
}
VariantClear(&var);
hr = pDeviceBag->Read (TEXT("ServiceUUID"), &var, NULL);
if (SUCCEEDED(hr))
{
TCHAR lpszIr[40];
TCHAR lpszFtp[40];
TCHAR lpszObjPush[40];
if (var.vt == VT_BSTR)
{
CString sServiceUUID = CComBSTR(var.bstrVal);
memset(lpszIr,0,sizeof(lpszIr));
memset(lpszObjPush,0,sizeof(lpszObjPush));
memset(lpszFtp,0,sizeof(lpszFtp));
StringFromGUID2(IrMCSyncServiceClass_UUID,lpszIr,sizeof(lpszIr)/sizeof(TCHAR));
StringFromGUID2(OBEXObjectPushServiceClass_UUID,lpszObjPush,sizeof(lpszObjPush)/sizeof(TCHAR));
StringFromGUID2(OBEXFileTransferServiceClass_UUID,lpszFtp,sizeof(lpszFtp)/sizeof(TCHAR));
if ( sServiceUUID.CompareNoCase(lpszIr) == 0 )
{
diDev.dwFlags |= (DEV_FLAG_UUID | DEV_SERVICE_IRMCSYNC);
}
else if ( sServiceUUID.CompareNoCase(lpszObjPush) == 0 )
{
diDev.dwFlags |= (DEV_FLAG_UUID | DEV_SERVICE_OBJPUSH);
}
else if ( sServiceUUID.CompareNoCase(lpszFtp) == 0 )
{
diDev.dwFlags |= (DEV_FLAG_UUID | DEV_SERVICE_FTP);
}
}
}
VariantClear(&var);
diDev.pDevBag = pDeviceBag;
lstrcpy (szDevStr, diDev.szName);
lstrcat (szDevStr, _T(" "));
if (diDev.dwFlags & DEV_SERVICE_OBJPUSH)
lstrcat (szDevStr, _T("Object Push"));
else if (diDev.dwFlags & DEV_SERVICE_FTP)
lstrcat (szDevStr, _T("FTP"));
else if (diDev.dwFlags & DEV_SERVICE_IRMCSYNC)
lstrcat (szDevStr, _T("IrMC Sync"));
else if (diDev.dwFlags & DEV_TRANS_IRDA)
lstrcat (szDevStr, _T("IrDA"));
pFoundDev = m_oObex.FindDevInfo (pDeviceBag);
switch ((int)wParam)
{
case OE_DEVICE_ARRIVAL:
if (pFoundDev->pDevBag)
break;
memcpy (pFoundDev, &diDev, sizeof (diDev));
i = m_DevList.AddString(szDevStr);
m_DevList.SetItemDataPtr(i,pFoundDev);
break;
case OE_DEVICE_UPDATE:
i = LB_ERR;
memcpy (pFoundDev, &diDev, sizeof (diDev));
if (pFoundDev->pDevBag)
{
i = FindDevInList(pFoundDev);
pFoundDev->pDevBag->Release();
}
if (LB_ERR != i)
m_DevList.DeleteString(i);
i = m_DevList.InsertString(i,szDevStr);
m_DevList.SetItemDataPtr(i,pFoundDev);
break;
case OE_DISCONNECT:
case OE_DEVICE_DEPARTURE:
if (pFoundDev->pDevBag == 0)
break;
i = FindDevInList(pFoundDev);
if (LB_ERR != i)
m_DevList.DeleteString(i);
pFoundDev->pDevBag->Release();
pFoundDev->pDevBag = 0;
break;
case OE_QUERY_PASSWORD:
break;
}
return 0;
}
void CObexSampleDlg::OnButtonFile()
{
CFileDialog dlg(TRUE,
L"*.*",
NULL,
OFN_HIDEREADONLY,
L"All files (*.*)|*.*||");
if ( dlg.DoModal() == IDOK )
{
m_sFile = dlg.GetPathName();
UpdateData(0);
}
}
void CObexSampleDlg::OnButtonSend()
{
UpdateData();
int nSel = m_DevList.GetCurSel();
if ( LB_ERR == nSel )
{
AfxMessageBox(L"Please select a device first!");
return;
}
m_LogList.AddString(L"Send has started...");
IObexDevice *pDevice = 0;
POBEXDEVICEINFO pDev = (POBEXDEVICEINFO)m_DevList.GetItemDataPtr(nSel);
// Enumeration must be stopped during transfer
IObex* pObex = m_oObex.GetObex();
((IObex2 *)pObex)->PauseDeviceEnum (TRUE);
HRESULT hr = 0;
if ((pDev->dwFlags & DEV_FLAG_DEVBOUND) == 0)
{
hr = pObex->BindToDevice (pDev->pDevBag, &pDevice);
if (SUCCEEDED (hr))
pDev->dwFlags |= DEV_FLAG_DEVBOUND;
else
{
CString sInfo;
sInfo.Format(_T("BindToDevice failed: hr = 0x%X, err = 0x%X"), hr,
GetLastError());
}
if (SUCCEEDED (hr))
{
int nRet = m_oObex.SendFile(pDevice, (LPTSTR)(LPCTSTR)m_sFile, pDev->dwFlags);
TRACE(L"SendFile retcode = %d\n",nRet);
}
}
// Restart Enumeration after transfer
((IObex2 *)pObex)->PauseDeviceEnum (FALSE);
m_LogList.AddString(L"Send has finished");
}
void CObexSampleDlg::OnDestroy()
{
m_oObex.Shutdown();
CDialog::OnDestroy();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -