Changeset 686 for trunk


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

More advanced state machine being implemented for torrent_internal.

Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/sln/Halite/Halite.vcproj

    r684 r686  
    12801280                        </File> 
    12811281                        <File 
     1282                                RelativePath="..\..\src\halTorrentIntEvents.hpp" 
     1283                                > 
     1284                        </File> 
     1285                        <File 
     1286                                RelativePath="..\..\src\halTorrentIntStates.hpp" 
     1287                                > 
     1288                        </File> 
     1289                        <File 
    12821290                                RelativePath="..\..\src\halTypes.hpp" 
    12831291                                > 
  • trunk/src/HaliteWindow.cpp

    r665 r686  
    573573LRESULT HaliteWindow::OnAutoShutdown(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 
    574574{ 
    575  
    576575         
    577576        return 0; 
  • trunk/src/WTLx/ListViewSortMixin.hpp

    r685 r686  
    7171                                iSecondarySort = p->iItem; 
    7272 
    73                                 if (DoSortItems(p->iItem, m_bSortDescending)) 
    74                                         NotifyParentSecondarySortChanged(p->iItem, iOld); 
     73                                T* pT = static_cast<T*>(this); 
     74                                bool bRet = pT->DoSortItemsExternal(iSecondarySort, bSecondaryDescending); 
    7575                        } 
    7676                        else 
  • trunk/src/advtabs/Files.cpp

    r685 r686  
    331331                        if (col_sort_index != -1) 
    332332                        {                
     333                                if (list_.GetSecondarySortColumn() != -1) 
     334                                { 
     335                                        int index = list_.GetColumnSortType(list_.GetSecondarySortColumn()); 
     336                                         
     337                                        if (index > WTL::LVCOLSORT_LAST) 
     338                                        { 
     339                                                hal::file_details_sort(*list_files, index - (WTL::LVCOLSORT_LAST+1+hal::file_details::filename_e),  
     340                                                        list_.IsSecondarySortDescending()); 
     341                                        } 
     342                                } 
     343 
    333344                                int index = list_.GetColumnSortType(col_sort_index); 
    334345                 
  • trunk/src/halSession.cpp

    r648 r686  
    518518                        get(a.handle)->write_resume_data(*a.resume_data); 
    519519                get(a.handle)->signals().resume_data(); 
     520 
     521                get(a.handle)->post_event(ev_resume_data_written()); 
    520522        } 
    521523         
  • trunk/src/halTorrentIntStates.cpp

    r683 r686  
    77#include "stdAfx.hpp" 
    88 
    9 #include "halTorrentInternal.hpp" 
     9#include "halTorrentIntStates.hpp" 
    1010 
    1111namespace hal 
    1212{ 
    1313 
     14// -------- in_the_session -------- 
     15 
    1416in_the_session::in_the_session(base_type::my_context ctx) : 
    1517        base_type::my_base(ctx) 
     
    2426        torrent_internal& t_i = context<torrent_internal>(); 
    2527 
    26         HAL_DEV_MSG(L"removing handle from session"); 
    27         t_i.the_session_->remove_torrent(t_i.handle_); 
    28         t_i.in_session_ = false; 
    29  
    30         assert(!t_i.in_session());       
     28        if (evt.write_data()) 
     29        { 
     30                HAL_DEV_MSG(L"requesting resume data"); 
     31                t_i.save_resume_data();  
     32 
     33                return transit< leaving_session >(); 
     34        } 
     35        else 
     36        { 
     37                HAL_DEV_MSG(L"removing handle from session"); 
     38                t_i.remove_torrent(); 
     39 
     40                assert(!t_i.in_session());       
     41                HAL_DEV_MSG(L"Removed from session!"); 
     42 
     43                return transit< out_of_session >(); 
     44        } 
     45} 
     46 
     47in_the_session::~in_the_session() 
     48{ 
     49        TORRENT_STATE_LOG(L"Exiting ~in_the_session()"); 
     50} 
     51 
     52// -------- leaving_session -------- 
     53 
     54leaving_session::leaving_session(base_type::my_context ctx) : 
     55        base_type::my_base(ctx) 
     56{ 
     57        TORRENT_STATE_LOG(L"Entering leaving_session()"); 
     58} 
     59 
     60leaving_session::~leaving_session() 
     61{ 
     62        TORRENT_STATE_LOG(L"Exiting ~leaving_session()"); 
     63} 
     64 
     65sc::result leaving_session::react(const ev_add_to_session& evt) 
     66{ 
     67        torrent_internal& t_i = context<torrent_internal>(); 
     68        assert(t_i.in_session()); 
     69 
     70        return transit< in_the_session >(); 
     71} 
     72 
     73sc::result leaving_session::react(const ev_resume_data_written& evt) 
     74{ 
     75        torrent_internal& t_i = context<torrent_internal>(); 
     76 
     77        HAL_DEV_MSG(L"Removing handle from session"); 
     78        t_i.remove_torrent(); 
    3179        HAL_DEV_MSG(L"Removed from session!"); 
    3280 
     
    3482} 
    3583 
    36 in_the_session::~in_the_session() 
    37 { 
    38         TORRENT_STATE_LOG(L"Exiting ~in_the_session()"); 
    39 } 
     84// -------- out_of_session -------- 
    4085 
    4186out_of_session::out_of_session(base_type::my_context ctx) : 
     
    81126        assert(t_i.handle_.is_valid()); 
    82127        t_i.in_session_ = true; 
    83          
    84 //      clear_resume_data(); 
    85 //      handle_.force_reannounce(); 
    86128 
    87129        return transit< in_the_session >(); 
    88130} 
    89131 
    90 paused::paused() 
     132active::active(base_type::my_context ctx) : 
     133        base_type::my_base(ctx) 
     134{ 
     135        TORRENT_STATE_LOG(L"Entering active()"); 
     136} 
     137 
     138active::~active() 
     139{ 
     140        TORRENT_STATE_LOG(L"Exiting ~active()"); 
     141} 
     142 
     143sc::result active::react(const ev_pause& evt) 
     144{ 
     145        context<torrent_internal>().handle_.pause(); 
     146 
     147        return transit< pausing >(); 
     148} 
     149 
     150pausing::pausing() 
     151{ 
     152        TORRENT_STATE_LOG(L"Entering pausing()"); 
     153} 
     154 
     155pausing::~pausing() 
     156{ 
     157        TORRENT_STATE_LOG(L"Exiting ~pausing()"); 
     158} 
     159 
     160paused::paused(base_type::my_context ctx) : 
     161        base_type::my_base(ctx) 
    91162{ 
    92163        TORRENT_STATE_LOG(L"Entering paused()"); 
     
    98169} 
    99170 
    100 active::active() 
    101 { 
    102         TORRENT_STATE_LOG(L"Entering active()"); 
    103 } 
    104  
    105 active::~active() 
    106 { 
    107         TORRENT_STATE_LOG(L"Exiting ~active()"); 
     171stopping::stopping() 
     172{ 
     173        TORRENT_STATE_LOG(L"Entering stopping()"); 
     174} 
     175 
     176stopping::~stopping() 
     177{ 
     178        TORRENT_STATE_LOG(L"Exiting ~stopping()"); 
     179} 
     180 
     181stopped::stopped() 
     182{ 
     183        TORRENT_STATE_LOG(L"Entering stopped()"); 
     184} 
     185 
     186stopped::~stopped() 
     187{ 
     188        TORRENT_STATE_LOG(L"Exiting ~stopped()"); 
     189} 
     190 
     191resume_data_waiting::resume_data_waiting() 
     192{ 
     193        TORRENT_STATE_LOG(L"Entering resume_data_waiting()"); 
     194} 
     195 
     196resume_data_waiting::~resume_data_waiting() 
     197{ 
     198        TORRENT_STATE_LOG(L"Exiting ~resume_data_waiting()"); 
     199} 
     200 
     201resume_data_idling::resume_data_idling() 
     202{ 
     203        TORRENT_STATE_LOG(L"Entering resume_data_idling()"); 
     204} 
     205 
     206resume_data_idling::~resume_data_idling() 
     207{ 
     208        TORRENT_STATE_LOG(L"Exiting ~resume_data_idling()"); 
    108209} 
    109210 
  • 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.