123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- using System;
- using System.Threading.Tasks;
-
- using UnityEditor;
- using UnityEngine;
-
- using Codice.Client.Common.Connection;
- using Codice.Client.Common.FsNodeReaders;
- using Codice.CM.Common;
- using Codice.LogWrapper;
- using PlasticPipe.Client;
- using Unity.PlasticSCM.Editor.AssetMenu;
- using Unity.PlasticSCM.Editor.AssetsOverlays;
- using Unity.PlasticSCM.Editor.AssetsOverlays.Cache;
- using Unity.PlasticSCM.Editor.AssetUtils.Processor;
- using Unity.PlasticSCM.Editor.CollabMigration;
- using Unity.PlasticSCM.Editor.Hub;
- using Unity.PlasticSCM.Editor.Inspector;
- using Unity.PlasticSCM.Editor.SceneView;
- using Unity.PlasticSCM.Editor.UI;
-
- namespace Unity.PlasticSCM.Editor
- {
- /// <summary>
- /// The Plastic SCM plugin for Unity editor.
- /// </summary>
- [InitializeOnLoad]
- public static class PlasticPlugin
- {
- /// <summary>
- /// Invoked when notification status changed.
- /// </summary>
- public static event Action OnNotificationUpdated = delegate { };
-
- internal static IAssetStatusCache AssetStatusCache
- {
- get { return mAssetStatusCache; }
- }
-
- internal static WorkspaceOperationsMonitor WorkspaceOperationsMonitor
- {
- get { return mWorkspaceOperationsMonitor; }
- }
-
- internal static PlasticConnectionMonitor ConnectionMonitor
- {
- get { return mPlasticConnectionMonitor; }
- }
-
- internal static bool IsUnitTesting { get; set; }
-
- static PlasticPlugin()
- {
- ProcessCommand.Initialize();
- MigrateCollabProject.Initialize();
- EditorDispatcher.Initialize();
-
- if (!FindWorkspace.HasWorkspace(ApplicationDataPath.Get()))
- return;
-
- if (!PlasticPluginIsEnabledPreference.IsEnabled())
- return;
-
- CooldownWindowDelayer cooldownInitializeAction = new CooldownWindowDelayer(
- Enable, UnityConstants.PLUGIN_DELAYED_INITIALIZE_INTERVAL);
- cooldownInitializeAction.Ping();
- }
-
- /// <summary>
- /// Open the Plastic SCM window.
- /// Also, it enables the plugin IsEnabled preference if it is disabled.
- /// </summary>
- public static void OpenPlasticWindowDisablingOfflineModeIfNeeded()
- {
- // It's pending to rename the OpenPlasticWindowDisablingOfflineModeIfNeeded
- // method to OpenPlasticWindowAndEnablePluginIfNeeded. We cannot do it now
- // because it's a public method and this rename breaks the API validation
- // check. We will do it when we change the major version number to v3.0.0.
-
- if (!PlasticPluginIsEnabledPreference.IsEnabled())
- {
- PlasticPluginIsEnabledPreference.Enable();
- Enable();
- }
-
- ShowWindow.Plastic();
- }
-
- /// <summary>
- /// Get the plugin status icon.
- /// </summary>
- public static Texture GetPluginStatusIcon()
- {
- return PlasticNotification.GetIcon(mNotificationStatus);
- }
-
- internal static void Enable()
- {
- if (mIsEnabled)
- return;
-
- mIsEnabled = true;
-
- PlasticApp.InitializeIfNeeded();
-
- mLog.Debug("Enable");
-
- if (!FindWorkspace.HasWorkspace(ApplicationDataPath.Get()))
- return;
-
- EnableForWorkspace();
- }
-
- internal static void EnableForWorkspace()
- {
- if (mIsEnabledForWorkspace)
- return;
-
- WorkspaceInfo wkInfo = FindWorkspace.InfoForApplicationPath(
- ApplicationDataPath.Get(), PlasticGui.Plastic.API);
-
- if (wkInfo == null)
- return;
-
- mIsEnabledForWorkspace = true;
-
- mLog.Debug("EnableForWorkspace " + wkInfo.ClientPath);
-
- PlasticApp.SetWorkspace(wkInfo);
-
- HandleCredsAliasAndServerCert.InitializeHostUnreachableExceptionListener(
- mPlasticConnectionMonitor);
-
- bool isGluonMode = PlasticGui.Plastic.API.IsGluonWorkspace(wkInfo);
-
- mAssetStatusCache = new AssetStatusCache(wkInfo, isGluonMode);
-
- PlasticAssetsProcessor plasticAssetsProcessor = new PlasticAssetsProcessor();
-
- mWorkspaceOperationsMonitor = BuildWorkspaceOperationsMonitor(
- plasticAssetsProcessor, isGluonMode);
- mWorkspaceOperationsMonitor.Start();
-
- AssetsProcessors.Enable(
- wkInfo.ClientPath, plasticAssetsProcessor, mAssetStatusCache);
- AssetMenuItems.Enable(
- wkInfo, mAssetStatusCache);
- DrawAssetOverlay.Enable(
- wkInfo.ClientPath, mAssetStatusCache);
- DrawInspectorOperations.Enable(
- wkInfo.ClientPath, mAssetStatusCache);
- DrawSceneOperations.Enable(
- wkInfo.ClientPath, mWorkspaceOperationsMonitor, mAssetStatusCache);
-
- Task.Run(() => EnsureServerConnection(wkInfo, mPlasticConnectionMonitor));
- }
-
- internal static void Shutdown()
- {
- mLog.Debug("Shutdown");
-
- HandleCredsAliasAndServerCert.CleanHostUnreachableExceptionListener();
- mPlasticConnectionMonitor.Stop();
-
- Disable();
- }
-
- internal static void Disable()
- {
- if (!mIsEnabled)
- return;
-
- try
- {
- mLog.Debug("Disable");
-
- DisableForWorkspace();
-
- WorkspaceInfo wkInfo = FindWorkspace.InfoForApplicationPath(
- ApplicationDataPath.Get(), PlasticGui.Plastic.API);
-
- PlasticApp.Dispose(wkInfo);
- }
- finally
- {
- mIsEnabled = false;
- }
- }
-
- internal static void SetNotificationStatus(
- PlasticWindow plasticWindow,
- PlasticNotification.Status status)
- {
- mNotificationStatus = status;
-
- plasticWindow.SetupWindowTitle(status);
-
- if (OnNotificationUpdated != null)
- OnNotificationUpdated.Invoke();
- }
-
- static void DisableForWorkspace()
- {
- if (!mIsEnabledForWorkspace)
- return;
-
- try
- {
- mWorkspaceOperationsMonitor.Stop();
-
- AssetsProcessors.Disable();
- AssetMenuItems.Disable();
- DrawAssetOverlay.Disable();
- DrawInspectorOperations.Disable();
- DrawSceneOperations.Disable();
- }
- finally
- {
- mIsEnabledForWorkspace = false;
- }
- }
-
- static WorkspaceOperationsMonitor BuildWorkspaceOperationsMonitor(
- PlasticAssetsProcessor plasticAssetsProcessor,
- bool isGluonMode)
- {
- WorkspaceOperationsMonitor result = new WorkspaceOperationsMonitor(
- PlasticGui.Plastic.API, plasticAssetsProcessor, isGluonMode);
- plasticAssetsProcessor.SetWorkspaceOperationsMonitor(result);
- return result;
- }
-
- static void EnsureServerConnection(
- WorkspaceInfo wkInfo,
- PlasticConnectionMonitor plasticConnectionMonitor)
- {
- if (IsUnitTesting)
- return;
-
- RepositorySpec repSpec = PlasticGui.Plastic.API.GetRepositorySpec(wkInfo);
-
- plasticConnectionMonitor.SetRepositorySpecForEventTracking(repSpec);
-
- try
- {
- // set the PlasticConnectionMonitor initially to have a valid connection
- // then check that the server connection is valid. If failed, we call
- // PlasticConnectionMonitor.OnConnectionError that fires the Plugin disable
- // and the reconnection mechanism
-
- plasticConnectionMonitor.SetAsConnected();
-
- if (!PlasticGui.Plastic.API.CheckServerConnection(repSpec.Server))
- throw new Exception(string.Format("Failed to connect to {0}", repSpec.Server));
- }
- catch (Exception ex)
- {
- plasticConnectionMonitor.OnConnectionError(ex, repSpec.Server);
- }
- }
-
- static PlasticNotification.Status mNotificationStatus;
- static AssetStatusCache mAssetStatusCache;
- static WorkspaceOperationsMonitor mWorkspaceOperationsMonitor;
- static PlasticConnectionMonitor mPlasticConnectionMonitor = new PlasticConnectionMonitor();
- static bool mIsEnabled;
- static bool mIsEnabledForWorkspace;
-
- static readonly ILog mLog = PlasticApp.GetLogger("PlasticPlugin");
- }
- }
|