source: trunk/src/halTorrentIntStates.hpp @ 693

Revision 693, 4.7 KB checked in by kavika, 11 years ago (diff)

Support the libtorrent error state.

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 stopped;
24
25struct out_of_session : sc::state<out_of_session, torrent_internal, mpl::list< stopped > > 
26{
27        typedef sc::state<out_of_session, torrent_internal, mpl::list< stopped > > base_type;
28
29        typedef mpl::list<
30                sc::custom_reaction< ev_add_to_session >
31        > reactions;
32
33        out_of_session(base_type::my_context ctx);
34        ~out_of_session();     
35
36        sc::result react(const ev_add_to_session& evt);
37};
38
39struct active;
40struct pausing;
41struct paused;
42struct in_error;
43struct stopping;
44struct resume_data_waiting;
45struct resume_data_idling;
46
47struct in_the_session : sc::state<in_the_session, torrent_internal, mpl::list< resume_data_idling, paused > > 
48{
49        typedef sc::state<in_the_session, torrent_internal, mpl::list< resume_data_idling, paused > > base_type;
50
51        in_the_session(base_type::my_context ctx);
52        ~in_the_session();
53};
54
55struct resume_data_idling : sc::simple_state<resume_data_idling, in_the_session::orthogonal< 0 > >
56{
57        typedef mpl::list<
58                sc::transition< ev_write_resume_data, resume_data_waiting >
59        > reactions;
60
61        resume_data_idling();
62        ~resume_data_idling();
63};
64
65struct resume_data_waiting : sc::state<resume_data_waiting, in_the_session::orthogonal< 0 > >
66{
67        typedef sc::state<resume_data_waiting, in_the_session::orthogonal< 0 > > base_type;
68
69        typedef mpl::list<
70                sc::transition< ev_resume_data_alert, resume_data_idling >,
71                sc::transition< ev_resume_data_failed_alert, resume_data_idling >
72        > reactions;
73
74        resume_data_waiting(base_type::my_context ctx);
75        ~resume_data_waiting();
76};
77
78struct active : sc::state<active, in_the_session::orthogonal< 1 > >
79{
80        typedef sc::state<active, in_the_session::orthogonal< 1 > > base_type;
81
82        typedef mpl::list<
83                sc::transition< ev_stop, stopping >,
84                sc::transition< ev_pause, pausing >,
85                sc::custom_reaction< ev_force_recheck >,
86                sc::transition< ev_paused_alert, paused >,
87                sc::transition< ev_error_alert, in_error >
88        > reactions;
89
90        active(base_type::my_context ctx);
91        ~active();
92
93        sc::result react(const ev_pause& evt);
94        sc::result react(const ev_stop& evt);
95        sc::result react(const ev_force_recheck& evt);
96};
97
98struct pausing : sc::state<pausing, in_the_session::orthogonal< 1 > >
99{
100        typedef sc::state<pausing, in_the_session::orthogonal< 1 > > base_type;
101
102        typedef mpl::list<
103                sc::transition< ev_paused_alert, paused >,
104                sc::transition< ev_error_alert, in_error >
105        > reactions;
106
107        pausing(base_type::my_context ctx);
108        ~pausing();
109};
110
111struct paused : sc::state<paused, in_the_session::orthogonal< 1 > >
112{
113        typedef sc::state<paused, in_the_session::orthogonal< 1 > > base_type;
114
115        typedef mpl::list<
116                sc::custom_reaction< ev_stop >,
117                sc::custom_reaction< ev_resume >,
118                sc::custom_reaction< ev_force_recheck >,
119                sc::transition< ev_resumed_alert, active >,
120                sc::transition< ev_error_alert, in_error >
121        > reactions;
122
123        paused(base_type::my_context ctx);
124        ~paused();
125
126        sc::result react(const ev_stop& evt);
127        sc::result react(const ev_resume& evt);
128        sc::result react(const ev_force_recheck& evt);
129};
130
131struct in_error : sc::state<in_error, in_the_session::orthogonal< 1 > >
132{
133        typedef sc::state<in_error, in_the_session::orthogonal< 1 > > base_type;
134
135        typedef mpl::list<
136                sc::transition< ev_stop, stopped >,
137                sc::transition< ev_resumed_alert, active >
138        > reactions;
139
140        in_error(base_type::my_context ctx);
141        ~in_error();
142};
143
144struct stopping : sc::state<stopping, in_the_session::orthogonal< 1 > >
145{
146        typedef sc::state<stopping, in_the_session::orthogonal< 1 > > base_type;
147
148        typedef mpl::list<
149                sc::custom_reaction< ev_paused_alert >,
150                sc::transition< ev_resume_data_alert, stopped >,
151                sc::transition< ev_resume_data_failed_alert, stopped >,
152                sc::transition< ev_error_alert, in_error >
153        > reactions;
154
155        stopping(base_type::my_context ctx);
156        ~stopping();
157
158        sc::result react(const ev_paused_alert& evt);
159};
160
161struct stopped : sc::state<stopped, out_of_session>
162{
163        typedef sc::state<stopped, out_of_session> base_type;
164
165        typedef mpl::list<
166                sc::custom_reaction< ev_resume >
167        > reactions;
168
169        stopped(base_type::my_context ctx);
170        ~stopped();
171
172        sc::result react(const ev_resume& evt);
173};
174
175}; // namespace hal
Note: See TracBrowser for help on using the repository browser.