code: public static Buffer consumeDisplayName(final Buffer buffer) throws IOException, SipParseException {
          if (isNext(buffer, DQUOT)) {
              return consumeQuotedString(buffer);
          }
  
          final int count = getTokenCount(buffer);
          if (count == 0) {
              return Buffers.EMPTY_BUFFER;
          }
  
          // now, if the next thing after the count is a ':' then
          // we mistook the scheme for a token so bail out.
          buffer.markReaderIndex();
          final Buffer potentialDisplayName = buffer.readBytes(count);
          if (isNext(buffer, COLON)) {
              buffer.resetReaderIndex();
              return Buffers.EMPTY_BUFFER;
          }
  
          // all good...
          return potentialDisplayName;
      }
docs: The display name in SIP is a little tricky since it may or may not be
  there and the stuff following it (whether or not it was there to begin
  with) can easily be confused with being a display name.
  
  Note, a display name in SIP is only part of of the "name-addr" construct
  and this function assumes that (even though it actually would work like a
  regular {@link #consumeToken(Buffer)} in some cases)
  
  <pre>
  name-addr      =  [ display-name ] LAQUOT addr-spec RAQUOT
  display-name   =  *(token LWS)/ quoted-string
  </pre>
  
  @param buffer
  @return the display name or null if there was none
  @throws IOException
  @throws SipParseException