diff options
Diffstat (limited to 'src/parser/response.h')
-rw-r--r-- | src/parser/response.h | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/src/parser/response.h b/src/parser/response.h new file mode 100644 index 0000000..a2f87c6 --- /dev/null +++ b/src/parser/response.h @@ -0,0 +1,214 @@ +/* + Copyright (C) 2005-2009 Michel de Boer <michel@twinklephone.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +// Response + +#ifndef _H_RESPONSE +#define _H_RESPONSE + +#include <string> +#include "sip_message.h" + +using namespace std; + +// Repsonse codes +// Informational +#define R_100_TRYING 100 +#define R_180_RINGING 180 +#define R_181_CALL_IS_BEING_FORWARDED 181 +#define R_182_QUEUED 182 +#define R_183_SESSION_PROGRESS 183 + +// Success +#define R_200_OK 200 +#define R_202_ACCEPTED 202 + +// Redirection +#define R_300_MULTIPLE_CHOICES 300 +#define R_301_MOVED_PERMANENTLY 301 +#define R_302_MOVED_TEMPORARILY 302 +#define R_305_USE_PROXY 305 +#define R_380_ALTERNATIVE_SERVICE 380 + +// Client error +#define R_400_BAD_REQUEST 400 +#define R_401_UNAUTHORIZED 401 +#define R_402_PAYMENT_REQUIRED 402 +#define R_403_FORBIDDEN 403 +#define R_404_NOT_FOUND 404 +#define R_405_METHOD_NOT_ALLOWED 405 +#define R_406_NOT_ACCEPTABLE 406 +#define R_407_PROXY_AUTH_REQUIRED 407 +#define R_408_REQUEST_TIMEOUT 408 +#define R_410_GONE 410 +#define R_412_CONDITIONAL_REQUEST_FAILED 412 +#define R_413_REQ_ENTITY_TOO_LARGE 413 +#define R_414_REQ_URI_TOO_LARGE 414 +#define R_415_UNSUPPORTED_MEDIA_TYPE 415 +#define R_416_UNSUPPORTED_URI_SCHEME 416 +#define R_420_BAD_EXTENSION 420 +#define R_421_EXTENSION_REQUIRED 421 +#define R_423_INTERVAL_TOO_BRIEF 423 +#define R_480_TEMP_NOT_AVAILABLE 480 +#define R_481_TRANSACTION_NOT_EXIST 481 +#define R_482_LOOP_DETECTED 482 +#define R_483_TOO_MANY_HOPS 483 +#define R_484_ADDRESS_INCOMPLETE 484 +#define R_485_AMBIGUOUS 485 +#define R_486_BUSY_HERE 486 +#define R_487_REQUEST_TERMINATED 487 +#define R_488_NOT_ACCEPTABLE_HERE 488 +#define R_489_BAD_EVENT 489 +#define R_491_REQUEST_PENDING 491 +#define R_493_UNDECIPHERABLE 493 + +// Server error +#define R_500_INTERNAL_SERVER_ERROR 500 +#define R_501_NOT_IMPLEMENTED 501 +#define R_502_BAD_GATEWAY 502 +#define R_503_SERVICE_UNAVAILABLE 503 +#define R_504_SERVER_TIMEOUT 504 +#define R_505_SIP_VERSION_NOT_SUPPORTED 505 +#define R_513_MESSAGE_TOO_LARGE 513 + +// Global failure +#define R_600_BUSY_EVERYWHERE 600 +#define R_603_DECLINE 603 +#define R_604_NOT_EXIST_ANYWHERE 604 +#define R_606_NOT_ACCEPTABLE 606 + +// Response classes +#define R_1XX 1 // Informational +#define R_2XX 2 // Success +#define R_3XX 3 // Redirection +#define R_4XX 4 // Client error +#define R_5XX 5 // Server error +#define R_6XX 6 // Global failure + +// Default reason strings +#define REASON_100 "Trying" +#define REASON_180 "Ringing" +#define REASON_181 "Call Is Being Forwarded" +#define REASON_182 "Queued" +#define REASON_183 "Session Progress" + +#define REASON_200 "OK" +#define REASON_202 "Accepted" + +#define REASON_300 "Multiple Choices" +#define REASON_301 "Moved Permanently" +#define REASON_302 "Moved Temporarily" +#define REASON_305 "Use Proxy" +#define REASON_380 "Alternative Service" + +#define REASON_400 "Bad Request" +#define REASON_401 "Unauthorized" +#define REASON_402 "Payment Required" +#define REASON_403 "Forbidden" +#define REASON_404 "Not Found" +#define REASON_405 "Method Not Allowed" +#define REASON_406 "Not Acceptable" +#define REASON_407 "Proxy Authentication Required" +#define REASON_408 "Request Timeout" +#define REASON_410 "Gone" +#define REASON_412 "Conditional Request Failed" +#define REASON_413 "Request Entity Too Large" +#define REASON_414 "Request-URI Too Large" +#define REASON_415 "Unsupported Media Type" +#define REASON_416 "Unsupported URI Scheme" +#define REASON_420 "Bad Extension" +#define REASON_421 "Extension Required" +#define REASON_423 "Interval Too Brief" +#define REASON_480 "Temporarily Not Available" +#define REASON_481 "Call Leg/Transaction Does Not Exist" +#define REASON_482 "Loop Detected" +#define REASON_483 "Too Many Hops" +#define REASON_484 "Address Incomplete" +#define REASON_485 "Ambiguous" +#define REASON_486 "Busy Here" +#define REASON_487 "Request Terminated" +#define REASON_488 "Not Acceptable Here" +#define REASON_489 "Bad Event" +#define REASON_491 "Request Pending" +#define REASON_493 "Undecipherable" + +#define REASON_500 "Internal Server Error" +#define REASON_501 "Not Implemented" +#define REASON_502 "Bad Gateway" +#define REASON_503 "Service Unavailable" +#define REASON_504 "Server Time-out" +#define REASON_505 "SIP Version Not Supported" +#define REASON_513 "Message Too Large" + +#define REASON_600 "Busy Everywhere" +#define REASON_603 "Decline" +#define REASON_604 "Does Not Exist Anywhere" +#define REASON_606 "Not Acceptable" + +// The protocol allows a SIP response to have a non-default reason +// phrase that gives a more detailed reason. + +// RFC 3261 21.4.18 +// Code 480 should have a specific reason phrase +#define REASON_480_NO_ANSWER "User not responding" + +// RFC 3265 3.2.4 +#define REASON_481_SUBSCRIPTION_NOT_EXIST "Subscription does not exist" + + +class t_response : public t_sip_message { +public: + int code; + string reason; + + /** The source address of the request generating this response. */ + t_ip_port src_ip_port_request; + + t_response(); + t_response(const t_response &r); + t_response(int _code, string _reason = ""); + + t_msg_type get_type(void) const { return MSG_RESPONSE; } + + // Return the response class 1,2,3,4,5,6 + int get_class(void) const; + + bool is_provisional(void) const; + bool is_final(void) const; + bool is_success(void) const; + + string encode(bool add_content_length = true); + list<string> encode_env(void); + t_sip_message *copy(void) const; + + bool is_valid(bool &fatal, string &reason) const; + + // Returns true if the response is a 401/407 with + // the proper authenticate header. + bool must_authenticate(void) const; + + /** + * Get the destination address for sending the response. + * @param ip_port [out] The destination address. + */ + void get_destination(t_ip_port &ip_port) const; + + virtual void calc_local_ip(void); +}; + +#endif |