Ignore:
Timestamp:
01/17/09 10:50:51 (11 years ago)
Author:
Eoin
Message:

More advanced state machine being implemented for torrent_internal.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/halTorrentInternal.hpp

    r683 r686  
    5555#include "halTypes.hpp" 
    5656#include "halSignaler.hpp" 
     57#include "halTorrentIntEvents.hpp" 
    5758 
    5859namespace hal  
     
    289290 
    290291struct out_of_session; 
    291 struct in_the_session; 
    292  
    293 struct ev_remove_from_session : boost::statechart::event<ev_remove_from_session> 
    294 { 
    295 public: 
    296     ev_remove_from_session(bool write_data) : 
    297                 write_data_(write_data) 
    298     {} 
    299     
    300     const bool& write_data() const { return write_data_; } 
    301  
    302 private: 
    303     bool write_data_; 
    304 }; 
    305  
    306 struct ev_add_to_session : boost::statechart::event<ev_add_to_session> 
    307 { 
    308 public: 
    309     ev_add_to_session(bool pause) : 
    310                 pause_(pause) 
    311     {} 
    312     
    313     const bool& pause() const { return pause_; } 
    314  
    315 private: 
    316     bool pause_; 
    317 }; 
    318  
    319 //struct ev_remove_from_session : sc::event< ev_remove_from_session > {}; 
    320  
    321 struct ev_pause : sc::event< ev_pause > {}; 
    322 struct ev_stop : sc::event< ev_stop > {}; 
    323  
    324292 
    325293class torrent_internal : 
     
    329297        friend class bit_impl;   
    330298        friend class bit::torrent::exec_around_ptr::proxy; 
     299 
    331300        friend struct out_of_session;    
    332301        friend struct in_the_session; 
    333  
    334 private: 
    335 //      struct torrent_state_machine : sc::state_machine<torrent_state_machine, out_of_session> {}; 
     302         
     303        friend struct active; 
     304        friend struct pausing; 
     305        friend struct paused; 
     306        friend struct stopping; 
     307        friend struct stopped; 
     308        friend struct resume_data_idling; 
    336309 
    337310public: 
     
    643616                } 
    644617                 
    645                 if (write_data) 
    646                 { 
    647                         HAL_DEV_MSG(L"requesting resume data");                  
    648                  
    649                         signaler_wrapper<>* sig = new signaler_wrapper<>(bind(&torrent_internal::remove_from_session, this, false)); 
    650                         signals().resume_data.connect(bind(&signaler_wrapper<>::operator(), sig)); 
    651                          
    652                         save_resume_data(); 
    653  
    654                         return false; 
    655                 } 
    656                 else 
    657                 {                                
    658                         process_event( ev_remove_from_session(write_data) ); 
    659  
    660                         return true; 
    661                 } 
     618                process_event( ev_remove_from_session(write_data) ); 
     619 
     620                return true; 
    662621 
    663622                } 
     
    668627                        return false; 
    669628                } 
     629        } 
     630 
     631        void remove_torrent() 
     632        { 
     633                the_session_->remove_torrent(handle_); 
     634                in_session_ = false; 
     635 
     636                assert(!in_session());   
    670637        } 
    671638         
     
    16221589}; 
    16231590 
    1624 struct out_of_session : sc::state<out_of_session, torrent_internal>  
    1625 { 
    1626         typedef sc::state<out_of_session, torrent_internal> base_type; 
    1627  
    1628         typedef mpl::list< 
    1629                 sc::custom_reaction< ev_add_to_session > 
    1630         > reactions; 
    1631  
    1632         out_of_session(base_type::my_context ctx); 
    1633         ~out_of_session();       
    1634  
    1635         sc::result react(const ev_add_to_session& evt); 
    1636 }; 
    1637  
    1638 struct paused; 
    1639 struct active; 
    1640  
    1641 struct in_the_session : sc::state<in_the_session, torrent_internal, mpl::list< paused > >  
    1642 { 
    1643         typedef sc::state<in_the_session, torrent_internal, mpl::list< paused > > base_type; 
    1644  
    1645         typedef mpl::list< 
    1646                 sc::custom_reaction< ev_remove_from_session > 
    1647         > reactions; 
    1648  
    1649         in_the_session(base_type::my_context ctx); 
    1650         ~in_the_session(); 
    1651  
    1652         sc::result react(const ev_remove_from_session& evt); 
    1653 }; 
    1654  
    1655 struct paused : sc::simple_state<paused, in_the_session> 
    1656 { 
    1657         paused(); 
    1658         ~paused(); 
    1659 }; 
    1660  
    1661 struct active : sc::simple_state<active, in_the_session> 
    1662 { 
    1663         typedef sc::transition< ev_pause, paused > reactions; 
    1664  
    1665         active(); 
    1666         ~active(); 
    1667 }; 
    1668  
    16691591} // namespace hal 
    16701592 
     1593#include "halTorrentIntStates.hpp" 
     1594 
    16711595BOOST_CLASS_VERSION(hal::torrent_manager::torrent_holder, 1) 
Note: See TracChangeset for help on using the changeset viewer.