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(); }
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); }
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); } }
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(); }