/// <summary>
 /// Upload your screenshot here
 /// </summary>
 /// <param name="upload">image data and meta data</param>
 public void Upload(ImageUpload upload)
 {
     Debug.WriteLine("ScreenShotReceiver.Upload entered " + DateTime.Now);
     TextAnalysis.Init();
     if (upload == null)
     {
         Debug.WriteLine("upload is null");
         throw new ArgumentNullException("upload is null");
     }
     //rethread here so that the client is never waiting for analysis completion.
     new Thread(() => RethreadedUpload(upload)).Start();
 }
        private void RethreadedUpload(ImageUpload upload)
        {
            Debug.WriteLine("ScreenShotReceiver.RethreadedUpload entered {0}", DateTime.Now);
            try
            {
                ScreenShotDataAdapter dataLayer = new ScreenShotDataAdapter();

                //only process if the user is monitored
                var user = dataLayer.GetUserByName(upload.UserID);
                if (user != null && user.isMonitored)
                {
                    //load image
                    using (MemoryStream stream = new MemoryStream(upload.ImageData))
                    using (Image image = Bitmap.FromStream(stream))
                    {
                        //Analyze the image for to see if it violates any triggers
                        ProcessImage((Bitmap)image, upload.UserID, upload.CaptureTime, dataLayer);

                        //send image to database
                        dataLayer.SaveImage(image, upload.UserID, upload.CaptureTime);
                    }
                }
                else
                {
                    Debug.WriteLine("ScreenShotReceiver.RethreadedUpload not monitoring " + upload.UserID);
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
            }
            finally
            {
                Debug.WriteLine("ScreenShotReceiver.RethreadedUpload exit " + DateTime.Now);
            }
        }