MythTV master
Actions.cpp
Go to the documentation of this file.
1/* Actions.cpp
2
3 Copyright (C) David C. J. Matthews 2004, 2008 dm at prolingua.co.uk
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
18 Or, point your browser to http://www.gnu.org/copyleft/gpl.html
19
20*/
21
22#include <cstdio>
23
24#include "BaseActions.h"
25#include "Actions.h"
26#include "BaseClasses.h"
27#include "ParseNode.h"
28#include "ASN1Codes.h"
29#include "Ingredients.h"
30#include "Engine.h"
31#include "Variables.h"
32#include "Programs.h"
33#include "Bitmap.h"
34#include "Visible.h"
35#include "Text.h"
36#include "DynamicLineArt.h"
37#include "Link.h"
38#include "TokenGroup.h"
39#include "Stream.h"
40#include "Logging.h"
41
42
43// Temporary place-holder for actions we haven't done yet.
45{
46 public:
47 explicit MHUnimplementedAction(int nTag): MHElemAction(""), m_nTag(nTag)
48 {
49 MHLOG(MHLogWarning, QString("WARN Unimplemented action %1").arg(m_nTag) );
50 }
51 void Initialise(MHParseNode * /*p*/, MHEngine * /*engine*/) override {} // MHElemAction
52 void PrintMe(FILE *fd, int /*nTabs*/) const override // MHElemAction
53 {
54 fprintf(fd, "****Missing action %d\n", m_nTag);
55 }
56 void Perform(MHEngine * /*engine*/) override // MHElemAction
57 {
58 MHERROR(QString("Unimplemented action %1").arg(m_nTag));
59 }
60 protected:
61 int m_nTag;
62};
63
64// ActionSequence.
65
66// Process the action set and create the action values.
68{
69 // Depending on the caller we may have a tagged argument list or a sequence.
70 for (int i = 0; i < p->GetArgCount(); i++)
71 {
72 MHParseNode *pElemAction = p->GetArgN(i);
73 MHElemAction *pAction = nullptr;
74
75 switch (pElemAction->GetTagNo())
76 {
77 case C_ACTIVATE:
78 pAction = new MHActivate(":Activate", true);
79 break;
80 case C_ADD:
81 pAction = new MHAdd;
82 break;
83 case C_ADD_ITEM:
84 pAction = new MHAddItem;
85 break;
86 case C_APPEND:
87 pAction = new MHAppend;
88 break;
90 pAction = new MHBringToFront;
91 break;
92 case C_CALL:
93 pAction = new MHCall(":Call", false);
94 break;
96 pAction = new MHCallActionSlot;
97 break;
98 case C_CLEAR:
99 pAction = new MHClear;
100 break;
101 case C_CLONE:
102 pAction = new MHClone;
103 break;
105 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
106 break; // ??
107 case C_DEACTIVATE:
108 pAction = new MHActivate(":Deactivate", false);
109 break;
110 case C_DEL_ITEM:
111 pAction = new MHDelItem;
112 break;
113 case C_DESELECT:
114 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
115 break; // Button
116 case C_DESELECT_ITEM:
117 pAction = new MHDeselectItem;
118 break;
119 case C_DIVIDE:
120 pAction = new MHDivide;
121 break;
122 case C_DRAW_ARC:
123 pAction = new MHDrawArcSector(":DrawArc", false);
124 break;
125 case C_DRAW_LINE:
126 pAction = new MHDrawLine;
127 break;
128 case C_DRAW_OVAL:
129 pAction = new MHDrawOval;
130 break;
131 case C_DRAW_POLYGON:
132 pAction = new MHDrawPoly(":DrawPolygon", true);
133 break;
134 case C_DRAW_POLYLINE:
135 pAction = new MHDrawPoly(":DrawPolyline", false);
136 break;
137 case C_DRAW_RECTANGLE:
138 pAction = new MHDrawRectangle;
139 break;
140 case C_DRAW_SECTOR:
141 pAction = new MHDrawArcSector(":DrawSector", true);
142 break;
143 case C_FORK:
144 pAction = new MHCall(":Fork", true);
145 break;
147 pAction = new MHGetAvailabilityStatus;
148 break;
149 case C_GET_BOX_SIZE:
150 pAction = new MHGetBoxSize;
151 break;
152 case C_GET_CELL_ITEM:
153 pAction = new MHGetCellItem;
154 break;
156 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
157 break; // ?
159 pAction = new MHGetEngineSupport;
160 break;
162 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
163 break; // EntryField
165 pAction = new MHGetFillColour;
166 break;
167 case C_GET_FIRST_ITEM:
168 pAction = new MHGetFirstItem;
169 break;
171 pAction = new MHGetHighlightStatus;
172 break;
174 pAction = new MHGetInteractionStatus;
175 break;
177 pAction = new MHGetItemStatus;
178 break;
179 case C_GET_LABEL: // PushButton
180 case C_GET_LAST_ANCHOR_FIRED: // HyperText
181 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
182 break;
184 pAction = new MHGetLineColour;
185 break;
186 case C_GET_LINE_STYLE:
187 pAction = new MHGetLineStyle;
188 break;
189 case C_GET_LINE_WIDTH:
190 pAction = new MHGetLineWidth;
191 break;
192 case C_GET_LIST_ITEM:
193 pAction = new MHGetListItem;
194 break;
195 case C_GET_LIST_SIZE:
196 pAction = new MHGetListSize;
197 break;
199 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
200 break;// ?
201 case C_GET_PORTION:
202 pAction = new MHGetPortion;
203 break;
204 case C_GET_POSITION:
205 pAction = new MHGetPosition;
206 break;
208 pAction = new MHGetRunningStatus;
209 break;
211 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
212 break;// ?
214 pAction = new MHGetSliderValue;
215 break;
217 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
218 break;// Text
219 case C_GET_TEXT_DATA:
220 pAction = new MHGetTextData;
221 break;
223 pAction = new MHGetTokenPosition;
224 break;
225 case C_GET_VOLUME:
226 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
227 break; // ?
228 case C_LAUNCH:
229 pAction = new MHLaunch;
230 break;
231 case C_LOCK_SCREEN:
232 pAction = new MHLockScreen;
233 break;
234 case C_MODULO:
235 pAction = new MHModulo;
236 break;
237 case C_MOVE:
238 pAction = new MHMove;
239 break;
240 case C_MOVE_TO:
241 pAction = new MHMoveTo;
242 break;
243 case C_MULTIPLY:
244 pAction = new MHMultiply;
245 break;
247 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
248 break; // ?
249 case C_PRELOAD:
250 pAction = new MHPreload;
251 break;
252 case C_PUT_BEFORE:
253 pAction = new MHPutBefore;
254 break;
255 case C_PUT_BEHIND:
256 pAction = new MHPutBehind;
257 break;
258 case C_QUIT:
259 pAction = new MHQuit;
260 break;
262 pAction = new MHPersistent(":ReadPersistent", true);
263 break;
264 case C_RUN:
265 pAction = new MHRun;
266 break;
267 case C_SCALE_BITMAP:
268 pAction = new MHScaleBitmap;
269 break;
270 case C_SCALE_VIDEO:
271 pAction = new MHScaleVideo;
272 break;
273 case C_SCROLL_ITEMS:
274 pAction = new MHScrollItems;
275 break;
276 case C_SELECT:
277 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
278 break; // Button
279 case C_SELECT_ITEM:
280 pAction = new MHSelectItem;
281 break;
282 case C_SEND_EVENT:
283 pAction = new MHSendEvent;
284 break;
285 case C_SEND_TO_BACK:
286 pAction = new MHSendToBack;
287 break;
288 case C_SET_BOX_SIZE:
289 pAction = new MHSetBoxSize;
290 break;
292 case C_SET_COUNTER_END_POSITION: // Stream
293 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
294 break;
296 pAction = new MHSetCounterPosition;
297 break; // Stream
298 case C_SET_COUNTER_TRIGGER: // Stream
301 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
302 break;
303 case C_SET_DATA:
304 pAction = new MHSetData;
305 break;
307 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
308 break; // EntryField
310 pAction = new MHSetFillColour;
311 break;
312 case C_SET_FIRST_ITEM:
313 pAction = new MHSetFirstItem;
314 break;
315 case C_SET_FONT_REF:
316 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
317 break; // Text
319 pAction = new MHSetHighlightStatus;
320 break;
322 pAction = new MHSetInteractionStatus;
323 break;
324 case C_SET_LABEL:
325 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
326 break; // PushButton
328 pAction = new MHSetLineColour;
329 break;
330 case C_SET_LINE_STYLE:
331 pAction = new MHSetLineStyle;
332 break;
333 case C_SET_LINE_WIDTH:
334 pAction = new MHSetLineWidth;
335 break;
336 case C_SET_OVERWRITE_MODE: // EntryField
337 case C_SET_PALETTE_REF: // Visible
338 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
339 break;
340 case C_SET_PORTION:
341 pAction = new MHSetPortion;
342 break;
343 case C_SET_POSITION:
344 pAction = new MHSetPosition;
345 break;
347 pAction = new MHSetSliderValue;
348 break;
349 case C_SET_SPEED:
350 pAction = new MHSetSpeed;
351 break; // ?
352 case C_SET_TIMER:
353 pAction = new MHSetTimer;
354 break;
356 pAction = new MHSetTransparency;
357 break;
358 case C_SET_VARIABLE:
359 pAction = new MHSetVariable;
360 break;
361 case C_SET_VOLUME:
362 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
363 break; // ?
364 case C_SPAWN:
365 pAction = new MHSpawn;
366 break;
367 case C_STEP:
368 pAction = new MHStep;
369 break;
370 case C_STOP:
371 pAction = new MHStop;
372 break;
374 pAction = new MHPersistent(":StorePersistent", false);
375 break;
376 case C_SUBTRACT:
377 pAction = new MHSubtract;
378 break;
379 case C_TEST_VARIABLE:
380 pAction = new MHTestVariable;
381 break;
382 case C_TOGGLE:
383 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
384 break; // Button
385 case C_TOGGLE_ITEM:
386 pAction = new MHToggleItem;
387 break;
388 case C_TRANSITION_TO:
389 pAction = new MHTransitionTo;
390 break;
391 case C_UNLOAD:
392 pAction = new MHUnload;
393 break;
394 case C_UNLOCK_SCREEN:
395 pAction = new MHUnlockScreen;
396 break;
397 // UK MHEG added actions.
399 pAction = new MHSetBackgroundColour;
400 break;
402 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
403 break; // ?
405 pAction = new MHSetInputRegister;
406 break;
408 pAction = new MHSetTextColour;
409 break;
411 pAction = new MHSetFontAttributes;
412 break;
414 pAction = new MHSetVideoDecodeOffset;
415 break;
417 pAction = new MHGetVideoDecodeOffset;
418 break;
419 case C_GET_FOCUS_POSITION: // HyperText
420 case C_SET_FOCUS_POSITION: // HyperText
421 pAction = new MHUnimplementedAction(pElemAction->GetTagNo());
422 break; // HyperText
424 pAction = new MHSetBitmapDecodeOffset;
425 break;
427 pAction = new MHGetBitmapDecodeOffset;
428 break;
430 pAction = new MHSetSliderParameters;
431 break;
432
433 // Added in ETSI ES 202 184 V2.1.1 (2010-01)
434 case C_GET_COUNTER_POSITION: // Stream position
435 pAction = new MHGetCounterPosition;
436 break;
437 case C_GET_COUNTER_MAX_POSITION: // Stream total size
438 pAction = new MHGetCounterMaxPosition;
439 break;
440
441 default:
442 MHLOG(MHLogWarning, QString("WARN Unknown action %1").arg(pElemAction->GetTagNo()));
443 // Future proofing: ignore any actions that we don't know about.
444 // Obviously these can only arise in the binary coding.
445 pAction = nullptr;
446 }
447
448 if (pAction)
449 {
450 Append(pAction); // Add to the sequence.
451 pAction->Initialise(pElemAction, engine);
452 }
453 }
454}
455
456void MHActionSequence::PrintMe(FILE *fd, int nTabs) const
457{
458 for (int i = 0; i < Size(); i++)
459 {
460 GetAt(i)->PrintMe(fd, nTabs);
461 }
462}
@ C_SET_FONT_ATTRIBUTES
Definition: ASN1Codes.h:278
@ C_CLOSE_CONNECTION
Definition: ASN1Codes.h:160
@ C_SET_POSITION
Definition: ASN1Codes.h:243
@ C_GET_BOX_SIZE
Definition: ASN1Codes.h:175
@ C_SET_SLIDER_VALUE
Definition: ASN1Codes.h:244
@ C_SET_LINE_STYLE
Definition: ASN1Codes.h:238
@ C_APPEND
Definition: ASN1Codes.h:154
@ C_SET_FIRST_ITEM
Definition: ASN1Codes.h:232
@ C_MODULO
Definition: ASN1Codes.h:204
@ C_SEND_EVENT
Definition: ASN1Codes.h:220
@ C_GET_COUNTER_POSITION
Definition: ASN1Codes.h:289
@ C_DRAW_POLYGON
Definition: ASN1Codes.h:169
@ C_GET_RUNNING_STATUS
Definition: ASN1Codes.h:195
@ C_SET_LABEL
Definition: ASN1Codes.h:236
@ C_GET_FILL_COLOUR
Definition: ASN1Codes.h:180
@ C_GET_FIRST_ITEM
Definition: ASN1Codes.h:181
@ C_SET_TIMER
Definition: ASN1Codes.h:246
@ C_GET_LABEL
Definition: ASN1Codes.h:185
@ C_DRAW_ARC
Definition: ASN1Codes.h:166
@ C_DRAW_OVAL
Definition: ASN1Codes.h:168
@ C_STORE_PERSISTENT
Definition: ASN1Codes.h:253
@ C_QUIT
Definition: ASN1Codes.h:212
@ C_SCALE_BITMAP
Definition: ASN1Codes.h:215
@ C_DRAW_POLYLINE
Definition: ASN1Codes.h:170
@ C_READ_PERSISTENT
Definition: ASN1Codes.h:213
@ C_SELECT_ITEM
Definition: ASN1Codes.h:219
@ C_ADD_ITEM
Definition: ASN1Codes.h:153
@ C_GET_LINE_WIDTH
Definition: ASN1Codes.h:189
@ C_DIVIDE
Definition: ASN1Codes.h:165
@ C_LAUNCH
Definition: ASN1Codes.h:202
@ C_SPAWN
Definition: ASN1Codes.h:250
@ C_DRAW_LINE
Definition: ASN1Codes.h:167
@ C_BRING_TO_FRONT
Definition: ASN1Codes.h:155
@ C_UNLOAD
Definition: ASN1Codes.h:259
@ C_GET_TEXT_CONTENT
Definition: ASN1Codes.h:198
@ C_GET_COUNTER_MAX_POSITION
Definition: ASN1Codes.h:290
@ C_DRAW_SECTOR
Definition: ASN1Codes.h:172
@ C_SET_INPUT_REGISTER
Definition: ASN1Codes.h:276
@ C_GET_BITMAP_DECODE_OFFSET
Definition: ASN1Codes.h:284
@ C_SELECT
Definition: ASN1Codes.h:218
@ C_TRANSITION_TO
Definition: ASN1Codes.h:258
@ C_GET_CURSOR_POSITION
Definition: ASN1Codes.h:177
@ C_SET_COUNTER_TRIGGER
Definition: ASN1Codes.h:226
@ C_CLONE
Definition: ASN1Codes.h:159
@ C_TEST_VARIABLE
Definition: ASN1Codes.h:255
@ C_DRAW_RECTANGLE
Definition: ASN1Codes.h:171
@ C_GET_FOCUS_POSITION
Definition: ASN1Codes.h:281
@ C_SET_COUNTER_POSITION
Definition: ASN1Codes.h:225
@ C_SET_TRANSPARENCY
Definition: ASN1Codes.h:247
@ C_SET_COUNTER_END_POSITION
Definition: ASN1Codes.h:224
@ C_GET_LINE_STYLE
Definition: ASN1Codes.h:188
@ C_SCALE_VIDEO
Definition: ASN1Codes.h:216
@ C_GET_SLIDER_VALUE
Definition: ASN1Codes.h:197
@ C_GET_POSITION
Definition: ASN1Codes.h:194
@ C_GET_TEXT_DATA
Definition: ASN1Codes.h:199
@ C_GET_LIST_SIZE
Definition: ASN1Codes.h:191
@ C_GET_ENTRY_POINT
Definition: ASN1Codes.h:179
@ C_GET_LIST_ITEM
Definition: ASN1Codes.h:190
@ C_RUN
Definition: ASN1Codes.h:214
@ C_UNLOCK_SCREEN
Definition: ASN1Codes.h:260
@ C_ADD
Definition: ASN1Codes.h:152
@ C_SET_BITMAP_DECODE_OFFSET
Definition: ASN1Codes.h:283
@ C_DEACTIVATE
Definition: ASN1Codes.h:161
@ C_GET_HIGHLIGHT_STATUS
Definition: ASN1Codes.h:182
@ C_ACTIVATE
Definition: ASN1Codes.h:151
@ C_TOGGLE
Definition: ASN1Codes.h:256
@ C_CLEAR
Definition: ASN1Codes.h:158
@ C_SET_LINE_WIDTH
Definition: ASN1Codes.h:239
@ C_GET_SELECTION_STATUS
Definition: ASN1Codes.h:196
@ C_SET_DATA
Definition: ASN1Codes.h:229
@ C_TOGGLE_ITEM
Definition: ASN1Codes.h:257
@ C_SET_FOCUS_POSITION
Definition: ASN1Codes.h:282
@ C_GET_LAST_ANCHOR_FIRED
Definition: ASN1Codes.h:186
@ C_SET_CURSOR_SHAPE
Definition: ASN1Codes.h:228
@ C_SET_TEXT_COLOUR
Definition: ASN1Codes.h:277
@ C_GET_LINE_COLOUR
Definition: ASN1Codes.h:187
@ C_CALL_ACTION_SLOT
Definition: ASN1Codes.h:157
@ C_GET_PORTION
Definition: ASN1Codes.h:193
@ C_GET_INTERACTION_STATUS
Definition: ASN1Codes.h:183
@ C_SET_CELL_POSITION
Definition: ASN1Codes.h:275
@ C_SET_CACHE_PRIORITY
Definition: ASN1Codes.h:223
@ C_GET_ENGINE_SUPPORT
Definition: ASN1Codes.h:178
@ C_SET_HIGHLIGHT_STATUS
Definition: ASN1Codes.h:234
@ C_MOVE_TO
Definition: ASN1Codes.h:206
@ C_GET_CELL_ITEM
Definition: ASN1Codes.h:176
@ C_SET_SPEED
Definition: ASN1Codes.h:245
@ C_SET_CURSOR_POSITION
Definition: ASN1Codes.h:227
@ C_SET_PORTION
Definition: ASN1Codes.h:242
@ C_PUT_BEFORE
Definition: ASN1Codes.h:210
@ C_SET_SLIDER_PARAMETERS
Definition: ASN1Codes.h:285
@ C_DESELECT
Definition: ASN1Codes.h:163
@ C_DESELECT_ITEM
Definition: ASN1Codes.h:164
@ C_STEP
Definition: ASN1Codes.h:251
@ C_STOP
Definition: ASN1Codes.h:252
@ C_SEND_TO_BACK
Definition: ASN1Codes.h:221
@ C_SET_VOLUME
Definition: ASN1Codes.h:249
@ C_SET_FONT_REF
Definition: ASN1Codes.h:233
@ C_SET_PALETTE_REF
Definition: ASN1Codes.h:241
@ C_LOCK_SCREEN
Definition: ASN1Codes.h:203
@ C_GET_VIDEO_DECODE_OFFSET
Definition: ASN1Codes.h:280
@ C_MULTIPLY
Definition: ASN1Codes.h:207
@ C_GET_OVERWRITE_MODE
Definition: ASN1Codes.h:192
@ C_SET_FILL_COLOUR
Definition: ASN1Codes.h:231
@ C_SET_INTERACTION_STATUS
Definition: ASN1Codes.h:235
@ C_SET_VIDEO_DECODE_OFFSET
Definition: ASN1Codes.h:279
@ C_SUBTRACT
Definition: ASN1Codes.h:254
@ C_DEL_ITEM
Definition: ASN1Codes.h:162
@ C_MOVE
Definition: ASN1Codes.h:205
@ C_GET_ITEM_STATUS
Definition: ASN1Codes.h:184
@ C_PUT_BEHIND
Definition: ASN1Codes.h:211
@ C_FORK
Definition: ASN1Codes.h:173
@ C_SCROLL_ITEMS
Definition: ASN1Codes.h:217
@ C_GET_VOLUME
Definition: ASN1Codes.h:201
@ C_GET_TOKEN_POSITION
Definition: ASN1Codes.h:200
@ C_SET_LINE_COLOUR
Definition: ASN1Codes.h:237
@ C_SET_VARIABLE
Definition: ASN1Codes.h:248
@ C_SET_ENTRY_POINT
Definition: ASN1Codes.h:230
@ C_GET_AVAILABILITY_STATUS
Definition: ASN1Codes.h:174
@ C_CALL
Definition: ASN1Codes.h:156
@ C_PRELOAD
Definition: ASN1Codes.h:209
@ C_SET_BACKGROUND_COLOUR
Definition: ASN1Codes.h:274
@ C_SET_OVERWRITE_MODE
Definition: ASN1Codes.h:240
@ C_SET_BOX_SIZE
Definition: ASN1Codes.h:222
@ C_OPEN_CONNECTION
Definition: ASN1Codes.h:208
#define MHERROR(__text)
Definition: Logging.h:42
#define MHLOG(__level, __text)
Definition: Logging.h:36
virtual void PrintMe(FILE *fd, int nTabs) const
Definition: Actions.cpp:456
virtual void Initialise(MHParseNode *p, MHEngine *engine)
Definition: Actions.cpp:67
virtual void Initialise(MHParseNode *p, MHEngine *engine)
Definition: BaseActions.cpp:31
virtual void PrintMe(FILE *fd, int nTabs) const
Definition: BaseActions.cpp:37
int GetTagNo()
Definition: ParseNode.cpp:49
Definition: Groups.h:168
void Append(MHElemAction * b)
Definition: BaseClasses.h:64
MHElemAction * GetAt(int i) const
Definition: BaseClasses.h:49
void Perform(MHEngine *) override
Definition: Actions.cpp:56
void PrintMe(FILE *fd, int) const override
Definition: Actions.cpp:52
void Initialise(MHParseNode *, MHEngine *) override
Definition: Actions.cpp:51
MHUnimplementedAction(int nTag)
Definition: Actions.cpp:47
@ MHLogWarning
Definition: freemheg.h:78
int FILE
Definition: mythburn.py:138