gloox  0.9.9.12
messageeventfilter.cpp
1 /*
2  Copyright (c) 2005-2008 by Jakob Schroeter <js@camaya.net>
3  This file is part of the gloox library. http://camaya.net/gloox
4 
5  This software is distributed under a license. The full license
6  agreement can be found in the file LICENSE in this distribution.
7  This software may not be copied, modified, sold or distributed
8  other than expressed in the named license agreement.
9 
10  This software is distributed without any warranty.
11 */
12 
13 
14 #include "messageeventfilter.h"
15 #include "messageeventhandler.h"
16 #include "messagesession.h"
17 #include "stanza.h"
18 
19 namespace gloox
20 {
21 
23  : MessageFilter( parent ), m_messageEventHandler( 0 ), m_requestedEvents( 0 ),
24  m_defaultEvents( defaultEvents ), m_lastSent( MessageEventCancel ),
25  m_disable( false )
26  {
27  }
28 
30  {
31  }
32 
34  {
35  if( m_disable )
36  return;
37 
38  if( stanza->subtype() == StanzaMessageError )
39  {
40  if( stanza->error() == StanzaErrorFeatureNotImplemented )
41  m_disable = true;
42 
43  return;
44  }
45 
46  Tag *x = stanza->findChild( "x", "xmlns", XMLNS_X_EVENT );
47  if( x && m_messageEventHandler )
48  {
49  if( stanza->body().empty() )
50  {
51  if( x->hasChild( "offline" ) )
52  m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventOffline );
53  else if( x->hasChild( "delivered" ) )
54  m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventDelivered );
55  else if( x->hasChild( "displayed" ) )
56  m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventDisplayed );
57  else if( x->hasChild( "composing" ) )
58  m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventComposing );
59  else
60  m_messageEventHandler->handleMessageEvent( stanza->from(), MessageEventCancel );
61  }
62  else
63  {
64  m_lastID = stanza->findAttribute( "id" );
65  m_requestedEvents = 0;
66  Tag *x = stanza->findChild( "x" );
67  if( x->hasChild( "offline" ) )
68  m_requestedEvents |= MessageEventOffline;
69  if( x->hasChild( "delivered" ) )
70  m_requestedEvents |= MessageEventDelivered;
71  if( x->hasChild( "displayed" ) )
72  m_requestedEvents |= MessageEventDisplayed;
73  if( x->hasChild( "composing" ) )
74  m_requestedEvents |= MessageEventComposing;
75  }
76  }
77  else if( stanza->body().empty() )
78  {
79  m_requestedEvents = 0;
80  m_lastID = "";
81  }
82  }
83 
85  {
86  if( m_disable || ( !( m_requestedEvents & event ) && ( event != MessageEventCancel ) ) )
87  return;
88 
89  Tag *m = new Tag( "message" );
90  m->addAttribute( "to", m_parent->target().full() );
91  Tag *x = new Tag( m, "x" );
92  x->addAttribute( "xmlns", XMLNS_X_EVENT );
93  new Tag( x, "id", m_lastID );
94 
95  bool used = true;
96  switch( event )
97  {
99  new Tag( x, "offline" );
100  m_requestedEvents &= ~event;
101  break;
103  new Tag( x, "delivered" );
104  m_requestedEvents &= ~event;
105  break;
107  new Tag( x, "displayed" );
108  m_requestedEvents &= ~event;
109  break;
111  if( m_lastSent != MessageEventComposing )
112  new Tag( x, "composing" );
113  else
114  used = false;
115  break;
116  case MessageEventCancel:
117  break;
118  }
119 
120  m_lastSent = event;
121 
122  if( used )
123  send( m );
124  else
125  delete m;
126  }
127 
129  {
130  if( m_disable )
131  return;
132 
133  if( m_defaultEvents != 0 )
134  {
135  Tag *x = new Tag( tag, "x" );
136  x->addAttribute( "xmlns", XMLNS_X_EVENT );
137 
138  if( m_defaultEvents & MessageEventOffline )
139  new Tag( x, "offline" );
140  if( m_defaultEvents & MessageEventDelivered )
141  new Tag( x, "delivered" );
142  if( m_defaultEvents & MessageEventDisplayed )
143  new Tag( x, "displayed" );
144  if( m_defaultEvents & MessageEventComposing )
145  new Tag( x, "composing" );
146  }
147  m_lastSent = MessageEventCancel;
148  }
149 
151  {
152  m_messageEventHandler = meh;
153  }
154 
156  {
157  m_messageEventHandler = 0;
158  }
159 
160 }