Mudlet  0
Mudclient
ircbuffer.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008-2016 The Communi Project
3 
4  You may use this file under the terms of BSD license as follows:
5 
6  Redistribution and use in source and binary forms, with or without
7  modification, are permitted provided that the following conditions are met:
8  * Redistributions of source code must retain the above copyright
9  notice, this list of conditions and the following disclaimer.
10  * Redistributions in binary form must reproduce the above copyright
11  notice, this list of conditions and the following disclaimer in the
12  documentation and/or other materials provided with the distribution.
13  * Neither the name of the copyright holder nor the names of its
14  contributors may be used to endorse or promote products derived
15  from this software without specific prior written permission.
16 
17  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR
21  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 
29 #include "ircbuffer.h"
30 #include "ircbuffer_p.h"
31 #include "ircbuffermodel.h"
32 #include "ircbuffermodel_p.h"
33 #include "ircconnection.h"
34 #include "ircnetwork.h"
35 #include "ircchannel.h"
36 
38 
39 /*!
40  \file ircbuffer.h
41  \brief \#include <IrcBuffer>
42  */
43 
44 /*!
45  \class IrcBuffer ircbuffer.h <IrcBuffer>
46  \ingroup models
47  \brief Keeps track of buffer status.
48 
49  \sa IrcBufferModel
50 */
51 
52 /*!
53  \fn void IrcBuffer::messageReceived(IrcMessage* message)
54 
55  This signal is emitted when a buffer specific message is received.
56 
57  The message may one of the following types:
58  - IrcMessage::Away
59  - IrcMessage::Join
60  - IrcMessage::Kick
61  - IrcMessage::Mode
62  - IrcMessage::Names
63  - IrcMessage::Nick
64  - IrcMessage::Notice
65  - IrcMessage::Numeric
66  - IrcMessage::Part
67  - IrcMessage::Private
68  - IrcMessage::Quit
69  - IrcMessage::Topic
70 
71  \sa IrcConnection::messageReceived(), IrcBufferModel::messageIgnored()
72  */
73 
74 #ifndef IRC_DOXYGEN
76  : q_ptr(0), model(0), persistent(false), sticky(false), monitorStatus(MonitorUnknown)
77 {
78  qRegisterMetaType<IrcBuffer*>();
79  qRegisterMetaType<QList<IrcBuffer*> >();
80 }
81 
83 {
84 }
85 
87 {
88  name = title;
89  setModel(m);
90 }
91 
93 {
94  Q_Q(IrcBuffer);
95  emit q->activeChanged(q->isActive());
96 }
97 
99 {
100  Q_Q(IrcBuffer);
101  emit q->activeChanged(q->isActive());
102 }
103 
105 {
106  Q_Q(IrcBuffer);
107  if (name != value) {
108  const QString oldTitle = q->title();
109  name = value;
110  emit q->nameChanged(name);
111  emit q->titleChanged(q->title());
112  if (model)
113  IrcBufferModelPrivate::get(model)->renameBuffer(oldTitle, q->title());
114  }
115 }
116 
118 {
119  Q_Q(IrcBuffer);
120  if (prefix != value) {
121  const QString oldTitle = q->title();
122  prefix = value;
123  emit q->prefixChanged(prefix);
124  emit q->titleChanged(q->title());
125  if (model)
126  IrcBufferModelPrivate::get(model)->renameBuffer(oldTitle, q->title());
127  }
128 }
129 
131 {
132  model = value;
133 }
134 
136 {
137  Q_Q(IrcBuffer);
138  if (monitorStatus != status) {
139  bool wasActive = q->isActive();
140  monitorStatus = status;
141  bool isActive = q->isActive();
142  if (wasActive != isActive)
143  emit q->activeChanged(isActive);
144  }
145 }
146 
148 {
149  Q_Q(const IrcBuffer);
150  IrcNetwork* n = q->network();
151  IrcConnection* c = q->connection();
152  if (!sticky && !name.startsWith(QLatin1String("*")) && c && c->isConnected() && n && n->numericLimit(IrcNetwork::MonitorCount) >= 0 && !n->isChannel(q->title()))
153  return true;
154  return false;
155 }
156 
158 {
159  Q_Q(IrcBuffer);
160  bool processed = false;
161  switch (message->type()) {
162  case IrcMessage::Away:
163  processed = processAwayMessage(static_cast<IrcAwayMessage*>(message));
164  break;
165  case IrcMessage::Join:
166  processed = processJoinMessage(static_cast<IrcJoinMessage*>(message));
167  break;
168  case IrcMessage::Kick:
169  processed = processKickMessage(static_cast<IrcKickMessage*>(message));
170  break;
171  case IrcMessage::Mode:
172  processed = processModeMessage(static_cast<IrcModeMessage*>(message));
173  break;
174  case IrcMessage::Names:
175  processed = processNamesMessage(static_cast<IrcNamesMessage*>(message));
176  break;
177  case IrcMessage::Nick:
178  processed = processNickMessage(static_cast<IrcNickMessage*>(message));
179  break;
180  case IrcMessage::Notice:
181  processed = processNoticeMessage(static_cast<IrcNoticeMessage*>(message));
182  break;
183  case IrcMessage::Numeric:
184  processed = processNumericMessage(static_cast<IrcNumericMessage*>(message));
185  break;
186  case IrcMessage::Part:
187  processed = processPartMessage(static_cast<IrcPartMessage*>(message));
188  break;
189  case IrcMessage::Private:
190  processed = processPrivateMessage(static_cast<IrcPrivateMessage*>(message));
191  if (processed) {
192  activity = message->timeStamp();
194  }
195  break;
196  case IrcMessage::Quit:
197  processed = processQuitMessage(static_cast<IrcQuitMessage*>(message));
198  break;
199  case IrcMessage::Topic:
200  processed = processTopicMessage(static_cast<IrcTopicMessage*>(message));
201  break;
203  processed = processWhoReplyMessage(static_cast<IrcWhoReplyMessage*>(message));
204  break;
205  default:
206  break;
207  }
208  if (processed)
209  emit q->messageReceived(message);
210  return processed;
211 }
212 
214 {
215  return !message->nick().compare(name, Qt::CaseInsensitive);
216 }
217 
219 {
220  Q_UNUSED(message);
221  return false;
222 }
223 
225 {
226  Q_UNUSED(message);
227  return false;
228 }
229 
231 {
232  Q_UNUSED(message);
233  return false;
234 }
235 
237 {
238  Q_UNUSED(message);
239  return false;
240 }
241 
243 {
244  if (!message->testFlag(IrcMessage::Playback) && !message->nick().compare(name, Qt::CaseInsensitive)) {
245  setName(message->newNick());
246  return true;
247  }
248  return !message->newNick().compare(name, Qt::CaseInsensitive);
249 }
250 
252 {
253  Q_UNUSED(message);
254  return false;
255 }
256 
258 {
259  if (message->code() == Irc::RPL_MONONLINE)
261  else if (message->code() == Irc::RPL_MONOFFLINE)
263  return message->isImplicit();
264 }
265 
267 {
268  Q_UNUSED(message);
269  return false;
270 }
271 
273 {
274  Q_UNUSED(message);
275  return true;
276 }
277 
279 {
280  return !message->nick().compare(name, Qt::CaseInsensitive);
281 }
282 
284 {
285  Q_UNUSED(message);
286  return false;
287 }
288 
290 {
291  Q_UNUSED(message);
292  return false;
293 }
294 #endif // IRC_DOXYGEN
295 
296 /*!
297  Constructs a new buffer object with \a parent.
298  */
300  : QObject(parent), d_ptr(new IrcBufferPrivate)
301 {
302  Q_D(IrcBuffer);
303  d->q_ptr = this;
304 }
305 
306 /*!
307  \internal
308  */
310  : QObject(parent), d_ptr(&dd)
311 {
312  Q_D(IrcBuffer);
313  d->q_ptr = this;
314 }
315 
316 /*!
317  Destructs the buffer object.
318  */
320 {
321  emit destroyed(this);
322 }
323 
324 /*!
325  This property holds the whole buffer title.
326 
327  The title consists of \ref prefix and \ref name.
328 
329  \par Access function:
330  \li QString <b>title</b>() const
331 
332  \par Notifier signal:
333  \li void <b>titleChanged</b>(const QString& title)
334  */
336 {
337  Q_D(const IrcBuffer);
338  return d->prefix + d->name;
339 }
340 
341 /*!
342  This property holds the name part of the buffer \ref title.
343 
344  \par Access functions:
345  \li QString <b>name</b>() const
346  \li void <b>setName</b>(const QString& name) [slot]
347 
348  \par Notifier signal:
349  \li void <b>nameChanged</b>(const QString& name)
350  */
351 QString IrcBuffer::name() const
352 {
353  Q_D(const IrcBuffer);
354  return d->name;
355 }
356 
358 {
359  Q_D(IrcBuffer);
360  d->setName(name);
361 }
362 
363 /*!
364  This property holds the prefix part of the buffer \ref title.
365 
366  \par Access functions:
367  \li QString <b>prefix</b>() const
368  \li void <b>setPrefix</b>(const QString& prefix) [slot]
369 
370  \par Notifier signal:
371  \li void <b>prefixChanged</b>(const QString& prefix)
372  */
374 {
375  Q_D(const IrcBuffer);
376  return d->prefix;
377 }
378 
380 {
381  Q_D(IrcBuffer);
382  return d->setPrefix(prefix);
383 }
384 
385 /*!
386  \property bool IrcBuffer::channel
387  This property holds whether the buffer is a channel.
388 
389  \par Access function:
390  \li bool <b>isChannel</b>() const
391 
392  \sa toChannel()
393  */
395 {
396  return qobject_cast<const IrcChannel*>(this);
397 }
398 
399 /*!
400  Returns the buffer cast to a IrcChannel,
401  if the class is actually a channel, \c 0 otherwise.
402 
403  \sa \ref channel "isChannel()"
404 */
406 {
407  return qobject_cast<IrcChannel*>(this);
408 }
409 
410 /*!
411  This property holds the connection of the buffer.
412 
413  \par Access function:
414  \li \ref IrcConnection* <b>connection</b>() const
415  */
417 {
418  Q_D(const IrcBuffer);
419  return d->model ? d->model->connection() : 0;
420 }
421 
422 /*!
423  This property holds the network of the buffer.
424 
425  \par Access function:
426  \li \ref IrcNetwork* <b>network</b>() const
427  */
429 {
430  Q_D(const IrcBuffer);
431  return d->model ? d->model->network() : 0;
432 }
433 
434 /*!
435  This property holds the model of the buffer.
436 
437  \par Access function:
438  \li \ref IrcBufferModel* <b>model</b>() const
439  */
441 {
442  Q_D(const IrcBuffer);
443  return d->model;
444 }
445 
446 /*!
447  \property bool IrcBuffer::active
448  This property holds whether the buffer is active.
449 
450  A buffer is considered active when a %connection is established. Furthermore,
451  channel buffers are only considered active when the user is on the channel.
452 
453  \par Access function:
454  \li bool <b>isActive</b>() const
455 
456  \par Notifier signal:
457  \li void <b>activeChanged</b>(bool active)
458 
459  \sa IrcConnection::connected
460  */
462 {
463  Q_D(const IrcBuffer);
464  bool connected = false;
465  if (IrcConnection* c = connection())
466  connected = c->isConnected();
467  bool monitor = false;
468  if (d->model)
469  monitor = d->model->isMonitorEnabled();
470  return connected && (!monitor || !d->isMonitorable() || d->monitorStatus == IrcBufferPrivate::MonitorOnline);
471 }
472 
473 /*!
474  \property bool IrcBuffer::sticky
475  This property holds whether the buffer is sticky.
476 
477  A sticky buffer stays in the beginning (Qt::AscendingOrder) or
478  end (Qt::DescendingOrder) of the list of buffers in IrcBufferModel.
479 
480  The default value is \c false.
481 
482  \par Access functions:
483  \li bool <b>isSticky</b>() const
484  \li void <b>setSticky</b>(bool sticky)
485 
486  \par Notifier signal:
487  \li void <b>stickyChanged</b>(bool sticky)
488  */
489 
491 {
492  Q_D(const IrcBuffer);
493  return d->sticky;
494 }
495 
497 {
498  Q_D(IrcBuffer);
499  if (d->sticky != sticky) {
500  d->sticky = sticky;
501  emit stickyChanged(sticky);
502  }
503 }
504 
505 /*!
506  \property bool IrcBuffer::persistent
507  This property holds whether the buffer is persistent.
508 
509  The default value is \c false.
510 
511  A persistent buffer does not get removed and destructed
512  when calling IrcBufferModel::clear(), or when when leaving
513  the corresponding channel. In order to remove a persistent
514  buffer, either explicitly call IrcBufferModel::remove() or
515  delete the buffer.
516 
517  \par Access functions:
518  \li bool <b>isPersistent</b>() const
519  \li void <b>setPersistent</b>(bool persistent)
520 
521  \par Notifier signal:
522  \li void <b>persistentChanged</b>(bool persistent)
523  */
524 
526 {
527  Q_D(const IrcBuffer);
528  return d->persistent;
529 }
530 
532 {
533  Q_D(IrcBuffer);
534  if (d->persistent != persistent) {
535  d->persistent = persistent;
536  emit persistentChanged(persistent);
537  }
538 }
539 
540 /*!
541  \since 3.1
542 
543  This property holds arbitrary user data.
544 
545  \par Access functions:
546  \li QVariantMap <b>userData</b>() const
547  \li void <b>setUserData</b>(const QVariantMap& data)
548 
549  \par Notifier signal:
550  \li void <b>userDataChanged</b>(const QVariantMap& data)
551  */
552 QVariantMap IrcBuffer::userData() const
553 {
554  Q_D(const IrcBuffer);
555  return d->userData;
556 }
557 
558 void IrcBuffer::setUserData(const QVariantMap& data)
559 {
560  Q_D(IrcBuffer);
561  if (d->userData != data) {
562  d->userData = data;
563  emit userDataChanged(data);
564  }
565 }
566 
567 /*!
568  Sends a \a command to the server.
569 
570  This method is provided for convenience. It is equal to:
571  \code
572  IrcConnection* connection = buffer->connection();
573  connection->sendCommand(command);
574  \endcode
575 
576  \sa IrcConnection::sendCommand()
577  */
579 {
580  if (IrcConnection* c = connection())
581  return c->sendCommand(command);
582  return false;
583 }
584 
585 /*!
586  Emits messageReceived() with \a message.
587 
588  IrcBufferModel handles only buffer specific messages and delivers them
589  to the appropriate IrcBuffer instances. When applications decide to handle
590  IrcBuffer::messageReceived(), IrcBufferModel::messageIgnored() makes it
591  easy to implement handling for the rest, non-buffer specific messages.
592  This method can be used to forward such ignored messages to the desired
593  buffers (for instance the one that is currently active in the GUI).
594  */
596 {
597  if (message)
598  emit messageReceived(message);
599 }
600 
601 /*!
602  \since 3.1
603 
604  Closes the buffer with an optional \a reason.
605 
606  The default implementation removes the buffer from its \ref model.
607  Furthermore, IrcChannel parts the channel with \a reason and custom
608  IrcBuffer subclasses might do some additional tasks.
609 
610  \sa IrcChannel::close()
611  */
612 void IrcBuffer::close(const QString& reason)
613 {
614  Q_UNUSED(reason);
615  Q_D(const IrcBuffer);
616  if (d->model)
617  d->model->remove(this);
618 }
619 
620 #ifndef QT_NO_DEBUG_STREAM
621 QDebug operator<<(QDebug debug, const IrcBuffer* buffer)
622 {
623  if (!buffer)
624  return debug << "IrcBuffer(0x0) ";
625  debug.nospace() << buffer->metaObject()->className() << '(' << (void*) buffer;
626  if (!buffer->objectName().isEmpty())
627  debug.nospace() << ", name=" << qPrintable(buffer->objectName());
628  if (!buffer->title().isEmpty())
629  debug.nospace() << ", title=" << qPrintable(buffer->title());
630  debug.nospace() << ')';
631  return debug.space();
632 }
633 #endif // QT_NO_DEBUG_STREAM
634 
635 #include "moc_ircbuffer.cpp"
636 
Q_INVOKABLE bool testFlag(Flag flag) const
Definition: ircmessage.cpp:400
QString title
Definition: ircbuffer.h:52
A notice message (IrcNoticeMessage).
Definition: ircmessage.h:81
A nick message (IrcNickMessage).
Definition: ircmessage.h:80
Represents a join message.
Definition: ircmessage.h:298
bool isImplicit() const
Definition: ircmessage.cpp:362
Q_INVOKABLE bool isChannel(const QString &name) const
Definition: ircnetwork.cpp:498
virtual bool processNoticeMessage(IrcNoticeMessage *message)
Definition: ircbuffer.cpp:251
void setName(const QString &name)
Definition: ircbuffer.cpp:357
bool isConnected() const
Provides the most common commands.
Definition: irccommand.h:44
Represents a kick message.
Definition: ircmessage.h:318
Represents a part message.
Definition: ircmessage.h:461
virtual void disconnected()
Definition: ircbuffer.cpp:98
virtual bool processQuitMessage(IrcQuitMessage *message)
Definition: ircbuffer.cpp:278
bool sticky
Definition: ircbuffer.h:60
QDebug operator<<(QDebug debug, const IrcBuffer *buffer)
Definition: ircbuffer.cpp:621
QDateTime timeStamp
Definition: ircmessage.h:64
Keeps track of channel status.
Definition: ircchannel.h:40
A join message (IrcJoinMessage).
Definition: ircmessage.h:75
bool isSticky() const
Definition: ircbuffer.cpp:490
Q_INVOKABLE bool sendCommand(IrcCommand *command)
Definition: ircbuffer.cpp:578
A topic message (IrcTopicMessage).
Definition: ircmessage.h:88
virtual bool processKickMessage(IrcKickMessage *message)
Definition: ircbuffer.cpp:224
Represents a notice message.
Definition: ircmessage.h:419
The message is playback.
Definition: ircmessage.h:103
virtual ~IrcBufferPrivate()
Definition: ircbuffer.cpp:82
Represents a names list message.
Definition: ircmessage.h:383
virtual void connected()
Definition: ircbuffer.cpp:92
bool isPersistent() const
Definition: ircbuffer.cpp:525
QDateTime activity
Definition: ircbuffer_p.h:92
virtual bool processPrivateMessage(IrcPrivateMessage *message)
Definition: ircbuffer.cpp:272
Q_INVOKABLE IrcChannel * toChannel()
Definition: ircbuffer.cpp:405
Represents an away message.
Definition: ircmessage.h:185
QString nick
Definition: ircmessage.h:59
bool persistent
Definition: ircbuffer.h:61
A private message (IrcPrivateMessage).
Definition: ircmessage.h:86
#include <IrcChannel>
Keeps track of buffer status.
Definition: ircbuffer.h:49
void setSticky(bool sticky)
Definition: ircbuffer.cpp:496
#include <IrcBufferModel>
virtual bool processTopicMessage(IrcTopicMessage *message)
Definition: ircbuffer.cpp:283
void setMonitorStatus(MonitorStatus status)
Definition: ircbuffer.cpp:135
void setUserData(const QVariantMap &data)
Definition: ircbuffer.cpp:558
Represents a reply message to a WHO command.
Definition: ircmessage.h:629
A part message (IrcPartMessage).
Definition: ircmessage.h:83
A names message (IrcNamesMessage).
Definition: ircmessage.h:79
void receiveMessage(IrcMessage *message)
Definition: ircbuffer.cpp:595
QString prefix() const
bool processMessage(IrcMessage *message)
Definition: ircbuffer.cpp:157
void setPersistent(bool persistent)
Definition: ircbuffer.cpp:531
static IrcBufferModelPrivate * get(IrcBufferModel *model)
Provides means to establish a connection to an IRC server.
Definition: ircconnection.h:48
void stickyChanged(bool sticky)
A quit message (IrcQuitMessage).
Definition: ircmessage.h:87
Represents a mode message.
Definition: ircmessage.h:338
virtual void close(const QString &reason=QString())
Definition: ircbuffer.cpp:612
Represents a quit message.
Definition: ircmessage.h:537
virtual bool processPartMessage(IrcPartMessage *message)
Definition: ircbuffer.cpp:266
The base class of all messages.
Definition: ircmessage.h:47
void setPrefix(const QString &prefix)
Definition: ircbuffer.cpp:379
IrcNetwork * network() const
QString newNick
Definition: ircmessage.h:405
void setName(const QString &name)
Definition: ircbuffer.cpp:104
MonitorStatus monitorStatus
Definition: ircbuffer_p.h:93
virtual bool processNumericMessage(IrcNumericMessage *message)
Definition: ircbuffer.cpp:257
void persistentChanged(bool persistent)
Represents a numeric message.
Definition: ircmessage.h:443
The maximum amount of targets a client may have in their monitor list.
Definition: ircnetwork.h:95
void messageReceived(IrcMessage *message)
virtual bool isActive() const
Definition: ircbuffer.cpp:461
virtual bool processNamesMessage(IrcNamesMessage *message)
Definition: ircbuffer.cpp:236
Type type
Definition: ircmessage.h:52
A mode message (IrcModeMessage).
Definition: ircmessage.h:77
#include <IrcNetwork>
QVariantMap userData() const
virtual bool processWhoReplyMessage(IrcWhoReplyMessage *message)
Definition: ircbuffer.cpp:289
Represents a private message.
Definition: ircmessage.h:511
Keeps track of buffers.
virtual bool processModeMessage(IrcModeMessage *message)
Definition: ircbuffer.cpp:230
QString name() const
Q_INVOKABLE int numericLimit(IrcNetwork::Limit limit) const
Definition: ircnetwork.cpp:530
void promoteBuffer(IrcBuffer *buffer)
An away message (IrcAwayMessage).
Definition: ircmessage.h:91
A who reply message (IrcWhoReplyMessage).
Definition: ircmessage.h:89
void destroyed(IrcBuffer *buffer)
return false
Definition: ctelnet.cpp:465
Q_INVOKABLE IrcBuffer(QObject *parent=0)
Definition: ircbuffer.cpp:299
virtual void init(const QString &title, IrcBufferModel *model)
Definition: ircbuffer.cpp:86
QScopedPointer< IrcBufferPrivate > d_ptr
Definition: ircbuffer.h:112
Represents a nick message.
Definition: ircmessage.h:401
#include <IrcConnection>
Represents a topic message.
Definition: ircmessage.h:553
QString title() const
virtual bool processJoinMessage(IrcJoinMessage *message)
Definition: ircbuffer.cpp:218
IrcConnection * connection() const
IrcBufferModel * model() const
bool renameBuffer(const QString &from, const QString &to)
virtual ~IrcBuffer()
Definition: ircbuffer.cpp:319
void userDataChanged(const QVariantMap &data)
#include <IrcBuffer>
#define IRC_END_NAMESPACE
Definition: ircglobal.h:112
A numeric message (IrcNumericMessage).
Definition: ircmessage.h:82
Provides network information and capability management.
Definition: ircnetwork.h:43
virtual bool processNickMessage(IrcNickMessage *message)
Definition: ircbuffer.cpp:242
virtual bool processAwayMessage(IrcAwayMessage *message)
Definition: ircbuffer.cpp:213
bool isChannel() const
Definition: ircbuffer.cpp:394
A kick message (IrcKickMessage).
Definition: ircmessage.h:76
void setPrefix(const QString &prefix)
Definition: ircbuffer.cpp:117
void setModel(IrcBufferModel *model)
Definition: ircbuffer.cpp:130
IrcBufferModel * model
Definition: ircbuffer_p.h:86
#define IRC_BEGIN_NAMESPACE
Definition: ircglobal.h:111
bool isMonitorable() const
Definition: ircbuffer.cpp:147