* Implementing first of the 0.6 IClientAPI Changes

* Introducing IClientCore - this will be the key replacement for IClientAPI in the long run, it has a very minimal set of methods designed to allow you to access specialist API's.
* See https://lists.berlios.de/pipermail/opensim-dev/2008-September/003049.html for the early discussion on this.
0.6.1-post-fixes
Adam Frisby 2008-11-08 16:09:15 +00:00
parent 5c0fd512e8
commit 6d5248441d
3 changed files with 47 additions and 98 deletions

View File

@ -0,0 +1,8 @@
namespace OpenSim.Framework.Client
{
public interface IClientCore
{
bool TryGet<T>(out T iface);
T Get<T>();
}
}

View File

@ -1,86 +0,0 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
namespace OpenSim.Framework
{
#region Args Classes
public class ICA2_ConnectionArgs : EventArgs
{
}
public class ICA2_DisconnectionArgs : EventArgs
{
public bool Forced;
// Static Constructor
// Allows us to recycle these classes later more easily from a pool.
public static ICA2_DisconnectionArgs Create(bool forced)
{
ICA2_DisconnectionArgs tmp = new ICA2_DisconnectionArgs();
tmp.Forced = forced;
return tmp;
}
}
public class ICA2_PingArgs : EventArgs
{
}
public class ICA2_AvatarAppearanceArgs : EventArgs
{
}
public class ICA2_TerraformArgs : EventArgs
{
public double XMin;
public double XMax;
public double YMin;
public double YMax;
public Guid Action;
public double Strength; // 0 .. 1
public double Radius;
}
#endregion
public delegate void ICA2_OnTerraformDelegate(IClientAPI2 sender, ICA2_TerraformArgs e);
public interface IClientAPI2
{
// Connect / Disconnect
void Connect(ICA2_ConnectionArgs e);
void Disconnect(ICA2_DisconnectionArgs e);
void Ping(ICA2_PingArgs e);
void SendAvatarAppearance(ICA2_AvatarAppearanceArgs e);
event ICA2_OnTerraformDelegate OnTerraform;
}
}

View File

@ -37,6 +37,7 @@ using OpenMetaverse;
using OpenMetaverse.Packets;
using log4net;
using OpenSim.Framework;
using OpenSim.Framework.Client;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Statistics;
using OpenSim.Region.Interfaces;
@ -51,34 +52,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Handles new client connections
/// Constructor takes a single Packet and authenticates everything
/// </summary>
public class LLClientView : IClientAPI
public class LLClientView : IClientAPI, IClientCore
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// ~ClientView()
// {
// m_log.Info("[CLIENT]: LLClientView destructor called");
// }
/* static variables */
public static SynchronizeClientHandler SynchronizeClient;
/* private variables */
private readonly UUID m_sessionId;
private readonly UUID m_secureSessionId = UUID.Zero;
//private AgentAssetUpload UploadAssets;
private int m_debugPacketLevel;
private readonly AssetCache m_assetCache;
// private InventoryCache m_inventoryCache;
private int m_cachedTextureSerial;
private Timer m_clientPingTimer;
private bool m_clientBlocked;
private int m_probesWithNoIngressPackets;
//private int m_lastPacketsReceived = 0;
//private byte[] ZeroOutBuffer = new byte[4096];
private readonly UUID m_agentId;
private readonly uint m_circuitCode;
@ -553,7 +545,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_PacketHandler.Clear();
m_clientPingTimer = new Timer(5000);
m_clientPingTimer.Elapsed += new ElapsedEventHandler(CheckClientConnectivity);
m_clientPingTimer.Elapsed += CheckClientConnectivity;
m_clientPingTimer.Enabled = true;
}
@ -608,7 +600,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected virtual bool ProcessPacketMethod(Packet packet)
{
bool result = false;
bool found = false;
bool found;
PacketMethod method;
if (m_packetHandlers.TryGetValue(packet.Type, out method))
{
@ -7676,5 +7668,40 @@ namespace OpenSim.Region.ClientStack.LindenUDP
KillPacket kp = new KillPacket();
OutPacket(kp, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
}
#region IClientCore
private readonly Dictionary<Type, object> m_clientInterfaces = new Dictionary<Type, object>();
/// <summary>
/// Register an interface on this client, should only be called in the constructor.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="iface"></param>
protected void RegisterInterface<T>(T iface)
{
lock(m_clientInterfaces)
{
m_clientInterfaces.Add(typeof(T), iface);
}
}
public bool TryGet<T>(out T iface)
{
if (m_clientInterfaces.ContainsKey(typeof(T)))
{
iface = (T)m_clientInterfaces[typeof(T)];
return true;
}
iface = default(T);
return false;
}
public T Get<T>()
{
return (T)m_clientInterfaces[typeof(T)];
}
#endregion
}
}