18c603fe7SAxel Dörfler// Sun, 18 Jun 2000
28c603fe7SAxel Dörfler// Y.Takagi
38c603fe7SAxel Dörfler
48449c783SMichael Lotz#if defined(__HAIKU__) || defined(HAIKU_TARGET_PLATFORM_BONE)
58c603fe7SAxel Dörfler#	include <sys/socket.h>
68c603fe7SAxel Dörfler#	include <netinet/in.h>
78c603fe7SAxel Dörfler#else
88c603fe7SAxel Dörfler#	include <net/socket.h>
98c603fe7SAxel Dörfler#endif
108c603fe7SAxel Dörfler
118c603fe7SAxel Dörfler#include <fstream>
128c603fe7SAxel Dörfler#include <list>
138c603fe7SAxel Dörfler#include <cstring>
148c603fe7SAxel Dörfler
158c603fe7SAxel Dörfler#include "IppContent.h"
168c603fe7SAxel Dörfler
178c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
188c603fe7SAxel Dörfler
198c603fe7SAxel Dörflershort readLength(istream &is)
208c603fe7SAxel Dörfler{
218c603fe7SAxel Dörfler	short len = 0;
228c603fe7SAxel Dörfler	is.read((char *)&len, sizeof(short));
238c603fe7SAxel Dörfler	len = ntohs(len);
248c603fe7SAxel Dörfler	return len;
258c603fe7SAxel Dörfler}
268c603fe7SAxel Dörfler
278c603fe7SAxel Dörflervoid writeLength(ostream &os, short len)
288c603fe7SAxel Dörfler{
298c603fe7SAxel Dörfler	len = htons(len);
308c603fe7SAxel Dörfler	os.write((char *)&len, sizeof(short));
318c603fe7SAxel Dörfler}
328c603fe7SAxel Dörfler
338c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
348c603fe7SAxel Dörfler
358c603fe7SAxel DörflerDATETIME::DATETIME()
368c603fe7SAxel Dörfler{
378c603fe7SAxel Dörfler	memset(this, 0, sizeof(DATETIME));
388c603fe7SAxel Dörfler}
398c603fe7SAxel Dörfler
408c603fe7SAxel DörflerDATETIME::DATETIME(const DATETIME &dt)
418c603fe7SAxel Dörfler{
428c603fe7SAxel Dörfler	memcpy(this, &dt.datetime, sizeof(DATETIME));
438c603fe7SAxel Dörfler}
448c603fe7SAxel Dörfler
458c603fe7SAxel DörflerDATETIME & DATETIME::operator = (const DATETIME &dt)
468c603fe7SAxel Dörfler{
478c603fe7SAxel Dörfler	memcpy(this, &dt.datetime, sizeof(DATETIME));
488c603fe7SAxel Dörfler	return *this;
498c603fe7SAxel Dörfler}
508c603fe7SAxel Dörfler
518c603fe7SAxel Dörfleristream& operator >> (istream &is, DATETIME &attr)
528c603fe7SAxel Dörfler{
538c603fe7SAxel Dörfler	return is;
548c603fe7SAxel Dörfler}
558c603fe7SAxel Dörfler
568c603fe7SAxel Dörflerostream& operator << (ostream &os, const DATETIME &attr)
578c603fe7SAxel Dörfler{
588c603fe7SAxel Dörfler	return os;
598c603fe7SAxel Dörfler}
608c603fe7SAxel Dörfler
618c603fe7SAxel Dörfler
628c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
638c603fe7SAxel Dörfler
648c603fe7SAxel DörflerIppAttribute::IppAttribute(IPP_TAG t)
658c603fe7SAxel Dörfler	: tag(t)
668c603fe7SAxel Dörfler{
678c603fe7SAxel Dörfler}
688c603fe7SAxel Dörfler
698c603fe7SAxel Dörflerint IppAttribute::length() const
708c603fe7SAxel Dörfler{
718c603fe7SAxel Dörfler	return 1;
728c603fe7SAxel Dörfler}
738c603fe7SAxel Dörfler
748c603fe7SAxel Dörfleristream &IppAttribute::input(istream &is)
758c603fe7SAxel Dörfler{
768c603fe7SAxel Dörfler	return is;
778c603fe7SAxel Dörfler}
788c603fe7SAxel Dörfler
798c603fe7SAxel Dörflerostream &IppAttribute::output(ostream &os) const
808c603fe7SAxel Dörfler{
818c603fe7SAxel Dörfler	os << (unsigned char)tag;
828c603fe7SAxel Dörfler	return os;
838c603fe7SAxel Dörfler}
848c603fe7SAxel Dörfler
858c603fe7SAxel Dörflerostream &IppAttribute::print(ostream &os) const
868c603fe7SAxel Dörfler{
878c603fe7SAxel Dörfler	os << "Tag: " << hex << (int)tag << '\n';
888c603fe7SAxel Dörfler	return os;
898c603fe7SAxel Dörfler}
908c603fe7SAxel Dörfler
918c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
928c603fe7SAxel Dörfler
938c603fe7SAxel DörflerIppNamedAttribute::IppNamedAttribute(IPP_TAG t)
948c603fe7SAxel Dörfler	: IppAttribute(t)
958c603fe7SAxel Dörfler{
968c603fe7SAxel Dörfler}
978c603fe7SAxel Dörfler
988c603fe7SAxel DörflerIppNamedAttribute::IppNamedAttribute(IPP_TAG t, const char *s)
998c603fe7SAxel Dörfler	: IppAttribute(t), name(s ? s : "")
1008c603fe7SAxel Dörfler{
1018c603fe7SAxel Dörfler}
1028c603fe7SAxel Dörfler
1038c603fe7SAxel Dörflerint IppNamedAttribute::length() const
1048c603fe7SAxel Dörfler{
1058c603fe7SAxel Dörfler	return IppAttribute::length() + 2 + name.length();
1068c603fe7SAxel Dörfler}
1078c603fe7SAxel Dörfler
1088c603fe7SAxel Dörfleristream &IppNamedAttribute::input(istream &is)
1098c603fe7SAxel Dörfler{
1108c603fe7SAxel Dörfler	short len = readLength(is);
1118c603fe7SAxel Dörfler
1128c603fe7SAxel Dörfler	if (0 < len) {
1138c603fe7SAxel Dörfler		char *buffer = new char[len + 1];
1148c603fe7SAxel Dörfler		is.read(buffer, len);
1158c603fe7SAxel Dörfler		buffer[len] = '\0';
1168c603fe7SAxel Dörfler		name = buffer;
1178c603fe7SAxel Dörfler		delete [] buffer;
1188c603fe7SAxel Dörfler	}
1198c603fe7SAxel Dörfler
1208c603fe7SAxel Dörfler	return is;
1218c603fe7SAxel Dörfler}
1228c603fe7SAxel Dörfler
1238c603fe7SAxel Dörflerostream &IppNamedAttribute::output(ostream &os) const
1248c603fe7SAxel Dörfler{
1258c603fe7SAxel Dörfler	IppAttribute::output(os);
1268c603fe7SAxel Dörfler
1278c603fe7SAxel Dörfler	writeLength(os, name.length());
1288c603fe7SAxel Dörfler	os << name;
1298c603fe7SAxel Dörfler
1308c603fe7SAxel Dörfler	return os;
1318c603fe7SAxel Dörfler}
1328c603fe7SAxel Dörfler
1338c603fe7SAxel Dörflerostream &IppNamedAttribute::print(ostream &os) const
1348c603fe7SAxel Dörfler{
1358c603fe7SAxel Dörfler	IppAttribute::print(os);
1368c603fe7SAxel Dörfler	os << '\t' << "Name: " << name << '\n';
1378c603fe7SAxel Dörfler	return os;
1388c603fe7SAxel Dörfler}
1398c603fe7SAxel Dörfler
1408c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
1418c603fe7SAxel Dörfler
1428c603fe7SAxel DörflerIppNoValueAttribute::IppNoValueAttribute(IPP_TAG t)
1438c603fe7SAxel Dörfler	: IppNamedAttribute(t)
1448c603fe7SAxel Dörfler{
1458c603fe7SAxel Dörfler}
1468c603fe7SAxel Dörfler
1478c603fe7SAxel DörflerIppNoValueAttribute::IppNoValueAttribute(IPP_TAG t, const char *n)
1488c603fe7SAxel Dörfler	: IppNamedAttribute(t, n)
1498c603fe7SAxel Dörfler{
1508c603fe7SAxel Dörfler}
1518c603fe7SAxel Dörfler
1528c603fe7SAxel Dörflerint IppNoValueAttribute::length() const
1538c603fe7SAxel Dörfler{
1548c603fe7SAxel Dörfler	return IppAttribute::length() + 2;
1558c603fe7SAxel Dörfler}
1568c603fe7SAxel Dörfler
1578c603fe7SAxel Dörfleristream &IppNoValueAttribute::input(istream &is)
1588c603fe7SAxel Dörfler{
1598c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
1608c603fe7SAxel Dörfler
1618c603fe7SAxel Dörfler	short len = readLength(is);
1628c603fe7SAxel Dörfler
1638c603fe7SAxel Dörfler	if (0 < len) {
1648c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
1658c603fe7SAxel Dörfler	}
1668c603fe7SAxel Dörfler
1678c603fe7SAxel Dörfler	return is;
1688c603fe7SAxel Dörfler}
1698c603fe7SAxel Dörfler
1708c603fe7SAxel Dörflerostream &IppNoValueAttribute::output(ostream &os) const
1718c603fe7SAxel Dörfler{
1728c603fe7SAxel Dörfler	IppAttribute::output(os);
1738c603fe7SAxel Dörfler
1748c603fe7SAxel Dörfler	writeLength(os, 0);
1758c603fe7SAxel Dörfler
1768c603fe7SAxel Dörfler	return os;
1778c603fe7SAxel Dörfler}
1788c603fe7SAxel Dörfler
1798c603fe7SAxel Dörflerostream &IppNoValueAttribute::print(ostream &os) const
1808c603fe7SAxel Dörfler{
1818c603fe7SAxel Dörfler	return IppNamedAttribute::print(os);
1828c603fe7SAxel Dörfler}
1838c603fe7SAxel Dörfler
1848c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
1858c603fe7SAxel Dörfler
1868c603fe7SAxel DörflerIppIntegerAttribute::IppIntegerAttribute(IPP_TAG t)
1878c603fe7SAxel Dörfler	: IppNamedAttribute(t), value(0)
1888c603fe7SAxel Dörfler{
1898c603fe7SAxel Dörfler}
1908c603fe7SAxel Dörfler
1918c603fe7SAxel DörflerIppIntegerAttribute::IppIntegerAttribute(IPP_TAG t, const char *n, int v)
1928c603fe7SAxel Dörfler	: IppNamedAttribute(t, n), value(v)
1938c603fe7SAxel Dörfler{
1948c603fe7SAxel Dörfler}
1958c603fe7SAxel Dörfler
1968c603fe7SAxel Dörflerint IppIntegerAttribute::length() const
1978c603fe7SAxel Dörfler{
1988c603fe7SAxel Dörfler	return IppNamedAttribute::length() + 2 + 4;
1998c603fe7SAxel Dörfler}
2008c603fe7SAxel Dörfler
2018c603fe7SAxel Dörfleristream &IppIntegerAttribute::input(istream &is)
2028c603fe7SAxel Dörfler{
2038c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
2048c603fe7SAxel Dörfler
2058c603fe7SAxel Dörfler	short len = readLength(is);
2068c603fe7SAxel Dörfler
2078c603fe7SAxel Dörfler	if (0 < len && len <= 4) {
2088c603fe7SAxel Dörfler		is.read((char *)&value, sizeof(value));
2098c603fe7SAxel Dörfler		value = ntohl(value);
2108c603fe7SAxel Dörfler	} else {
2118c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
2128c603fe7SAxel Dörfler	}
2138c603fe7SAxel Dörfler
2148c603fe7SAxel Dörfler	return is;
2158c603fe7SAxel Dörfler}
2168c603fe7SAxel Dörfler
2178c603fe7SAxel Dörflerostream &IppIntegerAttribute::output(ostream &os) const
2188c603fe7SAxel Dörfler{
2198c603fe7SAxel Dörfler	IppNamedAttribute::output(os);
2208c603fe7SAxel Dörfler
2218c603fe7SAxel Dörfler	writeLength(os, 4);
2228c603fe7SAxel Dörfler	unsigned long val = htonl(value);
2238c603fe7SAxel Dörfler	os.write((char *)&val, sizeof(val));
2248c603fe7SAxel Dörfler	return os;
2258c603fe7SAxel Dörfler}
2268c603fe7SAxel Dörfler
2278c603fe7SAxel Dörflerostream &IppIntegerAttribute::print(ostream &os) const
2288c603fe7SAxel Dörfler{
2298c603fe7SAxel Dörfler	IppNamedAttribute::print(os);
2308c603fe7SAxel Dörfler	os << '\t' << "Value: " << dec << value << '\n';
2318c603fe7SAxel Dörfler	return os;
2328c603fe7SAxel Dörfler}
2338c603fe7SAxel Dörfler
2348c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
2358c603fe7SAxel Dörfler
2368c603fe7SAxel DörflerIppBooleanAttribute::IppBooleanAttribute(IPP_TAG t)
2378c603fe7SAxel Dörfler	: IppNamedAttribute(t), value(false)
2388c603fe7SAxel Dörfler{
2398c603fe7SAxel Dörfler}
2408c603fe7SAxel Dörfler
2418c603fe7SAxel DörflerIppBooleanAttribute::IppBooleanAttribute(IPP_TAG t, const char *n, bool f)
2428c603fe7SAxel Dörfler	: IppNamedAttribute(t, n), value(f)
2438c603fe7SAxel Dörfler{
2448c603fe7SAxel Dörfler}
2458c603fe7SAxel Dörfler
2468c603fe7SAxel Dörflerint IppBooleanAttribute::length() const
2478c603fe7SAxel Dörfler{
2488c603fe7SAxel Dörfler	return IppNamedAttribute::length() + 2 + 1;
2498c603fe7SAxel Dörfler}
2508c603fe7SAxel Dörfler
2518c603fe7SAxel Dörfler
2528c603fe7SAxel Dörfleristream &IppBooleanAttribute::input(istream &is)
2538c603fe7SAxel Dörfler{
2548c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
2558c603fe7SAxel Dörfler
2568c603fe7SAxel Dörfler	short len = readLength(is);
2578c603fe7SAxel Dörfler
2588c603fe7SAxel Dörfler	if (0 < len && len <= 1) {
2598c603fe7SAxel Dörfler		char c;
2608c603fe7SAxel Dörfler		is.read((char *)&c, sizeof(c));
2618c603fe7SAxel Dörfler		value = c ? true : false;
2628c603fe7SAxel Dörfler	} else {
2638c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
2648c603fe7SAxel Dörfler	}
2658c603fe7SAxel Dörfler
2668c603fe7SAxel Dörfler	return is;
2678c603fe7SAxel Dörfler}
2688c603fe7SAxel Dörfler
2698c603fe7SAxel Dörflerostream &IppBooleanAttribute::output(ostream &os) const
2708c603fe7SAxel Dörfler{
2718c603fe7SAxel Dörfler	IppNamedAttribute::output(os);
2728c603fe7SAxel Dörfler
2738c603fe7SAxel Dörfler	writeLength(os, 1);
2748c603fe7SAxel Dörfler	char c = (char)value;
2758c603fe7SAxel Dörfler	os.write((char *)&c, sizeof(c));
2768c603fe7SAxel Dörfler
2778c603fe7SAxel Dörfler	return os;
2788c603fe7SAxel Dörfler}
2798c603fe7SAxel Dörfler
2808c603fe7SAxel Dörflerostream &IppBooleanAttribute::print(ostream &os) const
2818c603fe7SAxel Dörfler{
2828c603fe7SAxel Dörfler	IppNamedAttribute::print(os);
2838c603fe7SAxel Dörfler	os << '\t' << "Value: " << value << '\n';
2848c603fe7SAxel Dörfler	return os;
2858c603fe7SAxel Dörfler}
2868c603fe7SAxel Dörfler
2878c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
2888c603fe7SAxel Dörfler
2898c603fe7SAxel DörflerIppDatetimeAttribute::IppDatetimeAttribute(IPP_TAG t)
2908c603fe7SAxel Dörfler	: IppNamedAttribute(t)
2918c603fe7SAxel Dörfler{
2928c603fe7SAxel Dörfler}
2938c603fe7SAxel Dörfler
2948c603fe7SAxel DörflerIppDatetimeAttribute::IppDatetimeAttribute(IPP_TAG t, const char *n, const DATETIME *dt)
2958c603fe7SAxel Dörfler	: IppNamedAttribute(t, n), datetime(*dt)
2968c603fe7SAxel Dörfler{
2978c603fe7SAxel Dörfler}
2988c603fe7SAxel Dörfler
2998c603fe7SAxel Dörflerint IppDatetimeAttribute::length() const
3008c603fe7SAxel Dörfler{
3018c603fe7SAxel Dörfler	return IppNamedAttribute::length() + 2 + 11;
3028c603fe7SAxel Dörfler}
3038c603fe7SAxel Dörfler
3048c603fe7SAxel Dörfleristream &IppDatetimeAttribute::input(istream &is)
3058c603fe7SAxel Dörfler{
3068c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
3078c603fe7SAxel Dörfler
3088c603fe7SAxel Dörfler	short len = readLength(is);
3098c603fe7SAxel Dörfler
3108c603fe7SAxel Dörfler	if (0 < len) {
3118c603fe7SAxel Dörfler		if (len == 11) {
3128c603fe7SAxel Dörfler			is >> datetime;
3138c603fe7SAxel Dörfler		} else {
3148c603fe7SAxel Dörfler			is.seekg(len, ios::cur);
3158c603fe7SAxel Dörfler		}
3168c603fe7SAxel Dörfler	}
3178c603fe7SAxel Dörfler
3188c603fe7SAxel Dörfler	return is;
3198c603fe7SAxel Dörfler}
3208c603fe7SAxel Dörfler
3218c603fe7SAxel Dörflerostream &IppDatetimeAttribute::output(ostream &os) const
3228c603fe7SAxel Dörfler{
3238c603fe7SAxel Dörfler	IppNamedAttribute::output(os);
3248c603fe7SAxel Dörfler
3258c603fe7SAxel Dörfler	writeLength(os, 11);
3268c603fe7SAxel Dörfler	os << datetime;
3278c603fe7SAxel Dörfler
3288c603fe7SAxel Dörfler	return os;
3298c603fe7SAxel Dörfler}
3308c603fe7SAxel Dörfler
3318c603fe7SAxel Dörflerostream &IppDatetimeAttribute::print(ostream &os) const
3328c603fe7SAxel Dörfler{
3338c603fe7SAxel Dörfler	IppNamedAttribute::print(os);
3348c603fe7SAxel Dörfler	os << '\t' << "Value(DateTime): " << datetime << '\n';
3358c603fe7SAxel Dörfler	return os;
3368c603fe7SAxel Dörfler}
3378c603fe7SAxel Dörfler
3388c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
3398c603fe7SAxel Dörfler
3408c603fe7SAxel DörflerIppStringAttribute::IppStringAttribute(IPP_TAG t)
3418c603fe7SAxel Dörfler	: IppNamedAttribute(t)
3428c603fe7SAxel Dörfler{
3438c603fe7SAxel Dörfler}
3448c603fe7SAxel Dörfler
3458c603fe7SAxel DörflerIppStringAttribute::IppStringAttribute(IPP_TAG t, const char *n, const char *s)
3468c603fe7SAxel Dörfler: IppNamedAttribute(t, n), text(s ? s : "")
3478c603fe7SAxel Dörfler{
3488c603fe7SAxel Dörfler}
3498c603fe7SAxel Dörfler
3508c603fe7SAxel Dörflerint IppStringAttribute::length() const
3518c603fe7SAxel Dörfler{
3528c603fe7SAxel Dörfler	return IppNamedAttribute::length() + 2 + text.length();
3538c603fe7SAxel Dörfler}
3548c603fe7SAxel Dörfler
3558c603fe7SAxel Dörfleristream &IppStringAttribute::input(istream &is)
3568c603fe7SAxel Dörfler{
3578c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
3588c603fe7SAxel Dörfler
3598c603fe7SAxel Dörfler	short len = readLength(is);
3608c603fe7SAxel Dörfler
3618c603fe7SAxel Dörfler	if (0 < len) {
3628c603fe7SAxel Dörfler		char *buffer = new char[len + 1];
3638c603fe7SAxel Dörfler		is.read(buffer, len);
3648c603fe7SAxel Dörfler		buffer[len] = '\0';
3658c603fe7SAxel Dörfler		text = buffer;
3668c603fe7SAxel Dörfler		delete [] buffer;
3678c603fe7SAxel Dörfler	}
3688c603fe7SAxel Dörfler
3698c603fe7SAxel Dörfler	return is;
3708c603fe7SAxel Dörfler}
3718c603fe7SAxel Dörfler
3728c603fe7SAxel Dörflerostream &IppStringAttribute::output(ostream &os) const
3738c603fe7SAxel Dörfler{
3748c603fe7SAxel Dörfler	IppNamedAttribute::output(os);
3758c603fe7SAxel Dörfler
3768c603fe7SAxel Dörfler	writeLength(os, text.length());
3778c603fe7SAxel Dörfler	os << text;
3788c603fe7SAxel Dörfler
3798c603fe7SAxel Dörfler	return os;
3808c603fe7SAxel Dörfler}
3818c603fe7SAxel Dörfler
3828c603fe7SAxel Dörflerostream &IppStringAttribute::print(ostream &os) const
3838c603fe7SAxel Dörfler{
3848c603fe7SAxel Dörfler	IppNamedAttribute::print(os);
3858c603fe7SAxel Dörfler	os << '\t' << "Value: " << text << '\n';
3868c603fe7SAxel Dörfler	return os;
3878c603fe7SAxel Dörfler}
3888c603fe7SAxel Dörfler
3898c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
3908c603fe7SAxel Dörfler
3918c603fe7SAxel DörflerIppDoubleStringAttribute::IppDoubleStringAttribute(IPP_TAG t)
3928c603fe7SAxel Dörfler	: IppNamedAttribute(t)
3938c603fe7SAxel Dörfler{
3948c603fe7SAxel Dörfler}
3958c603fe7SAxel Dörfler
3968c603fe7SAxel DörflerIppDoubleStringAttribute::IppDoubleStringAttribute(IPP_TAG t, const char *n, const char *s1, const char *s2)
3978c603fe7SAxel Dörfler: IppNamedAttribute(t, n), text1(s1 ? s1 : ""), text2(s2 ? s2 : "")
3988c603fe7SAxel Dörfler{
3998c603fe7SAxel Dörfler}
4008c603fe7SAxel Dörfler
4018c603fe7SAxel Dörflerint IppDoubleStringAttribute::length() const
4028c603fe7SAxel Dörfler{
4038c603fe7SAxel Dörfler	return IppNamedAttribute::length() + 2 + text1.length() + 2  + text2.length();
4048c603fe7SAxel Dörfler}
4058c603fe7SAxel Dörfler
4068c603fe7SAxel Dörfleristream &IppDoubleStringAttribute::input(istream &is)
4078c603fe7SAxel Dörfler{
4088c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
4098c603fe7SAxel Dörfler
4108c603fe7SAxel Dörfler	short len = readLength(is);
4118c603fe7SAxel Dörfler
4128c603fe7SAxel Dörfler	if (0 < len) {
4138c603fe7SAxel Dörfler		char *buffer = new char[len + 1];
4148c603fe7SAxel Dörfler		is.read(buffer, len);
4158c603fe7SAxel Dörfler		buffer[len] = '\0';
4168c603fe7SAxel Dörfler		text1 = buffer;
4178c603fe7SAxel Dörfler		delete [] buffer;
4188c603fe7SAxel Dörfler	}
4198c603fe7SAxel Dörfler
4208c603fe7SAxel Dörfler	len = readLength(is);
4218c603fe7SAxel Dörfler
4228c603fe7SAxel Dörfler	if (0 < len) {
4238c603fe7SAxel Dörfler		char *buffer = new char[len + 1];
4248c603fe7SAxel Dörfler		is.read(buffer, len);
4258c603fe7SAxel Dörfler		buffer[len] = '\0';
4268c603fe7SAxel Dörfler		text2 = buffer;
4278c603fe7SAxel Dörfler		delete [] buffer;
4288c603fe7SAxel Dörfler	}
4298c603fe7SAxel Dörfler
4308c603fe7SAxel Dörfler	return is;
4318c603fe7SAxel Dörfler}
4328c603fe7SAxel Dörfler
4338c603fe7SAxel Dörflerostream &IppDoubleStringAttribute::output(ostream &os) const
4348c603fe7SAxel Dörfler{
4358c603fe7SAxel Dörfler	IppNamedAttribute::output(os);
4368c603fe7SAxel Dörfler
4378c603fe7SAxel Dörfler	writeLength(os, text1.length());
4388c603fe7SAxel Dörfler	os << text1;
4398c603fe7SAxel Dörfler
4408c603fe7SAxel Dörfler	writeLength(os, text2.length());
4418c603fe7SAxel Dörfler	os << text2;
4428c603fe7SAxel Dörfler
4438c603fe7SAxel Dörfler	return os;
4448c603fe7SAxel Dörfler}
4458c603fe7SAxel Dörfler
4468c603fe7SAxel Dörflerostream &IppDoubleStringAttribute::print(ostream &os) const
4478c603fe7SAxel Dörfler{
4488c603fe7SAxel Dörfler	IppNamedAttribute::print(os);
4498c603fe7SAxel Dörfler	os << '\t' << "Value1: " << text1 << '\n';
4508c603fe7SAxel Dörfler	os << '\t' << "Value2: " << text2 << '\n';
4518c603fe7SAxel Dörfler	return os;
4528c603fe7SAxel Dörfler}
4538c603fe7SAxel Dörfler
4548c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
4558c603fe7SAxel Dörfler
4568c603fe7SAxel DörflerIppResolutionAttribute::IppResolutionAttribute(IPP_TAG t)
4578c603fe7SAxel Dörfler	: IppNamedAttribute(t), xres(0), yres(0), resolution_units((IPP_RESOLUTION_UNITS)0)
4588c603fe7SAxel Dörfler{
4598c603fe7SAxel Dörfler}
4608c603fe7SAxel Dörfler
4618c603fe7SAxel DörflerIppResolutionAttribute::IppResolutionAttribute(IPP_TAG t, const char *n, int x, int y, IPP_RESOLUTION_UNITS u)
4628c603fe7SAxel Dörfler	: IppNamedAttribute(t, n), xres(x), yres(y), resolution_units(u)
4638c603fe7SAxel Dörfler{
4648c603fe7SAxel Dörfler}
4658c603fe7SAxel Dörfler
4668c603fe7SAxel Dörflerint IppResolutionAttribute::length() const
4678c603fe7SAxel Dörfler{
4688c603fe7SAxel Dörfler	return IppNamedAttribute::length() + 2 + 4 + 2 + 4 + 2 + 1;
4698c603fe7SAxel Dörfler}
4708c603fe7SAxel Dörfler
4718c603fe7SAxel Dörfleristream &IppResolutionAttribute::input(istream &is)
4728c603fe7SAxel Dörfler{
4738c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
4748c603fe7SAxel Dörfler
4758c603fe7SAxel Dörfler	short len = readLength(is);
4768c603fe7SAxel Dörfler
4778c603fe7SAxel Dörfler	if (0 < len && len <= 4) {
4788c603fe7SAxel Dörfler		is.read((char *)&xres, sizeof(xres));
4798c603fe7SAxel Dörfler		xres = ntohl(xres);
4808c603fe7SAxel Dörfler	} else {
4818c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
4828c603fe7SAxel Dörfler	}
4838c603fe7SAxel Dörfler
4848c603fe7SAxel Dörfler	len = readLength(is);
4858c603fe7SAxel Dörfler
4868c603fe7SAxel Dörfler	if (0 < len && len <= 4) {
4878c603fe7SAxel Dörfler		is.read((char *)&yres, sizeof(yres));
4888c603fe7SAxel Dörfler		yres = ntohl(yres);
4898c603fe7SAxel Dörfler	} else {
4908c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
4918c603fe7SAxel Dörfler	}
4928c603fe7SAxel Dörfler
4938c603fe7SAxel Dörfler	len = readLength(is);
4948c603fe7SAxel Dörfler
4958c603fe7SAxel Dörfler	if (len == 1) {
4968c603fe7SAxel Dörfler		char c;
4978c603fe7SAxel Dörfler		is.read((char *)&c, sizeof(c));
4988c603fe7SAxel Dörfler		resolution_units = (IPP_RESOLUTION_UNITS)c;
4998c603fe7SAxel Dörfler	} else {
5008c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
5018c603fe7SAxel Dörfler	}
5028c603fe7SAxel Dörfler
5038c603fe7SAxel Dörfler	return is;
5048c603fe7SAxel Dörfler}
5058c603fe7SAxel Dörfler
5068c603fe7SAxel Dörflerostream &IppResolutionAttribute::output(ostream &os) const
5078c603fe7SAxel Dörfler{
5088c603fe7SAxel Dörfler	IppNamedAttribute::output(os);
5098c603fe7SAxel Dörfler
5108c603fe7SAxel Dörfler	writeLength(os, 4);
5118c603fe7SAxel Dörfler	unsigned long val = htonl(xres);
5128c603fe7SAxel Dörfler	os.write((char *)&val, sizeof(val));
5138c603fe7SAxel Dörfler
5148c603fe7SAxel Dörfler	writeLength(os, 4);
5158c603fe7SAxel Dörfler	val = htonl(yres);
5168c603fe7SAxel Dörfler	os.write((char *)&val, sizeof(val));
5178c603fe7SAxel Dörfler
5188c603fe7SAxel Dörfler	writeLength(os, 1);
5198c603fe7SAxel Dörfler	unsigned char c = (unsigned char)resolution_units;
5208c603fe7SAxel Dörfler	os.write((char *)&c, sizeof(c));
5218c603fe7SAxel Dörfler
5228c603fe7SAxel Dörfler	return os;
5238c603fe7SAxel Dörfler}
5248c603fe7SAxel Dörfler
5258c603fe7SAxel Dörflerostream &IppResolutionAttribute::print(ostream &os) const
5268c603fe7SAxel Dörfler{
5278c603fe7SAxel Dörfler	IppNamedAttribute::print(os);
5288c603fe7SAxel Dörfler	os << '\t' << "Value(xres): " << dec << xres << '\n';
5298c603fe7SAxel Dörfler	os << '\t' << "Value(yres): " << dec << yres << '\n';
5308c603fe7SAxel Dörfler	os << '\t' << "Value(unit): " << dec << resolution_units << '\n';
5318c603fe7SAxel Dörfler	return os;
5328c603fe7SAxel Dörfler}
5338c603fe7SAxel Dörfler
5348c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
5358c603fe7SAxel Dörfler
5368c603fe7SAxel DörflerIppRangeOfIntegerAttribute::IppRangeOfIntegerAttribute(IPP_TAG t)
5378c603fe7SAxel Dörfler	: IppNamedAttribute(t), lower(0), upper(0)
5388c603fe7SAxel Dörfler{
5398c603fe7SAxel Dörfler}
5408c603fe7SAxel Dörfler
5418c603fe7SAxel DörflerIppRangeOfIntegerAttribute::IppRangeOfIntegerAttribute(IPP_TAG t, const char *n, int l, int u)
5428c603fe7SAxel Dörfler	: IppNamedAttribute(t, n), lower(l), upper(u)
5438c603fe7SAxel Dörfler{
5448c603fe7SAxel Dörfler}
5458c603fe7SAxel Dörfler
5468c603fe7SAxel Dörflerint IppRangeOfIntegerAttribute::length() const
5478c603fe7SAxel Dörfler{
5488c603fe7SAxel Dörfler	return IppNamedAttribute::length() + 2 + 4 + 2 + 4;
5498c603fe7SAxel Dörfler}
5508c603fe7SAxel Dörfler
5518c603fe7SAxel Dörfleristream &IppRangeOfIntegerAttribute::input(istream &is)
5528c603fe7SAxel Dörfler{
5538c603fe7SAxel Dörfler	IppNamedAttribute::input(is);
5548c603fe7SAxel Dörfler
5558c603fe7SAxel Dörfler	short len = readLength(is);
5568c603fe7SAxel Dörfler
5578c603fe7SAxel Dörfler	if (0 < len && len <= 4) {
5588c603fe7SAxel Dörfler		is.read((char *)&lower, sizeof(lower));
5598c603fe7SAxel Dörfler		lower = ntohl(lower);
5608c603fe7SAxel Dörfler	} else {
5618c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
5628c603fe7SAxel Dörfler	}
5638c603fe7SAxel Dörfler
5648c603fe7SAxel Dörfler	len = readLength(is);
5658c603fe7SAxel Dörfler
5668c603fe7SAxel Dörfler	if (0 < len && len <= 4) {
5678c603fe7SAxel Dörfler		is.read((char *)&upper, sizeof(upper));
5688c603fe7SAxel Dörfler		upper = ntohl(upper);
5698c603fe7SAxel Dörfler	} else {
5708c603fe7SAxel Dörfler		is.seekg(len, ios::cur);
5718c603fe7SAxel Dörfler	}
5728c603fe7SAxel Dörfler
5738c603fe7SAxel Dörfler	return is;
5748c603fe7SAxel Dörfler}
5758c603fe7SAxel Dörfler
5768c603fe7SAxel Dörflerostream &IppRangeOfIntegerAttribute::output(ostream &os) const
5778c603fe7SAxel Dörfler{
5788c603fe7SAxel Dörfler	IppNamedAttribute::output(os);
5798c603fe7SAxel Dörfler
5808c603fe7SAxel Dörfler	writeLength(os, 4);
5818c603fe7SAxel Dörfler	unsigned long val = htonl(lower);
5828c603fe7SAxel Dörfler	os.write((char *)&val, sizeof(val));
5838c603fe7SAxel Dörfler
5848c603fe7SAxel Dörfler	writeLength(os, 4);
5858c603fe7SAxel Dörfler	val = htonl(upper);
5868c603fe7SAxel Dörfler	os.write((char *)&val, sizeof(val));
5878c603fe7SAxel Dörfler
5888c603fe7SAxel Dörfler	return os;
5898c603fe7SAxel Dörfler}
5908c603fe7SAxel Dörfler
5918c603fe7SAxel Dörflerostream &IppRangeOfIntegerAttribute::print(ostream &os) const
5928c603fe7SAxel Dörfler{
5938c603fe7SAxel Dörfler	IppNamedAttribute::print(os);
5948c603fe7SAxel Dörfler	os << '\t' << "Value(lower): " << dec << lower << '\n';
5958c603fe7SAxel Dörfler	os << '\t' << "Value(upper): " << dec << upper << '\n';
5968c603fe7SAxel Dörfler	return os;
5978c603fe7SAxel Dörfler}
5988c603fe7SAxel Dörfler
5998c603fe7SAxel Dörfler/*----------------------------------------------------------------------*/
6008c603fe7SAxel Dörfler
6018c603fe7SAxel DörflerIppContent::IppContent()
6028c603fe7SAxel Dörfler{
6038c603fe7SAxel Dörfler	version      = 0x0100;
6048c603fe7SAxel Dörfler	operation_id = IPP_GET_PRINTER_ATTRIBUTES;
6058c603fe7SAxel Dörfler	request_id   = 0x00000001;
6068c603fe7SAxel Dörfler
6078c603fe7SAxel Dörfler	is = NULL;
6088c603fe7SAxel Dörfler	size = -1;
6098c603fe7SAxel Dörfler}
6108c603fe7SAxel Dörfler
6118c603fe7SAxel DörflerIppContent::~IppContent()
6128c603fe7SAxel Dörfler{
6138c603fe7SAxel Dörfler	for (list<IppAttribute *>::const_iterator it = attrs.begin(); it != attrs.end(); it++) {
6148c603fe7SAxel Dörfler		delete (*it);
6158c603fe7SAxel Dörfler	}
6168c603fe7SAxel Dörfler}
6178c603fe7SAxel Dörfler
6188c603fe7SAxel Dörflerunsigned short IppContent::getVersion() const
6198c603fe7SAxel Dörfler{
6208c603fe7SAxel Dörfler	return version;
6218c603fe7SAxel Dörfler}
6228c603fe7SAxel Dörfler
6238c603fe7SAxel Dörflervoid IppContent::setVersion(unsigned short i)
6248c603fe7SAxel Dörfler{
6258c603fe7SAxel Dörfler	version = i;
6268c603fe7SAxel Dörfler}
6278c603fe7SAxel Dörfler
6288c603fe7SAxel Dörfler
6298c603fe7SAxel DörflerIPP_OPERATION_ID IppContent::getOperationId() const
6308c603fe7SAxel Dörfler{
6318c603fe7SAxel Dörfler	return (IPP_OPERATION_ID)operation_id;
6328c603fe7SAxel Dörfler}
6338c603fe7SAxel Dörfler
6348c603fe7SAxel Dörflervoid IppContent::setOperationId(IPP_OPERATION_ID i)
6358c603fe7SAxel Dörfler{
6368c603fe7SAxel Dörfler	operation_id = i;
6378c603fe7SAxel Dörfler}
6388c603fe7SAxel Dörfler
6398c603fe7SAxel DörflerIPP_STATUS_CODE IppContent::getStatusCode() const
6408c603fe7SAxel Dörfler{
6418c603fe7SAxel Dörfler	return (IPP_STATUS_CODE)operation_id;
6428c603fe7SAxel Dörfler}
6438c603fe7SAxel Dörfler
6448c603fe7SAxel Dörflerunsigned long IppContent::getRequestId() const
6458c603fe7SAxel Dörfler{
6468c603fe7SAxel Dörfler	return request_id;
6478c603fe7SAxel Dörfler}
6488c603fe7SAxel Dörfler
6498c603fe7SAxel Dörflervoid IppContent::setRequestId(unsigned long i)
6508c603fe7SAxel Dörfler{
6518c603fe7SAxel Dörfler	request_id = i;
6528c603fe7SAxel Dörfler}
6538c603fe7SAxel Dörfler
6548c603fe7SAxel Dörfleristream &IppContent::input(istream &is)
6558c603fe7SAxel Dörfler{
6568c603fe7SAxel Dörfler	if (!is.read((char *)&version, sizeof(version))) {
6578c603fe7SAxel Dörfler		return is;
6588c603fe7SAxel Dörfler	}
6598c603fe7SAxel Dörfler
6608c603fe7SAxel Dörfler	version = ntohs(version);
6618c603fe7SAxel Dörfler
6628c603fe7SAxel Dörfler	if (!is.read((char *)&operation_id, sizeof(operation_id))) {
6638c603fe7SAxel Dörfler		return is;
6648c603fe7SAxel Dörfler	}
6658c603fe7SAxel Dörfler
6668c603fe7SAxel Dörfler	operation_id = ntohs(operation_id);
6678c603fe7SAxel Dörfler
6688c603fe7SAxel Dörfler	if (!is.read((char *)&request_id, sizeof(request_id))) {
6698c603fe7SAxel Dörfler		return is;
6708c603fe7SAxel Dörfler	}
6718c603fe7SAxel Dörfler
6728c603fe7SAxel Dörfler	request_id = ntohl(request_id);
6738c603fe7SAxel Dörfler	char tag;
6748c603fe7SAxel Dörfler
6758c603fe7SAxel Dörfler	while (1) {
6768c603fe7SAxel Dörfler
6778c603fe7SAxel Dörfler		if (!is.read((char *)&tag, sizeof(tag))) {
6788c603fe7SAxel Dörfler			return is;
6798c603fe7SAxel Dörfler		}
6808c603fe7SAxel Dörfler
6818c603fe7SAxel Dörfler		if (tag <= 0x0F) {	// delimiter
6828c603fe7SAxel Dörfler
6838c603fe7SAxel Dörfler//			case IPP_OPERATION_ATTRIBUTES_TAG:
6848c603fe7SAxel Dörfler//			case IPP_JOB_ATTRIBUTES_TAG:
6858c603fe7SAxel Dörfler//			case IPP_END_OF_ATTRIBUTES_TAG:
6868c603fe7SAxel Dörfler//			case IPP_PRINTER_ATTRIBUTES_TAG:
6878c603fe7SAxel Dörfler//			case IPP_UNSUPPORTED_ATTRIBUTES_TAG:
6888c603fe7SAxel Dörfler
6898c603fe7SAxel Dörfler			attrs.push_back(new IppAttribute((IPP_TAG)tag));
6908c603fe7SAxel Dörfler			if (tag == IPP_END_OF_ATTRIBUTES_TAG) {
6918c603fe7SAxel Dörfler				break;
6928c603fe7SAxel Dörfler			}
6938c603fe7SAxel Dörfler
6948c603fe7SAxel Dörfler		} else if (tag <= 0x1F) {
6958c603fe7SAxel Dörfler
6968c603fe7SAxel Dörfler			IppNoValueAttribute *attr = new IppNoValueAttribute((IPP_TAG)tag);
6978c603fe7SAxel Dörfler			is >> *attr;
6988c603fe7SAxel Dörfler			attrs.push_back(attr);
6998c603fe7SAxel Dörfler
7008c603fe7SAxel Dörfler		} else if (tag <= 0x2F) {	// integer values
7018c603fe7SAxel Dörfler
7028c603fe7SAxel Dörfler			switch (tag) {
7038c603fe7SAxel Dörfler			case IPP_INTEGER:
7048c603fe7SAxel Dörfler			case IPP_ENUM:
7058c603fe7SAxel Dörfler				{
7068c603fe7SAxel Dörfler					IppIntegerAttribute *attr = new IppIntegerAttribute((IPP_TAG)tag);
7078c603fe7SAxel Dörfler					is >> *attr;
7088c603fe7SAxel Dörfler					attrs.push_back(attr);
7098c603fe7SAxel Dörfler				}
7108c603fe7SAxel Dörfler				break;
7118c603fe7SAxel Dörfler			case IPP_BOOLEAN:
7128c603fe7SAxel Dörfler				{
7138c603fe7SAxel Dörfler					IppBooleanAttribute *attr = new IppBooleanAttribute((IPP_TAG)tag);
7148c603fe7SAxel Dörfler					is >> *attr;
7158c603fe7SAxel Dörfler					attrs.push_back(attr);
7168c603fe7SAxel Dörfler				}
7178c603fe7SAxel Dörfler				break;
7188c603fe7SAxel Dörfler			default:
7198c603fe7SAxel Dörfler				{
7208c603fe7SAxel Dörfler					short len = readLength(is);
7218c603fe7SAxel Dörfler					is.seekg(len, ios::cur);
7228c603fe7SAxel Dörfler					len = readLength(is);
7238c603fe7SAxel Dörfler					is.seekg(len, ios::cur);
7248c603fe7SAxel Dörfler				}
7258c603fe7SAxel Dörfler				break;
7268c603fe7SAxel Dörfler			}
7278c603fe7SAxel Dörfler
7288c603fe7SAxel Dörfler		} else if (tag <= 0x3F) {	// octetString values
7298c603fe7SAxel Dörfler
7308c603fe7SAxel Dörfler			switch (tag) {
7318c603fe7SAxel Dörfler			case IPP_STRING:
7328c603fe7SAxel Dörfler				{
7338c603fe7SAxel Dörfler					IppStringAttribute *attr = new IppStringAttribute((IPP_TAG)tag);
7348c603fe7SAxel Dörfler					is >> *attr;
7358c603fe7SAxel Dörfler					attrs.push_back(attr);
7368c603fe7SAxel Dörfler				}
7378c603fe7SAxel Dörfler				break;
7388c603fe7SAxel Dörfler			case IPP_DATETIME:
7398c603fe7SAxel Dörfler				{
7408c603fe7SAxel Dörfler					IppDatetimeAttribute *attr = new IppDatetimeAttribute((IPP_TAG)tag);
7418c603fe7SAxel Dörfler					is >> *attr;
7428c603fe7SAxel Dörfler					attrs.push_back(attr);
7438c603fe7SAxel Dörfler				}
7448c603fe7SAxel Dörfler				break;
7458c603fe7SAxel Dörfler			case IPP_RESOLUTION:
7468c603fe7SAxel Dörfler				{
7478c603fe7SAxel Dörfler					IppResolutionAttribute *attr = new IppResolutionAttribute((IPP_TAG)tag);
7488c603fe7SAxel Dörfler					is >> *attr;
7498c603fe7SAxel Dörfler					attrs.push_back(attr);
7508c603fe7SAxel Dörfler				}
7518c603fe7SAxel Dörfler				break;
7528c603fe7SAxel Dörfler			case IPP_RANGE_OF_INTEGER:
7538c603fe7SAxel Dörfler				{
7548c603fe7SAxel Dörfler					IppRangeOfIntegerAttribute *attr = new IppRangeOfIntegerAttribute((IPP_TAG)tag);
7558c603fe7SAxel Dörfler					is >> *attr;
7568c603fe7SAxel Dörfler					attrs.push_back(attr);
7578c603fe7SAxel Dörfler				}
7588c603fe7SAxel Dörfler				break;
7598c603fe7SAxel Dörfler			case IPP_TEXT_WITH_LANGUAGE:
7608c603fe7SAxel Dörfler			case IPP_NAME_WITH_LANGUAGE:
7618c603fe7SAxel Dörfler				{
7628c603fe7SAxel Dörfler					IppDoubleStringAttribute *attr = new IppDoubleStringAttribute((IPP_TAG)tag);
7638c603fe7SAxel Dörfler					is >> *attr;
7648c603fe7SAxel Dörfler					attrs.push_back(attr);
7658c603fe7SAxel Dörfler				}
7668c603fe7SAxel Dörfler				break;
7678c603fe7SAxel Dörfler			default:
7688c603fe7SAxel Dörfler				{
7698c603fe7SAxel Dörfler					short len = readLength(is);
7708c603fe7SAxel Dörfler					is.seekg(len, ios::cur);
7718c603fe7SAxel Dörfler					len = readLength(is);
7728c603fe7SAxel Dörfler					is.seekg(len, ios::cur);
7738c603fe7SAxel Dörfler				}
7748c603fe7SAxel Dörfler				break;
7758c603fe7SAxel Dörfler			}
7768c603fe7SAxel Dörfler
7778c603fe7SAxel Dörfler		} else if (tag <= 0x5F) {	// character-string values
7788c603fe7SAxel Dörfler
7798c603fe7SAxel Dörfler//			case IPP_TEXT_WITHOUT_LANGUAGE:
7808c603fe7SAxel Dörfler//			case IPP_NAME_WITHOUT_LANGUAGE:
7818c603fe7SAxel Dörfler//			case IPP_KEYWORD:
7828c603fe7SAxel Dörfler//			case IPP_URI:
7838c603fe7SAxel Dörfler//			case IPP_URISCHEME:
7848c603fe7SAxel Dörfler//			case IPP_CHARSET:
7858c603fe7SAxel Dörfler//			case IPP_NATURAL_LANGUAGE:
7868c603fe7SAxel Dörfler//			case IPP_MIME_MEDIA_TYPE:
7878c603fe7SAxel Dörfler
7888c603fe7SAxel Dörfler			IppStringAttribute *attr = new IppStringAttribute((IPP_TAG)tag);
7898c603fe7SAxel Dörfler			is >> *attr;
7908c603fe7SAxel Dörfler			attrs.push_back(attr);
7918c603fe7SAxel Dörfler		}
7928c603fe7SAxel Dörfler	}
7938c603fe7SAxel Dörfler	return is;
7948c603fe7SAxel Dörfler}
7958c603fe7SAxel Dörfler
7968c603fe7SAxel Dörflerostream &IppContent::output(ostream &os) const
7978c603fe7SAxel Dörfler{
7988c603fe7SAxel Dörfler	unsigned short ns_version = htons(version);						// version-number
7998c603fe7SAxel Dörfler	os.write((char *)&ns_version, sizeof(ns_version));				// version-number
8008c603fe7SAxel Dörfler
8018c603fe7SAxel Dörfler	unsigned short ns_operation_id = htons(operation_id);			// operation-id
8028c603fe7SAxel Dörfler	os.write((char *)&ns_operation_id, sizeof(ns_operation_id));	// operation-id
8038c603fe7SAxel Dörfler
8048c603fe7SAxel Dörfler	unsigned long ns_request_id = htonl(request_id);				// request-id
8058c603fe7SAxel Dörfler	os.write((char *)&ns_request_id, sizeof(ns_request_id));		// request-id
8068c603fe7SAxel Dörfler
8078c603fe7SAxel Dörfler	for (list<IppAttribute *>::const_iterator it = attrs.begin(); it != attrs.end(); it++) {
8088c603fe7SAxel Dörfler		os << *(*it);
8098c603fe7SAxel Dörfler	}
8108c603fe7SAxel Dörfler
8118c603fe7SAxel Dörfler	ifstream ifs;
8128c603fe7SAxel Dörfler	istream *iss = is;
8138c603fe7SAxel Dörfler	if (iss == NULL) {
8148c603fe7SAxel Dörfler		if (!file_path.empty()) {
8158c603fe7SAxel Dörfler			ifs.open(file_path.c_str(), ios::in | ios::binary);
8168c603fe7SAxel Dörfler			iss = &ifs;
8178c603fe7SAxel Dörfler		}
8188c603fe7SAxel Dörfler	}
8198c603fe7SAxel Dörfler	if (iss && iss->good()) {
8208c603fe7SAxel Dörfler		if (iss->good()) {
8218c603fe7SAxel Dörfler			char c;
8228c603fe7SAxel Dörfler			while (iss->get(c)) {
8238c603fe7SAxel Dörfler				os.put(c);
8248c603fe7SAxel Dörfler			}
8258c603fe7SAxel Dörfler		}
8268c603fe7SAxel Dörfler	}
8278c603fe7SAxel Dörfler
8288c603fe7SAxel Dörfler	return os;
8298c603fe7SAxel Dörfler}
8308c603fe7SAxel Dörfler
8318c603fe7SAxel Dörflervoid IppContent::setDelimiter(IPP_TAG tag)
8328c603fe7SAxel Dörfler{
8338c603fe7SAxel Dörfler	attrs.push_back(new IppAttribute(tag));
8348c603fe7SAxel Dörfler}
8358c603fe7SAxel Dörfler
8368c603fe7SAxel Dörflervoid IppContent::setInteger(const char *name, int value)
8378c603fe7SAxel Dörfler{
8388c603fe7SAxel Dörfler	attrs.push_back(new IppIntegerAttribute(IPP_INTEGER, name, value));
8398c603fe7SAxel Dörfler}
8408c603fe7SAxel Dörfler
8418c603fe7SAxel Dörflervoid IppContent::setBoolean(const char *name, bool value)
8428c603fe7SAxel Dörfler{
8438c603fe7SAxel Dörfler	attrs.push_back(new IppBooleanAttribute(IPP_BOOLEAN, name, value));
8448c603fe7SAxel Dörfler}
8458c603fe7SAxel Dörfler
8468c603fe7SAxel Dörflervoid IppContent::setString(const char *name, const char *value)
8478c603fe7SAxel Dörfler{
8488c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_STRING, name, value));
8498c603fe7SAxel Dörfler}
8508c603fe7SAxel Dörfler
8518c603fe7SAxel Dörflervoid IppContent::setDateTime(const char *name, const DATETIME *dt)
8528c603fe7SAxel Dörfler{
8538c603fe7SAxel Dörfler	attrs.push_back(new IppDatetimeAttribute(IPP_DATETIME, name, dt));
8548c603fe7SAxel Dörfler}
8558c603fe7SAxel Dörfler
8568c603fe7SAxel Dörflervoid IppContent::setResolution(const char *name, int x, int y, IPP_RESOLUTION_UNITS u)
8578c603fe7SAxel Dörfler{
8588c603fe7SAxel Dörfler	attrs.push_back(new IppResolutionAttribute(IPP_RESOLUTION, name, x, y, u));
8598c603fe7SAxel Dörfler}
8608c603fe7SAxel Dörfler
8618c603fe7SAxel Dörflervoid IppContent::setRangeOfInteger(const char *name, int lower, int upper)
8628c603fe7SAxel Dörfler{
8638c603fe7SAxel Dörfler	attrs.push_back(new IppRangeOfIntegerAttribute(IPP_RANGE_OF_INTEGER, name, lower, upper));
8648c603fe7SAxel Dörfler}
8658c603fe7SAxel Dörfler
8668c603fe7SAxel Dörflervoid IppContent::setTextWithLanguage(const char *name, const char *s1, const char *s2)
8678c603fe7SAxel Dörfler{
8688c603fe7SAxel Dörfler	attrs.push_back(new IppDoubleStringAttribute(IPP_TEXT_WITH_LANGUAGE, name, s1, s2));
8698c603fe7SAxel Dörfler}
8708c603fe7SAxel Dörfler
8718c603fe7SAxel Dörflervoid IppContent::setNameWithLanguage(const char *name, const char *s1, const char *s2)
8728c603fe7SAxel Dörfler{
8738c603fe7SAxel Dörfler	attrs.push_back(new IppDoubleStringAttribute(IPP_NAME_WITH_LANGUAGE, name, s1, s2));
8748c603fe7SAxel Dörfler}
8758c603fe7SAxel Dörfler
8768c603fe7SAxel Dörflervoid IppContent::setTextWithoutLanguage(const char *name, const char *value)
8778c603fe7SAxel Dörfler{
8788c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_TEXT_WITHOUT_LANGUAGE, name, value));
8798c603fe7SAxel Dörfler}
8808c603fe7SAxel Dörfler
8818c603fe7SAxel Dörflervoid IppContent::setNameWithoutLanguage(const char *name, const char *value)
8828c603fe7SAxel Dörfler{
8838c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_NAME_WITHOUT_LANGUAGE, name, value));
8848c603fe7SAxel Dörfler}
8858c603fe7SAxel Dörfler
8868c603fe7SAxel Dörflervoid IppContent::setKeyword(const char *name, const char *value)
8878c603fe7SAxel Dörfler{
8888c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_KEYWORD, name, value));
8898c603fe7SAxel Dörfler}
8908c603fe7SAxel Dörfler
8918c603fe7SAxel Dörflervoid IppContent::setURI(const char *name, const char *value)
8928c603fe7SAxel Dörfler{
8938c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_URI, name, value));
8948c603fe7SAxel Dörfler}
8958c603fe7SAxel Dörfler
8968c603fe7SAxel Dörflervoid IppContent::setURIScheme(const char *name, const char *value)
8978c603fe7SAxel Dörfler{
8988c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_URISCHEME, name, value));
8998c603fe7SAxel Dörfler}
9008c603fe7SAxel Dörfler
9018c603fe7SAxel Dörflervoid IppContent::setCharset(const char *name, const char *value)
9028c603fe7SAxel Dörfler{
9038c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_CHARSET, name, value));
9048c603fe7SAxel Dörfler}
9058c603fe7SAxel Dörfler
9068c603fe7SAxel Dörflervoid IppContent::setNaturalLanguage(const char *name, const char *value)
9078c603fe7SAxel Dörfler{
9088c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_NATURAL_LANGUAGE, name, value));
9098c603fe7SAxel Dörfler}
9108c603fe7SAxel Dörfler
9118c603fe7SAxel Dörflervoid IppContent::setMimeMediaType(const char *name, const char *value)
9128c603fe7SAxel Dörfler{
9138c603fe7SAxel Dörfler	attrs.push_back(new IppStringAttribute(IPP_MIME_MEDIA_TYPE, name, value));
9148c603fe7SAxel Dörfler}
9158c603fe7SAxel Dörfler
9168c603fe7SAxel Dörflerint IppContent::length() const
9178c603fe7SAxel Dörfler{
9188c603fe7SAxel Dörfler	int length = 8;	// sizeof(version-number + operation-id + request-id)
9198c603fe7SAxel Dörfler
9208c603fe7SAxel Dörfler	for (list<IppAttribute *>::const_iterator it = attrs.begin(); it != attrs.end(); it++) {
9218c603fe7SAxel Dörfler		length += (*it)->length();
9228c603fe7SAxel Dörfler	}
9238c603fe7SAxel Dörfler
9248c603fe7SAxel Dörfler	ifstream ifs;
9258c603fe7SAxel Dörfler	istream *iss = is;
9268c603fe7SAxel Dörfler	if (iss == NULL) {
9278c603fe7SAxel Dörfler		if (!file_path.empty()) {
9288c603fe7SAxel Dörfler			ifs.open(file_path.c_str(), ios::in | ios::binary);
9298c603fe7SAxel Dörfler			iss = &ifs;
9308c603fe7SAxel Dörfler		}
9318c603fe7SAxel Dörfler	}
9328c603fe7SAxel Dörfler	if (iss && iss->good()) {
9338c603fe7SAxel Dörfler		int fsize = size;
9348c603fe7SAxel Dörfler		if (fsize < 0) {
9358c603fe7SAxel Dörfler			streampos pos = iss->tellg();
9368c603fe7SAxel Dörfler			iss->seekg(0, ios::end);
9378c603fe7SAxel Dörfler			fsize = iss->tellg();
9388c603fe7SAxel Dörfler			iss->seekg(pos, ios::beg);
9398c603fe7SAxel Dörfler		}
9408c603fe7SAxel Dörfler		if (fsize > 0) {
9418c603fe7SAxel Dörfler			length += fsize;
9428c603fe7SAxel Dörfler		}
9438c603fe7SAxel Dörfler	}
9448c603fe7SAxel Dörfler
9458c603fe7SAxel Dörfler	return length;
9468c603fe7SAxel Dörfler}
9478c603fe7SAxel Dörfler
9488c603fe7SAxel Dörflervoid IppContent::setRawData(const char *file, int n)
9498c603fe7SAxel Dörfler{
9508c603fe7SAxel Dörfler	file_path = file;
9518c603fe7SAxel Dörfler	size = n;
9528c603fe7SAxel Dörfler}
9538c603fe7SAxel Dörfler
9548c603fe7SAxel Dörflervoid IppContent::setRawData(istream &ifs, int n)
9558c603fe7SAxel Dörfler{
9568c603fe7SAxel Dörfler	is = &ifs;
9578c603fe7SAxel Dörfler	size = n;
9588c603fe7SAxel Dörfler}
9598c603fe7SAxel Dörfler
9608c603fe7SAxel Dörflerostream &IppContent::print(ostream &os) const
9618c603fe7SAxel Dörfler{
9628c603fe7SAxel Dörfler	os << "version:      " << hex << version << '\n';
9638c603fe7SAxel Dörfler	os << "operation_id: " << hex << operation_id << '\n';
9648c603fe7SAxel Dörfler	os << "request_id:   " << hex << request_id << '\n';
9658c603fe7SAxel Dörfler
9668c603fe7SAxel Dörfler	for (list<IppAttribute *>::const_iterator it = attrs.begin(); it != attrs.end(); it++) {
9678c603fe7SAxel Dörfler		(*it)->print(os);
968