/src/AddIns/Misc/PackageManagement/Project/Src/ThreadSafePackageManagementEvents.cs

https://github.com/ajadex/SharpDevelop · C# · 244 lines · 188 code · 39 blank · 17 comment · 22 complexity · 52708c11e4fff93a9bceba5c1a31a88a MD5 · raw file

  1. // Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team
  2. //
  3. // Permission is hereby granted, free of charge, to any person obtaining a copy of this
  4. // software and associated documentation files (the "Software"), to deal in the Software
  5. // without restriction, including without limitation the rights to use, copy, modify, merge,
  6. // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
  7. // to whom the Software is furnished to do so, subject to the following conditions:
  8. //
  9. // The above copyright notice and this permission notice shall be included in all copies or
  10. // substantial portions of the Software.
  11. //
  12. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  13. // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  14. // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
  15. // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  16. // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  17. // DEALINGS IN THE SOFTWARE.
  18. using System;
  19. using System.Collections.Generic;
  20. using NuGet;
  21. namespace ICSharpCode.PackageManagement
  22. {
  23. public class ThreadSafePackageManagementEvents : IThreadSafePackageManagementEvents
  24. {
  25. IPackageManagementEvents unsafeEvents;
  26. IPackageManagementWorkbench workbench;
  27. public ThreadSafePackageManagementEvents(IPackageManagementEvents unsafeEvents)
  28. : this(unsafeEvents, new PackageManagementWorkbench())
  29. {
  30. }
  31. public ThreadSafePackageManagementEvents(
  32. IPackageManagementEvents unsafeEvents,
  33. IPackageManagementWorkbench workbench)
  34. {
  35. this.unsafeEvents = unsafeEvents;
  36. this.workbench = workbench;
  37. RegisterEventHandlers();
  38. }
  39. void RegisterEventHandlers()
  40. {
  41. unsafeEvents.PackageOperationsStarting += RaisePackageOperationStartingEventIfHasSubscribers;
  42. unsafeEvents.PackageOperationError += RaisePackageOperationErrorEventIfHasSubscribers;
  43. unsafeEvents.ParentPackageInstalled += RaiseParentPackageInstalledEventIfHasSubscribers;
  44. unsafeEvents.ParentPackageUninstalled += RaiseParentPackageUninstalledEventIfHasSubscribers;
  45. unsafeEvents.ParentPackagesUpdated += RaiseParentPackagesUpdatedEventIfHasSubscribers;
  46. }
  47. public void Dispose()
  48. {
  49. UnregisterEventHandlers();
  50. }
  51. void UnregisterEventHandlers()
  52. {
  53. unsafeEvents.PackageOperationsStarting -= RaisePackageOperationStartingEventIfHasSubscribers;
  54. unsafeEvents.PackageOperationError -= RaisePackageOperationErrorEventIfHasSubscribers;
  55. unsafeEvents.ParentPackageInstalled -= RaiseParentPackageInstalledEventIfHasSubscribers;
  56. unsafeEvents.ParentPackageUninstalled -= RaiseParentPackageUninstalledEventIfHasSubscribers;
  57. unsafeEvents.ParentPackagesUpdated -= RaiseParentPackagesUpdatedEventIfHasSubscribers;
  58. }
  59. void RaisePackageOperationStartingEventIfHasSubscribers(object sender, EventArgs e)
  60. {
  61. if (PackageOperationsStarting != null) {
  62. RaisePackageOperationStartingEvent(sender, e);
  63. }
  64. }
  65. void RaisePackageOperationStartingEvent(object sender, EventArgs e)
  66. {
  67. if (InvokeRequired) {
  68. Action<object, EventArgs> action = RaisePackageOperationStartingEvent;
  69. SafeThreadAsyncCall(action, sender, e);
  70. } else {
  71. PackageOperationsStarting(sender, e);
  72. }
  73. }
  74. bool InvokeRequired {
  75. get { return workbench.InvokeRequired; }
  76. }
  77. void SafeThreadAsyncCall<A, B>(Action<A, B> method, A arg1, B arg2)
  78. {
  79. workbench.SafeThreadAsyncCall<A, B>(method, arg1, arg2);
  80. }
  81. R SafeThreadFunction<R>(Func<R> method)
  82. {
  83. return workbench.SafeThreadFunction<R>(method);
  84. }
  85. public event EventHandler PackageOperationsStarting;
  86. void RaisePackageOperationErrorEventIfHasSubscribers(object sender, PackageOperationExceptionEventArgs e)
  87. {
  88. if (PackageOperationError != null) {
  89. RaisePackageOperationErrorEvent(sender, e);
  90. }
  91. }
  92. void RaisePackageOperationErrorEvent(object sender, PackageOperationExceptionEventArgs e)
  93. {
  94. if (PackageOperationError != null) {
  95. if (InvokeRequired) {
  96. Action<object, PackageOperationExceptionEventArgs> action = RaisePackageOperationErrorEvent;
  97. SafeThreadAsyncCall(action, sender, e);
  98. } else {
  99. PackageOperationError(sender, e);
  100. }
  101. }
  102. }
  103. public event EventHandler<PackageOperationExceptionEventArgs> PackageOperationError;
  104. void RaiseParentPackageInstalledEventIfHasSubscribers(object sender, ParentPackageOperationEventArgs e)
  105. {
  106. if (ParentPackageInstalled != null) {
  107. RaiseParentPackageInstalledEvent(sender, e);
  108. }
  109. }
  110. void RaiseParentPackageInstalledEvent(object sender, ParentPackageOperationEventArgs e)
  111. {
  112. if (InvokeRequired) {
  113. Action<object, ParentPackageOperationEventArgs> action = RaiseParentPackageInstalledEvent;
  114. SafeThreadAsyncCall(action, sender, e);
  115. } else {
  116. ParentPackageInstalled(sender, e);
  117. }
  118. }
  119. public event EventHandler<ParentPackageOperationEventArgs> ParentPackageInstalled;
  120. void RaiseParentPackageUninstalledEventIfHasSubscribers(object sender, ParentPackageOperationEventArgs e)
  121. {
  122. if (ParentPackageUninstalled != null) {
  123. RaiseParentPackageUninstalledEvent(sender, e);
  124. }
  125. }
  126. void RaiseParentPackageUninstalledEvent(object sender, ParentPackageOperationEventArgs e)
  127. {
  128. if (InvokeRequired) {
  129. Action<object, ParentPackageOperationEventArgs> action = RaiseParentPackageUninstalledEvent;
  130. SafeThreadAsyncCall(action, sender, e);
  131. } else {
  132. ParentPackageUninstalled(sender, e);
  133. }
  134. }
  135. public event EventHandler<ParentPackageOperationEventArgs> ParentPackageUninstalled;
  136. public event EventHandler<AcceptLicensesEventArgs> AcceptLicenses {
  137. add { unsafeEvents.AcceptLicenses += value; }
  138. remove { unsafeEvents.AcceptLicenses -= value; }
  139. }
  140. public event EventHandler<PackageOperationMessageLoggedEventArgs> PackageOperationMessageLogged {
  141. add { unsafeEvents.PackageOperationMessageLogged += value; }
  142. remove { unsafeEvents.PackageOperationMessageLogged -= value; }
  143. }
  144. public event EventHandler<SelectProjectsEventArgs> SelectProjects {
  145. add { unsafeEvents.SelectProjects += value; }
  146. remove { unsafeEvents.SelectProjects -= value; }
  147. }
  148. public void OnPackageOperationsStarting()
  149. {
  150. unsafeEvents.OnPackageOperationsStarting();
  151. }
  152. public void OnPackageOperationError(Exception ex)
  153. {
  154. unsafeEvents.OnPackageOperationError(ex);
  155. }
  156. public bool OnAcceptLicenses(IEnumerable<IPackage> packages)
  157. {
  158. return unsafeEvents.OnAcceptLicenses(packages);
  159. }
  160. public void OnParentPackageInstalled(IPackage package)
  161. {
  162. unsafeEvents.OnParentPackageInstalled(package);
  163. }
  164. public void OnParentPackageUninstalled(IPackage package)
  165. {
  166. unsafeEvents.OnParentPackageUninstalled(package);
  167. }
  168. public void OnPackageOperationMessageLogged(MessageLevel level, string message, params object[] args)
  169. {
  170. unsafeEvents.OnPackageOperationMessageLogged(level, message, args);
  171. }
  172. public bool OnSelectProjects(IEnumerable<IPackageManagementSelectedProject> selectedProjects)
  173. {
  174. return unsafeEvents.OnSelectProjects(selectedProjects);
  175. }
  176. public event EventHandler<ResolveFileConflictEventArgs> ResolveFileConflict {
  177. add { unsafeEvents.ResolveFileConflict += value; }
  178. remove { unsafeEvents.ResolveFileConflict -= value; }
  179. }
  180. public FileConflictResolution OnResolveFileConflict(string message)
  181. {
  182. return unsafeEvents.OnResolveFileConflict(message);
  183. }
  184. public event EventHandler<ParentPackagesOperationEventArgs> ParentPackagesUpdated;
  185. public void OnParentPackagesUpdated(IEnumerable<IPackage> packages)
  186. {
  187. unsafeEvents.OnParentPackagesUpdated(packages);
  188. }
  189. void RaiseParentPackagesUpdatedEventIfHasSubscribers(object sender, ParentPackagesOperationEventArgs e)
  190. {
  191. if (ParentPackagesUpdated != null) {
  192. RaiseParentPackagesUpdatedEvent(sender, e);
  193. }
  194. }
  195. void RaiseParentPackagesUpdatedEvent(object sender, ParentPackagesOperationEventArgs e)
  196. {
  197. if (InvokeRequired) {
  198. Action<object, ParentPackagesOperationEventArgs> action = RaiseParentPackagesUpdatedEvent;
  199. SafeThreadAsyncCall(action, sender, e);
  200. } else {
  201. ParentPackagesUpdated(sender, e);
  202. }
  203. }
  204. }
  205. }