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); }