/*
         * Format of request queue message:
         * <job job_id="{GUID}">
         *   <pauseForSeconds>{numberOfSecondsToDoWork}</pauseForSeconds>
         * </job>
         *
         * Format of response queue message:
         * <job job_id="{GUID}">
         *   <status>{bool: 0: false, 1: true}</status>
         * </job>
         */

        internal static JobA FromQueueMessage(IModel channel, byte[] messageBody)
        {
            XPathNavigator nav = null;

            using (MemoryStream ms = new MemoryStream(messageBody))
            {
                nav = new XPathDocument(ms).CreateNavigator();
            }

            JobA job = new JobA();

            job.Channel          = channel;
            job.State            = JobAState.Begin;
            job.JobXml           = nav.InnerXml;
            job.JobId            = Guid.NewGuid();
            job.StartTime        = DateTime.UtcNow;
            job.NumSecondsToWork = int.Parse(nav.SelectSingleNode("/job/pauseForSeconds").Value);
            job.FullPathAndFilenameToSerializedJob = Path.Combine(
                Environment.CurrentDirectory, "serialized-jobs", job.JobId.ToString() + ".xml");
            return(job);
        }
        internal static JobA FromSavedState(IModel channel, string pathFilename)
        {
            JobA job = new JobA();

            string[] serializedStateText = File.ReadAllText(pathFilename).Split(new char[] { ',' });

            XPathNavigator nav = null;

            using (StringReader reader = new StringReader(serializedStateText[1]))
            {
                XPathDocument xPathDoc = new XPathDocument(reader);
                nav = xPathDoc.CreateNavigator();
            }

            job.Channel          = channel;
            job.State            = (JobAState)Enum.Parse(typeof(JobAState), serializedStateText[0]);
            job.JobXml           = nav.InnerXml;
            job.JobId            = Guid.Parse(Path.GetFileNameWithoutExtension(pathFilename));
            job.StartTime        = DateTime.UtcNow;
            job.NumSecondsToWork = int.Parse(nav.SelectSingleNode("/job/pauseForSeconds").Value);
            job.FullPathAndFilenameToSerializedJob = Path.Combine(
                Environment.CurrentDirectory, "serialized-jobs", job.JobId.ToString() + ".xml");
            return(job);
        }