1.1 --- a/core/smn_console.cpp Sun Jul 15 17:22:47 2007 +0000
1.2 +++ b/core/smn_console.cpp Sun Jul 15 18:51:25 2007 +0000
1.3 @@ -33,6 +33,34 @@
1.4 ConVarBound_Lower
1.5 };
1.6
1.7 +HandleType_t hCmdIterType = 0;
1.8 +
1.9 +struct GlobCmdIter
1.10 +{
1.11 + bool started;
1.12 + List<ConCmdInfo *>::iterator iter;
1.13 +};
1.14 +
1.15 +class ConsoleHelpers :
1.16 + public SMGlobalClass,
1.17 + public IHandleTypeDispatch
1.18 +{
1.19 +public:
1.20 + virtual void OnSourceModAllInitialized()
1.21 + {
1.22 + HandleAccess access;
1.23 + g_HandleSys.InitAccessDefaults(NULL, &access);
1.24 + access.access[HandleAccess_Clone] = HANDLE_RESTRICT_OWNER | HANDLE_RESTRICT_IDENTITY;
1.25 +
1.26 + hCmdIterType = g_HandleSys.CreateType(NULL, this, 0, NULL, &access, g_pCoreIdent, NULL);
1.27 + }
1.28 + virtual void OnHandleDestroy(HandleType_t type, void *object)
1.29 + {
1.30 + GlobCmdIter *iter = (GlobCmdIter *)object;
1.31 + delete iter;
1.32 + }
1.33 +} s_ConsoleHelpers;
1.34 +
1.35 static void ReplicateConVar(ConVar *pConVar)
1.36 {
1.37 int maxClients = g_Players.GetMaxClients();
1.38 @@ -802,6 +830,78 @@
1.39 return g_ChatTriggers.SetReplyTo(params[1]);
1.40 }
1.41
1.42 +static cell_t GetCommandIterator(IPluginContext *pContext, const cell_t *params)
1.43 +{
1.44 + GlobCmdIter *iter = new GlobCmdIter;
1.45 + iter->started = false;
1.46 +
1.47 + Handle_t hndl = g_HandleSys.CreateHandle(hCmdIterType, iter, pContext->GetIdentity(), g_pCoreIdent, NULL);
1.48 + if (hndl == BAD_HANDLE)
1.49 + {
1.50 + delete iter;
1.51 + }
1.52 +
1.53 + return hndl;
1.54 +}
1.55 +
1.56 +static cell_t ReadCommandIterator(IPluginContext *pContext, const cell_t *params)
1.57 +{
1.58 + GlobCmdIter *iter;
1.59 + HandleError err;
1.60 + HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
1.61 +
1.62 + if ((err = g_HandleSys.ReadHandle(params[1], hCmdIterType, &sec, (void **)&iter))
1.63 + != HandleError_None)
1.64 + {
1.65 + return pContext->ThrowNativeError("Invalid GlobCmdIter Handle %x", params[1]);
1.66 + }
1.67 +
1.68 + const List<ConCmdInfo *> &cmds = g_ConCmds.GetCommandList();
1.69 +
1.70 + if (!iter->started)
1.71 + {
1.72 + iter->iter = cmds.begin();
1.73 + iter->started = true;
1.74 + }
1.75 +
1.76 + while (iter->iter != cmds.end()
1.77 + && !(*(iter->iter))->sourceMod)
1.78 + {
1.79 + iter->iter++;
1.80 + }
1.81 +
1.82 + if (iter->iter == cmds.end())
1.83 + {
1.84 + return 0;
1.85 + }
1.86 +
1.87 + ConCmdInfo *pInfo = (*(iter->iter));
1.88 +
1.89 + pContext->StringToLocalUTF8(params[2], params[3], pInfo->pCmd->GetName(), NULL);
1.90 + pContext->StringToLocalUTF8(params[5], params[6], pInfo->pCmd->GetHelpText(), NULL);
1.91 +
1.92 + cell_t *addr;
1.93 + pContext->LocalToPhysAddr(params[4], &addr);
1.94 + *addr = pInfo->admin.eflags;
1.95 +
1.96 + iter->iter++;
1.97 +
1.98 + return 1;
1.99 +}
1.100 +
1.101 +static cell_t CheckCommandAccess(IPluginContext *pContext, const cell_t *params)
1.102 +{
1.103 + if (params[1] == 0)
1.104 + {
1.105 + return 1;
1.106 + }
1.107 +
1.108 + char *cmd;
1.109 + pContext->LocalToString(params[2], &cmd);
1.110 +
1.111 + return g_ConCmds.CheckCommandAccess(params[1], cmd, params[3]) ? 1 : 0;
1.112 +}
1.113 +
1.114 REGISTER_NATIVES(consoleNatives)
1.115 {
1.116 {"CreateConVar", sm_CreateConVar},
1.117 @@ -839,5 +939,8 @@
1.118 {"ReplyToCommand", ReplyToCommand},
1.119 {"GetCmdReplySource", GetCmdReplyTarget},
1.120 {"SetCmdReplySource", SetCmdReplyTarget},
1.121 + {"GetCommandIterator", GetCommandIterator},
1.122 + {"ReadCommandIterator", ReadCommandIterator},
1.123 + {"CheckCommandAccess", CheckCommandAccess},
1.124 {NULL, NULL}
1.125 };