diff options
author | Liong Sauw Ming <ming@teluu.com> | 2014-01-16 05:30:46 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2014-01-16 05:30:46 +0000 |
commit | e56ea14ab8531ee3cec375460577d1b89bf62e26 (patch) | |
tree | df77c3acb961514b2022ee9e030071b691145920 /pjsip/src/pjsua2/presence.cpp | |
parent | bd1c47e995a3a844868f1d4dcc8f77f163ae721b (diff) |
Closed #1723: Merging pjsua2 branch into trunk
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4704 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsua2/presence.cpp')
-rw-r--r-- | pjsip/src/pjsua2/presence.cpp | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/pjsip/src/pjsua2/presence.cpp b/pjsip/src/pjsua2/presence.cpp new file mode 100644 index 00000000..205a85ee --- /dev/null +++ b/pjsip/src/pjsua2/presence.cpp @@ -0,0 +1,190 @@ +/* $Id$ */ +/* + * Copyright (C) 2013 Teluu Inc. (http://www.teluu.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 <pjsua2/presence.hpp> +#include <pjsua2/account.hpp> +#include "util.hpp" + +using namespace pj; +using namespace std; + +#define THIS_FILE "presence.cpp" + + +/////////////////////////////////////////////////////////////////////////////// + +PresenceStatus::PresenceStatus() +: status(PJSUA_BUDDY_STATUS_UNKNOWN), activity(PJRPID_ACTIVITY_UNKNOWN) +{ +} + + +/////////////////////////////////////////////////////////////////////////////// + +void BuddyConfig::readObject(const ContainerNode &node) throw(Error) +{ + ContainerNode this_node = node.readContainer("BuddyConfig"); + + NODE_READ_STRING ( this_node, uri); + NODE_READ_BOOL ( this_node, subscribe); +} + +void BuddyConfig::writeObject(ContainerNode &node) const throw(Error) +{ + ContainerNode this_node = node.writeNewContainer("BuddyConfig"); + + NODE_WRITE_STRING ( this_node, uri); + NODE_WRITE_BOOL ( this_node, subscribe); +} + +////////////////////////////////////////////////////////////////////////////// + +void BuddyInfo::fromPj(const pjsua_buddy_info &pbi) +{ + uri = pj2Str(pbi.uri); + contact = pj2Str(pbi.contact); + presMonitorEnabled = PJ2BOOL(pbi.monitor_pres); + subState = pbi.sub_state; + subStateName = string(pbi.sub_state_name); + subTermCode = (pjsip_status_code)pbi.sub_term_code; + subTermReason = pj2Str(pbi.sub_term_reason); + + /* Presence status */ + presStatus.status = pbi.status; + presStatus.statusText = pj2Str(pbi.status_text); + presStatus.activity = pbi.rpid.activity; + presStatus.note = pj2Str(pbi.rpid.note); + presStatus.rpidId = pj2Str(pbi.rpid.id); +} + +////////////////////////////////////////////////////////////////////////////// + +/* + * Constructor. + */ +Buddy::Buddy() +: id(PJSUA_INVALID_ID) +{ +} + +/* + * Destructor. + */ +Buddy::~Buddy() +{ + if (isValid()) { + pjsua_buddy_set_user_data(id, NULL); + pjsua_buddy_del(id); + + /* Remove from account buddy list */ + acc->removeBuddy(this); + } +} + +/* + * Create buddy and register the buddy to PJSUA-LIB. + */ +void Buddy::create(Account &account, const BuddyConfig &cfg) throw(Error) +{ + pjsua_buddy_config pj_cfg; + pjsua_buddy_config_default(&pj_cfg); + + if (!account.isValid()) + PJSUA2_RAISE_ERROR3(PJ_EINVAL, "Buddy::create()", "Invalid account"); + + pj_cfg.uri = str2Pj(cfg.uri); + pj_cfg.subscribe = cfg.subscribe; + pj_cfg.user_data = (void*)this; + PJSUA2_CHECK_EXPR( pjsua_buddy_add(&pj_cfg, &id) ); + + acc = &account; + acc->addBuddy(this); +} + +/* + * Check if this buddy is valid. + */ +bool Buddy::isValid() const +{ + return PJ2BOOL( pjsua_buddy_is_valid(id) ); +} + +/* + * Get detailed buddy info. + */ +BuddyInfo Buddy::getInfo() const throw(Error) +{ + pjsua_buddy_info pj_bi; + BuddyInfo bi; + + PJSUA2_CHECK_EXPR( pjsua_buddy_get_info(id, &pj_bi) ); + bi.fromPj(pj_bi); + return bi; +} + +/* + * Enable/disable buddy's presence monitoring. + */ +void Buddy::subscribePresence(bool subscribe) throw(Error) +{ + PJSUA2_CHECK_EXPR( pjsua_buddy_subscribe_pres(id, subscribe) ); +} + + +/* + * Update the presence information for the buddy. + */ +void Buddy::updatePresence(void) throw(Error) +{ + PJSUA2_CHECK_EXPR( pjsua_buddy_update_pres(id) ); +} + +/* + * Send instant messaging outside dialog. + */ +void Buddy::sendInstantMessage(const SendInstantMessageParam &prm) throw(Error) +{ + BuddyInfo bi = getInfo(); + + pj_str_t to = str2Pj(bi.contact.empty()? bi.uri : bi.contact); + pj_str_t mime_type = str2Pj(prm.contentType); + pj_str_t content = str2Pj(prm.content); + void *user_data = (void*)prm.userData; + pjsua_msg_data msg_data; + prm.txOption.toPj(msg_data); + + PJSUA2_CHECK_EXPR( pjsua_im_send(acc->getId(), &to, &mime_type, &content, + &msg_data, user_data) ); +} + +/* + * Send typing indication outside dialog. + */ +void Buddy::sendTypingIndication(const SendTypingIndicationParam &prm) + throw(Error) +{ + BuddyInfo bi = getInfo(); + + pj_str_t to = str2Pj(bi.contact.empty()? bi.uri : bi.contact); + pjsua_msg_data msg_data; + prm.txOption.toPj(msg_data); + + PJSUA2_CHECK_EXPR( pjsua_im_typing(acc->getId(), &to, prm.isTyping, + &msg_data) ); +} + |