fxStr toVoiceNumber; // to's voice number
fxStr toLocation; // to's geographical location
fxStr toCompany; // to's company/institution
+ fxStr fromFaxNumber; // sender's fax number
+ fxStr fromVoiceNumber; // sender's voice number
+ fxStr fromLocation; // sender's geographical location
+ fxStr fromCompany; // sender's company/institution
fxStr regarding; // fax is regarding...
fxStr comments; // general comments
fxStr sender; // sender's identity
float pageWidth; // page width (mm)
float pageLength; // page length (mm)
int maxcomments; // max # of comment lines
+ int maxlencomments; // max length of comment lines
static const char* prologue;
{
db = 0;
maxcomments = 20;
+ maxlencomments = 35;
}
faxCoverApp::~faxCoverApp()
cover = cp;
setupPageSize("default");
- while ((c = getopt(argc, argv, "C:D:n:t:f:c:p:l:m:r:s:v:x:")) != -1)
+ while ((c = getopt(argc, argv, "C:D:L:N:V:X:n:t:f:c:p:l:m:z:r:s:v:x:")) != -1)
switch (c) {
case 's': // page size
setupPageSize(optarg);
case 'D': // date format string
dateFmt = optarg;
break;
+ case 'L': // sender's geographic location
+ fromLocation = optarg;
+ break;
+ case 'N': // sender's fax number
+ fromFaxNumber = optarg;
+ break;
+ case 'V': // sender's voice number
+ fromVoiceNumber = optarg;
+ break;
+ case 'X': // sender's company/institution
+ fromCompany = optarg;
+ break;
case 'm': // max # comment lines
maxcomments = atoi(optarg);
break;
+ case 'z': // max length comment lines
+ maxlencomments = atoi(optarg);
+ break;
case 'n': // fax number
toFaxNumber = optarg;
break;
" [-p #pages]"
" [-l to-location]"
" [-m maxcomments]"
+ " [-z maxlencomments]"
" [-r regarding]"
" [-v to-voice-number]"
" [-x to-company]"
" [-C template-file]"
" [-D date-format]"
+ " [-L from-location]"
+ " [-N from-fax-number]"
+ " [-V from-voice-number]"
+ " [-X from-company]"
" [-s pagesize]"
" -f from"
" -n fax-number"
-1 1 { cbuf exch 7 exch 48 add put cbuf cvn exch def } for\n\
1 add exch 1 exch { cbuf exch 7 exch 48 add put cbuf cvn () def } for\n\
} def\n\
+/XtoCommentsX {\n\
+% <X> XtoCommentsX <commentsX>\n\
+ 3 string cvs (comments) dup length dup 4 1 roll\n\
+ 2 index length add string dup 0 4 -1 roll\n\
+ putinterval dup 4 -2 roll putinterval\n\
+} def\n\
+/BreakIntoCommentsX {\n\
+% <maxlines> <text> BreakIntoCommentsX -\n\
+ exch 1 1 3 2 roll\n\
+ { XtoCommentsX cvn () def } for\n\
+ dup length string copy 0 1 index 0 4 1 roll\n\
+ { linebreak 0 get eq {\n\
+ exch dup 0 3 index getinterval 4 -1 roll 1 add dup 5 1 roll\n\
+ XtoCommentsX cvn exch def dup length 2 index sub 1 sub\n\
+ 2 index 1 add exch getinterval exch pop 0\n\
+ }{ 1 add } ifelse\n\
+ dup MaxLenComments gt {\n\
+ exch MaxLenComments 1 sub -1 0 {\n\
+ 2 copy get wordbreak 0 get eq {\n\
+ mark 4 1 roll\n\
+ { 2 copy 1 add 1 index length 1 index 1 add sub\n\
+ getinterval 5 -1 roll search { 3 -2 roll pop pop } if\n\
+ length MaxLenComments gt { 4 -1 roll exec\n\
+ }{ false } ifelse\n\
+ }\n\
+ { true }\n\
+ 5 1 roll linebreak 1 index wordbreak 7 3 roll exec\n\
+ counttomark 1 add 4 roll cleartomark { pop exit } if\n\
+ 2 copy 1 add 0 exch getinterval 5 -1 roll\n\
+ 1 add dup 6 1 roll XtoCommentsX cvn exch def\n\
+ 2 copy 1 add 1 index length 1 index sub getinterval\n\
+ 3 -1 roll pop 3 -2 roll 1 add sub exch exit\n\
+ } if\n\
+ pop\n\
+ } for\n\
+ exch dup MaxLenComments gt {\n\
+ pop dup 0 MaxLenComments getinterval 3 -1 roll\n\
+ 1 add dup 4 1 roll XtoCommentsX cvn exch def\n\
+ dup length MaxLenComments sub\n\
+ MaxLenComments exch getinterval 1\n\
+ } if\n\
+ }if\n\
+ } forall\n\
+ pop exch 1 add XtoCommentsX cvn exch def\n\
+} def\n\
";
void
printf("%%%%Pages: 1 +1\n");
printf("%%%%EndComments\n");
printf("%%%%BeginProlog\n");
- printf("100 dict begin\n");
+ printf("%i dict begin\n", maxcomments*2 + 80);
printf("%s", prologue);
emitToDefs(toName, toName != "" ? db->find(toName) : (FaxDBRecord*) NULL);
printf("/pageWidth %.2f def\n", pageWidth);
emitDateDefs();
coverDef("regarding", regarding);
emitCommentDefs();
- printf("%i comments BreakIntoCommentX", maxcomments);
+ printf("/MaxComments %i def\n", maxcomments);
+ printf("MaxComments comments BreakIntoCommentX\n");
+ printf("/MaxLenComments %i def\n", maxlencomments);
+ printf("MaxComments comments BreakIntoCommentsX\n");
printf("%%%%EndProlog\n");
printf("%%%%Page: \"1\" 1\n");
// copy prototype cover page
while ((n = read(fd, buf, sizeof (buf))) > 0)
fwrite(buf, n, 1, stdout);
Sys::close(fd);
- printf("end\n");
+ printf("\nend\n");
}
void
void
faxCoverApp::emitFromDefs(FaxDBRecord* rec)
{
- fxStr fromCompany;
- fxStr fromLocation;
- fxStr fromFaxNumber;
- fxStr fromVoiceNumber;
-
if (rec) {
fromCompany = rec->find("Company");
fromLocation = rec->find("Location");
bool recvdDCN; // received DCN frame
bool messageReceived; // expect/don't expect message carrier
u_int lastPPM; // last PPM during receive
+ bool sendCFR; // received TCF was not confirmed
static const u_int modemPFMCodes[8];// map T.30 FCF to Class 2 PFM
static const u_int modemPPMCodes[8];// map T.30 FCF to Class 2 PPM
bool recvPage(TIFF*, int& ppm, fxStr& emsg);
bool recvEnd(fxStr& emsg);
void recvAbort();
- void trainingSucceeded();
- void trainingFailed();
// polling support
bool requestToPoll(fxStr&);
messageReceived = false; // expect message carrier
recvdDCN = false; // haven't seen DCN
lastPPM = FCF_DCN; // anything will do
+ sendCFR = false; // TCF was not received
return FaxModem::recvBegin(emsg) && recvIdentification(
0, fxStr::null,
if (frame.getFCF() == FCF_DCN) {
emsg = "RSPREC error/got DCN";
recvdDCN = true;
+ return (false);
} else // XXX DTC/DIS not handled
emsg = "RSPREC invalid response received";
break;
}
(void) waitFor(AT_NOCARRIER); // wait for message carrier to drop
}
- return (ok);
-}
-
-/*
- * Send training response (success); we follow the spec
- * by delaying 75ms before switching carriers.
- */
-void
-Class1Modem::trainingSucceeded()
-{
- pause(conf.class1TCFResponseDelay);
- transmitFrame(FCF_CFR|FCF_RCVR);
- protoTrace("TRAINING succeeded");
-}
-
-/*
- * Send training response (failure); we follow the spec
- * by delaying 75ms before switching carriers.
- */
-void
-Class1Modem::trainingFailed()
-{
+ /*
+ * Send training response; we follow the spec
+ * by delaying 75ms before switching carriers.
+ */
pause(conf.class1TCFResponseDelay);
- transmitFrame(FCF_FTT|FCF_RCVR);
- protoTrace("TRAINING failed");
+ if (ok) {
+ /*
+ * Send CFR later so that we can cancel
+ * session by DCN if it's needed.
+ */
+ sendCFR = true;
+ protoTrace("TRAINING succeeded");
+ } else {
+ transmitFrame(FCF_FTT|FCF_RCVR);
+ sendCFR = false;
+ protoTrace("TRAINING failed");
+ }
+ return (ok);
}
/*
do {
u_int timer = conf.t2Timer;
if (!messageReceived) {
+ if (sendCFR ) {
+ transmitFrame(FCF_CFR|FCF_RCVR);
+ sendCFR = false;
+ }
/*
* Look for message carrier and receive Phase C data.
*/
&& recvDCSFrames(frame)
&& recvTraining()
);
- if (messageReceived) trainingFailed();
- else trainingSucceeded();
break;
case FCF_MPS: // MPS
case FCF_EOM: // EOM
* timeout, we need to achieve CONNECT first, just
* as we did following ATA back in the beginning.
*/
- if (atCmd(thCmd, AT_NOTHING) && atResponse(rbuf, 0) == AT_CONNECT && recvBegin(emsg)) {
- trainingSucceeded();
+ if (atCmd(thCmd, AT_NOTHING) && atResponse(rbuf, 0) == AT_CONNECT && recvBegin(emsg))
goto top;
- } else trainingFailed();
} else
emsg = "T.30 T2 timeout, expected page not received";
return (false);
bool recvPage(TIFF*, int& ppm, fxStr& emsg);
bool recvEnd(fxStr& emsg);
void recvAbort();
- void trainingSucceeded();
- void trainingFailed();
// polling support
bool requestToPoll(fxStr& emsg);
{
strcpy(hangupCode, "50"); // force abort in recvEnd
}
-
-/*
- * Processes to perform at the end of training,
- * but after TSI screening, so we know where
- * we're going.
- */
-void
-Class2Modem::trainingSucceeded()
-{
- // nothing
-}
-
-/*
- * ibid.
- */
-void
-Class2Modem::trainingFailed()
-{
- // nothing
-}
virtual bool recvPage(TIFF*, int& ppm, fxStr& em) = 0;
virtual bool recvEnd(fxStr& emsg) = 0;
virtual void recvAbort() = 0;
- virtual void trainingSucceeded() = 0;
- virtual void trainingFailed() = 0;
// query interfaces for optional state
virtual bool getRecvPWD(fxStr&);
virtual bool getRecvTSI(fxStr&);
if (!modem->recvEnd(emsg))
traceProtocol("RECV FAX: %s", (const char*) emsg);
} else {
- modem->trainingFailed(); // wait until after QualifyTSI
traceProtocol("RECV FAX: %s", (const char*) emsg);
TIFFClose(tif);
}
emsg = "Permission denied (unacceptable client TSI)";
info.time = (u_int) getFileTransferTime();
info.reason = emsg;
+ docs[docs.length()-1] = info;
notifyDocumentRecvd(info);
TIFFClose(tif);
return (false);
}
}
- modem->trainingSucceeded(); // wait until after QualifyTSI
setServerStatus("Receiving from \"%s\"", (const char*) info.sender);
recvOK = recvFaxPhaseD(tif, info, ppm, emsg);
TIFFClose(tif);
.if n .po 0
.ds Fx \fIHyla\s-1FAX\s+1\fP
.ds Ps P\s-2OST\s+2S\s-2CRIPT\s+2
-.TH FAXCOVER 1 "November 14, 1996"
+.TH FAXCOVER 1 "January 06, 2001"
.SH NAME
faxcover \- generate a \*(Ps cover page for an outgoing facsimile
.SH SYNOPSIS
\fIto-voice-number\fP person's voice phone number \fIfrom-voice-number\fP sender's voice phone number
\fIto-fax-number\fP destination fax phone number \fIfrom-fax-number\fP sender's fax phone number
\fIcomments\fP unbroken comment string \fIcommentsX\fP \fI\s-1X\s+1\fP'th line of comments
-\fIregarding\fP Re: subject \fIpage-count\fP # pages other than cover page
-\fIpageWidth\fP page width in millimeters \fItodays-date\fP current date and time
-\fIpageLength\fP page length in millimeters
+\fIregarding\fP Re: subject \fICommentX\fP similar to \fIcommentsX\fP
+\fIpageWidth\fP page width in millimeters \fIpage-count\fP # pages other than cover page
+\fIpageLength\fP page length in millimeters \fItodays-date\fP current date and time
.fi
.PP
If the
.I comments
-string is longer than 35 characters, it
-is broken, on word boundaries, into multiple \*(Ps strings
+string is longer than
+.I maxlencomments
+characters, it is broken, on word boundaries or instances of ``\\n\'\', into multiple \*(Ps strings
.I comments\s-1X\s+1
where
.I \s-1X\s+1
is the line number; e.g.
.I comments2
for the second line of comments.
-By default
+Long substrings without whitespace which exceed
+.I maxlencomments
+are also broken. By default
.I faxcover
will generate 20
.I comments\s-1X\s+1
This number can be changed with the
.B \-m
option; see below.
+.I maxlencomments
+is changed with the
+.B \-z
+option; see below.
+.PP
+Note that use of
+.I commentsX
+with non-fixed-width fonts can lead to spatial problems where characters
+run off the edge of the generated cover page. In such cases, use of
+.I BreakIntoLines
+(see below) may be a more suitable approach.
+.PP
+.I CommentX
+is similar to
+.I commentsX
+except that its values are created only by breaking
+.I comments
+on instances of ``\\n\'\' and not otherwise.
+.I maxlines
+does not affect
+.I CommentX
.PP
.I faxcover
also emits a \*(Ps procedure for breaking comment strings into
.I location
for the geographic location of the destination company.
.TP 12
+.BI \-L " location"
+Use
+.I location
+for the geographic location of the sender's company.
+.TP 12
+.BI \-m " maxlines"
+indicates the maximum number of
+.I commentsX
+lines to generate.
+.TP 12
.BI \-n " number"
Use
.I number
for the destination fax machine number.
.TP 12
+.BI \-N " number"
+Use
+.I number
+for the sender's fax machine number.
+.TP 12
.BI \-p " count"
Use
.I count
.I number
for the receiver's voice phone number.
.TP 12
+.BI \-V " number"
+Use
+.I number
+for the sender's voice phone number.
+.TP 12
.BI \-x " company"
Use
.I company
for the destination company name.
+.TP 12
+.BI \-X " company"
+Use
+.I company
+for the sender's company name.
+.TP 12
+.BI \-z " maxlencomments"
+indicates the maximum length in number of characters allowed in a
+.I commentsX
+string.
.SH DIAGNOSTICS
Complaints about not being able to locate a template file.
.SH FILES
.ta \w'${LIBDATA}/faxcover.ps 'u
~/.faxdb personal fax number database
.br
+~/.hylarc per-user configuration file
+.br
+${LIBDATA}/hyla.conf system-wide configuration file
+.br
${LIBDATA}/faxcover.ps default cover page template
.br
${LIBDATA}/pagesizes page size database
.SH BUGS
-Information not supplied on the command line is
-currently obtained from the
-.I ~/.faxdb
-file.
.I faxcover
-should read configuration parameters from the standard \*(Fx
-configuration files.
+should be able to determine the appropriate length of
+.I commentsX
+strings by using font metric information.
.SH "SEE ALSO"
.IR hylafax-client (1),
.IR sendfax (1)
.if n .po 0
.ds Fx \fIHyla\s-1FAX\s+1\fP
.ds Ps P\s-2OST\s+2S\s-2CRIPT\s+2
-.TH SENDFAX 1 "June 21, 1996"
+.TH SENDFAX 1 "January 06, 2001"
.SH NAME
sendfax \- submit a facsimile job for transmission
.SH SYNOPSIS
calls in attempting to send the facsimile. By default, HylaFAX will
redial 12 times before killing a job.
.TP 12
+.BI \-U " voice-no"
+Pass
+.I voice-no
+to the
+.IR faxcover (1)
+program as the sender's voice number.
+.TP 12
.BI \-V " voice-no"
Pass
.I voice-no
If this option is used, the sendfax process will not terminate until
the job is completed.
.TP 12
+.BI \-W " fax-no"
+Pass
+.I fax-no
+to the
+.IR faxcover (1)
+program as the sender's fax number.
+.TP 12
.BI \-x " company"
Pass
.I company
.IR faxcover (1)
program as the destination company name.
.TP 12
+.BI \-X " company"
+Pass
+.I company
+to the
+.IR faxcover (1)
+program as the sender's company name.
+.TP 12
.BI \-y " location"
Pass
.I location
.IR faxcover (1)
program as the destination company's location.
.TP 12
+.BI \-Y " location"
+Pass
+.I location
+to the
+.IR faxcover (1)
+program as the sender's company location.
+.TP 12
.B \-v
Print information on the standard output
about each conversion and cover sheet
that may have been previously read.
Configuration files follow the conventions described in
.IR hylafax-client (1).
-The following configuration parameters are recognized:
+The following configuration parameters are recognized.
+Parameters marked with \(S1 are not available in ${LIBDATA}/hfaxd.conf :
.sp .5
.nf
.ta \w'AutoCoverPage 'u +\w'boolean 'u +\w'\s-1\fIsee below\fP\s+1 'u
ChopThreshold float \s-13.0\s+1 page chopping threshold
CoverCmd string \s-1\fIsee below\fP\s+1 pathname of cover sheet program
Cover-Comments string \- cover page comments string
-Cover-Company string \- cover page company name string
-Cover-Location string \- cover page company location string
+Cover-Company\(S1 string \- cover page to-company name string
+Cover-Location\(S1 string \- cover page to-company location string
Cover-Regarding string \- cover page regarding string
Cover-Template string \- cover page template filename
-Cover-Voice string \- cover page voice number string
+Cover-Voice\(S1 string \- cover page to-voice number string
+Cover-From-Company\(S1 string \- cover page from-company string
+Cover-From-Location\(S1 string \- cover page from-location string
+Cover-From-Voice\(S1 string \- cover page from-voice number string
+Cover-From-Fax\(S1 string \- cover page from-fax number string
DateFormat string \- cover page date format string
DesiredEC boolean \- desired use of \s-1ECM\s+1
DesiredMST string \- desired minimum scanling time to use
auto-generating cover pages.
.TP 16
.B Cover-Company
-The company name string to pass to the cover sheet program when
+The to-company name string to pass to the cover sheet program when
auto-generating cover pages.
.TP 16
.B Cover-Location
-The company location string to pass to the cover sheet program when
+The to-company location string to pass to the cover sheet program when
auto-generating cover pages.
.TP 16
.B Cover-Regarding
in auto-generating cover pages.
.TP 16
.B Cover-Voice
-The voice number string to pass to the cover sheet program when
+The to-voice number string to pass to the cover sheet program when
+auto-generating cover pages.
+.TP 16
+.B Cover-From-Company
+The from-company name string to pass to the cover sheet program
+when auto-generating cover pages.
+.TP 16
+.B Cover-From-Location
+The from-location string to pass to the cover sheet program when
+auto-generating cover pages.
+.TP 16
+.B Cover-From-Voice
+The from-voice number string to pass to the cover sheet program when
+auto-generating cover pages.
+.TP 16
+.B Cover-From-Fax
+The from-fax number string to pass to the cover sheet program when
auto-generating cover pages.
.TP 16
.B DateFormat
int verbose = 0;
SendFaxJob& proto = getProtoJob();
db = new FaxDB(tildeExpand(dbName));
- while ((c = Sys::getopt(argc, argv, "a:b:B:c:C:d:f:F:h:i:I:k:M:P:r:s:t:T:V:x:y:12lmnpvwDENR")) != -1)
+ while ((c = Sys::getopt(argc, argv, "a:b:B:c:C:d:f:F:h:i:I:k:M:P:r:s:t:T:U:V:W:x:X:y:Y:12lmnpvwDENR")) != -1)
switch (c) {
case '1': // restrict to 1D-encoded data
proto.setDesiredDF(0);
case 'T': // times to dial telephone
proto.setMaxDials(atoi(optarg));
break;
+ case 'U': // cover page: sender's voice number
+ proto.setCoverFromVoice(optarg);
+ break;
case 'v': // verbose mode
verbose++;
setvbuf(stdout, NULL, _IOLBF, BUFSIZ);
case 'w': // wait for job to complete
waitForJob = true;
break;
+ case 'W': // cover page: sender's fax number
+ proto.setCoverFromFax(optarg);
+ break;
case 'x': // cover page: to's company
proto.setCoverCompany(optarg);
break;
+ case 'X': // cover page: sender's company
+ proto.setCoverFromCompany(optarg);
+ break;
case 'y': // cover page: to's location
proto.setCoverLocation(optarg);
break;
+ case 'Y': // cover page: sender's location
+ proto.setCoverFromLocation(optarg);
+ break;
case '?':
usage();
/*NOTREACHED*/
addarg(av, ac, "-t", job.getCoverName());
addarg(av, ac, "-v", job.getCoverVoiceNumber());
addarg(av, ac, "-x", job.getCoverCompany());
+ addarg(av, ac, "-L", job.getCoverFromLocation());
+ addarg(av, ac, "-N", job.getCoverFromFax());
+ addarg(av, ac, "-V", job.getCoverFromVoice());
+ addarg(av, ac, "-X", job.getCoverFromCompany());
fxStr pages;
if (totalPages > 0) {
pages = fxStr::format("%u", totalPages);
, sendTime(other.sendTime)
, tagline(other.tagline)
, pageSize(other.pageSize)
+ , fromlocation(other.fromlocation)
+ , fromfax(other.fromfax)
+ , fromvoice(other.fromvoice)
+ , fromcompany(other.fromcompany)
{
notify = other.notify;
autoCover = other.autoCover;
{ "cover-company", &SendFaxJob::company, NULL },
{ "cover-location", &SendFaxJob::location, NULL },
{ "cover-voice", &SendFaxJob::voicenumber, NULL },
+{ "cover-from-location", &SendFaxJob::fromlocation, NULL },
+{ "cover-from-fax", &SendFaxJob::fromfax, NULL },
+{ "cover-from-voice", &SendFaxJob::fromvoice, NULL },
+{ "cover-from-company", &SendFaxJob::fromcompany, NULL },
};
const SendFaxJob::SFJ_numbertag SendFaxJob::numbers[] = {
{ "maxtries", &SendFaxJob::maxRetries, FAX_RETRIES },
void SendFaxJob::setCoverComments(const char* s) { comments = s; }
void SendFaxJob::setCoverRegarding(const char* s) { regarding = s; }
void SendFaxJob::setCoverVoiceNumber(const char* s) { voicenumber = s; }
+void SendFaxJob::setCoverFromLocation(const char* s) { fromlocation = s; }
+void SendFaxJob::setCoverFromFax(const char* s) { fromfax = s; }
+void SendFaxJob::setCoverFromVoice(const char* s) { fromvoice = s; }
+void SendFaxJob::setCoverFromCompany(const char* s) { fromcompany = s; }
bool
SendFaxJob::setPageSize(const char* name)
fxStr company; // rec. company identity for cover page
fxStr comments; // comments for cover page
fxStr regarding; // regarding info for cover page
+ fxStr fromlocation; // rec. from location for cover page
+ fxStr fromfax; // rec. from fax for cover page
+ fxStr fromvoice; // rec. from voice for cover page
+ fxStr fromcompany; // rec. from company for cover page
bool sendTagLine; // if true, use custom tagline format
fxStr killTime; // job's time to be killed
const fxStr& getCoverComments() const;
void setCoverVoiceNumber(const char*);// receipient's voice number
const fxStr& getCoverVoiceNumber() const;
+ void setCoverFromLocation(const char*);// sender's location
+ const fxStr& getCoverFromLocation() const;
+ void setCoverFromFax(const char*); // sender's fax number
+ const fxStr& getCoverFromFax() const;
+ void setCoverFromVoice(const char*);// sender's voice number
+ const fxStr& getCoverFromVoice() const;
+ void setCoverFromCompany(const char*);// sender's company
+ const fxStr& getCoverFromCompany() const;
u_int getTotalPages() const; // counted pages (for cover sheet)
/*
inline const fxStr& SendFaxJob::getCoverRegarding() const{ return regarding; }
inline const fxStr& SendFaxJob::getCoverComments() const{ return comments; }
inline const fxStr& SendFaxJob::getCoverVoiceNumber() const{ return voicenumber; }
+inline const fxStr& SendFaxJob::getCoverFromLocation() const{ return fromlocation; }
+inline const fxStr& SendFaxJob::getCoverFromFax() const { return fromfax; }
+inline const fxStr& SendFaxJob::getCoverFromVoice() const{ return fromvoice; }
+inline const fxStr& SendFaxJob::getCoverFromCompany() const{ return fromcompany; }
inline float SendFaxJob::getPageWidth() const { return pageWidth; }
inline float SendFaxJob::getPageLength() const { return pageLength; }
inline const fxStr& SendFaxJob::getPageSize() const { return pageSize; }