Example #1
0
        /// <summary>
        /// Beendet eine Operation auf diesem Geräteprofil.
        /// </summary>
        /// <param name="request">Der zu beendende Zugriff.</param>
        /// <exception cref="ArgumentNullException">Es wurde kein Zugriff angegeben.</exception>
        /// <exception cref="InvalidOperationException">Dieser Zugriff ist nicht der aktive Zugriff dieses
        /// Geräteprofils.</exception>
        public void EndRequest(CardServerProxy request)
        {
            // Validate
            if (ReferenceEquals(request, null))
            {
                throw new ArgumentNullException("request");
            }

            // Synchronize
            lock (m_RequestLock)
            {
                // Process
                if (ReferenceEquals(m_CurrentRequest, request))
                {
                    ChangeCurrentRequest(null);
                }
                else
                {
                    throw new InvalidOperationException("Wrong Request to End");
                }

                // Fire notification
                Monitor.PulseAll(m_RequestLock);
            }
        }
Example #2
0
        /// <summary>
        /// Beginnt eine Operation auf diesem Geräteprofil.
        /// </summary>
        /// <param name="request">Der zu aktivierende Zugriff.</param>
        /// <param name="throwOnBusy">Gesetzt um einen Fehler auszulösen, wenn bereits ein Zugriff aktiv ist.</param>
        /// <exception cref="ArgumentNullException">Es wurde kein Zugriff angegeben.</exception>
        /// <exception cref="ArgumentException">Der Zugriff gehört nicht zu diesem Geräteprofil.</exception>
        /// <exception cref="InvalidOperationException">Es ist bereits ein Zugriff aktiv.</exception>
        /// <returns>Gesetzt, wenn der neue Zugriff erfolgreich gestartet wurde.</returns>
        public bool BeginRequest(CardServerProxy request, bool throwOnBusy = true)
        {
            // Validate
            if (ReferenceEquals(request, null))
            {
                throw new ArgumentNullException("request");
            }
            if (!ReferenceEquals(request.ProfileState, this))
            {
                throw new ArgumentException(request.ProfileName, "request.ProfileState");
            }

            // Synchronize
            lock (m_RequestLock)
            {
                // Wait for current request to end
                for (;;)
                {
                    // Load
                    var current = m_CurrentRequest;
                    if (ReferenceEquals(current, null))
                    {
                        break;
                    }

                    // Failed
                    if (!current.IsShuttingDown)
                    {
                        if (current is ZappingProxy)
                        {
                            current.Stop(false);
                        }
                        else if (throwOnBusy)
                        {
                            throw new InvalidOperationException("Profile is already running a Request");
                        }
                        else
                        {
                            return(false);
                        }
                    }

                    // Wait for it to end
                    Monitor.Wait(m_RequestLock);
                }

                // Take new
                ChangeCurrentRequest(request);
            }

            // Did it
            return(true);
        }
Example #3
0
        /// <summary>
        /// Der aktuelle Zugriff auf die zugehörige DVB.NET Hardwareabstraktion. Der Aufrufer hält alle
        /// notwendigen Sperren.
        /// </summary>
        /// <param name="newRequest">Der neue Auftrag, der ab sofort ausgeführt wird.</param>
        private void ChangeCurrentRequest(CardServerProxy newRequest)
        {
            // Detach from previous
            var request = m_CurrentRequest;

            if (!ReferenceEquals(request, null))
            {
                request.Deactivate();
            }

            // Update
            m_CurrentRequest = newRequest;

            // Attach to this one
            if (!ReferenceEquals(newRequest, null))
            {
                newRequest.Activate();
            }
        }