/*
* JCaptcha, the open source java framework for captcha definition and integration
* Copyright (c) 2007 jcaptcha.net. All Rights Reserved.
* See the LICENSE.txt file distributed with this package.
*/
package com.octo.captcha.sound;
import com.octo.captcha.Captcha;
import com.octo.captcha.CaptchaException;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
/**
* <p/>
* Description: String question about a Line challenge, this class is abstract. </p>
*
* @author <a href="mailto:mga@octo.com">Mathieu Gandin </a>
* @author Benoit Doumas
* @author Richard Hull
* @version 1.1
*/
public abstract class SoundCaptcha implements Captcha {
protected Boolean hasChallengeBeenCalled = Boolean.FALSE;
protected String question;
protected byte[] challenge;
protected SoundCaptcha(String thequestion, AudioInputStream thechallenge) {
this.question = thequestion;
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
AudioSystem.write(thechallenge, AudioFileFormat.Type.WAVE, out);
this.challenge = out.toByteArray();
} catch (IOException ioe) {
throw new CaptchaException("unable to serialize input stream", ioe);
}
}
/**
* Accessor to the question.
*/
public final String getQuestion() {
return this.question;
}
/**
* Accessor to the challenge.
*/
public final Object getChallenge() {
return this.getSoundChallenge();
}
/**
* Accessor to the sound challenge. Create a new stream each time the method is called.
*
* @return an AudioInputStream
*/
public final AudioInputStream getSoundChallenge() {
try {
AudioInputStream audioStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(this.challenge));
hasChallengeBeenCalled = Boolean.TRUE;
return audioStream;
} catch (UnsupportedAudioFileException e) {
throw new CaptchaException("unable to deserialize input stream", e);
} catch (IOException e) {
throw new CaptchaException("unable to deserialize input stream", e);
}
}
/*
* public Boolean validateResponse(Object response) { return null; }
*/
/**
* this method is to clean the challenge.
*/
public void disposeChallenge() {
this.challenge = null;
}
public Boolean hasGetChalengeBeenCalled() {
return hasChallengeBeenCalled;
}
}