/// <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;
        }