📄 cli_cmdreg.c
字号:
if(m_sCliSysModes[ulMode].ulMode == ulMode)
{
m_sCliSysModes[ulMode].pObject = pObject;
if(ulParamCount > 0)
{
m_sCliSysModes[ulMode].ulParamCount = ulParamCount;
}
if(ulMode > 0)
{
pObject1 = pObject->pParent;
while( !CT_OBJ_CHANGE_MODE(pObject1) && (pObject1 != G_NULL) )
{
pObject1 = pObject1->pParent;
}
ulParentMode = CI_GetNewMode(pObject1) ;
m_sCliSysModes[ulMode].ulHierarchy = m_sCliSysModes[ulParentMode].ulHierarchy + 1 ;
}
ulRet = G_SUCCESS;
}
}
if ((ulRet == G_SUCCESS) && (ulMode != CTM_GENL) && (ulMode != CTM_GLOBAL))
{
ulRet += CT_CmdAutoRegistEx(CMD_CM "..",
(_U8)ulMode,
CT_AL_QUERY,
pFunc,
CT_MC_EXIT,
NULL_MODE,
CMDHELP_GLB_CM,
CMDHELP_GLB_CM_PARENT,
CLI_ML_NULL);
ulRet += CT_CmdAutoRegistEx(CMD_CM "root",
(_U8)ulMode,
CT_AL_QUERY,
pFunc,
CT_MC_END,
NULL_MODE,
CMDHELP_GLB_CM,
CMDHELP_GLB_CM_ROOT,
CLI_ML_NULL);
}
return ulRet;
}
_U32 CT_RegObject(CT_OBJECT_P pParent, CT_OBJECT_P pObject)
{
CT_OBJECT_P pObj,pObj1,pObject1;
_U32 ulMode;
if((pParent == G_NULL) || (pObject == G_NULL))
{
return G_FAILURE;
}
pObj = pParent->pSubObject;
if(pObj == G_NULL)
{
pParent->pSubObject = pObject;
pObject->pParent = pParent;
pParent->ulObjectCount++;
if((pObject->ulNoFlag))
{
ulMode = pObject->action.ulMode;
while((pObject) && (pObject->action.ulMode == ulMode))
{
pObject->ulNoFlag = 1;
pObject = pObject->pParent;
}
}
}
else
{
pObj1 = pObj;
while(pObj != G_NULL)
{
if(CT_IS_SAME_OBJECT(pObj,pObject))
{
/* 不允许一个模式下的同名对象有不同的帮助信息 */
if (pObj->action.ulHelpID != pObject->action.ulHelpID
&& (pObj->action.ulHelpID != CLI_ML_NULL)
&& (pObject->action.ulHelpID != CLI_ML_NULL))
{
DBG_Out(PID_CLI, CLI_DBGOUT_ERR,
"\r\n CLI: 同名对象的帮助ID不同:%s (%s), %s (%s)",
pObj->szName, pObj->pSubObject->szName, pObject->szName, pObject->pSubObject->szName);
return G_FAILURE;
}
/* 注册相同命令时,取低权限 */
if(pObj->action.rightLevel > pObject->action.rightLevel)
{
pObj->action.rightLevel = pObject->action.rightLevel;
}
pParent = pObj;
pObject1 = pObject;
/* Set pObject->pSubObject as the header */
pObject = pObject1->pSubObject;
if(pObject == G_NULL)
{
return G_FAILURE;
}
/* release the pObject1 */
if (CT_FreeObject(pObject1) != G_SUCCESS)
{
return G_FAILURE;
}
pObject1 = G_NULL;
pObject->pParent = G_NULL;
pObj = pObj->pSubObject;
if((G_NULL == pObj))
{
while(pObject)
{
pObject1 = pObject->pSubObject;
if (CT_FreeObject(pObject) != G_SUCCESS)
{
return G_FAILURE;
}
pObject = pObject1;
}
return G_FAILURE;
}
continue;
}
else if(CI_IS_BIG_OBJECT(pObj,pObject))
{
pObj1 = pObj->pPrevious;
if(pObj1 == G_NULL)
{
pParent->pSubObject = pObject;
pObject->pNext = pObj;
pObj->pPrevious = pObject;
pObject->pParent = pParent;
pParent->ulObjectCount++;
if((G_NULL != pObject) && (pObject->ulNoFlag))
{
ulMode = pObject->action.ulMode;
while((pObject) && (pObject->action.ulMode == ulMode))
{
pObject->ulNoFlag = 1;
pObject = pObject->pParent;
}
}
return G_SUCCESS;
}
else
{
pObj1->pNext = pObject;
pObject->pParent = pParent;
pObject->pPrevious = pObj1;
pObject->pNext = pObj;
pObj->pPrevious = pObject;
pParent->ulObjectCount++;
if((G_NULL != pObject) && (pObject->ulNoFlag))
{
ulMode = pObject->action.ulMode;
while((pObject) && (pObject->action.ulMode == ulMode))
{
pObject->ulNoFlag = 1;
pObject = pObject->pParent;
}
}
return G_SUCCESS;
}
}
pObj1 = pObj;
pObj = pObj->pNext;
}
pObj1->pNext = pObject;
if(pObject != G_NULL)
{
pObject->pPrevious = pObj1;
pObject->pParent = pParent;
}
pParent->ulObjectCount++;
if((G_NULL != pObject) && (pObject->ulNoFlag))
{
ulMode = pObject->action.ulMode;
while((pObject) && (pObject->action.ulMode == ulMode))
{
pObject->ulNoFlag = 1;
pObject = pObject->pParent;
}
}
}
return G_SUCCESS;
}
_U32 CT_RegObjToMode(_U32 ulMode, CT_OBJECT_P pObject)
{
CT_OBJECT_P pObj,pObj1;
CT_MODE_T *pMode;
_U32 i;
if(pObject == G_NULL)
{
return G_FAILURE;
}
if(ulMode < MAX_MODE_NUM)
{
/* 检验全局模式与其它模式是否会出现同名对象的情况 */
/* 如果出现同名对象, 则将该对象注册到全局模式 */
if (ulMode != CTM_GLOBAL && m_sCliSysModes[CTM_GLOBAL].pObject != G_NULL)
{
pObj = m_sCliSysModes[CTM_GLOBAL].pObject->pSubObject;
while (pObj != G_NULL)
{
if (CT_IS_SAME_OBJECT(pObj,pObject))
{
pObject->action.ulMode = CTM_GLOBAL;
ulMode = CTM_GLOBAL;
break;
}
pObj = pObj->pNext;
}
}
else
{
for (i = 0; i < MAX_MODE_NUM; i++)
{
if (i == CTM_GLOBAL || m_sCliSysModes[i].pObject == G_NULL)
continue;
pObj = m_sCliSysModes[i].pObject->pSubObject;
while (pObj != G_NULL)
{
if (CT_IS_SAME_OBJECT(pObj,pObject))
{
pObj->pParent->ulObjectCount--;
pObj->pNext->pPrevious = pObj->pPrevious;
pObj->pPrevious->pNext = pObj->pNext;
pObj->action.ulMode = CTM_GLOBAL;
if (G_SUCCESS != CT_RegObject(m_sCliSysModes[CTM_GLOBAL].pObject,pObj))
{
return G_FAILURE;
}
ulMode = CTM_GLOBAL;
break;
}
pObj = pObj->pNext;
}
}
}
/* 检验完毕 */
if(m_sCliSysModes[ulMode].ulMode == ulMode)
{
pObj = m_sCliSysModes[ulMode].pObject;
if(pObj == G_NULL)
{
/* No Object Pointer of the mode */
return G_FAILURE;
}
/* Check the right level and set it to correct value */
pObj1 = pObject;
while(pObj1 != G_NULL)
{
if((pObj1->action.rightLevel == CT_AL_NULL) ||
(pObj1->action.rightLevel < m_sCliSysModes[ulMode].rightLevel) )
{
pObj1->action.rightLevel = m_sCliSysModes[ulMode].rightLevel;
}
if((pObj1->noAction.rightLevel == CT_AL_NULL) ||
(pObj1->noAction.rightLevel < m_sCliSysModes[ulMode].rightLevel) )
{
pObj1->noAction.rightLevel = m_sCliSysModes[ulMode].rightLevel;
}
pObj1 = pObj1->pSubObject;
}
if(!EOS_StriCmp(pObject->szName, "exit") || (!EOS_StriCmp(pObject->szName, "end")))
{
pMode = CI_GetMode(ulMode);
if(G_NULL != pMode)
{
pMode = CI_GetMode(pMode->ulParent);
if(G_NULL != pMode)
pObject->action.rightLevel = pMode->rightLevel;
}
}
return CT_RegObject(pObj,pObject);
}
}
return G_FAILURE;
}
_U32 CT_RegCmdHelp(CT_OBJECT_P pObject, _U32 ulHelpInfoID)
{
if(pObject == G_NULL)
{
return G_FAILURE;
}
pObject->action.ulHelpID = ulHelpInfoID;
return G_SUCCESS;
}
_U32 CT_RegParamlink(CT_OBJECT_P pObject, _U32 ulFlag,
CT_PARAMGROUP_P pParamLink)
{
if((pObject == G_NULL) || (pParamLink == G_NULL))
{
return G_FAILURE;
}
/* ulFlag == CT_RP_FLAG_NORMAL : normal action */
if(ulFlag == CT_RP_FLAG_NORMAL)
{
if(pObject->action.pParamLink != G_NULL)
{
/* Paramlink already exist */
return G_FAILURE;
}
else
{
pObject->action.pParamLink = pParamLink;
return G_SUCCESS;
}
}
/* ulFlag != 0 : no form action */
else
{
if(pObject->noAction.pParamLink != G_NULL)
{
return G_FAILURE;
}
else
{
pObject->noAction.pParamLink = pParamLink;
return G_SUCCESS;
}
}
}
_U32 CT_RegValueToParam(CT_PARAMETER_P pParam,
CT_VALUE_P pValue)
{
CT_VALUE_P pV,pV1;
if((pParam == G_NULL) || (pValue == G_NULL))
{
return G_FAILURE;
}
pV = pParam->valueList.pValue;
if(pV == G_NULL)
{
pParam->valueList.pValue = pValue;
pParam->valueList.ulNumber++;
}
else
{
pV1 = pV;
while(pV != G_NULL)
{
pV1 = pV;
pV = pV->pNext;
}
pV1->pNext = pValue;
pValue->pPrevious = pV1;
}
return G_SUCCESS;
}
_U32 CT_RegParamAsHeir(CT_PARAMETER_P pOldParam,
CT_PARAMETER_P pNewParam)
{
CT_PARAMETER_P pParam,pParam1;
if((pOldParam == G_NULL) || (pNewParam == G_NULL))
{
return G_FAILURE;
}
pParam = pOldParam->subParam;
if(pParam == G_NULL)
{
pOldParam->subParam = pNewParam;
pNewParam->pParent = pOldParam;
}
else
{
pParam1 = pParam;
while(pParam != G_NULL)
{
if(CT_PARAM_NEED_NAME(pParam) && CT_PARAM_NEED_NAME(pNewParam))
{
if(CT_IS_SAME_PARAM(pParam,pNewParam))
{
return G_FAILURE;
}
}
pParam1 = pParam;
pParam = pParam->pNext;
}
/* 此处pc-lint有告警,确认不会有问题 */
pParam1->pNext = pNewParam;
pNewParam->pPrevious = pParam1;
pNewParam->pParent = pOldParam;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -