1 // Sun, 18 Jun 2000 2 // Y.Takagi 3 4 #if defined(__HAIKU__) || defined(HAIKU_TARGET_PLATFORM_BONE) 5 # include <sys/socket.h> 6 #else 7 # include <net/socket.h> 8 #endif 9 #include <iostream> 10 #include <strings.h> 11 #include <stdio.h> 12 char *itoa(int i, char *buf, int unit) 13 { 14 sprintf(buf, "%d", i); 15 return buf; 16 } 17 #define stricmp strcasecmp 18 #define strnicmp strncasecmp 19 20 #include <list> 21 #include "IppURLConnection.h" 22 #include "IppContent.h" 23 24 IppURLConnection::IppURLConnection(const BUrl &Url) 25 : HttpURLConnection(Url) 26 { 27 __ippRequest = NULL; 28 __ippResponse = new IppContent; 29 setRequestMethod("POST"); 30 setRequestProperty("Content-Type", "application/ipp"); 31 setRequestProperty("Cache-Control", "no-cache"); 32 setRequestProperty("Pragma", "no-cache"); 33 } 34 35 IppURLConnection::~IppURLConnection() 36 { 37 if (__ippRequest) { 38 delete __ippRequest; 39 } 40 41 if (__ippResponse) { 42 delete __ippResponse; 43 } 44 } 45 46 void IppURLConnection::setIppRequest(IppContent *obj) 47 { 48 if (__ippRequest) { 49 delete __ippRequest; 50 } 51 __ippRequest = obj; 52 } 53 54 55 const IppContent *IppURLConnection::getIppResponse() const 56 { 57 return __ippResponse; 58 } 59 60 void IppURLConnection::setRequest() 61 { 62 if (connected) { 63 char buf[64]; 64 itoa(__ippRequest->length(), buf, 10); 65 setRequestProperty("Content-Length", buf); 66 HttpURLConnection::setRequest(); 67 } 68 } 69 70 void IppURLConnection::setContent() 71 { 72 if (connected && __ippRequest) { 73 ostream &os = getOutputStream(); 74 os << *__ippRequest; 75 } 76 } 77 78 inline bool is_contenttype_ipp(const char *s) 79 { 80 return strnicmp(s, "application/ipp", 15) ? false : true; 81 } 82 83 void IppURLConnection::getContent() 84 { 85 if (connected) { 86 if (getResponseCode() == HTTP_OK && is_contenttype_ipp(getContentType())) { 87 istream &is = getInputStream(); 88 is >> *__ippResponse; 89 } else { 90 HttpURLConnection::getContent(); 91 } 92 } 93 } 94 95 ostream &IppURLConnection::printIppRequest(ostream &os) 96 { 97 return __ippRequest->print(os); 98 } 99 100 ostream &IppURLConnection::printIppResponse(ostream &os) 101 { 102 if (getResponseCode() == HTTP_OK && is_contenttype_ipp(getContentType())) { 103 return __ippResponse->print(os); 104 } 105 return os; 106 } 107