1 // Sink.h : Declaration of the CSink
2 
3 #ifndef __SINK_H_
4 #define __SINK_H_
5 
6 #include "resource.h"       // main symbols
7 #include "sinktbl.h"
8 
9 #define EVENT_HANDLER_TBL_SIZE (93)
10 
11 typedef struct _event_handler_entry_ { // entry in hash table
12   DISPID dispId;
13   void *handler;
14   _event_handler_entry_ *next;
15 } EVENT_HANDLER_ENTRY;
16 
17 /////////////////////////////////////////////////////////////////////////////
18 // CSink
19 class ATL_NO_VTABLE CSink :
20         public CComObjectRootEx<CComSingleThreadModel>,
21 	public CComCoClass<CSink, &CLSID_Sink>,
22 	public IDispatchImpl<ISink, &IID_ISink, &LIBID_MYSSINKLib>
23 {
24 
25 private:
26   MYSSINK_TABLE *myssink_table;
27 
28   void *variantToSchemeObject(VARIANTARG *);
29   void unmarshalSchemeObject(void *,VARIANTARG *);
30   void handlerUpdateError(char *);
31 
32   unsigned int getHashValue(DISPID);
33   EVENT_HANDLER_ENTRY *newEventHandlerEntry(DISPID,void *);
34   EVENT_HANDLER_ENTRY *lookupHandler(DISPID);
35 
36   EVENT_HANDLER_ENTRY eventHandlerTable[EVENT_HANDLER_TBL_SIZE];
37 
38 public:
39   CSink();
40   ~CSink();
41 
42 DECLARE_REGISTRY_RESOURCEID(IDR_SINK)
43 
44 DECLARE_PROTECT_FINAL_CONSTRUCT()
45 
46 BEGIN_COM_MAP(CSink)
47   COM_INTERFACE_ENTRY(ISink)
48   COM_INTERFACE_ENTRY(IDispatch)
49 END_COM_MAP()
50 
51 // ISink
52 public:
53  STDMETHOD(set_myssink_table)(void *);
54  STDMETHOD(register_handler)(DISPID,void *);
55  STDMETHOD(unregister_handler)(DISPID);
56 
57  //override ATL implementations
58 
59  STDMETHOD(Invoke)(DISPID,REFIID,LCID,WORD,
60 		   DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*);
61 
62  STDMETHOD(InternalQueryInterface)(void *, const _ATL_INTMAP_ENTRY* pEntries,REFIID,void **);
63 };
64 
65 #endif //__SINK_H_
66 
67