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

📄 obexirdatransport.cpp

📁 Windows CE 6.0 Server 源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    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 + -