/// <summary> /// Erstelle eine neue Konversationsnachricht. Sendet einen Request an den Server, /// um die Nachricht anzulegen. Der Server verteilt die Nachricht dann an alle Teilnehmer. /// </summary> /// <param name="groupId">Die Id der Gruppe, zu der die Konversation gehört.</param> /// <param name="conversationId">Die Id der Konversation, in der die Nachricht verschickt werden soll.</param> /// <param name="content">Der Inhalt der Nachricht.</param> /// <param name="messagePriority">Die Priorität der Nachricht.</param> /// <returns>Liefert true, wenn die Nachricht angelegt wurde. Liefert false, wenn die Validierung der Nachrichtendaten /// fehlschlägt.</returns> /// <exception cref="ClientException">Wirft ClientException, wenn Request fehlschlägt oder vom Server abgelehnt /// wird, oder die Speicherung der Nachricht fehlschlägt.</exception> public async Task<bool> SendConversationMessageAsync(int groupId, int conversationId, string content, Priority messagePriority) { User localUser = getLocalUser(); // Erstelle zunächst Conversation-Objekt. ConversationMessage message = new ConversationMessage() { Text = content, MessagePriority = messagePriority, AuthorId = localUser.Id }; // Führe Validierung aus. Breche ab bei Validierungsfehler. clearValidationErrors(); message.ClearValidationErrors(); message.ValidateAll(); if (message.HasValidationErrors()) { reportValidationErrors(message.GetValidationErrors()); return false; } // Parse Nachricht zu Json. string jsonContent = base.jsonParser.ParseConversationMessageToJson(message); // Setze Request an den Server ab. string serverResponse = null; try { serverResponse = await groupAPI.SendCreateConversationMessageRequest( localUser.ServerAccessToken, groupId, conversationId, jsonContent); } catch (APIException ex) { Debug.WriteLine("SendConversationMessageAsync: Request to create conversation message failed. " + "Error code: {0}.", ex.ErrorCode); handleGroupRelatedErrors(ex.ErrorCode, groupId, conversationId, null); throw new ClientException(ex.ErrorCode, ex.Message); } // Parse Serverantwort. if (serverResponse != null) { ConversationMessage convMsg = base.jsonParser.ParseConversationMessageFromJson(serverResponse); if (convMsg != null) { int highestMessageNr = GetHighestMessageNumberOfConversation(conversationId); if (highestMessageNr + 1 != convMsg.MessageNumber) { Debug.WriteLine("SendConversationMessageAsync: Seems there are more new messages on the server."); List<ConversationMessage> conversationMessages = await GetConversationMessagesAsync(groupId, conversationId, highestMessageNr, false); // Speichere die Nachrichten ab. StoreConversationMessages(groupId, conversationId, conversationMessages); } else { // Speichere die Nachricht ab. StoreConversationMessage(convMsg); } } else { throw new ClientException(ErrorCodes.JsonParserError, "Failed to parse server response to conversation message."); } } return true; }
/// <summary> /// Speichert die übergebene Konversationsnachricht in den lokalen Datensätzen ab. Dabei wird die /// Nachricht nicht erneut gespeichert, wenn sie lokal schon vorhanden ist. /// </summary> /// <param name="conversationMsg">Die Daten der ConversationMessage, in Form eines ConversationMessage Objekts.</param> /// <returns>Liefert true, wenn Speicherung erfolgreich war. Liefert false, wenn Speicherung aufgrund fehlender /// Referenzen fehlgeschlagen ist (z.B. fehlender Nutzer, der als Autor eingetragen ist).</returns> /// <exception cref="ClientException">Wirft ClientException, wenn Speicherung aufgrund eines unerwarteten /// Fehlers fehlschlägt.</exception> public bool StoreConversationMessage(ConversationMessage conversationMsg) { try { int authorId = conversationMsg.AuthorId; if (!userController.IsUserLocallyStored(authorId)) { Debug.WriteLine("StoreConversationMessage: Cannot store conversation message without author reference."); return false; } if (!groupDBManager.IsConversationStored(conversationMsg.ConversationId)) { Debug.WriteLine("StoreConversationMessage: Cannot store conversation message without conversation reference."); return false; } int highestMessageNr = GetHighestMessageNumberOfConversation(conversationMsg.ConversationId); if (highestMessageNr != conversationMsg.MessageNumber) { groupDBManager.StoreConversationMessage(conversationMsg); } else { Debug.WriteLine("StoreConversationMessage: Conversation message seems to be already stored."); } } catch (DatabaseException ex) { Debug.WriteLine("StoreConversationMessage: Failed to store conversation message."); throw new ClientException(ErrorCodes.LocalDatabaseException, ex.Message); } return true; }
/// <summary> /// Wandle die Konversationsnachricht in ein JSON-Dokument um. /// </summary> /// <param name="message">Das Objekt vom Typ ConversationMessage, das umgewandelt werden soll.</param> /// <returns>Das JSON-Dokument als String, oder null, falls die Umwandlung fehlschlägt.</returns> public string ParseConversationMessageToJson(ConversationMessage message) { string messageJson = null; try { messageJson = JsonConvert.SerializeObject(message); } catch (JsonException jsonEx) { Debug.WriteLine("ParseConversationMessageToJson: Json parser error occurred. " + "Message is {0}.", jsonEx.Message); } return messageJson; }