windows-nt/Source/XPSP1/NT/net/irda/irftp/devicelist.cpp
2020-09-26 16:20:57 +08:00

225 lines
5.2 KiB
C++

/*++
Microsoft Windows
Copyright (C) Microsoft Corporation, 1981 - 1999
Module Name:
devicelist.cpp
Abstract:
Author:
Rahul Thombre (RahulTh) 4/30/1998
Revision History:
4/30/1998 RahulTh
Created this module.
--*/
///////////////////////////////////////////////////////////////////////
// DeviceList.cpp: implementation of the CDeviceList class.
//
//////////////////////////////////////////////////////////////////////
#include "precomp.hxx"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDeviceList::CDeviceList()
{
m_pDeviceInfo = NULL;
m_lNumDevices = 0;
InitializeCriticalSection(&m_criticalSection);
}
CDeviceList::~CDeviceList()
{
if(m_pDeviceInfo)
{
delete [] m_pDeviceInfo;
m_pDeviceInfo = NULL;
m_lNumDevices = 0;
}
}
CDeviceList& CDeviceList::operator=(POBEX_DEVICE_LIST pDevList)
{
CError error (NULL, IDS_DEFAULT_ERROR_TITLE, ERROR_OUTOFMEMORY);
EnterCriticalSection(&m_criticalSection);
if (m_pDeviceInfo)
{
delete [] m_pDeviceInfo;
m_pDeviceInfo = NULL;
m_lNumDevices = 0;
}
LeaveCriticalSection(&m_criticalSection);
if (!pDevList)
return *this;
//if there is a device list
EnterCriticalSection(&m_criticalSection);
m_lNumDevices = pDevList->DeviceCount;
try
{
m_pDeviceInfo = new OBEX_DEVICE [m_lNumDevices];
memcpy ((LPVOID)m_pDeviceInfo, (LPVOID)pDevList->DeviceList, sizeof(OBEX_DEVICE) * m_lNumDevices);
}
catch (CMemoryException* e)
{
error.ShowMessage (IDS_DEVLIST_ERROR);
m_pDeviceInfo = NULL; //the best we can do here is to pretend that there
m_lNumDevices = 0; //are no devices and move on
e->Delete();
}
LeaveCriticalSection(&m_criticalSection);
return *this;
}
ULONG CDeviceList::GetDeviceCount(void)
{
return m_lNumDevices;
}
LONG CDeviceList::SelectDevice(CWnd * pWnd, TCHAR* lpszDevName)
{
ASSERT(pWnd);
int iSel;
LONG lDeviceID;
int numDevices;
lpszDevName[0] = '\0';
EnterCriticalSection(&m_criticalSection);
numDevices = m_lNumDevices;
if (numDevices > 0) {
if (m_pDeviceInfo->DeviceType == TYPE_IRDA) {
lDeviceID = m_pDeviceInfo->DeviceSpecific.s.Irda.DeviceId; //store the id and name of the
} else {
lDeviceID = m_pDeviceInfo->DeviceSpecific.s.Ip.IpAddress;
}
lstrcpy(lpszDevName,m_pDeviceInfo->DeviceName);
}
LeaveCriticalSection(&m_criticalSection);
if (numDevices == 0)
return errIRFTP_NODEVICE; //in the rare case that there are no devices in range, return -1
if (1 == numDevices) //there is only one device. No need to choose a device
return lDeviceID;
CMultDevices dlgChooseDevice(pWnd, this);
if (IDOK == dlgChooseDevice.DoModal())
return errIRFTP_MULTDEVICES; //OnOK will fill in the required data structures
else
return errIRFTP_SELECTIONCANCELLED; //return -1 if cancel was chosen
}
ULONG CDeviceList::GetDeviceID(int iDevIndex)
{
if (iDevIndex < m_lNumDevices) //sanity checks
return m_pDeviceInfo[iDevIndex].DeviceSpecific.s.Irda.DeviceId;
else
return -1;
}
///////////////////////////////////////////////////////////////////////////////////
//this function should only be called after a critical section has been
//obtained.
void CDeviceList::GetDeviceName(LONG iDevID, TCHAR* lpszDevName)
{
int len;
int i;
lpszDevName[0] = '\0'; //better be safe
//EnterCriticalSection(&m_criticalSection);
for(i = 0; i < m_lNumDevices; i++)
{
if(iDevID == (LONG)m_pDeviceInfo[i].DeviceSpecific.s.Irda.DeviceId)
break;
}
if(i == m_lNumDevices) //the device was not found
lstrcpy (lpszDevName, TEXT("???"));
else
{
wcscpy(lpszDevName, m_pDeviceInfo[i].DeviceName);
}
//LeaveCriticalSection(&m_criticalSection);
}
///////////////////////////////////////////////////////////////////////////////////
//this function should only be called after a critical section has been
//obtained.
BOOL
CDeviceList::GetDeviceType(
LONG iDevID,
OBEX_DEVICE_TYPE *Type
)
{
int i;
BOOL bResult;
*Type=TYPE_UNKNOWN;
EnterCriticalSection(&m_criticalSection);
for(i = 0; i < m_lNumDevices; i++)
{
if (m_pDeviceInfo[i].DeviceType == TYPE_IRDA) {
if (iDevID == (LONG)m_pDeviceInfo[i].DeviceSpecific.s.Irda.DeviceId) {
*Type=m_pDeviceInfo[i].DeviceType;
break;
}
} else {
if (iDevID == (LONG)m_pDeviceInfo[i].DeviceSpecific.s.Ip.IpAddress) {
*Type=m_pDeviceInfo[i].DeviceType;
break;
}
}
}
if (i == m_lNumDevices) {
//
// the device was not found
//
bResult=FALSE;
} else {
bResult=TRUE;
}
LeaveCriticalSection(&m_criticalSection);
return bResult;
}