From 4203e10c1e6642b1a620c797e07d98500b9604ca Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Fri, 22 May 2026 22:27:23 +0200 Subject: [PATCH] MT#61856 control_ng: generate enum from NG_COMMANDS The `OP_...` enum is meant to only represent commands list. Then make the list from the NG commands macro the actual source of truth for the enum count. This eliminates human mistakes, when introducing a new command, because no more need to update enum manually. Additionally: - move the command list macro to the header - existing extern declarations remain untouched - `OP_OTHER` remains sentinel - eventually replace the manual enum with macro based one Change-Id: I33d928367fe0a254571cb0b7d4aafe4445b30b77 --- daemon/control_ng.c | 37 -------------------- include/control_ng.h | 81 +++++++++++++++++++++++--------------------- 2 files changed, 43 insertions(+), 75 deletions(-) diff --git a/daemon/control_ng.c b/daemon/control_ng.c index 045d1e307..2f80f305a 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -32,43 +32,6 @@ const char magic_load_limit_strings[__LOAD_LIMIT_MAX][64] = { [LOAD_LIMIT_BW] = "Bandwidth limit exceeded", }; -#define NG_COMMANDS(X) \ - X(OP_PING, "ping", "ping", "Ping") \ - X(OP_OFFER, "offer", "offer", "Offer") \ - X(OP_ANSWER, "answer", "answer", "Answer") \ - X(OP_DELETE, "delete", "delete", "Delete") \ - X(OP_QUERY, "query", "query", "Query") \ - X(OP_LIST, "list", "list", "List") \ - X(OP_START_RECORDING, "start recording", "start_recording", "StartRec") \ - X(OP_STOP_RECORDING, "stop recording", "stop_recording", "StopRec") \ - X(OP_PAUSE_RECORDING, "pause recording", "pause_recording", "PauseRec") \ - X(OP_START_FORWARDING, "start forwarding", "start_forwarding", "StartFwd") \ - X(OP_STOP_FORWARDING, "stop forwarding", "stop_forwarding", "StopFwd") \ - X(OP_BLOCK_DTMF, "block DTMF", "block_DTMF", "BlkDTMF") \ - X(OP_UNBLOCK_DTMF, "unblock DTMF", "unblock_DTMF", "UnblkDTMF") \ - X(OP_BLOCK_MEDIA, "block media", "block_media", "BlkMedia") \ - X(OP_UNBLOCK_MEDIA, "unblock media", "unblock_media", "UnblkMedia") \ - X(OP_PLAY_MEDIA, "play media", "play_media", "PlayMedia") \ - X(OP_STOP_MEDIA, "stop media", "stop_media", "StopMedia") \ - X(OP_PLAY_DTMF, "play DTMF", "play_DTMF", "PlayDTMF") \ - X(OP_STATISTICS, "statistics", "statistics", "Stats") \ - X(OP_SILENCE_MEDIA, "silence media", "silence_media", "SlnMedia") \ - X(OP_UNSILENCE_MEDIA, "unsilence media", "unsilence_media", "UnslnMedia") \ - X(OP_BLOCK_SILENCE_MEDIA, "block silence media", "block_silence_media", "BlkSlnMedia") \ - X(OP_UNBLOCK_SILENCE_MEDIA, "unblock silence media", "unblock_silence_media", "UnblkSlnMedia") \ - X(OP_PUBLISH, "publish", "publish", "Pub") \ - X(OP_SUBSCRIBE_REQ, "subscribe request", "subscribe_request", "SubReq") \ - X(OP_SUBSCRIBE_ANS, "subscribe answer", "subscribe_answer", "SubAns") \ - X(OP_UNSUBSCRIBE, "unsubscribe", "unsubscribe", "Unsub") \ - X(OP_INJECT_START, "inject start", "inject_start", "InjStart") \ - X(OP_INJECT_STOP, "inject stop", "inject_stop", "InjStop") \ - X(OP_CONNECT, "connect", "connect", "Conn") \ - X(OP_CLI, "cli", "cli", "CLI") \ - X(OP_TRANSFORM, "transform", "transform", "Trnsfm") \ - X(OP_CREATE, "create", "create", "Create") \ - X(OP_CREATE_ANSWER, "create answer", "create_answer", "CrtAnsw") \ - X(OP_MESH, "mesh", "mesh", "Mesh") - const char *ng_command_strings[OP_COUNT] = { #define X(op, name, esc, short_name) [op] = name, NG_COMMANDS(X) diff --git a/include/control_ng.h b/include/control_ng.h index 800fe3d7d..ca8a40d52 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -1,45 +1,50 @@ #ifndef _CONTROL_NG_H_ #define _CONTROL_NG_H_ +#define NG_COMMANDS(X) \ + X(OP_PING, "ping", "ping", "Ping") \ + X(OP_OFFER, "offer", "offer", "Offer") \ + X(OP_ANSWER, "answer", "answer", "Answer") \ + X(OP_DELETE, "delete", "delete", "Delete") \ + X(OP_QUERY, "query", "query", "Query") \ + X(OP_LIST, "list", "list", "List") \ + X(OP_START_RECORDING, "start recording", "start_recording", "StartRec") \ + X(OP_STOP_RECORDING, "stop recording", "stop_recording", "StopRec") \ + X(OP_PAUSE_RECORDING, "pause recording", "pause_recording", "PauseRec") \ + X(OP_START_FORWARDING, "start forwarding", "start_forwarding", "StartFwd") \ + X(OP_STOP_FORWARDING, "stop forwarding", "stop_forwarding", "StopFwd") \ + X(OP_BLOCK_DTMF, "block DTMF", "block_DTMF", "BlkDTMF") \ + X(OP_UNBLOCK_DTMF, "unblock DTMF", "unblock_DTMF", "UnblkDTMF") \ + X(OP_BLOCK_MEDIA, "block media", "block_media", "BlkMedia") \ + X(OP_UNBLOCK_MEDIA, "unblock media", "unblock_media", "UnblkMedia") \ + X(OP_PLAY_MEDIA, "play media", "play_media", "PlayMedia") \ + X(OP_STOP_MEDIA, "stop media", "stop_media", "StopMedia") \ + X(OP_PLAY_DTMF, "play DTMF", "play_DTMF", "PlayDTMF") \ + X(OP_STATISTICS, "statistics", "statistics", "Stats") \ + X(OP_SILENCE_MEDIA, "silence media", "silence_media", "SlnMedia") \ + X(OP_UNSILENCE_MEDIA, "unsilence media", "unsilence_media", "UnslnMedia") \ + X(OP_BLOCK_SILENCE_MEDIA, "block silence media", "block_silence_media", "BlkSlnMedia") \ + X(OP_UNBLOCK_SILENCE_MEDIA, "unblock silence media", "unblock_silence_media", "UnblkSlnMedia") \ + X(OP_PUBLISH, "publish", "publish", "Pub") \ + X(OP_SUBSCRIBE_REQ, "subscribe request", "subscribe_request", "SubReq") \ + X(OP_SUBSCRIBE_ANS, "subscribe answer", "subscribe_answer", "SubAns") \ + X(OP_UNSUBSCRIBE, "unsubscribe", "unsubscribe", "Unsub") \ + X(OP_INJECT_START, "inject start", "inject_start", "InjStart") \ + X(OP_INJECT_STOP, "inject stop", "inject_stop", "InjStop") \ + X(OP_CONNECT, "connect", "connect", "Conn") \ + X(OP_CLI, "cli", "cli", "CLI") \ + X(OP_TRANSFORM, "transform", "transform", "Trnsfm") \ + X(OP_CREATE, "create", "create", "Create") \ + X(OP_CREATE_ANSWER, "create answer", "create_answer", "CrtAnsw") \ + X(OP_MESH, "mesh", "mesh", "Mesh") + enum ng_opmode { - OP_PING = 0, - OP_OFFER, - OP_ANSWER, - OP_DELETE, - OP_QUERY, - OP_LIST, - OP_START_RECORDING, - OP_STOP_RECORDING, - OP_PAUSE_RECORDING, - OP_START_FORWARDING, - OP_STOP_FORWARDING, - OP_BLOCK_DTMF, - OP_UNBLOCK_DTMF, - OP_BLOCK_MEDIA, - OP_UNBLOCK_MEDIA, - OP_PLAY_MEDIA, - OP_STOP_MEDIA, - OP_PLAY_DTMF, - OP_STATISTICS, - OP_SILENCE_MEDIA, - OP_UNSILENCE_MEDIA, - OP_BLOCK_SILENCE_MEDIA, - OP_UNBLOCK_SILENCE_MEDIA, - OP_PUBLISH, - OP_SUBSCRIBE_REQ, - OP_SUBSCRIBE_ANS, - OP_UNSUBSCRIBE, - OP_INJECT_START, - OP_INJECT_STOP, - OP_CONNECT, - OP_CLI, - OP_TRANSFORM, - OP_CREATE, - OP_CREATE_ANSWER, - OP_MESH, - - OP_COUNT, // last, number of elements - OP_OTHER = OP_COUNT // alias to above +#define X(op, name, esc, short_name) op, + NG_COMMANDS(X) +#undef X + + OP_COUNT, /* last, number of real command elements */ + OP_OTHER = OP_COUNT /* sentinel/alias only, do not use as array index */ }; #include "obj.h"