コード例 #1
0
        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);
        }
コード例 #2
0
        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;
                }
            }
        }