From: Ernest Borowski Date: Thu, 6 Oct 2022 08:50:02 +0000 (+0200) Subject: Improve startup performance && remove svace fix. X-Git-Tag: accepted/tizen/unified/20221007.050539^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=894d41cac2a8adde6c853e42b755246cd67aa22c;p=profile%2Fiot%2Fapps%2Fdotnet%2Fsetting-certificates.git Improve startup performance && remove svace fix. Startup performaance has been improved by lazy loading certificates metadata. Removing Dispose() invocation because it caused some errors during qa. Change-Id: Iaa07652708ff487697987f425659ef6354e82e73 Signed-off-by: Ernest Borowski --- diff --git a/SettingCertificates/SettingCertificates/WidgetSettingCertificates.cs b/SettingCertificates/SettingCertificates/WidgetSettingCertificates.cs index 3457d5a..348f13a 100644 --- a/SettingCertificates/SettingCertificates/WidgetSettingCertificates.cs +++ b/SettingCertificates/SettingCertificates/WidgetSettingCertificates.cs @@ -51,7 +51,6 @@ namespace SettingCertificates window.GetDefaultLayer().Add(_rootView); _navigator = window.GetDefaultNavigator(); _navigator.Push(CreateFirstPage()); - } private ContentPage CreateFirstPage() { @@ -89,8 +88,7 @@ namespace SettingCertificates ContentPage firstPage = CreateContentPage(Resources.IDS_ST_HEADER_MANAGE_CERTIFICATES_ABB/*"Manage certificates"*/, content); firstPage.AppBar.AutoNavigationContent = false; - ViewStyle style = ThemeManager.GetStyle("Tizen.NUI.Components.AppBar"); - var navigationContent = new Button(((AppBarStyle)style).BackButton); + var navigationContent = new Button(((AppBarStyle)ThemeManager.GetStyle("Tizen.NUI.Components.AppBar")).BackButton); navigationContent.Clicked += (o, e) => { Bundle bundle = new Bundle(); @@ -98,7 +96,6 @@ namespace SettingCertificates SetContentInfo(bundle.Encode()); }; firstPage.AppBar.NavigationContent = navigationContent; - style.Dispose(); return firstPage; } @@ -128,6 +125,7 @@ namespace SettingCertificates } private ContentPage CreateCertDetails(certificateMetadata cert) { + cert.GetMetadata(); ScrollableBase content = CreateScrollableBase(); content.BackgroundColor = new Color("#EFEFEF"); const float fieldTitleFontScale = 1.2F; diff --git a/SettingCertificates/SettingCertificates/api/Interop/Interop.CertSvc.cs b/SettingCertificates/SettingCertificates/api/Interop/Interop.CertSvc.cs index ff8775b..c7add41 100644 --- a/SettingCertificates/SettingCertificates/api/Interop/Interop.CertSvc.cs +++ b/SettingCertificates/SettingCertificates/api/Interop/Interop.CertSvc.cs @@ -129,6 +129,7 @@ internal static partial class Interop internal DateTime before; internal DateTime after; internal int rootCa; + private bool gotMetadata = false; public certificateMetadata() { fields = new string[Enum.GetNames(typeof(CertificateField)).Length]; @@ -165,8 +166,71 @@ internal static partial class Interop } return GetCertFieldDescription(field); } - } + public void GetMetadata() + { + if (gotMetadata == true) + { + return; + } + InstanceNew(out IntPtr instance); + if (instance == null) + { + Tizen.Log.Debug(LogTag, "Unable to create new instance"); + return; + } + ErrorCode err = (ErrorCode)GetPKCS12CertificateFromStore(instance, storeType, gname, out Certificate cout); + if (err != ErrorCode.CERTSVC_SUCCESS) + { + Tizen.Log.Debug(LogTag, "Unable to GetPKCS12CertificateFromStore, err: " + err + ", instance: " + + instance + " gname: " + gname + " store_type: " + storeType); + InstanceFree(instance); + return; + } + + err = (ErrorCode)GetCertificateNotAfter(cout, out long time); + if (err != ErrorCode.CERTSVC_SUCCESS) + { + Tizen.Log.Debug(LogTag, "Unable to GetCertificateNotAfter, , err: " + err + ", instance: " + + instance + " gname: " + gname + " store_type: " + storeType); + InstanceFree(instance); + return; + } + after = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time); + err = (ErrorCode)GetCertificateNotBefore(cout, out time); + if (err != ErrorCode.CERTSVC_SUCCESS) + { + Tizen.Log.Debug(LogTag, "Unable to GetCertificateNotBefore, , err: " + err + ", instance: " + + instance + " gname: " + gname + " store_type: " + storeType); + InstanceFree(instance); + return; + } + before = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time); + err = (ErrorCode)GetCertificateIsRootCa(cout, out int isRootCa); + if (err != ErrorCode.CERTSVC_SUCCESS) + { + Tizen.Log.Debug(LogTag, "Unable to GetCertificateIsRootCa, , err: " + err + ", instance: " + + instance + " gname: " + gname + " store_type: " + storeType); + InstanceFree(instance); + return; + } + rootCa = isRootCa; + foreach (CertificateField certificateField in Enum.GetValues(typeof(CertificateField))) + { + err = (ErrorCode)GetCertificateStringField(cout, certificateField, out CertSvcString certSvcString); + if (err != ErrorCode.CERTSVC_SUCCESS) + { + Tizen.Log.Debug(LogTag, "Unable to GetCertificateStringField, , err: " + err + ", instance: " + + instance + " gname: " + gname + " store_type: " + storeType); + continue; + } + string stringField = Marshal.PtrToStringUTF8(certSvcString.privateHandler); + fields[(int)certificateField] = stringField; + } + gotMetadata = true; + InstanceFree(instance); + } + } internal struct StoreCertHandle { string name; @@ -215,72 +279,16 @@ internal static partial class Interop { IntPtr cur = certList; var list = new List(); - while (cur != IntPtr.Zero) { StoreCertList item = Marshal.PtrToStructure(cur); - certificateMetadata cert = new certificateMetadata + certificateMetadata cert = new certificateMetadata() { status = item.status, gname = Marshal.PtrToStringUTF8(item.gname), title = Marshal.PtrToStringUTF8(item.title), storeType = item.storeType }; - ErrorCode err = (ErrorCode)GetPKCS12CertificateFromStore(instance, item.storeType, item.gname, out Certificate cout); - if (err != ErrorCode.CERTSVC_SUCCESS) - { - Tizen.Log.Debug(LogTag, "Unable to GetPKCS12CertificateFromStore, err: " + err + ", instance: " - + instance + " gname: " + item.gname + " store_type: " + item.storeType); - cur = item.next; - continue; - } - - err = (ErrorCode)GetCertificateNotAfter(cout, out long time); - if (err != ErrorCode.CERTSVC_SUCCESS) - { - Tizen.Log.Debug(LogTag, "Unable to GetCertificateNotAfter, , err: " + err + ", instance: " - + instance + " gname: " + item.gname + " store_type: " + item.storeType); - cur = item.next; - continue; - } - cert.after = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time); - err = (ErrorCode)GetCertificateNotBefore(cout, out time); - if (err != ErrorCode.CERTSVC_SUCCESS) - { - Tizen.Log.Debug(LogTag, "Unable to GetCertificateNotBefore, , err: " + err + ", instance: " - + instance + " gname: " + item.gname + " store_type: " + item.storeType); - cur = item.next; - continue; - } - cert.before = new DateTime(1970, 1, 1).ToLocalTime().AddSeconds(time); - err = (ErrorCode)GetCertificateIsRootCa(cout, out int isRootCa); - if (err != ErrorCode.CERTSVC_SUCCESS) - { - Tizen.Log.Debug(LogTag, "Unable to GetCertificateIsRootCa, , err: " + err + ", instance: " - + instance + " gname: " + item.gname + " store_type: " + item.storeType); - cur = item.next; - continue; - } - cert.rootCa = isRootCa; - bool gotError = false; - foreach (CertificateField certificateField in Enum.GetValues(typeof(CertificateField))) - { - err = (ErrorCode)GetCertificateStringField(cout, certificateField, out CertSvcString certSvcString); - if (err != ErrorCode.CERTSVC_SUCCESS) - { - Tizen.Log.Debug(LogTag, "Unable to GetCertificateStringField, , err: " + err + ", instance: " - + instance + " gname: " + item.gname + " store_type: " + item.storeType); - cur = item.next; - gotError = true; - break; - } - string stringField = Marshal.PtrToStringUTF8(certSvcString.privateHandler); - cert.fields[(int)certificateField] = stringField; - } - if (gotError == true) - { - continue; - } cur = item.next; list.Add(cert); } @@ -303,6 +311,9 @@ internal static partial class Interop // int certsvc_pkcs12_get_certificate_from_store(CertSvcInstance instance, CertStoreType storeType, const char* gname, CertSvcCertificate *certificate); [DllImport(Libraries.CertSvc, EntryPoint = "certsvc_pkcs12_get_certificate_from_store")] internal static extern int GetPKCS12CertificateFromStore(IntPtr instance, CertStoreType storeType, IntPtr gname, out Certificate certificate); + // int certsvc_pkcs12_get_certificate_from_store(CertSvcInstance instance, CertStoreType storeType, const char* gname, CertSvcCertificate *certificate); + [DllImport(Libraries.CertSvc, EntryPoint = "certsvc_pkcs12_get_certificate_from_store")] + internal static extern int GetPKCS12CertificateFromStore(IntPtr instance, CertStoreType storeType, [MarshalAs(UnmanagedType.LPStr)] string gname, out Certificate certificate); // int certsvc_certificate_get_string_field(CertSvcCertificate certificate, CertSvcCertificateField field, CertSvcString *buffer); [DllImport(Libraries.CertSvc, EntryPoint = "certsvc_certificate_get_string_field")] diff --git a/packaging/org.tizen.cssetting-certificates-1.0.0.tpk b/packaging/org.tizen.cssetting-certificates-1.0.0.tpk index a6ddc17..9634adf 100644 Binary files a/packaging/org.tizen.cssetting-certificates-1.0.0.tpk and b/packaging/org.tizen.cssetting-certificates-1.0.0.tpk differ