public static void InjectBytes(out string byteString, byte[] inVal, string newLine, bool withTypeCast)
        {
            CodeProcessor cs = new CodeProcessor(new StringBuilder(),false);
            cs.NewLine = newLine;

            cs.Append("{"+cs.NewLine);

            bool _first = true;
            int _ctr=0;
            foreach(byte b in inVal)
            {
                if (_first==false)
                {
                    cs.Append(",");
                }
                else
                {
                    _first = false;
                }
                string hx = b.ToString("X");
                if (withTypeCast)
                {
                    cs.Append("(char)");
                }
                cs.Append("0x");

                if (hx.Length==1){cs.Append("0");}
                cs.Append(hx);

                ++_ctr;
                if (_ctr%(withTypeCast?10:20)==0)
                {
                    cs.Append(cs.NewLine);
                }
            }
            cs.Append(cs.NewLine+"}");

            byteString = cs.ToString();
        }
        protected static void BuildDeviceStructs(CodeProcessor cs, UPnPDevice d)
        {
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                BuildDeviceStructs(cs,ed);
            }
            cs.Append("struct UPnP_Device_"+d.User2.ToString()+cs.NewLine);
            cs.Append("{"+cs.NewLine);
            foreach(UPnPService s in d.Services)
            {
                cs.Append("	struct UPnP_Service_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+" *"+((ServiceGenerator.ServiceConfiguration)s.User).Name+";"+cs.NewLine);
            }
            cs.Append(cs.NewLine);
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                cs.Append("	struct UPnP_Device_"+ed.User2.ToString()+" *UPnP_Device_"+ed.User2.ToString()+";"+cs.NewLine);
            }
            cs.Append("	const char *FriendlyName;"+cs.NewLine);
            if (d.ParentDevice==null)
            {
                cs.Append("	const char *UDN;"+cs.NewLine);
                cs.Append("	const char *Serial;"+cs.NewLine);
            }
            cs.Append(" const char *Manufacturer;"+cs.NewLine);
            cs.Append(" const char *ManufacturerURL;"+cs.NewLine);
            cs.Append(" const char *ModelDescription;"+cs.NewLine);
            cs.Append(" const char *ModelName;"+cs.NewLine);
            cs.Append(" const char *ModelNumber;"+cs.NewLine);
            cs.Append(" const char *ModelURL;"+cs.NewLine);
            cs.Append("	const char *ProductCode;"+cs.NewLine);

            UPnPDevice[] embeddedDevices = d.EmbeddedDevices;
            UPnPService[] services = d.Services;

            d.EmbeddedDevices = new UPnPDevice[0];
            d.Services = new UPnPService[0];

            byte[] xml;
            if (d.Root)
            {
                xml = d.GetRootDeviceXML(null);
            }
            else
            {
                xml = (byte[])(new UPnPDebugObject(d)).InvokeNonStaticMethod("GetRootDeviceXML",new object[1]{null});
            }
            UTF8Encoding U = new UTF8Encoding();
            string xmlString = U.GetString(xml);
            string stringX;
            int stringXLen;
            InjectCompressedString(out stringX,out stringXLen,xmlString,cs.NewLine);
            d.EmbeddedDevices = embeddedDevices;
            d.Services = services;

            cs.Append("	char Reserved["+stringXLen.ToString()+"];"+cs.NewLine);
            cs.Append("	int ReservedXL;"+cs.NewLine);
            cs.Append("	int ReservedUXL;"+cs.NewLine);

            cs.Append("	void *User;"+cs.NewLine);
            if (d.ParentDevice==null)
            {
                cs.Append("	void *MicrostackToken;"+cs.NewLine);
            }
            cs.Append("};"+cs.NewLine);
        }
        protected static void PopulateStateVariableStructs(CodeProcessor cs, UPnPDevice d, Hashtable VarTable)
        {
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                PopulateStateVariableStructs(cs,ed,VarTable);
            }
            foreach(UPnPService s in d.Services)
            {
                cs.Append("struct UPnP_StateVariableTable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+" UPnP_StateVariableTable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_Impl = "+cs.NewLine);
                cs.Append("{"+cs.NewLine);
                string stringX;
                int stringXLen;
                StringBuilder sb = new StringBuilder();
                StringWriter SW = new StringWriter(sb);
                XmlTextWriter X = new XmlTextWriter(SW);

                foreach(UPnPStateVariable v in s.GetStateVariables())
                {
                    UPnPDebugObject dobj = new UPnPDebugObject(v);
                    dobj.InvokeNonStaticMethod("GetStateVariableXML",new object[1]{X});
                }
                X.Flush();
                InjectCompressedString(out stringX,out stringXLen,sb.ToString(),cs.NewLine);
                cs.Append("	"+stringX+","+cs.NewLine);
                cs.Append("	"+stringXLen.ToString()+","+cs.NewLine);
                cs.Append("	"+sb.Length.ToString()+cs.NewLine);
                cs.Append("};"+cs.NewLine);

                foreach(UPnPStateVariable v in s.GetStateVariables())
                {
                    Hashtable t = (Hashtable)VarTable[s];
                    int startingIndex = (int)((object[])t[v])[0];
                    string varString = (string)((object[])t[v])[2];

                    cs.Append("struct UPnP_StateVariable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+v.Name+" UPnP_StateVariable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+v.Name+"_Impl = "+cs.NewLine);
                    cs.Append("{"+cs.NewLine);
                    cs.Append("	"+startingIndex.ToString()+","+cs.NewLine); // Start Index
                    cs.Append("	"+(varString.IndexOf("</dataType>")+11).ToString()+","+cs.NewLine);

                    if (v.AllowedStringValues!=null)
                    {
                        int avlen=0;
                        foreach(string avs in v.AllowedStringValues)
                        {
                            avlen += avs.Length;
                        }
                        cs.Append("	"+(varString.IndexOf("<allowedValueList>")+startingIndex).ToString()+","+cs.NewLine); // Start of Allowed Value List
                        cs.Append("	18,"+cs.NewLine); // Length of allowedValueList
                        cs.Append("	"+(varString.IndexOf("</allowedValueList>")+startingIndex).ToString()+","+cs.NewLine); // Start of endTag
                        cs.Append("	19,"+cs.NewLine); // Length of end tag
                        cs.Append("	{");
                        foreach(string av in v.AllowedStringValues)
                        {
                            cs.Append("\""+av+"\",");
                        }
                        cs.Append("NULL");
                        cs.Append("}");
                    }
                    if (v.Minimum!=null || v.Maximum!=null)
                    {
                        if (v.AllowedStringValues!=null)
                        {
                            cs.Append(","+cs.NewLine);
                        }

                        cs.Append("	"+(startingIndex+varString.IndexOf("<allowedValueRange>")).ToString()+","+cs.NewLine);
                        cs.Append("	19,"+cs.NewLine);
                        cs.Append("	"+(startingIndex+varString.IndexOf("</allowedValueRange>")).ToString()+","+cs.NewLine);
                        cs.Append("	20,"+cs.NewLine);
                        cs.Append("	{");
                        if (v.Minimum!=null)
                        {
                            cs.Append("\""+v.Minimum.ToString()+"\",");
                        }
                        else
                        {
                            cs.Append("NULL,");
                        }
                        if (v.Maximum!=null)
                        {
                            cs.Append("\""+v.Maximum.ToString()+"\",");
                        }
                        else
                        {
                            cs.Append("NULL,");
                        }
                        if (v.Step!=null)
                        {
                            cs.Append("\""+v.Step.ToString()+"\"");
                        }
                        else
                        {
                            cs.Append("NULL");
                        }
                        cs.Append("}");
                    }
                    if (v.DefaultValue!=null)
                    {
                        if (v.AllowedStringValues!=null || v.Maximum!=null || v.Maximum!=null)
                        {
                            cs.Append(","+cs.NewLine);
                        }
                        cs.Append("	"+(startingIndex+varString.IndexOf("<defaultValue>")).ToString()+","+cs.NewLine);
                        cs.Append("	14,"+cs.NewLine);
                        cs.Append("	"+(startingIndex+varString.IndexOf("</defaultValue>")).ToString()+","+cs.NewLine);
                        cs.Append("	15,"+cs.NewLine);
                        cs.Append("\""+UPnPService.SerializeObjectInstance(v.DefaultValue)+"\"");
                    }
                    if (v.DefaultValue!=null || v.AllowedStringValues!=null || v.Maximum!=null || v.Maximum!=null)
                    {
                        cs.Append(","+cs.NewLine);
                    }
                    cs.Append((varString.IndexOf("</stateVariable>")+startingIndex).ToString()+","+cs.NewLine);
                    cs.Append("	16"+cs.NewLine);

                    cs.Append("};"+cs.NewLine);
                }
            }
        }
        public static string GetDeviceObjectsString(UPnPDevice d)
        {
            CodeProcessor cs = new CodeProcessor(new StringBuilder(),false);
            cs.NewLine = "\r\n";

            //
            // Calculate the size to initialize "UPnP_StateVariable_AllowedValues_MAX"
            //
            int max = CalculateMaxAllowedValues(d,0);

            if (max!=0)
            {
                ++max;
                cs.Append("#define UPnP_StateVariable_AllowedValues_MAX "+max+cs.NewLine);
            }

            BuildStateVariableStructs(cs,d);
            BuildActionStructs(cs,d);
            BuildServiceStructs(cs,d);
            BuildDeviceStructs(cs,d);

            return(cs.ToString());
        }
 private void TypeCheckURI(CodeProcessor cs, UPnPArgument args)
 {
     cs.Append("	TempParser = " + pc_methodLibPrefix + "ParseString(p_" + args.Name + ", 0, p_" + args.Name + "Length, \"://\",3);" + cl);
     cs.Append("	if (TempParser->NumResults!=2)" + cl);
     cs.Append("	{" + cl);
     if (Configuration.ExplicitErrorEncoding == true)
     {
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Argument[" + args.Name + "] illegal format\");" + cl);
     }
     else
     {
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Illegal value\");" + cl);
     }
     cs.Append("		" + this.pc_methodLibPrefix + "DestructParserResults(TempParser);" + cl);
     cs.Append("		return;" + cl);
     cs.Append("	}" + cl);
     cs.Append("	else" + cl);
     cs.Append("	{" + cl);
     cs.Append("		_" + args.Name + " = p_" + args.Name + ";" + cl);
     cs.Append("		_" + args.Name + "Length = p_" + args.Name + "Length;" + cl);
     cs.Append("		" + this.pc_methodLibPrefix + "DestructParserResults(TempParser);" + cl);
     cs.Append("	}" + cl);
 }
        protected static void PopulateActionStructs(CodeProcessor cs, UPnPDevice d, Hashtable VarTable)
        {
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                PopulateActionStructs(cs,ed,VarTable);
            }
            foreach(UPnPService s in d.Services)
            {
                cs.Append("struct UPnP_ActionTable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+" UPnP_ActionTable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_Impl = "+cs.NewLine);
                cs.Append("{"+cs.NewLine);
                string stringX;
                int stringXLen;
                StringBuilder sb = new StringBuilder();
                StringWriter SW = new StringWriter(sb);
                XmlTextWriter X = new XmlTextWriter(SW);

                foreach(UPnPAction a in s.Actions)
                {
                    UPnPDebugObject dobj = new UPnPDebugObject(a);
                    dobj.InvokeNonStaticMethod("GetXML",new object[1]{X});
                }
                X.Flush();
                InjectCompressedString(out stringX,out stringXLen,sb.ToString(),cs.NewLine);
                cs.Append("	"+stringX+","+cs.NewLine);
                cs.Append("	"+stringXLen.ToString()+","+cs.NewLine);
                cs.Append("	"+sb.Length.ToString()+cs.NewLine);
                cs.Append("};"+cs.NewLine);

                foreach(UPnPAction a in s.Actions)
                {
                    Hashtable t = (Hashtable)VarTable[s];

                    cs.Append("struct UPnP_Action_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+a.Name+" UPnP_Action_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+a.Name+"_Impl = "+cs.NewLine);
                    cs.Append("{"+cs.NewLine);
                    cs.Append("	"+((object[])t[a])[0].ToString()+","+cs.NewLine);
                    cs.Append("	"+((object[])t[a])[1].ToString()+cs.NewLine);
                    cs.Append("};"+cs.NewLine);
                }
            }
        }
        private void Build_DispatchMethods(CodeProcessor cs, Hashtable serviceNames)
        {
            SortedList SL = new SortedList();

            IDictionaryEnumerator en = serviceNames.GetEnumerator();
            UPnPService service;
            string name;

            while (en.MoveNext())
            {
                SL[en.Value] = en.Key;
            }

            en = SL.GetEnumerator();

            while (en.MoveNext())
            {
                int numArgs = 0;
                service = (UPnPService)en.Value;
                name = (string)en.Key;
                foreach (UPnPAction action in service.Actions)
                {
                    numArgs = 0;
                    foreach (UPnPArgument args in action.ArgumentList)
                    {
                        if (args.Direction == "in") { ++numArgs; }
                    }

                    // Define a macro version
                    if (numArgs == 0)
                    {
                        cs.Define("#define " + pc_methodPrefixDef + "Dispatch_" + name + "_" + action.Name + "(buffer,offset,bufferLength, session)\\");
                        cs.Append("{\\" + cl);
                        if (name != "DeviceSecurity")
                        {
                            if (Configuration.EXTERN_Callbacks == false)
                            {
                                cs.Append("	if (" + pc_methodPrefix + "FP_" + name + "_" + action.Name + " == NULL)\\" + cl);
                                cs.Append("		" + pc_methodPrefix + "Response_Error(session,501,\"No Function Handler\");\\" + cl);
                                cs.Append("	else\\" + cl);
                                cs.Append("		" + pc_methodPrefix + "FP_" + name + "_" + action.Name + "((void*)session);\\" + cl);
                            }
                            else
                            {
                                cs.Append("	" + pc_methodPrefix + name + "_" + action.Name + "((void*)session);\\" + cl);
                            }
                        }
                        else
                        {
                            cs.Append("	" + pc_methodLibPrefix + name + "_" + action.Name + "((void*)session);\\" + cl);
                        }
                        cs.Append("}" + cl);
                        cs.Append(cl);
                    }

                    if (numArgs > 0)
                    {
                        cs.Define("void " + pc_methodPrefixDef + "Dispatch_" + name + "_" + action.Name + "(char *buffer, int offset, int bufferLength, struct " + this.pc_methodLibPrefix + "WebServer_Session *ReaderObject)");
                        cs.Append("{" + cl);

                        bool varlong = false;
                        bool varlongtemp = false;
                        bool varulong = false;
                        bool varulongtemp = false;
                        bool varuuri = false;
                        bool varok = false;
                        foreach (UPnPArgument args in action.ArgumentList)
                        {
                            if (args.Direction == "in")
                            {
                                varok = true;
                                switch (args.RelatedStateVar.GetNetType().ToString())
                                {
                                    case "System.Uri":
                                        varuuri = true;
                                        break;
                                    case "System.Byte":
                                    case "System.UInt16":
                                    case "System.UInt32":
                                        varulong = true;
                                        if (args.RelatedStateVar.Maximum != null || args.RelatedStateVar.Minimum != null)
                                        {
                                            varulongtemp = true;
                                        }
                                        break;
                                    case "System.SByte":
                                    case "System.Int16":
                                    case "System.Int32":
                                        varlong = true;
                                        if (args.RelatedStateVar.Maximum != null || args.RelatedStateVar.Minimum != null)
                                        {
                                            varlongtemp = true;
                                        }
                                        break;
                                    case "System.Boolean":
                                    case "System.Char":
                                    case "System.Single":
                                    case "System.Double":
                                    case "System.Byte[]":
                                    case "System.String":
                                        break;
                                }
                            }
                        }

                        //cs.Append("	char *TempString;"+cl);
                        if (varlong == true)
                        {
                            cs.Append("	long TempLong;" + cl);
                            if (varlongtemp && Configuration.DynamicObjectModel)
                            {
                                cs.Append("	long TempLong2;" + cl);
                            }
                        }
                        if (varulong == true)
                        {
                            cs.Append("	unsigned long TempULong;" + cl);
                            if (varulongtemp && Configuration.DynamicObjectModel)
                            {
                                cs.Append("	unsigned long TempULong2;" + cl);
                            }
                        }
                        if (varuuri == true) cs.Append("	struct parser_result *TempParser;" + cl);
                        if (varok == true) cs.Append("	int OK = 0;" + cl);

                        //cs.Comment("Service Variables");

                        foreach (UPnPArgument args in action.ArgumentList)
                        {
                            if (args.Direction == "in")
                            {
                                cs.Append("	char *p_" + args.Name + " = NULL;" + cl);
                                cs.Append("	int p_" + args.Name + "Length = 0;" + cl);
                                if (args.RelatedStateVar.ComplexType == null)
                                {
                                    cs.Append("	" + ToCType(args.RelatedStateVar.GetNetType().FullName) + " _" + args.Name + " = " + ToEmptyValue(args.RelatedStateVar.GetNetType().FullName) + ";" + cl);
                                    if (ToCType(args.RelatedStateVar.GetNetType().FullName) == "char*" || ToCType(args.RelatedStateVar.GetNetType().FullName) == "unsigned char*")
                                    {
                                        cs.Append("	int _" + args.Name + "Length;" + cl);
                                    }
                                }
                                else
                                {
                                    cs.Append(" struct " + args.RelatedStateVar.ComplexType.Name_LOCAL + " *_" + args.Name + "=NULL;" + cl);
                                }
                            }
                        }

                        //
                        // Setup the XML Parsing
                        //
                        cs.Append("	struct " + this.pc_methodLibPrefix + "XMLNode *xnode = " + this.pc_methodLibPrefix + "ParseXML(buffer, offset, bufferLength);" + cl);
                        cs.Append("	struct " + this.pc_methodLibPrefix + "XMLNode *root = xnode;" + cl);
                        foreach (UPnPArgument args in action.ArgumentList)
                        {
                            if (args.Direction == "in" && args.RelatedStateVar.ComplexType != null)
                            {
                                cs.Append("	struct " + this.pc_methodLibPrefix + "XMLNode *tnode, *tnode_root;" + cl);
                                cs.Append("	char* tempText;" + cl);
                                cs.Append("	int tempTextLength;" + cl);
                                break;
                            }
                        }
                        cs.Append("	if (" + this.pc_methodLibPrefix + "ProcessXMLNodeList(root)!=0)" + cl);
                        cs.Append("	{" + cl);
                        cs.Comment("The XML is not well formed!");
                        cs.Append("	" + this.pc_methodLibPrefix + "DestructXMLNodeList(root);" + cl);
                        cs.Append("	" + this.pc_methodPrefix + "Response_Error(ReaderObject, 501, \"Invalid XML\");" + cl);
                        cs.Append("	return;" + cl);
                        cs.Append("	}" + cl);

                        cs.Append("	while(xnode != NULL)" + cl);
                        cs.Append("	{" + cl);
                        cs.Append("		if (xnode->StartTag != 0 && xnode->NameLength == 8 && memcmp(xnode->Name, \"Envelope\", 8)==0)" + cl);
                        cs.Append("		{" + cl);
                        cs.Append("			// Envelope" + cl);
                        cs.Append("			xnode = xnode->Next;" + cl);
                        cs.Append("			while(xnode != NULL)" + cl);
                        cs.Append("			{" + cl);
                        cs.Append("				if (xnode->StartTag!=0 && xnode->NameLength == 4 && memcmp(xnode->Name, \"Body\", 4) == 0)" + cl);
                        cs.Append("				{" + cl);
                        cs.Append("					// Body" + cl);
                        cs.Append("					xnode = xnode->Next;" + cl);
                        cs.Append("					while(xnode != NULL)" + cl);
                        cs.Append("					{" + cl);
                        cs.Append("						if (xnode->StartTag != 0 && xnode->NameLength == " + action.Name.Length.ToString() + " && memcmp(xnode->Name, \"" + action.Name + "\"," + action.Name.Length.ToString() + ") == 0)" + cl);
                        cs.Append("						{" + cl);
                        cs.Append("							// Inside the interesting part of the SOAP" + cl);
                        cs.Append("							xnode = xnode->Next;" + cl);
                        cs.Append("							while(xnode != NULL)" + cl);
                        cs.Append("							{" + cl);

                        int argflag = 1;
                        string eLsE = "";
                        foreach (UPnPArgument arg in action.ArgumentList)
                        {
                            if (arg.Direction == "in")
                            {
                                cs.Append("								" + eLsE + "if (xnode->NameLength == " + arg.Name.Length.ToString() + " && memcmp(xnode->Name, \"" + arg.Name + "\"," + arg.Name.Length.ToString() + ")==0)" + cl);
                                cs.Append("								{" + cl);
                                if (arg.RelatedStateVar.ComplexType == null)
                                {
                                    cs.Append("									p_" + arg.Name + "Length = " + this.pc_methodLibPrefix + "ReadInnerXML(xnode, &p_" + arg.Name + ");" + cl);
                                    if ((arg.RelatedStateVar.GetNetType().FullName == "System.String") || (arg.RelatedStateVar.GetNetType().FullName == "System.Uri"))
                                    {
                                        cs.Append("									p_" + arg.Name + "[p_" + arg.Name + "Length]=0;" + cl);
                                    }
                                }
                                else
                                {
                                    // Complex Type
                                    cs.Append("									tempTextLength = " + this.pc_methodLibPrefix + "ReadInnerXML(xnode, &tempText);" + cl);
                                    cs.Append("									tempText[tempTextLength] = 0;" + cl);
                                    cs.Append("									if (ReaderObject->Reserved9 == 0)" + cl);
                                    cs.Append("									{" + cl);
                                    cs.Append("										// Legacy" + cl);
                                    cs.Append("										tempTextLength = " + this.pc_methodLibPrefix + "InPlaceXmlUnEscape(tempText);" + cl);
                                    cs.Append("										tnode_root = tnode = " + this.pc_methodLibPrefix + "ParseXML(tempText,0,tempTextLength);" + cl);
                                    cs.Append("										" + this.pc_methodLibPrefix + "ProcessXMLNodeList(tnode_root);" + cl);
                                    cs.Append("										_" + arg.Name + " = " + this.pc_methodPrefix + "Parse_" + arg.RelatedStateVar.ComplexType.Name_LOCAL + "(tnode);" + cl);
                                    cs.Append("										" + this.pc_methodLibPrefix + "DestructXMLNodeList(tnode_root);" + cl);
                                    cs.Append("									}" + cl);
                                    cs.Append("									else" + cl);
                                    cs.Append("									{" + cl);
                                    cs.Append("										// UPnP/1.1 Enabled" + cl);
                                    cs.Append("										_" + arg.Name + " = " + this.pc_methodPrefix + "Parse_" + arg.RelatedStateVar.ComplexType.Name_LOCAL + "(xnode->Next);" + cl);
                                    cs.Append("									}" + cl);
                                }
                                cs.Append("										OK |= " + argflag + ";" + cl);
                                argflag = argflag << 1;
                                cs.Append("								}" + cl);
                                eLsE = "else ";
                            }
                        }

                        cs.Append("								if (xnode->Peer == NULL)" + cl);
                        cs.Append("								{" + cl);
                        cs.Append("									xnode = xnode->Parent;" + cl);
                        cs.Append("									break;" + cl);
                        cs.Append("								}" + cl);
                        cs.Append("								else" + cl);
                        cs.Append("								{" + cl);
                        cs.Append("									xnode = xnode->Peer;" + cl);
                        cs.Append("								}" + cl);

                        cs.Append("							}" + cl);
                        cs.Append("						}" + cl);
                        cs.Append("						if (xnode != NULL)" + cl);
                        cs.Append("						{" + cl);
                        cs.Append("							if (xnode->Peer == NULL)" + cl);
                        cs.Append("							{" + cl);
                        cs.Append("								xnode = xnode->Parent;" + cl);
                        cs.Append("								break;" + cl);
                        cs.Append("							}" + cl);
                        cs.Append("							else" + cl);
                        cs.Append("							{" + cl);
                        cs.Append("								xnode = xnode->Peer;" + cl);
                        cs.Append("							}" + cl);
                        cs.Append("						}" + cl);
                        cs.Append("					}" + cl);
                        cs.Append("				}" + cl);
                        cs.Append("				if (xnode != NULL)" + cl);
                        cs.Append("				{" + cl);
                        cs.Append("					if (xnode->Peer == NULL)" + cl);
                        cs.Append("					{" + cl);
                        cs.Append("						xnode = xnode->Parent;" + cl);
                        cs.Append("						break;" + cl);
                        cs.Append("					}" + cl);
                        cs.Append("					else" + cl);
                        cs.Append("					{" + cl);
                        cs.Append("						xnode = xnode->Peer;" + cl);
                        cs.Append("					}" + cl);
                        cs.Append("				}" + cl);
                        cs.Append("			}" + cl);
                        cs.Append("		}" + cl);
                        cs.Append("		if (xnode != NULL){xnode = xnode->Peer;}" + cl);
                        cs.Append("	}" + cl);
                        cs.Append("	" + this.pc_methodLibPrefix + "DestructXMLNodeList(root);" + cl);

                        cs.Append("	if (OK != " + (argflag - 1) + ")" + cl);
                        cs.Append("	{" + cl);
                        if (Configuration.ExplicitErrorEncoding == true)
                        {
                            cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, \"Incorrect Arguments\");" + cl);
                        }
                        else
                        {
                            cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, \"Illegal value\");" + cl);
                        }
                        cs.Append("		return;" + cl);
                        cs.Append("	}" + cl);
                        cs.Append(cl);

                        cs.Comment("Type Checking");

                        foreach (UPnPArgument args in action.ArgumentList)
                        {
                            if (args.Direction == "in")
                            {
                                switch (args.RelatedStateVar.GetNetType().FullName)
                                {
                                    case "System.Boolean":
                                        TypeCheckBoolean(cs, args);
                                        break;
                                    case "System.Int16":
                                    case "System.Int32":
                                    case "System.UInt16":
                                    case "System.UInt32":
                                    case "System.Byte":
                                    case "System.SByte":
                                        TypeCheckIntegral(cs, args);
                                        break;
                                    case "System.Uri":
                                        TypeCheckURI(cs, args);
                                        break;
                                    case "System.DateTime":
                                        TypeCheckDateTime(cs, args);
                                        break;
                                    case "System.Byte[]":
                                        cs.Append("	_" + args.Name + "Length = " + this.pc_methodLibPrefix + "Base64Decode(p_" + args.Name + ",p_" + args.Name + "Length,&_" + args.Name + ");" + cl);
                                        break;
                                    case "System.String":
                                    default:
                                        if (args.RelatedStateVar.ComplexType == null)
                                        {
                                            TypeCheckString(cs, args);
                                        }
                                        break;
                                }
                            }
                        }

                        string FPtrType = "(void (__cdecl *)(void *";
                        foreach (UPnPArgument arg in action.Arguments)
                        {
                            if (arg.Direction == "in")
                            {
                                FPtrType += ("," + ToCType(arg.RelatedStateVar.GetNetType().ToString()));
                            }
                        }
                        FPtrType += "))";

                        if (name != "DeviceSecurity")
                        {
                            if (Configuration.EXTERN_Callbacks == false)
                            {
                                cs.Append("	if (" + pc_methodPrefix + "FP_" + name + "_" + action.Name + " == NULL)" + cl);
                                cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,501,\"No Function Handler\");" + cl);
                                cs.Append("	else" + cl);
                                cs.Append("		" + pc_methodPrefix + "FP_" + name + "_" + action.Name + "((void*)ReaderObject");
                            }
                            else
                            {
                                cs.Append("	" + pc_methodPrefix + name + "_" + action.Name + "((void*)ReaderObject");
                            }
                        }
                        else
                        {
                            cs.Append("	" + pc_methodLibPrefix + name + "_" + action.Name + "((void*)ReaderObject");
                        }
                        foreach (UPnPArgument args in action.ArgumentList)
                        {
                            if (args.Direction == "in")
                            {
                                cs.Append(",_" + args.Name);
                                if (args.RelatedStateVar.GetNetType().FullName == "System.Byte[]")
                                {
                                    cs.Append(",_" + args.Name + "Length");
                                }
                            }
                        }

                        cs.Append(");" + cl);

                        foreach (UPnPArgument args in action.ArgumentList)
                        {
                            if (args.Direction == "in")
                            {
                                if (args.RelatedStateVar.GetNetType().FullName == "System.Byte[]")
                                {
                                    cs.Append("free(_" + args.Name + ");" + cl);
                                }
                            }
                        }

                        cs.Append("}" + cl);
                        cs.Append(cl);
                    }
                }
            }
        }
 private void AddLicense(CodeProcessor cs,string filename)
 {
     string l = License;
     l = l.Replace("<FILE>",filename);
     cs.Append(l);
 }
        private void RunCShrapCode()
        {
            CodeProcessor SCT = new CodeProcessor();

            SCT.runcode();
        }
Beispiel #10
0
 public static void ClassInitialize(TestContext TestContext)
 {
     mCodeProcessor = new CodeProcessor();
     // warmup CodeProcessor
     mCodeProcessor.EvalExpression("1+1");
 }
Beispiel #11
0
        void RunCode()
        {
            CodeProcessor SCT = new CodeProcessor();

            SCT.runcode();
        }
Beispiel #12
0
 public void Execute(RunsetExecutor runsetExecutor)
 {
     var rc = CodeProcessor.ExecuteNew(mScriptFile);
 }
        public void TestCodeProcessor_ProcessFileCode_Structure()
        {
            CodeProcessor codeProcessor;
            ProgramFile   expectedProgramFile;
            ProgramClassTypeCollection expectedProgramClassTypeCollection = new ProgramClassTypeCollection();
            FileProcessor fileProcessorForActual;
            ProgramFile   actualProgramFile;
            ProgramClassTypeCollection actualProgramClassTypeCollection = new ProgramClassTypeCollection();

            ProgramClassType tempProgramClassType;
            List <string>    empty = new List <string>();

            string filePath = Path.GetFullPath("..\\..\\..\\CodeAnalyzerTests\\TestInputFiles\\TestInputFile.cs");
            string fileName = "TestInputFile.cs";
            string fileText = "";

            if (File.Exists(filePath))
            {
                fileText = File.ReadAllText(filePath);
            }

            expectedProgramFile  = new ProgramFile(filePath, fileName, fileText);
            tempProgramClassType = new ProgramInterface("IAnimalActions", empty, empty);
            expectedProgramFile.ChildList.Add(tempProgramClassType);
            expectedProgramClassTypeCollection.Add(tempProgramClassType);
            tempProgramClassType = new ProgramInterface("IHumanActions", empty, empty);
            expectedProgramFile.ChildList.Add(tempProgramClassType);
            expectedProgramClassTypeCollection.Add(tempProgramClassType);
            tempProgramClassType = new ProgramClass("Animal", empty, empty);
            tempProgramClassType.ChildList.Add(new ProgramFunction("Animal", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("Move", empty, empty, empty, empty, empty));
            expectedProgramFile.ChildList.Add(tempProgramClassType);
            expectedProgramClassTypeCollection.Add(tempProgramClassType);
            tempProgramClassType = new ProgramClass("Pet", empty, empty);
            tempProgramClassType.ChildList.Add(new ProgramFunction("Pet", empty, empty, empty, empty, empty));
            expectedProgramFile.ChildList.Add(tempProgramClassType);
            expectedProgramClassTypeCollection.Add(tempProgramClassType);
            tempProgramClassType = new ProgramClass("Dog", empty, empty);
            tempProgramClassType.ChildList.Add(new ProgramFunction("Dog", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("Talk", empty, empty, empty, empty, empty));
            expectedProgramFile.ChildList.Add(tempProgramClassType);
            expectedProgramClassTypeCollection.Add(tempProgramClassType);
            tempProgramClassType = new ProgramClass("Human", empty, empty);
            tempProgramClassType.ChildList.Add(new ProgramFunction("Human", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("Talk", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("Move", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("GoToSchool", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("GraduateSchool", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("GoToWork", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("BuyPet", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("BuyDog", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("BuyCar", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("SellCar", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("FillCarFuelTank", empty, empty, empty, empty, empty));
            expectedProgramFile.ChildList.Add(tempProgramClassType);
            expectedProgramClassTypeCollection.Add(tempProgramClassType);
            tempProgramClassType = new ProgramClass("Car", empty, empty);
            tempProgramClassType.ChildList.Add(new ProgramFunction("Car", empty, empty, empty, empty, empty));
            tempProgramClassType.ChildList.Add(new ProgramFunction("FillTank", empty, empty, empty, empty, empty));
            expectedProgramFile.ChildList.Add(tempProgramClassType);
            expectedProgramClassTypeCollection.Add(tempProgramClassType);

            actualProgramFile      = new ProgramFile(filePath, fileName, fileText);
            fileProcessorForActual = new FileProcessor(actualProgramFile);
            fileProcessorForActual.ProcessFile();
            codeProcessor = new CodeProcessor(actualProgramFile, actualProgramClassTypeCollection);
            codeProcessor.ProcessFileCode();

            CheckAllChildLists(expectedProgramFile, actualProgramFile);
            CollectionAssert.AreEqual(expectedProgramClassTypeCollection, actualProgramClassTypeCollection);
        }
        protected static void BuildStateVariableStructs(CodeProcessor cs, UPnPDevice d)
        {
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                BuildStateVariableStructs(cs,ed);
            }
            foreach(UPnPService s in d.Services)
            {
                string stringX;
                int stringXLen;
                StringBuilder sb = new StringBuilder();
                StringWriter SW = new StringWriter(sb);
                XmlTextWriter X = new XmlTextWriter(SW);

                foreach(UPnPStateVariable v in s.GetStateVariables())
                {
                    UPnPDebugObject dobj = new UPnPDebugObject(v);
                    dobj.InvokeNonStaticMethod("GetStateVariableXML",new object[1]{X});
                }
                InjectCompressedString(out stringX,out stringXLen,sb.ToString(),cs.NewLine);

                cs.Append("struct UPnP_StateVariableTable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+cs.NewLine);
                cs.Append("{"+cs.NewLine);
                cs.Append("	char Reserved["+stringXLen.ToString()+"];"+cs.NewLine);
                cs.Append("	int ReservedXL;"+cs.NewLine);
                cs.Append("	int ReservedUXL;"+cs.NewLine);
                cs.Append("};"+cs.NewLine);

                foreach(UPnPStateVariable v in s.GetStateVariables())
                {
                    cs.Append("struct UPnP_StateVariable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+v.Name+cs.NewLine);
                    cs.Append("{"+cs.NewLine);
                    cs.Append("	int Reserved1;"+cs.NewLine);
                    cs.Append("	int Reserved1L;"+cs.NewLine);
                    if (v.AllowedStringValues!=null)
                    {
                        cs.Append("	int Reserved2;"+cs.NewLine);
                        cs.Append("	int Reserved2L;"+cs.NewLine);
                        cs.Append("	int Reserved3;"+cs.NewLine);
                        cs.Append("	int Reserved3L;"+cs.NewLine);
                        cs.Append("	char *AllowedValues[UPnP_StateVariable_AllowedValues_MAX];"+cs.NewLine);
                    }
                    if (v.Minimum!=null || v.Maximum!=null)
                    {
                        cs.Append("	int Reserved4;"+cs.NewLine);
                        cs.Append("	int Reserved4L;"+cs.NewLine);
                        cs.Append("	int Reserved5;"+cs.NewLine);
                        cs.Append("	int Reserved5L;"+cs.NewLine);
                        cs.Append("	char *MinMaxStep[3];"+cs.NewLine);
                    }
                    if (v.DefaultValue!=null)
                    {
                        cs.Append("	int Reserved6;"+cs.NewLine);
                        cs.Append("	int Reserved6L;"+cs.NewLine);
                        cs.Append("	int Reserved7;"+cs.NewLine);
                        cs.Append("	int Reserved7L;"+cs.NewLine);
                        cs.Append("	char *DefaultValue;"+cs.NewLine);
                    }
                    cs.Append("	int Reserved8;"+cs.NewLine);
                    cs.Append("	int Reserved8L;"+cs.NewLine);
                    cs.Append("};"+cs.NewLine);
                }
            }
        }
        public static void BuildComplexTypeParser_Collection(string cx, Hashtable SequenceTable, Hashtable ChoiceTable, ref int SeqX, ref int ChoX, CodeProcessor cs, UPnPComplexType.ItemCollection ic, string pc_methodPrefix)
        {
            int x = 0;
            string prefix = "";
            int SeqX2 = 0;
            int ChoX2 = 0;

            if (ic.GetType() == typeof(UPnPComplexType.Sequence))
            {
                ++SeqX;
                if (cx == "")
                {
                    cx += "_sequence_" + SeqX.ToString();
                }
                else
                {
                    cx += "->_sequence_" + SeqX.ToString();
                }
                prefix = cx + "->";
            }
            else if (ic.GetType() == typeof(UPnPComplexType.Choice))
            {
                ++ChoX;
                if (cx == "")
                {
                    cx += "_choice_" + ChoX.ToString();
                }
                else
                {
                    cx += "->_choice_" + ChoX.ToString();
                }
                prefix = cx + "->";
            }

            foreach (UPnPComplexType.ContentData cd in ic.Items)
            {
                ++x;
                cs.Append("	if (node->NameLength==" + cd.Name.Length.ToString() + " && memcmp(node->Name,\"" + cd.Name + "\"," + cd.Name.Length.ToString() + ")==0)" + cl);
                cs.Append("	{" + cl);
                if (x == 1)
                {
                    Stack st = new Stack();
                    UPnPComplexType.ItemCollection tc = ic;
                    DText pp = new DText();
                    pp.ATTRMARK = "->";
                    pp[0] = cx;
                    int ppx = pp.DCOUNT();
                    while (tc != null)
                    {
                        string ps;

                        ps = "RetVal";
                        for (int i = 1; i <= ppx; ++i)
                        {
                            ps += ("->" + pp[i]);
                        }
                        st.Push(new object[2] { ps, tc });
                        --ppx;
                        tc = tc.ParentCollection;
                    }
                    while (st.Count > 0)
                    {
                        object[] foo = (object[])st.Pop();
                        cs.Append("	if (" + (string)foo[0] + " == NULL)" + cl);
                        cs.Append("	{" + cl);
                        if (foo[1].GetType() == typeof(UPnPComplexType.Sequence))
                        {
                            cs.Append("	if ((" + (string)foo[0] + " = (struct SEQUENCE_" + SequenceTable[foo[1]].ToString() + "*)malloc(sizeof(struct SEQUENCE_" + SequenceTable[foo[1]].ToString() + "))) == NULL) ILIBCRITICALEXIT(254);" + cl);
                            cs.Append("	memset(" + (string)foo[0] + ",0,sizeof(struct SEQUENCE_" + SequenceTable[foo[1]].ToString() + "));" + cl);
                        }
                        else if (foo[1].GetType() == typeof(UPnPComplexType.Choice))
                        {
                            cs.Append("	if ((" + (string)foo[0] + " = (struct CHOICE_" + ChoiceTable[foo[1]].ToString() + "*)malloc(sizeof(struct CHOICE_" + ChoiceTable[foo[1]].ToString() + "))) == NULL) ILIBCRITICALEXIT(254);" + cl);
                            cs.Append("	memset(" + (string)foo[0] + ",0,sizeof(struct CHOICE_" + ChoiceTable[foo[1]].ToString() + "));" + cl);
                        }
                        cs.Append("	}" + cl);
                    }

                    //					if (ic.GetType()==typeof(UPnPComplexType.Sequence))
                    //					{
                    //						cs.Append("	RetVal->"+cx+" = (struct SEQUENCE_"+SequenceTable[ic].ToString()+"*)malloc(sizeof(struct SEQUENCE_"+SequenceTable[ic].ToString()+"));"+cl);
                    //					}
                    //					else if (ic.GetType()==typeof(UPnPComplexType.Choice))
                    //					{
                    //						cs.Append("	RetVal->"+cx+" = (struct CHOICE_"+ChoiceTable[ic].ToString()+"*)malloc(sizeof(struct CHOICE_"+ChoiceTable[ic].ToString()+"));"+cl);
                    //					}
                }
                if (cd.TypeNS == "http://www.w3.org/2001/XMLSchema")
                {
                    // XSD Simple Type
                    switch (cd.Type)
                    {
                        case "boolean":
                        case "int":
                        case "integer":
                        case "positiveInteger":
                        case "negativeInteger":
                        case "nonNegativeInteger":
                        case "nonPositiveInteger":
                        case "long":
                        case "short":
                            cs.Append("	RetVal->" + prefix + cd.Name + " = atoi(text);" + cl);
                            break;
                    }
                }
                else
                {
                    // XSD User Defined Type
                    cs.Append("	RetVal->" + prefix + cd.Name + " = " + pc_methodPrefix + "Parse_" + cd.Type + "(node->Next);" + cl);
                }
                cs.Append("	}" + cl);
            }
            foreach (UPnPComplexType.ItemCollection ec in ic.NestedCollections)
            {
                BuildComplexTypeParser_Collection(cx, SequenceTable, ChoiceTable, ref SeqX2, ref ChoX2, cs, ec, pc_methodPrefix);
            }
        }
        public bool Build_UPnPMiniWebServer(DirectoryInfo outputDirectory)
        {
            StreamWriter writer;

            if (this.Platform == PLATFORMS.POSIX)
            {
                if (this.SubTarget == SUBTARGETS.NUCLEUS)
                {
                    pc_SockType = "int";
            //					pc_TimeType = "Timeval";
                    pc_SockClose = "NU_Close_Socket";
            //					pc_stricmp = "strncasecmp";
                }
                else
                {
                    pc_SockType = "int";
            //					pc_TimeType = "struct timeval";
                    pc_SockClose = "close";
            //					pc_stricmp = "strncasecmp";
                }
            }

            if (this.Platform == PLATFORMS.WINDOWS)
            {
                pc_SockType = "SOCKET";
            //				pc_TimeType = "unsigned int";
                pc_SockClose = "closesocket";
            //				pc_stricmp = "_strnicmp";
            }

            if (this.Language == LANGUAGES.C)
            {
                pc_methodPrefix = CallPrefix;
                pc_methodLibPrefix = CallLibPrefix;
                pc_methodPrefixDef = CallingConvention + CallPrefix;
            }

            CodeProcessor cs = new CodeProcessor(new StringBuilder(),this.Language == LANGUAGES.CPP);

            /* Build UPnPMiniWebServer.h */
            AddLicense(cs,pc_methodPrefix+"MiniWebServer.h");

            cs.Append(cl);

            cs.Append("#ifndef __"+pc_methodPrefix+"MiniWebServer__"+cl);
            cs.Append("#define __"+pc_methodPrefix+"MiniWebServer__"+cl);

            cs.Append(cl);
            cs.Comment("Forward Declaration");
            cs.Append("struct packetheader;"+cl+cl);

            cs.Append("void* "+pc_methodPrefix+"CreateMiniWebServer(void *chain,int MaxSockets,void (*OnReceive) (void *ReaderObject, struct packetheader *header, char* buffer, int *BeginPointer, int BufferSize, int done, void* user),void *user);"+cl);
            cs.Append("void "+pc_methodPrefix+"DestroyMiniWebServer(void *WebServerModule);"+cl);
            cs.Append("void "+pc_methodPrefix+"StartMiniWebServerModule(void *WebServerModule);"+cl);
            cs.Append("void "+pc_methodPrefix+"StopMiniWebServerModule(void *WebServerModule);"+cl);
            cs.Append(cl);
            cs.Append("void "+pc_methodPrefix+"MiniWebServer_SetReserved(void *MWS, void *object);"+cl);
            cs.Append("void *"+pc_methodPrefix+"MiniWebServer_GetReserved(void *MWS);"+cl);
            cs.Append("void *"+pc_methodPrefix+"MiniWebServer_GetMiniWebServerFromReader(void *Reader);"+cl);
            cs.Append(cl);
            cs.Append("int "+pc_methodPrefix+"GetMiniWebServerPortNumber(void *WebServerModule);"+cl);
            cs.Append("void "+pc_methodPrefix+"MiniWebServerSend(void *ReaderObject, struct packetheader *packet);"+cl);
            cs.Append("void "+pc_methodPrefix+"MiniWebServerCloseSession(void *ReaderObject);"+cl);
            cs.Append(cl);
            cs.Append("char* "+pc_methodPrefix+"GetReceivingInterface(void* ReaderObject);"+cl);
            cs.Append("void "+pc_methodPrefix+"CloseRequest(void* ReaderObject);	"+cl);

            cs.Append(cl);
            cs.Append("#endif"+cl);

            writer = File.CreateText(outputDirectory.FullName + "\\"+pc_methodPrefix+"MiniWebServer.h");
            writer.Write(cs.ToString());
            writer.Close();

            /* Build UPnPMiniWebServer.c */
            cs = new CodeProcessor(new StringBuilder(),this.Language == LANGUAGES.CPP);
            if (this.Language == LANGUAGES.CPP)
            {
                AddLicense(cs,pc_methodPrefix+"MiniWebServer.cpp");
            }
            else
            {
                AddLicense(cs,pc_methodPrefix+"MiniWebServer.c");
            }
            cs.Append(cl);

            if (this.Platform==PLATFORMS.WINDOWS)
            {
                cs.Append("#ifndef MICROSTACK_NO_STDAFX"+cl);
                cs.Append("#include \"stdafx.h\""+cl);
                cs.Append("#endif"+cl);
                cs.Append("#define _CRTDBG_MAP_ALLOC"+cl);
                cs.Append("#include <math.h>"+cl);
                cs.Append("#include <winerror.h>"+cl);
                cs.Append("#include <stdlib.h>"+cl);
                cs.Append("#include <stdio.h>"+cl);
                cs.Append("#include <stddef.h>"+cl);
                cs.Append("#include <string.h>"+cl);
                if (this.WinSock == 1)
                {
                    cs.Append("#include <winsock.h>"+cl);
                    cs.Append("#include <wininet.h>"+cl);
                }
                if (this.WinSock == 2)
                {
                    cs.Append("#include <winsock2.h>"+cl);
                    cs.Append("#include <ws2tcpip.h>"+cl);
                }
                if (this.SubTarget != SUBTARGETS.PPC2003)
                {
            //					cs.Append("#include <errno.h>"+cl);
                }
                cs.Append("#include <windows.h>"+cl);
                cs.Append("#include <winioctl.h>"+cl);
                cs.Append("#include <winbase.h>"+cl);
                cs.Append("#include <crtdbg.h>"+cl);
            }
            else
            {
                if (this.SubTarget == SUBTARGETS.NUCLEUS)
                {
                    cs.Append("#include <stdio.h>"+cl);
                    cs.Append("#include <stdlib.h>"+cl);
                    cs.Append("#include \"net/inc/externs.h\""+cl);
                    cs.Append("#include \"net/inc/ip.h\""+cl);
                    cs.Append("#include \"net/inc/socketd.h\""+cl);
                    cs.Append("#include <errno.h>"+cl);
                }
                else
                {
                    cs.Append("#include <stdio.h>"+cl);
                    cs.Append("#include <stdlib.h>"+cl);
                    cs.Append("#include <sys/types.h>"+cl);
                    cs.Append("#include <sys/socket.h>"+cl);
                    cs.Append("#include <netinet/in.h>"+cl);
                    cs.Append("#include <arpa/inet.h>"+cl);
                    cs.Append("#include <sys/time.h>"+cl);
                    cs.Append("#include <netdb.h>"+cl);
                    cs.Append("#include <string.h>"+cl);
                    cs.Append("#include <sys/ioctl.h>"+cl);
                    cs.Append("#include <net/if.h>"+cl);
                    cs.Append("#include <sys/utsname.h>"+cl);
                    cs.Append("#include <sys/socket.h>"+cl);
                    cs.Append("#include <netinet/in.h>"+cl);
                    cs.Append("#include <unistd.h>"+cl);
                    cs.Append("#include <fcntl.h>"+cl);
                    //cs.Append("#include <errno.h>"+cl);
                    cs.Append("#include <malloc.h>"+cl);
                    cs.Append("#include <semaphore.h>"+cl);
                }
            }
            cs.Append(cl);
            cs.Append("#include \""+pc_methodPrefix+"MiniWebServer.h\""+cl);
            cs.Append("#include \""+pc_methodPrefix+"Parsers.h\""+cl);

            if (this.Platform == PLATFORMS.WINDOWS)
            {
                cs.Append("#define strncasecmp(x,y,z) _strnicmp(x,y,z)"+cl);
                cs.Append("#define gettimeofday(x,y) (x)->tv_sec = GetTickCount()/1000"+cl);
            }

            if (this.Platform != PLATFORMS.POSIX)
            {
                cs.Append("#define sem_t HANDLE"+cl);
                cs.Append("#define sem_init(x,y,z) *x=CreateSemaphore(NULL,z,FD_SETSIZE,NULL)"+cl);
                cs.Append("#define sem_destroy(x) (CloseHandle(*x)==0?1:0)"+cl);
                cs.Append("#define sem_wait(x) WaitForSingleObject(*x,INFINITE)"+cl);
                cs.Append("#define sem_trywait(x) ((WaitForSingleObject(*x,0)==WAIT_OBJECT_0)?0:1)"+cl);
                cs.Append("#define sem_post(x) ReleaseSemaphore(*x,1,NULL)"+cl);
            }

            cs.Append("#define DEBUGSTATEMENT(x)"+cl);
            cs.Append(cl);

            cs.Append("struct MiniWebServerObject"+cl);
            cs.Append("{"+cl);
            cs.Append("	void (*PreSelect)(void* object,fd_set *readset, fd_set *writeset, fd_set *errorset, int* blocktime);"+cl);
            cs.Append("	void (*PostSelect)(void* object,int slct, fd_set *readset, fd_set *writeset, fd_set *errorset);"+cl);
            cs.Append("	void (*Destroy)(void* object);"+cl);
            cs.Append(cl);
            cs.Append("	struct "+this.pc_methodPrefix+"MWSHTTPReaderObject *Readers;"+cl);
            cs.Append("	"+this.pc_SockType+" ListenSocket;"+cl);
            cs.Append("	int MaxConnections;"+cl);
            cs.Append("	unsigned short PortNumber;"+cl);
            cs.Append("	int Terminate;"+cl);
            cs.Append(cl);
            cs.Append("	void *TimerObject;"+cl);
            cs.Append("};"+cl);

            cs.Append("struct "+this.pc_methodPrefix+"MWSHTTPReaderObject"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct packetheader* PacketHeader;"+cl);
            cs.Append("	char Header[2048];"+cl);
            cs.Append("	char* Body;"+cl);
            cs.Append("	int BodySize;"+cl);
            cs.Append("	int HeaderIndex;"+cl);
            cs.Append("	int LocalIPAddress;"+cl);
            cs.Append("	"+cl);
            cs.Append("	int Body_BeginPointer;"+cl);
            cs.Append("	int Body_EndPointer;"+cl);
            cs.Append("	int Body_MallocSize;"+cl);
            cs.Append("	int Body_Read;"+cl);
            cs.Append("	"+cl);
            cs.Append("	"+this.pc_SockType+" ClientSocket;"+cl);
            cs.Append("	int FinRead;"+cl);
            cs.Append("	struct MiniWebServerObject *Parent;"+cl);
            cs.Append("	void* user;"+cl);
            cs.Append("	void (*FunctionCallback) (void *ReaderObject, struct packetheader *header, char* buffer, int *BeginPointer, int BufferSize, int done, void* user);"+cl);
            cs.Append("};"+cl);

            cs.Append("void "+this.pc_methodPrefix+"MiniWebServerProcessSocket(struct "+this.pc_methodPrefix+"MWSHTTPReaderObject *Reader)"+cl);
            cs.Append("{"+cl);
            cs.Append("	int bytesReceived;"+cl);
            cs.Append("	int i;"+cl);
            cs.Append("	struct packetheader_field_node *node;"+cl);
            cs.Append("	char* CharStar;"+cl);
            cs.Append("	"+cl);
            cs.Append("	if (Reader->BodySize==0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		/* Still Reading Headers */"+cl);
            cs.Append("		bytesReceived = recv(Reader->ClientSocket,Reader->Header+Reader->HeaderIndex,2048-Reader->HeaderIndex,0);"+cl);
            cs.Append("		if (bytesReceived==0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (Reader->PacketHeader!=NULL) {"+this.pc_methodPrefix+"DestructPacket(Reader->PacketHeader);}"+cl);
            cs.Append("			if (Reader->Body_MallocSize!=0) {free(Reader->Body);}"+cl);
            cs.Append("			Reader->Body = NULL;"+cl);
            cs.Append("			Reader->Body_MallocSize = 0;"+cl);
            cs.Append("			Reader->PacketHeader = NULL;"+cl);
            cs.Append("			"+this.pc_SockClose+"(Reader->ClientSocket);"+cl);
            cs.Append("			Reader->ClientSocket = ~0;"+cl);
            cs.Append("			return;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		Reader->HeaderIndex += bytesReceived;"+cl);
            cs.Append("		if (Reader->HeaderIndex>4)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			/* Must have read at least 4 bytes to perform check */"+cl);
            cs.Append("			for(i=0;i<(Reader->HeaderIndex - 3);i++)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				if (Reader->Header[i] == '\\r' && Reader->Header[i+1] == '\\n' && Reader->Header[i+2] == '\\r' && Reader->Header[i+3] == '\\n')"+cl);
            cs.Append("				{"+cl);
            cs.Append("					/* Finished Header */"+cl);
            cs.Append("					Reader->PacketHeader = "+this.pc_methodPrefix+"ParsePacketHeader(Reader->Header,0,i+4);"+cl);
            cs.Append("					Reader->PacketHeader->ReceivingAddress = Reader->LocalIPAddress;"+cl);
            cs.Append("					Reader->BodySize = -1;"+cl);
            cs.Append("					Reader->Body_Read = 0;"+cl);
            cs.Append("					node = Reader->PacketHeader->FirstField;"+cl);
            cs.Append("					while(node!=NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						if (strncasecmp(node->Field,\"CONTENT-LENGTH\",14)==0)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							CharStar = (char*)malloc(1+node->FieldDataLength);"+cl);
            cs.Append("							memcpy(CharStar,node->FieldData,node->FieldDataLength);"+cl);
            cs.Append("							CharStar[node->FieldDataLength] = '\\0';"+cl);
            cs.Append("							Reader->BodySize = atoi(CharStar);"+cl);
            cs.Append("							free(CharStar);"+cl);
            cs.Append("							break;"+cl);
            cs.Append("						}"+cl);
            cs.Append("						node = node->NextField;"+cl);
            cs.Append("					}"+cl);
            cs.Append("					if (Reader->BodySize!=-1)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						if (Reader->BodySize!=0)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->Body = (char*)malloc(Reader->BodySize);"+cl);
            cs.Append("							Reader->Body_MallocSize = Reader->BodySize;"+cl);
            cs.Append("						}"+cl);
            cs.Append("						else"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->Body = NULL;"+cl);
            cs.Append("							Reader->Body_MallocSize = 0;"+cl);
            cs.Append("						}"+cl);
            cs.Append("					}"+cl);
            cs.Append("					else"+cl);
            cs.Append("					{"+cl);
            cs.Append("						Reader->Body = (char*)malloc(4096);"+cl);
            cs.Append("						Reader->Body_MallocSize = 4096;"+cl);
            cs.Append("					}"+cl);
            cs.Append(cl);
            cs.Append("					if (Reader->HeaderIndex>i+4 && Reader->BodySize!=0)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						/* Part of the body is in here */"+cl);
            cs.Append("						memcpy(Reader->Body,Reader->Header+i+4,Reader->HeaderIndex-(&Reader->Header[i+4]-Reader->Header));"+cl);
            cs.Append("						Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("						Reader->Body_EndPointer = Reader->HeaderIndex-(int)(&Reader->Header[i+4]-Reader->Header);"+cl);
            cs.Append("						Reader->Body_Read = Reader->Body_EndPointer;"+cl);
            cs.Append("						"+cl);
            cs.Append("						if (Reader->BodySize==-1 || Reader->Body_Read>=Reader->BodySize)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							DEBUGSTATEMENT(printf(\"Close\\r\\n\"));"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer - Reader->Body_BeginPointer,-1,Reader->user);"+cl);
            cs.Append("							"+cl);
            cs.Append("							while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("							{"+cl);
            cs.Append("								memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer);"+cl);
            cs.Append("								Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer;"+cl);
            cs.Append("								Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("								Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,-1,Reader->user);"+cl);
            cs.Append("							}"+cl);
            cs.Append("							"+cl);
            cs.Append("							if (Reader->PacketHeader!=NULL) {"+this.pc_methodPrefix+"DestructPacket(Reader->PacketHeader);}"+cl);
            cs.Append("							if (Reader->Body_MallocSize!=0) {free(Reader->Body);}"+cl);
            cs.Append("							Reader->Body = NULL;"+cl);
            cs.Append("							Reader->Body_MallocSize = 0;"+cl);
            cs.Append("							Reader->PacketHeader = NULL;"+cl);
            cs.Append("							"+this.pc_SockClose+"(Reader->ClientSocket);"+cl);
            cs.Append("							Reader->ClientSocket = ~0;"+cl);
            cs.Append("						}"+cl);
            cs.Append("						else"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer - Reader->Body_BeginPointer,0,Reader->user);"+cl);
            cs.Append("							while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("							{"+cl);
            cs.Append("								memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer);"+cl);
            cs.Append("								Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer;"+cl);
            cs.Append("								Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("								Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,0,Reader->user);"+cl);
            cs.Append("							}"+cl);
            cs.Append("						}"+cl);
            cs.Append("					}"+cl);
            cs.Append("					else"+cl);
            cs.Append("					{"+cl);
            cs.Append("						/* There is no body, but the packet is here */"+cl);
            cs.Append("						Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("						Reader->Body_EndPointer = 0;"+cl);
            cs.Append("						"+cl);
            cs.Append("						if (Reader->BodySize<=0)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,NULL,&Reader->Body_BeginPointer,0,-1,Reader->user);"+cl);
            cs.Append("							if (Reader->PacketHeader!=NULL) {"+this.pc_methodPrefix+"DestructPacket(Reader->PacketHeader);}"+cl);
            cs.Append("							if (Reader->Body_MallocSize!=0) {free(Reader->Body);}"+cl);
            cs.Append("							Reader->Body = NULL;"+cl);
            cs.Append("							Reader->Body_MallocSize = 0;"+cl);
            cs.Append("							Reader->PacketHeader = NULL;"+cl);
            cs.Append("							"+this.pc_SockClose+"(Reader->ClientSocket);"+cl);
            cs.Append("							Reader->ClientSocket = ~0;"+cl);
            cs.Append("						}"+cl);
            cs.Append("						else"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,NULL,&Reader->Body_BeginPointer,0,0,Reader->user);"+cl);
            cs.Append("						}"+cl);
            cs.Append("					}"+cl);
            cs.Append("					break;"+cl);
            cs.Append("				}"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("	else"+cl);
            cs.Append("	{"+cl);
            cs.Append("		/* Reading Body Only */"+cl);
            cs.Append("		if (Reader->Body_BeginPointer == Reader->Body_EndPointer)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("			Reader->Body_EndPointer = 0;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		else"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				Reader->Body_EndPointer = Reader->Body_BeginPointer;"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("		"+cl);
            cs.Append("		"+cl);
            cs.Append("		if (Reader->Body_EndPointer == Reader->Body_MallocSize)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			Reader->Body_MallocSize += 4096;"+cl);
            cs.Append("			Reader->Body = (char*)realloc(Reader->Body,Reader->Body_MallocSize);"+cl);
            cs.Append("		}"+cl);
            cs.Append("		"+cl);
            cs.Append("		bytesReceived = recv(Reader->ClientSocket,Reader->Body+Reader->Body_EndPointer,Reader->Body_MallocSize-Reader->Body_EndPointer,0);"+cl);
            cs.Append("		Reader->Body_EndPointer += bytesReceived;"+cl);
            cs.Append("		Reader->Body_Read += bytesReceived;"+cl);
            cs.Append("		"+cl);
            cs.Append("		Reader->FunctionCallback(Reader, Reader->PacketHeader, Reader->Body+Reader->Body_BeginPointer, &Reader->Body_BeginPointer, Reader->Body_EndPointer - Reader->Body_BeginPointer, 0, Reader->user);"+cl);
            cs.Append("		while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer);"+cl);
            cs.Append("			Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer;"+cl);
            cs.Append("			Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("			Reader->FunctionCallback(Reader,Reader->PacketHeader,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,0,Reader->user);				"+cl);
            cs.Append("		}"+cl);
            cs.Append("		"+cl);
            cs.Append("		if ((Reader->BodySize!=-1 && Reader->Body_Read>=Reader->BodySize)||(bytesReceived==0))"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (Reader->Body_BeginPointer == Reader->Body_EndPointer)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("				Reader->Body_EndPointer = 0;"+cl);
            cs.Append("			}"+cl);
            cs.Append("			Reader->FunctionCallback(Reader, Reader->PacketHeader, Reader->Body, &Reader->Body_BeginPointer, Reader->Body_EndPointer, -1,Reader->user);"+cl);
            cs.Append("			if (Reader->PacketHeader!=NULL) {"+this.pc_methodPrefix+"DestructPacket(Reader->PacketHeader);}"+cl);
            cs.Append("			if (Reader->Body_MallocSize!=0) {free(Reader->Body);}"+cl);
            cs.Append("			Reader->Body = NULL;"+cl);
            cs.Append("			Reader->Body_MallocSize = 0;"+cl);
            cs.Append("			Reader->PacketHeader = NULL;"+cl);
            cs.Append("			"+this.pc_SockClose+"(Reader->ClientSocket);"+cl);
            cs.Append("			Reader->ClientSocket = ~0;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		"+cl);
            cs.Append("		if (Reader->Body_BeginPointer==Reader->Body_EndPointer)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("			Reader->Body_EndPointer = 0;"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append("int "+this.pc_methodPrefix+"GetMiniWebServerPortNumber(void *WebServerModule)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct MiniWebServerObject *module = (struct MiniWebServerObject*)WebServerModule;"+cl);
            cs.Append("	return(module->PortNumber);"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+this.pc_methodPrefix+"MiniWebServerModule_Destroy(void* object)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct MiniWebServerObject *mws = ((struct MiniWebServerObject*)object);"+cl);
            cs.Append("	int i;"+cl);
            cs.Append("	for(i=0;i<mws->MaxConnections;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (mws->Readers[i].Body!=NULL && mws->Readers[i].Body_MallocSize!=0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			free(mws->Readers[i].Body);"+cl);
            cs.Append("		}"+cl);
            cs.Append("		if (mws->Readers[i].PacketHeader!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			"+this.pc_methodPrefix+"DestructPacket(mws->Readers[i].PacketHeader);"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("	free(((struct MiniWebServerObject*)object)->Readers);"+cl);
            cs.Append("}"+cl);

            string stype = this.pc_SockType;
            if (this.Platform==PLATFORMS.WINDOWS && this.WinSock==2)
            {
                stype = "HANDLE";
            }

            cs.Append("void "+this.pc_methodPrefix+"MiniWebServerModule_PreSelect(void *WebServerModule,fd_set *readset, fd_set *writeset, fd_set *errorset,int *blocktime)"+cl);
            cs.Append("{"+cl);
            cs.Append("	int i;"+cl);
            cs.Append("	struct MiniWebServerObject *module = (struct MiniWebServerObject*)WebServerModule;"+cl);
            cs.Append("	int NumFree = module->MaxConnections;"+cl);
            cs.Append(cl);
            cs.Append("	if (module->PortNumber==0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		module->PortNumber = "+this.pc_methodPrefix+"GetStreamSocket(htonl(INADDR_ANY),0,("+stype+"*)&(module->ListenSocket));"+cl);
            cs.Append("		listen(module->ListenSocket,4);"+cl);
            cs.Append("	}"+cl);
            cs.Append(cl);
            cs.Append("	/* Pre Select Connected Sockets*/"+cl);
            cs.Append("	for(i=0;i<module->MaxConnections;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket!=~0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			/* Already Connected, just needs reading */"+cl);
            cs.Append("			FD_SET(module->Readers[i].ClientSocket,readset);"+cl);
            cs.Append("			FD_SET(module->Readers[i].ClientSocket,errorset);"+cl);
            cs.Append("			--NumFree;"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append(cl);
            cs.Append("	if (NumFree!=0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		/* Pre Select Listen Socket */"+cl);
            cs.Append("		FD_SET(module->ListenSocket,readset);"+cl);
            cs.Append("	}"+cl);
            cs.Append("	else"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (*blocktime>1){*blocktime=1;}"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+this.pc_methodPrefix+"MWS_TimerSink(void *WebServerModule)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct "+this.pc_methodPrefix+"MWSHTTPReaderObject *module = (struct "+this.pc_methodPrefix+"MWSHTTPReaderObject*)WebServerModule;"+cl);
            cs.Append("	if (module->ClientSocket!=0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		"+this.pc_SockClose+"(module->ClientSocket);"+cl);
            cs.Append("		module->ClientSocket = ~0;"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+this.pc_methodPrefix+"MiniWebServerModule_PostSelect(void *WebServerModule, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset)"+cl);
            cs.Append("{"+cl);
            if (this.Platform==PLATFORMS.WINDOWS)
            {
                cs.Append("	unsigned long flags=0;"+cl);
            }
            cs.Append("	int i;"+cl);
            cs.Append("	struct MiniWebServerObject *module = (struct MiniWebServerObject*)WebServerModule;"+cl);
            cs.Append("	struct sockaddr_in addr;"+cl);
            cs.Append("	int addrlen = sizeof(struct sockaddr_in);"+cl);
            cs.Append("	"+cl);
            cs.Append(cl);
            cs.Append("	/* Select Connected Sockets*/"+cl);
            cs.Append("	for(i=0;i<module->MaxConnections;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket!=~0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (FD_ISSET(module->Readers[i].ClientSocket,errorset)!=0)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				module->Readers[i].ClientSocket = ~0;"+cl);
            cs.Append("				module->Readers[i].BodySize = 0;"+cl);
            cs.Append("				//ToDo: cleanup"+cl);
            cs.Append("			}"+cl);
            cs.Append("			if (FD_ISSET(module->Readers[i].ClientSocket,readset)!=0)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				"+this.pc_methodPrefix+"MiniWebServerProcessSocket(&(module->Readers[i]));"+cl);
            cs.Append("			}"+cl);
            cs.Append("			if (module->Readers[i].ClientSocket==~0 || module->Readers[i].Body!=NULL)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				"+this.pc_methodPrefix+"LifeTime_Remove(module->TimerObject,&(module->Readers[i]));"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append(cl);
            cs.Append("	/* Select Listen Socket */"+cl);
            cs.Append("	if (FD_ISSET(module->ListenSocket,readset)!=0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		for(i=0;i<module->MaxConnections;++i)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (module->Readers[i].ClientSocket==~0)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				module->Readers[i].ClientSocket = accept(module->ListenSocket,(struct sockaddr*)&addr,&addrlen);"+cl);
            if (this.Platform==PLATFORMS.WINDOWS)
            {
                cs.Append("				ioctlsocket(module->Readers[i].ClientSocket,FIONBIO,&flags);"+cl);
            }
            cs.Append("				"+this.pc_methodPrefix+"LifeTime_Add(module->TimerObject,&(module->Readers[i]),3,&"+this.pc_methodPrefix+"MWS_TimerSink,NULL);"+cl);
            cs.Append("				module->Readers[i].HeaderIndex = 0;"+cl);
            cs.Append("				module->Readers[i].Body_BeginPointer = 0;"+cl);
            cs.Append("				module->Readers[i].Body_EndPointer = 0;"+cl);
            cs.Append("				module->Readers[i].Body_MallocSize = 0;"+cl);
            cs.Append("				module->Readers[i].Body_Read = 0;"+cl);
            cs.Append("				break;"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+this.pc_methodPrefix+"MiniWebServerCloseSession(void *ReaderModule)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct "+this.pc_methodPrefix+"MWSHTTPReaderObject *module = (struct "+this.pc_methodPrefix+"MWSHTTPReaderObject*)ReaderModule;"+cl);
            cs.Append("	"+this.pc_SockType+" TempSocket = module->ClientSocket;"+cl);
            cs.Append("	module->ClientSocket = ~0;"+cl);
            cs.Append("	module->BodySize = 0;"+cl);
            cs.Append("	"+this.pc_SockClose+"(TempSocket);"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+this.pc_methodPrefix+"MiniWebServerSend(void *ReaderModule, struct packetheader *packet)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct "+this.pc_methodPrefix+"MWSHTTPReaderObject *module = (struct "+this.pc_methodPrefix+"MWSHTTPReaderObject*)ReaderModule;"+cl);
            cs.Append("	char* buffer;"+cl);
            cs.Append("	int bufferlength = "+this.pc_methodPrefix+"GetRawPacket(packet,&buffer);"+cl);
            cs.Append(cl);
            cs.Append("	send(module->ClientSocket,buffer,bufferlength,0);"+cl);
            cs.Append("	"+cl);
            cs.Append("	free(buffer);"+cl);
            cs.Append("}"+cl);

            cs.Append("void* "+this.pc_methodPrefix+"CreateMiniWebServer(void *chain,int MaxConnections,void (*OnReceivePtr) (void *ReaderObject, struct packetheader *header, char* buffer, int *BeginPointer, int BufferSize, int done, void* user),void* user)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct MiniWebServerObject *RetVal = (struct MiniWebServerObject*)malloc(sizeof(struct MiniWebServerObject));"+cl);
            cs.Append("	int i;"+cl);
            if (this.Platform==PLATFORMS.WINDOWS)
            {
                cs.Append("	WORD wVersionRequested;"+cl);
                cs.Append("	WSADATA wsaData;"+cl);
                cs.Append("	wVersionRequested = MAKEWORD( 1, 1 );"+cl);
                cs.Append("	if (WSAStartup( wVersionRequested, &wsaData ) != 0) {exit(1);}"+cl);
            }
            cs.Append(cl);
            cs.Append("	RetVal->MaxConnections = MaxConnections;"+cl);
            cs.Append("	RetVal->Readers = (struct "+this.pc_methodPrefix+"MWSHTTPReaderObject*)malloc(MaxConnections*sizeof(struct "+this.pc_methodPrefix+"MWSHTTPReaderObject));"+cl);
            cs.Append("	RetVal->Terminate = 0;"+cl);
            cs.Append("	RetVal->PreSelect = &"+this.pc_methodPrefix+"MiniWebServerModule_PreSelect;"+cl);
            cs.Append("	RetVal->PostSelect = &"+this.pc_methodPrefix+"MiniWebServerModule_PostSelect;"+cl);
            cs.Append("	RetVal->Destroy = &"+this.pc_methodPrefix+"MiniWebServerModule_Destroy;"+cl);

            cs.Append(cl);
            cs.Append("	memset(RetVal->Readers,0,MaxConnections*sizeof(struct "+this.pc_methodPrefix+"MWSHTTPReaderObject));"+cl);
            cs.Append("	for(i=0;i<MaxConnections;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		RetVal->Readers[i].ClientSocket = ~0;"+cl);
            cs.Append("		RetVal->Readers[i].FunctionCallback = OnReceivePtr;"+cl);
            cs.Append("		RetVal->Readers[i].Parent = RetVal;"+cl);
            cs.Append("		RetVal->Readers[i].user = user;"+cl);
            cs.Append("	}"+cl);
            cs.Append("	"+cl);
            cs.Append("	RetVal->PortNumber = 0;"+cl);
            //			cs.Append("	RetVal->PortNumber = "+this.pc_methodPrefix+"GetStreamSocket(htonl(INADDR_ANY),&(RetVal->ListenSocket));"+cl);
            //			cs.Append("	listen(RetVal->ListenSocket,4);"+cl);
            cs.Append(cl);
            cs.Append("	RetVal->TimerObject = "+this.pc_methodPrefix+"CreateLifeTime(chain);"+cl);
            cs.Append("	"+this.pc_methodPrefix+"AddToChain(chain,RetVal);"+cl);
            cs.Append("	return((void*)RetVal);"+cl);
            cs.Append("}"+cl);

            writer = File.CreateText(outputDirectory.FullName + "\\"+pc_methodPrefix+"MiniWebServer.c");
            writer.Write(cs.ToString());
            writer.Close();
            return(true);
        }
        private string Build_SubscribeEvents_Device(string first, CodeProcessor cs, UPnPDevice device, Hashtable serviceNames)
        {
            foreach (UPnPService service in device.Services)
            {
                bool HasEvent = false;
                foreach (UPnPStateVariable sv in service.GetStateVariables())
                {
                    if (sv.SendEvent)
                    {
                        HasEvent = true;
                        break;
                    }
                }

                if (HasEvent)
                {
                    UPnPDebugObject obj = new UPnPDebugObject(service);
                    string name = (string)obj.GetField("__eventurl");
                    cs.Append(first + " if (pathlength==" + (name.Length + 1).ToString() + " && memcmp(path+1,\"" + name + "\"," + name.Length.ToString() + ")==0)" + cl);
                    cs.Append("	{" + cl);

                    cs.Append("		" + pc_methodPrefix + "TryToSubscribe(\"" + (string)serviceNames[service] + "\",TimeoutVal,URL,URLLength,session);" + cl);

                    cs.Append("	}" + cl);
                    first = "else";
                }
            }

            foreach (UPnPDevice d in device.EmbeddedDevices)
            {
                first = Build_SubscribeEvents_Device(first, cs, d, serviceNames);
            }
            return (first);
        }
        public void TestRelationshipProcessor_ProcessRelationships()
        {
            ProgramFile   programFile;
            CodeProcessor codeProcessor;
            FileProcessor fileProcessor;
            ProgramClassTypeCollection expectedProgramClassTypeCollection = new ProgramClassTypeCollection();
            ProgramClassTypeCollection actualProgramClassTypeCollection   = new ProgramClassTypeCollection();
            List <string> empty = new List <string>();

            string filePath = Path.GetFullPath("..\\..\\..\\CodeAnalyzerTests\\TestInputFiles\\TestInputFile.cs");
            string fileName = "TestInputFile.cs";
            string fileText = "";

            if (File.Exists(filePath))
            {
                fileText = File.ReadAllText(filePath);
            }

            ProgramInterface IAnimalActions = new ProgramInterface("IAnimalActions", empty, empty);
            ProgramInterface IHumanActions  = new ProgramInterface("IHumanActions", empty, empty);
            ProgramClass     Animal         = new ProgramClass("Animal", empty, empty);
            ProgramClass     Pet            = new ProgramClass("Pet", empty, empty);
            ProgramClass     Dog            = new ProgramClass("Dog", empty, empty);
            ProgramClass     Human          = new ProgramClass("Human", empty, empty);
            ProgramClass     Car            = new ProgramClass("Car", empty, empty);

            IAnimalActions.SubClasses.Add(Dog);
            IAnimalActions.SubClasses.Add(Human);
            IHumanActions.SubClasses.Add(Human);
            Animal.SubClasses.Add(Pet);
            Animal.SubClasses.Add(Human);
            Pet.SuperClasses.Add(Animal);
            Pet.SubClasses.Add(Dog);
            Pet.OwnedByClasses.Add(Human);
            Pet.UsedByClasses.Add(Human);
            Dog.SuperClasses.Add(Pet);
            Dog.SuperClasses.Add(IAnimalActions);
            Dog.OwnedByClasses.Add(Human);
            Human.SuperClasses.Add(Animal);
            Human.SuperClasses.Add(IAnimalActions);
            Human.SuperClasses.Add(IHumanActions);
            Human.OwnedClasses.Add(Car);
            Human.OwnedClasses.Add(Pet);
            Human.OwnedClasses.Add(Dog);
            Human.UsedClasses.Add(Pet);
            Car.OwnedByClasses.Add(Human);

            expectedProgramClassTypeCollection.Add(IAnimalActions);
            expectedProgramClassTypeCollection.Add(IHumanActions);
            expectedProgramClassTypeCollection.Add(Animal);
            expectedProgramClassTypeCollection.Add(Pet);
            expectedProgramClassTypeCollection.Add(Dog);
            expectedProgramClassTypeCollection.Add(Human);
            expectedProgramClassTypeCollection.Add(Car);

            programFile   = new ProgramFile(filePath, fileName, fileText);
            fileProcessor = new FileProcessor(programFile);
            codeProcessor = new CodeProcessor(programFile, actualProgramClassTypeCollection);

            fileProcessor.ProcessFile();
            codeProcessor.ProcessFileCode();

            foreach (ProgramClassType programClassType in actualProgramClassTypeCollection)
            {
                RelationshipProcessor relationshipProcessor = new RelationshipProcessor(programClassType, actualProgramClassTypeCollection);
                relationshipProcessor.ProcessRelationships();
            }

            CollectionAssert.AreEquivalent(expectedProgramClassTypeCollection, actualProgramClassTypeCollection);

            foreach (ProgramClassType expectedProgramClassType in expectedProgramClassTypeCollection)
            {
                if (actualProgramClassTypeCollection.Contains(expectedProgramClassType.Name))
                {
                    ProgramClassType actualProgramClassType = actualProgramClassTypeCollection[expectedProgramClassType.Name];
                    CollectionAssert.AreEquivalent(expectedProgramClassType.SubClasses, actualProgramClassType.SubClasses);
                    CollectionAssert.AreEquivalent(expectedProgramClassType.SuperClasses, actualProgramClassType.SuperClasses);

                    if (expectedProgramClassType.GetType() == typeof(ProgramClass))
                    {
                        ProgramClass expectedProgramClass = (ProgramClass)expectedProgramClassType;
                        ProgramClass actualProgramClass   = (ProgramClass)actualProgramClassType;
                        CollectionAssert.AreEquivalent(expectedProgramClass.OwnedClasses, actualProgramClass.OwnedClasses);
                        CollectionAssert.AreEquivalent(expectedProgramClass.OwnedByClasses, actualProgramClass.OwnedByClasses);
                        CollectionAssert.AreEquivalent(expectedProgramClass.UsedClasses, actualProgramClass.UsedClasses);
                        CollectionAssert.AreEquivalent(expectedProgramClass.UsedByClasses, actualProgramClass.UsedByClasses);
                    }
                }
            }
        }
 private void Build_TypeCheckBoolean(CodeProcessor cs)
 {
     cs.Define("int " + pc_methodPrefixDef + "TypeCheckBoolean(char *inVar, int inVarLength, int* BoolValue, char* varName, struct HTTPReaderObject *ReaderObject)");
     cs.Append("{" + cl);
     cs.Append("	int OK = 0;" + cl);
     cs.Append("	char* msg;" + cl);
     cs.Append("	if (inVarLength == 4)" + cl);
     cs.Append("	{" + cl);
     cs.Append("		if (strncasecmp(inVar, \"true\", 4) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			*BoolValue = 1;" + cl);
     cs.Append("		}" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (inVarLength == 5)" + cl);
     cs.Append("	{" + cl);
     cs.Append("		if (strncasecmp(inVar, \"false\", 5) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			*BoolValue = 0;" + cl);
     cs.Append("		}" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (inVarLength==1)" + cl);
     cs.Append("	{" + cl);
     cs.Append("		if (memcmp(inVar, \"0\", 1) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			*BoolValue = 0;" + cl);
     cs.Append("		}" + cl);
     cs.Append("		if (memcmp(inVar, \"1\", 1) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			*BoolValue = 1;" + cl);
     cs.Append("		}" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (OK == 0)" + cl);
     cs.Append("	{" + cl);
     if (Configuration.ExplicitErrorEncoding == true)
     {
         cs.Append("		if ((msg = (char*)malloc(25 + (int)strlen(varName))) == NULL) ILIBCRITICALEXIT(254);" + cl);
         cs.Append("		snprintf(msg, 25 + (int)strlen(varName), \"Argument[%s] illegal value\", varName);" + cl);
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, msg);" + cl);
         cs.Append("		free(msg);" + cl);
     }
     else
     {
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, \"Illegal value\");" + cl);
     }
     cs.Append("		return -1;" + cl);
     cs.Append("	}" + cl);
     cs.Append("	else" + cl);
     cs.Append("	{" + cl);
     cs.Append("		return 0;" + cl);
     cs.Append("	}" + cl);
     cs.Append("}" + cl);
 }
 public static void BuildComplexTypeParser_Header(CodeProcessor cs, SortedList SortedServiceList, string pc_methodPrefix, string pc_methodLibPrefix)
 {
     cs.Append(cl);
     cs.Comment("Complex Type Parsers");
     IDictionaryEnumerator en = SortedServiceList.GetEnumerator();
     while (en.MoveNext())
     {
         UPnPService service = (UPnPService)en.Value;
         foreach (UPnPComplexType CT in service.GetComplexTypeList())
         {
             cs.Append("struct " + CT.Name_LOCAL + "* " + pc_methodPrefix + "Parse_" + CT.Name_LOCAL + "(struct " + pc_methodLibPrefix + "XMLNode *node);" + cl);
         }
     }
     cs.Append(cl);
 }
        private void Build_TypeCheckString(CodeProcessor cs, Hashtable serviceNames)
        {
            SortedList SL = new SortedList();
            IDictionaryEnumerator en = serviceNames.GetEnumerator();

            while (en.MoveNext())
            {
                SL[en.Value] = en.Key;
            }
            en = SL.GetEnumerator();

            cs.Define("int " + pc_methodPrefixDef + "TypeCheckString(char* inVar, int inVarLength, char* ServiceName, char* StateVariable, char** outVar, int* outVarLength, char* varName, struct HTTPReaderObject *ReaderObject)");
            cs.Append("{" + cl);
            cs.Append("	int OK = 0;" + cl);
            cs.Append("	char* msg;" + cl);
            while (en.MoveNext())
            {
                UPnPService S = (UPnPService)en.Value;
                string key = (string)en.Key;

                bool Needed = false;
                foreach (UPnPStateVariable V in S.GetStateVariables())
                {
                    if (V.AllowedStringValues != null)
                    {
                        Needed = true;
                        break;
                    }
                }

                if (Needed)
                {
                    cs.Append("	if (strncmp(ServiceName,\"" + key + "\"," + key.Length.ToString() + ") == 0)" + cl);
                    cs.Append("	{" + cl);
                    foreach (UPnPStateVariable V in S.GetStateVariables())
                    {
                        if (V.AllowedStringValues != null)
                        {
                            cs.Append("		if (strncmp(StateVariable,\"" + V.Name + "\"," + V.Name.Length.ToString() + ") == 0)" + cl);
                            cs.Append("		{" + cl);
                            cs.Append("			OK = -1;" + cl);
                            bool first = true;
                            foreach (string AllowedString in V.AllowedStringValues)
                            {
                                if (first == false) cs.Append("else ");
                                first = false;
                                cs.Append("			if (inVarLengt h== " + AllowedString.Length.ToString() + ")" + cl);
                                cs.Append("			{" + cl);
                                cs.Append("				if (memcmp(inVar,\"" + AllowedString + "\"," + AllowedString.Length.ToString() + ") == 0) {OK = 0;}" + cl);
                                cs.Append("			}" + cl);
                            }
                            cs.Append("			if (OK != 0)" + cl);
                            cs.Append("			{" + cl);
                            if (Configuration.ExplicitErrorEncoding == true)
                            {
                                cs.Append("				if ((msg = (char*)malloc(65)) == NULL) ILIBCRITICALEXIT(254);" + cl);
                                cs.Append("				snprintf(msg, 65, \"Argument[%s] contains a value that is not in AllowedValueList\", varName);" + cl);
                                cs.Append("				" + pc_methodPrefix + "Response_Error(ReaderObject, 402, msg);" + cl);
                                cs.Append("				free(msg);" + cl);
                            }
                            else
                            {
                                cs.Append("				" + pc_methodPrefix + "Response_Error(ReaderObject, 402, \"Illegal value\");" + cl);
                            }
                            cs.Append("				return -1;" + cl);
                            cs.Append("			}" + cl);
                            cs.Append("			*outVar = inVar;" + cl);
                            cs.Append("			*outVarLength = inVarLength;" + cl);
                            cs.Append("			return(0);" + cl);
                            cs.Append("		}" + cl);
                        }
                    }
                    cs.Append("	}" + cl);
                }
            }
            cs.Append("}" + cl);
        }
        protected static void PopulateDeviceStructs(CodeProcessor cs, UPnPDevice d)
        {
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                PopulateDeviceStructs(cs,ed);
            }
            cs.Append("struct UPnP_Device_"+d.User2.ToString()+" UPnP_Device_"+d.User2.ToString()+"_Impl = "+cs.NewLine);
            cs.Append("{"+cs.NewLine);
            foreach(UPnPService s in d.Services)
            {
                cs.Append("	&UPnP_Service_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_Impl,"+cs.NewLine);
            }
            cs.Append(cs.NewLine);
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                cs.Append("	&UPnP_Device_"+ed.User2.ToString()+"_Impl,"+cs.NewLine);
            }
            cs.Append("	NULL,"+cs.NewLine); // Friendly
            if (d.ParentDevice==null)
            {
                cs.Append("	NULL,"+cs.NewLine+"	NULL,"+cs.NewLine); //UDN, Serial
            }
            cs.Append(" NULL,"+cs.NewLine); //Manufacturer
            cs.Append(" NULL,"+cs.NewLine); //ManufacturerURL
            cs.Append(" NULL,"+cs.NewLine); //ModelDescription
            cs.Append(" NULL,"+cs.NewLine); //ModelName
            cs.Append(" NULL,"+cs.NewLine); //ModelNumber
            cs.Append(" NULL,"+cs.NewLine); //ModelURL
            cs.Append(" NULL,"+cs.NewLine); //Product Code

            UPnPDevice[] embeddedDevices = d.EmbeddedDevices;
            UPnPService[] services = d.Services;

            d.EmbeddedDevices = new UPnPDevice[0];
            d.Services = new UPnPService[0];

            string xmlString;

            if (d.ParentDevice==null)
                {byte[] xml;
                xml = d.GetRootDeviceXML(null);
                xmlString = (new UTF8Encoding()).GetString(xml);
            }
            else
            {
                StringBuilder sb = new StringBuilder();
                StringWriter SW = new StringWriter(sb);
                XmlTextWriter XDoc = new XmlTextWriter(SW);
                (new UPnPDebugObject(d)).InvokeNonStaticMethod("GetNonRootDeviceXML",new object[2]{null,XDoc});
                SW.Flush();
                xmlString = sb.ToString();
            }
            string stringX;
            int stringXLen;
            InjectCompressedString(out stringX,out stringXLen,xmlString,cs.NewLine);

            cs.Append("	"+stringX+","+cs.NewLine);
            cs.Append("	"+stringXLen.ToString()+","+cs.NewLine);
            cs.Append("	"+xmlString.Length.ToString()+","+cs.NewLine);
            if (d.ParentDevice==null)
            {
                cs.Append("	NULL,"+cs.NewLine);
            }
            cs.Append("	NULL"+cs.NewLine);
            cs.Append("};"+cs.NewLine);

            d.EmbeddedDevices = embeddedDevices;
            d.Services = services;
        }
 private void Build_TypeCheckUnsignedIntegral(CodeProcessor cs)
 {
     cs.Define("int " + pc_methodPrefixDef + "TypeCheckUnsignedIntegral(char* inVar, int inVarLength, unsigned long MinVal, unsigned long MaxVal, void *outVar, char *varName,struct HTTPReaderObject *ReaderObject)");
     cs.Append("{" + cl);
     cs.Append("	unsigned long TempULong;" + cl);
     cs.Append("	int OK = 0;" + cl);
     cs.Append("	char *msg;" + cl);
     cs.Append("	if (" + pc_methodLibPrefix + "GetULong(inVar, inVarLength, &TempULong)!=0)" + cl);
     cs.Append("	{" + cl);
     cs.Append("		OK=-1;" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (!(TempULong >= MinVal && TempULong <= MaxVal))" + cl);
     cs.Append("	{" + cl);
     cs.Append("		OK=-2;" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (OK==-1)" + cl);
     cs.Append("	{" + cl);
     if (Configuration.ExplicitErrorEncoding == true)
     {
         cs.Append("		if ((msg = (char*)malloc(25 + (int)strlen(varName))) == NULL) ILIBCRITICALEXIT(254);" + cl);
         cs.Append("		snprintf(msg, 25 + (int)strlen(varName), \"Argument[%s] illegal value\", varName);" + cl);
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, msg);" + cl);
         cs.Append("		free(msg);" + cl);
     }
     else
     {
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Illegal value\");" + cl);
     }
     cs.Append("		return(-1);" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (OK==-2)" + cl);
     cs.Append("	{" + cl);
     if (Configuration.ExplicitErrorEncoding == true)
     {
         cs.Append("		if ((msg = (char*)malloc(25 + (int)strlen(varName))) == NULL) ILIBCRITICALEXIT(254);" + cl);
         cs.Append("		snprintf(msg, 25 + (int)strlen(varName), \"Argument[%s] out of range\", varName);" + cl);
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, msg);" + cl);
         cs.Append("		free(msg);" + cl);
     }
     else
     {
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, \"Illegal value\");" + cl);
     }
     cs.Append("		return(-1);" + cl);
     cs.Append("	}" + cl);
     cs.Append("	*((unsigned long*)outVar) = TempULong;" + cl);
     cs.Append("	return(0);" + cl);
     cs.Append("}" + cl);
 }
        public static string GetCPlusPlusAbstraction_H(UPnPDevice[] devices)
        {
            string WC = SourceCodeRepository.GetCPlusPlus_Template_H("UPnP");
            string WC2;
            CodeProcessor sb = new CodeProcessor(new StringBuilder(),false);
            bool ok = false;
            bool CPok = false;

            foreach(UPnPDevice d in devices)
            {
                if (((ServiceGenerator.Configuration)d.User).ConfigType==ServiceGenerator.ConfigurationType.DEVICE)
                {
                    WC2 = GetCPlusPlusAbstraction_H_FriendDevice(WC,d);
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_Friends_BEGIN}}}",WC2);

                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_GetDevice_BEGIN}}}","//{{{Manager_GetDevice_END}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}","UPnP_Device_"+d.User2.ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_GetDevice_BEGIN}}}",WC2);

                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_Device_BEGIN}}}","//{{{Manager_Device_END}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}","UPnP_Device_"+d.User2.ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_Device_BEGIN}}}",WC2);

                    WC = GetCPlusPlusAbstraction_H_Device(WC,d);
                    ok = true;
                }
                else
                {
                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_SetControlPoint_BEGIN}}}","//{{{Manager_SetControlPoint_END}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}",d.User2.ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_SetControlPoint_BEGIN}}}",WC2);

                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_ProtectedCP_Stuff_BEGIN}}}","//{{{Manager_ProtectedCP_Stuff_END}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}",d.User2.ToString());
                    WC2 = WC2.Replace("{{{DEVICE_ID}}}",d.GetHashCode().ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_ProtectedCP_Stuff_BEGIN}}}",WC2);

                    WC2 = GetCPlusPlusAbstraction_H_Device_CP(WC,d);
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{BEGIN_CP_SERVICE}}}",WC2);
                    CPok = true;
                    ok = true;
                }
            }

            WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_SetControlPoint_BEGIN}}}","//{{{Manager_SetControlPoint_END}}}",WC);
            WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_ProtectedCP_Stuff_BEGIN}}}","//{{{Manager_ProtectedCP_Stuff_END}}}",WC);

            if (!CPok)
            {
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{ControlPoint_Begin}}}","//{{{ControlPoint_End}}}",WC);
            }
            else
            {
                WC = SourceCodeRepository.RemoveTag("//{{{ControlPoint_Begin}}}","//{{{ControlPoint_End}}}",WC);
            }

            if (ok)
            {
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Device_Begin}}}","//{{{Device_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Service_Begin}}}","//{{{Service_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_Friends_BEGIN}}}","//{{{Manager_Friends_END}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_GetDevice_BEGIN}}}","{{{Manager_GetDevice_END}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_Device_BEGIN}}}","//{{{Manager_Device_END}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_CP_SERVICE}}}","//{{{END_CP_SERVICE}}}",WC);

                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_EVENT_TYPEDEF}}}","//{{{END_EVENT_TYPEDEF}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_EVENT}}}","//{{{END_EVENT}}}",WC);
                sb.Append(WC);
            }
            return(sb.ToString());
        }
        private void CreateMicroStackDef_Device(CodeProcessor cs, UPnPDevice d, ref int counter)
        {
            ++counter;

            cs.Append("const char *FriendlyName" + counter.ToString() + ", ");
            foreach (UPnPDevice dx in d.EmbeddedDevices)
            {
                CreateMicroStackDef_Device(cs, dx, ref counter);
            }
        }
        public static string GetPopulatedDeviceObjectsString(UPnPDevice d)
        {
            Hashtable VarTable = new Hashtable();
            Hashtable ActionTable = new Hashtable();

            CodeProcessor cs = new CodeProcessor(new StringBuilder(),false);
            cs.NewLine = "\r\n";

            DeviceObjectGenerator.GenerateStateVariableLookupTable(d,VarTable);
            DeviceObjectGenerator.GenerateActionLookupTable(d,ActionTable);

            PopulateStateVariableStructs(cs,d,VarTable);
            PopulateActionStructs(cs,d,ActionTable);
            PopulateServiceStructs(cs,d);
            PopulateDeviceStructs(cs,d);

            return(cs.ToString());
        }
 private void CreateMicroStack_Device_Values(CodeProcessor cs, UPnPDevice d)
 {
     cs.Append("\"" + (string)FriendlyNameTable[d] + "\", ");
     foreach (UPnPDevice dx in d.EmbeddedDevices)
     {
         CreateMicroStack_Device_Values(cs, dx);
     }
 }
        protected static void BuildActionStructs(CodeProcessor cs, UPnPDevice d)
        {
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                BuildActionStructs(cs,ed);
            }
            foreach(UPnPService s in d.Services)
            {
                string stringX;
                int stringXLen;
                StringBuilder sb = new StringBuilder();
                StringWriter SW = new StringWriter(sb);
                XmlTextWriter X = new XmlTextWriter(SW);

                foreach(UPnPAction a in s.Actions)
                {
                    UPnPDebugObject dobj = new UPnPDebugObject(a);
                    dobj.InvokeNonStaticMethod("GetXML",new object[1]{X});
                }
                InjectCompressedString(out stringX,out stringXLen,sb.ToString(),cs.NewLine);

                cs.Append("struct UPnP_ActionTable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+cs.NewLine);
                cs.Append("{"+cs.NewLine);
                cs.Append("	char Reserved["+stringXLen.ToString()+"];"+cs.NewLine);
                cs.Append("	int ReservedXL;"+cs.NewLine);
                cs.Append("	int ReservedUXL;"+cs.NewLine);
                cs.Append("};"+cs.NewLine);

                foreach(UPnPAction a in s.Actions)
                {
                    cs.Append("struct UPnP_Action_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+a.Name+cs.NewLine);
                    cs.Append("{"+cs.NewLine);
                    cs.Append("	int Reserved;"+cs.NewLine);
                    cs.Append("	int Reserved2;"+cs.NewLine);
                    cs.Append("};"+cs.NewLine);
                }
            }
        }
 private void TypeCheckBoolean(CodeProcessor cs, UPnPArgument args)
 {
     cs.Append("	OK=0;" + cl);
     cs.Append("	if (p_" + args.Name + "Length == 4)" + cl);
     cs.Append("	{" + cl);
     cs.Append("		if (strncasecmp(p_" + args.Name + ",\"true\",4) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			_" + args.Name + " = 1;" + cl);
     cs.Append("		}" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (p_" + args.Name + "Length == 5)" + cl);
     cs.Append("	{" + cl);
     cs.Append("		if (strncasecmp(p_" + args.Name + ",\"false\",5) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			_" + args.Name + " = 0;" + cl);
     cs.Append("		}" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (p_" + args.Name + "Length == 1)" + cl);
     cs.Append("	{" + cl);
     cs.Append("		if (memcmp(p_" + args.Name + ",\"0\",1) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			_" + args.Name + " = 0;" + cl);
     cs.Append("		}" + cl);
     cs.Append("		if (memcmp(p_" + args.Name + ",\"1\",1) == 0)" + cl);
     cs.Append("		{" + cl);
     cs.Append("			OK = 1;" + cl);
     cs.Append("			_" + args.Name + " = 1;" + cl);
     cs.Append("		}" + cl);
     cs.Append("	}" + cl);
     cs.Append("	if (OK == 0)" + cl);
     cs.Append("	{" + cl);
     if (Configuration.ExplicitErrorEncoding == true)
     {
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, \"Argument[" + args.Name + "] illegal value\");" + cl);
     }
     else
     {
         cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject, 402, \"Illegal value\");" + cl);
     }
     cs.Append("		return;" + cl);
     cs.Append("	}" + cl);
 }
        protected static void BuildServiceStructs(CodeProcessor cs, UPnPDevice d)
        {
            foreach(UPnPDevice ed in d.EmbeddedDevices)
            {
                BuildServiceStructs(cs,ed);
            }
            foreach(UPnPService s in d.Services)
            {
                cs.Append("struct UPnP_Service_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+cs.NewLine);
                cs.Append("{"+cs.NewLine);
                foreach(UPnPAction a in s.Actions)
                {
                    cs.Append("	struct UPnP_Action_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+a.Name+" *"+a.Name+";"+cs.NewLine);
                }
                cs.Append(cs.NewLine);
                foreach(UPnPStateVariable v in s.GetStateVariables())
                {
                    cs.Append("	struct UPnP_StateVariable_"+((ServiceGenerator.ServiceConfiguration)s.User).Name+"_"+v.Name+" *StateVar_"+v.Name+";"+cs.NewLine);
                }

                string stringX;
                int stringXLen;
                StringBuilder sb = new StringBuilder();
                StringWriter SW = new StringWriter(sb);
                XmlTextWriter X = new XmlTextWriter(SW);
                s.GetServiceXML(X);
                InjectCompressedString(out stringX,out stringXLen,sb.ToString(),cs.NewLine);

                cs.Append(cs.NewLine);
                cs.Append("	char Reserved["+stringXLen.ToString()+"];"+cs.NewLine);
                cs.Append("	int ReservedXL;"+cs.NewLine);
                cs.Append("	int ReservedUXL;"+cs.NewLine);
                cs.Append("};"+cs.NewLine);
            }
        }
 private void TypeCheckDateTime(CodeProcessor cs, UPnPArgument args)
 {
     cs.Append("	p_" + args.Name + "[p_" + args.Name + "Length]=0;" + cl);
     cs.Append("	_" + args.Name + " = " + this.pc_methodLibPrefix + "Time_Parse(p_" + args.Name + ");" + cl);
 }
        public static string GetCPlusPlusAbstraction_CPP(UPnPDevice[] devices)
        {
            string WC = SourceCodeRepository.GetCPlusPlus_Template_CPP("UPnP");
            string WC2;
            CodeProcessor sb = new CodeProcessor(new StringBuilder(),false);
            bool ok = false;
            bool cpok = false;

            foreach(UPnPDevice d in devices)
            {
                if (((ServiceGenerator.Configuration)d.User).ConfigType==ServiceGenerator.ConfigurationType.DEVICE)
                {
                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{MicroStackInclude_Begin}}}","//{{{MicroStackInclude_End}}}");
                    WC2 = WC2.Replace("{{{PREFIX}}}",((ServiceGenerator.Configuration)d.User).Prefix);
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{MicroStackInclude_Begin}}}",WC2);

                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_Constructor_Begin}}}","//{{{Manager_Constructor_End}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}","UPnP_Device_"+d.User2.ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_Constructor_Begin}}}",WC2);

                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_GetDevice_Begin}}}","//{{{Manager_GetDevice_End}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}","UPnP_Device_"+d.User2.ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_GetDevice_Begin}}}",WC2);

                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_Destructor_Begin}}}","//{{{Manager_Destructor_End}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}","UPnP_Device_"+d.User2.ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_Destructor_Begin}}}",WC2);

                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{IPADDRESS_HANDLER_BEGIN}}}","//{{{IPADDRESS_HANDLER_END}}}");
                    WC2 = WC2.Replace("{{{PREFIX}}}",((ServiceGenerator.Configuration)d.User).Prefix);
                    WC2 = WC2.Replace("{{{DEVICE}}}","UPnP_Device_"+d.User2.ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{IPADDRESS_HANDLER_BEGIN}}}",WC2);

                    WC2 = GetCPlusPlusAbstraction_CPP_Device(WC,d);
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Device_Begin}}}",WC2);
                    ok = true;
                }
                else
                {
                    // Includes
                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{CPMicroStackInclude_Begin}}}","//{{{CPMicroStackInclude_End}}}");
                    WC2 = WC2.Replace("{{{PREFIX}}}",((ServiceGenerator.Configuration)d.User).Prefix);
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{CPMicroStackInclude_Begin}}}",WC2);

                    // Constructor
                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{Manager_CPConstructor_Begin}}}","//{{{Manager_CPConstructor_End}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}",d.User2.ToString());
                    WC2 = WC2.Replace("{{{PREFIX}}}",((ServiceGenerator.Configuration)d.User).Prefix);
                    WC2 = WC2.Replace("{{{DEVICEID}}}",d.GetHashCode().ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{Manager_CPConstructor_Begin}}}",WC2);

                    // Discover/Remove Sinks
                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{BEGIN_CPDiscoverSink}}}","//{{{END_CPDiscoverSink}}}");
                    WC2 = WC2.Replace("{{{PREFIX}}}",((ServiceGenerator.Configuration)d.User).Prefix);
                    WC2 = WC2.Replace("{{{DEVICE}}}",d.User2.ToString());
                    WC2 = WC2.Replace("{{{DEVICEID}}}",d.GetHashCode().ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{BEGIN_CPDiscoverSink}}}",WC2);

                    // SetControlPoint
                    WC2 = SourceCodeRepository.GetTextBetweenTags(WC,"//{{{BEGIN_SetControlPoint}}}","//{{{END_SetControlPoint}}}");
                    WC2 = WC2.Replace("{{{DEVICE}}}",d.User2.ToString());
                    WC2 = WC2.Replace("{{{DEVICEID}}}",d.GetHashCode().ToString());
                    WC = SourceCodeRepository.InsertTextBeforeTag(WC,"//{{{BEGIN_SetControlPoint}}}",WC2);

                    // Device/Service Specific Stuff
                    WC = AddCPlusPlusAbstraction_CPP_ControlPoint(WC,d);

                    cpok = true;
                    ok = true;
                }
            }
            if (!cpok)
            {
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{CP_BEGIN}}}","//{{{CP_END}}}",WC);
            }
            else
            {
                WC = SourceCodeRepository.RemoveTag("//{{{CP_BEGIN}}}","//{{{CP_END}}}",WC);
            }
            if (ok)
            {
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_Destructor_Begin}}}","//{{{Manager_Destructor_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_Constructor_Begin}}}","//{{{Manager_Constructor_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_GetDevice_Begin}}}","//{{{Manager_GetDevice_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Device_Begin}}}","//{{{Device_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Service_Begin}}}","//{{{Service_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{SERVICE_VIRTUAL_METHOD_BASE_IMPLEMENTATION_BEGIN}}}","//{{{SERVICE_VIRTUAL_METHOD_BASE_IMPLEMENTATION_END}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Service_Instantiation_Begin}}}","//{{{Service_Instantiation_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Device_Instantiation_Begin}}}","//{{{Device_Instantiation_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{SinkList_Begin}}}","//{{{SinkList_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Destructor_Begin}}}","//{{{Destructor_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Dispatch_Begin}}}","//{{{Dispatch_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{MicroStackInclude_Begin}}}","//{{{MicroStackInclude_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{IPADDRESS_HANDLER_BEGIN}}}","//{{{IPADDRESS_HANDLER_END}}}",WC);

                // Control Point Specific
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{CPMicroStackInclude_Begin}}}","//{{{CPMicroStackInclude_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{Manager_CPConstructor_Begin}}}","//{{{Manager_CPConstructor_End}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_CPDiscoverSink}}}","//{{{END_CPDiscoverSink}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_ServiceCheck}}}","//{{{END_ServiceCheck}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_SetControlPoint}}}","//{{{END_SetControlPoint}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_CP_Constructor}}}","//{{{END_CP_Constructor}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_CP_Invoke}}}","//{{{END_CP_Invoke}}}",WC);

                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_CPEVENT_SINK}}}","//{{{END_CPEVENT_SINK}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_CPEVENT_SUBSCRIBE}}}","//{{{END_CPEVENT_SUBSCRIBE}}}",WC);
                WC = SourceCodeRepository.RemoveAndClearTag("//{{{BEGIN_EVENT}}}","//{{{END_EVENT}}}",WC);
                WC = WC.Replace("//{{{REGISTER}}}","");

                sb.Append(WC);
            }
            return(sb.ToString());
        }
        private void TypeCheckIntegral(CodeProcessor cs, UPnPArgument args)
        {
            UPnPDebugObject obj = new UPnPDebugObject(args.RelatedStateVar.GetNetType());
            switch (args.RelatedStateVar.GetNetType().FullName)
            {
                case "System.SByte":
                case "System.Int16":
                case "System.Int32":
                    cs.Append("	OK = " + pc_methodLibPrefix + "GetLong(p_" + args.Name + ",p_" + args.Name + "Length, &TempLong);" + cl);
                    break;
                case "System.Byte":
                case "System.UInt16":
                case "System.UInt32":
                    cs.Append("	OK = " + pc_methodLibPrefix + "GetULong(p_" + args.Name + ",p_" + args.Name + "Length, &TempULong);" + cl);
                    break;
            }
            cs.Append("	if (OK!=0)" + cl);
            cs.Append("	{" + cl);
            if (Configuration.ExplicitErrorEncoding == true)
            {
                cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Argument[" + args.Name + "] illegal value\");" + cl);
            }
            else
            {
                cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Illegal value\");" + cl);
            }
            cs.Append("		return;" + cl);
            cs.Append("	}" + cl);

            bool endtag = false;
            switch (args.RelatedStateVar.GetNetType().FullName)
            {
                case "System.SByte":
                case "System.Int16":
                case "System.Int32":
                    if (args.RelatedStateVar.Minimum == null && args.RelatedStateVar.Maximum == null)
                    {
                        // No need to check anything since this is without bounds.
                    }
                    else
                    {
                        // Check lower and upper bounds.
                        endtag = true;
                        cs.Append("	else" + cl);
                        cs.Append("	{" + cl);
                        if (!Configuration.DynamicObjectModel)
                        {
                            cs.Append("		if (!(TempLong>=");
                            if (args.RelatedStateVar.Minimum != null)
                            {
                                cs.Append("(long)0x" + ToHex(args.RelatedStateVar.Minimum));
                            }
                            else
                            {
                                cs.Append("(long)0x" + ToHex(obj.GetStaticField("MinValue")));
                            }
                            cs.Append(" && TempLong<=");
                            if (args.RelatedStateVar.Maximum != null)
                            {
                                cs.Append("(long)0x" + ToHex(args.RelatedStateVar.Maximum));
                            }
                            else
                            {
                                cs.Append("(long)0x" + ToHex(obj.GetStaticField("MaxValue")));
                            }
                            cs.Append("))" + cl);
                        }
                        else
                        {
                            string vIdent = DeviceObjectGenerator.GetStateVariableIdentifier(args.RelatedStateVar);

                            cs.Append("	OK = 0;" + cs.NewLine);
                            cs.Append("	if (" + vIdent + "->MinMaxStep[0]!=NULL)" + cs.NewLine);
                            cs.Append("	{" + cs.NewLine);
                            cs.Append("		" + pc_methodLibPrefix + "GetLong(" + vIdent + "->MinMaxStep[0],(int)strlen(" + vIdent + "->MinMaxStep[0]), &TempLong2);" + cl);
                            cs.Append("		if (TempLong<TempLong2){OK=1;}" + cs.NewLine);
                            cs.Append("	}" + cs.NewLine);
                            cs.Append("	if (" + vIdent + "->MinMaxStep[1]!=NULL)" + cs.NewLine);
                            cs.Append("	{" + cs.NewLine);
                            cs.Append("		" + pc_methodLibPrefix + "GetLong(" + vIdent + "->MinMaxStep[1],(int)strlen(" + vIdent + "->MinMaxStep[1]), &TempLong2);" + cl);
                            cs.Append("		if (TempLong>TempLong2){OK=1;}" + cs.NewLine);
                            cs.Append("	}" + cs.NewLine);
                            cs.Append("	if (OK!=0)" + cs.NewLine);
                        }
                        cs.Append("		{" + cl);
                        if (Configuration.ExplicitErrorEncoding == true)
                        {
                            cs.Append("		  " + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Argument[" + args.Name + "] out of Range\");" + cl);
                        }
                        else
                        {
                            cs.Append("		  " + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Illegal value\");" + cl);
                        }
                        cs.Append("		  return;" + cl);
                        cs.Append("		}" + cl);
                    }
                    break;
                case "System.Byte":
                case "System.UInt16":
                case "System.UInt32":
                    if (args.RelatedStateVar.Minimum == null && args.RelatedStateVar.Maximum == null)
                    {
                        // No need to check anything since this is an int without bounds.
                    }
                    else
                    {
                        endtag = true;
                        cs.Append("	else" + cl);
                        cs.Append("	{" + cl);
                        if (!this.Configuration.DynamicObjectModel)
                        {
                            cs.Append("		if (!(TempULong>=");
                            if (args.RelatedStateVar.Minimum != null)
                            {
                                cs.Append("(unsigned long)0x" + ToHex(args.RelatedStateVar.Minimum));
                            }
                            else
                            {
                                cs.Append("(unsigned long)0x" + ToHex(obj.GetStaticField("MinValue")));
                            }
                            cs.Append(" && TempULong<=");
                            if (args.RelatedStateVar.Maximum != null)
                            {
                                cs.Append("(unsigned long)0x" + ToHex(args.RelatedStateVar.Maximum));
                            }
                            else
                            {
                                cs.Append("(unsigned long)0x" + ToHex(obj.GetStaticField("MaxValue")));
                            }
                            cs.Append("))" + cl);
                        }
                        else
                        {
                            string vIdent = DeviceObjectGenerator.GetStateVariableIdentifier(args.RelatedStateVar);

                            cs.Append("	OK = 0;" + cs.NewLine);
                            cs.Append("	if (" + vIdent + "->MinMaxStep[0]!=NULL)" + cs.NewLine);
                            cs.Append("	{" + cs.NewLine);
                            cs.Append("		" + pc_methodLibPrefix + "GetULong(" + vIdent + "->MinMaxStep[0],(int)strlen(" + vIdent + "->MinMaxStep[0]), &TempULong2);" + cl);
                            cs.Append("		if (TempULong<TempULong2){OK=1;}" + cs.NewLine);
                            cs.Append("	}" + cs.NewLine);
                            cs.Append("	if (" + vIdent + "->MinMaxStep[1]!=NULL)" + cs.NewLine);
                            cs.Append("	{" + cs.NewLine);
                            cs.Append("		" + pc_methodLibPrefix + "GetULong(" + vIdent + "->MinMaxStep[1],(int)strlen(" + vIdent + "->MinMaxStep[1]), &TempULong2);" + cl);
                            cs.Append("		if (TempULong>TempULong2){OK=1;}" + cs.NewLine);
                            cs.Append("	}" + cs.NewLine);
                            cs.Append("	if (OK!=0)" + cs.NewLine);
                        }
                        cs.Append("		{" + cl);
                        if (Configuration.ExplicitErrorEncoding == true)
                        {
                            cs.Append("		  " + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Argument[" + args.Name + "] out of Range\");" + cl);
                        }
                        else
                        {
                            cs.Append("		  " + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Illegal value\");" + cl);
                        }
                        cs.Append("		  return;" + cl);
                        cs.Append("		}" + cl);
                    }
                    break;
            }

            switch (args.RelatedStateVar.GetNetType().FullName)
            {
                case "System.SByte":
                case "System.Int16":
                case "System.Int32":
                    cs.Append("	_" + args.Name + " = (" + ToCType(args.RelatedStateVar.GetNetType().FullName) + ")TempLong;" + cl);
                    break;
                case "System.Byte":
                case "System.UInt16":
                case "System.UInt32":
                    cs.Append("	_" + args.Name + " = (" + ToCType(args.RelatedStateVar.GetNetType().FullName) + ")TempULong;" + cl);
                    break;
            }
            if (endtag == true) cs.Append(" }" + cl);
        }
        public bool Build_UPnPHTTPClient(DirectoryInfo outputDirectory)
        {
            StreamWriter writer;

            if (this.Platform == PLATFORMS.POSIX)
            {
                pc_SockType = "int";
            //				pc_TimeType = "struct timeval";
                pc_SockClose = "close";
            //				pc_stricmp = "strncasecmp";
            }

            if (this.Platform == PLATFORMS.WINDOWS)
            {
                pc_SockType = "SOCKET";
            //				pc_TimeType = "unsigned int";
                pc_SockClose = "closesocket";
            //				pc_stricmp = "_strnicmp";
            }

            if (this.Language == LANGUAGES.C)
            {
                pc_methodPrefix = CallPrefix;
                pc_methodLibPrefix = CallLibPrefix;
                pc_methodPrefixDef = CallingConvention + CallPrefix;
            }

            CodeProcessor cs = new CodeProcessor(new StringBuilder(),this.Language == LANGUAGES.CPP);

            /* Build UPnPHTTPClient.h */
            AddLicense(cs,pc_methodPrefix+"HTTPClient.h");

            cs.Append(cl);
            cs.Append("#ifndef __"+pc_methodPrefix+"HTTPClient__"+cl);
            cs.Append("#define __"+pc_methodPrefix+"HTTPClient__"+cl);
            cs.Append(cl);
            cs.Append("#define HTTP_SESSION_INTERRUPT_CHAIN 1"+cl);
            cs.Append("#define HTTP_SESSION_INTERRUPT_PEERRESET 2"+cl);
            cs.Append("#define HTTP_INTERRUPT_CHAIN 3"+cl);
            cs.Append("#define HTTP_DELETEREQUEST_INTERRUPT 4"+cl);

            cs.Append("#define "+pc_methodPrefix+"AddRequest_Direct(ClientModule, buffer, bufferlength,Destination, CallbackPtr, user, user2) "+pc_methodPrefix+"AddRequest_DirectEx(ClientModule, buffer, bufferlength,NULL,0,Destination, CallbackPtr, user, user2)"+cl);
            cs.Append(cl);
            cs.Comment("Forward Declaration");
            cs.Append("struct packetheader;"+cl+cl);

            cs.Append("void* "+pc_methodPrefix+"CreateHTTPClientModule(void *Chain, int MaxSockets);"+cl);
            cs.Append("void  "+pc_methodPrefix+"DestroyHTTPClientModule(void *ClientModule);"+cl);
            cs.Append(cl);
            cs.Append("char* "+pc_methodPrefix+"GetReceivingInterface(void* ReaderObject);"+cl);
            cs.Append("void  "+pc_methodPrefix+"AddRequest(void *ClientModule, struct packetheader *packet,struct sockaddr_in *Destination, void (*CallbackPtr)(void *reader, struct packetheader *header, int IsInterrupt,char* buffer, int *p_BeginPointer, int EndPointer, int done, void* user, void* user2), void* user, void* user2);"+cl);
            cs.Append("void  "+pc_methodPrefix+"AddRequest_DirectEx(void *ClientModule, char *buffer, int bufferlength,char *buffer2, int buffer2length,struct sockaddr_in *Destination, void (*CallbackPtr)(void *reader, struct packetheader *header, int IsInterrupt, char* buffer, int *p_BeginPointer, int EndPointer, int done, void* user, void* user2), void* user, void* user2);"+cl);
            cs.Append("void  "+pc_methodPrefix+"CloseRequest(void* ReaderObject);"+cl);
            cs.Append("void  "+pc_methodPrefix+"DeleteRequests(void *ClientModule, void *user1);"+cl);

            cs.Append(cl);
            cs.Append("#endif"+cl);

            writer = File.CreateText(outputDirectory.FullName + "\\"+pc_methodPrefix+"HTTPClient.h");
            writer.Write(cs.ToString());
            writer.Close();

            /* Build UPnPHTTPClient.c */
            cs = new CodeProcessor(new StringBuilder(),this.Language == LANGUAGES.CPP);
            if (this.Language == LANGUAGES.CPP)
            {
                AddLicense(cs,pc_methodPrefix+"HTTPClient.cpp");
            }
            else
            {
                AddLicense(cs,pc_methodPrefix+"HTTPClient.c");
            }
            cs.Append(cl);

            if (this.Platform==PLATFORMS.WINDOWS)
            {
                cs.Append("#ifndef MICROSTACK_NO_STDAFX"+cl);
                cs.Append("#include \"stdafx.h\""+cl);
                cs.Append("#endif"+cl);
                cs.Append("#define _CRTDBG_MAP_ALLOC"+cl);
                cs.Append("#include <math.h>"+cl);
                cs.Append("#include <winerror.h>"+cl);
                cs.Append("#include <stdlib.h>"+cl);
                cs.Append("#include <stdio.h>"+cl);
                cs.Append("#include <stddef.h>"+cl);
                cs.Append("#include <string.h>"+cl);
                if (this.WinSock == 1)
                {
                    cs.Append("#include <winsock.h>"+cl);
                    cs.Append("#include <wininet.h>"+cl);
                }
                if (this.WinSock == 2)
                {
                    cs.Append("#include <winsock2.h>"+cl);
                    cs.Append("#include <ws2tcpip.h>"+cl);
                }
                if (this.SubTarget != SUBTARGETS.PPC2003)
                {
            //					cs.Append("#include <errno.h>"+cl);
                }
                cs.Append("#include <windows.h>"+cl);
                cs.Append("#include <winioctl.h>"+cl);
                cs.Append("#include <winbase.h>"+cl);

                cs.Append("#include <crtdbg.h>"+cl);
            }
            else
            {
                if (this.SubTarget == SUBTARGETS.NUCLEUS)
                {
                    cs.Append("#include <stdio.h>"+cl);
                    cs.Append("#include <stdlib.h>"+cl);
                    cs.Append("#include \"net/inc/externs.h\""+cl);
                    cs.Append("#include \"net/inc/ip.h\""+cl);
                    cs.Append("#include \"net/inc/socketd.h\""+cl);
                    cs.Append("#include <errno.h>"+cl);
                }
                else
                {
                    cs.Append("#include <stdio.h>"+cl);
                    cs.Append("#include <stdlib.h>"+cl);
                    cs.Append("#include <sys/types.h>"+cl);
                    cs.Append("#include <sys/socket.h>"+cl);
                    cs.Append("#include <netinet/in.h>"+cl);
                    cs.Append("#include <arpa/inet.h>"+cl);
                    cs.Append("#include <sys/time.h>"+cl);
                    cs.Append("#include <netdb.h>"+cl);
                    cs.Append("#include <string.h>"+cl);
                    cs.Append("#include <sys/ioctl.h>"+cl);
                    cs.Append("#include <net/if.h>"+cl);
                    cs.Append("#include <sys/utsname.h>"+cl);
                    cs.Append("#include <sys/socket.h>"+cl);
                    cs.Append("#include <netinet/in.h>"+cl);
                    cs.Append("#include <unistd.h>"+cl);
                    cs.Append("#include <fcntl.h>"+cl);
                    //cs.Append("#include <errno.h>"+cl);
                    cs.Append("#include <semaphore.h>"+cl);
                    cs.Append("#include <malloc.h>"+cl);
                }
            }
            cs.Append(cl);
            cs.Append("#include \""+pc_methodPrefix+"HTTPClient.h\""+cl);
            cs.Append("#include \""+pc_methodPrefix+"Parsers.h\""+cl);

            if (this.Platform == PLATFORMS.WINDOWS)
            {
                cs.Append("#define strncasecmp(x,y,z) _strnicmp(x,y,z)"+cl);
                cs.Append("#define gettimeofday(x,y) (x)->tv_sec = GetTickCount()/1000"+cl);
            }

            if (this.Platform != PLATFORMS.POSIX)
            {
                cs.Append("#define sem_t HANDLE"+cl);
                cs.Append("#define sem_init(x,y,z) *x=CreateSemaphore(NULL,z,FD_SETSIZE,NULL)"+cl);
                cs.Append("#define sem_destroy(x) (CloseHandle(*x)==0?1:0)"+cl);
                cs.Append("#define sem_wait(x) WaitForSingleObject(*x,INFINITE)"+cl);
                cs.Append("#define sem_trywait(x) ((WaitForSingleObject(*x,0)==WAIT_OBJECT_0)?0:1)"+cl);
                cs.Append("#define sem_post(x) ReleaseSemaphore(*x,1,NULL)"+cl);
            }

            cs.Append("#define DEBUGSTATEMENT(x)"+cl);
            cs.Append("#define LVL3DEBUG(x)"+cl);
            cs.Append(cl);

            cs.Append("struct RequestQueueNode"+cl);
            cs.Append("{"+cl);
            cs.Append("	char* Request;"+cl);
            cs.Append("	char* Request2;"+cl);
            cs.Append("	int RequestLength;"+cl);
            cs.Append("	int Request2Length;"+cl);
            cs.Append("	struct sockaddr_in Destination;"+cl);
            cs.Append("	void* user;"+cl);
            cs.Append("	void* user2;"+cl);
            cs.Append("	void (*FunctionCallback) (void *sender, struct packetheader *header, int IsInterrupt, char* buffer, int *p_BeginPointer, int EndPointer, int done, void* user, void* user2);"+cl);
            cs.Append("	struct RequestQueueNode* Next;"+cl);
            cs.Append("	struct RequestQueueNode* Previous;"+cl);
            cs.Append("};"+cl);
            cs.Append(cl);

            cs.Append("struct "+this.pc_methodPrefix+"HCHTTPReaderObject"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct packetheader* PacketHeader;"+cl);
            cs.Append("	char Header[2048];"+cl);
            cs.Append("	char* Body;"+cl);
            cs.Append("	int BodySize;"+cl);
            cs.Append("	int HeaderIndex;"+cl);
            cs.Append("	int LocalIPAddress;"+cl);
            cs.Append(cl);
            cs.Append("	int Body_BeginPointer;"+cl);
            cs.Append("	int Body_EndPointer;"+cl);
            cs.Append("	int Body_MallocSize;"+cl);
            cs.Append("	int Body_Read;"+cl);
            cs.Append(cl);
            cs.Append("	"+pc_SockType+" ClientSocket;"+cl);
            cs.Append("	int FinRead;"+cl);
            cs.Append("	int FinConnect;"+cl);
            cs.Append("	struct HTTPClientModule *Parent;"+cl);
            cs.Append("	void* user;"+cl);
            cs.Append("	void* user2;"+cl);
            cs.Append("	void (*FunctionCallback) (struct "+this.pc_methodPrefix+"HCHTTPReaderObject *ReaderObject, struct packetheader *header, int IsInterrupt, char* buffer, int *BeginPointer, int BufferSize, int done, void* user, void* user2);"+cl);
            cs.Append("	char* send_data;"+cl);
            cs.Append("	char* send_data2;"+cl);
            cs.Append("	int send_dataLength;"+cl);
            cs.Append("	int send_data2Length;"+cl);
            cs.Append("};"+cl);
            cs.Append(cl);

            cs.Append("struct HTTPClientModule"+cl);
            cs.Append("{"+cl);
            cs.Append("void (*PreSelect)(void* object,fd_set *readset, fd_set *writeset, fd_set *errorset, int* blocktime);"+cl);
            cs.Append("void (*PostSelect)(void* object,int slct, fd_set *readset, fd_set *writeset, fd_set *errorset);"+cl);
            cs.Append("void (*Destroy)(void* object);"+cl);
            cs.Append("void *Chain;"+cl);

            cs.Append("	sem_t QueueLock;"+cl);
            cs.Append("	sem_t Monitor;"+cl);
            cs.Append("	int RequestQueueCount;"+cl);
            cs.Append("	struct RequestQueueNode* First;"+cl);
            cs.Append("	int NumSlots;"+cl);
            cs.Append("	struct "+this.pc_methodPrefix+"HCHTTPReaderObject *Readers;"+cl);
            cs.Append("	int Terminate;"+cl);
            cs.Append("	void *Reserved;"+cl);
            cs.Append(cl);
            cs.Append("	void *SocketTimer;"+cl);
            cs.Append(cl);
            cs.Append("	LVL3DEBUG(int ADD_COUNTER;)"+cl);
            cs.Append("	LVL3DEBUG(int FAILED_COUNTER;)"+cl);
            cs.Append("	LVL3DEBUG(int GRACEFUL_COUNTER;)"+cl);
            cs.Append("	LVL3DEBUG(int FORCE_COUNTER;)"+cl);
            cs.Append("	LVL3DEBUG(int START_COUNTER;)"+cl);
            cs.Append("	LVL3DEBUG(int CLOSE_COUNTER;)"+cl);
            cs.Append("	LVL3DEBUG(int SEND_FAIL;)"+cl);
            cs.Append("	LVL3DEBUG(int SEND_FAIL2;)"+cl);
            cs.Append("	LVL3DEBUG(int CONNECT_COUNTER;)"+cl);
            cs.Append(cl);
            cs.Append("};"+cl);
            cs.Append(cl);

            //			cs.Append("extern int errno;"+cl);
            cs.Append(cl);

            string stype = this.pc_SockType;
            if (this.Platform==PLATFORMS.WINDOWS && this.WinSock==2)
            {
                stype = "HANDLE";
            }

            cs.Append("char* "+pc_methodPrefixDef+"GetReceivingInterface(void* ReaderObject)"+cl);
            cs.Append("{"+cl);
            cs.Append("	char* RetVal = (char*)malloc(16);"+cl);
            cs.Append("	int addr = ((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->LocalIPAddress;"+cl);
            cs.Append("	sprintf(RetVal,\"%d.%d.%d.%d\",(addr&0xFF),((addr>>8)&0xFF),((addr>>16)&0xFF),((addr>>24)&0xFF));"+cl);
            cs.Append("	return(RetVal);"+cl);
            cs.Append("}"+cl);
            cs.Append("void "+pc_methodPrefixDef+"DestroyHTTPClientModule(void *ClientModule)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct HTTPClientModule* module = (struct HTTPClientModule*)ClientModule;"+cl);
            cs.Append("	int i;"+cl);
            cs.Append("	struct RequestQueueNode *rqn,*rqn2;"+cl);
            cs.Append(cl);
            cs.Append("	LVL3DEBUG(printf(\"\\r\\n\\r\\nAdd:%d Failed:%d GC:%d Forced:%d Started:%d UserClose:%d SF:%d SF2:%d\",module->ADD_COUNTER,module->FAILED_COUNTER,module->GRACEFUL_COUNTER,module->FORCE_COUNTER,module->START_COUNTER,module->CLOSE_COUNTER,module->SEND_FAIL,module->SEND_FAIL2);)"+cl);
            cs.Append("	LVL3DEBUG(printf(\"\\r\\nConnected: %d \\r\\n\",module->CONNECT_COUNTER);)"+cl);
            cs.Append("	for(i=0;i<module->NumSlots;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		LVL3DEBUG(printf(\"Slot: %d	Socket: %d\\r\\n\",i,module->Readers[i].ClientSocket);)"+cl);
            cs.Append(cl);
            cs.Append("		if (module->Readers[i].Body_MallocSize!=0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			free(module->Readers[i].Body);"+cl);
            cs.Append("		}"+cl);
            cs.Append("		if (module->Readers[i].send_data!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			free(module->Readers[i].send_data);"+cl);
            cs.Append("		}"+cl);
            cs.Append("		if (module->Readers[i].send_data2!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			free(module->Readers[i].send_data2);"+cl);
            cs.Append("		}"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket!=~0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			"+this.pc_SockClose+"(module->Readers[i].ClientSocket);"+cl);
            cs.Append("			if (module->Readers[i].FunctionCallback!=NULL && (module->Readers[i].FinConnect==0 || (module->Readers[i].FinConnect==1 && module->Readers[i].FinRead==0)))"+cl);
            cs.Append("			{"+cl);
            cs.Append("				module->Readers[i].FunctionCallback(&(module->Readers[i]),NULL,HTTP_SESSION_INTERRUPT_CHAIN,NULL,NULL,0,-1,module->Readers[i].user,module->Readers[i].user2);"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("		if (module->Readers[i].PacketHeader!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			"+this.pc_methodPrefix+"DestructPacket(module->Readers[i].PacketHeader);"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append(cl);
            cs.Append("	rqn = module->First;"+cl);
            cs.Append("	while(rqn!=NULL)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (rqn->Request!=NULL) {free(rqn->Request);}"+cl);
            cs.Append("		if (rqn->Request2!=NULL) {free(rqn->Request2);}"+cl);
            cs.Append("		if (rqn->FunctionCallback!=NULL) {rqn->FunctionCallback(module,NULL,HTTP_INTERRUPT_CHAIN,NULL,NULL,0,-1,rqn->user,rqn->user2);}"+cl);
            cs.Append("		rqn2 = rqn->Next;"+cl);
            cs.Append("		free(rqn);"+cl);
            cs.Append("		rqn = rqn2;"+cl);
            cs.Append("	}"+cl);
            cs.Append(cl);
            cs.Append("	sem_destroy(&(module->Monitor));"+cl);
            cs.Append("	sem_destroy(&(module->QueueLock));"+cl);
            cs.Append("	free(module->Readers);"+cl);
            cs.Append("}"+cl);
            cs.Append(cl);

            cs.Append("void "+pc_methodPrefixDef+"StartRequest(void *ClientModule, struct RequestQueueNode *Request)"+cl);
            cs.Append("{"+cl);
            cs.Append("	int i=0;"+cl);
            if (this.Platform == PLATFORMS.WINDOWS)
            {
                cs.Append("	unsigned long flags;"+cl);
            }
            else
            {
                cs.Append("	unsigned int flags;"+cl);
            }
            cs.Append("	struct HTTPClientModule *module = (struct HTTPClientModule*)ClientModule;"+cl);
            cs.Append(cl);
            cs.Append("	for(i=0;i<module->NumSlots;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket==~0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			LVL3DEBUG(++module->START_COUNTER;)"+cl);
            cs.Append("			if (module->Readers[i].PacketHeader!=NULL)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				"+pc_methodPrefixDef+"DestructPacket(module->Readers[i].PacketHeader);"+cl);
            cs.Append("				module->Readers[i].PacketHeader = NULL;"+cl);
            cs.Append("			}"+cl);
            cs.Append("			module->Readers[i].FunctionCallback = (void*)Request->FunctionCallback;"+cl);
            cs.Append("			module->Readers[i].send_data = Request->Request;"+cl);
            cs.Append("			module->Readers[i].send_dataLength = Request->RequestLength;"+cl);
            cs.Append("			module->Readers[i].send_data2 = Request->Request2;"+cl);
            cs.Append("			module->Readers[i].send_data2Length = Request->Request2Length;"+cl);
            cs.Append("			module->Readers[i].FinRead = 0;"+cl);
            cs.Append("			module->Readers[i].FinConnect = 0;"+cl);
            cs.Append("			module->Readers[i].Body = NULL;"+cl);
            cs.Append("			module->Readers[i].BodySize = 0;"+cl);
            cs.Append("			module->Readers[i].HeaderIndex = 0;"+cl);
            cs.Append("			module->Readers[i].Body_Read = 0;"+cl);
            cs.Append("			module->Readers[i].Body_BeginPointer = 0;"+cl);
            cs.Append("			module->Readers[i].Body_EndPointer = 0;"+cl);
            cs.Append("			module->Readers[i].user = Request->user;"+cl);
            cs.Append("			module->Readers[i].user2 = Request->user2;"+cl);
            cs.Append("			"+pc_methodPrefix+"GetStreamSocket(htonl(INADDR_ANY),0,("+stype+"*)&(module->Readers[i].ClientSocket));"+cl);
            cs.Append(cl);

            if (this.Platform == PLATFORMS.POSIX)
            {
                cs.Comment("Platform Dependent [POSIX]");
                cs.Append("			flags = fcntl(module->Readers[i].ClientSocket,F_GETFL,0);"+cl);
                cs.Append("			fcntl(module->Readers[i].ClientSocket,F_SETFL,O_NONBLOCK|flags);"+cl);
            }
            else
            {
                cs.Comment("Platform Dependent [Windows]");
                cs.Append("			flags = 1;"+cl);
                cs.Append("			ioctlsocket(module->Readers[i].ClientSocket,FIONBIO,&flags);"+cl);
            }
            cs.Append(cl);
            cs.Append("			connect(module->Readers[i].ClientSocket,(struct sockaddr*)&(Request->Destination),sizeof(Request->Destination));	"+cl);
            cs.Append("			break;"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);
            cs.Append(cl);

            cs.Append("void "+pc_methodPrefixDef+"ForceClose(void *Reader)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct "+this.pc_methodPrefix+"HCHTTPReaderObject *r = (struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)Reader;"+cl);
            cs.Append(""+cl);
            cs.Append("	if (r->ClientSocket!=~0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		LVL3DEBUG(++r->Parent->FORCE_COUNTER;)"+cl);
            cs.Append("		"+this.pc_SockClose+"(r->ClientSocket);"+cl);
            cs.Append("		r->ClientSocket = ~0;"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+pc_methodPrefixDef+"ProcessSocket(struct "+this.pc_methodPrefix+"HCHTTPReaderObject *Reader)"+cl);
            cs.Append("{"+cl);
            cs.Append("	int bytesReceived;"+cl);
            cs.Append("	int i;"+cl);
            cs.Append("	struct packetheader_field_node *node;"+cl);
            cs.Append("	char* CharStar;"+cl);
            cs.Append(cl);
            cs.Append("	if (Reader->BodySize==0)"+cl);
            cs.Append("	{"+cl);
            cs.Comment("Still Reading Headers");
            cs.Append("		bytesReceived = recv(Reader->ClientSocket,Reader->Header+Reader->HeaderIndex,2048-Reader->HeaderIndex,0);"+cl);
            cs.Append("		if (bytesReceived==0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			LVL3DEBUG(++Reader->Parent->GRACEFUL_COUNTER;)"+cl);
            cs.Append("			if (Reader->PacketHeader!=NULL) {"+this.pc_methodPrefix+"DestructPacket(Reader->PacketHeader);}"+cl);
            cs.Append("			if (Reader->Body_MallocSize!=0) {free(Reader->Body);}"+cl);
            cs.Append("			Reader->Body = NULL;"+cl);
            cs.Append("			Reader->Body_MallocSize = 0;"+cl);
            cs.Append("			Reader->PacketHeader = NULL;"+cl);
            cs.Append("			"+this.pc_SockClose+"(Reader->ClientSocket);"+cl);
            cs.Append("			Reader->ClientSocket = ~0;"+cl);
            cs.Append("			"+this.pc_methodPrefix+"LifeTime_Remove(Reader->Parent->SocketTimer,Reader);"+cl);
            cs.Append("			if (Reader->FinRead==0)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				// Prematurely Closed: Error"+cl);
            cs.Append("				Reader->FunctionCallback(Reader,NULL,HTTP_SESSION_INTERRUPT_PEERRESET,NULL,NULL,0,-1,Reader->user,Reader->user2);"+cl);
            cs.Append("			}"+cl);
            cs.Append("			return;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		else"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (Reader->FinRead!=0)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				return;"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("		Reader->HeaderIndex += bytesReceived;"+cl);
            cs.Append("		if (Reader->HeaderIndex>4)"+cl);
            cs.Append("		{"+cl);
            cs.Comment("Must have read at least 4 bytes to perform check");
            cs.Append("			for(i=0;i<(Reader->HeaderIndex - 3);i++)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				if (Reader->Header[i] == '\\r' && Reader->Header[i+1] == '\\n' && Reader->Header[i+2] == '\\r' && Reader->Header[i+3] == '\\n')"+cl);
            cs.Append("				{"+cl);
            cs.Comment("Finished Header");
            cs.Append("					Reader->PacketHeader = "+this.pc_methodPrefix+"ParsePacketHeader(Reader->Header,0,i+4);"+cl);
            cs.Append("					if (Reader->PacketHeader==NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						//Invalid Packet"+cl);
            cs.Append("						Reader->FunctionCallback(Reader,Reader->PacketHeader,0,NULL,NULL,0,-1,Reader->user,Reader->user2);"+cl);
            cs.Append("						Reader->BodySize = 0;"+cl);
            cs.Append("						if (Reader->Body!=NULL)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							free(Reader->Body);"+cl);
            cs.Append("							Reader->Body = NULL;"+cl);
            cs.Append("							Reader->Body_MallocSize = 0;"+cl);
            cs.Append("						}"+cl);
            cs.Append("						Reader->FinRead=1;"+cl);
            cs.Append("						"+this.pc_methodPrefix+"LifeTime_Add(Reader->Parent->SocketTimer,Reader,1,&"+this.pc_methodPrefix+"ForceClose,NULL);"+cl);
            cs.Append("						break;"+cl);
            cs.Append("					}"+cl);
            cs.Append("					Reader->PacketHeader->ReceivingAddress = Reader->LocalIPAddress;"+cl);
            cs.Append("					Reader->BodySize = -1;"+cl);
            cs.Append("					Reader->Body_Read = 0;"+cl);
            cs.Append("					node = Reader->PacketHeader->FirstField;"+cl);
            cs.Append("					while(node!=NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						if (strncasecmp(node->Field,\"CONTENT-LENGTH\",14)==0)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							CharStar = (char*)malloc(1+node->FieldDataLength);"+cl);
            cs.Append("							memcpy(CharStar,node->FieldData,node->FieldDataLength);"+cl);
            cs.Append("							CharStar[node->FieldDataLength] = '\\0';"+cl);
            cs.Append("							Reader->BodySize = atoi(CharStar);"+cl);
            cs.Append("							free(CharStar);"+cl);
            cs.Append("							break;"+cl);
            cs.Append("						}"+cl);
            cs.Append("						node = node->NextField;"+cl);
            cs.Append("					}"+cl);
            cs.Append("					if (Reader->BodySize!=-1)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						if (Reader->BodySize!=0)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->Body = (char*)malloc(Reader->BodySize);"+cl);
            cs.Append("							Reader->Body_MallocSize = Reader->BodySize;"+cl);
            cs.Append("						}"+cl);
            cs.Append("						else"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->Body = NULL;"+cl);
            cs.Append("							Reader->Body_MallocSize = 0;"+cl);
            cs.Append("						}"+cl);
            cs.Append("					}"+cl);
            cs.Append("					else"+cl);
            cs.Append("					{"+cl);
            cs.Append("						Reader->Body = (char*)malloc(4096);"+cl);
            cs.Append("						Reader->Body_MallocSize = 4096;"+cl);
            cs.Append("					}"+cl);
            cs.Append(cl);
            cs.Append("					if (Reader->HeaderIndex>i+4 && Reader->BodySize!=0)"+cl);
            cs.Append("					{"+cl);
            cs.Comment("Part of the body is in here");
            cs.Append("						memcpy(Reader->Body,Reader->Header+i+4,Reader->HeaderIndex-(&Reader->Header[i+4]-Reader->Header));"+cl);
            cs.Append("						Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("						Reader->Body_EndPointer = Reader->HeaderIndex-(int)(&Reader->Header[i+4]-Reader->Header);"+cl);
            cs.Append("						Reader->Body_Read = Reader->Body_EndPointer;"+cl);
            cs.Append(cl);
            cs.Append("						if (Reader->BodySize!=-1 && Reader->Body_Read>=Reader->BodySize)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							DEBUGSTATEMENT(printf(\"Close\\r\\n\"));"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,0,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer - Reader->Body_BeginPointer,-1,Reader->user,Reader->user2);"+cl);
            cs.Append("							"+cl);
            cs.Append("							while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("							{"+cl);
            cs.Append("								memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer);"+cl);
            cs.Append("								Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer;"+cl);
            cs.Append("								Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("								Reader->FunctionCallback(Reader,Reader->PacketHeader,0,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,-1,Reader->user,Reader->user2);"+cl);
            cs.Append("							}"+cl);
            cs.Append(cl);
            //			cs.Append("							"+pc_SockClose+"(Reader->ClientSocket);"+cl);
            //			cs.Append("							Reader->ClientSocket = ~0;"+cl);
            cs.Append("							Reader->BodySize = 0;"+cl);
            cs.Append("							if (Reader->Body!=NULL)"+cl);
            cs.Append("							{"+cl);
            cs.Append("								free(Reader->Body);"+cl);
            cs.Append("								Reader->Body = NULL;"+cl);
            cs.Append("								Reader->Body_MallocSize = 0;"+cl);
            cs.Append("							}"+cl);
            cs.Append("							Reader->FinRead=1;"+cl);
            cs.Append("							"+this.pc_methodPrefix+"LifeTime_Add(Reader->Parent->SocketTimer,Reader,1,&"+this.pc_methodPrefix+"ForceClose,NULL);"+cl);
            cs.Append("						}"+cl);
            cs.Append("						else"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,0,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer - Reader->Body_BeginPointer,0,Reader->user,Reader->user2);"+cl);
            cs.Append("							while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("							{"+cl);
            cs.Append("								memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer);"+cl);
            cs.Append("								Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer;"+cl);
            cs.Append("								Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("								Reader->FunctionCallback(Reader,Reader->PacketHeader,0,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,0,Reader->user,Reader->user2);"+cl);
            cs.Append("							}"+cl);
            cs.Append("						}"+cl);
            cs.Append("					}"+cl);
            cs.Append("					else"+cl);
            cs.Append("					{"+cl);
            cs.Comment("There is no body, but the packet is here");
            cs.Append("						Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("						Reader->Body_EndPointer = 0;"+cl);
            cs.Append(cl);
            cs.Append("						if (Reader->BodySize==0)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,0,NULL,&Reader->Body_BeginPointer,0,-1,Reader->user,Reader->user2);"+cl);
            //			cs.Append("							"+pc_SockClose+"(Reader->ClientSocket);"+cl);
            //			cs.Append("							Reader->ClientSocket = ~0;"+cl);
            cs.Append("							Reader->BodySize = 0;"+cl);
            cs.Append("							Reader->FinRead=1;"+cl);
            cs.Append("							"+this.pc_methodPrefix+"LifeTime_Add(Reader->Parent->SocketTimer,Reader,1,&"+this.pc_methodPrefix+"ForceClose,NULL);"+cl);
            cs.Append("						}"+cl);
            cs.Append("						else"+cl);
            cs.Append("						{"+cl);
            cs.Append("							Reader->FunctionCallback(Reader,Reader->PacketHeader,0,NULL,&Reader->Body_BeginPointer,0,0,Reader->user,Reader->user2);"+cl);
            cs.Append("						}"+cl);
            cs.Append("					}"+cl);
            cs.Append("					break;"+cl);
            cs.Append("				}"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("	else"+cl);
            cs.Append("	{"+cl);
            cs.Comment("Reading Body Only");
            cs.Append("		if (Reader->Body_BeginPointer == Reader->Body_EndPointer)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("			Reader->Body_EndPointer = 0;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		else"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				Reader->Body_EndPointer = Reader->Body_BeginPointer;"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append(cl);
            cs.Append(cl);
            cs.Append("		if (Reader->Body_EndPointer == Reader->Body_MallocSize)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			Reader->Body_MallocSize += 4096;"+cl);
            cs.Append("			Reader->Body = (char*)realloc(Reader->Body,Reader->Body_MallocSize);"+cl);
            cs.Append("		}"+cl);
            cs.Append(cl);
            cs.Append("		bytesReceived = recv(Reader->ClientSocket,Reader->Body+Reader->Body_EndPointer,Reader->Body_MallocSize-Reader->Body_EndPointer,0);"+cl);
            cs.Append("		if (bytesReceived==0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			LVL3DEBUG(++Reader->Parent->GRACEFUL_COUNTER;)"+cl);
            cs.Append("		}"+cl);
            cs.Append("		Reader->Body_EndPointer += bytesReceived;"+cl);
            cs.Append("		Reader->Body_Read += bytesReceived;"+cl);
            cs.Append("		"+cl);
            cs.Append("		Reader->FunctionCallback(Reader, Reader->PacketHeader, 0,Reader->Body+Reader->Body_BeginPointer, &Reader->Body_BeginPointer, Reader->Body_EndPointer - Reader->Body_BeginPointer, 0, Reader->user, Reader->user2);"+cl);
            cs.Append("		while(Reader->Body_BeginPointer!=Reader->Body_EndPointer && Reader->Body_BeginPointer!=0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			memcpy(Reader->Body,Reader->Body+Reader->Body_BeginPointer,Reader->Body_EndPointer-Reader->Body_BeginPointer);"+cl);
            cs.Append("			Reader->Body_EndPointer = Reader->Body_EndPointer-Reader->Body_BeginPointer;"+cl);
            cs.Append("			Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("			Reader->FunctionCallback(Reader,Reader->PacketHeader,0,Reader->Body,&Reader->Body_BeginPointer,Reader->Body_EndPointer,0,Reader->user,Reader->user2);"+cl);
            cs.Append("		}"+cl);
            cs.Append(cl);
            cs.Append("		if ((Reader->BodySize!=-1 && Reader->Body_Read>=Reader->BodySize)||(bytesReceived==0))"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (Reader->Body_BeginPointer == Reader->Body_EndPointer)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("				Reader->Body_EndPointer = 0;"+cl);
            cs.Append("			}"+cl);
            cs.Append("			Reader->FunctionCallback(Reader, Reader->PacketHeader, 0,Reader->Body, &Reader->Body_BeginPointer, Reader->Body_EndPointer, -1,Reader->user,Reader->user2);"+cl);
            //			cs.Append("			"+this.pc_SockClose+"(Reader->ClientSocket);"+cl);
            cs.Append("			if (Reader->Body!=NULL)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				free(Reader->Body);"+cl);
            cs.Append("				Reader->Body = NULL;"+cl);
            cs.Append("				Reader->Body_MallocSize = 0;"+cl);
            cs.Append("			}"+cl);
            //			cs.Append("			Reader->ClientSocket = ~0;"+cl);
            cs.Append("			Reader->BodySize = 0;"+cl);
            cs.Append("			Reader->FinRead=1;"+cl);
            cs.Append("			"+this.pc_methodPrefix+"LifeTime_Add(Reader->Parent->SocketTimer,Reader,1,&"+this.pc_methodPrefix+"ForceClose,NULL);"+cl);
            cs.Append("		}"+cl);
            cs.Append(cl);
            cs.Append("		if (Reader->Body_BeginPointer==Reader->Body_EndPointer)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			Reader->Body_BeginPointer = 0;"+cl);
            cs.Append("			Reader->Body_EndPointer = 0;"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);
            cs.Append(cl);
            cs.Append("void "+pc_methodPrefixDef+"CloseRequest(void *ReaderObject)"+cl);
            cs.Append("{"+cl);
            cs.Append("	if (((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->ClientSocket!=~0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		LVL3DEBUG(++(((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->Parent->CLOSE_COUNTER);)"+cl);
            cs.Append("		if (((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->Body!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			free(((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->Body);"+cl);
            cs.Append("			((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->Body = NULL;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		if (((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->PacketHeader!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			"+this.pc_methodPrefix+"DestructPacket(((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->PacketHeader);"+cl);
            cs.Append("			((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->PacketHeader = NULL;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		"+this.pc_SockClose+"(((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->ClientSocket);"+cl);
            cs.Append("		((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->ClientSocket = ~0;"+cl);
            cs.Append("		((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->BodySize = 0;"+cl);
            cs.Append("		((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->user = NULL;"+cl);
            cs.Append("		((struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)ReaderObject)->user2 = NULL;"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);
            cs.Append(cl);

            cs.Append("void "+this.pc_methodPrefix+"DeleteRequests(void *ClientModule, void *user1)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct HTTPClientModule *module = (struct HTTPClientModule*)ClientModule;"+cl);
            cs.Append("	struct RequestQueueNode *RequestNode = NULL,*TempNode = NULL;"+cl);
            cs.Append("	struct RequestQueueNode *DeleteHead=NULL,*DeleteTail=NULL;"+cl);
            cs.Append("	int i;"+cl);
            cs.Append("	sem_wait(&(module->QueueLock));"+cl);

            cs.Append("	for(i=0;i<module->NumSlots;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket!=~0 && module->Readers[i].user==user1)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			module->Readers[i].FinRead = 1;"+cl);
            cs.Append("			TempNode = (struct RequestQueueNode*)malloc(sizeof(struct RequestQueueNode));"+cl);
            cs.Append("			memset(TempNode,0,sizeof(struct RequestQueueNode));"+cl);
            cs.Append("			TempNode->FunctionCallback = module->Readers[i].FunctionCallback;"+cl);
            cs.Append("			TempNode->user = module->Readers[i].user;"+cl);
            cs.Append("			TempNode->user2 = module->Readers[i].user2;"+cl);
            cs.Append("			if (DeleteHead==NULL)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				DeleteHead = TempNode;"+cl);
            cs.Append("				DeleteTail = TempNode;"+cl);
            cs.Append("			}"+cl);
            cs.Append("			else"+cl);
            cs.Append("			{"+cl);
            cs.Append("				DeleteTail->Next = TempNode;"+cl);
            cs.Append("				DeleteTail = TempNode;"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);

            cs.Append("	if (module->First!=NULL)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		TempNode = module->First;"+cl);
            cs.Append("		while(TempNode!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (TempNode->user==user1)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				//Match, Delete this item"+cl);
            cs.Append("				if (DeleteHead==NULL)"+cl);
            cs.Append("				{"+cl);
            cs.Append("					DeleteHead = TempNode;"+cl);
            cs.Append("				}"+cl);
            cs.Append("				else"+cl);
            cs.Append("				{"+cl);
            cs.Append("					DeleteTail->Next = TempNode;"+cl);
            cs.Append("				}"+cl);
            cs.Append("	"+cl);
            cs.Append("	"+cl);
            cs.Append("		"+cl);
            cs.Append("				if (TempNode->Previous==NULL)"+cl);
            cs.Append("				{"+cl);
            cs.Append("					//First Item"+cl);
            cs.Append("					module->First = TempNode->Next;"+cl);
            cs.Append("					if (module->First!=NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						module->First->Previous = NULL;"+cl);
            cs.Append("						if (module->First->Next!=NULL)"+cl);
            cs.Append("						{"+cl);
            cs.Append("							module->First->Next->Previous = module->First;"+cl);
            cs.Append("						}"+cl);
            cs.Append("					}"+cl);
            cs.Append("				}"+cl);
            cs.Append("				else"+cl);
            cs.Append("				{"+cl);
            cs.Append("					//Not First Item"+cl);
            cs.Append("					TempNode->Previous->Next = TempNode->Next;"+cl);
            cs.Append("					if (TempNode->Next!=NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						TempNode->Next->Previous = TempNode->Previous;"+cl);
            cs.Append("					}"+cl);
            cs.Append("				}"+cl);
            cs.Append("	"+cl);
            cs.Append("				RequestNode = TempNode->Next;"+cl);
            cs.Append("				--module->RequestQueueCount;"+cl);
            cs.Append("				TempNode->Next = NULL;"+cl);
            cs.Append("				TempNode->Previous = DeleteTail;"+cl);
            cs.Append("				DeleteTail = TempNode;"+cl);
            cs.Append("				TempNode = RequestNode;"+cl);
            cs.Append("			}"+cl);
            cs.Append("			else"+cl);
            cs.Append("			{"+cl);
            cs.Append("				TempNode = TempNode->Next;"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("	sem_post(&(module->QueueLock));"+cl);
            cs.Append("	"+cl);
            cs.Append("	"+cl);
            cs.Append("	TempNode = DeleteHead;"+cl);
            cs.Append("	while(TempNode!=NULL)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (TempNode->FunctionCallback!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			TempNode->FunctionCallback(ClientModule, NULL,HTTP_DELETEREQUEST_INTERRUPT, NULL, NULL, 0, -1, TempNode->user, TempNode->user2);"+cl);
            cs.Append("		}"+cl);
            cs.Append("		if (TempNode->Request!=NULL)	{free(TempNode->Request);}"+cl);
            cs.Append("		if (TempNode->Request2!=NULL) {free(TempNode->Request2);}"+cl);
            cs.Append("		DeleteHead = TempNode->Next;	"+cl);
            cs.Append("		free(TempNode);"+cl);
            cs.Append("		TempNode = DeleteHead;"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+pc_methodPrefixDef+"AddRequest_DirectEx(void *ClientModule, char *buffer, int bufferlength,char *buffer2, int buffer2length, struct sockaddr_in *Destination, void (*CallbackPtr)(void *reader, struct packetheader *header, int IsInterrupt, char* buffer, int *p_BeginPointer, int EndPointer, int done, void* user, void* user2),void* user, void* user2)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct HTTPClientModule *module = (struct HTTPClientModule*)ClientModule;"+cl);
            cs.Append("	struct RequestQueueNode *RequestNode = (struct RequestQueueNode*)malloc(sizeof(struct RequestQueueNode));"+cl);
            cs.Append("	struct RequestQueueNode *TempNode;"+cl);
            cs.Append(cl);
            cs.Append("	LVL3DEBUG(++module->ADD_COUNTER;)"+cl);
            cs.Append(cl);
            cs.Append("	RequestNode->RequestLength = bufferlength;"+cl);
            cs.Append("	RequestNode->Request = buffer;"+cl);
            cs.Append("	RequestNode->Request2 = buffer2;"+cl);
            cs.Append("	RequestNode->Request2Length = buffer2length;"+cl);
            cs.Append("	RequestNode->user = user;"+cl);
            cs.Append("	RequestNode->user2 = user2;"+cl);
            cs.Append("	RequestNode->FunctionCallback = CallbackPtr;"+cl);
            cs.Append("	RequestNode->Next = NULL;"+cl);
            cs.Append("	"+cl);
            cs.Append("	if (Destination!=NULL)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		memset((char *)&(RequestNode->Destination), 0, sizeof(RequestNode->Destination));"+cl);
            cs.Append("		RequestNode->Destination.sin_family = AF_INET;"+cl);
            cs.Append("		RequestNode->Destination.sin_addr.s_addr = Destination->sin_addr.s_addr;"+cl);
            cs.Append("		RequestNode->Destination.sin_port = Destination->sin_port;"+cl);
            cs.Append("	}"+cl);
            cs.Append("	sem_wait(&(module->QueueLock));"+cl);
            cs.Append("		++module->RequestQueueCount;"+cl);
            cs.Append("		if (module->First==NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			module->First = RequestNode;"+cl);
            cs.Append("			RequestNode->Previous = NULL;"+cl);
            cs.Append("		}"+cl);
            cs.Append("		else"+cl);
            cs.Append("		{"+cl);
            cs.Append("			TempNode = module->First;"+cl);
            cs.Append("			while(TempNode->Next!=NULL)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				TempNode = TempNode->Next;"+cl);
            cs.Append("			}"+cl);
            cs.Append("			TempNode->Next = RequestNode;"+cl);
            cs.Append("			RequestNode->Previous = TempNode;"+cl);
            cs.Append("		}"+cl);
            cs.Append("	sem_post(&(module->QueueLock));"+cl);
            cs.Append("	sem_post(&(module->Monitor));"+cl);
            cs.Append("	"+this.pc_methodPrefix+"ForceUnBlockChain(module->Chain);"+cl);
            cs.Append("}"+cl);
            cs.Append("void "+pc_methodPrefixDef+"AddRequest(void *ClientModule, struct packetheader *packet,struct sockaddr_in *Destination, void (*CallbackPtr)(void *reader, struct packetheader *header, int IsInterrupt, char* buffer, int *p_BeginPointer, int EndPointer, int done, void* user, void* user2), void* user, void* user2)"+cl);
            cs.Append("{"+cl);
            cs.Append("	int BufferLength;"+cl);
            cs.Append("	char *Buffer;"+cl);
            cs.Append(cl);
            cs.Append("	BufferLength = "+this.pc_methodPrefix+"GetRawPacket(packet,&Buffer);"+cl);
            cs.Append("	"+this.pc_methodPrefix+"DestructPacket(packet);"+cl);
            cs.Append("	"+this.pc_methodPrefix+"AddRequest_Direct(ClientModule,Buffer,BufferLength,Destination,CallbackPtr,user,user2);"+cl);
            cs.Append("}"+cl);
            cs.Append(cl);
            cs.Append("void "+pc_methodPrefixDef+"HTTPClientModule_PreSelect(void *ClientModule,fd_set *readset, fd_set *writeset, fd_set *errorset, int *blocktime)"+cl);
            cs.Append("{"+cl);
            cs.Append("	int OK,idx;"+cl);
            cs.Append("	int i=0;"+cl);
            cs.Append("	int NumFree = 0;"+cl);
            cs.Append("	struct RequestQueueNode *data;"+cl);
            cs.Append("	struct HTTPClientModule *module = (struct HTTPClientModule*)ClientModule;"+cl);
            cs.Append(cl);
            cs.Append("	NumFree = 0;"+cl);
            cs.Append("	for(i=0;i<module->NumSlots;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket==~0) {++NumFree;}"+cl);
            cs.Append("	}"+cl);
            cs.Append("	DEBUGSTATEMENT(printf(\"NumFree = %d\\r\\n\",NumFree));"+cl);
            cs.Append("	DEBUGSTATEMENT(printf(\"NumSlots = %d\\r\\n\",module->NumSlots));"+cl);
            cs.Append(cl);
            cs.Append("for(i=0;i<NumFree;++i)"+cl);
            cs.Append("{"+cl);
            cs.Append("	if (sem_trywait(&(module->Monitor))==0 || module->RequestQueueCount>0)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		sem_wait(&(module->QueueLock));"+cl);
            cs.Append("		data = module->First;"+cl);
            cs.Append("		OK = 0;"+cl);
            cs.Append("		while(OK==0 && data !=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			OK = -1;"+cl);
            cs.Append("			for(idx=0;idx<module->NumSlots;++idx)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				if (module->Readers[idx].ClientSocket!=~0 && module->Readers[idx].user==data->user)"+cl);
            cs.Append("				{"+cl);
            cs.Append("					// Try Again with another Request"+cl);
            cs.Append("					OK = 0;"+cl);
            cs.Append("					data = data->Next;"+cl);
            cs.Append("					break;"+cl);
            cs.Append("				}"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append(""+cl);
            cs.Append("		if (data!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (data->Previous == NULL)"+cl);
            cs.Append("			{"+cl);
            cs.Append("				//First Item"+cl);
            cs.Append("				module->First = data->Next;"+cl);
            cs.Append("				if (module->First!=NULL)"+cl);
            cs.Append("				{"+cl);
            cs.Append("					module->First->Previous = NULL;"+cl);
            cs.Append("				}"+cl);
            cs.Append("			}"+cl);
            cs.Append("			else"+cl);
            cs.Append("			{"+cl);
            cs.Append("				//Not First Item"+cl);
            cs.Append("				data->Previous->Next = data->Next;"+cl);
            cs.Append("				if (data->Next!=NULL)"+cl);
            cs.Append("				{"+cl);
            cs.Append("					data->Next->Previous = data->Previous;"+cl);
            cs.Append("				}"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("		sem_post(&(module->QueueLock));"+cl);
            cs.Append(""+cl);
            cs.Append("		if (data!=NULL)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			"+this.pc_methodPrefix+"StartRequest(module,data);"+cl);
            cs.Append("			free(data);"+cl);
            cs.Append("			--module->RequestQueueCount;"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("	else"+cl);
            cs.Append("	{"+cl);
            cs.Append("		break;"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append(cl);
            cs.Comment("Pre Select");
            cs.Append("	for(i=0;i<module->NumSlots;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket!=~0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (module->Readers[i].FinConnect==0)"+cl);
            cs.Append("			{"+cl);
            cs.Comment("Not Connected Yet");
            cs.Append("				FD_SET(module->Readers[i].ClientSocket,writeset);"+cl);
            cs.Append("				FD_SET(module->Readers[i].ClientSocket,errorset);"+cl);
            cs.Append("			}"+cl);
            cs.Append("			else"+cl);
            cs.Append("			{"+cl);
            cs.Comment("Already Connected, just needs reading");
            cs.Append("				FD_SET(module->Readers[i].ClientSocket,readset);"+cl);
            cs.Append("				FD_SET(module->Readers[i].ClientSocket,errorset);"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);

            cs.Append("void "+pc_methodPrefixDef+"HTTPClient_PostSelect(void *ClientModule, int slct, fd_set *readset, fd_set *writeset, fd_set *errorset)"+cl);
            cs.Append("{"+cl);
            cs.Append("	int i=0;"+cl);
            cs.Append("	int tst;"+cl);
            if (this.Platform == PLATFORMS.WINDOWS)
            {
                cs.Append("	unsigned long flags;"+cl);
            }
            else
            {
                cs.Append("	unsigned int flags;"+cl);
            }
            cs.Append("	struct sockaddr_in receivingAddress;"+cl);
            cs.Append("	int receivingAddressLength = sizeof(struct sockaddr_in);"+cl);
            cs.Append("	struct HTTPClientModule *module = (struct HTTPClientModule*)ClientModule;"+cl);
            cs.Append(cl);
            cs.Append("	for(i=0;i<module->NumSlots;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		if (module->Readers[i].ClientSocket!=~0)"+cl);
            cs.Append("		{"+cl);
            cs.Append("			if (module->Readers[i].FinConnect==0)"+cl);
            cs.Append("			{"+cl);
            cs.Comment("Not Connected Yet");
            cs.Append("				if (FD_ISSET(module->Readers[i].ClientSocket,writeset)!=0)"+cl);
            cs.Append("				{"+cl);
            cs.Comment("Connected");
            cs.Append("					getsockname(module->Readers[i].ClientSocket,(struct sockaddr*)&receivingAddress,&receivingAddressLength);"+cl);
            cs.Append("					module->Readers[i].LocalIPAddress = receivingAddress.sin_addr.s_addr;"+cl);
            cs.Append("					module->Readers[i].FinConnect = 1;"+cl);
            cs.Append("					module->Readers[i].BodySize = 0;"+cl);
            cs.Append("					module->Readers[i].Body_Read = 0;"+cl);
            cs.Append("					module->Readers[i].Body_BeginPointer = 0;"+cl);
            cs.Append("					module->Readers[i].Body_EndPointer = 0;"+cl);
            cs.Append("					module->Readers[i].HeaderIndex = 0;"+cl);
            cs.Append("				"+cl);
            if (this.Platform==PLATFORMS.POSIX)
            {
                cs.Comment("Platform Dependent [POSIX]");
                cs.Append("					flags = fcntl(module->Readers[i].ClientSocket,F_GETFL,0);"+cl);
                cs.Append("					fcntl(module->Readers[i].ClientSocket,F_SETFL,(~O_NONBLOCK)&flags);"+cl);
            }
            else
            {
                cs.Comment("Platform Dependent [Windows]");
                cs.Append("					flags = 0;"+cl);
                cs.Append("					ioctlsocket(module->Readers[i].ClientSocket,FIONBIO,&flags);"+cl);
            }
            cs.Append("					tst=send(module->Readers[i].ClientSocket,module->Readers[i].send_data,module->Readers[i].send_dataLength,0);"+cl);
            cs.Append("					LVL3DEBUG(if (tst!=module->Readers[i].send_dataLength))"+cl);
            cs.Append("					LVL3DEBUG({)"+cl);
            cs.Append("					LVL3DEBUG(	++module->SEND_FAIL;)"+cl);
            cs.Append("					LVL3DEBUG(})"+cl);
            cs.Append("					LVL3DEBUG(else)"+cl);
            cs.Append("					LVL3DEBUG({)"+cl);
            cs.Append("					LVL3DEBUG(	++module->CONNECT_COUNTER;)"+cl);
            cs.Append("					LVL3DEBUG(})"+cl);
            cs.Append("					free(module->Readers[i].send_data);"+cl);
            cs.Append("					module->Readers[i].send_data=NULL;"+cl);
            cs.Append("					if (module->Readers[i].send_data2!=NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						tst=send(module->Readers[i].ClientSocket,module->Readers[i].send_data2,module->Readers[i].send_data2Length,0);"+cl);
            cs.Append("						LVL3DEBUG(if (tst!=module->Readers[i].send_dataLength))"+cl);
            cs.Append("						LVL3DEBUG({)"+cl);
            cs.Append("						LVL3DEBUG(	++module->SEND_FAIL2;)"+cl);
            cs.Append("						LVL3DEBUG(})"+cl);
            cs.Append("						free(module->Readers[i].send_data2);"+cl);
            cs.Append("						module->Readers[i].send_data2=NULL;"+cl);
            cs.Append("					}"+cl);

            cs.Append("				}"+cl);
            cs.Append("				if (FD_ISSET(module->Readers[i].ClientSocket,errorset)!=0)"+cl);
            cs.Append("				{"+cl);
            cs.Comment("Connection Failed");
            cs.Append("					LVL3DEBUG(++(module->FAILED_COUNTER);)"+cl);
            cs.Append("					if (module->Readers[i].send_data!=NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						free(module->Readers[i].send_data);"+cl);
            cs.Append("						module->Readers[i].send_data = NULL;"+cl);
            cs.Append("					}"+cl);
            cs.Append("					if (module->Readers[i].send_data2!=NULL)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						free(module->Readers[i].send_data2);"+cl);
            cs.Append("						module->Readers[i].send_data2 = NULL;"+cl);
            cs.Append("					}"+cl);
            cs.Append("					"+this.pc_SockClose+"(module->Readers[i].ClientSocket);"+cl);
            cs.Append("					module->Readers[i].Body_BeginPointer = 0;"+cl);
            cs.Append("					module->Readers[i].ClientSocket = ~0;"+cl);
            cs.Append("					module->Readers[i].BodySize = 0;"+cl);
            cs.Append("					module->Readers[i].FunctionCallback(&(module->Readers[i]), NULL,0, NULL, &module->Readers[i].Body_BeginPointer, 0, -1,module->Readers[i].user,module->Readers[i].user2);"+cl);
            cs.Append("				}"+cl);
            cs.Append("			}"+cl);
            cs.Append("			else"+cl);
            cs.Append("			{"+cl);
            cs.Comment("Already Connected, just needs reading");
            cs.Append("				if (FD_ISSET(module->Readers[i].ClientSocket,readset)!=0)"+cl);
            cs.Append("				{"+cl);
            cs.Comment("Data Available");
            cs.Append("					"+pc_methodPrefix+"ProcessSocket(&(module->Readers[i]));"+cl);
            cs.Append("				}"+cl);
            cs.Comment("Check if PeerReset");
            cs.Append("				else if (FD_ISSET(module->Readers[i].ClientSocket,errorset)!=0)"+cl);
            cs.Append("				{"+cl);
            cs.Comment("Socket Closed");
            cs.Append("					"+this.pc_SockClose+"(module->Readers[i].ClientSocket);"+cl);
            cs.Append("					module->Readers[i].ClientSocket = ~0;"+cl);
            cs.Append("					module->Readers[i].BodySize = 0;"+cl);
            cs.Append("					if (module->Readers[i].BodySize==-1)"+cl);
            cs.Append("					{"+cl);
            cs.Append("						module->Readers[i].Body_BeginPointer = 0;"+cl);
            cs.Append("						module->Readers[i].FunctionCallback(&(module->Readers[i]), module->Readers[i].PacketHeader, 0,NULL, &module->Readers[i].Body_BeginPointer, 0, -1, module->Readers[i].user,module->Readers[i].user2);"+cl);
            cs.Append("					}"+cl);
            cs.Append("				}"+cl);
            cs.Append("			}"+cl);
            cs.Append("		}"+cl);
            cs.Append("	}"+cl);
            cs.Append("}"+cl);
            cs.Append(cl);

            cs.Append("void* "+pc_methodPrefixDef+"CreateHTTPClientModule(void *Chain, int MaxSockets)"+cl);
            cs.Append("{"+cl);
            cs.Append("	struct HTTPClientModule *RetVal = (struct HTTPClientModule*)malloc(sizeof(struct HTTPClientModule));"+cl);
            cs.Append("	int i=0;"+cl);
            cs.Append("	struct timeval tv;"+cl);
            cs.Append(cl);
            cs.Append("	gettimeofday(&tv,NULL);"+cl);
            cs.Append("	srand((int)tv.tv_sec);"+cl);
            cs.Append(cl);
            cs.Append("	LVL3DEBUG(RetVal->ADD_COUNTER=0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->FAILED_COUNTER = 0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->GRACEFUL_COUNTER = 0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->FORCE_COUNTER = 0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->START_COUNTER = 0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->CLOSE_COUNTER = 0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->SEND_FAIL = 0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->SEND_FAIL2 = 0;)"+cl);
            cs.Append("	LVL3DEBUG(RetVal->CONNECT_COUNTER = 0;)"+cl);
            cs.Append(cl);
            cs.Append("	RetVal->RequestQueueCount = 0;"+cl);
            cs.Append("	RetVal->Terminate = 0;"+cl);
            cs.Append("	RetVal->NumSlots = MaxSockets;"+cl);
            cs.Append("	RetVal->First = NULL;"+cl);
            cs.Append("	RetVal->Readers = (struct "+this.pc_methodPrefix+"HCHTTPReaderObject*)malloc(MaxSockets*sizeof(struct "+this.pc_methodPrefix+"HCHTTPReaderObject));"+cl);
            cs.Append(cl);
            cs.Append("	memset(RetVal->Readers,0,MaxSockets*sizeof(struct "+this.pc_methodPrefix+"HCHTTPReaderObject));"+cl);
            cs.Append("	for(i=0;i<MaxSockets;++i)"+cl);
            cs.Append("	{"+cl);
            cs.Append("		RetVal->Readers[i].ClientSocket = ~0;"+cl);
            cs.Append("		RetVal->Readers[i].Parent = RetVal;"+cl);
            cs.Append("	}"+cl);
            cs.Append(cl);
            cs.Append("	sem_init(&(RetVal->QueueLock),0,1);"+cl);
            cs.Append("	sem_init(&(RetVal->Monitor),0,0);"+cl);
            cs.Append("	RetVal->PreSelect = &"+this.pc_methodPrefix+"HTTPClientModule_PreSelect;"+cl);
            cs.Append("	RetVal->PostSelect = &"+this.pc_methodPrefix+"HTTPClient_PostSelect;"+cl);
            cs.Append("	RetVal->Destroy = &"+this.pc_methodPrefix+"DestroyHTTPClientModule;"+cl);
            cs.Append("	RetVal->Chain = Chain;"+cl);
            cs.Append(cl);
            cs.Append("	RetVal->SocketTimer = "+this.pc_methodPrefix+"CreateLifeTime(Chain);"+cl);
            cs.Append(cl);
            cs.Append("	"+this.pc_methodPrefix+"AddToChain(Chain,RetVal);"+cl);
            cs.Append("	return((void*)RetVal);"+cl);
            cs.Append("}"+cl);
            cs.Append(cl);

            writer = File.CreateText(outputDirectory.FullName + "\\"+pc_methodPrefix+"HTTPClient.c");
            writer.Write(cs.ToString());
            writer.Close();

            return(true);
        }
        private void TypeCheckString(CodeProcessor cs, UPnPArgument args)
        {
            cs.Append("	_" + args.Name + "Length = " + this.pc_methodLibPrefix + "InPlaceXmlUnEscape(p_" + args.Name + ");" + cl);
            cs.Append("	_" + args.Name + " = p_" + args.Name + ";" + cl);

            if (args.RelatedStateVar.AllowedStringValues != null)
            {
                if (!Configuration.DynamicObjectModel)
                {
                    cs.Append("	if (");
                    bool first = true;
                    foreach (string val in args.RelatedStateVar.AllowedStringValues)
                    {
                        if (first == false) cs.Append("&& ");
                        first = false;
                        cs.Append("memcmp(_" + args.Name + ", \"" + val + "\\0\"," + (val.Length + 1).ToString() + ") != 0" + cl);
                    }
                    cs.Append("	)" + cl);
                }
                else
                {
                    string vIdent = DeviceObjectGenerator.GetStateVariableIdentifier(args.RelatedStateVar);

                    cs.Append("	for(OK=0;OK<UPnP_StateVariable_AllowedValues_MAX;++OK)" + cs.NewLine);
                    cs.Append("	{" + cs.NewLine);
                    cs.Append("		if (" + vIdent + "->AllowedValues[OK]!=NULL)" + cs.NewLine);
                    cs.Append("		{" + cs.NewLine);
                    cs.Append("			if (strcmp(_" + args.Name + "," + vIdent + "->AllowedValues[OK])==0)" + cs.NewLine);
                    cs.Append("			{" + cs.NewLine);
                    cs.Append("				OK=0;" + cs.NewLine);
                    cs.Append("				break;" + cs.NewLine);
                    cs.Append("			}" + cs.NewLine);
                    cs.Append("		}" + cs.NewLine);
                    cs.Append("		else" + cs.NewLine);
                    cs.Append("		{" + cs.NewLine);
                    cs.Append("			break;" + cs.NewLine);
                    cs.Append("		}" + cs.NewLine);
                    cs.Append("	}" + cs.NewLine);
                    cs.Append("	if (OK!=0)" + cs.NewLine);
                }

                cs.Append("	{" + cl);
                if (Configuration.ExplicitErrorEncoding == true)
                {
                    cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Argument[" + args.Name + "] contains a value that is not in AllowedValueList\");" + cl);
                }
                else
                {
                    cs.Append("		" + pc_methodPrefix + "Response_Error(ReaderObject,402,\"Illegal value\");" + cl);
                }
                cs.Append("		return;" + cl);
                cs.Append("	}" + cl);
            }
        }
        protected bool GenerateEx(UPnPDevice device, DirectoryInfo outputDirectory, Hashtable serviceNames)
        {
            string sampleService = "Sample";
            StreamWriter writer;
            ServiceNames = serviceNames;
            DText dt = new DText();
            dt.ATTRMARK = ":";
            dt[0] = device.DeviceURN;

            // *** Generate Main Code
            Log("Writing main stack module...");

            IDictionaryEnumerator en = serviceNames.GetEnumerator();
            while (en.MoveNext())
            {
                string servicename = (string)en.Value;
                sampleService = servicename;
                UPnPService service = (UPnPService)en.Key;
                string servicexml = new UTF8Encoding().GetString(service.GetSCPDXml());
                Log("Generating service class for " + servicename);
                OpenSource.UPnP.ServiceGenerator.GenerateCP("Cp" + servicename, nspace, outputDirectory.FullName + "\\Cp" + servicename + ".cs", service.ServiceURN, servicexml);
            }

            CodeProcessor cs = new CodeProcessor(new StringBuilder(), true);
            StringBuilder cs2;

            cs.Comment("UPnP .NET Framework Control Point Stack, Discovery Module");
            cs.Comment(VersionString);
            cs.Append(cl);
            cs.Append("using System;" + cl);
            cs.Append("using System.Net;" + cl);
            cs.Append("using OpenSource.UPnP;" + cl);
            cs.Append("using OpenSource.Utilities;" + cl);
            cs.Append("using " + nspace + ";" + cl);
            cs.Append(cl);
            cs.Append("namespace " + nspace + cl);
            cs.Append("{" + cl);
            cs.Append("	/// <summary>" + cl);
            cs.Append("	/// Summary description for " + dt[4] + "Discovery." + cl);
            cs.Append("	/// </summary>" + cl);
            cs.Append("	class " + dt[4] + "Discovery" + cl);
            cs.Append("	{" + cl);
            cs.Append("		private UPnPSmartControlPoint scp;" + cl);
            cs.Append("		private WeakEvent AddEvent = new WeakEvent();" + cl);
            cs.Append("		private WeakEvent RemoveEvent = new WeakEvent();" + cl);
            cs.Append(cl);
            cs.Append("		public delegate void DiscoveryHandler(" + dt[4] + "Discovery sender, UPnPDevice dev);" + cl);
            cs.Append("		public event DiscoveryHandler OnAddedDevice" + cl);
            cs.Append("		{" + cl);
            cs.Append("			add" + cl);
            cs.Append("			{" + cl);
            cs.Append("				AddEvent.Register(value);" + cl);
            cs.Append("			}" + cl);
            cs.Append("			remove" + cl);
            cs.Append("			{" + cl);
            cs.Append("				AddEvent.UnRegister(value);" + cl);
            cs.Append("			}" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		public event DiscoveryHandler OnRemovedDevice" + cl);
            cs.Append("		{" + cl);
            cs.Append("			add" + cl);
            cs.Append("			{" + cl);
            cs.Append("				RemoveEvent.Register(value);" + cl);
            cs.Append("			}" + cl);
            cs.Append("			remove" + cl);
            cs.Append("			{" + cl);
            cs.Append("				RemoveEvent.UnRegister(value);" + cl);
            cs.Append("			}" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		public " + dt[4] + "Discovery()" + cl);
            cs.Append("		{" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		public void Start()" + cl);
            cs.Append("		{" + cl);
            cs.Append("			scp = new UPnPSmartControlPoint(new UPnPSmartControlPoint.DeviceHandler(OnAddSink), null ,\"" + device.DeviceURN + "\");" + cl);
            cs.Append("			scp.OnRemovedDevice += new UPnPSmartControlPoint.DeviceHandler(OnRemoveSink);" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		public void ReScan()" + cl);
            cs.Append("		{" + cl);
            cs.Append("			scp.Rescan();" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		public void UnicastSearch(IPAddress address)" + cl);
            cs.Append("		{" + cl);
            cs.Append("			scp.UnicastSearch(address);" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		public void ForceDisposeDevice(UPnPDevice dev)" + cl);
            cs.Append("		{" + cl);
            cs.Append("			if (dev.ParentDevice != null)" + cl);
            cs.Append("			{" + cl);
            cs.Append("				ForceDisposeDevice(dev.ParentDevice);" + cl);
            cs.Append("			}" + cl);
            cs.Append("			else" + cl);
            cs.Append("			{" + cl);
            cs.Append("				scp.ForceDisposeDevice(dev);" + cl);
            cs.Append("			}" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		private void OnAddSink(UPnPSmartControlPoint sender, UPnPDevice d)" + cl);
            cs.Append("		{" + cl);
            cs.Append("			AddEvent.Fire(this, d);" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);
            cs.Append("		private void OnRemoveSink(UPnPSmartControlPoint sender, UPnPDevice d)" + cl);
            cs.Append("		{" + cl);
            cs.Append("			RemoveEvent.Fire(this, d);" + cl);
            cs.Append("		}" + cl);
            cs.Append("	}" + cl);
            cs.Append("}" + cl);
            cs.Append(cl);

            writer = File.CreateText(outputDirectory.FullName + "\\" + dt[4] + "Discovery.cs");
            writer.Write(cs.ToString());
            writer.Close();

            cs = new CodeProcessor(new StringBuilder(), true);
            cs.Comment("UPnP .NET Framework Control Point Stack, Core Module");
            cs.Comment(VersionString);
            cs.Append(cl);
            cs.Append("using System;" + cl);
            cs.Append("using OpenSource.UPnP;" + cl);
            cs.Append("using " + nspace + ";" + cl);
            cs.Append(cl);
            cs.Append("namespace " + nspace + cl);
            cs.Append("{" + cl);
            cs.Append("	/// <summary>" + cl);
            cs.Append("	/// Summary description for Main." + cl);
            cs.Append("	/// </summary>" + cl);
            cs.Append("	class SampleDeviceMain" + cl);
            cs.Append("	{" + cl);
            cs.Append("		/// <summary>" + cl);
            cs.Append("		/// The main entry point for the application." + cl);
            cs.Append("		/// </summary>" + cl);
            cs.Append("		[STAThread]" + cl);
            cs.Append("		static void Main(string[] args)" + cl);
            cs.Append("		{" + cl);
            cs.Append("			System.Console.WriteLine(\"UPnP .NET Framework Stack\");" + cl);
            cs.Append("			System.Console.WriteLine(\"StackBuilder Build#" + this.VersionString + "\");" + cl);
            cs.Append("		" + cl);
            cs.Append("			" + dt[4] + "Discovery disco = new " + dt[4] + "Discovery();" + cl);
            cs.Append("			disco.OnAddedDevice += new " + dt[4] + "Discovery.DiscoveryHandler(AddSink);" + cl);
            cs.Append("			disco.OnRemovedDevice += new " + dt[4] + "Discovery.DiscoveryHandler(RemoveSink);" + cl);
            cs.Append("		" + cl);
            cs.Append("			System.Console.WriteLine(\"Press return to stop CP.\");" + cl);
            cs.Append("			disco.Start();" + cl);
            cs.Append("		" + cl);
            cs.Append("			System.Console.ReadLine();" + cl);
            cs.Append("		}" + cl);
            cs.Append("		" + cl);
            cs.Append("		private static void AddSink(" + dt[4] + "Discovery sender, UPnPDevice d)" + cl);
            cs.Append("		{" + cl);
            cs.Append("			Console.WriteLine(\"Added Device: \" + d.FriendlyName);" + cl);
            cs.Append(cl);
            cs.Comment("To interace with a service, instantiate the appropriate wrapper class on the appropriate service");
            cs.Comment("Traverse the device heirarchy to the correct device, and invoke 'GetServices', passing in the static field 'SERVICE_NAME'");
            cs.Comment("of the appropriate wrapper class. This method returns an array of all services with this service type. For most purposes,");
            cs.Comment("there will only be one service, in which case you can use array index 0.");
            cs.Comment("Save a reference to this instance of the wrapper class for later use.");
            cs.Append("			//Cp" + sampleService + " " + sampleService + " = new Cp" + sampleService + "(d.GetServices(Cp" + sampleService + ".SERVICE_NAME)[0]);" + cl);
            cs.Append(cl);
            cs.Comment("To subscribe to Events, call the '_subscribe' method of the wrapper class. The only parameter is");
            cs.Comment("the duration of the event. A good value is 300 seconds.");
            cs.Append("			//" + sampleService + "._subscribe(300);" + cl);
            cs.Append(cl);
            cs.Comment("The wrapper class exposes all the evented state variables through events in the form 'OnStateVariable_xx', where xx is the variable name.");
            cs.Append(cl);
            cs.Comment("The wrapper class exposes methods in two formats. Asyncronous and Syncronous. The Async method calls are exposed simply");
            cs.Comment("by the name of the method. The Syncronous version is the same, except with the word, 'Sync_' prepended to the name.");
            cs.Comment("Asyncronous responses to th async method calls are dispatched through the event in the format, 'OnResult_x' where x is the method name.");
            cs.Append(cl);
            cs.Comment("Note: All arguments are automatically type checked. Allowed Values are abstracted through enumerations, that are defined in the wrapper class.");
            cs.Comment("To access the list of allowed values or ranges for a given device, refer to the property 'Values_XXX' for a list of the allowed values for a");
            cs.Comment("given state variable. Similarly, refer to the properties 'HasMaximum_XXX', 'HasMinimum_XXX', 'Maximum_XXX', and 'Minimum_XXX' where XXX is the variable name, for the Max/Min values.");
            cs.Append(cl);
            cs.Comment("To determine if a given service implements a particular StateVariable or Method, use the properties, 'HasStateVariableXXX' and 'HasActionXXX' where XXX is the method/variable name.");
            cs.Append("		}" + cl);
            cs.Append("		private static void RemoveSink(" + dt[4] + "Discovery sender, UPnPDevice d)" + cl);
            cs.Append("		{" + cl);
            cs.Append("			Console.WriteLine(\"Removed Device: \" + d.FriendlyName);" + cl);
            cs.Append("		}" + cl);
            cs.Append(cl);

            cs.Append("	}" + cl);
            cs.Append("}" + cl);
            cs.Append(cl);

            writer = File.CreateText(outputDirectory.FullName + "\\Main.cs");
            writer.Write(cs.ToString());
            writer.Close();

            Log("Generating Visual Studio 7 Solution");
            cs2 = new StringBuilder();
            cs2.Append("Microsoft Visual Studio Solution File, Format Version 7.00" + cl);
            cs2.Append("Project(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SampleDevice\", \"SampleDevice.csproj\", \"{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}\"" + cl);
            cs2.Append("EndProject" + cl);
            cs2.Append("Global" + cl);
            cs2.Append("	GlobalSection(SolutionConfiguration) = preSolution" + cl);
            cs2.Append("		ConfigName.0 = Debug" + cl);
            cs2.Append("		ConfigName.1 = Release" + cl);
            cs2.Append("	EndGlobalSection" + cl);
            cs2.Append("	GlobalSection(ProjectDependencies) = postSolution" + cl);
            cs2.Append("	EndGlobalSection" + cl);
            cs2.Append("	GlobalSection(ProjectConfiguration) = postSolution" + cl);
            cs2.Append("		{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Debug.ActiveCfg = Debug|.NET" + cl);
            cs2.Append("		{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Debug.Build.0 = Debug|.NET" + cl);
            cs2.Append("		{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Release.ActiveCfg = Release|.NET" + cl);
            cs2.Append("		{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}.Release.Build.0 = Release|.NET" + cl);
            cs2.Append("	EndGlobalSection" + cl);
            cs2.Append("	GlobalSection(ExtensibilityGlobals) = postSolution" + cl);
            cs2.Append("	EndGlobalSection" + cl);
            cs2.Append("	GlobalSection(ExtensibilityAddIns) = postSolution" + cl);
            cs2.Append("	EndGlobalSection" + cl);
            cs2.Append("EndGlobal" + cl);
            writer = File.CreateText(outputDirectory.FullName + "\\SampleDevice.sln");
            writer.Write(cs2.ToString());
            writer.Close();

            Log("Generating Assembly Info");
            cs2 = new StringBuilder();
            cs2.Append("using System.Reflection;" + cl);
            cs2.Append("using System.Runtime.CompilerServices;" + cl);
            cs2.Append(cl);
            cs2.Append("[assembly: AssemblyTitle(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyDescription(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyConfiguration(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyCompany(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyProduct(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyCopyright(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyTrademark(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyCulture(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyVersion(\"1.0.*\")]" + cl);
            cs2.Append("[assembly: AssemblyDelaySign(false)]" + cl);
            cs2.Append("[assembly: AssemblyKeyFile(\"\")]" + cl);
            cs2.Append("[assembly: AssemblyKeyName(\"\")]" + cl);
            writer = File.CreateText(outputDirectory.FullName + "\\AssemblyInfo.cs");
            writer.Write(cs2.ToString());
            writer.Close();

            Log("Generating Visual Studio 7 Project");
            cs2 = new StringBuilder();
            cs2.Append("<VisualStudioProject>" + cl);
            cs2.Append("    <CSHARP" + cl);
            cs2.Append("        ProjectType = \"Local\"" + cl);
            cs2.Append("        ProductVersion = \"7.0.9466\"" + cl);
            cs2.Append("        SchemaVersion = \"1.0\"" + cl);
            cs2.Append("        ProjectGuid = \"{FE5FA3F9-E2EA-40BE-8CF4-27F33CF6454E}\"" + cl);
            cs2.Append("    >" + cl);
            cs2.Append("        <Build>" + cl);
            cs2.Append("            <Settings" + cl);
            cs2.Append("                ApplicationIcon = \"\"" + cl);
            cs2.Append("                AssemblyKeyContainerName = \"\"" + cl);
            cs2.Append("                AssemblyName = \"SampleDevice\"" + cl);
            cs2.Append("                AssemblyOriginatorKeyFile = \"\"" + cl);
            cs2.Append("                DefaultClientScript = \"JScript\"" + cl);
            cs2.Append("                DefaultHTMLPageLayout = \"Grid\"" + cl);
            cs2.Append("                DefaultTargetSchema = \"IE50\"" + cl);
            cs2.Append("                DelaySign = \"false\"" + cl);
            cs2.Append("                OutputType = \"Exe\"" + cl);
            cs2.Append("                RootNamespace = \"SampleDevice\"" + cl);
            cs2.Append("                StartupObject = \"\"" + cl);
            cs2.Append("            >" + cl);
            cs2.Append("                <Config" + cl);
            cs2.Append("                    Name = \"Debug\"" + cl);
            cs2.Append("                    AllowUnsafeBlocks = \"false\"" + cl);
            cs2.Append("                    BaseAddress = \"285212672\"" + cl);
            cs2.Append("                    CheckForOverflowUnderflow = \"false\"" + cl);
            cs2.Append("                    ConfigurationOverrideFile = \"\"" + cl);
            cs2.Append("                    DefineConstants = \"DEBUG;TRACE\"" + cl);
            cs2.Append("                    DocumentationFile = \"\"" + cl);
            cs2.Append("                    DebugSymbols = \"true\"" + cl);
            cs2.Append("                    FileAlignment = \"4096\"" + cl);
            cs2.Append("                    IncrementalBuild = \"true\"" + cl);
            cs2.Append("                    Optimize = \"false\"" + cl);
            cs2.Append("                    OutputPath = \"bin\\Debug\\\"" + cl);
            cs2.Append("                    RegisterForComInterop = \"false\"" + cl);
            cs2.Append("                    RemoveIntegerChecks = \"false\"" + cl);
            cs2.Append("                    TreatWarningsAsErrors = \"false\"" + cl);
            cs2.Append("                    WarningLevel = \"4\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("                <Config" + cl);
            cs2.Append("                    Name = \"Release\"" + cl);
            cs2.Append("                    AllowUnsafeBlocks = \"false\"" + cl);
            cs2.Append("                    BaseAddress = \"285212672\"" + cl);
            cs2.Append("                    CheckForOverflowUnderflow = \"false\"" + cl);
            cs2.Append("                    ConfigurationOverrideFile = \"\"" + cl);
            cs2.Append("                    DefineConstants = \"TRACE\"" + cl);
            cs2.Append("                    DocumentationFile = \"\"" + cl);
            cs2.Append("                    DebugSymbols = \"false\"" + cl);
            cs2.Append("                    FileAlignment = \"4096\"" + cl);
            cs2.Append("                    IncrementalBuild = \"false\"" + cl);
            cs2.Append("                    Optimize = \"true\"" + cl);
            cs2.Append("                    OutputPath = \"bin\\Release\\\"" + cl);
            cs2.Append("                    RegisterForComInterop = \"false\"" + cl);
            cs2.Append("                    RemoveIntegerChecks = \"false\"" + cl);
            cs2.Append("                    TreatWarningsAsErrors = \"false\"" + cl);
            cs2.Append("                    WarningLevel = \"4\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("            </Settings>" + cl);
            cs2.Append("            <References>" + cl);
            cs2.Append("                <Reference" + cl);
            cs2.Append("                    Name = \"System\"" + cl);
            cs2.Append("                    AssemblyName = \"System\"" + cl);
            cs2.Append("                    HintPath = \"..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.dll\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("                <Reference" + cl);
            cs2.Append("                    Name = \"System.Data\"" + cl);
            cs2.Append("                    AssemblyName = \"System.Data\"" + cl);
            cs2.Append("                    HintPath = \"..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Data.dll\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("                <Reference" + cl);
            cs2.Append("                    Name = \"System.XML\"" + cl);
            cs2.Append("                    AssemblyName = \"System.Xml\"" + cl);
            cs2.Append("                    HintPath = \"..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.XML.dll\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("                <Reference" + cl);
            cs2.Append("                    Name = \"UPnP\"" + cl);
            cs2.Append("                    AssemblyName = \"UPnP\"" + cl);
            cs2.Append("                    HintPath = \"UPnP.dll\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("            </References>" + cl);
            cs2.Append("        </Build>" + cl);
            cs2.Append("        <Files>" + cl);
            cs2.Append("            <Include>" + cl);
            cs2.Append("                <File" + cl);
            cs2.Append("                    RelPath = \"AssemblyInfo.cs\"" + cl);
            cs2.Append("                    SubType = \"Code\"" + cl);
            cs2.Append("                    BuildAction = \"Compile\"" + cl);
            cs2.Append("                />" + cl);
            en.Reset();
            while (en.MoveNext())
            {
                UPnPService service = (UPnPService)en.Key;

                cs2.Append("                <File" + cl);
                cs2.Append("                    RelPath = \"Cp" + (string)en.Value + ".cs\"" + cl);
                cs2.Append("                    SubType = \"Code\"" + cl);
                cs2.Append("                    BuildAction = \"Compile\"" + cl);
                cs2.Append("                />" + cl);
            }
            cs2.Append("                <File" + cl);
            cs2.Append("                    RelPath = \"" + dt[4] + "Discovery.cs\"" + cl);
            cs2.Append("                    SubType = \"Code\"" + cl);
            cs2.Append("                    BuildAction = \"Compile\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("                <File" + cl);
            cs2.Append("                    RelPath = \"Main.cs\"" + cl);
            cs2.Append("                    SubType = \"Code\"" + cl);
            cs2.Append("                    BuildAction = \"Compile\"" + cl);
            cs2.Append("                />" + cl);
            cs2.Append("            </Include>" + cl);
            cs2.Append("        </Files>" + cl);
            cs2.Append("    </CSHARP>" + cl);
            cs2.Append("</VisualStudioProject>" + cl);
            writer = File.CreateText(outputDirectory.FullName + "\\SampleDevice.csproj");
            writer.Write(cs2.ToString());
            writer.Close();

            Log("Copying UPnP.dll.");
            System.IO.File.Copy(AppStartPath + "\\UPnP.dll", outputDirectory.FullName + "\\UPnP.dll", true);

            Log("UPnP Stack Generation Complete.");

            return true;
        }
        public void TestCodeProcessor_ProcessFileCode_FunctionData()
        {
            ProgramClassTypeCollection programClassTypeCollection = new ProgramClassTypeCollection();
            CodeProcessor codeProcessor;
            FileProcessor fileProcessor;
            ProgramFile   programFile;

            List <ProgramFunction> expectedFunctions     = new List <ProgramFunction>();
            List <string>          repeatedFunctionNames = new List <string>();
            List <string>          empty = new List <string>();

            string filePath = Path.GetFullPath("..\\..\\..\\CodeAnalyzerTests\\TestInputFiles\\TestInputFile.cs");
            string fileName = "TestInputFile.cs";
            string fileText = "";

            if (File.Exists(filePath))
            {
                fileText = File.ReadAllText(filePath);
            }

            repeatedFunctionNames.Add("Talk");
            repeatedFunctionNames.Add("Move");

            ProgramFunction Animal          = new ProgramFunction("Animal", empty, empty, empty, empty, empty);
            ProgramFunction Animal_Move     = new ProgramFunction("Move", empty, empty, empty, empty, empty);
            ProgramFunction Pet             = new ProgramFunction("Pet", empty, empty, empty, empty, empty);
            ProgramFunction Dog             = new ProgramFunction("Dog", empty, empty, empty, empty, empty);
            ProgramFunction Dog_Talk        = new ProgramFunction("Talk", empty, empty, empty, empty, empty);
            ProgramFunction Human           = new ProgramFunction("Human", empty, empty, empty, empty, empty);
            ProgramFunction Human_Talk      = new ProgramFunction("Talk", empty, empty, empty, empty, empty);
            ProgramFunction Human_Move      = new ProgramFunction("Move", empty, empty, empty, empty, empty);
            ProgramFunction GoToSchool      = new ProgramFunction("GoToSchool", empty, empty, empty, empty, empty);
            ProgramFunction GraduateSchool  = new ProgramFunction("GraduateSchool", empty, empty, empty, empty, empty);
            ProgramFunction GoToWork        = new ProgramFunction("GoToWork", empty, empty, empty, empty, empty);
            ProgramFunction BuyPet          = new ProgramFunction("BuyPet", empty, empty, empty, empty, empty);
            ProgramFunction BuyDog          = new ProgramFunction("BuyDog", empty, empty, empty, empty, empty);
            ProgramFunction BuyCar          = new ProgramFunction("BuyCar", empty, empty, empty, empty, empty);
            ProgramFunction SellCar         = new ProgramFunction("SellCar", empty, empty, empty, empty, empty);
            ProgramFunction FillCarFuelTank = new ProgramFunction("FillCarFuelTank", empty, empty, empty, empty, empty);
            ProgramFunction Car             = new ProgramFunction("Car", empty, empty, empty, empty, empty);
            ProgramFunction FillTank        = new ProgramFunction("FillTank", empty, empty, empty, empty, empty);

            string[] Animal_Move_TextDataArray = { " ",         "if",      "(",         "direction", "==",      "0",       ")",     "//",    "move", "north",     " ",         "LocationY",
                                                   "+=",        "seconds", "*",         "Speed",     ";",       " ",       "else",  "if",    "(",    "direction", "==",        "1",        ")",          "//", "move",      "east", " ",
                                                   "LocationX", "+=",      "seconds",   "*",         "Speed",   ";",       " ",     "else",  "if",   "(",         "direction", "==",       "2",          ")",  "//",        "move",
                                                   "south",     " ",       "LocationY", "-=",        "seconds", "*",       "Speed", ";",     " ",    "else",      "if",        "(",        "direction",  "==", "3",         ")",    "//",
                                                   "move",      "west",    " ",         "LocationX", "-=",      "seconds", "*",     "Speed", ";",    " ",         "return",    "(",        "LocationX",  ",",  "LocationY",
                                                   ")",         ";",       " ",         "}" };

            string[] Human_Move_TextDataArray = { " ",    "int",       "speed",     "=",         "Speed",     ";",       " ",       "if",    "(",     "isDriving", "&&",   "car",       "!=",
                                                  "null", ")",         "speed",     "=",         "car",       ".",       "Speed",   ";",     " ",     "if",        "(",    "direction", "==",       "0",          ")",  "//",        "move", "north",
                                                  " ",    "LocationY", "+=",        "seconds",   "*",         "speed",   ";",       " ",     "else",  "if",        "(",    "direction", "==",       "1",          ")",  "//",        "move",
                                                  "east", " ",         "LocationX", "+=",        "seconds",   "*",       "speed",   ";",     " ",     "else",      "if",   "(",         "direction","==",         "2",  ")",         "//",
                                                  "move", "south",     " ",         "LocationY", "-=",        "seconds", "*",       "speed", ";",     " ",         "else", "if",        "(",        "direction",  "==", "3",         ")",
                                                  "//",   "move",      "west",      " ",         "LocationX", "-=",      "seconds", "*",     "speed", ";",         " ",    "return",    "(",        "LocationX",  ",",  "LocationY",
                                                  ")",    ";",         " ",         "}" };

            string[] Dog_Talk_TextDataArray = { "\"", "Woof", "!", "\"", ";" };

            string[] Human_Talk_TextDataArray = { "\"", "Hello", "\"", ";" };

            Animal_Move.TextData.AddRange(Animal_Move_TextDataArray);
            Dog_Talk.TextData.AddRange(Dog_Talk_TextDataArray);
            Human_Talk.TextData.AddRange(Human_Talk_TextDataArray);
            Human_Move.TextData.AddRange(Human_Move_TextDataArray);

            Animal.Size          = 3; Animal.Complexity = 0;
            Animal_Move.Size     = 9; Animal_Move.Complexity = 4;
            Pet.Size             = 1; Pet.Complexity = 0;
            Dog.Size             = 1; Dog.Complexity = 0;
            Dog_Talk.Size        = 1; Dog_Talk.Complexity = 0;
            Human.Size           = 2; Human.Complexity = 0;
            Human_Talk.Size      = 1; Human_Talk.Complexity = 0;
            Human_Move.Size      = 11; Human_Move.Complexity = 5;
            GoToSchool.Size      = 6; GoToSchool.Complexity = 1;
            GraduateSchool.Size  = 5; GraduateSchool.Complexity = 1;
            GoToWork.Size        = 4; GoToWork.Complexity = 1;
            BuyPet.Size          = 7; BuyPet.Complexity = 1;
            BuyDog.Size          = 4; BuyDog.Complexity = 1;
            BuyCar.Size          = 8; BuyCar.Complexity = 1;
            SellCar.Size         = 5; SellCar.Complexity = 1;
            FillCarFuelTank.Size = 8; FillCarFuelTank.Complexity = 2;
            Car.Size             = 5; Car.Complexity = 0;
            FillTank.Size        = 7; FillTank.Complexity = 1;

            expectedFunctions.Add(Animal);
            expectedFunctions.Add(Animal_Move);
            expectedFunctions.Add(Pet);
            expectedFunctions.Add(Dog);
            expectedFunctions.Add(Dog_Talk);
            expectedFunctions.Add(Human);
            expectedFunctions.Add(Human_Talk);
            expectedFunctions.Add(Human_Move);
            expectedFunctions.Add(GoToSchool);
            expectedFunctions.Add(GraduateSchool);
            expectedFunctions.Add(GoToWork);
            expectedFunctions.Add(BuyPet);
            expectedFunctions.Add(BuyDog);
            expectedFunctions.Add(BuyCar);
            expectedFunctions.Add(SellCar);
            expectedFunctions.Add(FillCarFuelTank);
            expectedFunctions.Add(Car);
            expectedFunctions.Add(FillTank);

            programFile   = new ProgramFile(filePath, fileName, fileText);
            fileProcessor = new FileProcessor(programFile);
            fileProcessor.ProcessFile();
            codeProcessor = new CodeProcessor(programFile, programClassTypeCollection);
            codeProcessor.ProcessFileCode();

            CheckAllChildListsFunctionData(expectedFunctions, repeatedFunctionNames, programFile);
        }