public static void RegisterCallbacks() { VerifyFilterRegistration(); SharpStepCallback callback = (ObjectId, StepNumber, Type, Text) => { VideoContainer2 v = null; IVideoFormEvent EventConsumer = null; lock (AllContainers) { v = AllContainers[ObjectId]; } if (v != null) { EventConsumer = v.EventConsumer; } try { switch (Type) { case 0: if (EventConsumer != null) { EventConsumer.FireBeginStep(Text); } ; Console.WriteLine("\nFilter = {0}, step{1}: Begin {2}", ObjectId, StepNumber, Text); break; case 1: if (EventConsumer != null) { EventConsumer.FireStepRequest(Text); } ; Console.WriteLine("\nFilter = {0}, step{1}: Send [{2}]", ObjectId, StepNumber, Text); break; case 2: if (EventConsumer != null) { EventConsumer.FireStepResponse(Text); } ; Console.WriteLine("\nFilter = {0}, step{1}: Recv [{2}]", ObjectId, StepNumber, Text); break; case 3: if (EventConsumer != null) { EventConsumer.FireLogStepEvent(Text); } ; Console.WriteLine("\nFilter = {0}, step{1}: Log [{2}]", ObjectId, StepNumber, Text); break; case 4: if (EventConsumer != null) { EventConsumer.FireStepPassed(); } ; Console.WriteLine("\nFilter = {0}, step{1}: Success {2}", ObjectId, StepNumber, Text); break; case 5: v.Failed = true; v.FailedText = Text; //if (EventConsumer != null) { EventConsumer.FireStepFailed(Text); }; Console.WriteLine("\nFilter = {0}, step{1}: Failure {2}", ObjectId, StepNumber, Text); break; default: Console.WriteLine("\nFilter = {0}, step{1}: Undefined type {3}, Text=[{2}]", ObjectId, StepNumber, Text, Type); break; } } catch (Exception ex) { v.Failed = true; v.FailedText = ex.Message; } }; SetGlobalStepCallback(callback); }
public static void ShowMultiple( IVideoFormEvent eventConsumer, WaitHandle stopEvent, string username, string password, int timeout, GetStreamSetup getStreamSetup, int NICIndex, List <Profile> profiles, Func <StreamSetup, string, MediaUri> getStreamUri, Action <Action, string, bool> runStep, Action <Exception> stepFailed) { List <VideoStreamForm> streams = new List <VideoStreamForm>(); List <WaitHandle> eventsWorkEnded = new List <WaitHandle>(); timeout = Math.Max(timeout, 2000 * profiles.Count()); WaitHandle signalCloseWindow = new AutoResetEvent(false); foreach (Profile profile in profiles) { Profile currentProfile = profile; StreamSetup streamSetup = getStreamSetup(ref currentProfile); if (currentProfile == null) { continue; } VideoStreamForm vsf = new VideoStreamForm(); vsf.streamSetup = streamSetup; vsf.profile = currentProfile; vsf.getStreamUri = getStreamUri; vsf.messageTimeout = timeout; vsf.username = username; vsf.password = password; vsf.signalCloseWindow = signalCloseWindow; vsf.eventConsumer = eventConsumer; vsf.NICIndex = NICIndex; streams.Add(vsf); eventsWorkEnded.Add(vsf.eventWorkEnded); } if (0 == streams.Count) { return; } bool timeoutException = false; try { VideoStreamForm vsfFailed = null; foreach (VideoStreamForm vsf in streams) { ((ManualResetEvent)vsf.eventWorkEnded).Reset(); vsf.thread.Start(vsf); if (0 == WaitHandle.WaitAny(new WaitHandle[] { stopEvent, vsf.eventOpened, vsf.eventWorkEnded })) { throw new StopEventException(); } if (vsf.exception != null) { stepFailed(vsf.exception); vsfFailed = vsf; break; } } foreach (VideoStreamForm vsf in streams) { if (vsf.thread.ThreadState != ThreadState.Unstarted && vsf != vsfFailed) { vsf.skipLog = true; } } ((AutoResetEvent)signalCloseWindow).Set(); runStep(() => { if (!WaitHandle.WaitAll(eventsWorkEnded.ToArray(), timeout)) { ((AutoResetEvent)signalCloseWindow).Reset(); timeoutException = true; throw new VideoException("Waiting timeout exceeded"); } }, "Closing streams", false); if (timeoutException) { throw new VideoException("Waiting timeout exceeded"); } } // handle halt catch (Exception ex) { runStep(() => { foreach (VideoStreamForm vsf in streams) { if (vsf.thread.ThreadState != ThreadState.Unstarted) { vsf.thread.Abort(); vsf.thread.Join(); } } }, "Cleanup", true); if (!timeoutException) { throw ex; } } runStep(() => { // check for exceptions if (timeoutException) { throw new VideoException("Closing streams failed!"); } foreach (VideoStreamForm vsf in streams) { vsf.thread.Join(); if (vsf.exception != null) { throw new VideoException("Profile " + vsf.profile.Name + " failed!"); } } }, "Check for test results", true); }