From e2bc6f4153813cc570ae814c8ddb74628009b488 Mon Sep 17 00:00:00 2001 From: Michal Kubecek Date: Mon, 13 Apr 2015 09:21:39 +0200 Subject: initial checkin Check in contents of upstream 1.4.2 tarball, exclude generated files. --- src/epa.h | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 src/epa.h (limited to 'src/epa.h') diff --git a/src/epa.h b/src/epa.h new file mode 100644 index 0000000..b457328 --- /dev/null +++ b/src/epa.h @@ -0,0 +1,216 @@ +/* + Copyright (C) 2005-2009 Michel de Boer + + 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 +*/ + +/** + * @file + * Event Publication Agent (EPA) [RFC 3903] + */ + +#ifndef _EPA_H +#define _EPA_H + +#include +#include + +#include "id_object.h" +#include "phone_user.h" +#include "sockets/url.h" +#include "parser/sip_body.h" +#include "protocol.h" + +using namespace std; + + +/** Event Publication Agent (EPA) [RFC 3903] */ +class t_epa { +public: + /** State of the EPA */ + enum t_epa_state { + EPA_UNPUBLISHED, /**< The event has not been published. */ + EPA_PUBLISHED, /**< The event has been published. */ + EPA_FAILED, /**< Failed to publish the event. */ + }; + +private: + /** + * Queue of pending outgoing PUBLISH requests. A next PUBLISH + * will only be sent after the previous PUBLISH has been + * answered. + */ + queue queue_publish; + + /** + * Enqueue a request. + * @param r [in] Request to enqueue. + */ + void enqueue_request(t_request *r); + +protected: + /** Phone user for whom publications are issued. */ + t_phone_user *phone_user; + + /** EPA state. */ + t_epa_state epa_state; + + /** Detailed failure message when @ref epa_state == @ref EPA_FAILED */ + string failure_msg; + + /** + * Entity tag associated with the publication. + * For an initial publication there is no entity tag yet. + */ + string etag; + + /** Event for which the event state is published. */ + string event_type; + + /** Request-URI for the publish request. */ + t_url request_uri; + + /** Timer indicating when a publication must be refreshed. */ + t_object_id id_publication_timeout; + + /** Expiry duration (sec) of a publication. */ + unsigned long publication_expiry; + + /** Default duration for a publication/ */ + unsigned long default_duration; + + /** Indicates if an unpublish is in progress. */ + bool is_unpublishing; + + /** Cached body of last publication. */ + t_sip_body *cached_body; + + /** Log the publication details */ + void log_publication(void) const; + + /** + * Remove a pending request. Pass one of the client request pointers. + * @param cr [in] Client request to remove. + */ + void remove_client_request(t_client_request **cr); + + /** + * Create a PUBLISH request. + * @param expires [in] Expiry time in seconds. + * @param body [in] Body for the request. The body will be destroyed when + * the request will be destroyed. + */ + virtual t_request *create_publish(unsigned long expires, t_sip_body *body) const; + + /** + * Send request. + * @param r [in] Request to send. + * @param tuid [in] Transaction user id. + */ + void send_request(t_request *r, t_tuid tuid) const; + + /** + * Send the next PUBLISH request from the queue. + * If the queue is empty, then this method does nothing. + */ + void send_publish_from_queue(void); + + /** + * Start a publication timer. + * @param timer [in] Type of publication timer. + * @param duration [in] Duration of timer in ms + */ + void start_timer(t_publish_timer timer, long duration); + + /** + * Stop a publication timer. + * @param timer [in] Type of publication timer. + */ + void stop_timer(t_publish_timer timer); + +public: + /** Pending request */ + t_client_request *req_out; + + /** Constructor. */ + t_epa(t_phone_user *pu, const string &_event_type, const t_url _request_uri); + + /** Destructor. */ + virtual ~t_epa(); + + /** @name Getters */ + //@{ + t_epa_state get_epa_state(void) const; + string get_failure_msg(void) const; + t_phone_user *get_phone_user(void) const; + //@} + + /** + * Get the user profile of the user. + * @return The user profile. + */ + t_user *get_user_profile(void) const; + + /** + * Receive PUBLISH response. + * @param r [in] Received response. + * @param tuid [in] Transaction user id. + * @param tid [in] Transaction id. + * @return The return value indicates if processing is finished. + */ + virtual bool recv_response(t_response *r, t_tuid tuid, t_tid tid); + + /** + * Match response with a pending publish. + * @param r [in] The response. + * @param tuid [in] Transaction user id. + * @return True if the response matches, otherwise false. + */ + virtual bool match_response(t_response *r, t_tuid tuid) const; + + /** + * Process timeouts + * @param timer [in] Type of publication timer. + * @return The return value indicates if processing is finished. + */ + virtual bool timeout(t_publish_timer timer); + + /** + * Match timer id with a running timer. + * @param timer [in] Type of publication timer. + * @return True, if id matches, otherwise false. + */ + virtual bool match_timer(t_publish_timer timer, t_object_id id_timer) const; + + /** + * Publish event state. + * @param expired [in] Duration of publication in seconds. + * @param body [in] Body for PUBLISH request. + * @note The body will be deleted when the PUBLISH has been sent. + * The caller of this method should *not* delete the body. + */ + virtual void publish(unsigned long expires, t_sip_body *body); + + /** Terminate publication. */ + virtual void unpublish(void); + + /** Refresh publication. */ + virtual void refresh_publication(void); + + /** Clear all state */ + virtual void clear(void); +}; + +#endif -- cgit v1.2.3