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

📄 obexsampledlg.cpp

📁 symbian下基于Object Exchange (OBEX)的协议进行数据传输的源代码。
💻 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 + -