Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennode.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
1.7.6.1
|