/**
* This file is part of TelepathyQt
*
* @copyright Copyright (C) 2010 Collabora Ltd.
* @copyright Copyright (C) 2010 Nokia Corporation
* @license LGPL 2.1
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include
#include "TelepathyQt/debug-internal.h"
namespace Tp
{
struct TP_QT_NO_EXPORT Presence::Private : public QSharedData
{
Private(const SimplePresence &sp)
: sp(sp)
{
}
Private(ConnectionPresenceType type, const QString &status, const QString &statusMessage)
{
sp.type = type;
sp.status = status;
sp.statusMessage = statusMessage;
}
SimplePresence sp;
};
/**
* \class Presence
* \ingroup wrappers
* \headerfile TelepathyQt/presence.h
*
* \brief The Presence class represents a Telepathy simple presence.
*/
Presence::Presence()
{
}
Presence::Presence(const SimplePresence &sp)
: mPriv(new Private(sp))
{
}
Presence::Presence(ConnectionPresenceType type, const QString &status, const QString &statusMessage)
: mPriv(new Private(type, status, statusMessage))
{
}
Presence::Presence(const Presence &other)
: mPriv(other.mPriv)
{
}
Presence::~Presence()
{
}
Presence Presence::available(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeAvailable, QLatin1String("available"), statusMessage);
}
Presence Presence::chat(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeAvailable, QLatin1String("chat"), statusMessage);
}
Presence Presence::away(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeAway, QLatin1String("away"), statusMessage);
}
Presence Presence::brb(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeAway, QLatin1String("brb"), statusMessage);
}
Presence Presence::busy(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeBusy, QLatin1String("busy"), statusMessage);
}
Presence Presence::dnd(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeBusy, QLatin1String("dnd"), statusMessage);
}
Presence Presence::xa(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeExtendedAway, QLatin1String("xa"), statusMessage);
}
Presence Presence::hidden(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeHidden, QLatin1String("hidden"), statusMessage);
}
Presence Presence::offline(const QString &statusMessage)
{
return Presence(ConnectionPresenceTypeOffline, QLatin1String("offline"), statusMessage);
}
Presence &Presence::operator=(const Presence &other)
{
this->mPriv = other.mPriv;
return *this;
}
bool Presence::operator==(const Presence &other) const
{
if (!isValid() || !other.isValid()) {
if (!isValid() && !other.isValid()) {
return true;
}
return false;
}
return mPriv->sp == other.mPriv->sp;
}
bool Presence::operator!=(const Presence &other) const
{
if (!isValid() || !other.isValid()) {
if (!isValid() && !other.isValid()) {
return false;
}
return true;
}
return mPriv->sp != other.mPriv->sp;
}
ConnectionPresenceType Presence::type() const
{
if (!isValid()) {
return ConnectionPresenceTypeUnknown;
}
return (ConnectionPresenceType) mPriv->sp.type;
}
QString Presence::status() const
{
if (!isValid()) {
return QString();
}
return mPriv->sp.status;
}
QString Presence::statusMessage() const
{
if (!isValid()) {
return QString();
}
return mPriv->sp.statusMessage;
}
// Sets all fields
void Presence::setStatus(const SimplePresence &value)
{
if (!isValid()) {
mPriv = new Private(value);
return;
}
mPriv->sp = value;
}
// TODO: explain in proper docs that we don't have setStatusType and setStatus(QString status)
// separately, because:
// 1) type and status are tightly related with each other
// 2) all statuses can't have status message so changing the status alone might make the presence
// illegal if a message was left around
void Presence::setStatus(ConnectionPresenceType type, const QString &status,
const QString &statusMessage)
{
if (!isValid()) {
mPriv = new Private(type, status, statusMessage);
return;
}
mPriv->sp.type = type;
mPriv->sp.status = status;
mPriv->sp.statusMessage = statusMessage;
}
void Presence::setStatusMessage(const QString &statusMessage)
{
if (!isValid()) {
return;
}
mPriv->sp.statusMessage = statusMessage;
}
SimplePresence Presence::barePresence() const
{
if (!isValid()) {
return SimplePresence();
}
return mPriv->sp;
}
struct TP_QT_NO_EXPORT PresenceSpec::Private : public QSharedData
{
Private(const QString &status, const SimpleStatusSpec &spec)
: status(status),
spec(spec)
{
}
QString status;
SimpleStatusSpec spec;
};
/**
* \class PresenceSpec
* \ingroup wrappers
* \headerfile TelepathyQt/presence.h
*
* \brief The PresenceSpec class represents a Telepathy presence information
* supported by a protocol.
*/
PresenceSpec::PresenceSpec()
{
}
PresenceSpec::PresenceSpec(const QString &status, const SimpleStatusSpec &spec)
: mPriv(new Private(status, spec))
{
}
PresenceSpec::PresenceSpec(const PresenceSpec &other)
: mPriv(other.mPriv)
{
}
PresenceSpec::~PresenceSpec()
{
}
PresenceSpec PresenceSpec::available(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeAvailable;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("available"), spec);
}
PresenceSpec PresenceSpec::chat(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeAvailable;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("chat"), spec);
}
PresenceSpec PresenceSpec::pstn(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeAvailable;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("pstn"), spec);
}
PresenceSpec PresenceSpec::away(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeAway;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("away"), spec);
}
PresenceSpec PresenceSpec::brb(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeAway;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("brb"), spec);
}
PresenceSpec PresenceSpec::busy(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeBusy;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("busy"), spec);
}
PresenceSpec PresenceSpec::dnd(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeBusy;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("dnd"), spec);
}
PresenceSpec PresenceSpec::xa(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeExtendedAway;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("xa"), spec);
}
PresenceSpec PresenceSpec::hidden(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeHidden;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("hidden"), spec);
}
PresenceSpec PresenceSpec::offline(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeOffline;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("offline"), spec);
}
PresenceSpec PresenceSpec::unknown(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeUnknown;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("unknown"), spec);
}
PresenceSpec PresenceSpec::error(PresenceSpec::SimpleStatusFlags flags)
{
SimpleStatusSpec spec;
spec.type = ConnectionPresenceTypeError;
spec.maySetOnSelf = flags & MaySetOnSelf;
spec.canHaveMessage = flags & CanHaveStatusMessage;
return PresenceSpec(QLatin1String("error"), spec);
}
PresenceSpec &PresenceSpec::operator=(const PresenceSpec &other)
{
this->mPriv = other.mPriv;
return *this;
}
bool PresenceSpec::operator==(const PresenceSpec &other) const
{
if (!isValid() || !other.isValid()) {
if (!isValid() && !other.isValid()) {
return true;
}
return false;
}
return (mPriv->status == other.mPriv->status) &&
(mPriv->spec == other.mPriv->spec);
}
bool PresenceSpec::operator!=(const PresenceSpec &other) const
{
if (!isValid() || !other.isValid()) {
if (!isValid() && !other.isValid()) {
return false;
}
return true;
}
return (mPriv->status != other.mPriv->status) &&
(mPriv->spec != other.mPriv->spec);
}
bool PresenceSpec::operator<(const PresenceSpec &other) const
{
if (!isValid()) {
return false;
}
if (!other.isValid()) {
return true;
}
return (mPriv->status < other.mPriv->status);
}
Presence PresenceSpec::presence(const QString &statusMessage) const
{
if (!isValid()) {
return Presence();
}
if (!canHaveStatusMessage() && !statusMessage.isEmpty()) {
warning() << "Passing a status message to PresenceSpec with "
"canHaveStatusMessage() being false";
}
return Presence((ConnectionPresenceType) mPriv->spec.type, mPriv->status, statusMessage);
}
bool PresenceSpec::maySetOnSelf() const
{
if (!isValid()) {
return false;
}
return mPriv->spec.maySetOnSelf;
}
bool PresenceSpec::canHaveStatusMessage() const
{
if (!isValid()) {
return false;
}
return mPriv->spec.canHaveMessage;
}
SimpleStatusSpec PresenceSpec::bareSpec() const
{
if (!isValid()) {
return SimpleStatusSpec();
}
return mPriv->spec;
}
/**
* \class PresenceSpecList
* \ingroup wrappers
* \headerfile TelepathyQt/presence.h
*
* \brief The PresenceSpecList class represents a list of PresenceSpec.
*/
} // Tp