Ejemplo n.º 1
0
 void OutputValueTypeProjectionCode(Dictionary <string, QualifiableType> typeDictionary, Formatter idlFile)
 {
     // This outputs to the IDL file only. There is no output to the .cpp file.
     idlFile.WriteLine("[version(VERSION)]");
     idlFile.WriteLine("typedef struct " + m_stylizedName);
     idlFile.WriteLine("{");
     idlFile.Indent();
     foreach (StructField structField in m_structFields)
     {
         QualifiableType typeObject = typeDictionary[structField.TypeName];
         idlFile.WriteLine(typeObject.IdlTypeNameQualifier + typeObject.ProjectedName + " " + structField.PropertyName + ";");
     }
     idlFile.Unindent();
     idlFile.WriteLine("} " + m_stylizedName + ";");
     idlFile.WriteLine();
 }
Ejemplo n.º 2
0
        bool RequiresClassProjection(Dictionary <string, QualifiableType> typeDictionary)
        {
            // Precondition: this method may only be called from OutputCode, not from
            // the constructor. If it is called from the constructor, some of the field
            // types may not be present in the dictionary yet.

            // The projection type depends on whether this struct has any field which is a ref class.
            foreach (StructField f in m_structFields)
            {
                QualifiableType fieldType = typeDictionary[f.TypeName];
                if (fieldType is Interface)
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 3
0
        public Struct(Namespace parentNamespace, XmlBindings.Struct xmlData, Overrides.XmlBindings.Struct overrideData, Dictionary <string, QualifiableType> typeDictionary, OutputDataTypes outputDataTypes)
        {
            if (parentNamespace != null)
            {
                m_rawName = parentNamespace.ApiName + "_" + xmlData.Name;
                typeDictionary[parentNamespace.RawName + "::" + xmlData.Name] = this;
            }
            else
            {
                m_rawName = xmlData.Name;
                typeDictionary[xmlData.Name] = this;
            }

            m_stylizedName = Formatter.Prefix + Formatter.StylizeNameFromUnderscoreSeparators(xmlData.Name);

            if (overrideData != null)
            {
                if (overrideData.Guid != null)
                {
                    m_guid = overrideData.Guid;
                }

                if (overrideData.ProjectedNameOverride != null)
                {
                    if (overrideData.ShouldProject)
                    {
                        m_stylizedName = Formatter.Prefix + overrideData.ProjectedNameOverride;
                    }
                    else
                    {
                        m_stylizedName = overrideData.ProjectedNameOverride;
                    }
                }

                if (overrideData.IdlNamespaceQualifier != null)
                {
                    m_idlTypeNameQualifier = overrideData.IdlNamespaceQualifier;
                }
            }

            m_idlInterfaceName = "I" + m_stylizedName;

            m_structFields = new List <StructField>();
            foreach (XmlBindings.StructField structXmlData in xmlData.Fields)
            {
                m_structFields.Add(new StructField(structXmlData));
            }
            if (xmlData.Extends != null)
            {
                m_extendsTypeName = xmlData.Extends;

                // Note: the Extends field is already qualified. See D2DTypes.xml. Example: Extends="D2D1::IImage"
                QualifiableType parentType = typeDictionary[m_extendsTypeName];

                Struct parentAsStruct = parentType as Struct;         // Structs should only be deriving from struct types
                m_structFields.InsertRange(0, parentAsStruct.Fields);
                Debug.Assert(parentAsStruct.ExtendsTypeName == null); // Multiple levels in the hierarchy are not supported at this time.
            }

            // For the time being, unions are not output (they are very uncommon).
            bool usesUnions = xmlData.Fields == null;

            // Structs in the global namespace are defined as aliases only. By convention, only structs in a namespace are output.
            if (parentNamespace != null && !usesUnions && (overrideData != null && overrideData.ShouldProject))
            {
                outputDataTypes.AddStruct(this);
            }
        }
Ejemplo n.º 4
0
        void OutputClassProjectionCode(Dictionary <string, QualifiableType> typeDictionary, OutputFiles outputFiles)
        {
            // IDL file
            outputFiles.IdlFile.WriteLine("interface " + m_idlInterfaceName + ";");
            outputFiles.IdlFile.WriteLine("runtimeclass " + m_stylizedName + ";");
            outputFiles.IdlFile.WriteLine();
            outputFiles.IdlFile.WriteLine("[uuid(" + m_guid.ToUpper() + "), version(VERSION), exclusiveto(" + m_stylizedName + ")]");
            outputFiles.IdlFile.WriteLine("interface " + m_idlInterfaceName + " : IInspectable");
            outputFiles.IdlFile.WriteLine("{");
            outputFiles.IdlFile.Indent();

            for (int i = 0; i < m_structFields.Count; i++)
            {
                QualifiableType typeObject = typeDictionary[m_structFields[i].TypeName];

                outputFiles.IdlFile.WriteLine("[propget] HRESULT " + m_structFields[i].PropertyName + "([out, retval] " + typeObject.IdlTypeNameQualifier + typeObject.ProjectedNameIncludingIndirection + "* value);");
                outputFiles.IdlFile.WriteLine("[propput] HRESULT " + m_structFields[i].PropertyName + "([in] " + typeObject.IdlTypeNameQualifier + typeObject.ProjectedNameIncludingIndirection + " value);");

                if (i < m_structFields.Count - 1)
                {
                    outputFiles.IdlFile.WriteLine();
                }
            }

            outputFiles.IdlFile.Unindent();
            outputFiles.IdlFile.WriteLine("}");
            outputFiles.IdlFile.WriteLine();
            outputFiles.IdlFile.WriteLine("[version(VERSION), activatable(VERSION)]");
            outputFiles.IdlFile.WriteLine("runtimeclass " + m_stylizedName + "");
            outputFiles.IdlFile.WriteLine("{");
            outputFiles.IdlFile.Indent();
            outputFiles.IdlFile.WriteLine("[default] interface " + m_idlInterfaceName + ";");
            outputFiles.IdlFile.Unindent();
            outputFiles.IdlFile.WriteLine("}");
            outputFiles.IdlFile.WriteLine();

            // CPP file
            outputFiles.CppFile.WriteLine("class " + m_stylizedName + " : public Microsoft::WRL::RuntimeClass<" + m_idlInterfaceName + ">");
            outputFiles.CppFile.WriteLine("{");

            outputFiles.CppFile.Indent();
            outputFiles.CppFile.WriteLine("InspectableClass(L\"Microsoft." + Formatter.Subnamespace + "." + m_stylizedName + "\", BaseTrust);");
            outputFiles.CppFile.WriteLine();
            outputFiles.CppFile.Unindent();

            outputFiles.CppFile.WriteLine("public:");
            outputFiles.CppFile.Indent();
            for (int i = 0; i < m_structFields.Count; i++)
            {
                QualifiableType typeObject = typeDictionary[m_structFields[i].TypeName];

                outputFiles.CppFile.WriteLine("IFACEMETHOD(get_" + m_structFields[i].PropertyName + ")(_Out_ " + typeObject.ProjectedNameIncludingIndirection + "* value) override");;
                outputFiles.CppFile.WriteLine("{");
                outputFiles.CppFile.Indent();

                outputFiles.CppFile.WriteLine("if (!value)");
                outputFiles.CppFile.Indent();
                outputFiles.CppFile.WriteLine("return E_INVALIDARG;");
                outputFiles.CppFile.WriteLine();
                outputFiles.CppFile.Unindent();
                if (typeObject is Interface)
                {
                    outputFiles.CppFile.WriteLine(m_structFields[i].PrivateMemberName + ".CopyTo(value);");
                }
                else
                {
                    outputFiles.CppFile.WriteLine("*value = " + m_structFields[i].PrivateMemberName + typeObject.AccessorSuffix + ";");
                }
                outputFiles.CppFile.WriteLine("return S_OK;");
                outputFiles.CppFile.Unindent();
                outputFiles.CppFile.WriteLine("}");

                outputFiles.CppFile.WriteLine();
                outputFiles.CppFile.WriteLine("IFACEMETHOD(put_" + m_structFields[i].PropertyName + ")(" + typeObject.ProjectedNameIncludingIndirection + " value) override");
                outputFiles.CppFile.WriteLine("{");
                outputFiles.CppFile.Indent();
                outputFiles.CppFile.WriteLine(m_structFields[i].PrivateMemberName + " = value;");
                outputFiles.CppFile.WriteLine("return S_OK;");
                outputFiles.CppFile.Unindent();
                outputFiles.CppFile.WriteLine("}");
                outputFiles.CppFile.WriteLine();
            }
            outputFiles.CppFile.Unindent();
            outputFiles.CppFile.WriteLine("private:");
            outputFiles.CppFile.Indent();
            for (int i = 0; i < m_structFields.Count; i++)
            {
                QualifiableType typeObject = typeDictionary[m_structFields[i].TypeName];
                outputFiles.CppFile.WriteLine(typeObject.RuntimeClassMemberTypeName + " " + m_structFields[i].PrivateMemberName + ";");
            }
            outputFiles.CppFile.Unindent();
            outputFiles.CppFile.WriteLine("};");
            outputFiles.CppFile.WriteLine();
        }