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