package org.netbeans.lib.cvsclient.progress.receiving;

import org.netbeans.lib.cvsclient.command.CommandUtils;
import org.netbeans.lib.cvsclient.command.ICvsFiles;
import org.netbeans.lib.cvsclient.command.IFileInfo;
import org.netbeans.lib.cvsclient.event.ICvsListener;
import org.netbeans.lib.cvsclient.event.ICvsListenerRegistry;
import org.netbeans.lib.cvsclient.event.IFileInfoListener;
import org.netbeans.lib.cvsclient.event.IMessageListener;
import org.netbeans.lib.cvsclient.file.FileUtils;
import org.netbeans.lib.cvsclient.progress.IProgressViewer;
import org.netbeans.lib.cvsclient.util.BugLog;

/**
 * @author Thomas Singer
 */
public final class FileInfoAndMessageResponseProgressHandler extends AbstractResponseProgressHandler
        implements ICvsListener, IMessageListener, IFileInfoListener {

	// Fields =================================================================

	private final String examinePattern;

	// Setup ==================================================================

	public FileInfoAndMessageResponseProgressHandler(IProgressViewer progressViewer, ICvsFiles cvsFiles, String examinePattern) {
		super(progressViewer, cvsFiles);

		BugLog.getInstance().assertNotNull(examinePattern);

		this.examinePattern = examinePattern;
	}

	// Implemented ============================================================

	public void registerListeners(ICvsListenerRegistry listenerRegistry) {
		listenerRegistry.addMessageListener(this);
		listenerRegistry.addFileInfoListener(this);
	}

	public void unregisterListeners(ICvsListenerRegistry listenerRegistry) {
		listenerRegistry.removeMessageListener(this);
		listenerRegistry.removeFileInfoListener(this);
	}

	public void messageSent(String message, final byte[] byteMessage, boolean error, boolean tagged) {
		if (!error || tagged) {
			return;
		}

		final String directoryPath = CommandUtils.getExaminedDirectory(message, examinePattern);
		if (directoryPath == null) {
			return;
		}

		if (directoryPath.equals(".")) {
			directoryProcessed("/");
		}
		else {
			directoryProcessed(FileUtils.ensureLeadingSlash(directoryPath));
		}
	}

	public void fileInfoGenerated(Object info) {
		if (info instanceof IFileInfo) {
			final IFileInfo fileInfo = (IFileInfo)info;
			fileProcessed(fileInfo.getFileObject());
		}
	}

        public void binaryMessageSent(final byte[] bytes) {
        }
}
