/*
* Copyright 2010 david varnes.
*
* Licensed 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.freeswitch.esl.client.inbound;
import org.freeswitch.esl.client.internal.AbstractEslClientHandler;
import org.freeswitch.esl.client.internal.IEslProtocolListener;
import org.freeswitch.esl.client.transport.CommandResponse;
import org.freeswitch.esl.client.transport.event.EslEvent;
import org.freeswitch.esl.client.transport.message.EslHeaders.Value;
import org.freeswitch.esl.client.transport.message.EslMessage;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.execution.ExecutionHandler;
/**
* End users of the inbound {@link Client} should not need to use this class.
* <p>
* Specialised {@link AbstractEslClientHandler} that implements the connection logic for an
* 'Inbound' FreeSWITCH Event Socket connection. The responsibilities for this class are:
* <ul><li>
* To handle the auth request that the FreeSWITCH server will send immediately following a new
* connection when mode is Inbound.
* <li>
* To signal the observing {@link IEslProtocolListener} (expected to be the Inbound client
* implementation) when ESL events are received.
* </ul>
* Note: implementation requirement is that an {@link ExecutionHandler} is placed in the processing
* pipeline prior to this handler. This will ensure that each incoming message is processed in its
* own thread (although still guaranteed to be processed in the order of receipt).
*
* @author david varnes
*/
public class InboundClientHandler extends AbstractEslClientHandler
{
private final String password;
private final IEslProtocolListener listener;
public InboundClientHandler( String password, IEslProtocolListener listener )
{
this.password = password;
this.listener = listener;
}
protected void handleEslEvent( ChannelHandlerContext ctx, EslEvent event )
{
log.debug( "Received event: [{}]", event );
listener.eventReceived( event );
}
protected void handleAuthRequest( ChannelHandlerContext ctx )
{
log.debug( "Auth requested, sending [auth {}]", "*****" );
EslMessage response = sendSyncSingleLineCommand( ctx.getChannel(), "auth " + password );
log.debug( "Auth response [{}]", response );
if ( response.getContentType().equals( Value.COMMAND_REPLY ) )
{
CommandResponse commandResponse = new CommandResponse( "auth " + password, response );
listener.authResponseReceived( commandResponse );
}
else
{
log.error( "Bad auth response message [{}]", response );
throw new IllegalStateException( "Incorrect auth response" );
}
}
@Override
protected void handleDisconnectionNotice()
{
log.debug( "Received disconnection notice" );
listener.disconnected();
}
}