2025 |
- We discovered that if you were doing a lot of text printing, it is possible that at unexpected times RPM will crash. It turns out that some print drivers, in certain stages, are simply not reentrant. Starting the connection to a device and closing it are particularly vulnerable, as most of the operations are just moving data around. We instituted a global lock for this.
- We discovered that outgoing telnet print jobs were not being marked with error if we were unable to connect to the remote printer.
- We no longer report each and every job retry attempt until it works or we can’t do it in the requisite number of attempts
- Better report failed attempts to use login credentials
- Sorting out job status for queues with more than one action; for instance, jobs are now marked “complete” only when all the actions are completed. Also, the job is marked “error” if any of the actions result in error.
- Totally refactored the timer processing
- The queue logic now handles the “keep max # of jobs” logic internally; this processing is much more streamlined than before
- Streamlined the diagnostic log management
- The Copy Queue action was not taking note whether the data size had changed, presumably due to one or more transforms
- We are now much more proactive and thorough when parsing the LPD control file, in particular looking for UTF-8 sequences vs plain ASCII vs LATIN-1 vs something that may potentially be the local default Windows code page; in the last two cases we use system commands to translate to UTF-8
- Greatly improved AppSocket’s ability to parse the beginning and end of a PJL print jobs sequence; this is essential when multiple jobs are sent on a single connection
- The user interface now offers a form to reset the database admin user and password, rather than relying on the end user to edit a batch file
- Rewrote the COR module
- Completely rewrote the text print module
|
2024 |
- Error messages now lean more toward saying what went wrong, rather than simply that an error occurred
- We’ve gone a long way away from keeping too much in memory, also plugging memory leaks
- Streamlined the job creation process, fewer steps, less file copying
- All the job receipt protocols respond immediately to changes in the UI
- If your system defines an alternate port 515 (which is LPD) we now log that
- Rewrote the job cache for the job manager
- PCL parse was eliminating white space at the top of a PCL file, because you’d think that PCL starts with Escape-E
- Print job orientation (portrait vs landscape) could be ignored
- Data files are now stored in the SPOOL folder, using the queue ID and reflecting which protocol plus date and time and a unique code
- Seems basic: don’t retry jobs if the queue is suspended
- RPM now does a more consistent job of processing “copies” when it’s part of the original LPD request
- We can now submit jobs to RPM via RPC, which is our internal communication between the UI and RPM. This uses Python, which simply connects, authenticates, and submits jobs as if it were the UI.
- Replaced the JSON module we’ve been using with a new one, with better performance, and more reliable
- Rewrote the timeout portion of the Telnet protocol manager and the timer logic
- We had managed to break the usage of “devmode” when loading actions; this is fixed
|
2023 |
- Reinstated support for device limits, one factor that contributes to deciding which job is the next job eligible to run
- More thorough cleanup for jobs that had previously errored, when we run the job again
- All incoming jobs are now spooled to a holding area and added to the RPM database as fast as possible. This keeps database performance from holding up receipt of new jobs, hence the “spooling” mission, where the network is faster (as it often is)
- If a critical event results in an email (which it would, by default), the email now includes the RPM version, Windows version, and product serial number, along with the other data
- Message log entries are spooled to disk and loaded as time allows
- File handling now handles a threaded environment better
- On startup, no longer reprint jobs that are in a queue due to job retention
- Better tracking of job completion for queues with multiple actions, as this means that a given job is actually multiple jobs
- Transform error handling is more robust; for instance, we now suspend a queue if a transform errors in the setup phase
- The launcher now looks for a new print job as soon as an executing job goes out of scope
- Upgrades to LPD processing when requests have multiple control files or multiple data files
- When processing metadata in LPD, ensure that all user fields are plain text or UTF-8
- Handling a critical event no longer generates another critical event if there is no email setup available
|
2022 |
- Some of these stretches back to 2021:
- We totally changed the way we process print jobs in threads. We used to make a thread, execute the job, and wait for the thread to finish, and then “join” the thread. We have since discovered that the C++ standard library allows us to start a thread and then get some notification when it finishes. The difference is that, in the first case, if the thread had an exception, we would never know, and ultimately, sometimes, the user ran out of job processing threads. Now we launch threads whenever there are available jobs to run, and we have not used up our job processing count.
- We now use up-to-date and modern methods of tracking programs we need to start, kind of like our jobs/threads philosophy
- LPD updates:
- Apparently, it’s a lost art to read the specifications and write a compliant print client, so we are more lenient in what we allow. The goal had been to force compliance to make it easier to block rogue testing probes.
- The full range of lpstat options has now been tested with all the lpstat clients we could find
- If the connection with the print client breaks, we now use the existing settings of “delete the job, error the job, or ignore the error” which we apply to size restrictions already
- Completely new folder watcher process
- The Timer manager now has its own startup thread, in case there are a large number of time events in the database (such as time to remove a job)
- If you used a hidden Windows share as a destination for archiving print jobs, RPM was failing; that is now fixed
|
2021 |
- The “From” address in outgoing emails now supports job data via Data Extraction
- Increased support for files with Unicode filenames and paths
- Fixed the issue where PJL emulations could be removed, rendering AppSocket unable to compose default responses to PJL queries
- Both Archive and folder watcher support files with Unicode filenames
|
2020 |
- Handled a case where the user had configured copying a job to a queue, with queue name determined by job data (via data extraction), and this required a new queue to be created (which is normal behavior), but “auto create” was turned off for queues.
- Diagnostic logging is now enabled for programs other than RPM (programs we ship, of course)
- RPM is now more proactive about creating critical directories on startup, in the case where the user has moved RPM to a new machine, without running the installer
- User login/logout is now logged to assist tracking possible updates to the overall configuration
- If actions and transforms are disabled on configuration export, they will be disabled on import
- Only allow the setting “logon as batch user” if the user is an administrator
- When you open the user interface, it automatically checks our website for updates to the RPM version
- The ongoing battle with security scanners
|
2019 |
- We refactored the way we add jobs to the database, and sped that process up considerably. This also recovers any jobs that were not added to a previous instance of RPM, for any reason.
- RPM now generates a critical event every 100,000 jobs, advising the user to run database maintenance. This is not really an error, and we should find a nicer way of doing this, as some users have been concerned.
We revised how LPD works in these two situations: - When we receive a job for a queue that doesn’t yet exist, but “auto-create” is false
- When we receive a job for a queue that is disabled
In these instances, we generate an error for the client. We tested this with the Microsoft LPR, which most of our customers would have, and it acknowledged the error. - If the user selects a font which is not compatible with “text to P DF” we now select “Courier New” rather than failing Raw print to a printer with a class driver now works
- Added Server 2019 support
- The Archive action (save to folder) now writes the job to a temp file first, in case we are not processing all the data at once. This keeps 3rd party folder watchers from attempting to grab the archived file before it’s complete.
- LPD update: we added the client IP address to the job’s metadata to help a client track down what software, in their system, was sending print jobs directly to the LPD port (rather than using the protocol)
- Somewhat more lenient on which fonts we accept for generating PDFs
- Again added more PJL commands to AppSocket; also added the “format” property to the job metadata; also added the job’s username to the output PJL commands when generating PCL for a print job
- Fixed an issue with the folder watcher, Queue Folders, waiting on locked files
|
2018 |
- RPM stores all passwords encrypted; while the program is running, we of necessity need to decrypt that password, but we’ll zero the memory immediately after using the cleartext password
- Deployed the new LPD module we’ve been working on for several months
- Added support for the Microsoft LPR client and its insanely large “byte count.”
- Upgraded our file I/O logic with something that seems to perform more reliably under stress
- The message log now works in its own thread, so as not to impact system performance, even with high detail logging
- Message log maintenance now happens based on time, not with the addition of every log record
- Added support to report the OS version for Windows 10 and Server 2016
- The folder watcher no longer supports shared folders, but only local
- The diagnostic log now sets 4 values to ‘true’, so we can at least log RPM startup and shutdown, by default
- Now making the effort to support the latest versions of Windows, and not focusing primarily on the oldest versions
- In the UI, we will no longer allow the user to remove queues that are used as a landing place for the Telnet protocol, or a “copy queue” action
- RPM no longer installs on Windows XP; Vista and later are still supported
- When we are processing jobs, we will now process the transforms up front if there are two or more actions enabled for that queue
- Rewrote the LPR and IP send programs; they now can easily support thousands of jobs
- Version release, 6.2
- We are now less aggressive about cleaning up “illegal” characters from the data file name in the control file; a customer using Red Hat Linux Enterprise was running into problems. The data file name is more or less commentary for us on Windows.
- We now separate receiving the print job(s) via LPD from creating them in the database, as the network can be much faster than database operations. This is a major upgrade in speed.
- Version 2 of Queue Folders, the folder watcher
- Updates to the LPD protocol to better handle “probes” which seem constant these days
- Added copyable fields to the About dialog box, which would make it easier to contact our support and supply information about your RPM license
- In Queue Folders (the folder watcher), we can add non-ASCII filenames, but they still must be UTF-8
- Queue Folders 2.0 official release
- When you add an action to a queue that had no actions, the UI now asks if you want to resume that queue
- Various enhancements and fixes to the device tester
- If you ask Windows to create a file, for instance, if you “open for write”, you can’t depend on Windows to get around to that right away
- Created a new notification category, Critical Events
- When a device fails in the device tester, we now set the error text to the Windows error message rather than “open printer” or similar
- The device tester now uses critical events for broader reporting
- We stumbled upon a way to increase database performance by doing a “sweep” every 5,000 jobs
|
2017 |
- Prioritizes starting print jobs that have been suspended or in an error state, as soon as those are cleared
- The service and the user interface coordinate and communicate much more
- Remove the queue if it was created by a job that requested it, if the job never in fact arrives
- Data recognized by the data extraction process is now stored in the JOBS table in an OVERRIDES column
- When resolving a hostname, target all the DNS servers configured until we get a response
- The device tester will now attempt to connect to an outbound IP printer and not merely ping it
- Increased ability to handle LPR “probes” which connect but don’t submit any job info
- Complete rewrite of the Telnet protocol module
- The user interface now notifies the service when the user manually reprints a job, and the service notifies the UI if it reprints a job for any reason
- Bidirectional printing, aka AppSocket, now has its own setup independent of Telnet
- More attention is paid to UTF-8 as part of incoming job protocols, e.g., LPD
- Added support for undocumented but valid PCL codes when removing PCL
- Accommodating nuances used by an open source print client when sending multiple print jobs
- Addressed incompatibilities between Windows ‘lpstat’ and Ubuntu’s version
- Working to upgrade the LPD module for better reliability and performance
- Job retry now includes a retry count and a maximum value
- Reengineering certain aspects of file reading and writing under heavy system load
- Substantial updates to the text print module
- On startup, RPM now removes any jobs with the “REMOVE_AT” set to a time in the past; this is handled automatically if the expiry happens while RPM is running
- The retry count is reset to zero if the user explicitly reprints a job
- Certain print drivers were reporting an error in the EndPage logic when there was no actual error
- The autocalc function was returning the wrong line length when the line contained overstrikes
- LPD now supports AS/400-specific LPD subcommands
- Eliminated code specific to Windows 2000 and prior
- For telnet printing, generate a default job name if the configuration does not generate one
- Added a ‘capture’ feature to the LPD protocol; this way, we can get the LPD commands sent to RPM by the print client, without
- copying any actual data. We can replay these commands ourselves to discover any ways that we are mishandling the client's commands
- Devices, queues, etc., are now removed from the priorities table when they are removed from their own tables
- Changed the idea of “data size” in the new LPD module to be aware that we sometimes get “extra” data from the client, e.g., additional null characters at the end
- Print data from the actual data file can now be used in command lines, via data extraction
|
2016 |
- Continue to improve the process where jobs error or stall, particularly recovering such jobs
- Added more functionality to the data extraction feature, including assigning the output file based on data in the actual print job
- More control file processing from systems with proprietary LPD formats
- Copy job to Queue now supports naming the destination queue based on data in the print job
- Increased availability of diagnostic information, when something fails
- Archive Job to Folder can now use data from the print job
- Increased the number of SCS features we can support; SCS is a complex print format, and we base the capabilities of our text printing model on that
- Added database maintenance scripts to the install folder, so you don’t need to depend on the user interface alone
|
2015 |
- Added support for more than 64 simultaneous connections, from clients sending files
- Added XML support for configuration export
- Improvements to PDF creation
- Upgrades to regular expression support in string translators
- Increased support for interactive processing by warning user that the specified person would need to be logged in to that system, and hopefully using a Windows display of some sort
- Increased support for job retry
- Added support for rejecting jobs smaller than a user-specified threshold
- Server 2008 replaces Server 2003 on the support list
- Text Markup now recognizes six digits of precision on margins, for users working with millimeters
- Automatically run the command shell if the program the user configures to run on a print job is a batch file
|
2014 |
- Continued to make various improvements to RPM handling high load
- More work to distinguish device error from job error; if the device is restored, the job should be ready to execute again
- Various database improvements
- Added a terminal services module to track user logins and logouts; we can support interactive processes properly by waiting for the user to log in
- Increased UTF-8 support
- Continuing to adapt to the way some print clients send multiple jobs, and client “oddities” in general
- Server 2000 is officially unsupported now; leaning on XP, Server 2003, and Windows 8.1
- String translator now supports multi-line
- Improvements to PJL support, emulating more commands
- More upgrades to job scheduling, significant upgrades to job launcher
- Fixes and upgrades to job copies logic
- Introduced diagnostic logging
|
2013 |
- RPM version 6.0 officially released. This completes a significant effort in modernizing the service. Queues now support multiple actions, not only multiple transforms. The job scheduler is now properly architected. See this page for RPM 6 highlights
- Actions and transforms can now be disabled and enabled, and will immediately affect job processing
- Added support for bi-directional job input, aka PJL or Jet Direct. This is a Q&A print methodology developed by HP and widely used on high-end printers. We refer to it as AppSocket in order not to trample on anyone’s trademarks. Please see AppSocket for more information
- Added both a folder watcher and an outgoing FTP action
- Upgraded from Firebird 2.1 to 2.5
|
2012 |
- Primarily architecting and developing version 6.0, from version 5, while supporting the customer base. Version 6 is a major upgrade.
|
2011 |
- RPM now prioritizes UTF-8 as inputs for PDF and text printing
- Considerable logging updates, including using a local database rather than the Windows Event log. People were not expecting to look at the event log. We also export the event log to a CSV file on service exit.
- Updates to exporting and importing your RPM configuration
- RPM now includes several external XML configuration files, for instance, for email setup and database location
|
2010 |
- June: ExcelliPrint 4.0 is released, includes searchable PDFs (text embedded in output PDF), print to email by sending jobs like RPM, plain text output for generating text files with job data, using job for filenaming, PCL tray mapping and more.
- October: INTELLIscribe 4.1 is introduced. It runs on Windows 7 and supports 64-bit as well as 32-bit. Several problems are also addressed, including displaying and using a reasonable file name if the file was dragged onto the user interface, and shutdown problems.
- October: RPM version 5.1 is released, including upgrades to the Unicode support for printer names, folder names, font names, etc.; PDFs now support UTF-8; database changes; support for auto-calculating a file metrics to optimize printing, without manually filling in the font sizes; and many others
- Company's fifteenth anniversary.
- December: added underlay as an option for watermarks on print jobs
|
2009 |
- December: RPM 5.0 Elite is released (the beta label is removed). One of the final hurdles is negotiating an OEM license for the PCL to PDF translator and integrating.
- Spent much of the year adding functionality to RPM Select, and adding new Elite-specific functionality.
|
2008 |
- May: RPM 5.0 (Select) is introduced. This is a complete rewrite and has gone on behind the scenes for several years.
- RPM Elite (beta) is available. We have a large slate of features to add to Elite, unlike before where it was mostly the number of printers. RPM 5.0 development continues while new features are added to Elite.
|
2007 |
- ExcelliPrint 3.2 released; it runs on Vista. Overall we had very little request to run on Vista, though we incorporated Microsofts "new" security model into the ongoing design of RPM 5.0
- March: INTELLIscribe runs on Vista; actually, on Windows 2000 through Vista. We no longer support Windows NT and prior.
|
2006 |
- March: ExcelliPrint version 3.0 update, includes more output destinations, more color support, more code pages
- May: ExcelliPrint update includes bundled fonts and other fixes to barcodes
- Also in May: INTELLIscribe 3.2 update includes better handling of inactive connections and large sets of data
- August: ExcelliPrint 3.1 update includes PCL fixes
|
2005 |
- January: ExcelliPrint 2.0 (first version) is introduced; this is our IPDS printing software
- June: INTELLIscribe 3.2, includes increased drag and drop support (between queues, from Windows Explorer to INTELLIscribe GUI), and much more
- Company's tenth anniversary
|
2004 |
- RPM updates include: XP support, and support for the euro character
- June: INTELLIscribe 3.1 released
- October: INTELIscribe update, includes SLP support, printing failed jobs to any destination, and specifying # of attempts to print before job fails
|
2003 |
- RPM updates continue, including where we worked on the user interface to get the updates happening in almost no time. More and more people are testing RPM under significant load and reporting their findings to us.
- June: INTELLIscribe 3.0 now supports XP, NT and Windows 2003. We are nearing the end of NT support for all our products. Added port policies for Round Robin and Destination Balancing.
|
2002 |
- August: RPM version 4.5 is introduced. Elite version includes web interface using Microsoft IIS, which we call the RPA ("Remote Print Administrator"). RPM 4.5 is our longest selling product (through May 2008).
- October: RPM update includes adding secure sockets (SSL) to web interface, the RPA
- November: RPM update includes PCL code removal and page range printing
|
2001 |
- September: Reseller and referral discounts which have been ad-hoc since 1998 are now codified; we start an official reseller program, complete with manager
|
2000 |
- April: RPM version 4.0
- June: we switch RPM "workstation" to Select and "server" to Elite. NT is catching on; Windows 3.1 is pretty slow and Windows 95/98 tapering off as well
- July: many of our Elite sales are conversions from Windows 95/98 versions
- Company's fifth anniversary
|
1999 |
- March: INTELLIscribe 1.5 is released
- April: first NT version of RPM, in "workstation" and "server" configurations (precursor to Select and Elite), version 2.3
- April: INTELLIscribe 1.6 is released (that's quick turn-around)
- November: RPM version 2.4
|
1998 |
- June: RPM version 2.2; educational site licenses
- Also in June: released INTELLIscribe version 1, our LPR client
- Dave's first international reseller trip, to Germany
|
1997 |
- February: first wire transfer for international payment
- Took over the suite next door; set up our first file and print servers in-house
- November: five and ten packs (discounts for bundles)
|
1996 |
- February: RPM version 2.1 for Windows 3.1
- March: first educational site license
- April: first international reseller, Robert Baker in Ireland
- August: first version of RPM for Windows 95, version 2.1
- October: moved to our present building, Exchange Plaza in Idaho Falls, ID
- November: RPM version 2.2
|
1995 |
- August: Dave Brooks files incorporation papers for Brooks Internet Software, Inc, with the State of Idaho.
- September: receive federal tax payer ID for the corporation; web site goes live, according to Alexa.com
- November: RPM version 1.2 for Windows 3.1 platforms is released. First week, sales on East and West coast of United States; Canada; and Australia
|