public CameraSnapshotInstance(CameraSnapshotDefinition theDefinition, TestExecution testExecution) : base(theDefinition, testExecution) { mCameraSnapshotDefintion = theDefinition; if (theDefinition.Camera == null) { throw new ArgumentException("'" + theDefinition.Name + "' doesn't have a camera assigned"); } mCamera = theDefinition.Camera; if (theDefinition.Camera == null) { throw new ArgumentException("'" + theDefinition.Name + "' doesn't have a value assigned to Timeout"); } mTimeout = theDefinition.Timeout; mSnapshotImage = new GeneratedImageInstance(theDefinition.ResultantImage, testExecution); mResolution = theDefinition.Resolution; testExecution.RegisterTrigger(this); }
protected override void OnDoWork(DoWorkEventArgs e) { mHttpCameraUser.mWorkerLogMessage = "snapshot worker kicked off"; mHttpCameraUser.mWorkerLogMessageAvailable = true; CameraSnapshotDefinition defObject = (CameraSnapshotDefinition)mHttpCameraUser.Definition(); int readSize = 1024 * 1;//zxz int bufferSize = defObject.bufferSize; byte[] buffer = defObject.bufferForWorker; HttpWebRequest request = null; WebResponse response = null; Stream stream = null; Random randomNumberGenerator = new Random((int)DateTime.Now.Ticks); HttpRequestCachePolicy bypassCachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.BypassCache); try { string uri = mHttpCameraUser.Camera.CompleteImageRequestURL(defObject.Resolution); if (mHttpCameraUser.Camera.ProxyCacheProtection) { uri += ((uri.IndexOf('?') == -1) ? '?' : '&') + "proxyprevention=" + randomNumberGenerator.Next().ToString(); } request = (HttpWebRequest)WebRequest.Create(uri); request.CachePolicy = bypassCachePolicy; request.Timeout = mHttpCameraUser.Timeout; if (mHttpCameraUser.Camera.Login != null && mHttpCameraUser.Camera.Login.Length > 0) { if (mHttpCameraUser.Camera.Password == null) { mHttpCameraUser.Camera.Password = String.Empty; } request.Credentials = new NetworkCredential(mHttpCameraUser.Camera.Login, mHttpCameraUser.Camera.Password); } // setting ConnectionGroupName to make sure we don't run out of connections amongst all the cameras (see http://msdn2.microsoft.com/en-us/library/ms998562.aspx section: "Connections") request.ConnectionGroupName = mHttpCameraUser.TestSequence().Name + " : " + mHttpCameraUser.Name; // a unique group for each HTTP user within each TestSequence. We don't want to create unique groups every request because that would be inefficient // TODO: check maxconnection attribute in Machine.config (limits the number of concurrent outbound calls) mHttpCameraUser.mWorkerLogMessage = "snapshot request setup"; mHttpCameraUser.mWorkerLogMessageAvailable = true; response = request.GetResponse(); stream = response.GetResponseStream(); long contentLength = response.ContentLength; int bytesRead = 0; int totalBytesRead = 0; ReportProgress(0, "Requesting image"); bool done = false; while (!done) { if (CancellationPending) { e.Cancel = true; return; } if (totalBytesRead > bufferSize - readSize) { e.Result = ResultCodes.BufferTooSmall; return; } bytesRead = stream.Read(buffer, totalBytesRead, readSize); //Console.WriteLine("Read " + bytesRead + " bytes in one chunk"); if (bytesRead == 0) { done = true; } else { totalBytesRead += bytesRead; ReportProgress((int)(totalBytesRead * 100 / contentLength), "Downloading..."); } } mImage = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, 0, totalBytesRead)); e.Result = ResultCodes.Success; ReportProgress(100, "Done! Read " + totalBytesRead + " bytes"); //Console.WriteLine("Read total of " + totalBytesRead + " bytes"); } catch (WebException exception) { Console.WriteLine("web exception: " + exception.Message); switch (exception.Status) { // http://msdn2.microsoft.com/en-us/library/system.net.webexceptionstatus(vs.80).aspx case WebExceptionStatus.Timeout: e.Result = ResultCodes.Timeout; break; default: e.Result = ResultCodes.Unspecified; break; } } catch (Exception exception) { e.Result = ResultCodes.NonWebException; } finally { if (request != null) { request.Abort(); request = null; } if (stream != null) { stream.Close(); stream = null; } if (response != null) { response.Close(); response = null; } } }