2 // This file is part of the aMule Project.
4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2005-2011 Dévai Tamás ( gonosztopi@amule.org )
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
32 * Interface to stat tree nodes.
34 * This file defines various classes representing
35 * statistics tree nodes.
40 # define VIRTUAL virtual
46 #include <list> // Needed for std::list
47 #include <wx/string.h> // Needed for wxString
48 #include <wx/thread.h> // Needed for wxMutex
53 #include <wx/datetime.h> // Needed for wxDateTime
54 #include "GetTickCount.h" // Needed for GetTickCount64()
62 stNone
= 0, ///< Nothing. Really.
63 stSortChildren
= 1, ///< Childrens are sorted descending by their ID.
64 stShowPercent
= 2, /*!< Shows percentage compared to parent.
65 * Counters only, whose parent is also counter! (khmm...)
67 stHideIfZero
= 4, ///< Hides item (and children) if value is zero.
68 stSortByValue
= 8, /*!< Together with stSortChildren, sorts children by their value.
69 * WARNING! This assumes that value-sorted children are
71 * Sort-by-value works only on children with ID between 0x00000100-0x7fffffff.
72 * @note CStatTreeItemBase::ReSortChildren() must be called to get sort order right.
74 stCapChildren
= 16 ///< Caps children list.
75 /*!< Shows only top n children, where n is set by CStatisticsDlg::FillTree() to thePrefs::GetMaxClientVersions().
76 * The list itself is not changed, only visibility is ignored on items
77 * outside the top n visible.
79 * On an EC request, visibility range can be set with the EC_TAG_STATTREE_CAPPING tag.
92 * Display modes for Simple and Counter items
96 dmDefault
, ///< Default display mode.
97 dmTime
, ///< Treat integer value as time in seconds.
98 dmBytes
///< Treat integer value as bytes count.
101 #endif /* !CLIENT_GUI */
104 class CStatTreeItemBase
;
105 typedef std::list
<CStatTreeItemBase
*>::iterator StatTreeItemIterator
;
110 uint32_t NewStatTreeItemId();
114 * Base tree item class
116 class CStatTreeItemBase
122 * Creates an item with a constant label.
124 * @param label Visible text for the item.
125 * @param flags Flags to use.
127 CStatTreeItemBase(const wxString
&label
, unsigned flags
= stNone
)
128 : m_label(label
), m_parent(NULL
), m_flags(flags
), m_id(0),
129 m_uniqueid(NewStatTreeItemId())
133 * Creates an item with a constant label.
135 * @param label Visible text for the item.
137 CStatTreeItemBase(const wxString
&label
, uint32_t uniqueid
)
138 : m_label(label
), m_uniqueid(uniqueid
)
142 * Creates an item (and the whole subtree) from an EC tag.
144 * @param tag EC tag containing a stat subtree.
146 CStatTreeItemBase(const CECTag
*tag
);
150 * Deletes all children.
152 VIRTUAL
~CStatTreeItemBase();
156 * Adds a new child node.
158 * @param child child to add.
159 * @param id an optional ID for the new item.
160 * @param skipOneLevel activates a trick to let the code work for aMule OSInfo and Version trees.
162 * @return the newly added item.
164 CStatTreeItemBase
*AddChild(
165 CStatTreeItemBase
* child
,
167 bool skipOneLevel
= false);
171 * Check for children.
173 * @return true if this node has children, false otherwise.
175 bool HasChildren() { wxMutexLocker
lock(m_lock
); return !m_children
.empty(); }
178 * Check for visible children.
180 * @return true if this node has children and at least one of them is visible.
182 bool HasVisibleChildren();
187 * Check for a given child.
189 * @return true if this node has a child with the given ID.
191 bool HasChildWithId(uint32_t id
);
194 * Access a specific child.
196 * @return the child with the given ID, or NULL if not found.
198 CStatTreeItemBase
*GetChildById(uint32_t id
);
201 * Get the first visible child.
203 * @param max_children The maximum number of children to show, when the stCapChildren flag is set. Otherwise it has no effect. (0 = unlimited)
205 * @return An iterator, that should be passed to GetNextVisibleChild() and IsAtEndOfList().
207 StatTreeItemIterator
GetFirstVisibleChild(uint32_t max_children
);
210 * Get the next visible child.
212 void GetNextVisibleChild(StatTreeItemIterator
& it
);
214 #else /* CLIENT_GUI */
217 * Get the first visible child.
219 * @return An iterator, that should be passed to GetNextVisibleChild() and IsAtEndOfList().
221 * @note On a remote list every item is visible.
223 StatTreeItemIterator
GetFirstVisibleChild() { return m_children
.begin(); }
226 * Get the next visible child.
228 * @note On a remote list every item is visible.
230 void GetNextVisibleChild(StatTreeItemIterator
& it
) { ++it
; }
232 #endif /* !CLIENT_GUI / CLIENT_GUI */
235 * Check if we are past the end of child list.
237 bool IsAtEndOfList(StatTreeItemIterator
& it
) { return it
== m_children
.end(); }
241 * Resorts children for the stSortByValue flag.
243 void ReSortChildren() { wxMutexLocker
lock(m_lock
); m_children
.sort(ValueSort
); }
249 * Returns a string that will be displayed on the GUI tree.
251 virtual wxString
GetDisplayString() const;
254 * Returns the associated text (GUI item label).
256 const wxString
& GetDisplayString() const { return m_label
; }
257 #endif /* !CLIENT_GUI / CLIENT_GUI */
260 * Returns the mutex used to lock the child list of this node.
262 * This function is used by CStatisticsDlg to be able to lock the
263 * core tree while updating the GUI tree.
265 wxMutex
& GetLock() { return m_lock
; }
268 * Returns the unique ID of this node.
270 uint32_t GetUniqueId() const { return m_uniqueid
; }
271 #endif /* !AMULE_DAEMON */
274 * Check whether this node is visible.
276 VIRTUAL
bool IsVisible() const { return true; }
280 * Create an EC tag from this node (and children).
282 * @param max_children The maximum number of children to show, when the stCapChildren flag is set. Otherwise it has no effect. (0 = unlimited)
284 * @return A EC tag containing this node and all its children.
286 virtual CECTag
*CreateECTag(uint32_t max_children
);
293 * Add values to the EC tag being generated.
295 * Should have a real implementation in children which have some value.
296 * The given parameter is the tag to which values should be added.
298 virtual void AddECValues(CECTag
*) const {}
301 //! Unformatted and untranslated label of the node. Note: On remote gui it is already formatted and translated.
302 const wxString m_label
;
305 //! Parent of this node.
306 CStatTreeItemBase
*m_parent
;
308 //! Flags for the node.
315 //! Function used when sorting children by value.
316 static bool ValueSort(const CStatTreeItemBase
* a
, const CStatTreeItemBase
* b
);
321 //! Counter to keep track of displayed visible items
322 // (needed for the stCapChildren flag)
323 uint32_t m_visible_counter
;
326 //! Unique ID of this node.
329 //! Children of this node.
330 std::list
<CStatTreeItemBase
*> m_children
;
332 //! Lock to protect list from simultanous access.
338 // Anything below is only for core.
345 * This tree item has one value and nothing speciality. :)
346 * The value might be an arbitrary integer or floating point type,
347 * or a wxString string.
349 * The item is able to display value in different formats, see SetDisplayMode().
351 * @note that you have to specify the right format code on 'label', i.e.:
352 * %s for string and integers with displayMode dmTime or dmBytes,
353 * %u or similar for integers, and
354 * %f or similar for floating point types.
356 * @note You have to call SetValue() after creation for non-integer values, otherwise
357 * you'll get undesired results.
359 class CStatTreeItemSimple
: public CStatTreeItemBase
366 * @see CStatTreeItemBase::CStatTreeItemBase
369 const wxString
&label
,
370 unsigned flags
= stNone
,
371 enum EDisplayMode displaymode
= dmDefault
)
373 CStatTreeItemBase(label
, flags
),
374 m_valuetype(vtUnknown
),
375 m_displaymode(displaymode
)
377 SetValue((uint64_t)0);
381 * Sets the desired display mode of value.
383 void SetDisplayMode(enum EDisplayMode mode
)
385 m_displaymode
= mode
;
389 * Sets an integer type value.
391 * @param value the value to be set.
393 void SetValue(uint64_t value
)
395 m_valuetype
= vtInteger
;
400 * Sets a floating point type value.
402 * @param value the value to be set.
404 void SetValue(double value
)
406 m_valuetype
= vtFloat
;
407 m_floatvalue
= value
;
411 * Sets a string type value.
413 * @param value the value to be set.
415 void SetValue(const wxString
& value
)
417 m_valuetype
= vtString
;
418 m_stringvalue
= value
;
423 * @see CStatTreeItemBase::GetDisplayString()
425 virtual wxString
GetDisplayString() const;
429 * @see CStatTreeItemBase::IsVisible()
431 virtual bool IsVisible() const;
435 * Add values to EC tag being generated.
437 * @param tag The tag to which values should be added.
439 * @see CStatTreeItemBase::AddECValues
441 virtual void AddECValues(CECTag
*tag
) const;
443 //! Type of the value.
444 enum EValueType m_valuetype
;
445 //! Display mode of the value.
446 enum EDisplayMode m_displaymode
;
447 //! Union to save space.
450 uint64_t m_intvalue
; ///< Integer value.
451 double m_floatvalue
; ///< Floating point value.
453 wxString m_stringvalue
; ///< String value.
458 * Counter-type tree item template.
460 * Able to show percentage compared to parent, hide itself
461 * when value is zero, and nice functions for changing the value.
462 * stShowPercent and stHideIfZero flags take effect only on
465 template<typename _Tp
>
466 class CStatTreeItemCounterTmpl
: public CStatTreeItemBase
472 * @see CStatTreeItemBase::CStatTreeItemBase
474 CStatTreeItemCounterTmpl(
475 const wxString
&label
,
476 unsigned flags
= stNone
)
478 CStatTreeItemBase(label
, flags
),
480 m_displaymode(dmDefault
) {}
483 * Retrieve counter value.
485 _Tp
GetValue() const { return m_value
; }
488 * Retrieve counter value.
490 operator _Tp() const { return m_value
; }
493 * Set counter to given value.
495 void SetValue(_Tp value
) { m_value
= value
; }
498 * Set counter to given value.
500 void operator=(_Tp value
) { m_value
= value
; }
503 * Increase value by 1.
505 void operator++() { ++m_value
; }
508 * Decrease value by 1.
510 void operator--() { --m_value
; }
513 * Increase value by given amount.
515 void operator+=(_Tp value
) { m_value
+= value
; }
518 * Decrease value by given amount.
520 void operator-=(_Tp value
) { m_value
-= value
; }
523 * Sets the desired display mode of value.
525 void SetDisplayMode(enum EDisplayMode mode
) { m_displaymode
= mode
; }
529 * @see CStatTreeItemBase::GetDisplayString()
531 virtual wxString
GetDisplayString() const;
535 * @see CStatTreeItemBase::IsVisible()
537 virtual bool IsVisible() const
539 return (m_flags
& stHideIfZero
) ? (m_value
!= 0) : true;
544 * Add values to EC tag being generated.
546 * @param tag The tag to which values should be added.
548 * @see CStatTreeItemBase::AddECValues
550 virtual void AddECValues(CECTag
*tag
) const;
552 //! Actual value of the counter.
555 //! Display mode of the value.
556 enum EDisplayMode m_displaymode
;
559 typedef CStatTreeItemCounterTmpl
<uint64_t> CStatTreeItemCounter
;
560 typedef CStatTreeItemCounterTmpl
<uint32_t> CStatTreeItemNativeCounter
;
564 * A counter, which does not display its value :P
566 class CStatTreeItemHiddenCounter
: public CStatTreeItemCounter
572 * @see CStatTreeItemCounter::CStatTreeItemCounter
574 CStatTreeItemHiddenCounter(
575 const wxString
&label
,
576 unsigned flags
= stNone
)
578 CStatTreeItemCounter(label
, flags
) {}
582 * @see CStatTreeItemBase::GetDisplayString()
584 virtual wxString
GetDisplayString() const
586 return CStatTreeItemBase::GetDisplayString();
591 * @see CStatTreeItemBase::IsVisible()
593 virtual bool IsVisible() const { return true; }
597 virtual void AddECValues(CECTag
*) const {}
602 * Item for the session/total upload/download counter
604 class CStatTreeItemUlDlCounter
: public CStatTreeItemCounter
608 * @param label format text for item.
609 * @param totalfunc function that will return the totals.
611 CStatTreeItemUlDlCounter(
612 const wxString
&label
,
613 uint64_t (*totalfunc
)(),
614 unsigned flags
= stNone
)
616 CStatTreeItemCounter(label
, flags
),
617 m_totalfunc(totalfunc
) {}
621 * @see CStatTreeBase::GetDisplayString()
623 virtual wxString
GetDisplayString() const;
628 * Add values to EC tag being generated.
630 * @param tag The tag to which values should be added.
632 * @see CStatTreeItemBase::AddECValues
634 virtual void AddECValues(CECTag
*tag
) const;
636 //! A function whose return value is the total (without current) value.
637 uint64_t (*m_totalfunc
)();
642 * Counter-like tree item which remembers its max value.
644 * Used for active connections counter, to be able to get peak connections.
646 class CStatTreeItemCounterMax
: public CStatTreeItemBase
650 * @see CStatTreeItemBase::CStatTreeItemBase
652 CStatTreeItemCounterMax(const wxString
&label
)
654 CStatTreeItemBase(label
),
664 if (++m_value
> m_max_value
) {
665 m_max_value
= m_value
;
672 void operator--() { --m_value
; }
675 * Retrieve actual value
677 uint32_t GetValue() { return m_value
; }
682 uint32_t GetMaxValue() { return m_max_value
; }
686 * @see CStatTreeItemBase::GetDisplayString()
688 virtual wxString
GetDisplayString() const;
693 * Add values to EC tag being generated.
695 * @param tag The tag to which values should be added.
697 * @see CStatTreeItemBase::AddECValues
699 virtual void AddECValues(CECTag
*tag
) const;
701 //! Actual value of the counter.
704 //! Maximal value the counter has ever reached.
705 uint32_t m_max_value
;
710 * Tree item for counting packets
712 class CStatTreeItemPackets
: public CStatTreeItemBase
714 friend class CStatTreeItemPacketTotals
;
718 * @see CStatTreeItemBase::CStatTreeItemBase
720 CStatTreeItemPackets(const wxString
&label
)
722 CStatTreeItemBase(label
, stNone
),
727 * Add a packet of size 'size'.
729 void operator+=(long size
)
737 * @see CStatTreeItemBase::GetDisplayString()
739 virtual wxString
GetDisplayString() const;
744 * Add values to EC tag being generated.
746 * @param tag The tag to which values should be added.
748 * @see CStatTreeItemBase::AddECValues
750 virtual void AddECValues(CECTag
*tag
) const;
752 //! Total number of packets.
755 //! Total bytes in the packets.
761 * Tree item for counting totals on packet counters.
763 * This item sums up a number of packet counters, plus adds its own values.
765 class CStatTreeItemPacketTotals
: public CStatTreeItemPackets
769 * @see CStatTreeItemPackets::CStatTreeItemPackets
771 CStatTreeItemPacketTotals(const wxString
&label
)
773 CStatTreeItemPackets(label
) {}
776 * Adds a packet counter, whose values should be counted in the totals.
778 void AddPacketCounter(CStatTreeItemPackets
* counter
)
780 m_counters
.push_back(counter
);
785 * @see CStatTreeItemPackets::GetDisplayString()
787 virtual wxString
GetDisplayString() const;
792 * Add values to EC tag being generated.
794 * @param tag The tag to which values should be added.
796 * @see CStatTreeItemBase::AddECValues
798 virtual void AddECValues(CECTag
*tag
) const;
800 //! List of packet counters to sum.
801 std::vector
<CStatTreeItemPackets
*> m_counters
;
806 * Tree item for timer type nodes.
808 class CStatTreeItemTimer
: public CStatTreeItemBase
813 * @see CStatTreeItemBase::CStatTreeItemBase
816 const wxString
&label
,
817 unsigned flags
= stNone
)
819 CStatTreeItemBase(label
, flags
),
823 * Sets timer start time (and thus starts timer).
825 void SetStartTime(uint64_t value
) { m_value
= value
; }
828 * Starts the timer if it's not running.
830 void StartTimer() { if (!m_value
) m_value
= GetTickCount64(); }
835 void StopTimer() { m_value
= 0; }
838 * Check whether the timer is running.
840 bool IsRunning() const { return m_value
!= 0; }
843 * Reset timer unconditionally.
845 void ResetTimer() { m_value
= GetTickCount64(); }
850 uint64_t GetTimerValue() const
852 return m_value
? GetTickCount64() - m_value
: 0;
856 * Get timer value (in ticks).
858 operator uint64_t() const
860 return m_value
? GetTickCount64() - m_value
: 0;
864 * Get elapsed time in seconds.
866 uint64_t GetTimerSeconds() const
868 return m_value
? (GetTickCount64() - m_value
) / 1000 : 0;
872 * Get start time of the timer.
874 uint64_t GetTimerStart() const { return m_value
; }
878 * @see CStatTreeItemBase::GetDisplayString()
880 virtual wxString
GetDisplayString() const;
884 * @see CStatTreeItemBase::IsVisible()
886 virtual bool IsVisible() const
888 return (m_flags
& stHideIfZero
) ? m_value
!= 0 : true;
893 * Add values to EC tag being generated.
895 * @param tag The tag to which values should be added.
897 * @see CStatTreeItemBase::AddECValues
899 virtual void AddECValues(CECTag
*tag
) const;
901 //! Tick count value when timer was started.
907 * Tree item for shared files average size.
909 * Average is counted as dividend / divisor, if divisor is non-zero.
911 class CStatTreeItemAverage
: public CStatTreeItemBase
915 * @see CStatTreeItemBase::CStatTreeItemBase
917 * @param dividend What to divide.
918 * @param divisor Divide by what.
920 CStatTreeItemAverage(
921 const wxString
&label
,
922 const CStatTreeItemCounter
*dividend
,
923 const CStatTreeItemCounter
*divisor
,
924 enum EDisplayMode displaymode
)
926 CStatTreeItemBase(label
, stNone
),
927 m_dividend(dividend
),
929 m_displaymode(displaymode
) {}
933 * @see CStatTreeItemBase::GetDisplayString()
935 virtual wxString
GetDisplayString() const;
939 * @see CStatTreeItemBase::IsVisible()
941 virtual bool IsVisible() const { return (*m_divisor
) != 0; }
945 * Add values to EC tag being generated.
947 * @param tag The tag to which values should be added.
949 * @see CStatTreeItemBase::AddECValues
951 virtual void AddECValues(CECTag
*tag
) const;
954 const CStatTreeItemCounter
*m_dividend
;
957 const CStatTreeItemCounter
*m_divisor
;
960 enum EDisplayMode m_displaymode
;
965 * Tree item for average up/down speed.
967 class CStatTreeItemAverageSpeed
: public CStatTreeItemBase
972 * @see CStatTreeItemBase::CStatTreeItemBase
974 * @param counter Session up/down counter.
975 * @param timer Session uptime timer.
977 CStatTreeItemAverageSpeed(
978 const wxString
&label
,
979 const CStatTreeItemUlDlCounter
*counter
,
980 const CStatTreeItemTimer
*timer
)
982 CStatTreeItemBase(label
, stNone
),
988 * @see CStatTreeItemBase::GetDisplayString()
990 virtual wxString
GetDisplayString() const;
995 * Add values to EC tag being generated.
997 * @param tag The tag to which values should be added.
999 * @see CStatTreeItemBase::AddECValues
1001 virtual void AddECValues(CECTag
*tag
) const;
1003 //! Session sent/received bytes counter.
1004 const CStatTreeItemUlDlCounter
*m_counter
;
1007 const CStatTreeItemTimer
*m_timer
;
1012 * Tree item for displaying ratio between two counters.
1014 * Ratio is counted as counter1:counter2.
1016 class CStatTreeItemRatio
: public CStatTreeItemBase
1020 * @see CStatTreeItemBase::CStatTreeItemBase
1022 * @param cnt1 First counter to use.
1023 * @param cnt2 Second counter to use.
1026 const wxString
&label
,
1027 const CStatTreeItemCounter
*cnt1
,
1028 const CStatTreeItemCounter
* cnt2
,
1029 uint64_t (*totalfunc1
)() = NULL
,
1030 uint64_t (*totalfunc2
)() = NULL
)
1032 CStatTreeItemBase(label
, stNone
),
1035 m_totalfunc1(totalfunc1
),
1036 m_totalfunc2(totalfunc2
){}
1038 #ifndef AMULE_DAEMON
1040 * @see CStatTreeItemBase::GetDisplayString()
1042 virtual wxString
GetDisplayString() const;
1047 * Add values to EC tag being generated.
1049 * @param tag The tag to which values should be added.
1051 * @see CStatTreeItemBase::AddECValues
1053 virtual void AddECValues(CECTag
*tag
) const;
1056 const CStatTreeItemCounter
*m_counter1
;
1059 const CStatTreeItemCounter
*m_counter2
;
1061 //! A function for each whose return value is the total (without current) value.
1062 uint64_t (*m_totalfunc1
)();
1063 uint64_t (*m_totalfunc2
)();
1066 //! Formatted String for display or EC
1067 wxString
GetString() const;
1072 * Special counter for reconnects.
1074 class CStatTreeItemReconnects
: public CStatTreeItemNativeCounter
{
1077 * @see CStatTreeItemBase::CStatTreeItemBase
1079 CStatTreeItemReconnects(const wxString
&label
)
1081 CStatTreeItemNativeCounter(label
, stNone
) {}
1083 #ifndef AMULE_DAEMON
1085 * @see CStatTreeItemBase::GetDisplayString()
1087 virtual wxString
GetDisplayString() const;
1092 * Add values to EC tag being generated.
1094 * @param tag The tag to which values should be added.
1096 * @see CStatTreeItemBase::AddECValues
1098 virtual void AddECValues(CECTag
*tag
) const;
1102 * Special item for Max Connection Limit Reached
1104 class CStatTreeItemMaxConnLimitReached
: public CStatTreeItemBase
1108 * @see CStatTreeItemBase::CStatTreeItemBase
1110 CStatTreeItemMaxConnLimitReached(const wxString
&label
)
1112 CStatTreeItemBase(label
),
1116 * Increase counter and save time.
1121 m_time
.SetToCurrent();
1124 #ifndef AMULE_DAEMON
1126 * Returns a string to be displayed on GUI.
1128 * For m_count == 0 it will display "Never",
1129 * for other values it will display the counter value and the
1130 * date & time of the event.
1132 virtual wxString
GetDisplayString() const;
1137 * Add values to EC tag being generated.
1139 * @param tag The tag to which values should be added.
1141 * @see CStatTreeItemBase::AddECValues
1143 virtual void AddECValues(CECTag
*tag
) const;
1145 //! Number of times max conn limit reached.
1148 //! Last time when max conn limit reached.
1153 * Special item for total client count
1155 class CStatTreeItemTotalClients
: public CStatTreeItemBase
1159 * @see CStatTreeItemBase::CStatTreeItemBase
1161 * @param known Counter that counts known clients.
1162 * @param unknown Counter that counts unknown clients.
1164 CStatTreeItemTotalClients(
1165 const wxString
&label
,
1166 const CStatTreeItemCounter
*known
,
1167 const CStatTreeItemCounter
*unknown
)
1169 CStatTreeItemBase(label
),
1171 m_unknown(unknown
) {}
1173 #ifndef AMULE_DAEMON
1175 * @see CStatTreeItemBase::GetDisplayString()
1177 virtual wxString
GetDisplayString() const;
1182 * Add values to EC tag being generated.
1184 * @param tag The tag to which values should be added.
1186 * @see CStatTreeItemBase::AddECValues
1188 virtual void AddECValues(CECTag
*tag
) const;
1190 //! Counter counting known clients.
1191 const CStatTreeItemCounter
*m_known
;
1193 //! Counter counting unknown clients.
1194 const CStatTreeItemCounter
*m_unknown
;
1197 #endif /* !CLIENT_GUI */
1199 #endif /* STATTREE_H */
1200 // File_checked_for_headers