private byte[] BuildCommandPacket(string jobName, JsonJobVarsFile jobVars)
        {
            var         commandName = "SumitJob";
            XmlDocument xml         = new XmlDocument();

            xml.LoadXml(@"<?pf_command version=""1.0""?><pfjob:job_command xmlns:pfjob=""http://www.pageflex.com/schemas"" name=""" + commandName + @"""><pfjob:job_variables /><pfjob:doc_variables /></pfjob:job_command>");

            XmlNamespaceManager nsm = new XmlNamespaceManager(xml.NameTable);

            nsm.AddNamespace("pfjob", "http://www.pageflex.com/schemas");
            XmlNode doc = xml.SelectSingleNode("pfjob:job_command/pfjob:doc_variables", nsm);
            XmlNode job = xml.SelectSingleNode("pfjob:job_command/pfjob:job_variables", nsm);

            void AddVar(string name, string value, XmlNode node)
            {
                XmlNode spec = xml.CreateElement("pfjob", "var", "http://www.pageflex.com/schemas");

                spec.InnerText = value;
                XmlAttribute nameAttribute = xml.CreateAttribute("name");

                nameAttribute.InnerText = name;
                spec.Attributes.Append(nameAttribute);
                node.AppendChild(spec);
            }

            AddVar("JobName", jobName, job);
            AddVar("_sys_QueueName", "jobqueuname", job);
            AddVar("_sys_ClientJobMonitor", "True", job);
            AddVar("ProjectName", Path.Combine(_settings.MpowerProjectFolderRoot, jobVars.ProjectID), job);
            AddVar("_sys_FinalOutputDir", $@"{_settings.LocalDriveLeterForMpowerFinaloutput}\finaloutput", job);
            //AddVar("_sys_JobDataSourceFile", "a datasource for this job not the project", job);

            foreach (var name in jobVars.Specs.Keys)
            {
                AddVar(name, jobVars.Specs[name], doc);
            }

            return(System.Text.Encoding.Unicode.GetBytes(xml.OuterXml));
        }
        public async Task <JobRenderResponse> SubmitRenderJobAsync(JobQueueMessage jq, JsonJobVarsFile jobFile, Func <UserContext, string, Task> moveFileOpAsync)
        {
            var jobResponse = new JobRenderResponse {
                DateQueued = DateTime.Now, Success = false, ServerJobResponse = ""
            };

            try
            {
                this.Connect(_settings.MpowerHostName, _settings.MpowerTcpPort);
            }
            catch (SocketException ex)
            {
                jobResponse.ErrorMessage = "Mpower doesn't appear to be running on: " + _settings.MpowerHostName + " port: " + _settings.MpowerTcpPort + ". Error: " + ex.Message;;
                return(jobResponse);
            }
            Socket sock = this.Client;

            if (this.Active)
            {
                sock = this.Client;
            }
            else
            {
                jobResponse.ErrorMessage = "The Mpower socket has unexpectedly closed";
                return(jobResponse);
            }

            try
            {
                Byte[]        dataSend = BuildCommandPacket(jq.JobName, jobFile);
                NetworkStream stream   = this.GetStream();

                await stream.WriteAsync(dataSend, 0, dataSend.Length);

                sock.Shutdown(SocketShutdown.Send);                 // we're done sending
                //read response
                Byte[] dataRecv = new Byte[4096];
                while (null != sock && sock.Poll(-1, SelectMode.SelectRead))
                {
                    int bytes = await stream.ReadAsync(dataRecv, 0, dataRecv.Length);

                    if (bytes > 0)
                    {
                        jobResponse.ServerJobResponse += System.Text.Encoding.ASCII.GetString(dataRecv, 0, bytes).Trim('\0');
                    }
                    else
                    {
                        break;                          // Mpower disconnected the socket
                    }
                }
                sock.Shutdown(SocketShutdown.Both);
                sock.Close();
            }
            catch (Exception ex)
            {
                jobResponse.ErrorMessage = "Communication error with Mpower: " + ex.Message;
                return(jobResponse);
            }
            if (string.IsNullOrEmpty(jobResponse.ServerJobResponse))
            {
                jobResponse.ServerJobResponse = "No response from mpower server";
                return(jobResponse);
            }
            this.Close();

            jobResponse.Success = await FindPathAndMoveFileAsync(jq.UserContext, jobResponse.ServerJobResponse, moveFileOpAsync);

            return(jobResponse);
        }