/*
 *  Copyright (c) 2011-2015 The original author or authors
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *       The Eclipse Public License is available at
 *       http://www.eclipse.org/legal/epl-v10.html
 *
 *       The Apache License v2.0 is available at
 *       http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.ext.mail.impl;

import io.vertx.core.Handler;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.logging.Logger;
import io.vertx.core.logging.LoggerFactory;
import io.vertx.core.parsetools.RecordParser;

import java.util.regex.Pattern;

Author:Alexander Lehmann
/** * @author <a href="http://oss.lehmann.cx/">Alexander Lehmann</a> */
class MultilineParser implements Handler<Buffer> { private static final Pattern STATUS_LINE_CONTINUE = Pattern.compile("^\\d{3}-.*"); private static final Logger log = LoggerFactory.getLogger(MultilineParser.class); private boolean initialized = false; private Buffer result; private RecordParser rp; public MultilineParser(Handler<Buffer> output) { Handler<Buffer> mlp = new Handler<Buffer>() { @Override public void handle(final Buffer buffer) { if (!initialized) { initialized = true; // process the first line to determine CRLF mode final String line = buffer.toString(); if (line.endsWith("\r")) { log.debug("setting crlf line mode"); rp.delimitedMode("\r\n"); appendOrHandle(Buffer.buffer(line.substring(0, line.length() - 1))); } else { appendOrHandle(buffer); } } else { appendOrHandle(buffer); } } private void appendOrHandle(final Buffer buffer) { if (result == null) { result = buffer; } else { result.appendString("\n"); result.appendBuffer(buffer); } if (isFinalLine(buffer)) { output.handle(result); result = null; } } private boolean isFinalLine(final Buffer buffer) { String line = buffer.toString(); return !STATUS_LINE_CONTINUE.matcher(line).matches(); } }; rp = RecordParser.newDelimited("\n", mlp); } @Override public void handle(final Buffer event) { rp.handle(event); } }