Skip to content

Commit a7a644e

Browse files
author
David Hall
committed
Removed use of COM IEnumerable interface and converted to indexed model (based on @droyad PR). Should enable .NET Standard build.
1 parent ae2e365 commit a7a644e

7 files changed

+53
-46
lines changed

TaskService/ActionCollection.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ public int FindIndexOf(int startIndex, int count, [NotNull] Predicate<Action> ma
456456
public IEnumerator<Action> GetEnumerator()
457457
{
458458
if (v2Coll != null)
459-
return new ComEnumerator<Action, V2Interop.IActionCollection>(v2Coll, o => Action.CreateAction(o as V2Interop.IAction));
459+
return new ComEnumerator<Action, V2Interop.IAction>(() => v2Coll.Count, i => v2Coll[i], Action.CreateAction);
460460
return v1Actions.GetEnumerator();
461461
}
462462

TaskService/NamedValueCollection.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ public ICollection<string> Names
246246
return unboundDict.ConvertAll(p => p.Name);
247247

248248
var ret = new List<string>(v2Coll.Count);
249-
foreach (ITaskNamedValuePair item in v2Coll)
249+
foreach (var item in this)
250250
ret.Add(item.Name);
251251
return ret;
252252
}
@@ -267,7 +267,7 @@ public ICollection<string> Values
267267
return unboundDict.ConvertAll(p => p.Value);
268268

269269
var ret = new List<string>(v2Coll.Count);
270-
foreach (ITaskNamedValuePair item in v2Coll)
270+
foreach (var item in this)
271271
ret.Add(item.Value);
272272
return ret;
273273
}
@@ -407,7 +407,7 @@ public IEnumerator<NameValuePair> GetEnumerator()
407407
if (v2Coll == null)
408408
return unboundDict.GetEnumerator();
409409

410-
return new ComEnumerator<NameValuePair, ITaskNamedValueCollection>(v2Coll, o => new NameValuePair((ITaskNamedValuePair)o));
410+
return new ComEnumerator<NameValuePair, ITaskNamedValuePair>(() => v2Coll.Count, i => v2Coll[i], o => new NameValuePair(o));
411411
}
412412

413413
private void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
@@ -497,7 +497,7 @@ public bool TryGetValue(string name, out string value)
497497
{
498498
if (v2Coll != null)
499499
{
500-
foreach (ITaskNamedValuePair item in v2Coll)
500+
foreach (var item in this)
501501
{
502502
if (string.CompareOrdinal(item.Name, name) == 0)
503503
{
@@ -525,8 +525,8 @@ bool ICollection<NameValuePair>.Contains(NameValuePair item)
525525
if (v2Coll == null)
526526
return unboundDict.Contains(item);
527527

528-
foreach (ITaskNamedValuePair invp in v2Coll)
529-
if (item.Equals(invp)) return true;
528+
foreach (var invp in this)
529+
if (Equals(item, invp)) return true;
530530
return false;
531531
}
532532

TaskService/Native/InteropUtil.cs

+25-17
Original file line numberDiff line numberDiff line change
@@ -94,31 +94,39 @@ public static T[] ToArray<T>(IntPtr ptr, int count)
9494
}
9595
}
9696

97-
internal class ComEnumerator<T, TE> : IEnumerator<T> where TE : IEnumerable where T : class
97+
internal class ComEnumerator<T, TIn> : IEnumerator<T> where T : class where TIn : class
9898
{
99-
protected IEnumerator iEnum;
100-
private readonly Converter<object, T> conv;
99+
protected readonly Func<TIn, T> converter;
100+
protected IEnumerator<TIn> iEnum;
101101

102-
public ComEnumerator(TE collection, Converter<object, T> converter = null)
102+
public ComEnumerator(Func<int> getCount, Func<int, TIn> indexer, Func<TIn, T> converter)
103103
{
104-
iEnum = collection?.GetEnumerator();
105-
conv = converter == null || collection == null ? DefaultConverter : converter;
106-
}
107-
108-
object IEnumerator.Current => Current;
104+
IEnumerator<TIn> Enumerate()
105+
{
106+
for (var x = 1; x <= getCount(); x++)
107+
yield return indexer(x);
108+
}
109109

110-
public virtual T Current => conv(iEnum?.Current);
110+
this.converter = converter;
111+
iEnum = Enumerate();
112+
}
111113

112-
private static T DefaultConverter(object o)
114+
public ComEnumerator(Func<int> getCount, Func<object, TIn> indexer, Func<TIn, T> converter)
113115
{
114-
if (o == null)
115-
return default(T);
116-
var converter = o as T;
117-
if (converter != null)
118-
return converter;
119-
return (T)Activator.CreateInstance(typeof(T), Reflection.BindingFlags.CreateInstance | Reflection.BindingFlags.NonPublic | Reflection.BindingFlags.Public, null, new[] { o }, null);
116+
IEnumerator<TIn> Enumerate()
117+
{
118+
for (var x = 1; x <= getCount(); x++)
119+
yield return indexer(x);
120+
}
121+
122+
this.converter = converter;
123+
iEnum = Enumerate();
120124
}
121125

126+
object IEnumerator.Current => Current;
127+
128+
public virtual T Current => converter(iEnum?.Current);
129+
122130
public virtual void Dispose()
123131
{
124132
iEnum = null;

TaskService/TaskCollection.cs

+5-6
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,12 @@ internal int Count
161161
}
162162
}
163163

164-
private class V2TaskEnumerator : ComEnumerator<Task, V2Interop.IRegisteredTaskCollection>
164+
private class V2TaskEnumerator : ComEnumerator<Task, V2Interop.IRegisteredTask>
165165
{
166166
private readonly Regex filter;
167167

168168
internal V2TaskEnumerator(TaskFolder folder, V2Interop.IRegisteredTaskCollection iTaskColl, Regex filter = null) :
169-
base(iTaskColl, o => Task.CreateTask(folder.TaskService, (V2Interop.IRegisteredTask)o))
169+
base(() => iTaskColl.Count, (object o) => iTaskColl[o], o => Task.CreateTask(folder.TaskService, o))
170170
{
171171
this.filter = filter;
172172
}
@@ -329,12 +329,11 @@ public void Dispose()
329329
public IEnumerator<RunningTask> GetEnumerator()
330330
{
331331
if (v2Coll != null)
332-
return new ComEnumerator<RunningTask, V2Interop.IRunningTaskCollection>(v2Coll, o =>
332+
return new ComEnumerator<RunningTask, V2Interop.IRunningTask>(() => v2Coll.Count, (object o) => v2Coll[o], o =>
333333
{
334-
var irt = (V2Interop.IRunningTask)o;
335334
V2Interop.IRegisteredTask task = null;
336-
try { task = TaskService.GetTask(svc.v2TaskService, irt.Path); } catch { }
337-
return task == null ? null : new RunningTask(svc, task, irt);
335+
try { task = TaskService.GetTask(svc.v2TaskService, o.Path); } catch { }
336+
return task == null ? null : new RunningTask(svc, task, o);
338337
});
339338
return new V1RunningTaskEnumerator(svc);
340339
}

TaskService/TaskFolderCollection.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ public void CopyTo(TaskFolder[] array, int arrayIndex)
122122
{
123123
if (arrayIndex + Count > array.Length)
124124
throw new ArgumentException();
125-
foreach (V2Interop.ITaskFolder f in v2FolderList)
126-
array[arrayIndex++] = new TaskFolder(parent.TaskService, f);
125+
foreach (var f in this)
126+
array[arrayIndex++] = f;
127127
}
128128
else
129129
{
@@ -170,7 +170,7 @@ public bool Exists([NotNull] string path)
170170
public IEnumerator<TaskFolder> GetEnumerator()
171171
{
172172
if (v2FolderList != null)
173-
return new System.Runtime.InteropServices.ComEnumerator<TaskFolder, V2Interop.ITaskFolderCollection>(v2FolderList, o => new TaskFolder(parent.TaskService, (V2Interop.ITaskFolder)o));
173+
return new System.Runtime.InteropServices.ComEnumerator<TaskFolder, V2Interop.ITaskFolder>(() => v2FolderList.Count, (object o) => v2FolderList[o], o => new TaskFolder(parent.TaskService, o));
174174
return Array.AsReadOnly(v1FolderList).GetEnumerator();
175175
}
176176

TaskService/TriggerCollection.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ public IEnumerator<Trigger> GetEnumerator()
303303
{
304304
if (v1Task != null)
305305
return new V1TriggerEnumerator(v1Task);
306-
return new ComEnumerator<Trigger, V2Interop.ITriggerCollection>(v2Coll, o => Trigger.CreateTrigger((V2Interop.ITrigger)o, v2Def));
306+
return new ComEnumerator<Trigger, V2Interop.ITrigger>(() => v2Coll.Count, i => v2Coll[i], o => Trigger.CreateTrigger(o, v2Def));
307307
}
308308

309309
void ICollection.CopyTo(Array array, int index)

TaskService/V2/TaskSchedulerV2Interop.cs

+12-12
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ internal interface IAction
2020
}
2121

2222
[ComImport, Guid("02820E19-7B98-4ED2-B2E8-FDCCCEFF619B"), InterfaceType(ComInterfaceType.InterfaceIsDual), System.Security.SuppressUnmanagedCodeSecurity]
23-
internal interface IActionCollection : IEnumerable
23+
internal interface IActionCollection
2424
{
2525
int Count { get; }
2626
IAction this[int index] { [return: MarshalAs(UnmanagedType.Interface)] get; }
2727
[return: MarshalAs(UnmanagedType.Interface)]
28-
new IEnumerator GetEnumerator();
28+
IEnumerator GetEnumerator();
2929
string XmlText { [return: MarshalAs(UnmanagedType.BStr)] get; [param: In, MarshalAs(UnmanagedType.BStr)] set; }
3030
[return: MarshalAs(UnmanagedType.Interface)]
3131
IAction Create([In] TaskActionType Type);
@@ -243,12 +243,12 @@ internal interface IRegisteredTask
243243
}
244244

245245
[ComImport, Guid("86627EB4-42A7-41E4-A4D9-AC33A72F2D52"), InterfaceType(ComInterfaceType.InterfaceIsDual), System.Security.SuppressUnmanagedCodeSecurity]
246-
internal interface IRegisteredTaskCollection : IEnumerable
246+
internal interface IRegisteredTaskCollection
247247
{
248248
int Count { get; }
249249
IRegisteredTask this[object index] { [return: MarshalAs(UnmanagedType.Interface)] get; }
250250
[return: MarshalAs(UnmanagedType.Interface)]
251-
new IEnumerator GetEnumerator();
251+
IEnumerator GetEnumerator();
252252
}
253253

254254
[ComImport, Guid("416D8B73-CB41-4EA1-805C-9BE9A5AC4A74"), InterfaceType(ComInterfaceType.InterfaceIsDual), System.Security.SuppressUnmanagedCodeSecurity]
@@ -301,12 +301,12 @@ internal interface IRunningTask
301301
}
302302

303303
[ComImport, Guid("6A67614B-6828-4FEC-AA54-6D52E8F1F2DB"), InterfaceType(ComInterfaceType.InterfaceIsDual), System.Security.SuppressUnmanagedCodeSecurity]
304-
internal interface IRunningTaskCollection : IEnumerable
304+
internal interface IRunningTaskCollection
305305
{
306306
int Count { get; }
307307
IRunningTask this[object index] { [return: MarshalAs(UnmanagedType.Interface)] get; }
308308
[return: MarshalAs(UnmanagedType.Interface)]
309-
new IEnumerator GetEnumerator();
309+
IEnumerator GetEnumerator();
310310
}
311311

312312
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("754DA71B-4385-4475-9DD9-598294FA3641"), System.Security.SuppressUnmanagedCodeSecurity]
@@ -374,21 +374,21 @@ internal interface ITaskFolder
374374
}
375375

376376
[ComImport, Guid("79184A66-8664-423F-97F1-637356A5D812"), InterfaceType(ComInterfaceType.InterfaceIsDual), System.Security.SuppressUnmanagedCodeSecurity]
377-
internal interface ITaskFolderCollection : IEnumerable
377+
internal interface ITaskFolderCollection
378378
{
379379
int Count { get; }
380380
ITaskFolder this[object index] { [return: MarshalAs(UnmanagedType.Interface)] get; }
381381
[return: MarshalAs(UnmanagedType.Interface)]
382-
new IEnumerator GetEnumerator();
382+
IEnumerator GetEnumerator();
383383
}
384384

385385
[ComImport, Guid("B4EF826B-63C3-46E4-A504-EF69E4F7EA4D"), InterfaceType(ComInterfaceType.InterfaceIsDual), System.Security.SuppressUnmanagedCodeSecurity]
386-
internal interface ITaskNamedValueCollection : IEnumerable
386+
internal interface ITaskNamedValueCollection
387387
{
388388
int Count { get; }
389389
ITaskNamedValuePair this[int index] { [return: MarshalAs(UnmanagedType.Interface)] get; }
390390
[return: MarshalAs(UnmanagedType.Interface)]
391-
new IEnumerator GetEnumerator();
391+
IEnumerator GetEnumerator();
392392
[return: MarshalAs(UnmanagedType.Interface)]
393393
ITaskNamedValuePair Create([In, MarshalAs(UnmanagedType.BStr)][NotNull] string Name, [In, MarshalAs(UnmanagedType.BStr)] string Value);
394394
void Remove([In] int index);
@@ -545,12 +545,12 @@ internal interface ITrigger
545545
}
546546

547547
[ComImport, Guid("85DF5081-1B24-4F32-878A-D9D14DF4CB77"), InterfaceType(ComInterfaceType.InterfaceIsDual), System.Security.SuppressUnmanagedCodeSecurity]
548-
internal interface ITriggerCollection : IEnumerable
548+
internal interface ITriggerCollection
549549
{
550550
int Count { get; }
551551
ITrigger this[int index] { [return: MarshalAs(UnmanagedType.Interface)] get; }
552552
[return: MarshalAs(UnmanagedType.Interface)]
553-
new IEnumerator GetEnumerator();
553+
IEnumerator GetEnumerator();
554554
[return: MarshalAs(UnmanagedType.Interface)]
555555
ITrigger Create([In] TaskTriggerType Type);
556556
void Remove([In, MarshalAs(UnmanagedType.Struct)] object index);

0 commit comments

Comments
 (0)