summaryrefslogtreecommitdiffstats
path: root/src/mwi/simple_msg_sum_body.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mwi/simple_msg_sum_body.cpp')
-rw-r--r--src/mwi/simple_msg_sum_body.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/mwi/simple_msg_sum_body.cpp b/src/mwi/simple_msg_sum_body.cpp
new file mode 100644
index 0000000..33683f7
--- /dev/null
+++ b/src/mwi/simple_msg_sum_body.cpp
@@ -0,0 +1,186 @@
+/*
+ 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
+*/
+
+#include "simple_msg_sum_body.h"
+
+#include <iostream>
+#include <cstdlib>
+#include <boost/regex.hpp>
+
+#include "protocol.h"
+#include "util.h"
+#include "audits/memman.h"
+
+t_msg_summary::t_msg_summary() :
+ newmsgs(0),
+ newmsgs_urgent(0),
+ oldmsgs(0),
+ oldmsgs_urgent(0)
+{}
+
+bool t_msg_summary::parse(const string &s) {
+ newmsgs = 0;
+ oldmsgs = 0;
+ newmsgs_urgent = 0;
+ oldmsgs_urgent = 0;
+
+ // RFC 3842 5.2
+ // msg-summary-line = message-context-class HCOLON newmsgs SLASH oldmsgs
+ // [ LPAREN new-urgentmsgs SLASH old-urgentmsgs RPAREN ]
+ // This regex matches the part after HCOLON
+ boost::regex re("(\\d+)\\s*/\\s*(\\d+)(?:\\s*\\((\\d+)\\s*/\\s*(\\d+)\\s*\\))?");
+
+ boost::smatch m;
+ if (!boost::regex_match(s, m, re)) return false;
+
+ if (m.size() == 3) {
+ newmsgs = strtoul(m.str(1).c_str(), NULL, 10);
+ oldmsgs = strtoul(m.str(2).c_str(), NULL, 10);
+ return true;
+ } else if (m.size() == 5) {
+ newmsgs = strtoul(m.str(1).c_str(), NULL, 10);
+ oldmsgs = strtoul(m.str(2).c_str(), NULL, 10);
+ newmsgs_urgent = strtoul(m.str(3).c_str(), NULL, 10);
+ oldmsgs_urgent = strtoul(m.str(4).c_str(), NULL, 10);
+ return true;
+ }
+
+ return false;
+}
+
+void t_msg_summary::clear(void) {
+ newmsgs = 0;
+ newmsgs_urgent = 0;
+ oldmsgs = 0;
+ oldmsgs_urgent = 0;
+}
+
+bool t_simple_msg_sum_body::is_context(const string &s) {
+ return ( s == MSG_CONTEXT_VOICE ||
+ s == MSG_CONTEXT_FAX ||
+ s == MSG_CONTEXT_MULTIMEDIA ||
+ s == MSG_CONTEXT_TEXT ||
+ s == MSG_CONTEXT_NONE);
+}
+
+t_simple_msg_sum_body::t_simple_msg_sum_body() : t_sip_body()
+{}
+
+string t_simple_msg_sum_body::encode(void) const {
+ string s = "Messages-Waiting: ";
+ s += (msg_waiting ? "yes" : "no");
+ s += CRLF;
+
+ if (msg_account.is_valid()) {
+ s += "Message-Account: ";
+ s += msg_account.encode();
+ s += CRLF;
+ }
+
+ for (t_msg_sum_const_iter i = msg_summary.begin(); i != msg_summary.end(); ++i) {
+ const t_msg_summary &summary = i->second;
+ s += i->first;
+ s += ": ";
+ s += ulong2str(summary.newmsgs);
+ s += "/";
+ s += ulong2str(summary.oldmsgs);
+
+ if (summary.newmsgs_urgent > 0 || summary.oldmsgs_urgent > 0) {
+ s += " (";
+ s += ulong2str(summary.newmsgs_urgent);
+ s += "/";
+ s += ulong2str(summary.oldmsgs_urgent);
+ s += ")";
+ }
+
+ s += CRLF;
+ }
+
+ return s;
+}
+
+t_sip_body *t_simple_msg_sum_body::copy(void) const {
+ t_simple_msg_sum_body *body = new t_simple_msg_sum_body(*this);
+ MEMMAN_NEW(body);
+ return body;
+}
+
+t_body_type t_simple_msg_sum_body::get_type(void) const {
+ return BODY_SIMPLE_MSG_SUM;
+}
+
+t_media t_simple_msg_sum_body::get_media(void) const {
+ return t_media("application", "simple-message-summary");
+}
+
+void t_simple_msg_sum_body::add_msg_summary(const string &context, const t_msg_summary summary) {
+ msg_summary.insert(make_pair(context, summary));
+}
+
+bool t_simple_msg_sum_body::get_msg_waiting(void) const {
+ return msg_waiting;
+}
+
+t_url t_simple_msg_sum_body::get_msg_account(void) const {
+ return msg_account;
+}
+
+bool t_simple_msg_sum_body::get_msg_summary(const string &context, t_msg_summary &summary) const {
+ t_msg_sum_const_iter it = msg_summary.find(context);
+ if (it == msg_summary.end()) return false;
+ summary = it->second;
+ return true;
+}
+
+bool t_simple_msg_sum_body::parse(const string &s) {
+ bool valid = false;
+ vector<string> lines = split_linebreak(s);
+
+ for (vector<string>::iterator i = lines.begin(); i != lines.end(); ++i) {
+ string line = trim(*i);
+ if (line.empty()) continue;
+
+ vector<string> l = split_on_first(line, ':');
+ if (l.size() != 2) continue;
+
+ string header = tolower(trim(l[0]));
+ string value = tolower(trim(l[1]));
+
+ if (value.empty()) continue;
+
+ if (header == "messages-waiting") {
+ if (value == "yes") {
+ msg_waiting = true;
+ valid = true;
+ } else if (value == "no") {
+ msg_waiting = false;
+ valid = true;
+ }
+ } else if (header == "message-account") {
+ msg_account.set_url(value);
+ } else if (is_context(header)) {
+ t_msg_summary summary;
+ if (summary.parse(value)) {
+ add_msg_summary(header, summary);
+ }
+ }
+ }
+
+ invalid = !valid;
+ return valid;
+}