示例#1
0
 public void Initialise(MHParseNode arg, MHEngine engine)
 {
     if (arg.GetTagNo() == ASN1Codes.C_INDIRECTREFERENCE)
     {
         // Indirect reference.
         m_fIsDirect = false;
         m_Indirect.Initialise(arg.GetArgN(0), engine);
     }
     else if (arg.GetTagNo() == ASN1Codes.C_CONTENT_REFERENCE)
     { // Simple integer value.
         m_fIsDirect = true;
         m_Direct.Initialise(arg.GetArgN(0), engine);
     }
     else
     {
         throw new MHEGException("Expected direct or indirect content reference");
     }
 }
示例#2
0
        public override void Initialise(MHParseNode p, MHEngine engine)
        {
            base.Initialise(p, engine);
            MHParseNode pMultiplex = p.GetNamedArg(ASN1Codes.C_MULTIPLEX);

            for (int i = 0; i < pMultiplex.GetArgCount(); i++)
            {
                MHParseNode pItem = pMultiplex.GetArgN(i);
                if (pItem.GetTagNo() == ASN1Codes.C_AUDIO)
                {
                    MHAudio pAudio = new MHAudio();
                    m_Multiplex.Append(pAudio);
                    pAudio.Initialise(pItem, engine);
                }
                else if (pItem.GetTagNo() == ASN1Codes.C_VIDEO)
                {
                    MHVideo pVideo = new MHVideo();
                    m_Multiplex.Append(pVideo);
                    pVideo.Initialise(pItem, engine);
                }
                else if (pItem.GetTagNo() == ASN1Codes.C_RTGRAPHICS)
                {
                    MHRTGraphics pRtGraph = new MHRTGraphics();
                    m_Multiplex.Append(pRtGraph);
                    pRtGraph.Initialise(pItem, engine);
                }
                // Ignore unknown items
            }
            MHParseNode pStorage = p.GetNamedArg(ASN1Codes.C_STORAGE);

            if (pStorage != null)
            {
                m_nStorage = pStorage.GetArgN(0).GetEnumValue();
            }
            MHParseNode pLooping = p.GetNamedArg(ASN1Codes.C_LOOPING);

            if (pLooping != null)
            {
                m_nLooping = pLooping.GetArgN(0).GetIntValue();
            }
        }
示例#3
0
 public void Initialise(MHParseNode arg, MHEngine engine)
 {
     if (arg.NodeType == MHParseNode.PNTagged && arg.GetTagNo() == ASN1Codes.C_INDIRECTREFERENCE)
     {
         // Indirect reference.
         m_fIsDirect = false;
         m_Indirect.Initialise(arg.GetArgN(0), engine);
     }
     else
     { // Simple integer value.
         m_fIsDirect = true;
         m_ObjRef.Initialise(arg, engine);
     }
 }
示例#4
0
        public override void Initialise(MHParseNode p, MHEngine engine)
        {
            base.Initialise(p, engine); // Target
            MHParseNode pContent = p.GetArgN(1);

            if (pContent.NodeType == MHParseNode.PNSeq)
            {
                // Referenced content.
                m_fIsIncluded  = false;
                m_fSizePresent = m_fCCPriorityPresent = false;
                m_Referenced.Initialise(pContent.GetSeqN(0), engine);

                if (pContent.GetSeqCount() > 1)
                {
                    MHParseNode pArg = pContent.GetSeqN(1);
                    if (pArg.NodeType == MHParseNode.PNTagged && pArg.GetTagNo() == ASN1Codes.C_NEW_CONTENT_SIZE)
                    {
                        MHParseNode pVal = pArg.GetArgN(0);
                        // It may be NULL as a place-holder
                        if (pVal.NodeType == MHParseNode.PNInt)
                        {
                            m_fSizePresent = true;
                            m_ContentSize.Initialise(pVal, engine);
                        }
                    }
                }

                if (pContent.GetSeqCount() > 2)
                {
                    MHParseNode pArg = pContent.GetSeqN(2);
                    if (pArg.NodeType == MHParseNode.PNTagged && pArg.GetTagNo() == ASN1Codes.C_NEW_CONTENT_CACHE_PRIO)
                    {
                        MHParseNode pVal = pArg.GetArgN(0);
                        if (pVal.NodeType == MHParseNode.PNInt)
                        {
                            m_fCCPriorityPresent = true;
                            m_CCPriority.Initialise(pVal, engine);
                        }
                    }
                }
            }
            else
            {
                m_Included.Initialise(pContent, engine);
                m_fIsIncluded = true;
            }
        }
示例#5
0
        public void Initialise(MHParseNode p, MHEngine engine)
        {
            switch (p.GetTagNo())
            {
            case ASN1Codes.C_NEW_GENERIC_BOOLEAN: m_Type = P_Bool; m_BoolVal.Initialise(p.GetArgN(0), engine); break;

            case ASN1Codes.C_NEW_GENERIC_INTEGER: m_Type = P_Int; m_IntVal.Initialise(p.GetArgN(0), engine); break;

            case ASN1Codes.C_NEW_GENERIC_OCTETSTRING: m_Type = P_String; m_StrVal.Initialise(p.GetArgN(0), engine); break;

            case ASN1Codes.C_NEW_GENERIC_OBJECT_REF: m_Type = P_ObjRef; m_ObjRefVal.Initialise(p.GetArgN(0), engine); break;

            case ASN1Codes.C_NEW_GENERIC_CONTENT_REF: m_Type = P_ContentRef; m_ContentRefVal.Initialise(p.GetArgN(0), engine); break;

            default: p.Failure("Expected generic"); break;
            }
        }
示例#6
0
        protected MHGroup ParseProgram(byte[] text)
        {
            if (text.Length == 0)
            {
                return(null);
            }

            IMHParser   parser = null;
            MHParseNode pTree  = null;
            MHGroup     pRes   = null;

            // Look at the first byte to decide whether this is text or binary.  Binary
            // files will begin with 0xA0 or 0xA1, text files with white space, comment ('/')
            // or curly bracket.
            // This is only there for testing: all downloaded objects will be in ASN1
            byte ch = text[0];

            if (ch >= 128)
            {
                parser = new MHParseBinary(text);
            }
            else
            {
                parser = new MHParseText(text);
            }

            // Parse the binary or text.
            pTree = parser.Parse();

            switch (pTree.GetTagNo())
            { // The parse node should be a tagged item.
            case ASN1Codes.C_APPLICATION: pRes = new MHApplication(); break;

            case ASN1Codes.C_SCENE: pRes = new MHScene(); break;

            default: pTree.Failure("Expected Application or Scene"); break; // throws exception.
            }
            pRes.Initialise(pTree, this);                                   // Convert the parse tree.

            return(pRes);
        }
示例#7
0
        // Set this up from the parse tree.
        public override void Initialise(MHParseNode p, MHEngine engine)
        {
            // Set to empty before we start (just in case).
            engine.GetGroupId().Copy("");

            base.Initialise(p, engine);

            // Must be an external reference with an object number of zero.
            Logging.Assert(m_ObjectIdentifier.ObjectNo == 0 && m_ObjectIdentifier.GroupId.Size != 0);

            // Set the group id for the rest of the group to this.
            engine.GetGroupId().Copy(m_ObjectIdentifier.GroupId);

            // Some of the information is irrelevant.
            //  MHParseNode pStdId = p.GetNamedArg(C_STANDARD_IDENTIFIER);
            //  MHParseNode pStdVersion = p.GetNamedArg(C_STANDARD_VERSION);
            //  MHParseNode pObjectInfo = p.GetNamedArg(C_OBJECT_INFORMATION);

            MHParseNode pOnStartUp = p.GetNamedArg(ASN1Codes.C_ON_START_UP);

            if (pOnStartUp != null)
            {
                m_StartUp.Initialise(pOnStartUp, engine);
            }
            MHParseNode pOnCloseDown = p.GetNamedArg(ASN1Codes.C_ON_CLOSE_DOWN);

            if (pOnCloseDown != null)
            {
                m_CloseDown.Initialise(pOnCloseDown, engine);
            }
            MHParseNode pOriginalGCPrio = p.GetNamedArg(ASN1Codes.C_ORIGINAL_GC_PRIORITY);

            if (pOriginalGCPrio != null)
            {
                m_nOrigGroupCachePriority = pOriginalGCPrio.GetArgN(0).GetIntValue();
            }

            // Ignore the other stuff at the moment.
            MHParseNode pItems = p.GetNamedArg(ASN1Codes.C_ITEMS);

            if (pItems == null)
            {
                p.Failure("Missing :Items block");
            }
            for (int i = 0; i < pItems.GetArgCount(); i++)
            {
                MHParseNode  pItem       = pItems.GetArgN(i);
                MHIngredient pIngredient = null;

                // Generate the particular kind of ingredient.
                switch (pItem.GetTagNo())
                {
                case ASN1Codes.C_RESIDENT_PROGRAM: pIngredient = new MHResidentProgram(); break;

//  NOT UK                  case ASN1Codes.C_REMOTE_PROGRAM: pIngredient = new MHRemoteProgram(); break;
//  NOT UK                  case ASN1Codes.C_INTERCHANGED_PROGRAM: pIngredient = new MHInterChgProgram(); break;
//  NOT UK                  case ASN1Codes.C_PALETTE: pIngredient = new MHPalette(); break;
//  NOT UK                  case ASN1Codes.C_FONT: pIngredient = new MHFont(); break;
//  NOT UK                  case ASN1Codes.C_CURSOR_SHAPE: pIngredient = new MHCursorShape(); break;
                case ASN1Codes.C_BOOLEAN_VARIABLE: pIngredient = new MHBooleanVar(); break;

                case ASN1Codes.C_INTEGER_VARIABLE: pIngredient = new MHIntegerVar(); break;

                case ASN1Codes.C_OCTET_STRING_VARIABLE: pIngredient = new MHOctetStrVar(); break;

                case ASN1Codes.C_OBJECT_REF_VARIABLE: pIngredient = new MHObjectRefVar(); break;

                case ASN1Codes.C_CONTENT_REF_VARIABLE: pIngredient = new MHContentRefVar(); break;

                case ASN1Codes.C_LINK: pIngredient = new MHLink(); break;

                case ASN1Codes.C_STREAM: pIngredient = new MHStream(); break;

                case ASN1Codes.C_BITMAP: pIngredient = new MHBitmap(); break;

                case ASN1Codes.C_LINE_ART: pIngredient = new MHLineArt(); break;

                case ASN1Codes.C_DYNAMIC_LINE_ART: pIngredient = new MHDynamicLineArt(); break;

                case ASN1Codes.C_RECTANGLE: pIngredient = new MHRectangle(); break;

// NOT UK                   case ASN1Codes.C_HOTSPOT: pIngredient = new MHHotSpot(); break;
// NOT UK                   case ASN1Codes.C_SWITCH_BUTTON: pIngredient = new MHSwitchButton(); break;
// NOT UK                   case ASN1Codes.C_PUSH_BUTTON: pIngredient = new MHPushButton(); break;
                case ASN1Codes.C_TEXT: pIngredient = new MHText(); break;

                case ASN1Codes.C_ENTRY_FIELD: pIngredient = new MHEntryField(); break;

                case ASN1Codes.C_HYPER_TEXT: pIngredient = new MHHyperText(); break;

                case ASN1Codes.C_SLIDER: pIngredient = new MHSlider(); break;

                case ASN1Codes.C_TOKEN_GROUP: pIngredient = new MHTokenGroup(); break;

                case ASN1Codes.C_LIST_GROUP: pIngredient = new MHListGroup(); break;

                default:
                    // So we find out about these when debugging.
                    Logging.Log(Logging.MHLogError, "'" + pItem.GetTagNo() + "' tag not in switch");
                    Logging.Assert(false);

                    // Future proofing: ignore any ingredients that we don't know about.
                    // Obviously these can only arise in the binary coding.
                    break;
                }
                if (pIngredient != null)
                {
                    // Initialise it from its argments.
                    pIngredient.Initialise(pItem, engine);
                    // Remember the highest numbered ingredient
                    if (pIngredient.ObjectIdentifier.ObjectNo > m_nLastId)
                    {
                        m_nLastId = pIngredient.ObjectIdentifier.ObjectNo;
                    }
                    // Add it to the ingedients of this group.
                    m_Items.Append(pIngredient);
                }
            }
        }
示例#8
0
        public void Initialise(MHParseNode p, MHEngine engine)
        {
            // Depending on the caller we may have a tagged argument list or a sequence.
            for (int i = 0; i < p.GetArgCount(); i++)
            {
                MHParseNode  pElemAction = p.GetArgN(i);
                MHElemAction pAction     = null;
                switch (pElemAction.GetTagNo())
                {
                case ASN1Codes.C_ACTIVATE: pAction = new MHActivate(":Activate", true); break;

                case ASN1Codes.C_ADD: pAction = new MHAdd(); break;

                case ASN1Codes.C_ADD_ITEM: pAction = new MHAddItem(); break;

                case ASN1Codes.C_APPEND: pAction = new MHAppend(); break;

                case ASN1Codes.C_BRING_TO_FRONT: pAction = new MHBringToFront(); break;

                case ASN1Codes.C_CALL: pAction = new MHCall(":Call", false); break;

                case ASN1Codes.C_CALL_ACTION_SLOT: pAction = new MHCallActionSlot(); break;

                case ASN1Codes.C_CLEAR: pAction = new MHClear(); break;

                case ASN1Codes.C_CLONE: pAction = new MHClone(); break;

                case ASN1Codes.C_CLOSE_CONNECTION: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ??

                case ASN1Codes.C_DEACTIVATE: pAction = new MHActivate(":Deactivate", false); break;

                case ASN1Codes.C_DEL_ITEM: pAction = new MHDelItem(); break;

                case ASN1Codes.C_DESELECT: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // Button

                case ASN1Codes.C_DESELECT_ITEM: pAction = new MHDeselectItem(); break;

                case ASN1Codes.C_DIVIDE: pAction = new MHDivide(); break;

                case ASN1Codes.C_DRAW_ARC: pAction = new MHDrawArcSector(":DrawArc", false); break;

                case ASN1Codes.C_DRAW_LINE: pAction = new MHDrawLine(); break;

                case ASN1Codes.C_DRAW_OVAL: pAction = new MHDrawOval(); break;

                case ASN1Codes.C_DRAW_POLYGON: pAction = new MHDrawPoly(":DrawPolygon", true); break;

                case ASN1Codes.C_DRAW_POLYLINE: pAction = new MHDrawPoly(":DrawPolyline", false); break;

                case ASN1Codes.C_DRAW_RECTANGLE: pAction = new MHDrawRectangle(); break;

                case ASN1Codes.C_DRAW_SECTOR: pAction = new MHDrawArcSector(":DrawSector", true); break;

                case ASN1Codes.C_FORK: pAction = new MHCall(":Fork", true); break;

                case ASN1Codes.C_GET_AVAILABILITY_STATUS: pAction = new MHGetAvailabilityStatus(); break;

                case ASN1Codes.C_GET_BOX_SIZE: pAction = new MHGetBoxSize(); break;

                case ASN1Codes.C_GET_CELL_ITEM: pAction = new MHGetCellItem(); break;

                case ASN1Codes.C_GET_CURSOR_POSITION: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_GET_ENGINE_SUPPORT: pAction = new MHGetEngineSupport(); break;

                case ASN1Codes.C_GET_ENTRY_POINT: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // EntryField

                case ASN1Codes.C_GET_FILL_COLOUR: pAction = new MHGetFillColour(); break;

                case ASN1Codes.C_GET_FIRST_ITEM: pAction = new MHGetFirstItem(); break;

                case ASN1Codes.C_GET_HIGHLIGHT_STATUS: pAction = new MHTemporary(pElemAction.GetTagNo()); break;   // ?

                case ASN1Codes.C_GET_INTERACTION_STATUS: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_GET_ITEM_STATUS: pAction = new MHGetItemStatus(); break;

                case ASN1Codes.C_GET_LABEL: pAction = new MHTemporary(pElemAction.GetTagNo()); break;             // PushButton

                case ASN1Codes.C_GET_LAST_ANCHOR_FIRED: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // HyperText

                case ASN1Codes.C_GET_LINE_COLOUR: pAction = new MHGetLineColour(); break;

                case ASN1Codes.C_GET_LINE_STYLE: pAction = new MHGetLineStyle(); break;

                case ASN1Codes.C_GET_LINE_WIDTH: pAction = new MHGetLineWidth(); break;

                case ASN1Codes.C_GET_LIST_ITEM: pAction = new MHGetListItem(); break;

                case ASN1Codes.C_GET_LIST_SIZE: pAction = new MHGetListSize(); break;

                case ASN1Codes.C_GET_OVERWRITE_MODE: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_GET_PORTION: pAction = new MHTemporary(pElemAction.GetTagNo()); break;        // Slider

                case ASN1Codes.C_GET_POSITION: pAction = new MHGetPosition(); break;

                case ASN1Codes.C_GET_RUNNING_STATUS: pAction = new MHGetRunningStatus(); break;

                case ASN1Codes.C_GET_SELECTION_STATUS: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_GET_SLIDER_VALUE: pAction = new MHTemporary(pElemAction.GetTagNo()); break;     // Slider

                case ASN1Codes.C_GET_TEXT_CONTENT: pAction = new MHTemporary(pElemAction.GetTagNo()); break;     // Text

                case ASN1Codes.C_GET_TEXT_DATA: pAction = new MHGetTextData(); break;

                case ASN1Codes.C_GET_TOKEN_POSITION: pAction = new MHGetTokenPosition(); break;

                case ASN1Codes.C_GET_VOLUME: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_LAUNCH: pAction = new MHLaunch(); break;

                case ASN1Codes.C_LOCK_SCREEN: pAction = new MHLockScreen(); break;

                case ASN1Codes.C_MODULO: pAction = new MHModulo(); break;

                case ASN1Codes.C_MOVE: pAction = new MHMove(); break;

                case ASN1Codes.C_MOVE_TO: pAction = new MHMoveTo(); break;

                case ASN1Codes.C_MULTIPLY: pAction = new MHMultiply(); break;

                case ASN1Codes.C_OPEN_CONNECTION: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_PRELOAD: pAction = new MHPreload(); break;

                case ASN1Codes.C_PUT_BEFORE: pAction = new MHPutBefore(); break;

                case ASN1Codes.C_PUT_BEHIND: pAction = new MHPutBehind(); break;

                case ASN1Codes.C_QUIT: pAction = new MHQuit(); break;

                case ASN1Codes.C_READ_PERSISTENT: pAction = new MHPersistent(":ReadPersistent", true); break;

                case ASN1Codes.C_RUN: pAction = new MHRun(); break;

                case ASN1Codes.C_SCALE_BITMAP: pAction = new MHScaleBitmap(); break;

                case ASN1Codes.C_SCALE_VIDEO: pAction = new MHScaleVideo(); break;

                case ASN1Codes.C_SCROLL_ITEMS: pAction = new MHScrollItems(); break;

                case ASN1Codes.C_SELECT: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // Button

                case ASN1Codes.C_SELECT_ITEM: pAction = new MHSelectItem(); break;

                case ASN1Codes.C_SEND_EVENT: pAction = new MHSendEvent(); break;

                case ASN1Codes.C_SEND_TO_BACK: pAction = new MHSendToBack(); break;

                case ASN1Codes.C_SET_BOX_SIZE: pAction = new MHSetBoxSize(); break;

                case ASN1Codes.C_SET_CACHE_PRIORITY: pAction = new MHTemporary(pElemAction.GetTagNo()); break;       // ?

                case ASN1Codes.C_SET_COUNTER_END_POSITION: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // Stream

                case ASN1Codes.C_SET_COUNTER_POSITION: pAction = new MHTemporary(pElemAction.GetTagNo()); break;     // Stream

                case ASN1Codes.C_SET_COUNTER_TRIGGER: pAction = new MHTemporary(pElemAction.GetTagNo()); break;      // Stream

                case ASN1Codes.C_SET_CURSOR_POSITION: pAction = new MHTemporary(pElemAction.GetTagNo()); break;      // ?

                case ASN1Codes.C_SET_CURSOR_SHAPE: pAction = new MHTemporary(pElemAction.GetTagNo()); break;         // ?

                case ASN1Codes.C_SET_DATA: pAction = new MHSetData(); break;

                case ASN1Codes.C_SET_ENTRY_POINT: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // EntryField

                case ASN1Codes.C_SET_FILL_COLOUR: pAction = new MHSetFillColour(); break;

                case ASN1Codes.C_SET_FIRST_ITEM: pAction = new MHSetFirstItem(); break;

                case ASN1Codes.C_SET_FONT_REF: pAction = new MHTemporary(pElemAction.GetTagNo()); break;           // Text

                case ASN1Codes.C_SET_HIGHLIGHT_STATUS: pAction = new MHTemporary(pElemAction.GetTagNo()); break;   // ?

                case ASN1Codes.C_SET_INTERACTION_STATUS: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_SET_LABEL: pAction = new MHTemporary(pElemAction.GetTagNo()); break;              // PushButton

                case ASN1Codes.C_SET_LINE_COLOUR: pAction = new MHSetLineColour(); break;

                case ASN1Codes.C_SET_LINE_STYLE: pAction = new MHSetLineStyle(); break;

                case ASN1Codes.C_SET_LINE_WIDTH: pAction = new MHSetLineWidth(); break;

                case ASN1Codes.C_SET_OVERWRITE_MODE: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // EntryField

                case ASN1Codes.C_SET_PALETTE_REF: pAction = new MHTemporary(pElemAction.GetTagNo()); break;    // Visible

                case ASN1Codes.C_SET_PORTION: pAction = new MHTemporary(pElemAction.GetTagNo()); break;        // Slider

                case ASN1Codes.C_SET_POSITION: pAction = new MHSetPosition(); break;

                case ASN1Codes.C_SET_SLIDER_VALUE: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // Slider

                case ASN1Codes.C_SET_SPEED: pAction = new MHTemporary(pElemAction.GetTagNo()); break;        // ?

                case ASN1Codes.C_SET_TIMER: pAction = new MHSetTimer(); break;

                case ASN1Codes.C_SET_TRANSPARENCY: pAction = new MHSetTransparency(); break;

                case ASN1Codes.C_SET_VARIABLE: pAction = new MHSetVariable(); break;

                case ASN1Codes.C_SET_VOLUME: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_SPAWN: pAction = new MHSpawn(); break;

                case ASN1Codes.C_STEP: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // Slider

                case ASN1Codes.C_STOP: pAction = new MHStop(); break;

                case ASN1Codes.C_STORE_PERSISTENT: pAction = new MHPersistent(":StorePersistent", false); break;

                case ASN1Codes.C_SUBTRACT: pAction = new MHSubtract(); break;

                case ASN1Codes.C_TEST_VARIABLE: pAction = new MHTestVariable(); break;

                case ASN1Codes.C_TOGGLE: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // Button

                case ASN1Codes.C_TOGGLE_ITEM: pAction = new MHToggleItem(); break;

                case ASN1Codes.C_TRANSITION_TO: pAction = new MHTransitionTo(); break;

                case ASN1Codes.C_UNLOAD: pAction = new MHUnload(); break;

                case ASN1Codes.C_UNLOCK_SCREEN: pAction = new MHUnlockScreen(); break;

                // UK MHEG added actions.
                case ASN1Codes.C_SET_BACKGROUND_COLOUR: pAction = new MHSetBackgroundColour(); break;

                case ASN1Codes.C_SET_CELL_POSITION: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                case ASN1Codes.C_SET_INPUT_REGISTER: pAction = new MHSetInputRegister(); break;

                case ASN1Codes.C_SET_TEXT_COLOUR: pAction = new MHSetTextColour(); break;

                case ASN1Codes.C_SET_FONT_ATTRIBUTES: pAction = new MHSetFontAttributes(); break;

                case ASN1Codes.C_SET_VIDEO_DECODE_OFFSET: pAction = new MHSetVideoDecodeOffset(); break;

                case ASN1Codes.C_GET_VIDEO_DECODE_OFFSET: pAction = new MHGetVideoDecodeOffset(); break;

                case ASN1Codes.C_GET_FOCUS_POSITION: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // HyperText

                case ASN1Codes.C_SET_FOCUS_POSITION: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // HyperText

                case ASN1Codes.C_SET_BITMAP_DECODE_OFFSET: pAction = new MHSetBitmapDecodeOffset(); break;

                case ASN1Codes.C_GET_BITMAP_DECODE_OFFSET: pAction = new MHGetBitmapDecodeOffset(); break;

                case ASN1Codes.C_SET_SLIDER_PARAMETERS: pAction = new MHTemporary(pElemAction.GetTagNo()); break; // ?

                default:
                    Logging.Log(Logging.MHLogWarning, "Action " + pElemAction.GetTagNo() + " not implemented");
                    Logging.Assert(false); // So we find out about these when debugging.
                    // Future proofing: ignore any actions that we don't know about.
                    // Obviously these can only arise in the binary coding.
                    pAction = null;
                    break;
                }
                if (pAction != null)
                {
                    Append(pAction); // Add to the sequence.
                    pAction.Initialise(pElemAction, engine);
                }
            }
        }