/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.fileupload2;

import java.io.IOException;
import java.util.List;

import org.apache.commons.fileupload2.impl.FileSizeLimitExceededException;
import org.apache.commons.fileupload2.impl.SizeLimitExceededException;

/**
 * An iterator, as returned by
 * {@link FileUploadBase#getItemIterator(RequestContext)}.
 */
public interface FileItemIterator {
	/** Returns the maximum size of a single file. An {@link FileSizeLimitExceededException}
	 * will be thrown, if there is an uploaded file, which is exceeding this value.
	 * By default, this value will be copied from the {@link FileUploadBase#getFileSizeMax()
	 * FileUploadBase} object, however, the user may replace the default value with a
	 * request specific value by invoking {@link #setFileSizeMax(long)} on this object.
	 * @return The maximum size of a single, uploaded file. The value -1 indicates "unlimited".
	 */
	public long getFileSizeMax();

	/** Sets the maximum size of a single file. An {@link FileSizeLimitExceededException}
	 * will be thrown, if there is an uploaded file, which is exceeding this value.
	 * By default, this value will be copied from the {@link FileUploadBase#getFileSizeMax()
	 * FileUploadBase} object, however, the user may replace the default value with a
	 * request specific value by invoking {@link #setFileSizeMax(long)} on this object, so
	 * there is no need to configure it here.
	 * <em>Note:</em>Changing this value doesn't affect files, that have already been uploaded.
	 * @param pFileSizeMax The maximum size of a single, uploaded file. The value -1 indicates "unlimited".
	 */
	public void setFileSizeMax(long pFileSizeMax);

	/** Returns the maximum size of the complete HTTP request. A {@link SizeLimitExceededException}
	 * will be thrown, if the HTTP request will exceed this value.
	 * By default, this value will be copied from the {@link FileUploadBase#getSizeMax()
	 * FileUploadBase} object, however, the user may replace the default value with a
	 * request specific value by invoking {@link #setSizeMax(long)} on this object.
	 * @return The maximum size of the complete HTTP requqest. The value -1 indicates "unlimited".
	 */
	public long getSizeMax();

	/** Returns the maximum size of the complete HTTP request. A {@link SizeLimitExceededException}
	 * will be thrown, if the HTTP request will exceed this value.
	 * By default, this value will be copied from the {@link FileUploadBase#getSizeMax()
	 * FileUploadBase} object, however, the user may replace the default value with a
	 * request specific value by invoking {@link #setSizeMax(long)} on this object.
	 * <em>Note:</em> Setting the maximum size on this object will work only, if the iterator is not
	 * yet initialized. In other words: If the methods {@link #hasNext()}, {@link #next()} have not
	 * yet been invoked.
	 * @param pSizeMax The maximum size of the complete HTTP request. The value -1 indicates "unlimited".
	 */
	public void setSizeMax(long pSizeMax);

    /**
     * Returns, whether another instance of {@link FileItemStream}
     * is available.
     *
     * @throws FileUploadException Parsing or processing the
     *   file item failed.
     * @throws IOException Reading the file item failed.
     * @return True, if one or more additional file items
     *   are available, otherwise false.
     */
    public boolean hasNext() throws FileUploadException, IOException;

    /**
     * Returns the next available {@link FileItemStream}.
     *
     * @throws java.util.NoSuchElementException No more items are available. Use
     * {@link #hasNext()} to prevent this exception.
     * @throws FileUploadException Parsing or processing the
     *   file item failed.
     * @throws IOException Reading the file item failed.
     * @return FileItemStream instance, which provides
     *   access to the next file item.
     */
    public FileItemStream next() throws FileUploadException, IOException;

    public List<FileItem> getFileItems() throws FileUploadException, IOException;
}
