/// <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); } }
/// <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); }
/// <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(); } }