blob: 9721ab86b12abc244b0ff68d091b600ea3916041 [file] [log] [blame]
// $Id$
//
// 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.
//
using System;
using System.Net.Sockets;
using Org.Apache.Etch.Bindings.Csharp.Msg;
using Org.Apache.Etch.Bindings.Csharp.Support;
using Org.Apache.Etch.Bindings.Csharp.Util;
using TcpListener=Org.Apache.Etch.Bindings.Csharp.Util.TcpListener;
namespace Org.Apache.Etch.Bindings.Csharp.Transport
{
/// <summary>
/// TransportFactory for tcp connections and listeners.
/// </summary>
public class TcpTransportFactory : TransportFactory
{
/// <summary>
/// Constructs a TcpTransportFactory which delivers TcpConnection or a
/// TlsConnection depending upon the isSecure parameter.
/// </summary>
/// <param name="isSecure">true if TlsConnection is desired, false otherwise</param>
public TcpTransportFactory(bool isSecure)
{
this.isSecure = isSecure;
}
private readonly bool isSecure;
private const String SOCKET = "TcpTransportFactory.socket";
protected override TransportMessage NewTransport(string uri, Resources resources)
{
URL u = new URL(uri);
Object socket = resources.Get(SOCKET);
TransportData c;
if (isSecure)
c = new TlsConnection((Socket)socket, u, resources);
else
c = new TcpConnection((Socket)socket, u, resources);
TransportPacket p = new Packetizer(c, u, resources);
TransportMessage m = new Messagizer(p, u, resources);
m = AddFilters(m, u, resources);
//MailboxManager r = new PlainMailboxManager(m, u, resources);
//DeliveryService d = new DefaultDeliveryService(r, u, resources);
ValueFactory vf = (ValueFactory) resources.Get(TransportConsts.VALUE_FACTORY);
vf.LockDynamicTypes();
return m;
}
protected override Transport<ServerFactory> NewListener( string uri, Resources resources )
{
Transport<SessionListener<Socket>> l = new TcpListener(uri, resources);
return new MySessionListener(this, l, uri, resources);
}
public class MySessionListener : Transport<ServerFactory>, SessionListener<Socket>
{
public MySessionListener(TcpTransportFactory ttf, Transport<SessionListener<Socket>> transport,
String uri, Resources resources )
{
this.ttf = ttf;
this.transport = transport;
this.uri = uri;
this.resources = resources;
transport.SetSession(this);
}
private readonly TcpTransportFactory ttf;
private readonly Transport<SessionListener<Socket>> transport;
private readonly string uri;
private readonly Resources resources;
public override string ToString()
{
return "TcpTransportFactory.MySessionListener/" + transport;
}
public void SessionAccepted(Socket socket)
{
Resources r = new Resources(resources);
r.Add(SOCKET, socket);
ValueFactory vf = session.NewValueFactory(uri);
r.Add(TransportConsts.VALUE_FACTORY, vf);
TransportMessage t = ttf.NewTransport(uri, r);
session.NewServer(t, uri, r);
}
#region Transport<ServerFactory> Members
public object TransportQuery(object query)
{
return transport.TransportQuery(query);
}
public void TransportControl(object control, object value)
{
transport.TransportControl(control, value);
}
public void TransportNotify(object eventObj)
{
transport.TransportNotify(eventObj);
}
public ServerFactory GetSession()
{
return session;
}
public void SetSession(ServerFactory session)
{
this.session = session;
}
private ServerFactory session;
#endregion
#region Session Members
public object SessionQuery(object query)
{
return session.SessionQuery(query);
}
public void SessionControl(object control, object value)
{
session.SessionControl(control, value);
}
public void SessionNotify(object eventObj)
{
session.SessionNotify(eventObj);
}
#endregion
}
}
}