/// <exception cref="T:System.ArgumentNullException"><paramref name="session" /> is <see langword="null" /></exception> /// <exception cref="T:System.ArgumentOutOfRangeException"> /// <p><paramref name="timeout" /> is too short. It must be higher than 30.</p> /// <p><paramref name="delayMilliseconds" /> is too short. It must be higher than 15.</p> /// </exception> /// <exception cref="T:System.ArgumentException"> /// <paramref name="timeout" /> must is lower than /// <paramref name="delayMilliseconds" /> /// </exception> public IClipboardOperationResult Open(IWindowsClipboardSession session, TimeSpan timeout, int delayMilliseconds = DefaultDelayMilliseconds) { // Validate parameter if (session == null) { throw new ArgumentNullException(nameof(session)); } if (session.IsOpen) { return(new ClipboardOperationResult(ClipboardOperationResultCode.Success, "A clipboard connection for the current thread is already active.")); } if (timeout.TotalMilliseconds < delayMilliseconds) { return(session.Open()); } var errorCodes = new List <uint>(); var counter = 0; var result = TimeoutHelper.RetryUntilSuccessOrTimeout( func: () => TryOpenSession(session, errorCodes, ref counter), timeout: timeout, delayInMs: delayMilliseconds); return(result ? ClipboardOperationResult.SuccessResult : GetErrorResult(errorCodes, counter)); }
public ClipboardReadingContext(IWindowsClipboardSession session) { if (session == null) { throw new ArgumentNullException(nameof(session)); } _session = session; }
/// <summary> /// Clears the clipboard, and asserts if the operation fails. /// </summary> protected void ClearClipboard(IWindowsClipboardSession session) { var result = session.Clear(); if (!result.IsSuccessful) { Debug.Assert(false); } }
private static bool TryOpenSession(IWindowsClipboardSession session, ICollection <uint> errorCodes, ref int counter) { counter++; var result = session.Open(); if (result.LastError.HasValue) { errorCodes.Add(result.LastError.Value); } return(result.IsSuccessful); }
public IClipboardOperationResult Open(IWindowsClipboardSession session, TimeSpan timeout, int delayMilliseconds = DefaultDelayMilliseconds) { //validate parameter if (session == null) { throw new ArgumentNullException(nameof(session)); } if (session.IsOpen) { return(new ClipboardOperationResult(ClipboardOperationResultCode.Success, "A clipboard connection for the current thread is already active.")); } if (timeout.TotalMilliseconds < delayMilliseconds) { return(session.Open()); } var errorCodes = new List <uint>(); var counter = 0; var getResult = new Func <bool>(() => { counter++; var funcResult = session.Open(); if (funcResult.LastError.HasValue) { errorCodes.Add(funcResult.LastError.Value); } return(funcResult.IsSuccessful); }); var result = getResult.RetryUntilSuccessOrTimeout(timeout, delayMilliseconds); //return result; if (result) { return(ClipboardOperationResult.SuccessResult); } var errors = errorCodes.Distinct().ToArray(); if (errors.Length == 1) { return(GetResultForSingleError(errors.First(), counter)); } if (errors.Any()) { return(GetResultForMultipleErrors(errors, counter)); } return(new ClipboardOperationResult(ClipboardOperationResultCode.ErrorOpenClipboard, $"Clipboard could not be opened after {counter} tries")); }
/// <summary> /// Opens a connection in given <see cref="IWindowsClipboardSession" />. /// If the connection fails then it throws exception. /// </summary> /// <param name="session">The session.</param> /// <exception cref="ClipboardWindowsApiException"> /// Connection to the clipboard could not be established. /// </exception> /// <exception cref="ClipboardTimeoutException"> Connection to clipboard fails after timeout </exception> protected void EnsureOpenConnection(IWindowsClipboardSession session) { if (Timeout.HasValue) { var result = _clipboardOpenerWithTimeout.Open(session, Timeout.Value); if (!result.IsSuccessful) { throw GetTimeOutException(result); } } else { var result = session.Open(); if (!result.IsSuccessful) { throw GetException(result); } } }
/// <exception cref="T:System.ArgumentNullException"><paramref name="session" /> is <see langword="null" /></exception> public ClipboardWritingContext(IWindowsClipboardSession session) { _session = session ?? throw new ArgumentNullException(nameof(session)); }