2019-04-05 15:12:59 +00:00
# include "contact.h"
2019-04-07 14:02:41 +00:00
# include <QDebug>
2019-04-10 20:53:42 +00:00
# include "account.h"
2019-04-05 15:12:59 +00:00
2019-04-07 20:14:15 +00:00
Models : : Contact : : Contact ( const QString & p_jid , const QMap < QString , QVariant > & data , Item * parentItem ) :
2019-04-05 15:12:59 +00:00
Item ( Item : : contact , data , parentItem ) ,
2019-04-07 20:14:15 +00:00
jid ( p_jid ) ,
availability ( Shared : : offline ) ,
state ( Shared : : none ) ,
2019-04-09 22:01:25 +00:00
presences ( ) ,
messages ( ) ,
childMessages ( 0 )
2019-04-05 15:12:59 +00:00
{
2019-04-07 20:14:15 +00:00
QMap < QString , QVariant > : : const_iterator itr = data . find ( " state " ) ;
if ( itr ! = data . end ( ) ) {
setState ( itr . value ( ) . toUInt ( ) ) ;
}
2019-04-05 15:12:59 +00:00
}
Models : : Contact : : ~ Contact ( )
{
}
QString Models : : Contact : : getJid ( ) const
{
return jid ;
}
void Models : : Contact : : setJid ( const QString p_jid )
{
if ( jid ! = p_jid ) {
jid = p_jid ;
2019-04-07 14:02:41 +00:00
changed ( 1 ) ;
2019-04-05 15:12:59 +00:00
}
}
2019-04-07 20:14:15 +00:00
void Models : : Contact : : setAvailability ( unsigned int p_state )
2019-04-05 15:12:59 +00:00
{
2019-04-07 20:14:15 +00:00
if ( p_state < = Shared : : availabilityHighest ) {
Shared : : Availability state = static_cast < Shared : : Availability > ( p_state ) ;
setAvailability ( state ) ;
} else {
qDebug ( ) < < " An attempt to set invalid availability " < < p_state < < " to the contact " < < jid ;
}
2019-04-05 15:12:59 +00:00
}
2019-04-07 20:14:15 +00:00
void Models : : Contact : : setState ( unsigned int p_state )
2019-04-05 15:12:59 +00:00
{
2019-04-07 20:14:15 +00:00
if ( p_state < = Shared : : subscriptionStateHighest ) {
Shared : : SubscriptionState state = static_cast < Shared : : SubscriptionState > ( p_state ) ;
setState ( state ) ;
} else {
qDebug ( ) < < " An attempt to set invalid subscription state " < < p_state < < " to the contact " < < jid ;
}
}
Shared : : Availability Models : : Contact : : getAvailability ( ) const
{
return availability ;
}
void Models : : Contact : : setAvailability ( Shared : : Availability p_state )
{
if ( availability ! = p_state ) {
availability = p_state ;
changed ( 3 ) ;
2019-04-05 15:12:59 +00:00
}
}
int Models : : Contact : : columnCount ( ) const
{
2019-04-09 22:01:25 +00:00
return 5 ;
2019-04-05 15:12:59 +00:00
}
QVariant Models : : Contact : : data ( int column ) const
{
switch ( column ) {
case 0 :
if ( name = = " " ) {
return jid ;
} else {
return Item : : data ( column ) ;
}
case 1 :
return jid ;
case 2 :
return state ;
2019-04-09 15:04:08 +00:00
case 3 :
return availability ;
2019-04-09 22:01:25 +00:00
case 4 :
return getMessagesCount ( ) ;
2019-04-05 15:12:59 +00:00
default :
return QVariant ( ) ;
}
}
void Models : : Contact : : update ( const QString & field , const QVariant & value )
{
if ( field = = " name " ) {
setName ( value . toString ( ) ) ;
} else if ( field = = " jid " ) {
setJid ( value . toString ( ) ) ;
2019-04-07 20:14:15 +00:00
} else if ( field = = " availability " ) {
setAvailability ( value . toUInt ( ) ) ;
2019-04-05 15:12:59 +00:00
} else if ( field = = " state " ) {
2019-04-07 20:14:15 +00:00
setState ( value . toUInt ( ) ) ;
2019-04-05 15:12:59 +00:00
}
}
2019-04-07 14:02:41 +00:00
void Models : : Contact : : addPresence ( const QString & p_name , const QMap < QString , QVariant > & data )
{
QMap < QString , Presence * > : : iterator itr = presences . find ( p_name ) ;
if ( itr = = presences . end ( ) ) {
Presence * pr = new Presence ( data ) ;
pr - > setName ( p_name ) ;
presences . insert ( p_name , pr ) ;
appendChild ( pr ) ;
} else {
Presence * pr = itr . value ( ) ;
for ( QMap < QString , QVariant > : : const_iterator itr = data . begin ( ) , end = data . end ( ) ; itr ! = end ; + + itr ) {
pr - > update ( itr . key ( ) , itr . value ( ) ) ;
}
}
}
void Models : : Contact : : removePresence ( const QString & name )
{
QMap < QString , Presence * > : : iterator itr = presences . find ( name ) ;
if ( itr = = presences . end ( ) ) {
2019-04-09 15:04:08 +00:00
qDebug ( ) < < " an attempt to remove non existing presence " < < name < < " from the contact " < < jid < < " of account " < < getAccountName ( ) < < " , skipping " ;
2019-04-07 14:02:41 +00:00
} else {
Presence * pr = itr . value ( ) ;
presences . erase ( itr ) ;
removeChild ( pr - > row ( ) ) ;
}
}
void Models : : Contact : : refresh ( )
{
QDateTime lastActivity ;
Presence * presence = 0 ;
2019-04-09 22:01:25 +00:00
unsigned int count = 0 ;
2019-04-07 14:02:41 +00:00
for ( QMap < QString , Presence * > : : iterator itr = presences . begin ( ) , end = presences . end ( ) ; itr ! = end ; + + itr ) {
Presence * pr = itr . value ( ) ;
QDateTime la = pr - > getLastActivity ( ) ;
2019-04-09 22:01:25 +00:00
count + = pr - > getMessagesCount ( ) ;
2019-04-07 14:02:41 +00:00
if ( la > lastActivity ) {
lastActivity = la ;
presence = pr ;
}
}
if ( presence ! = 0 ) {
2019-04-07 20:14:15 +00:00
setAvailability ( presence - > getAvailability ( ) ) ;
} else {
setAvailability ( Shared : : offline ) ;
2019-04-07 14:02:41 +00:00
}
2019-04-09 22:01:25 +00:00
if ( childMessages ! = count ) {
childMessages = count ;
changed ( 4 ) ;
}
2019-04-07 14:02:41 +00:00
}
void Models : : Contact : : _removeChild ( int index )
{
2019-04-09 15:04:08 +00:00
Item * child = childItems [ index ] ;
disconnect ( child , SIGNAL ( childChanged ( Models : : Item * , int , int ) ) , this , SLOT ( refresh ( ) ) ) ;
2019-04-07 14:02:41 +00:00
Item : : _removeChild ( index ) ;
refresh ( ) ;
}
void Models : : Contact : : appendChild ( Models : : Item * child )
{
Item : : appendChild ( child ) ;
2019-04-09 15:04:08 +00:00
connect ( child , SIGNAL ( childChanged ( Models : : Item * , int , int ) ) , this , SLOT ( refresh ( ) ) ) ;
2019-04-07 14:02:41 +00:00
refresh ( ) ;
}
2019-04-07 20:14:15 +00:00
Shared : : SubscriptionState Models : : Contact : : getState ( ) const
{
return state ;
}
void Models : : Contact : : setState ( Shared : : SubscriptionState p_state )
{
if ( state ! = p_state ) {
state = p_state ;
changed ( 2 ) ;
}
}
QIcon Models : : Contact : : getStatusIcon ( ) const
{
2019-04-09 22:01:25 +00:00
if ( getMessagesCount ( ) > 0 ) {
return QIcon : : fromTheme ( " mail-message " ) ;
} else if ( state = = Shared : : both ) {
2019-04-07 20:14:15 +00:00
return QIcon : : fromTheme ( Shared : : availabilityThemeIcons [ availability ] ) ;
} else {
return QIcon : : fromTheme ( Shared : : subscriptionStateThemeIcons [ state ] ) ;
}
}
2019-04-09 15:04:08 +00:00
QString Models : : Contact : : getAccountName ( ) const
{
const Item * p = this ;
do {
p = p - > parentItemConst ( ) ;
} while ( p ! = 0 & & p - > type ! = Item : : account ) ;
if ( p = = 0 ) {
qDebug ( ) < < " An attempt to request account name of the contact " < < jid < < " but the parent account wasn't found, returning empty string " ;
return " " ;
}
return p - > getName ( ) ;
}
2019-04-11 14:58:59 +00:00
void Models : : Contact : : addMessage ( const Shared : : Message & data )
2019-04-09 22:01:25 +00:00
{
2019-04-11 14:58:59 +00:00
const QString & res = data . getPenPalResource ( ) ;
2019-04-09 22:01:25 +00:00
if ( res . size ( ) > 0 ) {
QMap < QString , Presence * > : : iterator itr = presences . find ( res ) ;
if ( itr = = presences . end ( ) ) {
qDebug ( ) < < " An attempt to add message to the roster to the unknown resource " < < res < < " of contact " < < jid < < " in account " < < getAccountName ( ) < < " , skipping " ;
return ;
}
itr . value ( ) - > addMessage ( data ) ;
} else {
messages . emplace_back ( data ) ;
changed ( 4 ) ;
}
}
unsigned int Models : : Contact : : getMessagesCount ( ) const
{
return messages . size ( ) + childMessages ;
}
void Models : : Contact : : dropMessages ( )
{
if ( messages . size ( ) > 0 ) {
messages . clear ( ) ;
changed ( 4 ) ;
}
for ( QMap < QString , Presence * > : : iterator itr = presences . begin ( ) , end = presences . end ( ) ; itr ! = end ; + + itr ) {
itr . value ( ) - > dropMessages ( ) ;
}
}
2019-04-10 20:53:42 +00:00
void Models : : Contact : : getMessages ( Models : : Contact : : Messages & container ) const
{
for ( Messages : : const_iterator itr = messages . begin ( ) , end = messages . end ( ) ; itr ! = end ; + + itr ) {
2019-04-11 14:58:59 +00:00
const Shared : : Message & msg = * itr ;
2019-04-10 20:53:42 +00:00
container . push_back ( msg ) ;
}
for ( QMap < QString , Presence * > : : const_iterator itr = presences . begin ( ) , end = presences . end ( ) ; itr ! = end ; + + itr ) {
itr . value ( ) - > getMessages ( container ) ;
}
}
QString Models : : Contact : : getAccountJid ( ) const
{
const Item * p = this ;
do {
p = p - > parentItemConst ( ) ;
} while ( p ! = 0 & & p - > type ! = Item : : account ) ;
if ( p = = 0 ) {
qDebug ( ) < < " An attempt to request account jid of the contact " < < jid < < " but the parent account wasn't found, returning empty string " ;
return " " ;
}
const Account * acc = static_cast < const Account * > ( p ) ;
return acc - > getLogin ( ) + " @ " + acc - > getServer ( ) ;
}