#include <scrnintstr.h>
#include "attributes.h"
static XpOidMediumDiscreteSize DefaultMediumSize = {
xpoid_val_medium_size_na_letter, xFalse, {6.35, 209.55, 6.35, 273.05}
};
static XpOidMediumDiscreteSizeList DefaultMediumSizeList = {
&DefaultMediumSize, 1
};
static XpOidMediumSourceSize DefaultMediumSourceSize = {
xpoid_unspecified, XpOidMediumSS_DISCRETE, { &DefaultMediumSizeList }
};
static XpOidMediumSS DefaultMediumSS = {
&DefaultMediumSourceSize, 1
};
XpOid
XpGetOidAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidList* valid_oid_list)
{
XpOid value_oid;
value_oid = XpOidFromString(XpGetStringAttr(pContext, pool, oid));
if((const XpOidList*)NULL == valid_oid_list
||
XpOidListHasOid(valid_oid_list, value_oid))
{
return value_oid;
}
else
{
return xpoid_none;
}
}
void
XpPutOidAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
XpOid value_oid)
{
XpPutStringAttr(pContext, pool, oid, XpOidString(value_oid));
}
void
XpValidateOidAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidList* valid_oids,
XpOid default_oid)
{
XpOid value_oid;
value_oid = XpGetOidAttr(pContext, pool, oid, valid_oids);
XpPutOidAttr(pContext, pool, oid,
value_oid == xpoid_none ? default_oid : value_oid);
}
unsigned long
XpGetCardAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidCardList* valid_card_list)
{
unsigned long value_card;
if(XpOidParseUnsignedValue(XpGetStringAttr(pContext, pool, oid),
(const char**)NULL,
&value_card))
{
if((const XpOidCardList*)NULL == valid_card_list
||
XpOidCardListHasCard(valid_card_list, value_card))
{
return value_card;
}
}
return 0;
}
void
XpPutCardAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
unsigned long value_card)
{
if(value_card > 0)
{
char value_out[16];
sprintf(value_out, "%lu", value_card);
XpPutStringAttr(pContext, pool, oid, value_out);
}
else
XpPutStringAttr(pContext, pool, oid, (const char*)NULL);
}
void
XpValidateCardAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidCardList* valid_cards,
unsigned long default_card)
{
unsigned long value_card;
value_card = XpGetCardAttr(pContext, pool, oid, valid_cards);
XpPutCardAttr(pContext, pool, oid,
value_card == 0 ? default_card : value_card);
}
XpOidList*
XpGetListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidList* valid_oid_list)
{
return XpOidListNew(XpGetStringAttr(pContext, pool, oid), valid_oid_list);
}
void
XpPutListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidList* list)
{
char* value_out;
value_out = XpOidListString(list);
XpPutStringAttr(pContext, pool, oid, value_out);
XpOidFree(value_out);
}
void
XpValidateListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidList* valid_oids,
const XpOidList* default_oids)
{
XpOidList* list = XpGetListAttr(pContext, pool, oid, valid_oids);
if(XpOidListCount(list) == 0)
XpPutListAttr(pContext, pool, oid, default_oids);
else
XpPutListAttr(pContext, pool, oid, list);
XpOidListDelete(list);
}
XpOidCardList*
XpGetCardListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidCardList* valid_card_list)
{
return XpOidCardListNew(XpGetStringAttr(pContext, pool, oid),
valid_card_list);
}
void
XpPutCardListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidCardList* list)
{
char* value_out;
value_out = XpOidCardListString(list);
XpPutStringAttr(pContext, pool, oid, value_out);
XpOidFree(value_out);
}
void
XpValidateCardListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidCardList* valid_cards,
const XpOidCardList* default_cards)
{
XpOidCardList* list = XpGetCardListAttr(pContext, pool, oid, valid_cards);
if(XpOidCardListCount(list) == 0 && (XpOidCardList*)NULL != default_cards)
XpPutCardListAttr(pContext, pool, oid, default_cards);
else
XpPutCardListAttr(pContext, pool, oid, list);
XpOidCardListDelete(list);
}
XpOidDocFmtList*
XpGetDocFmtListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidDocFmtList* valid_fmt_list)
{
return XpOidDocFmtListNew(XpGetStringAttr(pContext, pool, oid),
valid_fmt_list);
}
void
XpPutDocFmtListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidDocFmtList* list)
{
char* value_out;
value_out = XpOidDocFmtListString(list);
XpPutStringAttr(pContext, pool, oid, value_out);
XpOidFree(value_out);
}
void
XpValidateDocFmtListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidDocFmtList* valid_fmts,
const XpOidDocFmtList* default_fmts)
{
XpOidDocFmtList* list;
list = XpGetDocFmtListAttr(pContext, pool, oid, valid_fmts);
if(XpOidDocFmtListCount(list) == 0
&&
(XpOidDocFmtList*)NULL != default_fmts)
{
XpPutDocFmtListAttr(pContext, pool, oid, default_fmts);
}
else
{
XpPutDocFmtListAttr(pContext, pool, oid, list);
}
XpOidDocFmtListDelete(list);
}
XpOidMediumSS*
XpGetMediumSSAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidList* valid_trays,
const XpOidList* valid_sizes)
{
return XpOidMediumSSNew(XpGetStringAttr(pContext, pool, oid),
valid_trays, valid_sizes);
}
void
XpPutMediumSSAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidMediumSS* msss)
{
char* value_out;
value_out = XpOidMediumSSString(msss);
XpPutStringAttr(pContext, pool, oid, value_out);
XpOidFree(value_out);
}
const XpOidMediumSS*
XpGetDefaultMediumSS(void)
{
return &DefaultMediumSS;
}
XpOidTrayMediumList*
XpGetTrayMediumListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidList* valid_trays,
const XpOidMediumSS* msss)
{
return XpOidTrayMediumListNew(XpGetStringAttr(pContext, pool, oid),
valid_trays, msss);
}
void
XpPutTrayMediumListAttr(XpContextPtr pContext,
XPAttributes pool,
XpOid oid,
const XpOidTrayMediumList* tm)
{
char* value_out;
value_out = XpOidTrayMediumListString(tm);
XpPutStringAttr(pContext, pool, oid, value_out);
XpOidFree(value_out);
}
void
XpValidatePrinterMediaAttrs(XpContextPtr pContext,
const XpOidList* valid_trays,
const XpOidList* valid_sizes)
{
const XpOidMediumSS* msss;
XpOidMediumSS* pool_msss;
XpOidTrayMediumList* tm;
pool_msss = XpGetMediumSSAttr(pContext, XPPrinterAttr,
xpoid_att_medium_source_sizes_supported,
valid_trays, valid_sizes);
if(0 == XpOidMediumSSCount(pool_msss))
msss = XpGetDefaultMediumSS();
else
msss = pool_msss;
XpPutMediumSSAttr(pContext, XPPrinterAttr,
xpoid_att_medium_source_sizes_supported, msss);
tm = XpGetTrayMediumListAttr(pContext, XPPrinterAttr,
xpoid_att_input_trays_medium,
valid_trays, msss);
XpPutTrayMediumListAttr(pContext, XPPrinterAttr,
xpoid_att_input_trays_medium, tm);
XpOidMediumSSDelete(pool_msss);
XpOidTrayMediumListDelete(tm);
}
void
XpValidatePrinterPool(XpContextPtr pContext,
const XpValidatePoolsRec* vpr)
{
XpValidateListAttr(pContext, XPPrinterAttr,
xpoid_att_content_orientations_supported,
vpr->valid_content_orientations_supported,
vpr->default_content_orientations_supported);
XpValidateDocFmtListAttr(pContext, XPPrinterAttr,
xpoid_att_document_formats_supported,
vpr->valid_document_formats_supported,
vpr->default_document_formats_supported);
XpValidateListAttr(pContext, XPPrinterAttr, xpoid_att_plexes_supported,
vpr->valid_plexes_supported,
vpr->default_plexes_supported);
XpValidateCardListAttr(pContext, XPPrinterAttr,
xpoid_att_printer_resolutions_supported,
vpr->valid_printer_resolutions_supported,
vpr->default_printer_resolutions_supported);
XpValidateDocFmtListAttr(pContext, XPPrinterAttr,
xpoid_att_xp_embedded_formats_supported,
vpr->valid_xp_embedded_formats_supported,
vpr->default_xp_embedded_formats_supported);
XpValidateListAttr(pContext, XPPrinterAttr,
xpoid_att_xp_listfonts_modes_supported,
vpr->valid_xp_listfonts_modes_supported,
vpr->default_xp_listfonts_modes_supported);
XpValidateDocFmtListAttr(pContext, XPPrinterAttr,
xpoid_att_xp_raw_formats_supported,
vpr->valid_xp_raw_formats_supported,
vpr->default_xp_raw_formats_supported);
XpValidateOidAttr(pContext, XPPrinterAttr, xpoid_att_xp_setup_proviso,
vpr->valid_xp_setup_proviso, xpoid_none);
XpValidatePrinterMediaAttrs(pContext,
vpr->valid_input_trays,
vpr->valid_medium_sizes);
XpValidateListAttr(pContext, XPPrinterAttr,
xpoid_att_available_compressions_supported,
vpr->valid_available_compressions_supported,
vpr->default_available_compressions_supported);
}
void
XpValidateNotificationProfile(XpContextPtr pContext)
{
const char* value_in;
const char* value_out;
value_in = XpGetStringAttr(pContext, XPJobAttr,
xpoid_att_notification_profile);
value_out = XpOidNotifyString(XpOidNotifyParse(value_in));
XpPutStringAttr(pContext, XPJobAttr,
xpoid_att_notification_profile, value_out);
}
void
XpValidateJobPool(XpContextPtr pContext,
const XpValidatePoolsRec* vpr)
{
XpOidList* job_attrs_supported;
job_attrs_supported = XpGetListAttr(pContext, XPPrinterAttr,
xpoid_att_job_attributes_supported,
(const XpOidList*)NULL);
if(XpOidListHasOid(job_attrs_supported, xpoid_att_notification_profile))
{
XpValidateNotificationProfile(pContext);
}
XpOidListDelete(job_attrs_supported);
}
static void
XpValidateDocOrPagePool(XpContextPtr pContext,
XPAttributes pool,
const XpOidList* attrs_supported,
const XpValidatePoolsRec* vpr)
{
if(XpOidListHasOid(attrs_supported, xpoid_att_content_orientation))
{
XpOidList* content_orientations_supported;
content_orientations_supported =
XpGetListAttr(pContext, XPPrinterAttr,
xpoid_att_content_orientations_supported,
vpr->valid_content_orientations_supported);
XpValidateOidAttr(pContext, pool, xpoid_att_content_orientation,
content_orientations_supported, xpoid_none);
XpOidListDelete(content_orientations_supported);
}
if(XpOidListHasOid(attrs_supported, xpoid_att_copy_count))
XpValidateCardAttr(pContext, pool, xpoid_att_copy_count,
(const XpOidCardList*)NULL, 0);
if(XpOidListHasOid(attrs_supported, xpoid_att_default_printer_resolution))
{
XpOidCardList* printer_resolutions_supported;
printer_resolutions_supported =
XpGetCardListAttr(pContext, XPPrinterAttr,
xpoid_att_printer_resolutions_supported,
vpr->valid_printer_resolutions_supported);
XpValidateCardAttr(pContext, pool,
xpoid_att_default_printer_resolution,
printer_resolutions_supported, 0);
XpOidCardListDelete(printer_resolutions_supported);
}
if(XpOidListHasOid(attrs_supported, xpoid_att_default_input_tray))
{
XpOidTrayMediumList* input_trays_medium;
const char* value_in;
XpOid value_tray;
input_trays_medium =
XpGetTrayMediumListAttr(pContext, XPPrinterAttr,
xpoid_att_input_trays_medium,
(const XpOidList*)NULL,
(const XpOidMediumSS*)NULL);
value_in =
XpGetStringAttr(pContext, pool, xpoid_att_default_input_tray);
value_tray = XpOidFromString(value_in);
if(!XpOidTrayMediumListHasTray(input_trays_medium, value_tray))
value_tray = xpoid_none;
XpPutOidAttr(pContext, pool, xpoid_att_default_input_tray, value_tray);
XpOidTrayMediumListDelete(input_trays_medium);
}
if(XpOidListHasOid(attrs_supported, xpoid_att_default_medium))
{
XpOidMediumSS* msss;
const char* value_in;
XpOid value_size;
msss = XpGetMediumSSAttr(pContext, XPPrinterAttr,
xpoid_att_medium_source_sizes_supported,
(const XpOidList*)NULL,
(const XpOidList*)NULL);
value_in = XpGetStringAttr(pContext, pool, xpoid_att_default_medium);
value_size = XpOidFromString(value_in);
if(!XpOidMediumSSHasSize(msss, value_size))
value_size = xpoid_none;
XpPutOidAttr(pContext, pool, xpoid_att_default_medium, value_size);
XpOidMediumSSDelete(msss);
}
if(XpOidListHasOid(attrs_supported, xpoid_att_document_format))
{
XpOidDocFmtList* document_formats_supported;
const char* value_in;
XpOidDocFmt* document_format;
const char* value_out;
document_formats_supported =
XpGetDocFmtListAttr(pContext, XPPrinterAttr,
xpoid_att_document_formats_supported,
vpr->valid_document_formats_supported);
value_in = XpGetStringAttr(pContext, pool, xpoid_att_document_format);
document_format = XpOidDocFmtNew(value_in);
if(XpOidDocFmtListHasFmt(document_formats_supported, document_format))
value_out = XpOidDocFmtString(document_format);
else
value_out = XpOidDocFmtString(vpr->default_document_format);
XpOidDocFmtListDelete(document_formats_supported);
XpOidDocFmtDelete(document_format);
XpPutStringAttr(pContext, pool, xpoid_att_document_format, value_out);
XpOidFree(value_out);
}
if(XpOidListHasOid(attrs_supported, xpoid_att_plex))
{
XpOidList* plexes_supported;
plexes_supported =
XpGetListAttr(pContext, XPPrinterAttr, xpoid_att_plexes_supported,
vpr->valid_plexes_supported);
XpValidateOidAttr(pContext, pool, xpoid_att_plex,
plexes_supported, xpoid_none);
XpOidListDelete(plexes_supported);
}
if(XpOidListHasOid(attrs_supported, xpoid_att_xp_listfonts_modes))
{
XpOidList* xp_listfonts_modes_supported;
xp_listfonts_modes_supported =
XpGetListAttr(pContext, XPPrinterAttr,
xpoid_att_xp_listfonts_modes_supported,
vpr->valid_xp_listfonts_modes_supported);
XpValidateListAttr(pContext, pool, xpoid_att_xp_listfonts_modes,
xp_listfonts_modes_supported,
(const XpOidList*)NULL);
XpOidListDelete(xp_listfonts_modes_supported);
}
if(XpOidListHasOid(attrs_supported, xpoid_att_available_compression))
{
XpOidList* available_compressions_supported;
available_compressions_supported =
XpGetListAttr(pContext, XPPrinterAttr,
xpoid_att_available_compressions_supported,
vpr->valid_available_compressions_supported);
XpValidateOidAttr(pContext, pool, xpoid_att_available_compression,
available_compressions_supported, xpoid_none);
XpOidListDelete(available_compressions_supported);
}
}
void
XpValidateDocumentPool(XpContextPtr pContext,
const XpValidatePoolsRec* vpr)
{
XpOidList* document_attrs_supported;
document_attrs_supported =
XpGetListAttr(pContext, XPPrinterAttr,
xpoid_att_document_attributes_supported,
(const XpOidList*)NULL);
XpValidateDocOrPagePool(pContext, XPDocAttr,
document_attrs_supported, vpr);
XpOidListDelete(document_attrs_supported);
}
void
XpValidatePagePool(XpContextPtr pContext,
const XpValidatePoolsRec* vpr)
{
XpOidList* page_attrs_supported;
page_attrs_supported =
XpGetListAttr(pContext, XPPrinterAttr,
xpoid_att_xp_page_attributes_supported,
(const XpOidList*)NULL);
XpValidateDocOrPagePool(pContext, XPPageAttr,
page_attrs_supported, vpr);
XpOidListDelete(page_attrs_supported);
}
void
XpValidateAttributePool(XpContextPtr pContext,
XPAttributes pool,
const XpValidatePoolsRec* vpr)
{
switch(pool)
{
case XPPrinterAttr:
XpValidatePrinterPool(pContext, vpr);
break;
case XPDocAttr:
XpValidateDocumentPool(pContext, vpr);
break;
case XPJobAttr:
XpValidateJobPool(pContext, vpr);
break;
case XPPageAttr:
XpValidatePagePool(pContext, vpr);
break;
default:
break;
}
}