Exemple #1
0
        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);
        }
Exemple #2
0
        public override void GenerateCode(MibCFile mibFile)
        {
            string getMethodName;
            string testMethodName;
            string setMethodName;

            if (this.useExternalMethods)
            {
                getMethodName  = this.externalGetMethod;
                testMethodName = this.externalTestMethod;
                setMethodName  = this.externalSetMethod;
            }
            else
            {
                getMethodName  = LwipDefs.Null;
                testMethodName = LwipDefs.Null;
                setMethodName  = LwipDefs.Null;

                if ((this.accessMode == SnmpAccessMode.ReadWrite) || (this.accessMode == SnmpAccessMode.ReadOnly))
                {
                    FunctionDeclaration getMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_GetValue, isStatic: true);
                    getMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*"));
                    getMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
                    getMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_U16);
                    mibFile.Declarations.Add(getMethodDecl);

                    Function getMethod = Function.FromDeclaration(getMethodDecl);
                    getMethodName = getMethod.Name;

                    VariableDeclaration returnValue = new VariableDeclaration((VariableType)getMethod.ReturnType.Clone());
                    returnValue.Type.Name = "value_len";
                    getMethod.Declarations.Add(returnValue);
                    getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[0].Name);

                    bool valueVarUsed = false;
                    GenerateGetMethodCode(getMethod, getMethod.Parameter[1].Name, ref valueVarUsed, returnValue.Type.Name);
                    if (!valueVarUsed)
                    {
                        getMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", getMethod.Parameter[1].Name);
                    }

                    getMethod.AddCodeFormat("return {0};", returnValue.Type.Name);

                    mibFile.Implementation.Add(getMethod);
                }

                if ((this.accessMode == SnmpAccessMode.ReadWrite) || (this.accessMode == SnmpAccessMode.WriteOnly))
                {
                    bool valueVarUsed;
                    bool lenVarUsed;
                    VariableDeclaration returnValue;

                    if (this.restrictions.Count > 0)
                    {
                        FunctionDeclaration testMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_SetTest, isStatic: true);
                        testMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*"));
                        testMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16));
                        testMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
                        testMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
                        mibFile.Declarations.Add(testMethodDecl);

                        Function testMethod = Function.FromDeclaration(testMethodDecl);
                        testMethodName = testMethod.Name;

                        returnValue           = new VariableDeclaration((VariableType)testMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_WrongValue);
                        returnValue.Type.Name = "err";
                        testMethod.Declarations.Add(returnValue);
                        testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[0].Name);

                        valueVarUsed = false;
                        lenVarUsed   = false;

                        GenerateTestMethodCode(testMethod, testMethod.Parameter[2].Name, ref valueVarUsed, testMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name);

                        if (!valueVarUsed)
                        {
                            testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[2].Name);
                        }
                        if (!lenVarUsed)
                        {
                            testMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", testMethod.Parameter[1].Name);
                        }

                        testMethod.AddCodeFormat("return {0};", returnValue.Type.Name);

                        mibFile.Implementation.Add(testMethod);
                    }
                    else
                    {
                        testMethodName = LwipDefs.FnctName_SetTest_Ok;
                    }

                    FunctionDeclaration setMethodDecl = null;
                    setMethodDecl = new FunctionDeclaration(this.Name + LwipDefs.FnctSuffix_SetValue, isStatic: true);
                    setMethodDecl.Parameter.Add(new VariableType("instance", LwipDefs.Vt_StNodeInstance, "*"));
                    setMethodDecl.Parameter.Add(new VariableType("len", LwipDefs.Vt_U16));
                    setMethodDecl.Parameter.Add(new VariableType("value", VariableType.VoidString, "*"));
                    setMethodDecl.ReturnType = new VariableType(null, LwipDefs.Vt_Snmp_err);
                    mibFile.Declarations.Add(setMethodDecl);

                    Function setMethod = Function.FromDeclaration(setMethodDecl);
                    setMethodName = setMethod.Name;

                    returnValue           = new VariableDeclaration((VariableType)setMethod.ReturnType.Clone(), LwipDefs.Def_ErrorCode_Ok);
                    returnValue.Type.Name = "err";
                    setMethod.Declarations.Add(returnValue);
                    setMethod.AddCodeFormat("LWIP_UNUSED_ARG({0});", setMethod.Parameter[0].Name);

                    valueVarUsed = false;
                    lenVarUsed   = false;

                    GenerateSetMethodCode(setMethod, setMethod.Parameter[2].Name, ref valueVarUsed, setMethod.Parameter[1].Name, ref lenVarUsed, returnValue.Type.Name);

                    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.AddCodeFormat("return {0};", returnValue.Type.Name);

                    mibFile.Implementation.Add(setMethod);
                }
            }

            // create and add node declaration
            string nodeInitialization;

            if (this.accessMode == SnmpAccessMode.ReadOnly)
            {
                nodeInitialization = String.Format("SNMP_SCALAR_CREATE_NODE_READONLY({0}, {1}, {2})",
                                                   this.Oid,
                                                   LwipDefs.GetAsn1DefForSnmpDataType(this.dataType),
                                                   getMethodName);
            }
            else
            {
                nodeInitialization = String.Format("SNMP_SCALAR_CREATE_NODE({0}, {1}, {2}, {3}, {4}, {5})",
                                                   this.Oid,
                                                   LwipDefs.GetLwipDefForSnmpAccessMode(this.accessMode),
                                                   LwipDefs.GetAsn1DefForSnmpDataType(this.dataType),
                                                   getMethodName,
                                                   testMethodName,
                                                   setMethodName);
            }

            mibFile.Declarations.Add(new VariableDeclaration(
                                         new VariableType(this.FullNodeName, LwipDefs.Vt_StScalarNode, null, ConstType.Value),
                                         nodeInitialization, isStatic: true));
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
		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);
		}
Exemple #6
0
		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);
		}