|
UniWidgets
1.0.0
|
00001 #ifndef _MSGCONFIRMSIGNAL_H 00002 #define _MSGCONFIRMSIGNAL_H 00003 // ------------------------------------------------------------------------- 00004 #include <UniSetTypes.h> 00005 #include <sigc++/sigc++.h> 00006 #include <uniwidgets/USignals.h> 00007 #include <deque> 00008 #include <set> 00009 #include <uniwidgets/USignals.h> 00010 #include <time.h> 00011 // ------------------------------------------------------------------------- 00012 class MsgConfirmConnection; 00013 class GuiPM; 00014 // ------------------------------------------------------------------------- 00015 typedef sigc::slot< void, UMessages::MessageId, time_t> MsgConfirmSlot; 00016 typedef sigc::signal< void, UMessages::MessageId, time_t> MsgConfirmSignal; 00020 enum MessageStatus { 00021 WAITS_CONFIRM 00022 ,CONFIRMED 00023 ,DROPPED 00024 }; 00025 // ------------------------------------------------------------------------- 00029 struct MsgConfirmEntry 00030 { 00031 MsgConfirmEntry( UMessages::MessageId id, MsgConfirmSignal* signal ): 00032 _id( id ), _signal( signal ) {} 00033 UMessages::MessageId _id; 00034 MsgConfirmSignal* _signal; 00035 }; 00036 // ------------------------------------------------------------------------- 00037 typedef std::deque<MsgConfirmEntry> MsgConfirmContainer; 00038 typedef std::set<UMessages::MessageId> MsgConfirmedContainer; 00039 // ------------------------------------------------------------------------- 00044 class WaitsQueue_ConstIterator : public MsgConfirmContainer::const_iterator 00045 { 00046 public: 00047 typedef MsgConfirmContainer::const_iterator BaseIt; 00048 typedef MsgConfirmContainer::iterator NonConstBaseIt; 00049 WaitsQueue_ConstIterator( const BaseIt& iter ) : BaseIt(iter) {} 00050 WaitsQueue_ConstIterator( const NonConstBaseIt& iter ) : BaseIt(iter) {} 00051 const UMessages::MessageId& operator*() const 00052 { 00053 return BaseIt::operator->()->_id; 00054 } 00055 const UMessages::MessageId* operator->() const 00056 { 00057 return &operator*(); 00058 } 00059 }; 00060 // ------------------------------------------------------------------------- 00076 class ConfirmSignal 00077 { 00078 friend class MsgConfirmConnection; 00079 public: 00080 typedef WaitsQueue_ConstIterator const_iterator; 00081 ConfirmSignal( GuiPM* gpm ); 00082 ~ConfirmSignal(); 00088 MsgConfirmConnection connect( const MsgConfirmSlot&, UMessages::MessageId id); 00089 sigc::connection connect_msg_wait_confirm( sigc::slot<void, UMessages::MessageId>& slot ); 00094 MessageStatus get_message_status(UMessages::MessageId id); 00095 00097 const_iterator begin() 00098 { 00099 return mcc.begin(); 00100 } 00102 const_iterator end() 00103 { 00104 return mcc.end(); 00105 } 00107 void emit(time_t sec); 00108 00110 void set_autoconfirm_time(int new_time) 00111 { _auto_confirm_time = new_time; } 00112 00113 private: 00114 void confirm(time_t); 00115 void on_disconnect(); 00116 void drop_message(UMessages::MessageId id, USignals::VConn* conn); 00117 00118 MsgConfirmContainer mcc; 00119 MsgConfirmedContainer mcedc; 00120 sigc::signal<void, UMessages::MessageId> signal_msg_wait_confirm; 00121 GuiPM* _gpm; 00122 00123 int _auto_confirm_time; 00124 bool auto_confirm(); 00125 }; 00126 // ------------------------------------------------------------------------- 00130 class MsgConfirmConnection 00131 { 00132 public: 00133 MsgConfirmConnection(ConfirmSignal* sig, sigc::connection& conn, UMessages::MessageId id) 00134 :_id (id), _signal(sig), _connection(conn) {} 00135 MsgConfirmConnection():_signal(NULL) {} 00136 ~MsgConfirmConnection() {} 00137 void disconnect(); 00138 00139 private: 00140 UMessages::MessageId _id; 00141 ConfirmSignal* _signal; 00142 sigc::connection _connection; 00143 00144 public: 00145 00146 }; 00147 #endif
1.7.6.1