fn write_properties()

in optee-utee-build/src/code_generator.rs [116:190]


    fn write_properties(&mut self, conf: &TaConfig) -> Result<(), Error> {
        let mut ext_property_codes =
            Vec::<proc_macro2::TokenStream>::with_capacity(conf.ext_properties.len());
        for (index, prop) in conf.ext_properties.iter().enumerate() {
            let var_name = format!("EXT_PROP_VALUE_{}", index + 1);
            let rust_type_name_codes = property_value_rust_type_declaration_codes(&prop.value);
            let value_codes = property_value_data_codes(&prop.value)?;
            let var_name_codes = format_ident!("{}", var_name);
            self.code.extend(quote! {
            const #var_name_codes: #rust_type_name_codes = #value_codes;
                        });
            let prop_name_codes = string_to_binary_codes(&prop.name);
            let utee_type_name_codes = property_value_utee_type_codes(&prop.value);
            let utee_value_conv_codes = property_value_as_utee_value_codes(&var_name, &prop.value);
            ext_property_codes.push(quote! {
                optee_utee_sys::user_ta_property {
                    name: #prop_name_codes.as_ptr(),
                    prop_type: #utee_type_name_codes,
                    value: #utee_value_conv_codes,
                }
            });
        }

        const ORIGIN_PROPERTY_LEN: usize = 7;
        let property_len = ORIGIN_PROPERTY_LEN + conf.ext_properties.len();
        let no_mangle_attribute = self.edition.no_mangle_attribute_codes();
        self.code.extend(quote! {
        static FLAG_BOOL: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_SINGLE_INSTANCE) != 0;
        static FLAG_MULTI: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_MULTI_SESSION) != 0;
        static FLAG_INSTANCE: bool = (TA_FLAGS & optee_utee_sys::TA_FLAG_INSTANCE_KEEP_ALIVE) != 0;
        #no_mangle_attribute
        pub static ta_num_props: usize = #property_len;
        #no_mangle_attribute
        pub static ta_props: [optee_utee_sys::user_ta_property; #property_len] = [
            optee_utee_sys::user_ta_property {
                name: optee_utee_sys::TA_PROP_STR_SINGLE_INSTANCE,
                prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
                value: &FLAG_BOOL as *const bool as *mut _,
            },
            optee_utee_sys::user_ta_property {
                name: optee_utee_sys::TA_PROP_STR_MULTI_SESSION,
                prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
                value: &FLAG_MULTI as *const bool as *mut _,
            },
            optee_utee_sys::user_ta_property {
                name: optee_utee_sys::TA_PROP_STR_KEEP_ALIVE,
                prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_BOOL,
                value: &FLAG_INSTANCE as *const bool as *mut _,
            },
            optee_utee_sys::user_ta_property {
                name: optee_utee_sys::TA_PROP_STR_DATA_SIZE,
                prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32,
                value: &TA_DATA_SIZE as *const u32 as *mut _,
            },
            optee_utee_sys::user_ta_property {
                name: optee_utee_sys::TA_PROP_STR_STACK_SIZE,
                prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_U32,
                value: &TA_STACK_SIZE as *const u32 as *mut _,
            },
            optee_utee_sys::user_ta_property {
                name: optee_utee_sys::TA_PROP_STR_VERSION,
                prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING,
                value: TA_VERSION as *const [u8] as *mut _,
            },
            optee_utee_sys::user_ta_property {
                name: optee_utee_sys::TA_PROP_STR_DESCRIPTION,
                prop_type: optee_utee_sys::user_ta_prop_type::USER_TA_PROP_TYPE_STRING,
                value: TA_DESCRIPTION as *const [u8] as *mut _,
            },
            #(#ext_property_codes),*
        ];
                });

        Ok(())
    }