protected virtual void GenerateSetMethodCode(Function setMethod, string switchSelector) { VariableDeclaration returnValue = new VariableDeclaration((VariableType)setMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_Ok); returnValue.Type.Name = "err"; setMethod.Declarations.Add(returnValue); Switch sw = new Switch(switchSelector); bool valueVarUsed = false; bool lenVarUsed = false; foreach (SnmpScalarNode scalarNode in this.AggregatedScalarNodes) { if ((scalarNode.AccessMode == SnmpAccessMode.WriteOnly) || (scalarNode.AccessMode == SnmpAccessMode.ReadWrite)) { SwitchCase sc = new SwitchCase(scalarNode.Oid.ToString(CultureInfo.InvariantCulture)); sc.Declarations.Add(new Comment(scalarNode.Name, singleLine: true)); scalarNode.GenerateSetMethodCode(sc, setMethod.Parameter[2].Name, ref valueVarUsed, setMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name); sw.Switches.Add(sc); } } SwitchCase scd = SwitchCase.GenerateDefault(); scd.AddCodeFormat("LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"{0}(): unknown id: %\"S32_F\"\\n\", {1}));", setMethod.Name, switchSelector); sw.Switches.Add(scd); if (!valueVarUsed) { setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[2].Name); } if (!lenVarUsed) { setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[1].Name); } setMethod.AddElement(sw); setMethod.AddCodeFormat("return {0};", returnValue.Type.Name); }
private void controlActions_OnApprove(object sender, ActionsUserControl.ApproveEventArgs args) { var valid = args.IsValid = isMustApprove(); if (valid) { Calculator.Current.ClearFunctions(); foreach (var control in _functions) { var function = new Function(); foreach (var element in control.Elements) { function.AddElement(element.Operator); } Calculator.Current.AddFunction(function); } } }
protected virtual void GenerateGetNextInstanceMethodCode(Function getNextInstanceMethod) { getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[0].Name); getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[1].Name); getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[2].Name); VariableDeclaration returnValue = new VariableDeclaration((VariableType)getNextInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance); returnValue.Type.Name = "err"; getNextInstanceMethod.Declarations.Add(returnValue); StringBuilder indexColumns = new StringBuilder(); foreach (SnmpScalarNode indexNode in this.indexNodes) { indexColumns.AppendFormat( " {0} ({1}, OID length = {2})\n", indexNode.Name, indexNode.DataType, (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable"); } if (indexColumns.Length > 0) { indexColumns.Length--; getNextInstanceMethod.Declarations.Insert(0, new Comment(String.Format( "The instance OID of this table consists of following (index) column(s):\n{0}", indexColumns))); } string augmentsHint = ""; if (!String.IsNullOrWhiteSpace(this.augmentedTableRow)) { augmentsHint = String.Format( "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" + "You may simply call the '*{1}' method of this table.\n\n", (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length - 5) : this.augmentedTableRow, LwipDefs.FnctSuffix_GetNextInstance); } getNextInstanceMethod.AddElement(new Comment(String.Format( "TODO: analyze '{0}->id'/'{0}->len' and return the subsequent row instance\n" + "Be aware that '{0}->id'/'{0}->len' must not point to a valid instance or have correct instance length.\n" + "If '{0}->len' is 0, return the first instance. If '{0}->len' is longer than expected, cut superfluous OID parts.\n" + "If a valid next instance is found, store it in '{0}->id'/'{0}->len' and set '{1} = {2};'\n\n" + "snmp_oid_* methods may be used for easier processing of oid\n\n" + "{3}" + "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" + "you may store an arbitrary value (like a pointer to target value object) in '{4}->reference'/'{4}->reference_len'.\n" + "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" + "You also may replace function pointers in '{4}' param for get/test/set methods which contain the default values from table definition,\n" + "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.", getNextInstanceMethod.Parameter[1].Name, returnValue.Type.Name, LwipDefs.Def_ErrorCode_Ok, augmentsHint, getNextInstanceMethod.Parameter[2].Name ))); getNextInstanceMethod.AddElement(new Comment(String.Format( "For easier processing and getting the next instance, you may use the 'snmp_next_oid_*' enumerator.\n" + "Simply pass all known instance OID's to it and it returns the next valid one:\n\n" + "{0} state;\n" + "{1} result_buf;\n" + "snmp_next_oid_init(&state, {2}->id, {2}->len, result_buf.id, SNMP_MAX_OBJ_ID_LEN);\n" + "while ({{not all instances passed}}) {{\n" + " {1} test_oid;\n" + " {{fill test_oid to create instance oid for next instance}}\n" + " snmp_next_oid_check(&state, test_oid.id, test_oid.len, {{target_data_ptr}});\n" + "}}\n" + "if(state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {{\n" + " snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n" + " {3}->reference.ptr = state.reference; //==target_data_ptr, for usage in subsequent get/test/set\n" + " {4} = {5};\n" + "}}" , LwipDefs.Vt_StNextOidState, LwipDefs.Vt_StObjectId, getNextInstanceMethod.Parameter[1].Name, getNextInstanceMethod.Parameter[2].Name, returnValue.Type.Name, LwipDefs.Def_ErrorCode_Ok ))); getNextInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name); }
protected virtual void GenerateGetInstanceMethodCode(Function getInstanceMethod) { VariableDeclaration returnValue = new VariableDeclaration((VariableType)getInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance); returnValue.Type.Name = "err"; getInstanceMethod.Declarations.Add(returnValue); int instanceOidLength = 0; StringBuilder indexColumns = new StringBuilder(); foreach (SnmpScalarNode indexNode in this.indexNodes) { if (instanceOidLength >= 0) { if (indexNode.OidRepresentationLen >= 0) { instanceOidLength += indexNode.OidRepresentationLen; } else { // at least one index column has a variable length -> we cannot perform a static check instanceOidLength = -1; } } indexColumns.AppendFormat( " {0} ({1}, OID length = {2})\n", indexNode.Name, indexNode.DataType, (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable"); } if (indexColumns.Length > 0) { indexColumns.Length--; getInstanceMethod.Declarations.Insert(0, new Comment(String.Format( "The instance OID of this table consists of following (index) column(s):\n{0}", indexColumns))); } string augmentsHint = ""; if (!String.IsNullOrWhiteSpace(this.augmentedTableRow)) { augmentsHint = String.Format( "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" + "You may simply call the '*{1}' method of this table.\n\n", (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length - 5) : this.augmentedTableRow, LwipDefs.FnctSuffix_GetInstance); } CodeContainerBase ccb = getInstanceMethod; if (instanceOidLength > 0) { IfThenElse ite = new IfThenElse(String.Format("{0} == {1}", getInstanceMethod.Parameter[2].Name, instanceOidLength)); getInstanceMethod.AddElement(ite); ccb = ite; } ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[0].Name); ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[1].Name); if (instanceOidLength <= 0) { ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[2].Name); } ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[3].Name); ccb.AddElement(new Comment(String.Format( "TODO: check if '{0}'/'{1}' params contain a valid instance oid for a row\n" + "If so, set '{2} = {3};'\n\n" + "snmp_oid_* methods may be used for easier processing of oid\n\n" + "{4}" + "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" + "you may store an arbitrary value (like a pointer to target value object) in '{5}->reference'/'{5}->reference_len'.\n" + "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" + "You also may replace function pointers in '{5}' param for get/test/set methods which contain the default values from table definition,\n" + "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.", getInstanceMethod.Parameter[1].Name, getInstanceMethod.Parameter[2].Name, returnValue.Type.Name, LwipDefs.Def_ErrorCode_Ok, augmentsHint, getInstanceMethod.Parameter[3].Name ))); getInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name); }
protected virtual void GenerateGetNextInstanceMethodCode(Function getNextInstanceMethod) { getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[0].Name); getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[1].Name); getNextInstanceMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getNextInstanceMethod.Parameter[2].Name); VariableDeclaration returnValue = new VariableDeclaration((VariableType)getNextInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance); returnValue.Type.Name = "err"; getNextInstanceMethod.Declarations.Add(returnValue); StringBuilder indexColumns = new StringBuilder(); foreach (SnmpScalarNode indexNode in this.indexNodes) { indexColumns.AppendFormat( " {0} ({1}, OID length = {2})\n", indexNode.Name, indexNode.DataType, (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable"); } if (indexColumns.Length > 0) { indexColumns.Length--; getNextInstanceMethod.Declarations.Insert(0, new Comment(String.Format( "The instance OID of this table consists of following (index) column(s):\n{0}", indexColumns))); } string augmentsHint = ""; if (!String.IsNullOrWhiteSpace(this.augmentedTableRow)) { augmentsHint = String.Format( "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" + "You may simply call the '*{1}' method of this table.\n\n", (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length-5) : this.augmentedTableRow, LwipDefs.FnctSuffix_GetNextInstance); } getNextInstanceMethod.AddElement(new Comment(String.Format( "TODO: analyze '{0}->id'/'{0}->len' and return the subsequent row instance\n" + "Be aware that '{0}->id'/'{0}->len' must not point to a valid instance or have correct instance length.\n" + "If '{0}->len' is 0, return the first instance. If '{0}->len' is longer than expected, cut superfluous OID parts.\n" + "If a valid next instance is found, store it in '{0}->id'/'{0}->len' and set '{1} = {2};'\n\n" + "snmp_oid_* methods may be used for easier processing of oid\n\n" + "{3}" + "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" + "you may store an arbitrary value (like a pointer to target value object) in '{4}->reference'/'{4}->reference_len'.\n" + "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" + "You also may replace function pointers in '{4}' param for get/test/set methods which contain the default values from table definition,\n" + "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.", getNextInstanceMethod.Parameter[1].Name, returnValue.Type.Name, LwipDefs.Def_ErrorCode_Ok, augmentsHint, getNextInstanceMethod.Parameter[2].Name ))); getNextInstanceMethod.AddElement(new Comment(String.Format( "For easier processing and getting the next instance, you may use the 'snmp_next_oid_*' enumerator.\n" + "Simply pass all known instance OID's to it and it returns the next valid one:\n\n" + "{0} state;\n" + "{1} result_buf;\n" + "snmp_next_oid_init(&state, {2}->id, {2}->len, result_buf, LWIP_SNMP_OBJ_ID_LEN);\n" + "while ({{not all instances passed}}) {{\n" + " {1} test_oid;\n" + " {{fill test_oid to create instance oid for next instance}}\n" + " snmp_next_oid_check(&state, test_oid->id, test_oid->len, {{target_data_ptr}});\n" + "}}\n" + "if(state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {{\n" + " snmp_oid_assign(row_oid, result_buf->oid, result_buf->len);\n" + " {3}->reference.ptr = state.reference; //==target_data_ptr, for usage in subsequent get/test/set\n" + " {4} = {5};\n" + "}}" , LwipDefs.Vt_StNextOidState, LwipDefs.Vt_StObjectId, getNextInstanceMethod.Parameter[1].Name, getNextInstanceMethod.Parameter[2].Name, returnValue.Type.Name, LwipDefs.Def_ErrorCode_Ok ))); getNextInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name); }
protected virtual void GenerateGetInstanceMethodCode(Function getInstanceMethod) { VariableDeclaration returnValue = new VariableDeclaration((VariableType)getInstanceMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_NoSuchInstance); returnValue.Type.Name = "err"; getInstanceMethod.Declarations.Add(returnValue); int instanceOidLength = 0; StringBuilder indexColumns = new StringBuilder(); foreach (SnmpScalarNode indexNode in this.indexNodes) { if (instanceOidLength >= 0) { if (indexNode.OidRepresentationLen >= 0) { instanceOidLength += indexNode.OidRepresentationLen; } else { // at least one index column has a variable length -> we cannot perform a static check instanceOidLength = -1; } } indexColumns.AppendFormat( " {0} ({1}, OID length = {2})\n", indexNode.Name, indexNode.DataType, (indexNode.OidRepresentationLen >= 0) ? indexNode.OidRepresentationLen.ToString() : "variable"); } if (indexColumns.Length > 0) { indexColumns.Length--; getInstanceMethod.Declarations.Insert(0, new Comment(String.Format( "The instance OID of this table consists of following (index) column(s):\n{0}", indexColumns))); } string augmentsHint = ""; if (!String.IsNullOrWhiteSpace(this.augmentedTableRow)) { augmentsHint = String.Format( "This table augments table '{0}'! Index columns therefore belong to table '{0}'!\n" + "You may simply call the '*{1}' method of this table.\n\n", (this.augmentedTableRow.ToLowerInvariant().EndsWith("entry")) ? this.augmentedTableRow.Substring(0, this.augmentedTableRow.Length-5) : this.augmentedTableRow, LwipDefs.FnctSuffix_GetInstance); } CodeContainerBase ccb = getInstanceMethod; if (instanceOidLength > 0) { IfThenElse ite = new IfThenElse(String.Format("{0} == {1}", getInstanceMethod.Parameter[2].Name, instanceOidLength)); getInstanceMethod.AddElement(ite); ccb = ite; } ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[0].Name); ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[1].Name); if (instanceOidLength <= 0) { ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[2].Name); } ccb.AddCodeFormat("LWIP_UNUSED_ARG({0});", getInstanceMethod.Parameter[3].Name); ccb.AddElement(new Comment(String.Format( "TODO: check if '{0}'/'{1}' params contain a valid instance oid for a row\n" + "If so, set '{2} = {3};'\n\n" + "snmp_oid_* methods may be used for easier processing of oid\n\n" + "{4}" + "In order to avoid decoding OID a second time in subsequent get_value/set_test/set_value methods,\n" + "you may store an arbitrary value (like a pointer to target value object) in '{5}->reference'/'{5}->reference_len'.\n" + "But be aware that not always a subsequent method is called -> Do NOT allocate memory here and try to release it in subsequent methods!\n\n" + "You also may replace function pointers in '{5}' param for get/test/set methods which contain the default values from table definition,\n" + "in order to provide special methods, for the currently processed cell. Changed pointers are only valid for current request.", getInstanceMethod.Parameter[1].Name, getInstanceMethod.Parameter[2].Name, returnValue.Type.Name, LwipDefs.Def_ErrorCode_Ok, augmentsHint, getInstanceMethod.Parameter[3].Name ))); getInstanceMethod.AddCodeFormat("return {0};", returnValue.Type.Name); }
private void menuSubstraction_Click(object sender, RoutedEventArgs e) { Function.AddElement(FunctionOperator.Substraction, Position + 1); }