Closed Bug 6810 Opened 25 years ago Closed 17 years ago

[ps] UNIX printing should set the correct title (e.g. -T option)

Categories

(Core :: Printing: Output, enhancement, P3)

All
Linux
enhancement

Tracking

()

RESOLVED INVALID
Future

People

(Reporter: roland.mainz, Unassigned)

References

Details

Attachments

(1 file, 3 obsolete files)

Unix printing should launch lp/lpr with a title (that banner pages get a more
usefull info than "job xxxx", for example).

Maybe this can be implemented by printf-Style formattings:
%t  Page title (be carefull with the charset; maybe page charset must be
converted to system charset, chars like " must be escaped...)
%f  Page file (e.g. xxx.html)
%u  URL

----

The default should be
lpr -T "%t"
(for BSD systems like Linux)

lp -t "%t"
for Solaris (System 5 !?) OSes
Status: NEW → ASSIGNED
Target Milestone: M8
This issue still occurs in the June 30th Build (1999063009).
Target Milestone: M8 → M9
Assignee: dcone → syd
Status: ASSIGNED → NEW
Target Milestone: M9 → M10
This is just for you.
????
What is for me ? And who is "me" ??
Blocks: 11275
Target Milestone: M10 → M11
I'll look into this for M11.
Group: netscapeconfidential?
Group: netscapeconfidential?
What is the problem with this feature ?

The implementation should be easy:
(java pseudo-code:)
-- snip --
String s = doc.getTitle();
String cmdstring = "lp -t \" + s + "\";
runtime.runCmd( cmdstring, stdin, postscriptOut, stderr );
-- snip --

The only thing we should take care is that the title is correctly escaped that
special chars won't be interpreted anything else than a title...
Sorry for the spam, changing QA contact on printing bugs to our new printing
tester, Shrirang!
Mass moving these bugs to M13
Target Milestone: M13 → M15
Moving Syd's non-PDT+ bugs to M15 to indicate that he will not have time to get
to them for Beta.
OK, then please tell me where to get the following things:
- The current page title, e.g. something like getPageTitle()
- A encoder which transforms the page encoding into the local encoding
Then I'll write this little piece of code...
Even if I cannot get the title/URL/etc. in the script to print the page, the
postscript code for it should contain the same information as the windows
version (URL, Title, Page number, Date, etc). I just don't get why Netscape for
Windows has these since ever and Unix doesn't. It's not that it would be hard to
add this :-(
Moving to M20
Target Milestone: M15 → M20
To digulla@hepe.com: Printing banner (info), page number etc. is the job of the
print system and should not be part of Mozilla itself. 
In Unix/X11 the Xprt (X print server) or a special filter in the lp-printsystem
would be the location where to "enable" page count/number printing...
So that's why Unix and Windows printouts differ: Mozilla just passes this
information to the Windows printer and omits it on Unix. In that case, you
really have to put these information into ENV variables or replace specific
parts of the commandline (as suggested in the first post in this thread).
assigning to kevin 
Assignee: syd → kmcclusk
Status: ASSIGNED → NEW
Reassigning to waqar
Assignee: kmcclusk → waqar
Depends on: 62125
Depends on: 67096
spam : changing qa to sujay (new qa contact for Printing)
QA Contact: shrir → sujay
Setting milestone to future.
Target Milestone: --- → Future
RM> To digulla@hepe.com: Printing banner (info), page number etc. is the job of the
RM> print system and should not be part of Mozilla itself.
RM> In Unix/X11 the Xprt (X print server) or a special filter in the lp-printsystem
RM> would be the location where to "enable" page count/number printing...

  I don't think that's the case. You might be right if what the printer
system is handed over is just a plain text file. Then, the printing system
can do whatever it wants to do (adding header, footer with page number,
title, etc). However, what Netscape gives the printing system is, in
Unix/X11, a postscript file. Do you think the printer system has to/can
manipulate this postscript file (e.g. resizing the whole page and adding
header and footer)?  Things like n-page up, duplex printing, banner page
with title are certainly in the realm of the printing system. However,
adding headers and footer with the page title, page number, date, the
URL of the page has to be taken care of by Mozilla. Please, also note
that Unix/X11 version offers a way to print to a file. If the printing
system has to add header and footer, PS file obtained by 'printing to
a file' would be different from the hardcopy.


AD> So that's why Unix and Windows printouts differ: Mozilla just passes this
AD> information to the Windows printer and omits it on Unix. In that case, you
AD> really have to put these information into ENV variables or replace specific
AD> parts of the commandline (as suggested in the first post in this thread).

  I guess your original question is still valid. I've been also wondering
why Windows version of NS can add date, page number, URL (which is very
handy), title while Unix/X11 version can't.

  When I printed out with 2001-04-03 build for Linux, I was pleasantly
suprised to see the page title, page number ( x of y ) and date (current)
were printed in header and footer. However, there's still one item
missing which is present in print-out of MS-Windows version, which is
the URL of the page being printed. Now, I got really curious as to why
on earth  MS-Windows version can print all four items (title, url, date,
and page number) while Unix/X11 version can only three of them (title,
date and page number). I guess this(printing out URL as well in Unix/X11
version of Mozilla) should be an easy fix.

   Jungshik Shin
OT: Who wrote the header/footer stuff for Unix ? I currently have much "fun"
with this feature because it breaks a lot of stuff in Xprint (header/footer font
is incredibly large (~~1/6 of page height)... ;-((
Xprint module now supports this feature without problems...
OS: Solaris → Linux
Hardware: Sun → All
bulk reassigning Waqar's bugs to Don.
Assignee: waqar → dcone
rods:
Any idea how we can implement this ?
-> I think this is a UI issue on linux.. is this fixed already?
Assignee: dcone → rods
Roland, please check if this is fixed...thanks.
No, this has not been fixed.

This bug is about setting the print jobs title for the print spooler. Currently
we include the title in the page itself but to not pass it to the print spooler
system.
Updating summary, this is PostScript-module only; feature is working in Xprint
module...
Summary: UNIX printing should set the correct title (e.g. -T option) → [ps] UNIX printing should set the correct title (e.g. -T option)
Blocks: 157675
It looks like this should be fairly easy to implement.  Simply extend
nsPostScriptObj::settitle() to set an environment variable holding the document
title (say MOZ_DOCUMENT_TITLE), with code similar to that used to set
MOZ_PRINTER_NAME in nsPostScriptObj::Init().  As with the Xprint code, the title
would need to be converted from UCS2 first.

Then it is a simple matter of modifying print.postscript.print_command in
unix.js to include '-J "${MOZ_DOCUMENT_TITLE}"' in the print command.
This patch sets MOZ_DOCUMENT_TITLE to the title of the document (duh), using
nsIPlatformCharset and nsIUnicodeEncoder to convert from PRUnichar to native
encoding.
It does _not_ make it suitable for inserting in a command line, so the patch is
not ready for checkin.
Just looking for some feedback.

(This is also my first c++-ish patch, so there may well be horrible things in
it.)
Attachment #139469 - Flags: review?(Roland.Mainz)
In what way is the environment variable set by the patch not suitable for use on
a command line?  The whole point of using an environment variable here (as
opposed to substituting in the document title directly) is so it can be used on
the command line without worrying about shell quoting issues.

The shell should just pass "${MOZ_DOCUMENT_TITLE}" to lpr as a single argument
(unevaluated), no matter whether it includes spaces, quotes, dollar signs or
other punctuation.  You can test this quite easily with a few Python scripts,
for example:

--- Start printargs.py ---
#!/usr/bin/python
import sys; print sys.argv
--- End printargs.py   ---

--- Start call-system.py ---
#!/usr/bin/python
import os
os.environ["MOZ_DOCUMENT_TITLE"] = "abc def \" \" `echo foo` $USER"
os.system("./printargs.py \"${MOZ_DOCUMENT_TITLE}\"")
--- End call-system.py   ---

(I chose Python here because it doesn't do any special substitutions in strings
itself).  If you run the second program, it should show that the first was
called with only a single argument and none of the potentially evil characters
got touched.
Ok, let me rephrase that, I did not check it to be suitable for use in a command
line. (=
I think we should at least check it's length before passing it to system.

If that's not a problem, we still have the design issue, setting environment
variables is not a particulary nice way to do this. One solution could be to set
the variables on the same command line ("MOZ_PRINTER_NAME=sumthin
MOZ_DOCUMENT_TITLE=\"a title\" lpr <und so weiter>").
When you do that, why not 
 
	lpr -T$(title) 
 
? When Mozilla prints the page, it could expand some variables (like $(title), 
$(url), $(date)) in the command which would allow for some very sophisticated 
things. 
 
As for whitespace and variable processing (example: The title of the document 
is "make $$$ fast" -> "lpr -Tmake $$$ fast"), mozilla should first split the 
print command into words (space delimited) and then call execv(const char 
*path, char *const argv[]);. 
re #31:
Problem is, we don't want to pass on -T if there is no title, just as we don't
want to pass -P if we don't want to specify a printer.

> which would allow for some very sophisticated things. 
Sophistication is not the goal here, IMHO. Simple, clean code is. Right now
popen()/system() or whatever seems to be a lot simpler than exec*(). Let /bin/sh
do the dirty work instead of us reinventing the wheel.
This bug hasn't had activity for quite a few months, so excuse me if I'm
digging up a corpse. But I wanted to add that this feature would be extremely
useful for people who print to community printers. These print systems, which
are used by hundreds or thousands of people, often print cover pages which
include the job title (along with the print date, user name, etc.). Right now,
the job title is nondescript (to be exact, it says "stdin"). I can see this as
a particular inconvenience for users at universities (as myself) and
businesses, among others.

I've attached an update to the previous patch, so that it applies cleanly.
Unfortunately, I'm not at all qualified to back up its validity. Just hoping I
might encourage someone else who knows better.
Comment on attachment 139469 [details] [diff] [review]
Partially implements MOZ_DOCUMENT_TITLE, see comment #27

obsoleted by new patch
Attachment #139469 - Attachment is obsolete: true
(In reply to comment #33)
> This bug hasn't had activity for quite a few months, so excuse me if I'm
> digging up a corpse. 

The reason I didn't push my patch was that Someone was rewriting the ps module.
Right now it's sort of messy, with lots of global variables, env variables,
etc.. Which makes it impossible to print several documents simultaneously and
stuff. My patch added more globals and sort of made the change to a new ps
even harder, so I dropped it.

Now it seems like nobody cares(?) about postscript, so maybe some "bad" code to
fix a problem is the way to go. I still think somebody should check it for 
security reasons, though. (The XXX in the patch.)
I think the XXX can be removed.  Since the document title is in an environment
variable, if the print command is written appropriately, the string shouldn't
get interpreted by the shell.

The appropriate print command would look something like this:

  lpr ${MOZ_PRINTER_NAME:+'-P'}${MOZ_PRINTER_NAME} \
      -T "${MOZ_DOCUMENT_TITLE:-Mozilla: Untitled Document}"

This way, lpr will be passed 2 or 3 arguments (depending on whether
$MOZ_PRINTER_NAME is set), no matter what characters are in $MOZ_DOCUMENT_TITLE
(it also provides a slightly nicer document title in the case where no title is
set).
(In reply to comment #35)
> Now it seems like nobody cares(?) about postscript, so maybe some "bad" code to
> fix a problem is the way to go. I still think somebody should check it for 
> security reasons, though. (The XXX in the patch.)

Actually, I'm hoping to work on this during the gecko 1.9 development cycle, by
adding a print job class that can construct an lpr command rather than just
setting some environment variables and launching an opaque command. See bug
135695 comment 20.

I'd prefer not to add any more environment variables to the classic printing
support, though I'm not absolutely opposed to it. Any new code should definitely
support multiple simultaneous print operations though, which means treating the
environment as a shared resource. If you want to pursue this, you should look at
gfx/src/ps/nsPrintJobPS.cpp, specifically the nsPrintJobPipePS class and the
environment-handling functions toward the end of the file.
Attachment #139469 - Flags: review?(roland.mainz)
Hopefully this should work with multiple simultaneous print jobs.
But it's a one-night-job so please be merciful. (:
Adding a global here, for unicode->native charset(locale) conversion of title.
Attachment #187366 - Flags: review?(kherron+mozilla)
also changed the lpr and lp lines as in comment #36.
Attachment #176614 - Attachment is obsolete: true
Attachment #187366 - Attachment is obsolete: true
Attachment #187379 - Flags: review?(kherron+mozilla)
Attachment #187366 - Flags: review?(kherron+mozilla)
Comment on attachment 187379 [details] [diff] [review]
Same patch + cleaning up our mess (add nsMemory::Free)

Alge,

To start with, I think it'd be better design to set MOZ_DOCUMENT_TITLE for
every print job, rather than setting it only for jobs that have a title. In
reality, virtually every print job has a title, so I'd rather not junk up the
model command line with the fallback title logic. Also, the fallback title
should not contain "Mozilla"; see bug 293268 and bug 285696.

It looks like you're leaking the unicode encoder object. EnvLockInit()
unconditionally creates a new encoder for every print job, and it's not freed
anywhere. Also, based on other uses of unicode encoders, it looks like you
should set the encoder's error behavior with SetOutputErrorBehavior().

I don't know how large this encoder object is, or how expensive it is to
initialize it. I also don't know if it's possible for the local character set
to change while mozilla is running. I suspect it'd be better to allocate an
encoder for each print job, rather than allocating it once and caching it for
reuse. If you take that route, you should store the encoder in an nsCOMPtr<>
instead of a raw pointer.

Personally, I think I'd do the character set conversion inside of
SetJobTitle(), and then substitute the fallback title in StartSubmission() as
is done with the CUPS logic. SetJobTitle() has to be threadsafe, so if I were
using a cached encoder I'd do the whole thing in StartSubmission().


>-/* Routines to set the MOZ_PRINTER_NAME environment variable and to
>- * single-thread print jobs while the variable is set.
>+/* Routines to set the MOZ_PRINTER_NAME and MOZ_DOCUMENT_TITLE environment variables 
>+ * and to single-thread print jobs while the variable is set.
>  */

Could you format your code to fit in 80 columns where it's not inconvenient?
Also, "the variable is" should be "these variables are".


>+    nsresult res = gNativeEncoder->GetMaxLength(PromiseFlatString(aTitle).get(), srcLength, &destLength);
>+    if( NS_SUCCEEDED(res) ) {
>+        nativeTitle = NS_STATIC_CAST(char*, nsMemory::Alloc(destLength+1));
>+        if(nativeTitle) {
>+            gNativeEncoder->Convert(PromiseFlatString(aTitle).get(), &srcLength, nativeTitle, &destLength);
>+        }
>+    }
>+    
>+    if(!nativeTitle)
>+        return PR_FAILURE;
>+
>+    /* Make sure title is null-terminated */
>+    nativeTitle[destLength] = '\0';
>+    
>+    /* Construct the new environment string */
>+    char *newVar = PR_smprintf("%s=%s", EnvJobTitle, nativeTitle);
>+    if (!newVar)
>+        return PR_FAILURE;

If you leave the character set conversion in this function, could you avoid
doing two separate memory allocations here? You could make your first
allocation large enough for the full environment string, or you could just
convert into a fixed-size buffer on the stack. It wouldn't be a big deal if
long titles were truncated.
Attachment #187379 - Flags: review?(kherron+mozilla) → review-
(In reply to comment #41)

Kenneth, thanks for you time and comments. (=

> (From update of attachment 187379 [details] [diff] [review] [edit])
> To start with, I think it'd be better design to set MOZ_DOCUMENT_TITLE for
> every print job, rather than setting it only for jobs that have a title. 

Agreed. Should the fallback be localizable by some means, though? For the time
being I've made it a static const char and use it for both PS and CUPS.

> It looks like you're leaking the unicode encoder object. EnvLockInit()
> unconditionally creates a new encoder for every print job, and it's not freed
> anywhere. Also, based on other uses of unicode encoders, it looks like you
> should set the encoder's error behavior with SetOutputErrorBehavior().

As far as I can tell, EnvLockInit is only called once (by PR_CallOnce()),
so it shouldn't be leaking? I'll look at the error behaviour.

> I don't know how large this encoder object is, or how expensive it is to
> initialize it. I also don't know if it's possible for the local character set
> to change while mozilla is running. I suspect it'd be better to allocate an
> encoder for each print job, rather than allocating it once and caching it for
> reuse. 

You think so? If the charset can change, I'll agree, but I can't see how the
locale can change while an application is running on *nix..

> Personally, I think I'd do the character set conversion inside of
> SetJobTitle(), and then substitute the fallback title in StartSubmission() as
> is done with the CUPS logic. SetJobTitle() has to be threadsafe, so if I were
> using a cached encoder I'd do the whole thing in StartSubmission().

I'll stick with the cached encoder, so.. You think I should move the conversion
from EnvSetJobTitle to StartSubmission?

> Could you format your code to fit in 80 columns where it's not inconvenient?
> Also, "the variable is" should be "these variables are".

OK.

>> [EnvSetJobTitle]
> If you leave the character set conversion in this function, could you avoid
> doing two separate memory allocations here? You could make your first
> allocation large enough for the full environment string, or you could just
> convert into a fixed-size buffer on the stack. It wouldn't be a big deal if
> long titles were truncated.

Sure, I'll just allocate one string that's big enough.

Now I'll just have to get a better network connection so I can do cvs diff to
make a new patch. GPRS is a bit too expensive and slow. (=
reassigning to defaults as no one seems to be on top of the patch.
Assignee: rods → printing
QA Contact: sujay
The patch for bug 193001 rendered this irrelevant. Gecko doesn't call lpr directly any more; it prints through a GTK API.
Status: NEW → RESOLVED
Closed: 17 years ago
Resolution: --- → INVALID
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: