/// <summary> /// Generates the class code for a service. /// </summary> /// <param name="service">The service to generate for.</param> /// <param name="className">The class name of the service or null to use the service type.</param> /// <param name="namespaceName">The namespace for the class.</param> /// <param name="classScope">The scope for the class.</param> /// <param name="partial">True to make the class partial, false otherwise.</param> /// <param name="testStateVars"> /// True to test each state variable to ensure it is /// usuable for accessing as property, false to include /// all state variables as properties.</param> /// <returns>The string representing the code for the class.</returns> public string GenerateClassFor( Service service, string className, string namespaceName, ClassScope classScope, bool partial, bool testStateVars) { // If classname is not specified then default to service information if (className == null) { className = DefaultCodeGenClassName(service, CodeGenProvider); } else { // Otherwise ensure classname is Identifier compatible className = CodeGenProvider.CodeFriendlyIdentifier(className, false); } StringBuilder lsbStateVarProps = new StringBuilder(); StringBuilder lsbStateVarConversion = new StringBuilder(); StringBuilder lsbStateVarEnums = new StringBuilder(); StringBuilder lsbActionMethods = new StringBuilder(); StringBuilder lsbEventHandlers = new StringBuilder(); StringBuilder lsbEventCallers = new StringBuilder(); StringBuilder lsbStateVarEventIntercept = new StringBuilder(); HashSet <string> lhsEnumStateVars = new HashSet <string>(); StringConstants lscConsts = new StringConstants(CodeGenProvider); Dictionary <string, string> ldStateVarTypes = new Dictionary <string, string>(); // Get the service description ServiceDescription lsdDesc = service.Description(); if (lsdDesc != null) { // Generate the state variable property declarations GenerateStateVarCode( service, testStateVars, lscConsts, lsbStateVarProps, lsbStateVarConversion, lsbStateVarEnums, lsbEventHandlers, lsbEventCallers, lsbStateVarEventIntercept, lhsEnumStateVars, ldStateVarTypes, lsdDesc); // Generate the action methods GenerateActionCode( lscConsts, lsbActionMethods, lhsEnumStateVars, ldStateVarTypes, lsdDesc); } if (lsbStateVarEventIntercept.Length > 0) { lsbEventCallers.Append( String.Format(CodeGenProvider.StateVarChangedEventHandler, lsbStateVarEventIntercept) ); } return (String.Format( CodeGenProvider.ServiceBase, namespaceName, className, service.ServiceTypeIdentifier, CodeGenProvider.GenerateRegion(CodeGenProvider.PublicEnumerations, lsbStateVarEnums.ToString()), (partial ? CodeGenProvider.PartialClass : String.Empty), CodeGenProvider.GenerateRegion(CodeGenProvider.ProtectedMethods, lsbStateVarConversion.ToString()), lsbActionMethods, CodeGenProvider.GenerateRegion(CodeGenProvider.PublicProperties, lsbStateVarProps.ToString()), CodeGenProvider.GenerateRegion(CodeGenProvider.ProtectedConstants, lscConsts.Definitions().ToString(), false, false), CodeGenProvider.GetClassScope(classScope, CodeGenProvider.Space.ToString()), CodeGenProvider.GenerateRegion(CodeGenProvider.EventHandlers, lsbEventHandlers.ToString(), true), CodeGenProvider.GenerateRegion(CodeGenProvider.EventCallers, lsbEventCallers.ToString()), string.Format( CodeGenProvider.ServiceClassHeaderComment, (service.Device != null && service.Device.RootDevice != null ? service.Device.RootDevice.FriendlyName : CodeGenProvider.Null), (service.Device != null && service.Device.RootDevice != null ? service.Device.RootDevice.Type : CodeGenProvider.Null), (service.Device != null && service.Device.RootDevice != null ? service.Device.RootDevice.SerialNumber : CodeGenProvider.Null), (service.Device != null ? service.Device.FriendlyName : CodeGenProvider.Null), (service.Device != null ? service.Device.Type : CodeGenProvider.Null), service.Id, service.ServiceTypeIdentifier, DateTime.Now.ToString(), className, namespaceName, classScope.ToString(), (partial ? CodeGenProvider.PartialClass : string.Empty), testStateVars, CodeGenProvider.ToString() ) )); }
/// <summary> /// Generates the class code for a device. /// </summary> /// <param name="device">The device to generate code for.</param> /// <param name="className">The class name of the device class or null to use friendly name.</param> /// <param name="namespaceName">The namespace for the class.</param> /// <param name="classScope">The scope of the class.</param> /// <param name="partial">True to make the class partial, false otherwise.</param> /// <param name="specificDevices">True if generating properties for device specific class types, false to use device non-specific class types.</param> /// <param name="specificServiceNamespace">The name of the service namespace if using specific service class types, null to use service non-specific class types.</param> /// <param name="specificDeviceClasses">The dictionary of UDNs, ClassNames for the devices or null for default / none.</param> /// <param name="specificServiceClasses">The dictionary of IDs, ClassNames for the services or null for default / none.</param> /// <returns>The string representing the code for the class.</returns> public string GenerateClassFor( Device device, string className, string namespaceName, ClassScope classScope, bool partial, bool specificDevices, string specificServiceNamespace, Dictionary <string, string> specificDeviceClasses = null, Dictionary <string, string> specificServiceClasses = null) { if (className == null) { className = DefaultCodeGenClassName(device, CodeGenProvider); } else { className = CodeGenProvider.CodeFriendlyIdentifier(className, false); } // No namespace specified then set it not use one if (string.IsNullOrEmpty(specificServiceNamespace)) { specificServiceNamespace = string.Empty; } // Set the specific services bool mbSpecificServices = specificServiceNamespace.Length > 0; string lsUsing; // If service namespace is different to device namespace if (specificServiceNamespace != namespaceName) { // Add the services namespace to the using clause lsUsing = (mbSpecificServices ? string.Format(CodeGenProvider.UsingClause, specificServiceNamespace) : string.Empty); } else { // Otherwise dont add anything to the uses clause lsUsing = string.Empty; } StringConstants lscConstants = new StringConstants(CodeGenProvider); StringBuilder lsbProperties = new StringBuilder(); // Build the child devices properties GenerateDevicePropertyCode(device, specificDevices, lscConstants, lsbProperties, specificDeviceClasses); // Build the child services properties GenerateServicePropertyCode(device, mbSpecificServices, lscConstants, lsbProperties, specificServiceClasses); // Build the code for the device class return (string.Format( CodeGenProvider.DeviceBase, lsUsing, namespaceName, CodeGenProvider.GetClassScope(classScope, CodeGenProvider.Space.ToString()), (partial ? CodeGenProvider.PartialClass : string.Empty), className, CodeGenProvider.GenerateRegion(CodeGenProvider.ProtectedConstants, lscConstants.Definitions().ToString(), false, false), device.Type, CodeGenProvider.GenerateRegion(CodeGenProvider.PublicProperties, lsbProperties.ToString()), device.ModelName, string.Format( CodeGenProvider.DeviceClassHeaderComment, (device.RootDevice != null ? device.RootDevice.FriendlyName : CodeGenProvider.Null), (device.RootDevice != null ? device.RootDevice.Type : CodeGenProvider.Null), (device.RootDevice != null ? device.RootDevice.SerialNumber : CodeGenProvider.Null), device.FriendlyName, device.Type, DateTime.Now.ToString(), className, namespaceName, classScope.ToString(), (partial ? CodeGenProvider.PartialClass : string.Empty), CodeGenProvider.ToString() ) )); }