/* * 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.Collections.Generic; using System.IO; using System.Text; using System.Threading; using org.apache.qpid.transport; using org.apache.qpid.transport.util; namespace org.apache.qpid.client { internal class ClientConnectionDelegate : ClientDelegate { private static readonly Logger log = Logger.Get(typeof (ClientConnectionDelegate)); private readonly Client _client; private string _username; private string _password; // PLAIN SASL mechanism by default private string _mechanism = "PLAIN"; private Exception _exception; public ClientConnectionDelegate(Client client, string username, string pasword) { _client = client; _username = username; _password = pasword; } public ClientConnectionDelegate(Client client, string username, string pasword, string mechanism) : this(client, username, pasword) { _mechanism = mechanism; } public Exception Exception { get { return _exception; } } public override SessionDelegate GetSessionDelegate() { return new ClientSessionDelegate(); } public override void RaiseException(Exception exception) { _exception = exception; if (_negotiationComplete != null) _negotiationComplete.Set(); else _client.RaiseException(exception); } public override void ConnectionStart(Channel context, ConnectionStart mystruct) { MemoryStream stResponse = new MemoryStream(); // do not send username and password for EXTERNAL mechanism, // because they are inside a certificate file if (_mechanism != "EXTERNAL") { byte[] part = Encoding.UTF8.GetBytes(_username); stResponse.WriteByte(0); stResponse.Write(part, 0, part.Length); stResponse.WriteByte(0); part = Encoding.UTF8.GetBytes(_password); stResponse.Write(part, 0, part.Length); } Dictionary props = new Dictionary(); context.ConnectionStartOk(props, _mechanism, stResponse.ToArray(), "utf8"); } public override void ConnectionOpenOk(Channel context, ConnectionOpenOk mstruct) { base.ConnectionOpenOk(context, mstruct); _client.ConnectionOpenOk(context, mstruct); } public override void Closed() { log.Debug("Delegate Closed"); lock (_client.CloseOk) { try { _client.IsClosed = true; Monitor.PulseAll(_client.CloseOk); } catch (Exception e) { throw new SystemException("Error when closing client", e); } } } public override void ConnectionClose(Channel context, ConnectionClose connectionClose) { base.ConnectionClose(context, connectionClose); ErrorCode errorCode = ErrorCode.GetErrorCode((int) connectionClose.GetReplyCode()); if(_client.ClosedListener != null) _client.ClosedListener.OnClosed(errorCode, connectionClose.GetReplyText(), null); if (errorCode.Code != (int)QpidErrorCode.NO_ERROR) throw new Exception ("Server Closed the connection: Reason " + connectionClose.GetReplyText()); } } }