/// <summary> /// Initialisiert die Boolean-Variablen, die angeben, welche Einstellungen aktuell /// bezüglich der Listenanordnungen gewählt sind. /// </summary> /// <param name="appSettings">Die aktuellen Anwendungseinstellungen.</param> private void initializeListSettingsViewParameter(AppSettings appSettings) { Debug.WriteLine("Loaded settings for lists: {0}, {1}, {2}, {3}, {4}, {5}.", appSettings.GeneralListOrderSetting, appSettings.AnnouncementOrderSetting, appSettings.ChannelOderSetting, appSettings.GroupOrderSetting, appSettings.ConversationOrderSetting, appSettings.BallotOrderSetting); // Allgemeine Listeneinstellungen. OrderOption generalListOrder = appSettings.GeneralListOrderSetting; IsDescendingSortingOptionSelected = false; IsAscendingSortingOptionSelected = false; // Initialisierung der Boolean Parameter für allgemeine Listeneinstellungen. switch (generalListOrder) { case OrderOption.DESCENDING: IsDescendingSortingOptionSelected = true; break; case OrderOption.ASCENDING: IsAscendingSortingOptionSelected = true; break; default: Debug.WriteLine("No value matched for the generalListOrder settings. Take ascending as default."); IsAscendingSortingOptionSelected = true; break; } // Anordnung von Nachrichten (Announcements) in Nachrichtenauflistungen. OrderOption announcementOrderSetting = appSettings.AnnouncementOrderSetting; IsAscendingMsgOrderSelected = false; IsDescendingMsgOrderSelected = false; switch (announcementOrderSetting) { case OrderOption.ASCENDING: IsAscendingMsgOrderSelected = true; break; case OrderOption.DESCENDING: IsDescendingMsgOrderSelected = true; break; default: Debug.WriteLine("No value matched for the announcementOrderSetting. Take ascending as default."); IsAscendingMsgOrderSelected = true; break; } // Kanaleinstellungen. OrderOption channelSettings = appSettings.ChannelOderSetting; switch (channelSettings) { case OrderOption.ALPHABETICAL: IsChannelOrderOptionAlphabetical = true; IsChannelOrderOptionByType = false; IsChannelOrderOptionByMsgAmount = false; break; case OrderOption.BY_TYPE: IsChannelOrderOptionAlphabetical = false; IsChannelOrderOptionByType = true; IsChannelOrderOptionByMsgAmount = false; break; case OrderOption.BY_NEW_MESSAGES_AMOUNT: IsChannelOrderOptionAlphabetical = false; IsChannelOrderOptionByType = false; IsChannelOrderOptionByMsgAmount = true; break; default: Debug.WriteLine("No value matched for the channelListOrder settings. Take alphabetical as default."); IsChannelOrderOptionAlphabetical = true; IsChannelOrderOptionByType = false; IsChannelOrderOptionByMsgAmount = false; break; } // Gruppeneinstellungen. OrderOption groupSettings = appSettings.GroupOrderSetting; IsGroupOrderOptionAlphabetical = false; IsGroupOrderOptionByType = false; IsGroupOrderOptionByMsgAmount = false; switch (groupSettings) { case OrderOption.ALPHABETICAL: IsGroupOrderOptionAlphabetical = true; break; case OrderOption.BY_TYPE: IsGroupOrderOptionByType = true; break; case OrderOption.BY_NEW_MESSAGES_AMOUNT: IsGroupOrderOptionByMsgAmount = true; break; default: Debug.WriteLine("No value matched for the groupListOrder settings. Take alphabetical as default."); IsGroupOrderOptionAlphabetical = true; break; } // Konversationeneinstellungen. OrderOption conversationSettings = appSettings.ConversationOrderSetting; IsConversationOrderOptionAlphabetical = false; IsConversationOrderOptionByMsgAmount = false; IsConversationOrderOptionLatest = false; switch (conversationSettings) { case OrderOption.ALPHABETICAL: IsConversationOrderOptionAlphabetical = true; break; case OrderOption.BY_NEW_MESSAGES_AMOUNT: IsConversationOrderOptionByMsgAmount = true; break; case OrderOption.BY_LATEST_DATE: IsConversationOrderOptionLatest = true; break; default: Debug.WriteLine("No value matched for the conversationListOrder settings. Take alphabetical as default."); IsConversationOrderOptionAlphabetical = true; break; } // Abstimmungseinstellungen. OrderOption ballotSettings = appSettings.BallotOrderSetting; IsBallotOrderOptionAlphabetical = false; IsBallotOrderOptionByBallotType = false; IsBallotOrderOptionLatestVote = false; switch (ballotSettings) { case OrderOption.ALPHABETICAL: IsBallotOrderOptionAlphabetical = true; break; case OrderOption.BY_TYPE: IsBallotOrderOptionByBallotType = true; break; case OrderOption.BY_LATEST_VOTE: IsBallotOrderOptionLatestVote = true; break; default: Debug.WriteLine("No value matched for the ballotListOrder settings. Take alphabetical as default."); IsBallotOrderOptionAlphabetical = true; break; } }
/// <summary> /// Prüft im Falle einer eingegangenen ConversationMessage, ob der Nutzer benachrichtigt werden soll. /// Die Entscheidung wird abhängig von den Anwendungseinstellungen, oder falls definiert, abhängig /// von den gruppenspezifischen Einstellungen getroffen. /// </summary> /// <param name="appSettings">Die aktuell gültigen Anwendungseinstellungen</param> /// <param name="groupId">Die Id der betroffenen Gruppe, zu der die Konversation gehört.</param> /// <param name="conversationId">Die Id der betroffenen Konversation.</param> /// <returns>Liefert true, wenn der Nutzer benachrichtigt werden soll, ansonsten false.</returns> private bool checkNotificationRequiredForConversationMessage(AppSettings appSettings, int groupId, int conversationId) { bool notificationRequired = false; DataHandlingLayer.DataModel.Enums.NotificationSetting settings; // Hole die Gruppe und prüfe die Einstellungen. Group affectedGroup = groupController.GetGroup(groupId); if (affectedGroup.GroupNotificationSetting != DataModel.Enums.NotificationSetting.APPLICATION_DEFAULT) { Debug.WriteLine("Take group specific settings."); settings = affectedGroup.GroupNotificationSetting; } else { Debug.WriteLine("Take application specific settings."); settings = appSettings.MsgNotificationSetting; } switch (settings) { case DataModel.Enums.NotificationSetting.ANNOUNCE_PRIORITY_HIGH: // Prüfe, ob die eingegangene Nachricht die Priorität hoch hatte. ConversationMessage lastMessage = groupController.GetLastConversationMessage(conversationId); if (lastMessage != null) { if (lastMessage.MessagePriority == Priority.HIGH) { notificationRequired = true; } } break; case DataModel.Enums.NotificationSetting.ANNOUNCE_ALL: notificationRequired = true; break; case DataModel.Enums.NotificationSetting.ANNOUNCE_NONE: notificationRequired = false; break; default: Debug.WriteLine("No cases match, will return false."); notificationRequired = false; break; } Debug.WriteLine("The result of whether the user will be notified is {0}.", notificationRequired); return notificationRequired; }
/// <summary> /// Prüft im Falle einer eingegangenen Announcement, ob der Nutzer benachrichtigt werden soll. /// Die Entscheidung wird abhängig von den Anwendungseinstellungen, oder falls definiert, abhängig /// von den kanalspezifischen Einstellungen getroffen. /// </summary> /// <param name="appSettings">Die aktuell gültigen Anwendungseinstellungen.</param> /// <param name="channelId">Die Id des betroffenen Kanals.</param> /// <returns>Liefert true, wenn der Nutzer benachrichtigt werden soll, ansonsten false.</returns> private bool checkNotificationRequiredForNewAnnouncement(AppSettings appSettings, int channelId) { bool notificationRequired = false; DataHandlingLayer.DataModel.Enums.NotificationSetting settings; // Hole den Kanal und entscheide abhängig von den Einstellungen. Channel affectedChannel = channelController.GetChannel(channelId); if (affectedChannel.AnnouncementNotificationSetting != DataHandlingLayer.DataModel.Enums.NotificationSetting.APPLICATION_DEFAULT) { Debug.WriteLine("Take channel specific settings."); settings = affectedChannel.AnnouncementNotificationSetting; } else { Debug.WriteLine("Take application specific settings."); settings = appSettings.MsgNotificationSetting; } switch (settings) { case DataHandlingLayer.DataModel.Enums.NotificationSetting.ANNOUNCE_PRIORITY_HIGH: // Prüfe, ob die empfangene Announcement Priorität hoch hatte. Announcement lastRecvAnnouncement = channelController.GetLastReceivedAnnouncement(channelId); if (lastRecvAnnouncement != null) { if (lastRecvAnnouncement.MessagePriority == Priority.HIGH) { notificationRequired = true; } } break; case DataHandlingLayer.DataModel.Enums.NotificationSetting.ANNOUNCE_ALL: notificationRequired = true; break; case DataHandlingLayer.DataModel.Enums.NotificationSetting.ANNOUNCE_NONE: notificationRequired = false; break; default: Debug.WriteLine("No case matched. Will return false."); break; } Debug.WriteLine("The result of whether the user will be notified is {0}.", notificationRequired); return notificationRequired; }
/// <summary> /// Speichert die Referenz auf das Objekt mit den Anwendungseinstellungen im Speicherbereich der Singleton-Klasse AppSettingsCache, /// so dass es zur Laufzeit der Anwendung aus diesem Speicher abgefragt werden kann. /// </summary> /// <param name="appSettings">Das Objekt der Klasse AppSettings, welches gespeichert werden soll.</param> public void CacheApplicationSettings(AppSettings appSettings) { this.appSettings = appSettings; }
/// <summary> /// Aktualisiere die Anwendungseinstellungen in der Datenbank. /// Die aktualisierten Daten werden gekapselt in einem AppSettings Objekt übergeben. /// </summary> /// <param name="updatedSettings">Das AppSettings Objekt mit den aktualisierten Anwendungsdaten.</param> public void UpdateApplicationSettings(AppSettings updatedSettings) { // Frage das Mutex Objekt ab. Mutex mutex = DatabaseManager.GetDatabaseAccessMutexObject(); // Fordere Zugriff auf die Datenbank an. if (mutex.WaitOne(DatabaseManager.MutexTimeoutValue)) { using (SQLiteConnection conn = DatabaseManager.GetConnection()) { try{ string sql = @"UPDATE Settings SET ChannelSettings_OrderOptions_OrderId=?, ConversationSettings_OrderOptions_OrderId=?, GroupSettings_OrderOptions_OrderId=?, BallotSettings_OrderOptions_OrderId=?, AnnouncementSettings_OrderOptions_OrderId=?, GeneralListOrder_OrderOptions_OrderId=?, LanguageSettings_LanguageId=?, NotificationSettings_NotifierId=? WHERE Id=0;"; using (var stmt = conn.Prepare(sql)) { stmt.Bind(1, (int)updatedSettings.ChannelOderSetting); stmt.Bind(2, (int)updatedSettings.ConversationOrderSetting); stmt.Bind(3, (int)updatedSettings.GroupOrderSetting); stmt.Bind(4, (int)updatedSettings.BallotOrderSetting); stmt.Bind(5, (int)updatedSettings.AnnouncementOrderSetting); stmt.Bind(6, (int)updatedSettings.GeneralListOrderSetting); stmt.Bind(7, (int)updatedSettings.LanguageSetting); stmt.Bind(8, (int)updatedSettings.MsgNotificationSetting); stmt.Step(); Debug.WriteLine("Performed update on Settings table."); } } catch (SQLiteException sqlEx) { // Hier keine Abbildung auf DatabaseException. Debug.WriteLine("SQLiteException has occurred in UpdateApplicationSettings. The message is: {0}.", sqlEx.Message); throw new DatabaseException("Failed to update application settings."); } catch (Exception ex) { Debug.WriteLine("Exception has occurred in UpdateApplicationSettings. The message is: {0}, " + "and the stack trace: {1}.", ex.Message, ex.StackTrace); throw new DatabaseException("Failed to update application settings."); } finally { mutex.ReleaseMutex(); } } } else { Debug.WriteLine("Couldn't get access to database. Time out."); } }
/// <summary> /// Lädt die aktuell gültigen Anwendungseinstellungen aus der Datenbank und gibt sie /// in einem Objekt gekapselt zurück. /// </summary> /// <returns>Eine Instanz von AppSetting.</returns> /// <exception cref="DatabaseException">Wirft DatabaseException, wenn Laden der Anwendungseinstellungen fehlschlägt.</exception> public AppSettings LoadApplicationSettings() { AppSettings appSettings = null; // Frage das Mutex Objekt ab. Mutex mutex = DatabaseManager.GetDatabaseAccessMutexObject(); // Fordere Zugriff auf die Datenbank an. if (mutex.WaitOne(DatabaseManager.MutexTimeoutValue)) { using (SQLiteConnection conn = DatabaseManager.GetConnection()) { try { string sql = @"SELECT * FROM Settings WHERE Id=?;"; using(var stmt = conn.Prepare(sql)) { stmt.Bind(1, 0); // Settings unter Id 0 abgespeichert. if(stmt.Step() == SQLiteResult.ROW) { OrderOption channelSetting = (OrderOption) Enum.ToObject(typeof(OrderOption), stmt["ChannelSettings_OrderOptions_OrderId"]); OrderOption conversationSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["ConversationSettings_OrderOptions_OrderId"]); OrderOption groupSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["GroupSettings_OrderOptions_OrderId"]); OrderOption ballotSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["BallotSettings_OrderOptions_OrderId"]); OrderOption announcementSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["AnnouncementSettings_OrderOptions_OrderId"]); OrderOption generalListOrderSetting = (OrderOption)Enum.ToObject(typeof(OrderOption), stmt["GeneralListOrder_OrderOptions_OrderId"]); Language languageSetting = (Language)Enum.ToObject(typeof(Language), stmt["LanguageSettings_LanguageId"]); NotificationSetting notificationSetting = (NotificationSetting)Enum.ToObject(typeof(NotificationSetting), stmt["NotificationSettings_NotifierId"]); appSettings = new AppSettings() { ChannelOderSetting = channelSetting, ConversationOrderSetting = conversationSetting, GroupOrderSetting = groupSetting, BallotOrderSetting = ballotSetting, AnnouncementOrderSetting = announcementSetting, GeneralListOrderSetting = generalListOrderSetting, LanguageSetting = languageSetting, MsgNotificationSetting = notificationSetting }; } } } catch (SQLiteException sqlEx) { // Hier keine Abbildung auf DatabaseException. Debug.WriteLine("SQLiteException has occurred in LoadApplicationSettings. The message is: {0}.", sqlEx.Message); throw new DatabaseException("Failed to load application settings."); } catch (Exception ex) { Debug.WriteLine("Exception has occurred in LoadApplicationSettings. The message is: {0}, " + "and the stack trace: {1}.", ex.Message, ex.StackTrace); throw new DatabaseException("Failed to load application settings."); } finally { mutex.ReleaseMutex(); } } } else { Debug.WriteLine("Couldn't get access to database. Time out."); } return appSettings; }