MIME type matching not working as expected

Christoph Erdle erdle at in.tum.de
Wed Dec 15 11:21:10 PST 2010


On 15.12.10 20:16, Christoph Erdle wrote:
> On 15.12.10 19:06, Helge Blischke wrote:
>> Christoph Erdle wrote:
>>
>>> Hi Helge,
>>>
>>> On 15.12.10 17:55, Helge Blischke wrote:
>>>> Christoph Erdle wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> we are trying to implement a differentiation between different
>>>>> types of
>>>>> postscript documents. Some of our printers (Ricoh MP C2800) need to be
>>>>> accessed with user codes, which can be included on the client side
>>>>> directly inside the postscript document which get's sent to CUPS.
>>>>> Those
>>>>> documents have to be sent directly to the printers without further
>>>>> filtering through foomatic. The routing part work's nicely with
>>>>> manually
>>>>> set cupsFilter lines in the PPDs.
>>>>>
>>>>> What's not working is the detection of those documents using the MIME
>>>>> autotype feature.
>>>>>
>>>>> I included the following type definition in /etc/cups/local.types:
>>>>>
>>>>> application/postscript-prefiltered priority(200) + \
>>>>> contains(0,4096,"setuserinfo") + \
>>>>> (ai eps ps string(0,%!)
>>>>> string(0,<04>%!) \
>>>>> contains(0,128,<1B>%-12345X) + \
>>>>> (contains(0,4096,"LANGUAGE=POSTSCRIPT")
>>>>> \
>>>>> contains(0,4096,"LANGUAGE =
>>>>> Postscript") \
>>>>> contains(0,4096,"LANGUAGE =
>>>>> PostScript") \
>>>>> contains(0,4096,"LANGUAGE =
>>>>> POSTSCRIPT") \
>>>>> (contains(0,4096,<0a>%!) + \
>>>>> !contains(0,4096,"ENTER LANGUAGE"))))
>>>>>
>>>>> Except for the first two lines this is the definition of postscript
>>>>> extracted from /usr/share/cups/mime/mime.type. Those files containing
>>>>> the string setuserinfo in the postscript header shall be typed as
>>>>> application/postscript-prefiltered.
>>>>>
>>>>> But this definition does not work as expected. Default postscript docs
>>>>> sent to the printer are typed correctly as application/postscript. But
>>>>> when sending a document containing the setuserinfo string, those also
>>>>> get typed as application/postscript and not as
>>>>> application/postscript-prefiltered, as I had expected.
>>>>>
>>>>> What am I doing wrong in my attempt to differentiate between the two
>>>>> types of postscript docs? Any advice is appreciated.
>>>>>
>>>>> The following is the beginning of a PS file send from a client machine
>>>>> with set user code (setuserinfo), which is not typed correctly.
>>>>>
>>>>> %!PS-Adobe-3.0
>>>>> %APL_DSC_Encoding: UTF8
>>>>> %APLProducer: (Version 10.6.5 (Build 10H574) Quartz PS Context)
>>>>> %%Title: (mime.types - what am I missing - cups.general - Forums -
>>>>> CUPS)
>>>>> %%Creator: (Safari: cgpdftops CUPS filter)
>>>>> %%CreationDate: (Wednesday, December 15 2010 16:26:30 CET)
>>>>> %%For: (Christoph Erdle)
>>>>> %%DocumentData: Clean7Bit
>>>>> %%LanguageLevel: 3
>>>>> %%PageOrder: Ascend
>>>>> %RBINumCopies: 1
>>>>> %%Pages: (atend)
>>>>> %%BoundingBox: (atend)
>>>>> %%EndComments
>>>>> userdict/dscInfo 5 dict dup begin
>>>>> /Title(mime.types - what am I missing - cups.general - Forums -
>>>>> CUPS)def
>>>>> /Creator(Safari: cgpdftops CUPS filter)def
>>>>> /CreationDate(Wednesday, December 15 2010 16:26:30 CET)def
>>>>> /For(Christoph Erdle)def
>>>>> /Pages 1 def
>>>>> end put
>>>>> mark
>>>>> () (731266) (201012151726) {setuserinfo} stopped
>>>>> cleartomark
>>>>> %%BeginProlog
>>>>> %%BeginFile: lw8_errorhandler-2.0
>>>>> /currentpacking where
>>>>> { pop /oldpack currentpacking def /setpacking where
>>>>> {
>>>>> pop false setpacking
>>>>> }if
>>>>> }if
>>>>> /$brkpage 64 dict def $brkpage begin
>>>>>
>>>>>
>>>>> Kind regards,
>>>>> Christoph Erdle
>>>>
>>>> First, note that the mime type definitions are lexically sorted by cups
>>>> at startup time, so application/postscript is checked before
>>>> application/postscript-prefiltered.
>>>
>>> ok, I tried to rename the mime type to
>>> application/000-postscript-prefiltered, so it should be evaluated before
>>> application/postscript.
>>>
>>> Still all PS docs (with AND without setuserinfo) get autotyped to
>>> application/postscript according to CUPS error_log (log level debug2).
>>> So the additional restriction of "contains(0,4096,"setuserinfo")"does
>>> not seem to be evaluated correctly.
>>>
>>>> Second, I strongly recommend to put your userinfo stuff into the prolog
>>>> section or the setup section to avoid this stuff being eliminated by
>>>> the
>>>> pstops filter.
>>>
>>> I have no influence on the positioning of this setting, this is inserted
>>> by the RICOH provided PS drivers for e.g. Mac OS X. Also the
>>> openprinting.org PPDs for Ricoh MP C2800 seem to behave that way.
>>> Exactly that's the reason why I'm trying to do this mime type
>>> differentiation on the central CUPS server.
>>>
>>> Kind regards,
>>> Christoph
>
> Sorry to bother you with such, maybe for you, obvious questions. Im
> still in the beginning of understanding CUPS and the various ways it can
> be adapted to our environment.
>
>> What about a prefilter (provided you are using a cups version 1.3.x or
>> above) for this printer? It could a simple Perl script moving the
>> userinfo
>> stuff to the beginning of, e.g. the prolog section and need only be
>> specified by a *cupsPreFilter statement in the printer's PPD.
>
> Thanks for pointing that out, that seems to be an additional option
> besides completely preventing the processing through pstops on the
> central CUPS server if it was already processed on the client.
>
>>
>> If you could provide a sample file, I could hack such a script (I've done
>> similar things for e.g. OOo 2.x and 3.x).
>
> Thanks for the offer :-) I'll try a solution I'm thinking of at the
> moment tomorrow.
>
> But just for curiosity: Do you have any clue why the mime type way I
> have been trying seems not to be working, especially the more restricted
> condition for application/postscript-filtered does not get triggered
> when determining the type of the document? Am I doing something
> substantially wrong? I thought by taking an additional condition (the
> usercode thing) and using an boolean "AND" ( "+" in the mime config)
> with the CUPS provided postscript definition should do the trick.

sorry, the above should of course be application/000-postscript-prefiltered

Christoph




More information about the cups mailing list