/// <summary> /// Start the application context /// </summary> public static bool StartContext(IDialogProvider dialogProvider) { var retVal = new DcApplicationContext(dialogProvider); retVal.m_configurationManager = new DcConfigurationManager(); // Not configured if (!retVal.ConfigurationManager.IsConfigured) { return(false); } else { // load configuration try { // Set master application context ApplicationContext.Current = retVal; try { retVal.ConfigurationManager.Load(); retVal.ConfigurationManager.Backup(); } catch { if (retVal.ConfigurationManager.HasBackup() && retVal.Confirm(Strings.err_configuration_invalid_restore_prompt)) { retVal.ConfigurationManager.Restore(); retVal.ConfigurationManager.Load(); } else { throw; } } retVal.AddServiceProvider(typeof(XamarinBackupService)); // Is there a backup, and if so, does the user want to restore from that backup? var backupSvc = retVal.GetService <IBackupService>(); if (backupSvc.HasBackup(BackupMedia.Public) && retVal.Configuration.GetAppSetting("ignore.restore") == null && retVal.Confirm(Strings.locale_confirm_restore)) { backupSvc.Restore(BackupMedia.Public); } // Ignore restoration retVal.Configuration.GetSection <ApplicationConfigurationSection>().AppSettings.Add(new AppSettingKeyValuePair() { Key = "ignore.restore", Value = "true" }); retVal.m_tracer = Tracer.GetTracer(typeof(DcApplicationContext), retVal.ConfigurationManager.Configuration); retVal.SetProgress("Loading configuration", 0.2f); // Load all user-downloaded applets in the data directory var configuredApplets = retVal.Configuration.GetSection <AppletConfigurationSection>().Applets; var appletService = retVal.GetService <IAppletManagerService>(); foreach (var appletInfo in configuredApplets)// Directory.GetFiles(this.m_configuration.GetSection<AppletConfigurationSection>().AppletDirectory)) { { try { retVal.m_tracer.TraceInfo("Loading applet {0}", appletInfo); String appletPath = Path.Combine(retVal.Configuration.GetSection <AppletConfigurationSection>().AppletDirectory, appletInfo.Id); using (var fs = File.OpenRead(appletPath)) { AppletManifest manifest = AppletManifest.Load(fs); // Is this applet in the allowed applets // public key token match? if (appletInfo.PublicKeyToken != manifest.Info.PublicKeyToken) { retVal.m_tracer.TraceWarning("Applet {0} failed validation", appletInfo); ; // TODO: Raise an error } appletService.LoadApplet(manifest); } } catch (AppDomainUnloadedException) { throw; } } catch (Exception e) { if (retVal.Confirm(String.Format(Strings.err_applet_corrupt_reinstall, appletInfo.Id))) { String appletPath = Path.Combine(retVal.Configuration.GetSection <AppletConfigurationSection>().AppletDirectory, appletInfo.Id); if (File.Exists(appletPath)) { File.Delete(appletPath); } } else { retVal.m_tracer.TraceError("Loading applet {0} failed: {1}", appletInfo, e.ToString()); throw; } } // Ensure data migration exists try { // If the DB File doesn't exist we have to clear the migrations if (!File.Exists(retVal.Configuration.GetConnectionString(retVal.Configuration.GetSection <DataConfigurationSection>().MainDataSourceConnectionStringName).Value)) { retVal.m_tracer.TraceWarning("Can't find the OpenIZ database, will re-install all migrations"); retVal.Configuration.GetSection <DataConfigurationSection>().MigrationLog.Entry.Clear(); } retVal.SetProgress("Migrating databases", 0.6f); DataMigrator migrator = new DataMigrator(); migrator.Ensure(); // Set the entity source EntitySource.Current = new EntitySource(retVal.GetService <IEntitySourceProvider>()); // Prepare clinical protocols //retVal.GetService<ICarePlanService>().Repository = retVal.GetService<IClinicalProtocolRepositoryService>(); ApplicationServiceContext.Current = ApplicationContext.Current; ApplicationServiceContext.HostType = OpenIZHostType.OtherClient; } catch (Exception e) { retVal.m_tracer.TraceError(e.ToString()); throw; } finally { retVal.ConfigurationManager.Save(); } // Set the tracer writers for the PCL goodness! foreach (var itm in retVal.Configuration.GetSection <DiagnosticsConfigurationSection>().TraceWriter) { OpenIZ.Core.Diagnostics.Tracer.AddWriter(itm.TraceWriter, itm.Filter); } // Start daemons retVal.GetService <IThreadPoolService>().QueueUserWorkItem(o => { retVal.Start(); }); //retVal.Start(); }
/// <summary> /// Start the application context /// </summary> public static bool Start(A.Content.Context launcherActivity, A.Content.Context context, A.App.Application application) { var retVal = new AndroidApplicationContext(); retVal.Context = context; retVal.m_configurationManager = new ConfigurationManager(); retVal.AndroidApplication = application; // Not configured if (!retVal.ConfigurationManager.IsConfigured) { NoConfiguration?.Invoke(null, EventArgs.Empty); return(false); } else { // load configuration try { // Set master application context ApplicationContext.Current = retVal; retVal.CurrentActivity = launcherActivity; try { retVal.ConfigurationManager.Load(); retVal.ConfigurationManager.Backup(); } catch { if (retVal.ConfigurationManager.HasBackup() && retVal.Confirm(Strings.err_configuration_invalid_restore_prompt)) { retVal.ConfigurationManager.Restore(); retVal.ConfigurationManager.Load(); } else { throw; } } retVal.AddServiceProvider(typeof(AndroidBackupService)); retVal.m_tracer = Tracer.GetTracer(typeof(AndroidApplicationContext), retVal.ConfigurationManager.Configuration); // Is there a backup, and if so, does the user want to restore from that backup? var backupSvc = retVal.GetService <IBackupService>(); if (backupSvc.HasBackup(BackupMedia.Public) && retVal.Configuration.GetAppSetting("ignore.restore") == null && retVal.Confirm(Strings.locale_confirm_restore)) { backupSvc.Restore(BackupMedia.Public); } // Ignore restoration retVal.Configuration.GetSection <ApplicationConfigurationSection>().AppSettings.Add(new AppSettingKeyValuePair() { Key = "ignore.restore", Value = "true" }); // HACK: For some reason the PCL doesn't do this automagically //var connectionString = retVal.Configuration.GetConnectionString("openIzWarehouse"); //if (!File.Exists(connectionString.Value)) //{ // retVal.m_tracer.TraceInfo("HAX: Creating warehouse file since PCL can't... {0}", connectionString.Value); // SqliteConnection.CreateFile(connectionString.Value); //} // Load configured applets var configuredApplets = retVal.Configuration.GetSection <AppletConfigurationSection>().Applets; retVal.SetProgress(context.GetString(Resource.String.startup_configuration), 0.2f); var appletManager = retVal.GetService <IAppletManagerService>(); // Load all user-downloaded applets in the data directory foreach (var appletInfo in configuredApplets)// Directory.GetFiles(this.m_configuration.GetSection<AppletConfigurationSection>().AppletDirectory)) { { try { retVal.m_tracer.TraceInfo("Loading applet {0}", appletInfo); String appletPath = Path.Combine(retVal.Configuration.GetSection <AppletConfigurationSection>().AppletDirectory, appletInfo.Id); if (!File.Exists(appletPath)) // reinstall { retVal.Configuration.GetSection <AppletConfigurationSection>().Applets.Clear(); retVal.SaveConfiguration(); retVal.Alert(Strings.locale_restartRequired); throw new AppDomainUnloadedException(); } // Load using (var fs = File.OpenRead(appletPath)) { AppletManifest manifest = AppletManifest.Load(fs); // Is this applet in the allowed applets // public key token match? if (appletInfo.PublicKeyToken != manifest.Info.PublicKeyToken) { retVal.m_tracer.TraceWarning("Applet {0} failed validation", appletInfo); ; // TODO: Raise an error } appletManager.LoadApplet(manifest); } } catch (AppDomainUnloadedException) { throw; } } catch (Exception e) { retVal.m_tracer.TraceError("Applet Load Error: {0}", e); if (retVal.Confirm(String.Format(Strings.err_applet_corrupt_reinstall, appletInfo.Id))) { String appletPath = Path.Combine(retVal.Configuration.GetSection <AppletConfigurationSection>().AppletDirectory, appletInfo.Id); if (File.Exists(appletPath)) { File.Delete(appletPath); } } else { retVal.m_tracer.TraceError("Loading applet {0} failed: {1}", appletInfo, e.ToString()); throw; } } // Are we going to deploy applets // Upgrade applets from our app manifest foreach (var itm in context.Assets.List("Applets")) { try { retVal.m_tracer.TraceVerbose("Loading {0}", itm); AppletPackage pkg = AppletPackage.Load(context.Assets.Open(String.Format("Applets/{0}", itm))); // Write data to assets directory #if !DEBUG if (appletManager.GetApplet(pkg.Meta.Id) == null || new Version(appletManager.GetApplet(pkg.Meta.Id).Info.Version) < new Version(pkg.Meta.Version)) #endif appletManager.Install(pkg, true); } catch (Exception e) { retVal.m_tracer?.TraceError(e.ToString()); } } // Ensure data migration exists try { // If the DB File doesn't exist we have to clear the migrations if (!File.Exists(retVal.Configuration.GetConnectionString(retVal.Configuration.GetSection <DataConfigurationSection>().MainDataSourceConnectionStringName).Value)) { retVal.m_tracer.TraceWarning("Can't find the OpenIZ database, will re-install all migrations"); retVal.Configuration.GetSection <DataConfigurationSection>().MigrationLog.Entry.Clear(); } retVal.SetProgress(context.GetString(Resource.String.startup_data), 0.6f); DataMigrator migrator = new DataMigrator(); migrator.Ensure(); // Set the entity source EntitySource.Current = new EntitySource(retVal.GetService <IEntitySourceProvider>()); ApplicationServiceContext.Current = ApplicationContext.Current; ApplicationServiceContext.HostType = OpenIZHostType.MobileClient; } catch (Exception e) { retVal.m_tracer.TraceError(e.ToString()); throw; } finally { retVal.ConfigurationManager.Save(); } // Is there a backup manager? If no then we will use the default backup manager // Start daemons ApplicationContext.Current.GetService <IUpdateManager>().AutoUpdate(); retVal.GetService <IThreadPoolService>().QueueNonPooledWorkItem(o => { retVal.Start(); }, null); // Set the tracer writers for the PCL goodness! foreach (var itm in retVal.Configuration.GetSection <DiagnosticsConfigurationSection>().TraceWriter) { OpenIZ.Core.Diagnostics.Tracer.AddWriter(itm.TraceWriter, itm.Filter); } }