summaryrefslogtreecommitdiffstats
path: root/src/parser/sip_message.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser/sip_message.h')
-rw-r--r--src/parser/sip_message.h270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/parser/sip_message.h b/src/parser/sip_message.h
new file mode 100644
index 0000000..6602438
--- /dev/null
+++ b/src/parser/sip_message.h
@@ -0,0 +1,270 @@
+/*
+ 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
+*/
+
+// SIP message
+
+#ifndef _H_SIP_MESSAGE
+#define _H_SIP_MESSAGE
+
+#include <list>
+#include <string>
+#include "definitions.h"
+#include "hdr_accept.h"
+#include "hdr_accept_encoding.h"
+#include "hdr_accept_language.h"
+#include "hdr_alert_info.h"
+#include "hdr_allow.h"
+#include "hdr_allow_events.h"
+#include "hdr_auth_info.h"
+#include "hdr_authorization.h"
+#include "hdr_call_id.h"
+#include "hdr_call_info.h"
+#include "hdr_contact.h"
+#include "hdr_content_disp.h"
+#include "hdr_content_encoding.h"
+#include "hdr_content_language.h"
+#include "hdr_content_length.h"
+#include "hdr_content_type.h"
+#include "hdr_cseq.h"
+#include "hdr_date.h"
+#include "hdr_error_info.h"
+#include "hdr_event.h"
+#include "hdr_expires.h"
+#include "hdr_from.h"
+#include "hdr_in_reply_to.h"
+#include "hdr_max_forwards.h"
+#include "hdr_min_expires.h"
+#include "hdr_mime_version.h"
+#include "hdr_organization.h"
+#include "hdr_p_asserted_identity.h"
+#include "hdr_p_preferred_identity.h"
+#include "hdr_priority.h"
+#include "hdr_privacy.h"
+#include "hdr_proxy_authenticate.h"
+#include "hdr_proxy_authorization.h"
+#include "hdr_proxy_require.h"
+#include "hdr_rack.h"
+#include "hdr_record_route.h"
+#include "hdr_refer_sub.h"
+#include "hdr_refer_to.h"
+#include "hdr_referred_by.h"
+#include "hdr_replaces.h"
+#include "hdr_reply_to.h"
+#include "hdr_require.h"
+#include "hdr_request_disposition.h"
+#include "hdr_retry_after.h"
+#include "hdr_route.h"
+#include "hdr_rseq.h"
+#include "hdr_server.h"
+#include "hdr_service_route.h"
+#include "hdr_sip_etag.h"
+#include "hdr_sip_if_match.h"
+#include "hdr_subject.h"
+#include "hdr_subscription_state.h"
+#include "hdr_supported.h"
+#include "hdr_timestamp.h"
+#include "hdr_to.h"
+#include "hdr_unsupported.h"
+#include "hdr_user_agent.h"
+#include "hdr_via.h"
+#include "hdr_warning.h"
+#include "hdr_www_authenticate.h"
+#include "parameter.h"
+#include "sip_body.h"
+
+// Macro's to access the body of a message, eg msg.sdp_body
+#define SDP_BODY ((t_sdp *)body)
+#define OPAQUE_BODY ((t_sip_body_opaque)*body)
+
+using namespace std;
+
+enum t_msg_type {
+ MSG_REQUEST,
+ MSG_RESPONSE,
+ MSG_SIPFRAG, // Only a sequence of headers (RFC 3420)
+};
+
+
+class t_sip_message {
+protected:
+ /**
+ * Local IP address that will be uses for this SIP message.
+ * The local IP address can only be determined when the destination
+ * of a SIP message is known (because of multi homing).
+ */
+ unsigned long local_ip_;
+
+public:
+ // The source IP address and port are only set for messages
+ // received from the network. So the transaction user knows
+ // where a message comes from.
+ t_ip_port src_ip_port;
+
+ // SIP version
+ string version;
+
+ // All possible headers
+ t_hdr_accept hdr_accept;
+ t_hdr_accept_encoding hdr_accept_encoding;
+ t_hdr_accept_language hdr_accept_language;
+ t_hdr_alert_info hdr_alert_info;
+ t_hdr_allow hdr_allow;
+ t_hdr_allow_events hdr_allow_events;
+ t_hdr_auth_info hdr_auth_info;
+ t_hdr_authorization hdr_authorization;
+ t_hdr_call_id hdr_call_id;
+ t_hdr_call_info hdr_call_info;
+ t_hdr_contact hdr_contact;
+ t_hdr_content_disp hdr_content_disp;
+ t_hdr_content_encoding hdr_content_encoding;
+ t_hdr_content_language hdr_content_language;
+ t_hdr_content_length hdr_content_length;
+ t_hdr_content_type hdr_content_type;
+ t_hdr_cseq hdr_cseq;
+ t_hdr_date hdr_date;
+ t_hdr_error_info hdr_error_info;
+ t_hdr_event hdr_event;
+ t_hdr_expires hdr_expires;
+ t_hdr_from hdr_from;
+ t_hdr_in_reply_to hdr_in_reply_to;
+ t_hdr_max_forwards hdr_max_forwards;
+ t_hdr_min_expires hdr_min_expires;
+ t_hdr_mime_version hdr_mime_version;
+ t_hdr_organization hdr_organization;
+ t_hdr_p_asserted_identity hdr_p_asserted_identity;
+ t_hdr_p_preferred_identity hdr_p_preferred_identity;
+ t_hdr_priority hdr_priority;
+ t_hdr_privacy hdr_privacy;
+ t_hdr_proxy_authenticate hdr_proxy_authenticate;
+ t_hdr_proxy_authorization hdr_proxy_authorization;
+ t_hdr_proxy_require hdr_proxy_require;
+ t_hdr_rack hdr_rack;
+ t_hdr_record_route hdr_record_route;
+ t_hdr_refer_sub hdr_refer_sub;
+ t_hdr_refer_to hdr_refer_to;
+ t_hdr_referred_by hdr_referred_by;
+ t_hdr_replaces hdr_replaces;
+ t_hdr_reply_to hdr_reply_to;
+ t_hdr_require hdr_require;
+ t_hdr_request_disposition hdr_request_disposition;
+ t_hdr_retry_after hdr_retry_after;
+ t_hdr_route hdr_route;
+ t_hdr_rseq hdr_rseq;
+ t_hdr_server hdr_server;
+ t_hdr_service_route hdr_service_route;
+ t_hdr_sip_etag hdr_sip_etag;
+ t_hdr_sip_if_match hdr_sip_if_match;
+ t_hdr_subject hdr_subject;
+ t_hdr_subscription_state hdr_subscription_state;
+ t_hdr_supported hdr_supported;
+ t_hdr_timestamp hdr_timestamp;
+ t_hdr_to hdr_to;
+ t_hdr_unsupported hdr_unsupported;
+ t_hdr_user_agent hdr_user_agent;
+ t_hdr_via hdr_via;
+ t_hdr_warning hdr_warning;
+ t_hdr_www_authenticate hdr_www_authenticate;
+
+ // Unknown headers are represented by parameters.
+ // Parameter.name = header name
+ // Parameter.value = header value
+ list<t_parameter> unknown_headers;
+
+ // A SIP message can carry a body
+ t_sip_body *body;
+
+ t_sip_message();
+ t_sip_message(const t_sip_message& m);
+ virtual ~t_sip_message();
+
+ virtual t_msg_type get_type(void) const;
+ void add_unknown_header(const string &name, const string &value);
+
+ // Check if the message is valid. At this class the
+ // general rules applying to both requests and responses
+ // is checked.
+ // fatal is true if one of the headers mandatory for all
+ // messages is missing (to, from, cseq, call-id, via).
+ // reason contains a reason string if the message is invalid.
+ virtual bool is_valid(bool &fatal, string &reason) const;
+
+ // Return encoded headers
+ // The version should be encode by the subclasses.
+ // Parameter add_content_length indicates if a Content-Length
+ // header must be added. Usually it must, only for sipfrag bodies
+ // it may be omitted.
+ virtual string encode(bool add_content_length = true);
+
+ // Return list of environment variable settings for all headers
+ // (see header.h for the format)
+ // Besides the header variables the following variables will be
+ // returned as well:
+ //
+ // SIP_REQUEST_METHOD, for a request
+ // SIP_REQUEST_URI, for a request
+ // SIP_STATUS_CODE, for a response
+ // SIP_STATUS_REASON, for a response
+ virtual list<string> encode_env(void);
+
+ // Create a copy of the message
+ virtual t_sip_message *copy(void) const;
+
+ /**
+ * Set a plain text body in the message.
+ * @param text [in] The text.
+ * @param charset [in] The character set used for encoding.
+ * @post The Content-Type header is set to "text/plain".
+ * @post If a body was already present then it is deleted.
+ */
+ void set_body_plain_text(const string &text, const string &charset);
+
+ /**
+ * Set a body with the contents of a file.
+ * @param filename [in] The name of the file.
+ * @param media [in] The mime type of the contents.
+ * @return True of body is set, false if file could not be read.
+ */
+ bool set_body_from_file(const string &filename, const t_media &media);
+
+ /**
+ * Get the size of an encoded SIP message.
+ * @return Size in bytes.
+ */
+ size_t get_encoded_size(void);
+
+ /**
+ * Check if all local IP address are correctly filled in. This
+ * check is an integrity check to help debugging the auto IP
+ * discover feature.
+ */
+ bool local_ip_check(void) const;
+
+ /** Determine the local IP address for this SIP message. */
+ virtual void calc_local_ip(void);
+
+ /**
+ * Get the local IP address for this SIP message.
+ * The local IP address can be used as source address for sending
+ * the message.
+ * @return The local IP address.
+ * @return 0, if the local IP address is not determined yet.
+ */
+ unsigned long get_local_ip(void);
+};
+
+#endif