Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
ComEventsSink.cs
Go to the documentation of this file.
3
5
6[SupportedOSPlatform("windows")]
8{
10
12
13 private int _cookie;
14
16
18
19 public ComEventsSink(object rcw, Guid iid)
20 {
21 _iidSourceItf = iid;
22 Advise(rcw);
23 }
24
25 public static ComEventsSink Find(ComEventsSink sinks, ref Guid iid)
26 {
27 ComEventsSink comEventsSink = sinks;
28 while (comEventsSink != null && comEventsSink._iidSourceItf != iid)
29 {
30 comEventsSink = comEventsSink._next;
31 }
32 return comEventsSink;
33 }
34
35 public static ComEventsSink Add(ComEventsSink sinks, ComEventsSink sink)
36 {
37 sink._next = sinks;
38 return sink;
39 }
40
42 {
43 while (sinks != null)
44 {
45 sinks.Unadvise();
46 sinks = sinks._next;
47 }
48 return null;
49 }
50
52 {
53 ComEventsSink result = sinks;
54 if (sink == sinks)
55 {
56 result = sinks._next;
57 }
58 else
59 {
60 ComEventsSink comEventsSink = sinks;
61 while (comEventsSink != null && comEventsSink._next != sink)
62 {
63 comEventsSink = comEventsSink._next;
64 }
65 if (comEventsSink != null)
66 {
67 comEventsSink._next = sink._next;
68 }
69 }
70 sink.Unadvise();
71 return result;
72 }
73
75 {
77 return _methods;
78 }
79
80 public ComEventsMethod FindMethod(int dispid)
81 {
82 return ComEventsMethod.Find(_methods, dispid);
83 }
84
85 public ComEventsMethod AddMethod(int dispid)
86 {
87 ComEventsMethod comEventsMethod = new ComEventsMethod(dispid);
88 _methods = ComEventsMethod.Add(_methods, comEventsMethod);
89 return comEventsMethod;
90 }
91
93 {
94 return 0;
95 }
96
97 ITypeInfo IDispatch.GetTypeInfo(int iTInfo, int lcid)
98 {
99 throw new NotImplementedException();
100 }
101
102 void IDispatch.GetIDsOfNames(ref Guid iid, string[] names, int cNames, int lcid, int[] rgDispId)
103 {
104 throw new NotImplementedException();
105 }
106
107 private unsafe static ref Variant GetVariant(ref Variant pSrc)
108 {
109 if (pSrc.VariantType == (VarEnum)16396)
110 {
111 Span<Variant> span = new Span<Variant>(pSrc.AsByRefVariant.ToPointer(), 1);
112 if ((span[0].VariantType & (VarEnum)20479) == (VarEnum)16396)
113 {
114 return ref span[0];
115 }
116 }
117 return ref pSrc;
118 }
119
120 unsafe void IDispatch.Invoke(int dispid, ref Guid riid, int lcid, InvokeFlags wFlags, ref DISPPARAMS pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
121 {
122 ComEventsMethod comEventsMethod = FindMethod(dispid);
123 if (comEventsMethod == null)
124 {
125 return;
126 }
127 object[] array = new object[pDispParams.cArgs];
128 int[] array2 = new int[pDispParams.cArgs];
129 bool[] array3 = new bool[pDispParams.cArgs];
130 int length = pDispParams.cNamedArgs + pDispParams.cArgs;
131 Span<Variant> span = new Span<Variant>(pDispParams.rgvarg.ToPointer(), length);
132 Span<int> span2 = new Span<int>(pDispParams.rgdispidNamedArgs.ToPointer(), length);
133 int num;
134 int i;
135 for (i = 0; i < pDispParams.cNamedArgs; i++)
136 {
137 num = span2[i];
138 ref Variant variant = ref GetVariant(ref span[i]);
139 array[num] = variant.ToObject();
140 array3[num] = true;
141 int num2 = -1;
142 if (variant.IsByRef)
143 {
144 num2 = i;
145 }
146 array2[num] = num2;
147 }
148 num = 0;
149 for (; i < pDispParams.cArgs; i++)
150 {
151 for (; array3[num]; num++)
152 {
153 }
154 ref Variant variant2 = ref GetVariant(ref span[pDispParams.cArgs - 1 - i]);
155 array[num] = variant2.ToObject();
156 int num3 = -1;
157 if (variant2.IsByRef)
158 {
159 num3 = pDispParams.cArgs - 1 - i;
160 }
161 array2[num] = num3;
162 num++;
163 }
164 object obj = comEventsMethod.Invoke(array);
165 if (pVarResult != IntPtr.Zero)
166 {
168 }
169 for (i = 0; i < pDispParams.cArgs; i++)
170 {
171 int num4 = array2[i];
172 if (num4 != -1)
173 {
174 GetVariant(ref span[num4]).CopyFromIndirect(array[i]);
175 }
176 }
177 }
178
180 {
181 ppv = IntPtr.Zero;
182 if (iid == _iidSourceItf || iid == typeof(IDispatch).GUID)
183 {
185 return CustomQueryInterfaceResult.Handled;
186 }
187 return CustomQueryInterfaceResult.NotHandled;
188 }
189
190 private void Advise(object rcw)
191 {
192 IConnectionPointContainer connectionPointContainer = (IConnectionPointContainer)rcw;
193 connectionPointContainer.FindConnectionPoint(ref _iidSourceItf, out IConnectionPoint ppCP);
194 ppCP.Advise(this, out _cookie);
195 _connectionPoint = ppCP;
196 }
197
198 private void Unadvise()
199 {
200 if (_connectionPoint == null)
201 {
202 return;
203 }
204 try
205 {
208 }
209 catch
210 {
211 }
212 finally
213 {
214 _connectionPoint = null;
215 }
216 }
217}
static ComEventsMethod Add(ComEventsMethod methods, ComEventsMethod method)
static ComEventsMethod Remove(ComEventsMethod methods, ComEventsMethod method)
static ComEventsMethod Find(ComEventsMethod methods, int dispid)
static ComEventsSink Add(ComEventsSink sinks, ComEventsSink sink)
ComEventsMethod RemoveMethod(ComEventsMethod method)
static unsafe ref Variant GetVariant(ref Variant pSrc)
static ComEventsSink Find(ComEventsSink sinks, ref Guid iid)
static ComEventsSink RemoveAll(ComEventsSink sinks)
static ComEventsSink Remove(ComEventsSink sinks, ComEventsSink sink)
static void GetNativeVariantForObject(object? obj, IntPtr pDstNativeVariant)
Definition Marshal.cs:510
static int ReleaseComObject(object o)
Definition Marshal.cs:363
static IntPtr GetComInterfaceForObject(object o, Type T)
Definition Marshal.cs:257
void FindConnectionPoint([In] ref Guid riid, out IConnectionPoint? ppCP)
CustomQueryInterfaceResult GetInterface([In] ref Guid iid, out IntPtr ppv)
ITypeInfo GetTypeInfo(int iTInfo, int lcid)
void Invoke(int dispIdMember, ref Guid riid, int lcid, InvokeFlags wFlags, ref DISPPARAMS pDispParams, IntPtr pVarResult, IntPtr pExcepInfo, IntPtr puArgErr)
void GetIDsOfNames(ref Guid riid, [In][MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPWStr, SizeParamIndex=2)] string[] rgszNames, int cNames, int lcid, [Out] int[] rgDispId)
static readonly IntPtr Zero
Definition IntPtr.cs:18