/// <summary>
        /// Get list of tasks that are no more queued on a server.
        /// The tasks can be processed, failed, or not started becuase there is
        /// not enough credits to process them.
        /// </summary>
        public OcrSdkTask[] ListFinishedTasks()
        {
            string     url      = String.Format("{0}/listFinishedTasks", ServerUrl);
            WebRequest request  = createGetRequest(url);
            XDocument  response = performRequest(request);

            OcrSdkTask[] tasks = ServerXml.GetAllTasks(response);
            return(tasks);
        }
        /// <summary>
        /// List all tasks which status changed since given UTC timestamp
        /// </summary>
        public OcrSdkTask[] ListTasks(DateTime changedSince)
        {
            string url = String.Format("{0}/listTasks?fromDate={1}", ServerUrl,
                                       Uri.EscapeDataString(changedSince.ToUniversalTime().ToString("s") + "Z"));

            WebRequest request  = createGetRequest(url);
            XDocument  response = performRequest(request);

            OcrSdkTask[] tasks = ServerXml.GetAllTasks(response);
            return(tasks);
        }
        public OcrSdkTask GetTaskStatus(TaskId task)
        {
            string url = String.Format("{0}/getTaskStatus?taskId={1}", ServerUrl,
                                       Uri.EscapeDataString(task.ToString()));

            WebRequest request    = createGetRequest(url);
            XDocument  response   = performRequest(request);
            OcrSdkTask serverTask = ServerXml.GetTaskStatus(response);

            return(serverTask);
        }
        /// <summary>
        /// Recognize Machine-Readable Zone of an official document (Passport, ID, Visa etc)
        /// </summary>
        public OcrSdkTask ProcessMrz(Stream blob)
        {
            string     url     = String.Format("{0}/processMRZ", ServerUrl);
            WebRequest request = createPostRequest(url);

            WriteFileToRequest(blob, request);

            XDocument  response   = performRequest(request);
            OcrSdkTask serverTask = ServerXml.GetTaskStatus(response);

            return(serverTask);
        }
        public OcrSdkTask ProcessBusinessCard(string filePath, BusCardProcessingSettings settings)
        {
            string url = String.Format("{0}/processBusinessCard?{1}", ServerUrl, settings.AsUrlParams);

            // Build post request
            WebRequest request = createPostRequest(url);

            writeFileToRequest(filePath, request);

            XDocument  response   = performRequest(request);
            OcrSdkTask serverTask = ServerXml.GetTaskStatus(response);

            return(serverTask);
        }
        /// <summary>
        /// Delete task on a server. This function cannot delete tasks that are being processed.
        /// </summary>
        public OcrSdkTask DeleteTask(OcrSdkTask task)
        {
            switch (task.Status)
            {
            case TaskStatus.Deleted:
            case TaskStatus.InProgress:
            case TaskStatus.Unknown:
                throw new ArgumentException("Invalid task status: " + task.Status + ". Cannot delete");
            }

            string     url     = String.Format("{0}/deleteTask?taskId={1}", ServerUrl, Uri.EscapeDataString(task.Id.ToString()));
            WebRequest request = createGetRequest(url);

            XDocument  response   = performRequest(request);
            OcrSdkTask serverTask = ServerXml.GetTaskStatus(response);

            return(serverTask);
        }
        /// <summary>
        /// Perform fields recognition of uploaded document.
        /// </summary>
        /// <param name="task">Task created by UploadAndAddFileToTask method</param>
        /// <param name="settingsPath">Path to file with xml processing settings.</param>
        public OcrSdkTask ProcessFields(OcrSdkTask task, string settingsPath)
        {
            if (!File.Exists(settingsPath))
            {
                throw new FileNotFoundException("Settings file doesn't exist.", settingsPath);
            }

            string url = String.Format("{0}/processFields?taskId={1}", ServerUrl, task.Id);

            WebRequest request = createPostRequest(url);

            writeFileToRequest(settingsPath, request);

            XDocument  response = performRequest(request);
            OcrSdkTask result   = ServerXml.GetTaskStatus(response);

            return(result);
        }
        public OcrSdkTask StartProcessingTask(TaskId taskId, ProcessingSettings settings)
        {
            string url = String.Format("{0}/processDocument?taskId={1}&{2}", ServerUrl,
                                       Uri.EscapeDataString(taskId.ToString()),
                                       settings.AsUrlParams);

            if (!String.IsNullOrEmpty(settings.Description))
            {
                url = url + "&description=" + Uri.EscapeDataString(settings.Description);
            }

            // Build get request
            WebRequest request    = createGetRequest(url);
            XDocument  response   = performRequest(request);
            OcrSdkTask serverTask = ServerXml.GetTaskStatus(response);

            return(serverTask);
        }
        /// <summary>
        /// Upload image of a multipage document to server.
        /// </summary>
        /// <param name="filePath">Path to an image to process</param>
        /// <param name="taskToAddFile">Id of multipage document. If null, a new document is created</param>
        /// <returns>Id of document to which image was added</returns>
        public OcrSdkTask UploadAndAddFileToTask(string filePath, TaskId taskToAddFile)
        {
            string url = String.Format("{0}/submitImage", ServerUrl);

            if (taskToAddFile != null)
            {
                url = url + "?taskId=" + Uri.EscapeDataString(taskToAddFile.ToString());
            }

            // Build post request
            WebRequest request = createPostRequest(url);

            writeFileToRequest(filePath, request);

            XDocument  response = performRequest(request);
            OcrSdkTask task     = ServerXml.GetTaskStatus(response);

            return(task);
        }
        /// <summary>
        /// Upload a file to service synchronously and start processing
        /// </summary>
        /// <param name="filePath">Path to an image to process</param>
        /// <param name="settings">Language and output format</param>
        /// <returns>Id of the task. Check task status to see if you have enough units to process the task</returns>
        /// <exception cref="ProcessingErrorException">thrown when something goes wrong</exception>
        public OcrSdkTask ProcessImage(string filePath, ProcessingSettings settings)
        {
            string url = String.Format("{0}/processImage?{1}", ServerUrl, settings.AsUrlParams);

            if (!String.IsNullOrEmpty(settings.Description))
            {
                url = url + "&description=" + Uri.EscapeDataString(settings.Description);
            }

            // Build post request
            WebRequest request = createPostRequest(url);

            writeFileToRequest(filePath, request);

            XDocument  response = performRequest(request);
            OcrSdkTask task     = ServerXml.GetTaskStatus(response);

            return(task);
        }