1 // Sun, 18 Jun 2000 2 // Y.Takagi 3 4 #ifndef __IppContent_H 5 #define __IppContent_H 6 7 #include <iostream> 8 #include <list> 9 #include <string> 10 11 #if (!__MWERKS__) 12 using namespace std; 13 #else 14 #define std 15 #endif 16 17 enum IPP_OPERATION_ID { 18 19 /* reserved, not used: 0x0000 */ 20 /* reserved, not used: 0x0001 */ 21 22 IPP_PRINT_JOB = 0x0002, // printer operation 23 IPP_PRINT_URI = 0x0003, // printer operation 24 IPP_VALIDATE_JOB = 0x0004, // printer operation 25 IPP_CREATE_JOB = 0x0005, // printer operation 26 27 IPP_SEND_DOCUMENT = 0x0006, // job operation 28 IPP_SEND_URI = 0x0007, // job operation 29 IPP_CANCEL_JOB = 0x0008, // job operation 30 IPP_GET_JOB_ATTRIBUTES = 0x0009, // job operation 31 32 IPP_GET_JOBS = 0x000A, // printer operation 33 IPP_GET_PRINTER_ATTRIBUTES = 0x000B // printer operation 34 35 /* reserved for future operations: 0x000C-0x3FFF */ 36 /* reserved for private extensions: 0x4000-0x8FFF */ 37 }; 38 39 enum IPP_STATUS_CODE { 40 41 IPP_SUCCESSFUL_OK_S = 0x0000, // successful 42 IPP_SUCCESSFUL_OK = 0x0000, // successful 43 IPP_SUCCESSFUL_OK_IGNORED_OR_SUBSTITUTED_ATTRIBUTES = 0x0001, // successful 44 IPP_SUCCESSFUL_OK_CONFLICTING_ATTRIBUTES = 0x0002, // successful 45 IPP_SUCCESSFUL_OK_E = 0x00FF, // successful 46 47 IPP_INFORMATIONAL_S = 0x0100, // informational 48 IPP_INFORMATIONAL_E = 0x01FF, // informational 49 50 IPP_REDIRECTION_S = 0x0200, // redirection 51 IPP_REDIRECTION_SE = 0x02FF, // redirection 52 53 IPP_CLIENT_ERROR_S = 0x0400, // client-error 54 IPP_CLIENT_ERROR_BAD_REQUEST = 0x0400, // client-error 55 IPP_CLIENT_ERROR_FORBIDDEN = 0x0401, // client-error 56 IPP_CLIENT_ERROR_NOT_AUTHENTICATED = 0x0402, // client-error 57 IPP_CLIENT_ERROR_NOT_AUTHORIZED = 0x0403, // client-error 58 IPP_CLIENT_ERROR_NOT_POSSIBLE = 0x0404, // client-error 59 IPP_CLIENT_ERROR_TIMEOUT = 0x0405, // client-error 60 IPP_CLIENT_ERROR_NOT_FOUND = 0x0406, // client-error 61 IPP_CLIENT_ERROR_GONE = 0x0407, // client-error 62 IPP_CLIENT_ERROR_REQUEST_ENTITY_TOO_LARGE = 0x0408, // client-error 63 IPP_CLIENT_ERROR_REQUEST_VALUE_TOO_LONG = 0x0409, // client-error 64 IPP_CLIENT_ERROR_DOCUMENT_FORMAT_NOT_SUPPORTED = 0x040A, // client-error 65 IPP_CLIENT_ERROR_ATTRIBUTES_OR_VALUES_NOT_SUPPORTED = 0x040B, // client-error 66 IPP_CLIENT_ERROR_URI_SCHEME_NOT_SUPPORTED = 0x040C, // client-error 67 IPP_CLIENT_ERROR_CHARSET_NOT_SUPPORTED = 0x040D, // client-error 68 IPP_CLIENT_ERROR_CONFLICTING_ATTRIBUTES = 0x040E, // client-error 69 IPP_CLIENT_ERROR_E = 0x04FF, // client-error 70 71 IPP_SERVER_ERROR_S = 0x0500, // server-error 72 IPP_SERVER_ERROR_INTERNAL_ERROR = 0x0500, // server-error 73 IPP_SERVER_ERROR_OPERATION_NOT_SUPPORTED = 0x0501, // server-error 74 IPP_SERVER_ERROR_SERVICE_UNAVAILABLE = 0x0502, // server-error 75 IPP_SERVER_ERROR_VERSION_NOT_SUPPORTED = 0x0503, // server-error 76 IPP_SERVER_ERROR_DEVICE_ERROR = 0x0504, // server-error 77 IPP_SERVER_ERROR_TEMPORARY_ERROR = 0x0505, // server-error 78 IPP_SERVER_ERROR_NOT_ACCEPTING_JOBS = 0x0506, // server-error 79 IPP_SERVER_ERROR_BUSY = 0x0507, // server-error 80 IPP_SERVER_ERROR_JOB_CANCELED = 0x0508, // server-error 81 IPP_SERVER_ERROR_E = 0x05FF // server-error 82 }; 83 84 enum IPP_TAG { 85 /* reserved: 0x00 */ 86 IPP_OPERATION_ATTRIBUTES_TAG = 0x01, 87 IPP_JOB_ATTRIBUTES_TAG = 0x02, 88 IPP_END_OF_ATTRIBUTES_TAG = 0x03, 89 IPP_PRINTER_ATTRIBUTES_TAG = 0x04, 90 IPP_UNSUPPORTED_ATTRIBUTES_TAG = 0x05, 91 /* reserved for future delimiters: 0x06-0x0e */ 92 /* reserved for future chunking-end-of-attributes-tag: 0x0F */ 93 94 IPP_UNSUPPORTED = 0x10, 95 /* reserved for future 'default': 0x11 */ 96 IPP_UNKNOWN = 0x12, 97 IPP_NO_VALUE = 0x13, 98 /* reserved for future "out-of-band" values: 0x14-0x1F */ 99 /* reserved: 0x20 */ 100 IPP_INTEGER = 0x21, 101 IPP_BOOLEAN = 0x22, 102 IPP_ENUM = 0x23, 103 /* reserved for future integer types: 0x24-0x2F */ 104 IPP_STRING = 0x30, 105 IPP_DATETIME = 0x31, 106 IPP_RESOLUTION = 0x32, 107 IPP_RANGE_OF_INTEGER = 0x33, 108 /* reserved for collection (in the future): 0x34 */ 109 IPP_TEXT_WITH_LANGUAGE = 0x35, 110 IPP_NAME_WITH_LANGUAGE = 0x36, 111 /* reserved for future octetString types: 0x37-0x3F */ 112 /* reserved: 0x40 */ 113 IPP_TEXT_WITHOUT_LANGUAGE = 0x41, 114 IPP_NAME_WITHOUT_LANGUAGE = 0x42, 115 /* reserved: 0x43 */ 116 IPP_KEYWORD = 0x44, 117 IPP_URI = 0x45, 118 IPP_URISCHEME = 0x46, 119 IPP_CHARSET = 0x47, 120 IPP_NATURAL_LANGUAGE = 0x48, 121 IPP_MIME_MEDIA_TYPE = 0x49 122 /* reserved for future character string types: 0x4A-0x5F */ 123 }; 124 125 enum IPP_RESOLUTION_UNITS { 126 IPP_DOTS_PER_INCH = 3, 127 IPP_DOTS_PER_CENTIMETER = 4 128 }; 129 130 enum IPP_FINISHINGS { 131 IPP_NONE = 3, 132 IPP_STAPLE = 4, 133 IPP_PUNCH = 5, 134 IPP_COVER = 6, 135 IPP_BIND = 7 136 }; 137 138 enum IPP_ORIENTATION_REQUESTED { 139 IPP_PORTRAIT = 3, 140 IPP_LANDSCAPE = 4, 141 IPP_REVERSE_LANDSCAPE = 5, 142 IPP_REVERSE_PORTRAIT = 6 143 }; 144 145 enum IPP_PRINT_QUALITY { 146 IPP_DRAFT = 3, 147 IPP_NORMAL = 4, 148 IPP_HIGH = 5 149 }; 150 151 enum IPP_JOB_STATE { 152 IPP_JOB_STATE_PENDING = 3, 153 IPP_JOB_STATE_PENDING_HELD = 4, 154 IPP_JOB_STATE_PROCESSING = 5, 155 IPP_JOB_STATE_PROCESSING_STOPPED= 6, 156 IPP_JOB_STATE_CANCELED = 7, 157 IPP_JOB_STATE_ABORTED = 8, 158 IPP_JOB_STATE_COMPLETED = 9 159 }; 160 161 enum IPP_PRINTER_STATE { 162 IPP_PRINTER_STATEIDLE = 3, 163 IPP_PRINTER_STATEPROCESSING = 4, 164 IPP_PRINTER_STATESTOPPED = 5 165 }; 166 167 168 class IppAttribute { 169 public: 170 IppAttribute(IPP_TAG); ~IppAttribute()171 virtual ~IppAttribute() {} 172 virtual int length() const; 173 virtual istream &input(istream &is); 174 virtual ostream &output(ostream &os) const; 175 virtual ostream &print(ostream &) const; 176 friend istream& operator >> (istream &is, IppAttribute &attr) 177 { 178 return attr.input(is); 179 } 180 friend ostream& operator << (ostream &os, const IppAttribute &attr) 181 { 182 return attr.output(os); 183 } 184 185 IPP_TAG tag; 186 }; 187 188 class IppNamedAttribute : public IppAttribute { 189 public: 190 IppNamedAttribute(IPP_TAG t); 191 IppNamedAttribute(IPP_TAG t, const char *n); ~IppNamedAttribute()192 virtual ~IppNamedAttribute() {} 193 virtual int length() const; 194 virtual istream &input(istream &is); 195 virtual ostream &output(ostream &os) const; 196 string name; 197 friend istream& operator >> (istream &is, IppNamedAttribute &attr) 198 { 199 return attr.input(is); 200 } 201 friend ostream& operator << (ostream &os, const IppNamedAttribute &attr) 202 { 203 return attr.output(os); 204 } 205 virtual ostream &print(ostream &) const; 206 }; 207 208 class IppNoValueAttribute : public IppNamedAttribute { 209 public: 210 IppNoValueAttribute(IPP_TAG t); 211 IppNoValueAttribute(IPP_TAG t, const char *n); ~IppNoValueAttribute()212 virtual ~IppNoValueAttribute() {} 213 virtual int length() const; 214 virtual istream &input(istream &is); 215 virtual ostream &output(ostream &os) const; 216 virtual ostream &print(ostream &) const; 217 friend istream& operator >> (istream &is, IppNoValueAttribute &attr) 218 { 219 return attr.input(is); 220 } 221 friend ostream& operator << (ostream &os, const IppNoValueAttribute &attr) 222 { 223 return attr.output(os); 224 } 225 }; 226 227 class IppBooleanAttribute : public IppNamedAttribute { 228 public: 229 IppBooleanAttribute(IPP_TAG t); 230 IppBooleanAttribute(IPP_TAG t, const char *n, bool f); ~IppBooleanAttribute()231 virtual ~IppBooleanAttribute() {} 232 virtual int length() const; 233 virtual istream &input(istream &is); 234 virtual ostream &output(ostream &os) const; 235 virtual ostream &print(ostream &) const; 236 friend istream& operator >> (istream &is, IppBooleanAttribute &attr) 237 { 238 return attr.input(is); 239 } 240 friend ostream& operator << (ostream &os, const IppBooleanAttribute &attr) 241 { 242 return attr.output(os); 243 } 244 245 bool value; 246 }; 247 248 class IppIntegerAttribute : public IppNamedAttribute { 249 public: 250 IppIntegerAttribute(IPP_TAG t); 251 IppIntegerAttribute(IPP_TAG t, const char *n, int v); ~IppIntegerAttribute()252 virtual ~IppIntegerAttribute() {} 253 virtual int length() const; 254 virtual istream &input(istream &is); 255 virtual ostream &output(ostream &os) const; 256 virtual ostream &print(ostream &) const; 257 friend istream& operator >> (istream &is, IppIntegerAttribute &attr) 258 { 259 return attr.input(is); 260 } 261 friend ostream& operator << (ostream &os, const IppIntegerAttribute &attr) 262 { 263 return attr.output(os); 264 } 265 266 long value; 267 }; 268 269 class DATETIME { 270 public: 271 DATETIME(); 272 DATETIME(const DATETIME &); 273 DATETIME & operator = (const DATETIME &); 274 friend istream& operator >> (istream &is, DATETIME &attr); 275 friend ostream& operator << (ostream &os, const DATETIME &attr); 276 277 unsigned char datetime[11]; 278 }; 279 280 class IppDatetimeAttribute : public IppNamedAttribute { 281 public: 282 IppDatetimeAttribute(IPP_TAG t); 283 IppDatetimeAttribute(IPP_TAG t, const char *n, const DATETIME *dt); ~IppDatetimeAttribute()284 virtual ~IppDatetimeAttribute() {} 285 virtual int length() const; 286 virtual istream &input(istream &is); 287 virtual ostream &output(ostream &os) const; 288 virtual ostream &print(ostream &) const; 289 friend istream& operator >> (istream &is, IppDatetimeAttribute &attr) 290 { 291 return attr.input(is); 292 } 293 friend ostream& operator << (ostream &os, const IppDatetimeAttribute &attr) 294 { 295 return attr.output(os); 296 } 297 298 DATETIME datetime; 299 }; 300 301 class IppStringAttribute : public IppNamedAttribute { 302 public: 303 IppStringAttribute(IPP_TAG t); 304 IppStringAttribute(IPP_TAG t, const char *s, const char *s1); ~IppStringAttribute()305 virtual ~IppStringAttribute() {} 306 virtual int length() const; 307 virtual istream &input(istream &is); 308 virtual ostream &output(ostream &os) const; 309 virtual ostream &print(ostream &) const; 310 friend istream& operator >> (istream &is, IppStringAttribute &attr) 311 { 312 return attr.input(is); 313 } 314 friend ostream& operator << (ostream &os, const IppStringAttribute &attr) 315 { 316 return attr.output(os); 317 } 318 319 string text; 320 }; 321 322 class IppDoubleStringAttribute : public IppNamedAttribute { 323 public: 324 IppDoubleStringAttribute(IPP_TAG t); 325 IppDoubleStringAttribute(IPP_TAG t, const char *n, const char *s1, const char *s2); ~IppDoubleStringAttribute()326 virtual ~IppDoubleStringAttribute() {} 327 virtual int length() const; 328 virtual istream &input(istream &is); 329 virtual ostream &output(ostream &os) const; 330 friend istream& operator >> (istream &is, IppDoubleStringAttribute &attr) 331 { 332 return attr.input(is); 333 } 334 friend ostream& operator << (ostream &os, const IppDoubleStringAttribute &attr) 335 { 336 return attr.output(os); 337 } 338 virtual ostream &print(ostream &) const; 339 340 string text1; 341 string text2; 342 }; 343 344 class IppResolutionAttribute : public IppNamedAttribute { 345 public: 346 IppResolutionAttribute(IPP_TAG t); 347 IppResolutionAttribute(IPP_TAG t, const char *n, int, int, IPP_RESOLUTION_UNITS); ~IppResolutionAttribute()348 virtual ~IppResolutionAttribute() {} 349 virtual int length() const; 350 virtual istream &input(istream &is); 351 virtual ostream &output(ostream &os) const; 352 virtual ostream &print(ostream &) const; 353 friend istream& operator >> (istream &is, IppResolutionAttribute &attr) 354 { 355 return attr.input(is); 356 } 357 friend ostream& operator << (ostream &os, const IppResolutionAttribute &attr) 358 { 359 return attr.output(os); 360 } 361 362 int xres; 363 int yres; 364 IPP_RESOLUTION_UNITS resolution_units; 365 }; 366 367 class IppRangeOfIntegerAttribute : public IppNamedAttribute { 368 public: 369 IppRangeOfIntegerAttribute(IPP_TAG t); 370 IppRangeOfIntegerAttribute(IPP_TAG t, const char *n, int, int); ~IppRangeOfIntegerAttribute()371 virtual ~IppRangeOfIntegerAttribute() {} 372 virtual int length() const; 373 virtual istream &input(istream &is); 374 virtual ostream &output(ostream &os) const; 375 virtual ostream &print(ostream &) const; 376 friend istream& operator >> (istream &is, IppRangeOfIntegerAttribute &attr) 377 { 378 return attr.input(is); 379 } 380 friend ostream& operator << (ostream &os, const IppRangeOfIntegerAttribute &attr) 381 { 382 return attr.output(os); 383 } 384 385 long lower; 386 long upper; 387 }; 388 389 class IppContent { 390 public: 391 IppContent(); 392 ~IppContent(); 393 int length() const; 394 istream &input(istream &); 395 ostream &output(ostream &) const; 396 friend istream& operator >> (istream &is, IppContent &ic) 397 { 398 return ic.input(is); 399 } 400 friend ostream& operator << (ostream &os, const IppContent &ic) 401 { 402 return ic.output(os); 403 } 404 void setVersion(unsigned short); 405 unsigned short getVersion() const; 406 void setOperationId(IPP_OPERATION_ID); 407 IPP_OPERATION_ID getOperationId() const; 408 void setRequestId(unsigned long); 409 unsigned long getRequestId() const; 410 IPP_STATUS_CODE getStatusCode() const; 411 const char *getStatusMessage() const; 412 413 void setDelimiter(IPP_TAG tag); 414 void setInteger(const char *name, int value); 415 void setBoolean(const char *name, bool value); 416 void setString(const char *name, const char *value); 417 void setDateTime(const char *name, const DATETIME *dt); 418 void setResolution(const char *name, int x, int y, IPP_RESOLUTION_UNITS u); 419 void setRangeOfInteger(const char *name, int lower, int upper); 420 void setTextWithLanguage(const char *name, const char *s1, const char *s2); 421 void setNameWithLanguage(const char *name, const char *s1, const char *s2); 422 void setTextWithoutLanguage(const char *name, const char *value); 423 void setNameWithoutLanguage(const char *name, const char *value); 424 void setKeyword(const char *name, const char *value); 425 void setURI(const char *name, const char *value); 426 void setURIScheme(const char *name, const char *value); 427 void setCharset(const char *name, const char *value); 428 void setNaturalLanguage(const char *name, const char *value); 429 void setMimeMediaType(const char *name, const char *value); 430 431 void setRawData(const char *file, int size = -1); 432 void setRawData(istream &is, int size = -1); 433 ostream &print(ostream &) const; 434 435 bool operator !() const; 436 bool good() const; 437 bool fail() const; 438 439 private: 440 list<IppAttribute *> attrs; 441 unsigned short version; 442 unsigned short operation_id; 443 unsigned long request_id; 444 string file_path; 445 istream *is; 446 int size; 447 }; 448 449 #endif // __IppContent_H 450