private static String decodeTextNonStrict()

in geronimo-mail_2.1_spec/src/main/java/jakarta/mail/internet/MimeUtility.java [236:377]


    private static String decodeTextNonStrict(final String text) throws UnsupportedEncodingException {
        int offset = 0;
        final int endOffset = text.length();

        int startWhiteSpace = -1;
        int endWhiteSpace = -1;

        final StringBuffer decodedText = new StringBuffer(text.length());

        boolean previousTokenEncoded = false;

        while (offset < endOffset) {
            char ch = text.charAt(offset);

            // is this a whitespace character?
            if (linearWhiteSpace.indexOf(ch) != -1) {
                startWhiteSpace = offset;
                while (offset < endOffset) {
                    // step over the white space characters.
                    ch = text.charAt(offset);
                    if (linearWhiteSpace.indexOf(ch) != -1) {
                        offset++;
                    }
                    else {
                        // record the location of the first non lwsp and drop down to process the
                        // token characters.
                        endWhiteSpace = offset;
                        break;
                    }
                }
            }
            else {
                // we're at the start of a word token.  We potentially need to break this up into subtokens
                final int wordStart = offset;

                while (offset < endOffset) {
                    // step over the white space characters.
                    ch = text.charAt(offset);
                    if (linearWhiteSpace.indexOf(ch) == -1) {
                        offset++;
                    }
                    else {
                        break;
                    }

                    //NB:  Trailing whitespace on these header strings will just be discarded.
                }
                // pull out the word token.
                final String word = text.substring(wordStart, offset);

                int decodeStart = 0;

                // now scan and process each of the bits within here.
                while (decodeStart < word.length()) {
                    final int tokenStart = word.indexOf("=?", decodeStart);
                    if (tokenStart == -1) {
                        // this is a normal token, so it doesn't matter what the previous token was.  Add the white space
                        // if we have it.
                        if (startWhiteSpace != -1) {
                            decodedText.append(text.substring(startWhiteSpace, endWhiteSpace));
                            startWhiteSpace = -1;
                        }
                        // this is not a decoded token.
                        previousTokenEncoded = false;
                        decodedText.append(word.substring(decodeStart));
                        // we're finished.
                        break;
                    }
                    // we have something to process
                    else {
                        // we might have a normal token preceeding this.
                        if (tokenStart != decodeStart) {
                            // this is a normal token, so it doesn't matter what the previous token was.  Add the white space
                            // if we have it.
                            if (startWhiteSpace != -1) {
                                decodedText.append(text.substring(startWhiteSpace, endWhiteSpace));
                                startWhiteSpace = -1;
                            }
                            // this is not a decoded token.
                            previousTokenEncoded = false;
                            decodedText.append(word.substring(decodeStart, tokenStart));
                        }

                        // now find the end marker.
                        final int tokenEnd = word.indexOf("?=", tokenStart);
                        // sigh, an invalid token.  Treat this as plain text.
                        if (tokenEnd == -1) {
                            // this is a normal token, so it doesn't matter what the previous token was.  Add the white space
                            // if we have it.
                            if (startWhiteSpace != -1) {
                                decodedText.append(text.substring(startWhiteSpace, endWhiteSpace));
                                startWhiteSpace = -1;
                            }
                            // this is not a decoded token.
                            previousTokenEncoded = false;
                            decodedText.append(word.substring(tokenStart));
                            // we're finished.
                            break;
                        }
                        else {
                            // update our ticker
                            decodeStart = tokenEnd + 2;

                            final String token = word.substring(tokenStart, tokenEnd);
                            try {
                                // if this gives a parsing failure, treat it like a non-encoded word.
                                final String decodedWord = decodeWord(token);

                                // are any whitespace characters significant?  Append 'em if we've got 'em.
                                if (!previousTokenEncoded) {
                                    if (startWhiteSpace != -1) {
                                        decodedText.append(text.substring(startWhiteSpace, endWhiteSpace));
                                        startWhiteSpace = -1;
                                    }
                                }
                                // this is definitely a decoded token.
                                previousTokenEncoded = true;
                                // and add this to the text.
                                decodedText.append(decodedWord);
                                // we continue parsing from here...we allow parsing errors to fall through
                                // and get handled as normal text.
                                continue;

                            } catch (final ParseException e) {
                            }
                            // this is a normal token, so it doesn't matter what the previous token was.  Add the white space
                            // if we have it.
                            if (startWhiteSpace != -1) {
                                decodedText.append(text.substring(startWhiteSpace, endWhiteSpace));
                                startWhiteSpace = -1;
                            }
                            // this is not a decoded token.
                            previousTokenEncoded = false;
                            decodedText.append(token);
                        }
                    }
                }
            }
        }

        return decodedText.toString();
    }