12f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong/*
22f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * Copyright (C) 2010 The Android Open Source Project
32f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong *
42f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * Licensed under the Apache License, Version 2.0 (the "License");
52f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * you may not use this file except in compliance with the License.
62f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * You may obtain a copy of the License at
72f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong *
82f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong *      http://www.apache.org/licenses/LICENSE-2.0
92f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong *
102f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * Unless required by applicable law or agreed to in writing, software
112f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * distributed under the License is distributed on an "AS IS" BASIS,
122f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * See the License for the specific language governing permissions and
142f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong * limitations under the License.
152f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong */
162f1f2248c8439adbd686810e306c55f9e6a5abc3James Dong
17a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#ifndef A_HIERARCHICAL_STATE_MACHINE_H_
18a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
19a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#define A_HIERARCHICAL_STATE_MACHINE_H_
20a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
21a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#include <media/stagefright/foundation/AHandler.h>
22a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
23a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Hubernamespace android {
24a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
25a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstruct AState : public RefBase {
26a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    AState(const sp<AState> &parentState = NULL);
27a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
28a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    sp<AState> parentState();
29a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
30a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprotected:
31a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual ~AState();
32a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
33a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual void stateEntered();
34a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual void stateExited();
35a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
36a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual bool onMessageReceived(const sp<AMessage> &msg) = 0;
37a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
38a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprivate:
39a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    friend struct AHierarchicalStateMachine;
40a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
41a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    sp<AState> mParentState;
42a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
43a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(AState);
44a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber};
45a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
46a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberstruct AHierarchicalStateMachine : public AHandler {
47a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    AHierarchicalStateMachine();
48a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
49a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprotected:
50a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual ~AHierarchicalStateMachine();
51a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
52a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
53a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
54a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    // Only to be called in response to a message.
55a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    void changeState(const sp<AState> &state);
56a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
57a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huberprivate:
58a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    sp<AState> mState;
59a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
60a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(AHierarchicalStateMachine);
61a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber};
62a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
63a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber}  // namespace android
64a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber
65a15874665fa785c82afa9f2e8cb3512470c297cbAndreas Huber#endif  // A_HIERARCHICAL_STATE_MACHINE_H_
66