Пример #1
0
        /// <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));
        }
Пример #2
0
 public ClipboardReadingContext(IWindowsClipboardSession session)
 {
     if (session == null)
     {
         throw new ArgumentNullException(nameof(session));
     }
     _session = session;
 }
Пример #3
0
        /// <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);
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
        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"));
        }
Пример #6
0
 /// <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);
         }
     }
 }
Пример #7
0
 /// <exception cref="T:System.ArgumentNullException"><paramref name="session" /> is <see langword="null" /></exception>
 public ClipboardWritingContext(IWindowsClipboardSession session)
 {
     _session = session ?? throw new ArgumentNullException(nameof(session));
 }