Beispiel #1
0
 public void LogResponseVerbose(MPDResponseLine response)
 {
     if (m_Verbose)
     {
         Write("R: " + response.ToString());
     }
 }
Beispiel #2
0
        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();
        }
Beispiel #5
0
        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();
        }
Beispiel #6
0
        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;
            }
        }
Beispiel #7
0
 public void LogResponseCompact(MPDResponseLine response)
 {
     Write("R: " + response.ToString());
 }