ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

node.cpp
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS WDM Streaming ActiveMovie Proxy
00004  * FILE:            dll/directx/ksproxy/node.cpp
00005  * PURPOSE:         Control Node
00006  *
00007  * PROGRAMMERS:     Johannes Anderwald (janderwald@reactos.org)
00008  */
00009 #include "precomp.h"
00010 
00011 class CKsNode : public IKsControl
00012 {
00013 public:
00014     STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface);
00015 
00016     STDMETHODIMP_(ULONG) AddRef()
00017     {
00018         InterlockedIncrement(&m_Ref);
00019         return m_Ref;
00020     }
00021     STDMETHODIMP_(ULONG) Release()
00022     {
00023         InterlockedDecrement(&m_Ref);
00024 
00025         if (!m_Ref)
00026         {
00027             delete this;
00028             return 0;
00029         }
00030         return m_Ref;
00031     }
00032 
00033     //IKsControl
00034     HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned);
00035     HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned);
00036     HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned);
00037 
00038     CKsNode(IUnknown * pUnkOuter, HANDLE Handle) : m_Ref(0), m_pUnkOuter(pUnkOuter), m_Handle(Handle){};
00039     virtual ~CKsNode()
00040     {
00041         CloseHandle(m_Handle);
00042     };
00043 
00044 protected:
00045     LONG m_Ref;
00046     IUnknown * m_pUnkOuter;
00047     HANDLE m_Handle;
00048 };
00049 
00050 HRESULT
00051 STDMETHODCALLTYPE
00052 CKsNode::QueryInterface(
00053     IN  REFIID refiid,
00054     OUT PVOID* Output)
00055 {
00056     if (IsEqualGUID(refiid, IID_IUnknown) ||
00057         IsEqualGUID(refiid, IID_IKsControl))
00058     {
00059         *Output = PVOID(this);
00060         reinterpret_cast<IUnknown*>(*Output)->AddRef();
00061         return NOERROR;
00062     }
00063 
00064     return E_NOINTERFACE;
00065 }
00066 
00067 //-------------------------------------------------------------------
00068 // IKsControl
00069 //
00070 HRESULT
00071 STDMETHODCALLTYPE
00072 CKsNode::KsProperty(
00073     PKSPROPERTY Property,
00074     ULONG PropertyLength,
00075     LPVOID PropertyData,
00076     ULONG DataLength,
00077     ULONG* BytesReturned)
00078 {
00079     assert(m_Handle != 0);
00080     return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned);
00081 }
00082 
00083 HRESULT
00084 STDMETHODCALLTYPE
00085 CKsNode::KsMethod(
00086     PKSMETHOD Method,
00087     ULONG MethodLength,
00088     LPVOID MethodData,
00089     ULONG DataLength,
00090     ULONG* BytesReturned)
00091 {
00092     assert(m_Handle != 0);
00093     return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned);
00094 }
00095 
00096 HRESULT
00097 STDMETHODCALLTYPE
00098 CKsNode::KsEvent(
00099     PKSEVENT Event,
00100     ULONG EventLength,
00101     LPVOID EventData,
00102     ULONG DataLength,
00103     ULONG* BytesReturned)
00104 {
00105     assert(m_Handle != 0);
00106 
00107     if (EventLength)
00108         return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned);
00109     else
00110         return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned);
00111 }
00112 
00113 HRESULT
00114 WINAPI
00115 CKsNode_Constructor(
00116     IUnknown * pUnkOuter,
00117     HANDLE ParentHandle,
00118     ULONG NodeId,
00119     ACCESS_MASK DesiredAccess,
00120     REFIID riid,
00121     LPVOID * ppv)
00122 {
00123     HRESULT hr;
00124     HANDLE handle;
00125     KSNODE_CREATE NodeCreate;
00126 
00127 #ifdef KSPROXY_TRACE
00128     OutputDebugStringW(L"CKsNode_Constructor\n");
00129 #endif
00130 
00131     //setup request
00132     NodeCreate.CreateFlags = 0;
00133     NodeCreate.Node = NodeId;
00134 
00135     hr = KsCreateTopologyNode(ParentHandle, &NodeCreate, DesiredAccess, &handle);
00136     if (hr != NOERROR)
00137     {
00138          OutputDebugString("CKsNode_Constructor failed to open device\n");
00139          return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, hr);
00140     }
00141 
00142     CKsNode * quality = new CKsNode(pUnkOuter, handle);
00143 
00144     if (!quality)
00145     {
00146         // free clock handle
00147         CloseHandle(handle);
00148         return E_OUTOFMEMORY;
00149     }
00150 
00151     if (FAILED(quality->QueryInterface(riid, ppv)))
00152     {
00153         /* not supported */
00154         delete quality;
00155         return E_NOINTERFACE;
00156     }
00157 
00158     return NOERROR;
00159 }

Generated on Sat May 26 2012 04:20:23 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.