source: trunk/src/halTorrentIntStates.hpp @ 748

Revision 748, 5.0 KB checked in by Eoin, 11 years ago (diff)

Restoring torrents to their proper states fixed.

Line 
1
2//         Copyright Eóin O'Callaghan 2009 - 2009.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#pragma once
8
9#include "halTorrentInternal.hpp"
10
11#include <boost/statechart/event.hpp>
12#include <boost/statechart/state_machine.hpp>
13#include <boost/statechart/simple_state.hpp>
14#include <boost/statechart/transition.hpp>
15#include <boost/statechart/state.hpp>
16#include <boost/statechart/custom_reaction.hpp>
17
18namespace hal
19{
20
21namespace sc = boost::statechart;
22
23struct not_started;
24
25struct out_of_session : sc::state<out_of_session, torrent_internal, mpl::list< not_started > > 
26{
27        typedef sc::state<out_of_session, torrent_internal, mpl::list< not_started > > base_type;
28
29        typedef mpl::list<
30                sc::custom_reaction< ev_add_to_session >,
31                sc::custom_reaction< ev_resume >
32        > reactions;
33
34        out_of_session(base_type::my_context ctx);
35        ~out_of_session();     
36
37        sc::result react(const ev_add_to_session& evt);
38        sc::result react(const ev_resume& evt);
39};
40
41struct active;
42struct pausing;
43struct paused;
44struct in_error;
45struct stopping;
46struct resume_data_waiting;
47struct resume_data_idling;
48
49struct in_the_session : sc::state<in_the_session, torrent_internal, mpl::list< resume_data_idling, paused > > 
50{
51        typedef sc::state<in_the_session, torrent_internal, mpl::list< resume_data_idling, paused > > base_type;
52
53        in_the_session(base_type::my_context ctx);
54        ~in_the_session();
55};
56
57struct resume_data_idling : sc::simple_state<resume_data_idling, in_the_session::orthogonal< 0 > >
58{
59        typedef mpl::list<
60                sc::transition< ev_write_resume_data, resume_data_waiting >
61        > reactions;
62
63        resume_data_idling();
64        ~resume_data_idling();
65};
66
67struct resume_data_waiting : sc::state<resume_data_waiting, in_the_session::orthogonal< 0 > >
68{
69        typedef sc::state<resume_data_waiting, in_the_session::orthogonal< 0 > > base_type;
70
71        typedef mpl::list<
72                sc::transition< ev_resume_data_alert, resume_data_idling >,
73                sc::transition< ev_resume_data_failed_alert, resume_data_idling >
74        > reactions;
75
76        resume_data_waiting(base_type::my_context ctx);
77        ~resume_data_waiting();
78};
79
80struct active : sc::state<active, in_the_session::orthogonal< 1 > >
81{
82        typedef sc::state<active, in_the_session::orthogonal< 1 > > base_type;
83
84        typedef mpl::list<
85                sc::transition< ev_stop, stopping >,
86                sc::transition< ev_pause, pausing >,
87                sc::custom_reaction< ev_force_recheck >,
88                sc::transition< ev_paused_alert, paused >,
89                sc::transition< ev_error_alert, in_error >
90        > reactions;
91
92        active(base_type::my_context ctx);
93        ~active();
94
95        sc::result react(const ev_pause& evt);
96        sc::result react(const ev_stop& evt);
97        sc::result react(const ev_force_recheck& evt);
98};
99
100struct pausing : sc::state<pausing, in_the_session::orthogonal< 1 > >
101{
102        typedef sc::state<pausing, in_the_session::orthogonal< 1 > > base_type;
103
104        typedef mpl::list<
105                sc::transition< ev_paused_alert, paused >,
106                sc::transition< ev_error_alert, in_error >
107        > reactions;
108
109        pausing(base_type::my_context ctx);
110        ~pausing();
111};
112
113struct paused : sc::state<paused, in_the_session::orthogonal< 1 > >
114{
115        typedef sc::state<paused, in_the_session::orthogonal< 1 > > base_type;
116
117        typedef mpl::list<
118                sc::custom_reaction< ev_stop >,
119                sc::custom_reaction< ev_resume >,
120                sc::custom_reaction< ev_force_recheck >,
121                sc::transition< ev_resumed_alert, active >,
122                sc::transition< ev_error_alert, in_error >
123        > reactions;
124
125        paused(base_type::my_context ctx);
126        ~paused();
127
128        sc::result react(const ev_stop& evt);
129        sc::result react(const ev_resume& evt);
130        sc::result react(const ev_force_recheck& evt);
131};
132
133struct in_error : sc::state<in_error, in_the_session::orthogonal< 1 > >
134{
135        typedef sc::state<in_error, in_the_session::orthogonal< 1 > > base_type;
136
137        typedef mpl::list<
138                sc::transition< ev_stop, stopped >,
139                sc::transition< ev_resumed_alert, active >
140        > reactions;
141
142        in_error(base_type::my_context ctx);
143        ~in_error();
144};
145
146struct stopping : sc::state<stopping, in_the_session::orthogonal< 1 > >
147{
148        typedef sc::state<stopping, in_the_session::orthogonal< 1 > > base_type;
149
150        typedef mpl::list<
151                sc::custom_reaction< ev_paused_alert >,
152                sc::transition< ev_resume_data_alert, stopped >,
153                sc::transition< ev_resume_data_failed_alert, stopped >,
154                sc::transition< ev_error_alert, in_error >
155        > reactions;
156
157        stopping(base_type::my_context ctx);
158        ~stopping();
159
160        sc::result react(const ev_paused_alert& evt);
161};
162
163struct not_started : sc::state<not_started, out_of_session>
164{
165        typedef sc::state<not_started, out_of_session> base_type;
166
167        typedef mpl::list<
168                sc::custom_reaction< ev_start >
169        > reactions;
170
171        not_started(base_type::my_context ctx);
172        ~not_started();
173
174        sc::result react(const ev_start& evt);
175
176private:
177        unsigned stored_state_;
178};
179
180struct stopped : sc::state<stopped, out_of_session>
181{
182        typedef sc::state<stopped, out_of_session> base_type;
183
184        stopped(base_type::my_context ctx);
185        ~stopped();
186};
187
188}; // namespace hal
Note: See TracBrowser for help on using the repository browser.