public void LaunchBuildServerInfoFetchOperation() { CancelBuildStatusFetchOperation(); DisposeBuildServerAdapter(); GetBuildServerAdapter().ContinueWith((Task <IBuildServerAdapter> task) => { if (_revisions.IsDisposed) { return; } _buildServerAdapter = task.Result; UpdateUI(); if (_buildServerAdapter == null) { return; } var scheduler = NewThreadScheduler.Default; // Run this first as it (may) force start queries var runningBuildsObservable = _buildServerAdapter.GetRunningBuilds(scheduler); var fullDayObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3)); var fullObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler); var fromNowObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now); var cancellationToken = new CompositeDisposable { fullDayObservable.OnErrorResumeNext(fullObservable) .OnErrorResumeNext(Observable.Empty <BuildInfo>() .DelaySubscription(TimeSpan.FromMinutes(1)) .OnErrorResumeNext(fromNowObservable) .Retry() .Repeat()) .ObserveOn(SynchronizationContext.Current) .Subscribe(OnBuildInfoUpdate), runningBuildsObservable.OnErrorResumeNext(Observable.Empty <BuildInfo>() .DelaySubscription(TimeSpan.FromSeconds(10))) .Retry() .Repeat() .ObserveOn(SynchronizationContext.Current) .Subscribe(OnBuildInfoUpdate) }; _buildStatusCancellationToken = cancellationToken; }, TaskScheduler.FromCurrentSynchronizationContext()); }
public void LaunchBuildServerInfoFetchOperation() { ThreadHelper.ThrowIfNotOnUIThread(); CancelBuildStatusFetchOperation(); DisposeBuildServerAdapter(); ThreadHelper.JoinableTaskFactory.RunAsync( async() => { _buildServerAdapter = await GetBuildServerAdapterAsync(); await _revisions.SwitchToMainThreadAsync(); UpdateUI(); if (_buildServerAdapter == null) { return; } var scheduler = NewThreadScheduler.Default; // Run this first as it (may) force start queries var runningBuildsObservable = _buildServerAdapter.GetRunningBuilds(scheduler); var fullDayObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3)); var fullObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler); var fromNowObservable = _buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now); var cancellationToken = new CompositeDisposable { fullDayObservable.OnErrorResumeNext(fullObservable) .OnErrorResumeNext(Observable.Empty <BuildInfo>() .DelaySubscription(TimeSpan.FromMinutes(1)) .OnErrorResumeNext(fromNowObservable) .Retry() .Repeat()) .ObserveOn(MainThreadScheduler.Instance) .Subscribe(OnBuildInfoUpdate), runningBuildsObservable.OnErrorResumeNext(Observable.Empty <BuildInfo>() .DelaySubscription(TimeSpan.FromSeconds(10))) .Retry() .Repeat() .ObserveOn(MainThreadScheduler.Instance) .Subscribe(OnBuildInfoUpdate) }; _buildStatusCancellationToken = cancellationToken; }); }
public void LaunchBuildServerInfoFetchOperation() { CancelBuildStatusFetchOperation(); DisposeBuildServerAdapter(); // Extract the project name from the last part of the directory path. It is assumed that it matches the project name in the CI build server. GetBuildServerAdapter().ContinueWith((Task <IBuildServerAdapter> task) => { if (revisions.IsDisposed) { return; } buildServerAdapter = task.Result; UpdateUI(); if (buildServerAdapter == null) { return; } var scheduler = NewThreadScheduler.Default; var fullDayObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3)); var fullObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler); var fromNowObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now); var runningBuildsObservable = buildServerAdapter.GetRunningBuilds(scheduler); var cancellationToken = new CompositeDisposable { fullDayObservable.OnErrorResumeNext(fullObservable) .OnErrorResumeNext(Observable.Empty <BuildInfo>() .DelaySubscription(TimeSpan.FromMinutes(1)) .OnErrorResumeNext(fromNowObservable) .Retry() .Repeat()) .ObserveOn(SynchronizationContext.Current) .Subscribe(OnBuildInfoUpdate), runningBuildsObservable.OnErrorResumeNext(Observable.Empty <BuildInfo>() .DelaySubscription(TimeSpan.FromSeconds(10))) .Retry() .Repeat() .ObserveOn(SynchronizationContext.Current) .Subscribe(OnBuildInfoUpdate) }; buildStatusCancellationToken = cancellationToken; }, TaskScheduler.FromCurrentSynchronizationContext()); }
public void LaunchBuildServerInfoFetchOperation() { CancelBuildStatusFetchOperation(); DisposeBuildServerAdapter(); // Extract the project name from the last part of the directory path. It is assumed that it matches the project name in the CI build server. GetBuildServerAdapter().ContinueWith((Task<IBuildServerAdapter> task) => { if (revisions.IsDisposed) { return; } buildServerAdapter = task.Result; UpdateUI(); if (buildServerAdapter == null) return; var scheduler = NewThreadScheduler.Default; var fullDayObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3)); var fullObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler); var fromNowObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Now); var runningBuildsObservable = buildServerAdapter.GetRunningBuilds(scheduler); var cancellationToken = new CompositeDisposable { fullDayObservable.OnErrorResumeNext(fullObservable) .OnErrorResumeNext(Observable.Empty<BuildInfo>() .DelaySubscription(TimeSpan.FromMinutes(1)) .OnErrorResumeNext(fromNowObservable) .Retry() .Repeat()) .ObserveOn(SynchronizationContext.Current) .Subscribe(OnBuildInfoUpdate), runningBuildsObservable.OnErrorResumeNext(Observable.Empty<BuildInfo>() .DelaySubscription(TimeSpan.FromSeconds(10))) .Retry() .Repeat() .ObserveOn(SynchronizationContext.Current) .Subscribe(OnBuildInfoUpdate) }; buildStatusCancellationToken = cancellationToken; }, TaskScheduler.FromCurrentSynchronizationContext()); }
public IBuildServerCredentials GetBuildServerCredentials(IBuildServerAdapter buildServerAdapter, bool useStoredCredentialsIfExisting) { lock (buildServerCredentialsLock) { IBuildServerCredentials buildServerCredentials = new BuildServerCredentials { UseGuestAccess = true }; const string CredentialsConfigName = "Credentials"; const string UseGuestAccessKey = "UseGuestAccess"; const string UsernameKey = "Username"; const string PasswordKey = "Password"; using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Read, FileShare.Read)) { if (stream.Position < stream.Length) { var protectedData = new byte[stream.Length]; stream.Read(protectedData, 0, (int)stream.Length); try { byte[] unprotectedData = ProtectedData.Unprotect(protectedData, null, DataProtectionScope.CurrentUser); using (var memoryStream = new MemoryStream(unprotectedData)) { ConfigFile credentialsConfig = new ConfigFile("", false); using (var textReader = new StreamReader(memoryStream, Encoding.UTF8)) { credentialsConfig.LoadFromString(textReader.ReadToEnd()); } ConfigSection section = credentialsConfig.FindConfigSection(CredentialsConfigName); if (section != null) { buildServerCredentials.UseGuestAccess = section.GetValueAsBool(UseGuestAccessKey, true); buildServerCredentials.Username = section.GetValue(UsernameKey); buildServerCredentials.Password = section.GetValue(PasswordKey); if (useStoredCredentialsIfExisting) { return buildServerCredentials; } } } } catch (CryptographicException) { // As per MSDN, the ProtectedData.Unprotect method is per user, // it will throw the CryptographicException if the current user // is not the one who protected the data. // Set this variable to false so the user can reset the credentials. useStoredCredentialsIfExisting = false; } } } if (!useStoredCredentialsIfExisting) { buildServerCredentials = ShowBuildServerCredentialsForm(buildServerAdapter.UniqueKey, buildServerCredentials); if (buildServerCredentials != null) { ConfigFile credentialsConfig = new ConfigFile("", true); ConfigSection section = credentialsConfig.FindOrCreateConfigSection(CredentialsConfigName); section.SetValueAsBool(UseGuestAccessKey, buildServerCredentials.UseGuestAccess); section.SetValue(UsernameKey, buildServerCredentials.Username); section.SetValue(PasswordKey, buildServerCredentials.Password); using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Write, FileShare.None)) { using (var memoryStream = new MemoryStream()) { using (var textWriter = new StreamWriter(memoryStream, Encoding.UTF8)) { textWriter.Write(credentialsConfig.GetAsString()); } var protectedData = ProtectedData.Protect(memoryStream.ToArray(), null, DataProtectionScope.CurrentUser); stream.Write(protectedData, 0, protectedData.Length); } } return buildServerCredentials; } } return null; } }
private void DisposeBuildServerAdapter() { if (buildServerAdapter != null) { buildServerAdapter.Dispose(); buildServerAdapter = null; } }
private static IsolatedStorageFileStream GetBuildServerOptionsIsolatedStorageStream(IBuildServerAdapter buildServerAdapter, FileAccess fileAccess, FileShare fileShare) { var fileName = string.Format("BuildServer-{0}.options", Convert.ToBase64String(Encoding.UTF8.GetBytes(buildServerAdapter.UniqueKey))); return new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, fileAccess, fileShare); }
private static IsolatedStorageFileStream GetBuildServerOptionsIsolatedStorageStream(IBuildServerAdapter buildServerAdapter, FileAccess fileAccess, FileShare fileShare) { var fileName = string.Format("BuildServer-{0}.options", Convert.ToBase64String(Encoding.UTF8.GetBytes(buildServerAdapter.UniqueKey))); return(new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, fileAccess, fileShare)); }
public IBuildServerCredentials GetBuildServerCredentials(IBuildServerAdapter buildServerAdapter, bool useStoredCredentialsIfExisting) { lock (buildServerCredentialsLock) { IBuildServerCredentials buildServerCredentials = new BuildServerCredentials { UseGuestAccess = true }; var foundInConfig = false; const string CredentialsConfigName = "Credentials"; const string UseGuestAccessKey = "UseGuestAccess"; const string UsernameKey = "Username"; const string PasswordKey = "Password"; using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Read, FileShare.Read)) { if (stream.Position < stream.Length) { var protectedData = new byte[stream.Length]; stream.Read(protectedData, 0, (int)stream.Length); try { byte[] unprotectedData = ProtectedData.Unprotect(protectedData, null, DataProtectionScope.CurrentUser); using (var memoryStream = new MemoryStream(unprotectedData)) { ConfigFile credentialsConfig = new ConfigFile("", false); using (var textReader = new StreamReader(memoryStream, Encoding.UTF8)) { credentialsConfig.LoadFromString(textReader.ReadToEnd()); } var section = credentialsConfig.FindConfigSection(CredentialsConfigName); if (section != null) { buildServerCredentials.UseGuestAccess = section.GetValueAsBool(UseGuestAccessKey, true); buildServerCredentials.Username = section.GetValue(UsernameKey); buildServerCredentials.Password = section.GetValue(PasswordKey); foundInConfig = true; if (useStoredCredentialsIfExisting) { return(buildServerCredentials); } } } } catch (CryptographicException) { // As per MSDN, the ProtectedData.Unprotect method is per user, // it will throw the CryptographicException if the current user // is not the one who protected the data. // Set this variable to false so the user can reset the credentials. useStoredCredentialsIfExisting = false; } } } if (!useStoredCredentialsIfExisting || !foundInConfig) { buildServerCredentials = ShowBuildServerCredentialsForm(buildServerAdapter.UniqueKey, buildServerCredentials); if (buildServerCredentials != null) { ConfigFile credentialsConfig = new ConfigFile("", true); var section = credentialsConfig.FindOrCreateConfigSection(CredentialsConfigName); section.SetValueAsBool(UseGuestAccessKey, buildServerCredentials.UseGuestAccess); section.SetValue(UsernameKey, buildServerCredentials.Username); section.SetValue(PasswordKey, buildServerCredentials.Password); using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Write, FileShare.None)) { using (var memoryStream = new MemoryStream()) { using (var textWriter = new StreamWriter(memoryStream, Encoding.UTF8)) { textWriter.Write(credentialsConfig.GetAsString()); } var protectedData = ProtectedData.Protect(memoryStream.ToArray(), null, DataProtectionScope.CurrentUser); stream.Write(protectedData, 0, protectedData.Length); } } return(buildServerCredentials); } } return(null); } }
public async Task LaunchBuildServerInfoFetchOperationAsync() { await TaskScheduler.Default; CancelBuildStatusFetchOperation(); var launchToken = _launchCancellation.Next(); var buildServerAdapter = await GetBuildServerAdapterAsync().ConfigureAwait(false); await _revisionGridView.SwitchToMainThreadAsync(launchToken); _buildServerAdapter?.Dispose(); _buildServerAdapter = buildServerAdapter; await TaskScheduler.Default; if (buildServerAdapter == null || launchToken.IsCancellationRequested) { return; } var scheduler = NewThreadScheduler.Default; // Run this first as it (may) force start queries var runningBuildsObservable = buildServerAdapter.GetRunningBuilds(scheduler); var fullDayObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler, DateTime.Today - TimeSpan.FromDays(3)); var fullObservable = buildServerAdapter.GetFinishedBuildsSince(scheduler); bool anyRunningBuilds = false; var delayObservable = Observable.Defer(() => Observable.Empty <BuildInfo>() .DelaySubscription(anyRunningBuilds ? ShortPollInterval : LongPollInterval)); var shouldLookForNewlyFinishedBuilds = false; DateTime nowFrozen = DateTime.Now; // All finished builds have already been retrieved, // so looking for new finished builds make sense only if running builds have been found previously var fromNowObservable = Observable.If(() => shouldLookForNewlyFinishedBuilds, buildServerAdapter.GetFinishedBuildsSince(scheduler, nowFrozen) .Finally(() => shouldLookForNewlyFinishedBuilds = false)); var cancellationToken = new CompositeDisposable { fullDayObservable.OnErrorResumeNext(fullObservable) .OnErrorResumeNext(Observable.Empty <BuildInfo>() .DelaySubscription(TimeSpan.FromMinutes(1)) .OnErrorResumeNext(fromNowObservable) .Retry() .Repeat()) .ObserveOn(MainThreadScheduler.Instance) .Subscribe(OnBuildInfoUpdate), runningBuildsObservable.Do(buildInfo => { anyRunningBuilds = true; shouldLookForNewlyFinishedBuilds = true; }) .Retry() .Concat(delayObservable) .Finally(() => anyRunningBuilds = false) .Repeat() .ObserveOn(MainThreadScheduler.Instance) .Subscribe(OnBuildInfoUpdate) }; await _revisionGridView.SwitchToMainThreadAsync(launchToken); CancelBuildStatusFetchOperation(); _buildStatusCancellationToken = cancellationToken; }
public IBuildServerCredentials GetBuildServerCredentials(IBuildServerAdapter buildServerAdapter, bool useStoredCredentialsIfExisting) { lock (buildServerCredentialsLock) { IBuildServerCredentials buildServerCredentials = new BuildServerCredentials { UseGuestAccess = true }; const string CredentialsConfigName = "Credentials"; const string UseGuestAccessKey = "UseGuestAccess"; const string UsernameKey = "Username"; const string PasswordKey = "Password"; using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Read, FileShare.Read)) { if (stream.Position < stream.Length) { var protectedData = new byte[stream.Length]; stream.Read(protectedData, 0, (int)stream.Length); byte[] unprotectedData = ProtectedData.Unprotect(protectedData, null, DataProtectionScope.CurrentUser); using (var memoryStream = new MemoryStream(unprotectedData)) { ConfigFile credentialsConfig = new ConfigFile("", false); using (var textReader = new StreamReader(memoryStream, Encoding.UTF8)) { credentialsConfig.LoadFromString(textReader.ReadToEnd()); } ConfigSection section = credentialsConfig.FindConfigSection(CredentialsConfigName); if (section != null) { buildServerCredentials.UseGuestAccess = section.GetValueAsBool(UseGuestAccessKey, true); buildServerCredentials.Username = section.GetValue(UsernameKey); buildServerCredentials.Password = section.GetValue(PasswordKey); if (useStoredCredentialsIfExisting) { return(buildServerCredentials); } } } } } if (!useStoredCredentialsIfExisting) { buildServerCredentials = ShowBuildServerCredentialsForm(buildServerAdapter.UniqueKey, buildServerCredentials); if (buildServerCredentials != null) { ConfigFile credentialsConfig = new ConfigFile("", true); ConfigSection section = credentialsConfig.FindOrCreateConfigSection(CredentialsConfigName); section.SetValueAsBool(UseGuestAccessKey, buildServerCredentials.UseGuestAccess); section.SetValue(UsernameKey, buildServerCredentials.Username); section.SetValue(PasswordKey, buildServerCredentials.Password); using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Write, FileShare.None)) { using (var memoryStream = new MemoryStream()) { using (var textWriter = new StreamWriter(memoryStream, Encoding.UTF8)) { textWriter.Write(credentialsConfig.GetAsString()); } var protectedData = ProtectedData.Protect(memoryStream.ToArray(), null, DataProtectionScope.CurrentUser); stream.Write(protectedData, 0, protectedData.Length); } } return(buildServerCredentials); } } return(null); } }