暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PlasticPlugin.cs 8.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. using System;
  2. using System.Threading.Tasks;
  3. using UnityEditor;
  4. using UnityEngine;
  5. using Codice.Client.Common.Connection;
  6. using Codice.Client.Common.FsNodeReaders;
  7. using Codice.CM.Common;
  8. using Codice.LogWrapper;
  9. using PlasticPipe.Client;
  10. using Unity.PlasticSCM.Editor.AssetMenu;
  11. using Unity.PlasticSCM.Editor.AssetsOverlays;
  12. using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
  13. using Unity.PlasticSCM.Editor.AssetUtils.Processor;
  14. using Unity.PlasticSCM.Editor.CollabMigration;
  15. using Unity.PlasticSCM.Editor.Hub;
  16. using Unity.PlasticSCM.Editor.Inspector;
  17. using Unity.PlasticSCM.Editor.SceneView;
  18. using Unity.PlasticSCM.Editor.UI;
  19. namespace Unity.PlasticSCM.Editor
  20. {
  21. /// <summary>
  22. /// The Plastic SCM plugin for Unity editor.
  23. /// </summary>
  24. [InitializeOnLoad]
  25. public static class PlasticPlugin
  26. {
  27. /// <summary>
  28. /// Invoked when notification status changed.
  29. /// </summary>
  30. public static event Action OnNotificationUpdated = delegate { };
  31. internal static IAssetStatusCache AssetStatusCache
  32. {
  33. get { return mAssetStatusCache; }
  34. }
  35. internal static WorkspaceOperationsMonitor WorkspaceOperationsMonitor
  36. {
  37. get { return mWorkspaceOperationsMonitor; }
  38. }
  39. internal static PlasticConnectionMonitor ConnectionMonitor
  40. {
  41. get { return mPlasticConnectionMonitor; }
  42. }
  43. internal static bool IsUnitTesting { get; set; }
  44. static PlasticPlugin()
  45. {
  46. ProcessCommand.Initialize();
  47. MigrateCollabProject.Initialize();
  48. EditorDispatcher.Initialize();
  49. if (!FindWorkspace.HasWorkspace(ApplicationDataPath.Get()))
  50. return;
  51. if (!PlasticPluginIsEnabledPreference.IsEnabled())
  52. return;
  53. CooldownWindowDelayer cooldownInitializeAction = new CooldownWindowDelayer(
  54. Enable, UnityConstants.PLUGIN_DELAYED_INITIALIZE_INTERVAL);
  55. cooldownInitializeAction.Ping();
  56. }
  57. /// <summary>
  58. /// Open the Plastic SCM window.
  59. /// Also, it enables the plugin IsEnabled preference if it is disabled.
  60. /// </summary>
  61. public static void OpenPlasticWindowDisablingOfflineModeIfNeeded()
  62. {
  63. // It's pending to rename the OpenPlasticWindowDisablingOfflineModeIfNeeded
  64. // method to OpenPlasticWindowAndEnablePluginIfNeeded. We cannot do it now
  65. // because it's a public method and this rename breaks the API validation
  66. // check. We will do it when we change the major version number to v3.0.0.
  67. if (!PlasticPluginIsEnabledPreference.IsEnabled())
  68. {
  69. PlasticPluginIsEnabledPreference.Enable();
  70. Enable();
  71. }
  72. ShowWindow.Plastic();
  73. }
  74. /// <summary>
  75. /// Get the plugin status icon.
  76. /// </summary>
  77. public static Texture GetPluginStatusIcon()
  78. {
  79. return PlasticNotification.GetIcon(mNotificationStatus);
  80. }
  81. internal static void Enable()
  82. {
  83. if (mIsEnabled)
  84. return;
  85. mIsEnabled = true;
  86. PlasticApp.InitializeIfNeeded();
  87. mLog.Debug("Enable");
  88. if (!FindWorkspace.HasWorkspace(ApplicationDataPath.Get()))
  89. return;
  90. EnableForWorkspace();
  91. }
  92. internal static void EnableForWorkspace()
  93. {
  94. if (mIsEnabledForWorkspace)
  95. return;
  96. WorkspaceInfo wkInfo = FindWorkspace.InfoForApplicationPath(
  97. ApplicationDataPath.Get(), PlasticGui.Plastic.API);
  98. if (wkInfo == null)
  99. return;
  100. mIsEnabledForWorkspace = true;
  101. mLog.Debug("EnableForWorkspace " + wkInfo.ClientPath);
  102. PlasticApp.SetWorkspace(wkInfo);
  103. HandleCredsAliasAndServerCert.InitializeHostUnreachableExceptionListener(
  104. mPlasticConnectionMonitor);
  105. bool isGluonMode = PlasticGui.Plastic.API.IsGluonWorkspace(wkInfo);
  106. mAssetStatusCache = new AssetStatusCache(wkInfo, isGluonMode);
  107. PlasticAssetsProcessor plasticAssetsProcessor = new PlasticAssetsProcessor();
  108. mWorkspaceOperationsMonitor = BuildWorkspaceOperationsMonitor(
  109. plasticAssetsProcessor, isGluonMode);
  110. mWorkspaceOperationsMonitor.Start();
  111. AssetsProcessors.Enable(
  112. wkInfo.ClientPath, plasticAssetsProcessor, mAssetStatusCache);
  113. AssetMenuItems.Enable(
  114. wkInfo, mAssetStatusCache);
  115. DrawAssetOverlay.Enable(
  116. wkInfo.ClientPath, mAssetStatusCache);
  117. DrawInspectorOperations.Enable(
  118. wkInfo.ClientPath, mAssetStatusCache);
  119. DrawSceneOperations.Enable(
  120. wkInfo.ClientPath, mWorkspaceOperationsMonitor, mAssetStatusCache);
  121. Task.Run(() => EnsureServerConnection(wkInfo, mPlasticConnectionMonitor));
  122. }
  123. internal static void Shutdown()
  124. {
  125. mLog.Debug("Shutdown");
  126. HandleCredsAliasAndServerCert.CleanHostUnreachableExceptionListener();
  127. mPlasticConnectionMonitor.Stop();
  128. Disable();
  129. }
  130. internal static void Disable()
  131. {
  132. if (!mIsEnabled)
  133. return;
  134. try
  135. {
  136. mLog.Debug("Disable");
  137. DisableForWorkspace();
  138. WorkspaceInfo wkInfo = FindWorkspace.InfoForApplicationPath(
  139. ApplicationDataPath.Get(), PlasticGui.Plastic.API);
  140. PlasticApp.Dispose(wkInfo);
  141. }
  142. finally
  143. {
  144. mIsEnabled = false;
  145. }
  146. }
  147. internal static void SetNotificationStatus(
  148. PlasticWindow plasticWindow,
  149. PlasticNotification.Status status)
  150. {
  151. mNotificationStatus = status;
  152. plasticWindow.SetupWindowTitle(status);
  153. if (OnNotificationUpdated != null)
  154. OnNotificationUpdated.Invoke();
  155. }
  156. static void DisableForWorkspace()
  157. {
  158. if (!mIsEnabledForWorkspace)
  159. return;
  160. try
  161. {
  162. mWorkspaceOperationsMonitor.Stop();
  163. AssetsProcessors.Disable();
  164. AssetMenuItems.Disable();
  165. DrawAssetOverlay.Disable();
  166. DrawInspectorOperations.Disable();
  167. DrawSceneOperations.Disable();
  168. }
  169. finally
  170. {
  171. mIsEnabledForWorkspace = false;
  172. }
  173. }
  174. static WorkspaceOperationsMonitor BuildWorkspaceOperationsMonitor(
  175. PlasticAssetsProcessor plasticAssetsProcessor,
  176. bool isGluonMode)
  177. {
  178. WorkspaceOperationsMonitor result = new WorkspaceOperationsMonitor(
  179. PlasticGui.Plastic.API, plasticAssetsProcessor, isGluonMode);
  180. plasticAssetsProcessor.SetWorkspaceOperationsMonitor(result);
  181. return result;
  182. }
  183. static void EnsureServerConnection(
  184. WorkspaceInfo wkInfo,
  185. PlasticConnectionMonitor plasticConnectionMonitor)
  186. {
  187. if (IsUnitTesting)
  188. return;
  189. RepositorySpec repSpec = PlasticGui.Plastic.API.GetRepositorySpec(wkInfo);
  190. plasticConnectionMonitor.SetRepositorySpecForEventTracking(repSpec);
  191. try
  192. {
  193. // set the PlasticConnectionMonitor initially to have a valid connection
  194. // then check that the server connection is valid. If failed, we call
  195. // PlasticConnectionMonitor.OnConnectionError that fires the Plugin disable
  196. // and the reconnection mechanism
  197. plasticConnectionMonitor.SetAsConnected();
  198. if (!PlasticGui.Plastic.API.CheckServerConnection(repSpec.Server))
  199. throw new Exception(string.Format("Failed to connect to {0}", repSpec.Server));
  200. }
  201. catch (Exception ex)
  202. {
  203. plasticConnectionMonitor.OnConnectionError(ex, repSpec.Server);
  204. }
  205. }
  206. static PlasticNotification.Status mNotificationStatus;
  207. static AssetStatusCache mAssetStatusCache;
  208. static WorkspaceOperationsMonitor mWorkspaceOperationsMonitor;
  209. static PlasticConnectionMonitor mPlasticConnectionMonitor = new PlasticConnectionMonitor();
  210. static bool mIsEnabled;
  211. static bool mIsEnabledForWorkspace;
  212. static readonly ILog mLog = PlasticApp.GetLogger("PlasticPlugin");
  213. }
  214. }