public void LogResponseVerbose(MPDResponseLine response) { if (m_Verbose) { Write("R: " + response.ToString()); } }
private bool ParseBanner() { MPDResponseLine banner = GetResponseLine(); if (banner == null) { m_Parent.OnErrorMessageChanged("The server banner is not valid; check settings."); return(false); } else if (banner.Key == MPDResponseLine.Keyword.OK && banner.Value.StartsWith("MPD")) { return(true); } else { m_Parent.OnErrorMessageChanged("Error from server: " + banner.Literal); return(false); } }
private void SplitBufferIntoLines() { int pos = 0; int firstDanglingByte = 0; int lineStartPosition = 0; while (pos < m_BytesInBuffer) { firstDanglingByte = pos; byte firstByte = m_ReceiveBuffer[pos]; if (firstByte == (byte)'\n') { // Complete line available, chop it off. MPDResponseLine line = new MPDResponseLine(m_CharsLeftFromLastBuffer + m_UTF8.GetString(m_ReceiveBuffer, lineStartPosition, pos - lineStartPosition)); m_ResponseLines.Enqueue(line); m_CharsLeftFromLastBuffer = ""; pos += 1; lineStartPosition = pos; } else if (firstByte < 0x80) // Single byte character. { pos += 1; } else if (firstByte < 0xDF) // First in a 2-byte character. { pos += 2; } else if (firstByte < 0xF0) // First in a 3-byte character. { pos += 3; } else // First in a 4-byte character. { pos += 4; } } if (pos == m_BytesInBuffer) { // Only complete UTF-8 characters in the buffer -- good! if (pos > lineStartPosition) { m_CharsLeftFromLastBuffer = m_CharsLeftFromLastBuffer + m_UTF8.GetString(m_ReceiveBuffer, lineStartPosition, m_BytesInBuffer - lineStartPosition); } m_BytesInBuffer = 0; m_ReceiveBufferPosition = 0; } else { // There are dangling bytes -- we need to keep them in // the buffer so they can be completed to a full character // on the next round. m_CharsLeftFromLastBuffer = m_CharsLeftFromLastBuffer + m_UTF8.GetString(m_ReceiveBuffer, lineStartPosition, m_BytesInBuffer - firstDanglingByte); for (int i = firstDanglingByte; i < m_BytesInBuffer; ++i) { m_ReceiveBuffer[i - firstDanglingByte] = m_ReceiveBuffer[i]; } m_BytesInBuffer -= firstDanglingByte; m_ReceiveBufferPosition = m_BytesInBuffer; } }
private void ReceiveResponse(MPDSendable sendable) { // TODO: if the server is really slow (Mopidy on an RPI for // example), we can get stuck here during shutdown. MPDResponseLine statusLine = GetResponseLine(); while (statusLine != null && !statusLine.IsStatus) { m_DataModel.NetworkLog?.LogResponseVerbose(statusLine); if (statusLine.Key != MPDResponseLine.Keyword.Unknown) { m_CurrentResponse.Add(statusLine); } statusLine = GetResponseLine(); } if (statusLine != null) { m_DataModel.NetworkLog?.LogResponseCompact(statusLine); if (statusLine.Key == MPDResponseLine.Keyword.ACK) { m_Parent.OnErrorMessageChanged(statusLine.Value); } else if (sendable is MPDCommand) { MPDCommand command = sendable as MPDCommand; if (command.Op == "currentsong") { ParseSongList(); Callback(m_DataModel.CurrentSong.OnCurrentSongResponseReceived); m_CurrentSongList.Clear(); } else if (command.Op == "listallinfo") { ParseSongList(); Callback(m_DataModel.Database.OnListAllInfoResponseReceived); m_CurrentSongList.Clear(); } else if (command.Op == "listplaylistinfo") { ParseSongList(); Callback(m_DataModel.SavedPlaylists.OnListPlaylistInfoResponseReceived, command.Argument1); m_CurrentSongList.Clear(); } else if (command.Op == "lsinfo") { Callback(m_DataModel.SavedPlaylists.OnLsInfoResponseReceived); } else if (command.Op == "outputs") { Callback(m_DataModel.OutputCollection.OnOutputsResponseReceived); } else if (command.Op == "playlistinfo") { ParseSongList(); Callback(m_DataModel.Playlist.OnPlaylistInfoResponseReceived); m_CurrentSongList.Clear(); } else if (command.Op == "search") { ParseSongList(); Callback(m_DataModel.AdvancedSearch.OnSearchResponseReceived); m_CurrentSongList.Clear(); } else if (command.Op == "stats") { Callback(m_DataModel.ServerStatus.OnStatsResponseReceived); } else if (command.Op == "status") { Callback(m_DataModel.ServerStatus.OnStatusResponseReceived); } } } m_CurrentResponse.Clear(); }
private void ReceiveResponse(MPDCommand command) { MPDResponseLine statusLine = GetResponseLine(); while (statusLine != null && !statusLine.IsStatus) { if (statusLine.Key != MPDResponseLine.Keyword.Unknown) { m_CurrentResponse.Add(statusLine); } statusLine = GetResponseLine(); } if (statusLine != null) { if (statusLine.Key == MPDResponseLine.Keyword.ACK) { if (command.Op == "listallinfo" && statusLine.Value.Contains("Not implemented")) { // TODO: this is a workaround for Mopidy not implementing listallinfo. // It can hopefully removed later. Send(new MPDCommand()); } else { m_Parent.OnErrorMessageChanged(statusLine.Value); } } else { if (command.Op == "currentsong") { ParseSongList(); Callback(m_DataModel.CurrentSong.OnCurrentSongResponseReceived); m_CurrentSongList.Clear(); } // TODO: remove the latter when Mopidy starts properly supporting the former. else if (command.Op == "listallinfo" || command.Op == "mopidylistallinfokludge") { ParseSongList(); Callback(m_DataModel.Database.OnListAllInfoResponseReceived); m_CurrentSongList.Clear(); } else if (command.Op == "listplaylistinfo") { ParseSongList(); Callback(m_DataModel.SavedPlaylists.OnListPlaylistInfoResponseReceived, command.Argument1); m_CurrentSongList.Clear(); } else if (command.Op == "lsinfo") { Callback(m_DataModel.SavedPlaylists.OnLsInfoResponseReceived); } else if (command.Op == "outputs") { Callback(m_DataModel.OutputCollection.OnOutputsResponseReceived); } else if (command.Op == "playlistinfo") { ParseSongList(); Callback(m_DataModel.Playlist.OnPlaylistInfoResponseReceived); m_CurrentSongList.Clear(); } else if (command.Op == "search") { ParseSongList(); Callback(m_DataModel.AdvancedSearch.OnSearchResponseReceived); m_CurrentSongList.Clear(); } else if (command.Op == "stats") { Callback(m_DataModel.ServerStatus.OnStatsResponseReceived); } else if (command.Op == "status") { Callback(m_DataModel.ServerStatus.OnStatusResponseReceived); } } } m_CurrentResponse.Clear(); }
private void SplitBufferIntoLines() { int pos = 0; int firstDanglingByte = 0; int lineStartPosition = 0; while (pos < m_BytesInBuffer) { firstDanglingByte = pos; byte firstByte = m_ReceiveBuffer[pos]; if (firstByte == (byte)'\n') { // Complete line available, chop it off. MPDResponseLine line = new MPDResponseLine(m_CharsLeftFromLastBuffer + m_UTF8.GetString(m_ReceiveBuffer, lineStartPosition, pos - lineStartPosition)); m_ResponseLines.Enqueue(line); m_CharsLeftFromLastBuffer = ""; pos += 1; lineStartPosition = pos; } else if (firstByte < 0x80) // Single byte character. { pos += 1; } else if (firstByte < 0xDF) // First in a 2-byte character. { pos += 2; } else if (firstByte < 0xF0) // First in a 3-byte character. { pos += 3; } else { pos += 4; } } if (pos == m_BytesInBuffer) { // Only complete UTF-8 characters in the buffer -- good! if (pos > lineStartPosition) { m_CharsLeftFromLastBuffer = m_UTF8.GetString(m_ReceiveBuffer, lineStartPosition, pos - lineStartPosition); } m_BytesInBuffer = 0; m_ReceiveBufferPosition = 0; } else { // There are dangling bytes -- we need to keep them in the // buffer so they can be completed by the next read. m_CharsLeftFromLastBuffer = m_UTF8.GetString(m_ReceiveBuffer, lineStartPosition, pos - firstDanglingByte); for (int i = firstDanglingByte; i < m_BytesInBuffer; ++i) { m_ReceiveBuffer[i - firstDanglingByte] = m_ReceiveBuffer[i]; } m_BytesInBuffer -= firstDanglingByte; m_ReceiveBufferPosition = m_BytesInBuffer; } }
public void LogResponseCompact(MPDResponseLine response) { Write("R: " + response.ToString()); }