ConfirmSignal.h
00001 #ifndef _MSGCONFIRMSIGNAL_H
00002 #define _MSGCONFIRMSIGNAL_H
00003
00004 #include <UniSetTypes.h>
00005 #include <sigc++/sigc++.h>
00006 #include <USignals.h>
00007 #include <deque>
00008 #include <set>
00009 #include <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