Platform SDK: CDO for Windows 2000

NNTP EnvelopeFields Code Example

The following code example can be used only with event sinks. The IMessage.EnvelopeFields property returns an empty collection in all cases except for a Message object reference passed to a sink during a transport event. This example loops through the envelope fields and writes each name-value pair to a log file called Fields.log.

Example

[Visual Basic]
Implements INNTPOnPost

Sub INNTPOnPost_OnPost(ByVal iMsg as CDO.Message, EventStatus as CdoEventStatus)
  Dim Fld as ADODB.Field
  Dim strOutPut as String
  For Each Fld In iMsg.EnvelopeFields
     strOutPut = strOutPut & Fld .Name & ": " & Fld .Value & vbCrLf
  Next
  Dim FS as New Scripting.FileSystemObject
  Dim File as Scripting.TextStream
  Set File = FS.CreateTextFile("c:\envelopefieldlog\fields.log",True,False)
  File.Write strOutPut
End Sub
[C++,IDL]
#include <atlbase.h>
#include <atlimpl.cpp>
#import  <msado15.dll> no_namespace raw_interfaces_only
#import  <cdosys.dll>  no_namespace raw_interfaces_only
#import  <seo.dll>     no_namespace raw_interfaces_only

/////////////////////////////////////////////////////////////////////////////
// CSink1
class ATL_NO_VTABLE CSink1 : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSink1, &CLSID_Sink1>,
public IDispatchImpl<INNTPOnPost, &__uuidof(INNTPOnPost), &LIBID_TRANSSINKEXLib>
{
public:
CSink1()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_SINK1)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CSink1)
  COM_INTERFACE_ENTRY(INNTPOnPost)
  COM_INTERFACE_ENTRY(IEventIsCacheable)
  COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// ISink1
public:
STDMETHOD(IsCacheable)() { return S_OK;}
STDMETHOD(OnPost)(IMessage* pMsg, CdoEventStatus* pStat);

};

STDMETHODIMP MyClass::OnPost([in] IMessage *Msg, [in,out] CdoEventStatus *EventStatus)
{
    // This example for the most part ignores
   // error values.  This is not good practice
   // in general!

  HRESULT hr = S_OK;
  CComPtr<Field>  pField;
  CComPtr<Fields> pFields;
  Msg->get_EnvelopeFields(&pFields);
  CComBSTR    bstrName;
  CComVariant varValue;
  CComBSTR    bstrOut = "";
  long count = 0;
  pFields->get_Count(&count);

  for(long i = 0;i<count;i++) {   
    pFields->get_Item(CComVariant((long)i), &pField);
    if(SUCCEEDED(hr)){
      pField->get_Name(&bstrName);
      pField->get_Value(&varValue);

      bstrOut += bstrName;
      bstrOut += ":";
      bstrOut += varValue.bstrVal;
      bstrOut += "\r\n";

      bstrName.Empty();
      varValue.Clear();
      pField.Release();
    }
  }

    LPCWSTR szFilename = L"c:\\logs\\nntpevents.txt";
    HANDLE hFile;
    int nBufSize = 0;
    ULONG nSizeWritten = 0 ;
    BOOL fRC = FALSE;

    hFile = CreateFileW(szFilename,
                       GENERIC_WRITE,
                       FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
                       NULL,
                       OPEN_ALWAYS,
                       FILE_ATTRIBUTE_NORMAL,
                       NULL);
    if(hFile == INVALID_HANDLE_VALUE)
        return E_POINTER;

  SetFilePointer(hFile,0,NULL,FILE_END);
  nBufSize = lstrlenW(bstrOutPut);
    fRC = WriteFile(hFile,bstrOutPut,nBufSize * 2,&nSizeWritten,NULL);
    if(fRC == FALSE)
        return S_FALSE;
    CloseHandle(hFile);

  pFields.Release();
  Msg->Release();
  return hr;
}