diff -r 1a2a00e78665 -r d0529222e3f0 idlefw/plugins/shortcutplugin/src/GenPopupFSM.py --- a/idlefw/plugins/shortcutplugin/src/GenPopupFSM.py Tue Feb 02 00:23:10 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,350 +0,0 @@ -# -# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -# All rights reserved. -# This component and the accompanying materials are made available -# under the terms of "Eclipse Public License v1.0" -# which accompanies this distribution, and is available -# at the URL "http://www.eclipse.org/legal/epl-v10.html". -# -# Initial Contributors: -# Nokia Corporation - initial contribution. -# -# Contributors: -# -# Description: -# - -''' -Finite State Machine generator for Symbian OS projects. - -Just define fsmName, actionsIfaceName and stt and the script generates the -needed files for you. - -The files are: -- State Machine header file (including state classes, overwrites the existing file) -- State Machine source file (including state classes, overwrites the existing file) -- Actions interface header (abstract M-class, overwrites the existing file) -- Header file for tracing (will be generated only if missing) - - -Version 1: 22-Jun-2006, Jaakko Vuori, Initial version -Version 2: 26-Jun-2006, Jaakko Vuori, Added argument passing -Version 3: 27-Jun-2006, Jaakko Vuori, Changed state classes nested in FSM class - -''' -from sets import Set -import os, re, string - -#------------------------------------------------------------------------ -#State machine name -fsmName = "Popup" - -#Actions interface name -actionsIfaceName = "PopupFSMActions" - -#State transition table -stt=[ #source state #event #dest state #actions - ("NotSetOffFocus", [ - ("HandleUpdate()", "SetOffFocus", ["IssueCleanCaption()"]), - ("HandleGotFocus()", "NotSetOnFocus", []), - ("HandleForeground()", "NotSetOffFocus", ["IssuePublishCaption()"]), - ]), - - ("SetOffFocus", [ - ("HandleGotFocus()", "GettingFocus", ["StartShortTimer()"]), - ("HandleReset()", "NotSetOffFocus", ["IssuePublishCaption()"]), - ]), - - ("GettingFocus", [ - ("HandleRequestCompleted()", "Visible", ["IssuePublishPopup()", "StartLongTimer()"]), - ("HandleReset()", "NotSetOnFocus", ["IssuePublishCaption()", "CancelRequest()"]), - ("HandleLostFocus()", "SetOffFocus", ["CancelRequest()"]), - ]), - - ("LosingFocus", [ - ("HandleRequestCompleted()", "SetOffFocus", ["IssueCleanPopup()"]), - ("HandleReset()", "NotSetOffFocus", ["IssuePublishCaption()", "CancelRequest()"]), - ("HandleGotFocus()", "Visible", ["CancelRequest()", "StartLongTimer()"]), - ]), - - ("NotSetOnFocus", [ - ("HandleUpdate()", "Visible", ["IssueCleanCaption()", "IssuePublishPopup()", "StartLongTimer()"]), - ("HandleLostFocus()", "NotSetOffFocus", []), - ("HandleBackground()", "BackgroundNotSetOnFocus", []), - ("HandleForeground()", "NotSetOnFocus", ["IssuePublishCaption()"]), - ]), - - ("Visible", [ - ("HandleUpdate()", "Visible", ["IssueCleanCaption()", "IssuePublishPopup()", "StartLongTimer()"]), - ("HandleReset()", "NotSetOnFocus", ["IssuePublishCaption()", "IssueCleanPopup()", "CancelRequest()"]), - ("HandleLostFocus()", "LosingFocus", ["CancelRequest()", "CompleteSelf()"]), - ("HandleRequestCompleted()", "NotVisible", ["IssueCleanPopup()"]), - ("HandleBackground()", "BackgroundSetOnFocus", ["CancelRequest()", "IssueCleanPopup()"]), - ]), - - ("NotVisible", [ - ("HandleUpdate()", "Visible", ["IssueCleanCaption()", "IssuePublishPopup()", "StartLongTimer()"]), - ("HandleReset()", "NotSetOnFocus", ["IssuePublishCaption()"]), - ("HandleLostFocus()", "SetOffFocus", []), - ]), - - ("BackgroundNotSetOnFocus", [ - ("HandleForeground()", "NotSetOnFocus", ["IssuePublishCaption()"]), - ("HandleUpdate()", "BackgroundSetOnFocus", ["IssueCleanCaption()"]), - ]), - - ("BackgroundSetOnFocus", [ - ("HandleReset()", "BackgroundNotSetOnFocus", ["IssuePublishCaption()"]), - ("HandleForeground()", "Visible", ["IssuePublishPopup()", "StartLongTimer()"]), - ]), - - ] -#------------------------------------------------------------------------ - -def write( s ): - f.write( s + '\n' ) - -def writeHeader(): - global f - fname = '%sFSM.h' % (fsmName) - print "Generating %s..." % (fname) - f = open( fname, 'w' ) - - write( "#ifndef %sFSM_H" % ( fsmName.upper() ) ) - write( "#define %sFSM_H" % ( fsmName.upper() ) ) - write( "" ) - write( "// EXTERNAL INCLUDES" ) - write( "#include " ) - write( "" ) - write( "// FORWARD DECLARATIONS" ) - write( "class T%sFSM;" % (fsmName) ) - write( "class M%s;" % (actionsIfaceName) ) - write( "" ) - write( "// CLASS DEFINITIONS" ) - - write( "/**" ) - write( " * %s state machine" % (fsmName) ) - write( " */" ) - write( "class T%sFSM" % (fsmName) ) - write( " {" ) - - write( " /**" ) - write( " * Base class for states" ) - write( " */" ) - write( " class T%sStateBase" % (fsmName) ) - write( " {" ) - write( " public: // New methods" ) - - events=[] - for s in stt: - for e in s[1]: - events.append( e[0] ) - for event in Set(events): - fname, args = re.match('(.*?)[(](.*?)[)]',event).groups() - if len(args)>0: - write( " virtual void %s( T%sFSM* a%sFSM, M%s& a%s,%s);" % (fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName,args) ) - else: - write( " virtual void %s( T%sFSM* a%sFSM, M%s& a%s );" % (fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName) ) - - - write( " };" ) - write( "" ) - - for s in stt: - write( " /**" ) - write( " * State class T%s" % (s[0]) ) - write( " */" ) - write( " class T%s : public T%sStateBase" % (s[0],fsmName) ) - write( " {" ) - write( " protected: // Methods derived from T%sState" % (fsmName)) - for event in s[1]: - fname, args = re.match('(.*?)[(](.*?)[)]',event[0]).groups() - if len(args)>0: - write( " void %s( T%sFSM* a%sFSM, M%s& a%s,%s);" % (fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName,args) ) - else: - write( " void %s( T%sFSM* a%sFSM, M%s& a%s );" % (fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName) ) - - write( " };" ) - write( "" ) - - write( "" ) - write( " public: // Constructors" ) - write( " T%sFSM( M%s& a%s );" % (fsmName,actionsIfaceName,actionsIfaceName)) - write( "" ) - write( " public: // New methods" ) - for event in Set(events): - write( " void %s;" % (event)) - write( "" ) - write( " private: // New methods" ) - write( " void SetState( T%sStateBase* aNewState );" % (fsmName) ) - write( "" ) - write( " private: // Data" ) - write( " //Ref:" ) - write( " T%sStateBase* iCurrentState;" % (fsmName)) - write( " M%s& i%s;" % (actionsIfaceName,actionsIfaceName)) - write( "" ) - write( " //Own:" ) - for s in stt: - write( " T%s i%s;" % (s[0],s[0])) - - write( " private: // Friend class definitions" ) - for s in stt: - write( " friend class T%s;" % (s[0])) - - write( " };" ) - write( "" ) - write( "#endif // %sFSM_H" % (fsmName.upper()) ) - write( "" ) - write( "// End of file" ) - f.close() - - -def writeSource(): - global f - fname = '%sFSM.cpp' % (fsmName) - print "Generating %s..." % (fname) - f = open( fname, 'w' ) - - write( '#include "%sFSM.h"' % (fsmName) ) - write( '#include "M%s.h"' % (actionsIfaceName) ) - write( '#include "%sTrace.h"' % (fsmName) ) - write( '' ) - write( '#pragma warning( disable:4100 )' ) - write( '#pragma warning( disable:4068 )' ) - write( '#pragma warn_unusedarg off' ) - - write( '' ) - write( 'T%sFSM::T%sFSM( M%s& a%s ) : ' % (fsmName,fsmName,actionsIfaceName,actionsIfaceName) ) - write( ' iCurrentState( &i%s ),' % (stt[0][0]) ) - write( ' i%s( a%s )' % (actionsIfaceName,actionsIfaceName) ) - write( ' {' ) - write( ' }' ) - write( '' ) - - events=[] - for s in stt: - for e in s[1]: - events.append( e[0] ) - - for event in Set(events): - fname, args = re.match('(.*?)[(](.*?)[)]',event).groups() - if len(args)>0: - write( 'void T%sFSM::T%sStateBase::%s( T%sFSM* /*a%sFSM*/, M%s& /*a%s*/,%s )' % (fsmName,fsmName,fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName,args)) - else: - write( 'void T%sFSM::T%sStateBase::%s( T%sFSM* /*a%sFSM*/, M%s& /*a%s*/ )' % (fsmName,fsmName,fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName)) - write( ' {' ) - write( ' TRACE( _L("T%sStateBase::%s") );' % (fsmName,event)) - write( ' }' ) - write( '' ) - - for event in Set(events): - fname, args = re.match('(.*?)[(](.*?)[)]',event).groups() - write( 'void T%sFSM::%s(%s)' % (fsmName,fname,args) ) - write( ' {' ) - arglist=args.split(',') - argnames = string.join([arg.split()[-1:][0] for arg in arglist if arg!=""], ', ') - if len(argnames)>0: - write( ' iCurrentState->%s( this, i%s, %s );' % (fname,actionsIfaceName,argnames) ) - else: - write( ' iCurrentState->%s( this, i%s );' % (fname,actionsIfaceName) ) - write( ' }' ) - write( '' ) - - write( 'void T%sFSM::SetState( T%sStateBase* aNewState )' % (fsmName,fsmName) ) - write( ' {' ) - write( ' iCurrentState = aNewState;' ) - write( ' }' ) - write( '' ) - - for s in stt: - stateName, events = s - for event in events: - eventName = event[0] - destState = event[1] - actions = event[2] - fname, args = re.match('(.*?)[(](.*?)[)]',eventName).groups() - if len(actions)>0: - if len(args)>0: - write( 'void T%sFSM::T%s::%s( T%sFSM* a%sFSM, M%s& a%s,%s )' % (fsmName,stateName,fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName,args) ) - else: - write( 'void T%sFSM::T%s::%s( T%sFSM* a%sFSM, M%s& a%s )' % (fsmName,stateName,fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName) ) - else: - if len(args)>0: - write( 'void T%sFSM::T%s::%s( T%sFSM* a%sFSM, M%s& /*a%s*/,%s )' % (fsmName,stateName,fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName,args) ) - else: - write( 'void T%sFSM::T%s::%s( T%sFSM* a%sFSM, M%s& /*a%s*/ )' % (fsmName,stateName,fname,fsmName,fsmName,actionsIfaceName,actionsIfaceName) ) - - write( ' {' ) - write( ' TRACE( _L("T%s::%s") );' % (stateName, eventName) ) - write( ' a%sFSM->SetState( &a%sFSM->i%s );' % (fsmName,fsmName,destState) ) - for action in actions: - fname, args = re.match('(.*?)[(](.*?)[)]',action).groups() - if len(args)>0: - arglist=args.split(',') - argnames = string.join([arg.split()[-1:][0] for arg in arglist if arg!=""], ', ') - write( ' a%s.%s( %s );' % (actionsIfaceName,fname,argnames) ) - else: - write( ' a%s.%s();' % (actionsIfaceName,fname) ) - write( ' }' ) - write( '' ) - - write( '// End of file' ) - - -def writeTraceHeader(): - if not os.path.isfile( '%sTrace.h' % (fsmName) ): - global f - fname = '%sTrace.h' % (fsmName) - print "Generating %s..." % (fname) - f = open( fname, 'w' ) - write( '#ifndef %sTRACE_H' % (fsmName.upper()) ) - write( '#define %sTRACE_H' % (fsmName.upper()) ) - write( '' ) - write( '// MACROS' ) - write( '#define TRACE' ) - write( '' ) - write( '#endif // %sTRACE_H' % (fsmName.upper()) ) - write( '' ) - write( '// End of file' ) - f.close() - - -def writeActionsIface(): - global f - fname = 'M%s.h' % (actionsIfaceName) - print "Generating %s..." % (fname) - f = open( fname, 'w' ) - - write( '#ifndef M%s_H' % (actionsIfaceName.upper()) ) - write( '#define M%s_H' % (actionsIfaceName.upper()) ) - write( '' ) - write( '// EXTERNAL INCLUDES' ) - write( '#include ' ) - write( '' ) - write( '// CLASS DEFINITION' ) - write( '/**' ) - write( ' * M%s actions.' % (actionsIfaceName) ) - write( ' * Note: This file has been generated automatically. Do not edit!' ) - write( ' */' ) - write( 'class M%s' % (actionsIfaceName) ) - write( ' {' ) - write( ' public: // Abstract methods' ) - - actions=[] - for s in stt: - for e in s[1]: - actions.extend( e[2] ) - for action in Set(actions): - write( ' virtual void %s = 0;' % (action)) - write( ' };' ) - write( '' ) - write( '#endif // M%s_H' % (actionsIfaceName.upper()) ) - write( '' ) - write( '// End of file' ) - f.close() - -if __name__ == "__main__": - writeHeader() - writeSource() - writeTraceHeader() - writeActionsIface()