Made to Order Software Corporation Logo

libsswf: sswf::ActionTry Class Reference

This action encompasses the Try, Catch and Finally actions. More...

#include <libsswf.h>

Inheritance diagram for sswf::ActionTry:

:Action :MemoryManager :ItemBase :MemBuffer

List of all members.


Public Member Functions

 ActionTry (TagBase *tag)
 Initialize the ActionTry action.
void AddCatchAction (Action *action)
 Add an action to the catch block.
void AddFinallyAction (Action *action)
 Add an action to the finally block.
void AddTryAction (Action *action)
 Add an action to the try block.
void SetIdentifier (const char *variable_name)
 Request the error to be saved in a named variable.
void SetIdentifier (int register_number)
 Request the error to be saved in a register.
VectorsSubListCatch (void)
 Retrieve the Vectors to the catch action block.
VectorsSubListFinally (void)
 Retrieve the Vectors to the finally action block.
VectorsSubListTry (void)
 Retrieve the Vectors to the try action block.

Private Member Functions

virtual ActionDuplicate (void) const
 Create a clone of this action.
virtual int GetMaxRegister (void) const
 Defines the maximum register number in use.
virtual ErrorManager::error_code_t ParseData (const Data &data)
 Parse the data buffer for a Try action.
virtual ErrorManager::error_code_t SaveData (Data &data, Data &nested_data)
 Save the ActionTry extraneous data.
virtual unsigned char Version (void) const
 The version required to save this action.

Private Attributes

Vectors f_actions_catch
Vectors f_actions_finally
Vectors f_actions_try
bool f_has_catch
bool f_has_finally
int f_register
char * f_variable_name

Detailed Description

This action creates two or three blocks of sub-actions. The first block (the 'try' block) is protected, meaning that if an error occurs within that block code, it will not break execution. Instead it will continue with the 'catch' block if present and terminate the 'finally' block if it exists.

It is necessary to at least have one of the 'catch' or 'finally' blocks. The 'try' block is mandatory.

See also:
SWF Alexis' Reference—Try

Constructor & Destructor Documentation

ActionTry::ActionTry ( TagBase tag  ) 

This constructor marks the Try action as not having any catch or finally blocks, no name and no register.

Use the AddTryAction() or SubListTry() to add actions to the try block.

Use the AddCatchAction() or SubListCatch() to add actions to the catch block.

Use the AddFinallyAction() or SubListFinally() to add actions to the finally block.

Use the SetIdentifier(int register_number) function with an integer to define a register number for the catch variable.

Use the SetIdentifier(const char *name) function with a string to define the name of a variable to use as the catch variable.

Parameters:
[in] tag The tag in which this action is inserted

References f_has_catch, f_has_finally, f_register, and f_variable_name.

Referenced by Duplicate().


Member Function Documentation

void ActionTry::AddCatchAction ( Action action  ) 

This function adds the specified action to the catch block. The catch block can be empty, in which case you must have a non-empty finally block.

The action passed is not duplicated.

This function has the side effect of marking the action as having a catch block, unless the pointer is null.

Parameters:
[in] action The pointer to the action to add to the catch block or NULL

References f_actions_catch, f_has_catch, and sswf::Vectors::Set().

Referenced by Duplicate().

void ActionTry::AddFinallyAction ( Action action  ) 

This function adds the specified action to the finally block. The finally block can be empty, in which case you must have a non-empty catch block.

The action passed is not duplicated.

This function has the side effect of marking the action as having a finally block, unless the pointer is null.

Parameters:
[in] action The pointer to the action to add to the finally block or NULL

References f_actions_finally, f_has_finally, and sswf::Vectors::Set().

Referenced by Duplicate().

void ActionTry::AddTryAction ( Action action  ) 

This function adds the specified action to the try block. There should be at least one action in the try block.

The action is not duplicated.

Parameters:
[in] action The pointer to the action to add to the try block or NULL

References f_actions_try, and sswf::Vectors::Set().

Referenced by Duplicate().

Action * ActionTry::Duplicate ( void   )  const [private, virtual]

This function creates a new ActionTry object, it copies the register number, variable name, has catch & finally flags and then copy the lists of actions (try, catch and finally blocks.)

Returns:
The pointer to the new action

Reimplemented from sswf::Action.

References ActionTry(), AddCatchAction(), AddFinallyAction(), AddTryAction(), sswf::Vectors::Count(), sswf::Action::Duplicate(), f_actions_catch, f_actions_finally, f_actions_try, f_has_catch, f_has_finally, f_register, f_variable_name, sswf::Vectors::Get(), SetIdentifier(), and sswf::Action::Tag().

int ActionTry::GetMaxRegister ( void   )  const [private, virtual]

This function overwrites the default sswf::Action::GetMaxRegister() function in order to retrieve the largest register in use in any of the sub-action blocks (try, catch, finally).

Returns:
The largest register in use within this ActionTry object

Reimplemented from sswf::Action.

References f_actions_catch, f_actions_finally, f_actions_try, and sswf::Action::GetMaximumRegister().

ErrorManager::error_code_t ActionTry::ParseData ( const Data data  )  [private, virtual]

This function parses a Try, Catch and Finalize group of actions.

Parameters:
[in] data The data buffer to parse for the Try, Catch, Finalize blocks
Returns:
An error code or ErrorManager::ERROR_CODE_NONE

Reimplemented from sswf::Action.

References sswf::ErrorManager::ERROR_CODE_NONE, f_actions_catch, f_actions_finally, f_actions_try, f_has_catch, f_has_finally, f_register, f_variable_name, sswf::Data::GetBits(), sswf::Data::GetByte(), sswf::Data::GetShort(), sswf::Data::GetString(), sswf::Action::ParseList(), and sswf::Action::Tag().

ErrorManager::error_code_t ActionTry::SaveData ( Data data,
Data nested_data 
) [private, virtual]

The SaveData() function saves the try, catch and finally blocks in the nested_data and the try header in the Data buffers.

Note that the maximum size for any one sub-block is 65535 bytes. A larger sub-block will generate an error and the save will fail.

This function should not be called until at least one of the catch or finally block has been created.

Parameters:
[in] data The Data buffer where the ActionTry header is saved
[in] nested_data This buffer is used to save the try, catch and finally blocks

Reimplemented from sswf::Action.

References sswf::Data::Append(), sswf::assert(), sswf::Data::ByteSize(), sswf::ErrorManager::ERROR_CODE_ACTION_OVERFLOW, sswf::ErrorManager::ERROR_CODE_INTERNAL_ERROR, sswf::ErrorManager::ERROR_CODE_NONE, f_actions_catch, f_actions_finally, f_actions_try, f_has_catch, f_has_finally, f_register, f_variable_name, sswf::Data::GetSize(), sswf::ErrorManager::KeepFirst(), sswf::Action::OnError(), sswf::Data::PutByte(), sswf::Data::PutShort(), sswf::Action::SaveList(), sswf::Action::SaveString(), sswf::Data::SetSize(), and sswf::Data::WriteBits().

void ActionTry::SetIdentifier ( const char *  name  ) 

This function defines the name to use as the catch variable. When a register number from 0 to 254 was defined with SetIdentifier(), this variable name is ignored.

Parameters:
[in] name The name of the variable to use within the catch block to access the error

References f_variable_name, sswf::MemoryManager::MemFree(), and sswf::MemoryManager::StrDup().

void ActionTry::SetIdentifier ( int  register_number  ) 

The catch block, when called, receives an error variable. This variable can be saved in a register. To archive this, set the register number that you want to use for this catch block.

This function has priority over the SetIdentifier(const char *name) function. This means the register number will be used instead of the register name if defined.

The register number can be any number between 0 and 254.

If the register number is set to -1, then it is ignored.

Parameters:
[in] register_number The register to use in the catch block to access the error

References f_register.

Referenced by Duplicate().

Vectors * ActionTry::SubListCatch ( void   ) 

This function can be used to retrieve a direct pointer to the Vectors holding the action block for the 'catch' block.

Warning:
This function has the side effect of setting the catch block flag to true, meaning that the catch block exists. You should always add at least one item in the Vectors to validate this properly.
Returns:
A pointer to the action list for the 'catch' block

References f_actions_catch, and f_has_catch.

Vectors * ActionTry::SubListFinally ( void   ) 

This function can be used to retrieve a direct pointer to the Vectors holding the action block for the 'finally' block.

Warning:
This function has the side effect of setting the finally block flag to true, meaning that the finally block exists. You should always add at least one item in the Vectors to validate this properly.
Returns:
A pointer to the action list for the 'finally' block

References f_actions_finally, and f_has_finally.

Vectors * ActionTry::SubListTry ( void   ) 

This function can be used to retrieve a direct pointer to the Vectors holding the action block for the 'try' block.

Returns:
A pointer to the action list for the 'try' block

References f_actions_try.

unsigned char ActionTry::Version ( void   )  const [private, virtual]

This function goes through all the sub-action lists to determine the minimum version necessary to save it.

The ActionTry itself requires version 7, but actions in the sub-lists may require a higher version.

Returns:
The minimum version required to have the request work

Reimplemented from sswf::Action.

References f_actions_catch, f_actions_finally, f_actions_try, and sswf::Action::MinimumListVersion().


Member Data Documentation


The documentation for this class was generated from the following files:


Generated on Wed Mar 18 15:13:57 2009 for libsswf by  doxygen 1.5.5