/// <summary> /// repeatedly get the printer status until with printer status contains /// a valid windows jobID. /// </summary> /// <returns>zero if any error detected, or the windows jobID</returns> public static int WaitForWindowsJobID(BidiSplWrap bidiSpl, string printerName) { const int sleepMilliSeconds = 1000; var printerStatusXML = bidiSpl.GetPrinterData(strings.PRINTER_MESSAGES); var printerStatus = Util.ParsePrinterStatusXML(printerStatusXML); do { if (0 != printerStatus._windowsJobID) { Console.WriteLine(string.Format("returning windowsJobID {0}.", printerStatus._windowsJobID)); return(printerStatus._windowsJobID); } Console.WriteLine(string.Format("waiting {0} millseconds for windows jobID", sleepMilliSeconds)); Thread.Sleep(sleepMilliSeconds); printerStatusXML = bidiSpl.GetPrinterData(strings.PRINTER_MESSAGES); printerStatus = Util.ParsePrinterStatusXML(printerStatusXML); } while (0 == printerStatus._errorCode); Console.WriteLine("printer error:"); Console.WriteLine(printerStatusXML); return(0); }
/// <summary> /// repeatedly check job status until the job is complete - failed or not. /// </summary> public static void PollForJobCompletion(BidiSplWrap bidiSpl, int printerJobID) { const int pollSleepMilliseconds = 2000; while (true) { string printerStatusXML = bidiSpl.GetPrinterData(strings.PRINTER_MESSAGES); PrinterStatusValues printerStatusValues = Util.ParsePrinterStatusXML(printerStatusXML); if ((0 != printerStatusValues._errorCode) && (printerJobID == printerStatusValues._printerJobID)) { string message = string.Format("{0} severity: {1}", printerStatusValues._errorString, printerStatusValues._errorSeverity); throw new BidiException(message, printerStatusValues._printerJobID, printerStatusValues._errorCode); } string jobStatusRequest = strings.JOB_STATUS_XML; string jobInfoXML = string.Format(jobStatusRequest, printerJobID); string jobStatusXML = bidiSpl.GetPrinterData(strings.JOB_STATUS, jobInfoXML); JobStatusValues jobStatusValues = Util.ParseJobStatusXML(jobStatusXML); Console.WriteLine("Printer job ID: {0} {1}", printerJobID, jobStatusValues._jobState); if (strings.JOB_ACTIVE != jobStatusValues._jobState) { return; } Thread.Sleep(pollSleepMilliseconds); } }
/// <summary> /// Cancel a job started by StartJob(). /// do not throw any exceptions. /// </summary> public static void CancelJob(BidiSplWrap bidiSpl, int printerJobID, int errorCode) { string xmlFormat = strings.PRINTER_ACTION_XML; string input = string.Format(xmlFormat, (int)Actions.Cancel, printerJobID, errorCode); bidiSpl.SetPrinterData(strings.PRINTER_ACTION, input); }
public static void EncodeMagstripe(BidiSplWrap bidiSpl, bool jisRequest, String track1, String track2, String track3) { // Hardcoded XML to encode all 3 tracks in IAT mode. // track 1 = "TRACK1", track 2 = "1122", track 3 = "321" string trackDataXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<magstripe>" + "<track number=\"1\"><base64Data>" + Convert.ToBase64String(Encoding.ASCII.GetBytes(track1)) + "</base64Data></track>" + "<track number=\"2\"><base64Data>" + Convert.ToBase64String(Encoding.ASCII.GetBytes(track2)) + "</base64Data></track>" + "<track number=\"3\"><base64Data>" + Convert.ToBase64String(Encoding.ASCII.GetBytes(track3)) + "</base64Data></track>" + "</magstripe>"; if (jisRequest) { // JIS only allows track 3 = "321" //trackDataXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" //+ "<magstripe>" //+ "<track number=\"1\"><base64Data></base64Data></track>" //+ "<track number=\"2\"><base64Data></base64Data></track>" //+ "<track number=\"3\"><base64Data>MzIx</base64Data></track>" //+ "</magstripe>"; } // replace schema string MAGSTRIPE_ENCODE to MAGSTRIPE_ENCODE_FRONT for front side encode string printerStatusXML = bidiSpl.SetPrinterData(strings.MAGSTRIPE_ENCODE, trackDataXML); PrinterStatusValues printerStatusValues = Util.ParsePrinterStatusXML(printerStatusXML); if (0 != printerStatusValues._errorCode) { throw new BidiException(printerStatusValues._errorString, printerStatusValues._printerJobID, printerStatusValues._errorCode); } bidiSpl.SetPrinterData(strings.ENDJOB); }
public static String[] ReadMagstripe(BidiSplWrap bidiSpl, bool jisRequest) { String[] magData = new String[3]; // replace schema string MAGSTRIPE_READ to MAGSTRIPE_READ_FRONT for front side read string printerStatusXML = bidiSpl.GetPrinterData(strings.MAGSTRIPE_READ); PrinterStatusValues printerStatusValues = Util.ParsePrinterStatusXML(printerStatusXML); if (0 == printerStatusValues._errorCode) { // Console.WriteLine("Magstripe data read successfully; printer job id: " + printerStatusValues._printerJobID); string track1 = ""; string track2 = ""; string track3 = ""; Util.ParseMagstripeStrings(printerStatusXML, ref track1, ref track2, ref track3, jisRequest); bidiSpl.SetPrinterData(strings.ENDJOB); if (track1.Length != 0) { // Convert the Base64 UUEncoded output. byte[] binaryData = System.Convert.FromBase64String(track1); string str = System.Text.Encoding.UTF8.GetString(binaryData); magData[0] = str; } if (track2.Length != 0) { // Convert the Base64 UUEncoded output. byte[] binaryData = System.Convert.FromBase64String(track2); string str = System.Text.Encoding.UTF8.GetString(binaryData); magData[1] = str; } if (track3.Length != 0) { // Convert the Base64 UUEncoded output. byte[] binaryData = System.Convert.FromBase64String(track3); string str = System.Text.Encoding.UTF8.GetString(binaryData); magData[2] = str; } } else { throw new BidiException(printerStatusValues._errorString, printerStatusValues._printerJobID, printerStatusValues._errorCode); } return(magData); }
/// <summary> /// /// Issue an IBidi StartJob with xml markup to start an IBidi print job. /// /// We do this to have the printer check for supplies, or, just to obtain the /// printerJobID for job completion polling later. /// /// If the printer is out of supplies, throw an exception. /// /// </summary> public static int StartJob( BidiSplWrap bidiSpl, bool checkSupplies, string hopperID) { const int pollSleepMilliseconds = 2000; int printerJobID = 0; do { string printerOptionsXML = bidiSpl.GetPrinterData(strings.PRINTER_OPTIONS2); PrinterOptionsValues printerOptionsValues = Util.ParsePrinterOptionsXML(printerOptionsXML); int checkPrintRibbon = (printerOptionsValues._printHead == "Installed") ? 1 : 0; int checkEmbossSupplies = printerOptionsValues._moduleEmbosser == "None" ? 0 : 1; string startJobXml = string.Format( strings.STARTJOB_XML, hopperID, checkPrintRibbon, checkEmbossSupplies); string printerStatusXML = bidiSpl.SetPrinterData(strings.STARTJOB, startJobXml); PrinterStatusValues printerStatusValues = Util.ParsePrinterStatusXML(printerStatusXML); if (506 == printerStatusValues._errorCode) { // Printer cannot accept another job as it is busy. Try again. Console.WriteLine("StartJob(): {0} Trying again.", printerStatusValues._errorString); // let the current card process in the printer: Thread.Sleep(pollSleepMilliseconds); } else if (0 != printerStatusValues._errorCode) { var message = string.Format("StartJob(): {0} {1}", printerStatusValues._errorCode, printerStatusValues._errorString); throw new BidiException(message, printerStatusValues._printerJobID, printerStatusValues._errorCode); } else { Console.WriteLine("Printer job ID: {0} started.", printerStatusValues._printerJobID); printerJobID = printerStatusValues._printerJobID; } } while (0 == printerJobID); return(printerJobID); }
public static void PrintTextAndGraphics(BidiSplWrap bidiSpl, string printerName) { PrintDocument printDocument = new PrintDocument(); printDocument.PrintController = new StandardPrintController(); printDocument.PrinterSettings.PrinterName = printerName; printDocument.DocumentName = Path.GetFileName(Environment.GetCommandLineArgs()[0]) + " printing"; printDocument.PrintPage += new PrintPageEventHandler(OnPrintPage); printDocument.Print(); // we wait here - to ensure that the job is truly in the windows // spooler: var windowsJobID = WaitForWindowsJobID(bidiSpl, printerName); }
public static void PrintTextAndGraphics(BidiSplWrap bidiSpl, string printerName, String whattoPrint) { whatsPrinting = whattoPrint; PrintDocument printDocument = new PrintDocument(); printDocument.PrintController = new StandardPrintController(); printDocument.PrinterSettings.PrinterName = printerName; printDocument.DocumentName = "Test Print"; printDocument.PrintPage += new PrintPageEventHandler(OnPrintPage); printDocument.Print(); // we wait here - to ensure that the job is truly in the windows // spooler: var windowsJobID = WaitForWindowsJobID(bidiSpl, printerName); }
/// <summary> /// constructor. /// </summary> /// <param name="bidiSpl"> /// an instance of a BidiSplWrap object, bound to a printer name. /// </param> public SCard(BidiSplWrap bidiSpl) { _bidiSpl = bidiSpl; }