📄 obexirdatransport.cpp
字号:
VariantClear(&varMarkTest);
if(FAILED(pDevice->Read(c_szDevicePropAddress, &pDeviceVar, 0)))
{
hRet = E_FAIL;
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE, (L"[OBEX] ObexIRDATransport::UpdateDeviceProperties() -- cant find address!\n"));
goto connect_done;
}
if(FAILED(pDevice->Read(c_szDevicePropName, &pNameVar, 0)))
{
hRet = E_FAIL;
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE, (L"[OBEX] ObexIRDATransport::UpdateDeviceProperties() -- cant find IRDA name!\n"));
goto connect_done;
}
//also get the wide char version
else
{
*uiUpdateStatus = *uiUpdateStatus | FOUND_NAME;
wcstombs(pDeviceName, pNameVar.bstrVal, 25);
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE, (L"[OBEX] ----- using device name %s\n", pNameVar.bstrVal));
}
//create a socket
sMySock = socket(AF_IRDA, SOCK_STREAM, 0);
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE, (L"[OBEX - IR] --> Created Socket\n"));
if(INVALID_SOCKET == sMySock)
{
hRet = E_FAIL;
goto connect_done;
}
//information on the IrDA to connect to
SOCKADDR_IRDA DestSockAddr;
memset(&DestSockAddr, 0, sizeof(SOCKADDR_IRDA));
//move in the appropriate values (telling the service name and address family)
DestSockAddr.irdaAddressFamily = AF_IRDA;
// move in the device id for the selected device
memcpy(&(DestSockAddr.irdaDeviceID[0]), (char *)&pDeviceVar.lVal, 4);
//its okay to use strncpy because we've already 0'ed out the struct
strncpy(DestSockAddr.irdaServiceName, "OBEX", 4);
//connect to that device
if (SOCKET_ERROR != CIRDATransportSocket::reenum_connect(static_cast<IObexAbortTransportEnumeration*>(this),
sMySock,
&DestSockAddr,
sizeof(SOCKADDR_IRDA),
pDeviceName))
{
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE,(L"ObexIRDATransport::UpdateDeviceProp() -- found OBEX!\n"));
fHaveObex = TRUE;
}
int iSockCloseRet = closesocket(sMySock);
SVSUTIL_ASSERT(0 == iSockCloseRet);
// if we are told to abort, do so
IsAborting(&fAbort);
if(TRUE == fAbort) {
hRet = E_ABORT;
goto connect_done;
}
sMySock = socket(AF_IRDA, SOCK_STREAM, 0);
if(INVALID_SOCKET == sMySock)
{
hRet = E_FAIL;
goto connect_done;
}
//its okay to use strncpy because we've already 0'ed out the struct
strncpy(DestSockAddr.irdaServiceName, "OBEX:IrXfer", 11);
//connect to that device
if (SOCKET_ERROR != CIRDATransportSocket::reenum_connect(static_cast<IObexAbortTransportEnumeration*>(this),
sMySock,
&DestSockAddr,
sizeof(SOCKADDR_IRDA),
pDeviceName))
{
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE,(L"ObexIRDATransport::UpdateDeviceProp() -- found OBEX:IrXfer!\n"));
fHaveIrXFer = TRUE;
}
iSockCloseRet = closesocket(sMySock);
SVSUTIL_ASSERT(0 == iSockCloseRet);
// if we are told to abort, do so
IsAborting(&fAbort);
if(TRUE == fAbort) {
hRet = E_ABORT;
goto connect_done;
}
//put in a marker saying we have been here
VARIANT varMarker;
VariantInit(&varMarker);
varMarker.vt = VT_I4;
varMarker.lVal = 1;
hRet = pDevice->Write(L"BeenVisited", &varMarker);
SVSUTIL_ASSERT(SUCCEEDED(hRet));
//
// Now we have port information....
//
if(!fHaveObex && !fHaveIrXFer)
{
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE,(L"ObexIRDATransport::UpdateDeviceProp() -- dont have anything...erroring out -- no obex here\n"));
if(_ppNewBagEnum)
*_ppNewBagEnum = NULL;
hRet = E_FAIL;
}
else if(fHaveObex && fHaveIrXFer && _ppNewBagEnum)
{
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE,(L"ObexIRDATransport::UpdateDeviceProp() -- got both OBEX and OBEX:IrXfer\n"));
//
// Begin by creating a new device... (it will be OBEX)
//
CPropertyBagEnum *pNewBagEnum = new CPropertyBagEnum();
if(!pNewBagEnum) {
return E_OUTOFMEMORY;
}
*_ppNewBagEnum = pNewBagEnum; //<-- chain in the enumerator
CPropertyBag *pNewBag = new CPropertyBag();
if(!pNewBag) {
return E_OUTOFMEMORY;
}
HRESULT hr;
//copy the transport
BOOL fHaveTransport = FALSE;
VARIANT pTransportVar;
VariantInit(&pTransportVar);
if(SUCCEEDED(pDevice->Read(c_szDevicePropTransport, &pTransportVar, 0)))
{
pNewBag->Write(c_szDevicePropTransport, &pTransportVar);
SVSUTIL_ASSERT(0 == wcscmp(pTransportVar.bstrVal, L"{30A7BC02-59B6-40BB-AA2B-89EB49EF274E}"));
}
VariantClear(&pTransportVar);
//write known values
hr = pNewBag->Write(c_szDevicePropName, &pNameVar);
SVSUTIL_ASSERT(SUCCEEDED(hr));
hr = pNewBag->Write(c_szDevicePropAddress, &pDeviceVar);
SVSUTIL_ASSERT(SUCCEEDED(hr));
//put in a dont-revisit-me-again-marker
hr = pNewBag->Write(L"BeenVisited", &varMarker);
SVSUTIL_ASSERT(SUCCEEDED(hr));
//and finally add the port (OBEX)_
VARIANT pPortVar;
VariantInit(&pPortVar);
pPortVar.vt = VT_BSTR;
pPortVar.bstrVal = SysAllocString(L"OBEX");
hr = pNewBag->Write(c_szPort, &pPortVar);
SVSUTIL_ASSERT(SUCCEEDED(hr));
VariantClear(&pPortVar);
pNewBagEnum->Insert(pNewBag);
pNewBag->Release();
//
// Now just fix up our current device.. its assuming OBEX:IrXfer
//
pPortVar.vt = VT_BSTR;
pPortVar.bstrVal = SysAllocString(L"OBEX:IrXfer");
hr = pDevice->Write(c_szPort, &pPortVar);
SVSUTIL_ASSERT(SUCCEEDED(hr));
VariantClear(&pPortVar);
*uiUpdateStatus = 0xFFFFFFFF;
hRet = S_OK;
}
else
{
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE,(L"ObexIRDATransport::UpdateDeviceProp() -- just got one port\n"));
HRESULT hr;
//and finally add the port (OBEX)_
VARIANT pPortVar;
VariantInit(&pPortVar);
pPortVar.vt = VT_BSTR;
if(_ppNewBagEnum)
*_ppNewBagEnum = NULL;
if(fHaveObex)
pPortVar.bstrVal = SysAllocString(L"OBEX");
else
pPortVar.bstrVal = SysAllocString(L"OBEX:IrXfer");
hr = pDevice->Write(c_szPort, &pPortVar);
SVSUTIL_ASSERT(SUCCEEDED(hr));
VariantClear(&pPortVar);
*uiUpdateStatus = 0xFFFFFFFF;
hRet = S_OK;
}
VariantClear(&varMarker);
connect_done:
VariantClear(&pDeviceVar);
VariantClear(&pNameVar);
return hRet;
}
HRESULT STDMETHODCALLTYPE
CObexIRDATransport::Abort()
{
fIsAborting = TRUE;
return S_OK;
}
HRESULT STDMETHODCALLTYPE
CObexIRDATransport::Resume()
{
fIsAborting = FALSE;
return S_OK;
}
HRESULT STDMETHODCALLTYPE
CObexIRDATransport::IsAborting(BOOL *_fIsAborting)
{
*_fIsAborting = fIsAborting;
return S_OK;
}
HRESULT STDMETHODCALLTYPE
CObexIRDATransport::EnumProperties(LPPROPERTYBAG2 __RPC_FAR *ppProps)
{
return E_NOTIMPL;
}
ULONG STDMETHODCALLTYPE
CObexIRDATransport::AddRef()
{
DEBUGMSG(OBEX_ADDREFREL_ZONE,(L"CObexIRDATransport::AddRef()\n"));
return InterlockedIncrement((LONG *)&_refCount);
}
ULONG STDMETHODCALLTYPE
CObexIRDATransport::Release()
{
DEBUGMSG(OBEX_ADDREFREL_ZONE,(L"CObexIRDATransport::Release()\n"));
SVSUTIL_ASSERT(_refCount != 0xFFFFFFFF);
ULONG ret = InterlockedDecrement((LONG *)&_refCount);
if(!ret)
delete this;
return ret;
}
HRESULT STDMETHODCALLTYPE
CObexIRDATransport::QueryInterface(REFIID riid, void** ppv)
{
DEBUGMSG(OBEX_IRDATRANSPORT_ZONE,(L"CObexIRDATransport::QueryInterface()\n"));
if(!ppv)
return E_POINTER;
else if(riid == IID_IUnknown)
*ppv = this;
else if(riid == IID_IObexTransport)
*ppv = static_cast<IObexTransport*>(this);
else if(riid == IID_IObexAbortTransportEnumeration)
*ppv = static_cast<IObexAbortTransportEnumeration*>(this);
else
return *ppv = 0, E_NOINTERFACE;
return AddRef(), S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -