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

📄 advise_d.cpp

📁 OPCSERVER源代码
💻 CPP
字号:
/**************************************************************************
 *                                                                        *
 * Light OPC Server development library                                   *
 *                                                                        *
 *   Copyright (c) 2000 by Timofei Bondarenko                             *
                                                                          *
 IOPCGroup advise data connection
 **************************************************************************/

#include <opcerror.h>
#include "privopc.h"
#include LO_OLE_ERRORS_h /*CONNECT_E_ADVISELIMIT*/

#define loSearchIID(x)

/*** IConnectionPoint methods *********************************************/

STDMETHODIMP LightOPCGroup::GetConnectionInterface(IID *pIID)
{
 if (!pIID) return E_POINTER;
 *pIID = IID_IOPCDataCallback;
 UL_NOTICE((LOG_GRHO("Group::GetConnIface() ")));
 return S_OK;
}

STDMETHODIMP LightOPCGroup::Advise(IUnknown *pUnk, DWORD *pdwCookie)
{
 HRESULT hr = S_OK;

 LO_CHECK_STATEz1("icpAdvise", pdwCookie);
 if (!pUnk || !pdwCookie) { hr = E_INVALIDARG; goto Return; }

 loSearchIID(pUnk);

 hr = owner->async_advise(loRQ_CONN_DATABACK | loRQ_SYNC,
                          &IID_IOPCDataCallback, this, ServerHandle, pUnk);
 if (E_NOINTERFACE == hr) hr = CONNECT_E_CANNOTCONNECT;
 else if (!FAILED(hr)) *pdwCookie = loRQ_CONN_DATABACK;

Return:
 if (hr == S_OK)
   UL_NOTICE((LOGID, "Group::icpAdvise(IOPCDataCallback) Ok"));
 else
   UL_INFO((LOGID, "%!l Group::icpAdvise(IOPCDataCallback) FAILED", hr));

 LO_FINISH();
 return hr;
}

STDMETHODIMP LightOPCGroup::Unadvise(DWORD dwCookie)
{
 HRESULT hr = S_OK;

 LO_CHECK_STATEz0("icpUnAdvise");

 if (loRQ_CONN_DATABACK != dwCookie) hr = CONNECT_E_NOCONNECTION;
 else
   {
    hr = owner->async_unadvise(loRQ_CONN_DATABACK | loRQ_SYNC,
                               &IID_IOPCDataCallback, this, ServerHandle);
    if (hr == OLE_E_NOCONNECTION) hr = CONNECT_E_NOCONNECTION;
   }

 if (S_OK == hr) UL_NOTICE((LOG_GRH("icpUnAdvise(%x) %s"), dwCookie, loStrError(hr)));
 else UL_INFO((LOG_GRH("icpUnAdvise(%x) %s"), dwCookie, loStrError(hr)));

 LO_FINISH();
 return hr;
}

STDMETHODIMP LightOPCGroup::SetEnable(BOOL bEnable)
{
 HRESULT hr = S_OK;
 int oen;

 LO_CHECK_STATEz0("SetEnable");

 oen = bEnable? loRQ_CONN_DATA
              :(loRQ_CONN_DATA & ~loRQ_CONN_DATABACK);
 lock_write();
 if (!conn_databack) hr = CONNECT_E_NOCONNECTION;
 else if (oen != advise_enabled)
    {
     advise_enabled = oen;
     if (bEnable) actuate_async(1);
    }
 unlock();

 UL_NOTICE((LOG_GRH("SetEnable(%d) %s"), bEnable, loStrError(hr)));
 LO_FINISH();
 return S_OK;
}

STDMETHODIMP LightOPCGroup::GetEnable(BOOL *pbEnable)
{
 HRESULT hr = S_OK;
 if (pbEnable)
   {
    *pbEnable = advise_enabled & loRQ_CONN_DATABACK? TRUE: FALSE;
    if (!conn_databack) hr = CONNECT_E_NOCONNECTION;
   }
 else hr = E_INVALIDARG;
 UL_NOTICE((LOGID, "Group::GetEnable(%x) %s",
      advise_enabled & loRQ_CONN_DATABACK, loStrError(hr)));
 return hr;
}


/*** IDataObject methods ********************************************/

STDMETHODIMP LightOPCGroup::DAdvise(FORMATETC *pformatetc,
                                    DWORD advf,
                                    IAdviseSink *pAdvSink,
                                    DWORD *pdwConnection)
{
 HRESULT hr = S_OK;
 loService *se;
 int conn = 0;

 LO_CHECK_STATEz1("DAdvise", pdwConnection);

 if (!pdwConnection || !pAdvSink || !pformatetc) { hr = E_INVALIDARG; goto Return; }
 se = owner->se;

 if (pformatetc->cfFormat == se->cform_datatime)
    conn = loRQ_CONN_DATATIME;
 else if (pformatetc->cfFormat == se->cform_writecompl)
    conn = loRQ_CONN_WRITECOMPL;
 else if (pformatetc->cfFormat == se->cform_dataonly)
    conn = loRQ_CONN_DATAONLY;

 if (!conn ||
     /* pformatetc->dwAspect != DVASPECT_CONTENT ||
     pformatetc->ptd != NULL || pformatetc->lindex != -1 ||*/
     pformatetc->tymed != TYMED_HGLOBAL) { hr = DV_E_FORMATETC; goto Return; }

 loSearchIID(pAdvSink);

 hr = owner->async_advise(conn | loRQ_SYNC, &IID_IAdviseSink, this, ServerHandle, pAdvSink);
 if (CONNECT_E_CANNOTCONNECT == hr) hr = E_NOINTERFACE;
 else if (!FAILED(hr)) *pdwConnection = (DWORD)conn;

Return:

 if (S_OK == hr)
   UL_NOTICE((LOG_GRH("DAdvise(%x) Ok"), conn));
 else
   UL_INFO((LOG_GRH("Group:DAdvise(%x) FAILED %s"), conn, loStrError(hr)));

 LO_FINISH();
 return hr;
}


STDMETHODIMP LightOPCGroup::DUnadvise(DWORD dwConnection)
{
 HRESULT hr = S_OK;

 LO_CHECK_STATEz0("DUnadvise");

 switch(dwConnection)
   {
 case loRQ_CONN_DATAONLY:
 case loRQ_CONN_DATATIME:
 case loRQ_CONN_WRITECOMPL:
    break;
 default: hr = OLE_E_NOCONNECTION; goto Return;
   }

 hr = owner->async_unadvise(loRQ_SYNC | (int)dwConnection, &IID_IAdviseSink, this, ServerHandle);
 if (CONNECT_E_NOCONNECTION == hr) hr = OLE_E_NOCONNECTION;

Return:
 if (S_OK == hr)
    UL_NOTICE((LOG_GRH("DUnadvise(%x) Ok"), dwConnection));
 else
    UL_INFO((LOG_GRH("DUnadvise(%x) FAILED %s"), dwConnection, loStrError(hr)));

 LO_FINISH();
 return hr;
}

STDMETHODIMP LightOPCGroup::EnumFormatEtc(DWORD, IEnumFORMATETC **){ return E_NOTIMPL; }

STDMETHODIMP LightOPCGroup::EnumDAdvise(IEnumSTATDATA **) { return E_NOTIMPL; }

STDMETHODIMP LightOPCGroup::GetCanonicalFormatEtc(FORMATETC *, FORMATETC *)
{ return E_NOTIMPL; }

STDMETHODIMP LightOPCGroup::QueryGetData(FORMATETC *)             { return E_NOTIMPL; }

STDMETHODIMP LightOPCGroup::SetData(FORMATETC *, STGMEDIUM *, BOOL){ return E_NOTIMPL; }

STDMETHODIMP LightOPCGroup::GetData(FORMATETC *, STGMEDIUM *)     { return E_NOTIMPL; }

STDMETHODIMP LightOPCGroup::GetDataHere(FORMATETC *, STGMEDIUM *) { return E_NOTIMPL; }

/* end of advise_d.cpp */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -