From 9ed0a8dbad121b64ca8baca78f28ca58602c47ca Mon Sep 17 00:00:00 2001
From: MW
Date: Wed, 25 Apr 2007 18:12:06 +0000
Subject: updated to use lastest version of libsl but is currently broke when
using SL viewer 1.15.02, due to big changes in the message templates.
---
.../OpenGridServices.GridServer.csproj | 6 +
.../OpenGridServices.GridServer.exe.build | 1 +
.../OpenGridServices.UserServer.csproj | 6 +
.../OpenGridServices.UserServer.exe.build | 1 +
OpenSim.Framework/AgentInventory.cs | 5 +-
OpenSim.Framework/OpenSim.Framework.csproj | 6 +
OpenSim.Framework/OpenSim.Framework.dll.build | 1 +
OpenSim.Framework/Util.cs | 89 ++++++++
.../Remote/OpenSim.GridInterfaces.Remote.csproj | 6 +
.../Remote/OpenSim.GridInterfaces.Remote.dll.build | 1 +
.../BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 16 +-
OpenSim.RegionServer/AgentAssetUpload.cs | 4 +-
OpenSim.RegionServer/OpenSim.RegionServer.csproj | 6 +
.../OpenSim.RegionServer.dll.build | 1 +
OpenSim.RegionServer/OpenSimMain.cs | 4 +-
OpenSim.RegionServer/RegionInfo.cs | 2 +
OpenSim.RegionServer/SimClient.cs | 8 +-
OpenSim.RegionServer/world/Avatar.cs | 27 ++-
OpenSim.RegionServer/world/Primitive2.cs | 2 +-
OpenSim.RegionServer/world/World.cs | 2 +-
OpenSim.RegionServer/world/WorldPacketHandlers.cs | 31 ++-
OpenSim.Servers/OpenSim.Servers.csproj | 6 +
OpenSim.Servers/OpenSim.Servers.dll.build | 1 +
OpenSim.build | 15 +-
OpenSim.sln | 250 ++++++++++++--------
XmlRpcCS/Logger.cs | 46 ++++
XmlRpcCS/SimpleHttpRequest.cs | 204 +++++++++++++++++
XmlRpcCS/XMLRPC.csproj | 138 +++++++++++
XmlRpcCS/XMLRPC.dll.build | 58 +++++
XmlRpcCS/XmlRpcBoxcarRequest.cs | 51 +++++
XmlRpcCS/XmlRpcClientProxy.cs | 61 +++++
XmlRpcCS/XmlRpcDeserializer.cs | 195 ++++++++++++++++
XmlRpcCS/XmlRpcErrorCodes.cs | 51 +++++
XmlRpcCS/XmlRpcException.cs | 39 ++++
XmlRpcCS/XmlRpcExposedAttribute.cs | 60 +++++
XmlRpcCS/XmlRpcRequest.cs | 150 ++++++++++++
XmlRpcCS/XmlRpcRequestDeserializer.cs | 64 ++++++
XmlRpcCS/XmlRpcRequestSerializer.cs | 51 +++++
XmlRpcCS/XmlRpcResponder.cs | 98 ++++++++
XmlRpcCS/XmlRpcResponse.cs | 85 +++++++
XmlRpcCS/XmlRpcResponseDeserializer.cs | 65 ++++++
XmlRpcCS/XmlRpcResponseSerializer.cs | 57 +++++
XmlRpcCS/XmlRpcSerializer.cs | 109 +++++++++
XmlRpcCS/XmlRpcServer.cs | 239 +++++++++++++++++++
XmlRpcCS/XmlRpcSystemObject.cs | 252 +++++++++++++++++++++
XmlRpcCS/XmlRpcXmlTokens.cs | 76 +++++++
bin/libsecondlife.dll | Bin 2338816 -> 2134016 bytes
prebuild.xml | 28 +++
48 files changed, 2539 insertions(+), 135 deletions(-)
create mode 100644 XmlRpcCS/Logger.cs
create mode 100644 XmlRpcCS/SimpleHttpRequest.cs
create mode 100644 XmlRpcCS/XMLRPC.csproj
create mode 100644 XmlRpcCS/XMLRPC.dll.build
create mode 100644 XmlRpcCS/XmlRpcBoxcarRequest.cs
create mode 100644 XmlRpcCS/XmlRpcClientProxy.cs
create mode 100644 XmlRpcCS/XmlRpcDeserializer.cs
create mode 100644 XmlRpcCS/XmlRpcErrorCodes.cs
create mode 100644 XmlRpcCS/XmlRpcException.cs
create mode 100644 XmlRpcCS/XmlRpcExposedAttribute.cs
create mode 100644 XmlRpcCS/XmlRpcRequest.cs
create mode 100644 XmlRpcCS/XmlRpcRequestDeserializer.cs
create mode 100644 XmlRpcCS/XmlRpcRequestSerializer.cs
create mode 100644 XmlRpcCS/XmlRpcResponder.cs
create mode 100644 XmlRpcCS/XmlRpcResponse.cs
create mode 100644 XmlRpcCS/XmlRpcResponseDeserializer.cs
create mode 100644 XmlRpcCS/XmlRpcResponseSerializer.cs
create mode 100644 XmlRpcCS/XmlRpcSerializer.cs
create mode 100644 XmlRpcCS/XmlRpcServer.cs
create mode 100644 XmlRpcCS/XmlRpcSystemObject.cs
create mode 100644 XmlRpcCS/XmlRpcXmlTokens.cs
diff --git a/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj b/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj
index 808886e..9b8cc87 100644
--- a/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj
+++ b/OpenGridServices.GridServer/OpenGridServices.GridServer.csproj
@@ -98,6 +98,12 @@
{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
False
+
+ XMLRPC
+ {8E81D43C-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
diff --git a/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build b/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build
index 316ebb3..ae1e889 100644
--- a/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build
+++ b/OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build
@@ -28,6 +28,7 @@
+
diff --git a/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj b/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
index fcf6362..888b62d 100644
--- a/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
+++ b/OpenGridServices.UserServer/OpenGridServices.UserServer.csproj
@@ -98,6 +98,12 @@
{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
False
+
+ XMLRPC
+ {8E81D43C-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
diff --git a/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build b/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build
index 6319d9e..8dd9443 100644
--- a/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build
+++ b/OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build
@@ -27,6 +27,7 @@
+
diff --git a/OpenSim.Framework/AgentInventory.cs b/OpenSim.Framework/AgentInventory.cs
index cabefc9..35c27d9 100644
--- a/OpenSim.Framework/AgentInventory.cs
+++ b/OpenSim.Framework/AgentInventory.cs
@@ -4,6 +4,7 @@ using System.Text;
using libsecondlife;
using libsecondlife.Packets;
using OpenSim.Framework.Types;
+using OpenSim.Framework.Utilities;
namespace OpenSim.Framework.Inventory
{
@@ -114,9 +115,9 @@ namespace OpenSim.Framework.Inventory
Console.WriteLine("updating inventory item details");
if (this.InventoryItems.ContainsKey(itemID))
{
- Console.WriteLine("changing name to "+ Helpers.FieldToString(packet.Name));
+ Console.WriteLine("changing name to "+ Util.FieldToString(packet.Name));
InventoryItem Item = this.InventoryItems[itemID];
- Item.Name = Helpers.FieldToString(packet.Name);
+ Item.Name = Util.FieldToString(packet.Name);
Console.WriteLine("updated inventory item " + itemID.ToStringHyphenated());
//TODO need to update the rest of the info
}
diff --git a/OpenSim.Framework/OpenSim.Framework.csproj b/OpenSim.Framework/OpenSim.Framework.csproj
index ea4817e..0061140 100644
--- a/OpenSim.Framework/OpenSim.Framework.csproj
+++ b/OpenSim.Framework/OpenSim.Framework.csproj
@@ -76,6 +76,12 @@
+
+ XMLRPC
+ {8E81D43C-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
diff --git a/OpenSim.Framework/OpenSim.Framework.dll.build b/OpenSim.Framework/OpenSim.Framework.dll.build
index 8048de5..2ed5643 100644
--- a/OpenSim.Framework/OpenSim.Framework.dll.build
+++ b/OpenSim.Framework/OpenSim.Framework.dll.build
@@ -50,6 +50,7 @@
+
diff --git a/OpenSim.Framework/Util.cs b/OpenSim.Framework/Util.cs
index 695cac9..17ca611 100644
--- a/OpenSim.Framework/Util.cs
+++ b/OpenSim.Framework/Util.cs
@@ -36,6 +36,95 @@ namespace OpenSim.Framework.Utilities
return id;
}
+ public static int fast_distance2d(int x, int y)
+ {
+ x = System.Math.Abs(x);
+ y = System.Math.Abs(y);
+
+ int min = System.Math.Min(x, y);
+
+ return (x + y - (min >> 1) - (min >> 2) + (min >> 4));
+ }
+
+ public static string FieldToString(byte[] bytes)
+ {
+ return FieldToString(bytes, String.Empty);
+ }
+
+ ///
+ /// Convert a variable length field (byte array) to a string, with a
+ /// field name prepended to each line of the output
+ ///
+ /// If the byte array has unprintable characters in it, a
+ /// hex dump will be put in the string instead
+ /// The byte array to convert to a string
+ /// A field name to prepend to each line of output
+ /// An ASCII string or a string containing a hex dump, minus
+ /// the null terminator
+ public static string FieldToString(byte[] bytes, string fieldName)
+ {
+ // Check for a common case
+ if (bytes.Length == 0) return String.Empty;
+
+ StringBuilder output = new StringBuilder();
+ bool printable = true;
+
+ for (int i = 0; i < bytes.Length; ++i)
+ {
+ // Check if there are any unprintable characters in the array
+ if ((bytes[i] < 0x20 || bytes[i] > 0x7E) && bytes[i] != 0x09
+ && bytes[i] != 0x0D && bytes[i] != 0x0A && bytes[i] != 0x00)
+ {
+ printable = false;
+ break;
+ }
+ }
+
+ if (printable)
+ {
+ if (fieldName.Length > 0)
+ {
+ output.Append(fieldName);
+ output.Append(": ");
+ }
+
+ if (bytes[bytes.Length - 1] == 0x00)
+ output.Append(UTF8Encoding.UTF8.GetString(bytes, 0, bytes.Length - 1));
+ else
+ output.Append(UTF8Encoding.UTF8.GetString(bytes));
+ }
+ else
+ {
+ for (int i = 0; i < bytes.Length; i += 16)
+ {
+ if (i != 0)
+ output.Append(Environment.NewLine);
+ if (fieldName.Length > 0)
+ {
+ output.Append(fieldName);
+ output.Append(": ");
+ }
+
+ for (int j = 0; j < 16; j++)
+ {
+ if ((i + j) < bytes.Length)
+ output.Append(String.Format("{0:X2} ", bytes[i + j]));
+ else
+ output.Append(" ");
+ }
+
+ for (int j = 0; j < 16 && (i + j) < bytes.Length; j++)
+ {
+ if (bytes[i + j] >= 0x20 && bytes[i + j] < 0x7E)
+ output.Append((char)bytes[i + j]);
+ else
+ output.Append(".");
+ }
+ }
+ }
+
+ return output.ToString();
+ }
public Util()
{
diff --git a/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.csproj b/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.csproj
index 2b80456..b004c10 100644
--- a/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.csproj
+++ b/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.csproj
@@ -84,6 +84,12 @@
{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
False
+
+ XMLRPC
+ {8E81D43C-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
diff --git a/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build b/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build
index dd6db18..96272dd 100644
--- a/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build
+++ b/OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build
@@ -25,6 +25,7 @@
+
diff --git a/OpenSim.Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim.Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
index 26b9565..b886f46 100644
--- a/OpenSim.Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
+++ b/OpenSim.Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
@@ -109,31 +109,31 @@ namespace OpenSim.Physics.BasicPhysicsPlugin
{*/
actor.Position.Z = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1;
//}
-
-
-
- // This code needs sorting out - border crossings etc
+
+
+
+ // This code needs sorting out - border crossings etc
/* if(actor.Position.X<0)
{
- ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
actor.Position.X = 0;
actor.Velocity.X = 0;
}
if(actor.Position.Y < 0)
{
- ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
actor.Position.Y = 0;
actor.Velocity.Y = 0;
}
if(actor.Position.X > 255)
{
- ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
actor.Position.X = 255;
actor.Velocity.X = 0;
}
if(actor.Position.Y > 255)
{
- ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
+ ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z));
actor.Position.Y = 255;
actor.Velocity.X = 0;
}*/
diff --git a/OpenSim.RegionServer/AgentAssetUpload.cs b/OpenSim.RegionServer/AgentAssetUpload.cs
index 258bda0..071ea63 100644
--- a/OpenSim.RegionServer/AgentAssetUpload.cs
+++ b/OpenSim.RegionServer/AgentAssetUpload.cs
@@ -196,8 +196,8 @@ namespace OpenSim
if (this.transactions.ContainsKey(packet.InventoryBlock.TransactionID))
{
AssetTransaction trans = this.transactions[packet.InventoryBlock.TransactionID];
- trans.Asset.Description = Helpers.FieldToString(packet.InventoryBlock.Description);
- trans.Asset.Name = Helpers.FieldToString(packet.InventoryBlock.Name);
+ trans.Asset.Description = Util.FieldToString(packet.InventoryBlock.Description);
+ trans.Asset.Name = Util.FieldToString(packet.InventoryBlock.Name);
trans.Asset.Type = packet.InventoryBlock.Type;
trans.Asset.InvType = packet.InventoryBlock.InvType;
if (trans.UploadComplete)
diff --git a/OpenSim.RegionServer/OpenSim.RegionServer.csproj b/OpenSim.RegionServer/OpenSim.RegionServer.csproj
index ae391a9..a473a3c 100644
--- a/OpenSim.RegionServer/OpenSim.RegionServer.csproj
+++ b/OpenSim.RegionServer/OpenSim.RegionServer.csproj
@@ -116,6 +116,12 @@
{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
False
+
+ XMLRPC
+ {8E81D43C-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
diff --git a/OpenSim.RegionServer/OpenSim.RegionServer.dll.build b/OpenSim.RegionServer/OpenSim.RegionServer.dll.build
index abd7776..982f45c 100644
--- a/OpenSim.RegionServer/OpenSim.RegionServer.dll.build
+++ b/OpenSim.RegionServer/OpenSim.RegionServer.dll.build
@@ -58,6 +58,7 @@
+
diff --git a/OpenSim.RegionServer/OpenSimMain.cs b/OpenSim.RegionServer/OpenSimMain.cs
index dc6a363..bc062b2 100644
--- a/OpenSim.RegionServer/OpenSimMain.cs
+++ b/OpenSim.RegionServer/OpenSimMain.cs
@@ -374,7 +374,7 @@ namespace OpenSim
this.gridLocalAsset = Convert.ToBoolean(attri);
}
- // Grid mode hack to use local asset server
+ // Grid mode hack to use local asset server
attri = "";
attri = configData.GetAttribute("PhysicsEngine");
if (attri == "")
@@ -437,6 +437,7 @@ namespace OpenSim
Packet packet = null;
int numBytes = Server.EndReceiveFrom(result, ref epSender);
int packetEnd = numBytes - 1;
+
packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
// This is either a new client or a packet to send to an old one
@@ -509,6 +510,7 @@ namespace OpenSim
{ // invalid client
Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
}
+
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
}
diff --git a/OpenSim.RegionServer/RegionInfo.cs b/OpenSim.RegionServer/RegionInfo.cs
index d17e1fd..2f8bfa1 100644
--- a/OpenSim.RegionServer/RegionInfo.cs
+++ b/OpenSim.RegionServer/RegionInfo.cs
@@ -17,6 +17,8 @@ namespace OpenSim
public uint RegionLocX;
public uint RegionLocY;
public ulong RegionHandle;
+ public ushort RegionWaterHeight = 20;
+ public bool RegionTerraform = true;
public int IPListenPort;
public string IPListenAddr;
diff --git a/OpenSim.RegionServer/SimClient.cs b/OpenSim.RegionServer/SimClient.cs
index 9a0a6eb..c5108ac 100644
--- a/OpenSim.RegionServer/SimClient.cs
+++ b/OpenSim.RegionServer/SimClient.cs
@@ -491,7 +491,7 @@ namespace OpenSim
break;
case PacketType.CreateInventoryFolder:
CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
- m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Helpers.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID);
+ m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID);
//Console.WriteLine(Pack.ToString());
break;
case PacketType.CreateInventoryItem:
@@ -603,7 +603,7 @@ namespace OpenSim
{
if (ent is OpenSim.world.Primitive)
{
- this.m_world.AddScript(ent, Helpers.FieldToString(assBase.Data));
+ this.m_world.AddScript(ent, Util.FieldToString(assBase.Data));
}
}
}
@@ -1081,8 +1081,8 @@ namespace OpenSim
{
//lets try this out with creating a notecard
AssetBase asset = new AssetBase();
- asset.Name = Helpers.FieldToString(packet.InventoryBlock.Name);
- asset.Description = Helpers.FieldToString(packet.InventoryBlock.Description);
+ asset.Name = Util.FieldToString(packet.InventoryBlock.Name);
+ asset.Description = Util.FieldToString(packet.InventoryBlock.Description);
asset.InvType = packet.InventoryBlock.InvType;
asset.Type = packet.InventoryBlock.Type;
asset.FullID = LLUUID.Random();
diff --git a/OpenSim.RegionServer/world/Avatar.cs b/OpenSim.RegionServer/world/Avatar.cs
index 54043fc..df7d5ba 100644
--- a/OpenSim.RegionServer/world/Avatar.cs
+++ b/OpenSim.RegionServer/world/Avatar.cs
@@ -32,14 +32,18 @@ namespace OpenSim.world
private ulong m_regionHandle;
private Dictionary m_clientThreads;
private string m_regionName;
+ private ushort m_regionWaterHeight;
+ private bool m_regionTerraform;
//private bool childShadowAvatar = false;
- public Avatar(SimClient TheClient, World world, string regionName, Dictionary clientThreads, ulong regionHandle)
+ public Avatar(SimClient TheClient, World world, string regionName, Dictionary clientThreads, ulong regionHandle, bool regionTerraform, ushort regionWater)
{
m_world = world;
m_clientThreads = clientThreads;
m_regionName = regionName;
m_regionHandle = regionHandle;
+ m_regionTerraform = regionTerraform;
+ m_regionWaterHeight = regionWater;
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)");
ControllingClient = TheClient;
@@ -139,7 +143,7 @@ namespace OpenSim.world
public void HandleUpdate(AgentUpdatePacket pack)
{
- if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY) != 0)
+ if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0)
{
if (this._physActor.Flying == false)
{
@@ -160,7 +164,7 @@ namespace OpenSim.world
}
this._physActor.Flying = false;
}
- if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS) != 0)
+ if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS) != 0)
{
Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
if (((movementflag & 1) == 0) || (q != this.bodyRot))
@@ -194,7 +198,7 @@ namespace OpenSim.world
this.bodyRot = q;
}
}
- else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS) != 0) && (PhysicsEngineFlying))
+ else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_UP_POS) != 0) && (PhysicsEngineFlying))
{
if (((movementflag & 2) == 0) && this._physActor.Flying)
{
@@ -214,7 +218,7 @@ namespace OpenSim.world
movementflag = 2;
}
}
- else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG) != 0) && (PhysicsEngineFlying))
+ else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) && (PhysicsEngineFlying))
{
if (((movementflag & 4) == 0) && this._physActor.Flying)
{
@@ -235,7 +239,7 @@ namespace OpenSim.world
movementflag = 4;
}
}
- else if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG) != 0)
+ else if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
{
Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
if (((movementflag & 8) == 0) || (q != this.bodyRot))
@@ -287,7 +291,7 @@ namespace OpenSim.world
}
}
- //really really should be moved somewhere else
+ //really really should be moved somewhere else (RegionInfo.cs ?)
public void SendRegionHandshake(World RegionInfo)
{
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs:SendRegionHandshake() - Creating empty RegionHandshake packet");
@@ -306,8 +310,13 @@ namespace OpenSim.world
handshake.RegionInfo.TerrainStartHeight10 = 10;
handshake.RegionInfo.TerrainStartHeight11 = 10;
handshake.RegionInfo.SimAccess = 13;
- handshake.RegionInfo.WaterHeight = 20;
- handshake.RegionInfo.RegionFlags = 72458694 - 32;
+ handshake.RegionInfo.WaterHeight = m_regionWaterHeight;
+ uint regionFlags = 72458694;
+ if (this.m_regionTerraform)
+ {
+ regionFlags -= 64;
+ }
+ handshake.RegionInfo.RegionFlags = regionFlags;
handshake.RegionInfo.SimName = _enc.GetBytes(m_regionName + "\0");
handshake.RegionInfo.SimOwner = new LLUUID("00000000-0000-0000-0000-000000000000");
handshake.RegionInfo.TerrainBase0 = new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975");
diff --git a/OpenSim.RegionServer/world/Primitive2.cs b/OpenSim.RegionServer/world/Primitive2.cs
index 34e32f8..24fc6da 100644
--- a/OpenSim.RegionServer/world/Primitive2.cs
+++ b/OpenSim.RegionServer/world/Primitive2.cs
@@ -272,7 +272,7 @@ namespace OpenSim.world
PData.PathTwist = objupdate.ObjectData[0].PathTwist = addPacket.ObjectData.PathTwist;
PData.PathTwistBegin = objupdate.ObjectData[0].PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
objupdate.ObjectData[0].ID = (uint)(localID);
- objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efef" + (localID - 702000).ToString("00000"));
+ objupdate.ObjectData[0].FullID = LLUUID.Random();
LLVector3 pos1 = addPacket.ObjectData.RayEnd;
//update position
byte[] pb = pos1.GetBytes();
diff --git a/OpenSim.RegionServer/world/World.cs b/OpenSim.RegionServer/world/World.cs
index 69a6494..5bada2b 100644
--- a/OpenSim.RegionServer/world/World.cs
+++ b/OpenSim.RegionServer/world/World.cs
@@ -542,7 +542,7 @@ namespace OpenSim.world
try
{
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent");
- Avatar newAvatar = new Avatar(agentClient, this, m_regionName, m_clientThreads, m_regionHandle);
+ Avatar newAvatar = new Avatar(agentClient, this, m_regionName, m_clientThreads, m_regionHandle, true, 20);
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Adding new avatar to world");
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Starting RegionHandshake ");
newAvatar.SendRegionHandshake(this);
diff --git a/OpenSim.RegionServer/world/WorldPacketHandlers.cs b/OpenSim.RegionServer/world/WorldPacketHandlers.cs
index 70cbc6b..f4213d0 100644
--- a/OpenSim.RegionServer/world/WorldPacketHandlers.cs
+++ b/OpenSim.RegionServer/world/WorldPacketHandlers.cs
@@ -8,6 +8,7 @@ using OpenSim.Framework.Interfaces;
using OpenSim.Framework.Types;
using OpenSim.Framework.Terrain;
using OpenSim.Framework.Inventory;
+using OpenSim.Framework.Utilities;
using OpenSim.Assets;
namespace OpenSim.world
@@ -44,7 +45,7 @@ namespace OpenSim.world
{
System.Text.Encoding enc = System.Text.Encoding.ASCII;
ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)packet;
- if (Helpers.FieldToString(inchatpack.ChatData.Message) == "")
+ if (Util.FieldToString(inchatpack.ChatData.Message) == "")
{
//empty message so don't bother with it
return true;
@@ -53,7 +54,7 @@ namespace OpenSim.world
libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket();
reply.ChatData.Audible = 1;
reply.ChatData.Message = inchatpack.ChatData.Message;
- reply.ChatData.ChatType = 1;
+ reply.ChatData.ChatType = inchatpack.ChatData.Type;
reply.ChatData.SourceType = 1;
reply.ChatData.Position = simClient.ClientAvatar.Pos;
reply.ChatData.FromName = enc.GetBytes(simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname + "\0");
@@ -61,7 +62,31 @@ namespace OpenSim.world
reply.ChatData.SourceID = simClient.AgentID;
foreach (SimClient client in m_clientThreads.Values)
{
- client.OutPacket(reply);
+ switch (inchatpack.ChatData.Type)
+ {
+ case 0:
+ int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X),(int)( client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y));
+ if ((dis < 10) && (dis > -10))
+ {
+ client.OutPacket(reply);
+ }
+ break;
+ case 1:
+ dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y));
+ if ((dis < 30) && (dis > -30))
+ {
+ client.OutPacket(reply);
+ }
+ break;
+ case 2:
+ dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X),(int)( client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y));
+ if ((dis < 100) && (dis > -100))
+ {
+ client.OutPacket(reply);
+ }
+ break;
+ }
+
}
return true;
}
diff --git a/OpenSim.Servers/OpenSim.Servers.csproj b/OpenSim.Servers/OpenSim.Servers.csproj
index be0220a..cacdb5d 100644
--- a/OpenSim.Servers/OpenSim.Servers.csproj
+++ b/OpenSim.Servers/OpenSim.Servers.csproj
@@ -84,6 +84,12 @@
{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
False
+
+ XMLRPC
+ {8E81D43C-0000-0000-0000-000000000000}
+ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
+ False
+
diff --git a/OpenSim.Servers/OpenSim.Servers.dll.build b/OpenSim.Servers/OpenSim.Servers.dll.build
index ebe1750..61475ec 100644
--- a/OpenSim.Servers/OpenSim.Servers.dll.build
+++ b/OpenSim.Servers/OpenSim.Servers.dll.build
@@ -30,6 +30,7 @@
+
diff --git a/OpenSim.build b/OpenSim.build
index 71e631e..06743ed 100644
--- a/OpenSim.build
+++ b/OpenSim.build
@@ -54,22 +54,24 @@
-
+
-
+
+
-
+
+
@@ -109,19 +111,20 @@
-
+
-
+
+
-
+
diff --git a/OpenSim.sln b/OpenSim.sln
index aefeb45..aa84470 100644
--- a/OpenSim.sln
+++ b/OpenSim.sln
@@ -1,5 +1,5 @@
Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual C# Express 2005
+# Visual Studio 2005
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Terrain.BasicTerrain", "OpenSim.Terrain.BasicTerrain\OpenSim.Terrain.BasicTerrain.csproj", "{2270B8FE-0000-0000-0000-000000000000}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.RegionServer", "OpenSim.RegionServer\OpenSim.RegionServer.csproj", "{632E1BFD-0000-0000-0000-000000000000}"
@@ -16,21 +16,21 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GenericConfig.Xml",
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.Manager", "OpenSim.Physics\Manager\OpenSim.Physics.Manager.csproj", "{8BE16150-0000-0000-0000-000000000000}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Scripting.EmbeddedJVM", "OpenSim.Scripting\EmbeddedJVM\OpenSim.Scripting.EmbeddedJVM.csproj", "{97A82740-0000-0000-0000-000000000000}"
-EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.UserServer", "OpenGridServices.UserServer\OpenGridServices.UserServer.csproj", "{66591469-0000-0000-0000-000000000000}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.BasicPhysicsPlugin", "OpenSim.Physics\BasicPhysicsPlugin\OpenSim.Physics.BasicPhysicsPlugin.csproj", "{4F874463-0000-0000-0000-000000000000}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGrid.Config.GridConfigDb4o", "OpenGrid.Config\GridConfigDb4o\OpenGrid.Config.GridConfigDb4o.csproj", "{B0027747-0000-0000-0000-000000000000}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Servers", "OpenSim.Servers\OpenSim.Servers.csproj", "{8BB20F0A-0000-0000-0000-000000000000}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.PhysXPlugin", "OpenSim.Physics\PhysXPlugin\OpenSim.Physics.PhysXPlugin.csproj", "{988F0AC4-0000-0000-0000-000000000000}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridInterfaces.Remote", "OpenSim.GridInterfaces\Remote\OpenSim.GridInterfaces.Remote.csproj", "{B55C0B5D-0000-0000-0000-000000000000}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework", "OpenSim.Framework\OpenSim.Framework.csproj", "{8ACA2445-0000-0000-0000-000000000000}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Servers", "OpenSim.Servers\OpenSim.Servers.csproj", "{8BB20F0A-0000-0000-0000-000000000000}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.GridServer", "OpenGridServices.GridServer\OpenGridServices.GridServer.csproj", "{21BFC8E2-0000-0000-0000-000000000000}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Storage.LocalStorageDb4o", "OpenSim.Storage\LocalStorageDb4o\OpenSim.Storage.LocalStorageDb4o.csproj", "{E1B79ECF-0000-0000-0000-000000000000}"
EndProject
@@ -38,102 +38,156 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Storage.LocalStorag
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenUser.Config.UserConfigDb4o", "OpenUser.Config\UserConfigDb4o\OpenUser.Config.UserConfigDb4o.csproj", "{7E494328-0000-0000-0000-000000000000}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Scripting.EmbeddedJVM", "OpenSim.Scripting\EmbeddedJVM\OpenSim.Scripting.EmbeddedJVM.csproj", "{97A82740-0000-0000-0000-000000000000}"
+EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridInterfaces.Local", "OpenSim.GridInterfaces\Local\OpenSim.GridInterfaces.Local.csproj", "{546099CD-0000-0000-0000-000000000000}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.GridServer", "OpenGridServices.GridServer\OpenGridServices.GridServer.csproj", "{21BFC8E2-0000-0000-0000-000000000000}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLRPC", "XmlRpcCS\XMLRPC.csproj", "{8E81D43C-0000-0000-0000-000000000000}"
EndProject
Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {66591469-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {66591469-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ ({632E1BFD-0000-0000-0000-000000000000}).5 = ({2270B8FE-0000-0000-0000-000000000000})
+ ({632E1BFD-0000-0000-0000-000000000000}).6 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({632E1BFD-0000-0000-0000-000000000000}).7 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({632E1BFD-0000-0000-0000-000000000000}).8 = ({E88EF749-0000-0000-0000-000000000000})
+ ({632E1BFD-0000-0000-0000-000000000000}).9 = ({8BE16150-0000-0000-0000-000000000000})
+ ({632E1BFD-0000-0000-0000-000000000000}).10 = ({8BB20F0A-0000-0000-0000-000000000000})
+ ({632E1BFD-0000-0000-0000-000000000000}).11 = ({8E81D43C-0000-0000-0000-000000000000})
+ ({63A05FE9-0000-0000-0000-000000000000}).2 = ({8BE16150-0000-0000-0000-000000000000})
+ ({EE9E5D96-0000-0000-0000-000000000000}).6 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({EE9E5D96-0000-0000-0000-000000000000}).7 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({438A9556-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({438A9556-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({438A9556-0000-0000-0000-000000000000}).7 = ({8BE16150-0000-0000-0000-000000000000})
+ ({438A9556-0000-0000-0000-000000000000}).8 = ({8BB20F0A-0000-0000-0000-000000000000})
+ ({438A9556-0000-0000-0000-000000000000}).9 = ({632E1BFD-0000-0000-0000-000000000000})
+ ({E88EF749-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({8BE16150-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({8BE16150-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({66591469-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({66591469-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({66591469-0000-0000-0000-000000000000}).5 = ({8BB20F0A-0000-0000-0000-000000000000})
+ ({66591469-0000-0000-0000-000000000000}).8 = ({8E81D43C-0000-0000-0000-000000000000})
+ ({4F874463-0000-0000-0000-000000000000}).2 = ({8BE16150-0000-0000-0000-000000000000})
+ ({B0027747-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({B0027747-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({8BB20F0A-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({8BB20F0A-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({8BB20F0A-0000-0000-0000-000000000000}).5 = ({8E81D43C-0000-0000-0000-000000000000})
+ ({988F0AC4-0000-0000-0000-000000000000}).3 = ({8BE16150-0000-0000-0000-000000000000})
+ ({B55C0B5D-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({B55C0B5D-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({B55C0B5D-0000-0000-0000-000000000000}).5 = ({8E81D43C-0000-0000-0000-000000000000})
+ ({8ACA2445-0000-0000-0000-000000000000}).4 = ({8E81D43C-0000-0000-0000-000000000000})
+ ({21BFC8E2-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({21BFC8E2-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({21BFC8E2-0000-0000-0000-000000000000}).5 = ({8BB20F0A-0000-0000-0000-000000000000})
+ ({21BFC8E2-0000-0000-0000-000000000000}).8 = ({8E81D43C-0000-0000-0000-000000000000})
+ ({E1B79ECF-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({E1B79ECF-0000-0000-0000-000000000000}).5 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({6B20B603-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({6B20B603-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({7E494328-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({7E494328-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
+ ({97A82740-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({546099CD-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000})
+ ({546099CD-0000-0000-0000-000000000000}).5 = ({A7CD0630-0000-0000-0000-000000000000})
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {66591469-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {66591469-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8E81D43C-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8E81D43C-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8E81D43C-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8E81D43C-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
EndGlobal
diff --git a/XmlRpcCS/Logger.cs b/XmlRpcCS/Logger.cs
new file mode 100644
index 0000000..ebf804b
--- /dev/null
+++ b/XmlRpcCS/Logger.cs
@@ -0,0 +1,46 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+
+ /// Define levels of logging. This duplicates
+ /// similar enumerations in System.Diagnostics.EventLogEntryType. The
+ /// duplication was merited because .NET Compact Framework lacked the EventLogEntryType enum.
+ public enum LogLevel
+ {
+ /// Information level, log entry for informational reasons only.
+ Information,
+ /// Warning level, indicates a possible problem.
+ Warning,
+ /// Error level, implies a significant problem.
+ Error
+ }
+
+ ///
+ ///Logging singleton with swappable output delegate.
+ ///
+ ///
+ ///This singleton provides a centralized log. The actual WriteEntry calls are passed
+ ///off to a delegate however. Having a delegate do the actual logginh allows you to
+ ///implement different logging mechanism and have them take effect throughout the system.
+ ///
+ public class Logger
+ {
+ ///Delegate definition for logging.
+ ///The message String to log.
+ ///The LogLevel of your message.
+ public delegate void LoggerDelegate(String message, LogLevel level);
+ ///The LoggerDelegate that will recieve WriteEntry requests.
+ static public LoggerDelegate Delegate = null;
+
+ ///
+ ///Method logging events are sent to.
+ ///
+ ///The message String to log.
+ ///The LogLevel of your message.
+ static public void WriteEntry(String message, LogLevel level)
+ {
+ if (Delegate != null)
+ Delegate(message, level);
+ }
+ }
+}
diff --git a/XmlRpcCS/SimpleHttpRequest.cs b/XmlRpcCS/SimpleHttpRequest.cs
new file mode 100644
index 0000000..e5326c3
--- /dev/null
+++ b/XmlRpcCS/SimpleHttpRequest.cs
@@ -0,0 +1,204 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.IO;
+ using System.Net.Sockets;
+ using System.Collections;
+
+ ///Very basic HTTP request handler.
+ ///This class is designed to accept a TcpClient and treat it as an HTTP request.
+ /// It will do some basic header parsing and manage the input and output streams associated
+ /// with the request.
+ public class SimpleHttpRequest
+ {
+ private String _httpMethod = null;
+ private String _protocol;
+ private String _filePathFile = null;
+ private String _filePathDir = null;
+ private String __filePath;
+ private TcpClient _client;
+ private StreamReader _input;
+ private StreamWriter _output;
+ private Hashtable _headers;
+
+ /// A constructor which accepts the TcpClient.
+ /// It creates the associated input and output streams, determines the request type,
+ /// and parses the remaining HTTP header.
+ /// The TcpClient associated with the HTTP connection.
+ public SimpleHttpRequest(TcpClient client)
+ {
+ _client = client;
+ _output = new StreamWriter(client.GetStream());
+ _input = new StreamReader(client.GetStream());
+ GetRequestMethod();
+ GetRequestHeaders();
+ }
+
+ /// The output StreamWriter associated with the request.
+ public StreamWriter Output
+ {
+ get { return _output; }
+ }
+
+ /// The input StreamReader associated with the request.
+ public StreamReader Input
+ {
+ get { return _input; }
+ }
+
+ /// The TcpClient with the request.
+ public TcpClient Client
+ {
+ get { return _client; }
+ }
+
+ private String _filePath
+ {
+ get { return __filePath; }
+ set
+ {
+ __filePath = value;
+ _filePathDir = null;
+ _filePathFile = null;
+ }
+ }
+
+ /// The type of HTTP request (i.e. PUT, GET, etc.).
+ public String HttpMethod
+ {
+ get { return _httpMethod; }
+ }
+
+ /// The level of the HTTP protocol.
+ public String Protocol
+ {
+ get { return _protocol; }
+ }
+
+ /// The "path" which is part of any HTTP request.
+ public String FilePath
+ {
+ get { return _filePath; }
+ }
+
+ /// The file portion of the "path" which is part of any HTTP request.
+ public String FilePathFile
+ {
+ get
+ {
+ if (_filePathFile != null)
+ return _filePathFile;
+
+ int i = FilePath.LastIndexOf("/");
+
+ if (i == -1)
+ return "";
+
+ i++;
+ _filePathFile = FilePath.Substring(i, FilePath.Length - i);
+ return _filePathFile;
+ }
+ }
+
+ /// The directory portion of the "path" which is part of any HTTP request.
+ public String FilePathDir
+ {
+ get
+ {
+ if (_filePathDir != null)
+ return _filePathDir;
+
+ int i = FilePath.LastIndexOf("/");
+
+ if (i == -1)
+ return "";
+
+ i++;
+ _filePathDir = FilePath.Substring(0, i);
+ return _filePathDir;
+ }
+ }
+
+ private void GetRequestMethod()
+ {
+ string req = _input.ReadLine();
+ if (req == null)
+ throw new ApplicationException("Void request.");
+
+ if (0 == String.Compare("GET ", req.Substring(0, 4), true))
+ _httpMethod = "GET";
+ else if (0 == String.Compare("POST ", req.Substring(0, 5), true))
+ _httpMethod = "POST";
+ else
+ throw new InvalidOperationException("Unrecognized method in query: " + req);
+
+ req = req.TrimEnd();
+ int idx = req.IndexOf(' ') + 1;
+ if (idx >= req.Length)
+ throw new ApplicationException("What do you want?");
+
+ string page_protocol = req.Substring(idx);
+ int idx2 = page_protocol.IndexOf(' ');
+ if (idx2 == -1)
+ idx2 = page_protocol.Length;
+
+ _filePath = page_protocol.Substring(0, idx2).Trim();
+ _protocol = page_protocol.Substring(idx2).Trim();
+ }
+
+ private void GetRequestHeaders()
+ {
+ String line;
+ int idx;
+
+ _headers = new Hashtable();
+
+ while ((line = _input.ReadLine()) != "")
+ {
+ if (line == null)
+ {
+ break;
+ }
+
+ idx = line.IndexOf(':');
+ if (idx == -1 || idx == line.Length - 1)
+ {
+ Logger.WriteEntry("Malformed header line: " + line, LogLevel.Information);
+ continue;
+ }
+
+ String key = line.Substring(0, idx);
+ String value = line.Substring(idx + 1);
+
+ try
+ {
+ _headers.Add(key, value);
+ }
+ catch (Exception)
+ {
+ Logger.WriteEntry("Duplicate header key in line: " + line, LogLevel.Information);
+ }
+ }
+ }
+
+ ///
+ /// Format the object contents into a useful string representation.
+ ///
+ ///String representation of the SimpleHttpRequest as the HttpMethod FilePath Protocol.
+ override public String ToString()
+ {
+ return HttpMethod + " " + FilePath + " " + Protocol;
+ }
+
+ ///
+ /// Close the SimpleHttpRequest. This flushes and closes all associated io streams.
+ ///
+ public void Close()
+ {
+ _output.Flush();
+ _output.Close();
+ _input.Close();
+ _client.Close();
+ }
+ }
+}
diff --git a/XmlRpcCS/XMLRPC.csproj b/XmlRpcCS/XMLRPC.csproj
new file mode 100644
index 0000000..2c7ef94
--- /dev/null
+++ b/XmlRpcCS/XMLRPC.csproj
@@ -0,0 +1,138 @@
+
+
+ Local
+ 8.0.50727
+ 2.0
+ {8E81D43C-0000-0000-0000-000000000000}
+ Debug
+ AnyCPU
+
+
+
+ XMLRPC
+ JScript
+ Grid
+ IE50
+ false
+ Library
+
+ XMLRPC
+
+
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE;DEBUG
+
+ True
+ 4096
+ False
+ ..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+ False
+ 285212672
+ False
+
+
+ TRACE
+
+ False
+ 4096
+ True
+ ..\bin\
+ False
+ False
+ False
+ 4
+
+
+
+
+ System.dll
+ False
+
+
+ System.Xml.dll
+ False
+
+
+
+
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
diff --git a/XmlRpcCS/XMLRPC.dll.build b/XmlRpcCS/XMLRPC.dll.build
new file mode 100644
index 0000000..d734d19
--- /dev/null
+++ b/XmlRpcCS/XMLRPC.dll.build
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/XmlRpcCS/XmlRpcBoxcarRequest.cs b/XmlRpcCS/XmlRpcBoxcarRequest.cs
new file mode 100644
index 0000000..f87f7a5
--- /dev/null
+++ b/XmlRpcCS/XmlRpcBoxcarRequest.cs
@@ -0,0 +1,51 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Xml;
+ using System.Net;
+ using System.Text;
+ using System.Reflection;
+
+ /// Class that collects individual XmlRpcRequest objects and submits them as a boxcarred request.
+ /// A boxcared request is when a number of request are collected before being sent via XML-RPC, and then are sent via
+ /// a single HTTP connection. This results in a speed up from reduced connection time. The results are then retuned collectively
+ /// as well.
+ ///
+ ///
+ public class XmlRpcBoxcarRequest : XmlRpcRequest
+ {
+ /// ArrayList to collect the requests to boxcar.
+ public IList Requests = new ArrayList();
+
+ /// Basic constructor.
+ public XmlRpcBoxcarRequest()
+ {
+ }
+
+ /// Returns the String "system.multiCall" which is the server method that handles boxcars.
+ public override String MethodName
+ {
+ get { return "system.multiCall"; }
+ }
+
+ /// The ArrayList of boxcarred Requests as properly formed parameters.
+ public override IList Params
+ {
+ get {
+ _params.Clear();
+ ArrayList reqArray = new ArrayList();
+ foreach (XmlRpcRequest request in Requests)
+ {
+ Hashtable requestEntry = new Hashtable();
+ requestEntry.Add(XmlRpcXmlTokens.METHOD_NAME, request.MethodName);
+ requestEntry.Add(XmlRpcXmlTokens.PARAMS, request.Params);
+ reqArray.Add(requestEntry);
+ }
+ _params.Add(reqArray);
+ return _params;
+ }
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcClientProxy.cs b/XmlRpcCS/XmlRpcClientProxy.cs
new file mode 100644
index 0000000..f52273a
--- /dev/null
+++ b/XmlRpcCS/XmlRpcClientProxy.cs
@@ -0,0 +1,61 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Runtime.Remoting.Proxies;
+ using System.Runtime.Remoting.Messaging;
+
+ /// This class provides support for creating local proxies of XML-RPC remote objects
+ ///
+ /// To create a local proxy you need to create a local C# interface and then, via createProxy
+ /// associate that interface with a remote object at a given URL.
+ ///
+public class XmlRpcClientProxy : RealProxy
+{
+ private String _remoteObjectName;
+ private String _url;
+ private XmlRpcRequest _client = new XmlRpcRequest();
+
+ /// Factory method to create proxies.
+ ///
+ /// To create a local proxy you need to create a local C# interface with methods that mirror those of the server object.
+ /// Next, pass that interface into createProxy along with the object name and URL of the remote object and
+ /// cast the resulting object to the specifice interface.
+ ///
+ /// String The name of the remote object.
+ /// String The URL of the remote object.
+ /// Type The typeof() of a C# interface.
+ /// Object A proxy for your specified interface. Cast to appropriate type.
+ public static Object createProxy(String remoteObjectName, String url, Type anInterface)
+ {
+ return new XmlRpcClientProxy(remoteObjectName, url, anInterface).GetTransparentProxy();
+ }
+
+ private XmlRpcClientProxy(String remoteObjectName, String url, Type t) : base(t)
+ {
+ _remoteObjectName = remoteObjectName;
+ _url = url;
+ }
+
+ /// The local method dispatcher - do not invoke.
+ override public IMessage Invoke(IMessage msg)
+ {
+ IMethodCallMessage methodMessage = (IMethodCallMessage)msg;
+
+ _client.MethodName = _remoteObjectName + "." + methodMessage.MethodName;
+ _client.Params.Clear();
+ foreach (Object o in methodMessage.Args)
+ _client.Params.Add(o);
+
+ try
+ {
+ Object ret = _client.Invoke(_url);
+ return new ReturnMessage(ret,null,0,
+ methodMessage.LogicalCallContext, methodMessage);
+ }
+ catch (Exception e)
+ {
+ return new ReturnMessage(e, methodMessage);
+ }
+ }
+}
+}
diff --git a/XmlRpcCS/XmlRpcDeserializer.cs b/XmlRpcCS/XmlRpcDeserializer.cs
new file mode 100644
index 0000000..bd736c0
--- /dev/null
+++ b/XmlRpcCS/XmlRpcDeserializer.cs
@@ -0,0 +1,195 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Xml;
+ using System.Globalization;
+
+ /// Parser context, we maintain contexts in a stack to avoiding recursion.
+ struct Context
+ {
+ public String Name;
+ public Object Container;
+ }
+
+ /// Basic XML-RPC data deserializer.
+ /// Uses XmlTextReader to parse the XML data. This level of the class
+ /// only handles the tokens common to both Requests and Responses. This class is not useful in and of itself
+ /// but is designed to be subclassed.
+ public class XmlRpcDeserializer : XmlRpcXmlTokens
+ {
+ private static DateTimeFormatInfo _dateFormat = new DateTimeFormatInfo();
+
+ private Object _container;
+ private Stack _containerStack;
+
+ /// Protected reference to last text.
+ protected String _text;
+ /// Protected reference to last deserialized value.
+ protected Object _value;
+ /// Protected reference to last name field.
+ protected String _name;
+
+
+ /// Basic constructor.
+ public XmlRpcDeserializer()
+ {
+ Reset();
+ _dateFormat.FullDateTimePattern = ISO_DATETIME;
+ }
+
+ /// Static method that parses XML data into a response using the Singleton.
+ /// StreamReader containing an XML-RPC response.
+ /// Object object resulting from the deserialization.
+ virtual public Object Deserialize(TextReader xmlData)
+ {
+ return null;
+ }
+
+ /// Protected method to parse a node in an XML-RPC XML stream.
+ /// Method deals with elements common to all XML-RPC data, subclasses of
+ /// this object deal with request/response spefic elements.
+ /// XmlTextReader of the in progress parsing data stream.
+ protected void DeserializeNode(XmlTextReader reader)
+ {
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.Element:
+ if (Logger.Delegate != null)
+ Logger.WriteEntry("START " + reader.Name, LogLevel.Information);
+ switch (reader.Name)
+ {
+ case VALUE:
+ _value = null;
+ _text = null;
+ break;
+ case STRUCT:
+ PushContext();
+ _container = new Hashtable();
+ break;
+ case ARRAY:
+ PushContext();
+ _container = new ArrayList();
+ break;
+ }
+ break;
+ case XmlNodeType.EndElement:
+ if (Logger.Delegate != null)
+ Logger.WriteEntry("END " + reader.Name, LogLevel.Information);
+ switch (reader.Name)
+ {
+ case BASE64:
+ _value = Convert.FromBase64String(_text);
+ break;
+ case BOOLEAN:
+ int val = Int16.Parse(_text);
+ if (val == 0)
+ _value = false;
+ else if (val == 1)
+ _value = true;
+ break;
+ case STRING:
+ _value = _text;
+ break;
+ case DOUBLE:
+ _value = Double.Parse(_text);
+ break;
+ case INT:
+ case ALT_INT:
+ _value = Int32.Parse(_text);
+ break;
+ case DATETIME:
+#if __MONO__
+ _value = DateParse(_text);
+#else
+ _value = DateTime.ParseExact(_text, "F", _dateFormat);
+#endif
+ break;
+ case NAME:
+ _name = _text;
+ break;
+ case VALUE:
+ if (_value == null)
+ _value = _text; // some kits don't use tag, they just do
+
+ if ((_container != null) && (_container is IList)) // in an array? If so add value to it.
+ ((IList)_container).Add(_value);
+ break;
+ case MEMBER:
+ if ((_container != null) && (_container is IDictionary)) // in an struct? If so add value to it.
+ ((IDictionary)_container).Add(_name, _value);
+ break;
+ case ARRAY:
+ case STRUCT:
+ _value = _container;
+ PopContext();
+ break;
+ }
+ break;
+ case XmlNodeType.Text:
+ if (Logger.Delegate != null)
+ Logger.WriteEntry("Text " + reader.Value, LogLevel.Information);
+ _text = reader.Value;
+ break;
+ default:
+ break;
+ }
+ }
+
+ /// Static method that parses XML in a String into a
+ /// request using the Singleton.
+ /// String containing an XML-RPC request.
+ /// XmlRpcRequest object resulting from the parse.
+ public Object Deserialize(String xmlData)
+ {
+ StringReader sr = new StringReader(xmlData);
+ return Deserialize(sr);
+ }
+
+ /// Pop a Context of the stack, an Array or Struct has closed.
+ private void PopContext()
+ {
+ Context c = (Context)_containerStack.Pop();
+ _container = c.Container;
+ _name = c.Name;
+ }
+
+ /// Push a Context on the stack, an Array or Struct has opened.
+ private void PushContext()
+ {
+ Context context;
+
+ context.Container = _container;
+ context.Name = _name;
+
+ _containerStack.Push(context);
+ }
+
+ /// Reset the internal state of the deserializer.
+ protected void Reset()
+ {
+ _text = null;
+ _value = null;
+ _name = null;
+ _container = null;
+ _containerStack = new Stack();
+ }
+
+#if __MONO__
+ private DateTime DateParse(String str)
+ {
+ int year = Int32.Parse(str.Substring(0,4));
+ int month = Int32.Parse(str.Substring(4,2));
+ int day = Int32.Parse(str.Substring(6,2));
+ int hour = Int32.Parse(str.Substring(9,2));
+ int min = Int32.Parse(str.Substring(12,2));
+ int sec = Int32.Parse(str.Substring(15,2));
+ return new DateTime(year,month,day,hour,min,sec);
+ }
+#endif
+
+ }
+}
+
+
diff --git a/XmlRpcCS/XmlRpcErrorCodes.cs b/XmlRpcCS/XmlRpcErrorCodes.cs
new file mode 100644
index 0000000..6dec57d
--- /dev/null
+++ b/XmlRpcCS/XmlRpcErrorCodes.cs
@@ -0,0 +1,51 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+
+ /// Standard XML-RPC error codes.
+ public class XmlRpcErrorCodes
+ {
+ ///
+ public const int PARSE_ERROR_MALFORMED = -32700;
+ ///
+ public const String PARSE_ERROR_MALFORMED_MSG = "Parse Error, not well formed";
+
+ ///
+ public const int PARSE_ERROR_ENCODING = -32701;
+ ///
+ public const String PARSE_ERROR_ENCODING_MSG = "Parse Error, unsupported encoding";
+
+ //
+ // -32702 ---> parse error. invalid character for encoding
+ // -32600 ---> server error. invalid xml-rpc. not conforming to spec.
+ //
+
+ ///
+ public const int SERVER_ERROR_METHOD = -32601;
+ ///
+ public const String SERVER_ERROR_METHOD_MSG = "Server Error, requested method not found";
+
+ ///
+ public const int SERVER_ERROR_PARAMS = -32602;
+ ///
+ public const String SERVER_ERROR_PARAMS_MSG = "Server Error, invalid method parameters";
+
+ //
+ // -32603 ---> server error. internal xml-rpc error
+ //
+
+ ///
+ public const int APPLICATION_ERROR = -32500;
+ ///
+ public const String APPLICATION_ERROR_MSG = "Application Error";
+
+ //
+ // -32400 ---> system error
+ //
+
+ ///
+ public const int TRANSPORT_ERROR = -32300;
+ ///
+ public const String TRANSPORT_ERROR_MSG = "Transport Layer Error";
+ }
+}
diff --git a/XmlRpcCS/XmlRpcException.cs b/XmlRpcCS/XmlRpcException.cs
new file mode 100644
index 0000000..fd1f4ae
--- /dev/null
+++ b/XmlRpcCS/XmlRpcException.cs
@@ -0,0 +1,39 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+
+ /// An XML-RPC Exception.
+ /// Maps a C# exception to an XML-RPC fault. Normal exceptions
+ /// include a message so this adds the code needed by XML-RPC.
+ public class XmlRpcException : Exception
+ {
+ private int _code;
+
+ /// Instantiate an XmlRpcException with a code and message.
+ /// Int faultCode associated with this exception.
+ /// String faultMessage associated with this exception.
+ public XmlRpcException(int code, String message)
+ : base(message)
+ {
+ _code = code;
+ }
+
+ /// The value of the faults message, i.e. the faultString.
+ public String FaultString
+ {
+ get { return Message; }
+ }
+
+ /// The value of the faults code, i.e. the faultCode.
+ public int FaultCode
+ {
+ get { return _code; }
+ }
+
+ /// Format the message to include the code.
+ override public String ToString()
+ {
+ return "Code: " + FaultCode + " Message: " + base.ToString();
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcExposedAttribute.cs b/XmlRpcCS/XmlRpcExposedAttribute.cs
new file mode 100644
index 0000000..67b27ae
--- /dev/null
+++ b/XmlRpcCS/XmlRpcExposedAttribute.cs
@@ -0,0 +1,60 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Reflection;
+
+ ///
+ /// Simple tagging attribute to indicate participation is XML-RPC exposure.
+ ///
+ ///
+ /// If present at the class level it indicates that this class does explicitly
+ /// expose methods. If present at the method level it denotes that the method
+ /// is exposed.
+ ///
+ [AttributeUsage(
+ AttributeTargets.Class | AttributeTargets.Method,
+ AllowMultiple = false,
+ Inherited = true
+ )]
+ public class XmlRpcExposedAttribute : Attribute
+ {
+ /// Check if obj is an object utilizing the XML-RPC exposed Attribute.
+ /// Object of a class or method to check for attribute.
+ /// Boolean true if attribute present.
+ public static Boolean ExposedObject(Object obj)
+ {
+ return IsExposed(obj.GetType());
+ }
+
+ /// Check if obj.methodName is an XML-RPC exposed method.
+ /// A method is considered to be exposed if it exists and, either, the object does not use the XmlRpcExposed attribute,
+ /// or the object does use the XmlRpcExposed attribute and the method has the XmlRpcExposed attribute as well.
+ /// Boolean true if the method is exposed.
+ public static Boolean ExposedMethod(Object obj, String methodName)
+ {
+ Type type = obj.GetType();
+ MethodInfo method = type.GetMethod(methodName);
+
+ if (method == null)
+ throw new MissingMethodException("Method " + methodName + " not found.");
+
+ if (!IsExposed(type))
+ return true;
+
+ return IsExposed(method);
+ }
+
+ /// Check if mi is XML-RPC exposed.
+ /// MemberInfo of a class or method to check for attribute.
+ /// Boolean true if attribute present.
+ public static Boolean IsExposed(MemberInfo mi)
+ {
+ foreach (Attribute attr in mi.GetCustomAttributes(true))
+ {
+ if (attr is XmlRpcExposedAttribute)
+ return true;
+ }
+ return false;
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcRequest.cs b/XmlRpcCS/XmlRpcRequest.cs
new file mode 100644
index 0000000..18d2182
--- /dev/null
+++ b/XmlRpcCS/XmlRpcRequest.cs
@@ -0,0 +1,150 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Xml;
+ using System.Net;
+ using System.Text;
+ using System.Reflection;
+ using System.Net.Security;
+ using System.Security.Cryptography.X509Certificates;
+
+ internal class AcceptAllCertificatePolicy : ICertificatePolicy
+ {
+ public AcceptAllCertificatePolicy()
+ {
+ }
+
+ public bool CheckValidationResult(ServicePoint sPoint,
+ System.Security.Cryptography.X509Certificates.X509Certificate cert,
+ WebRequest wRequest, int certProb)
+ {
+ // Always accept
+ return true;
+ }
+ }
+
+ /// Class supporting the request side of an XML-RPC transaction.
+ public class XmlRpcRequest
+ {
+ private String _methodName = null;
+ private Encoding _encoding = new ASCIIEncoding();
+ private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer();
+ private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer();
+
+ /// ArrayList containing the parameters.
+ protected IList _params = null;
+
+ /// Instantiate an XmlRpcRequest
+ public XmlRpcRequest()
+ {
+ _params = new ArrayList();
+ }
+
+ /// Instantiate an XmlRpcRequest for a specified method and parameters.
+ /// String designating the object.method on the server the request
+ /// should be directed to.
+ /// ArrayList of XML-RPC type parameters to invoke the request with.
+ public XmlRpcRequest(String methodName, IList parameters)
+ {
+ MethodName = methodName;
+ _params = parameters;
+ }
+
+ /// ArrayList conntaining the parameters for the request.
+ public virtual IList Params
+ {
+ get { return _params; }
+ }
+
+ /// String conntaining the method name, both object and method, that the request will be sent to.
+ public virtual String MethodName
+ {
+ get { return _methodName; }
+ set { _methodName = value; }
+ }
+
+ /// String object name portion of the method name.
+ public String MethodNameObject
+ {
+ get
+ {
+ int index = MethodName.IndexOf(".");
+
+ if (index == -1)
+ return MethodName;
+
+ return MethodName.Substring(0, index);
+ }
+ }
+
+ /// String method name portion of the object.method name.
+ public String MethodNameMethod
+ {
+ get
+ {
+ int index = MethodName.IndexOf(".");
+
+ if (index == -1)
+ return MethodName;
+
+ return MethodName.Substring(index + 1, MethodName.Length - index - 1);
+ }
+ }
+
+ /// Invoke this request on the server.
+ /// String The url of the XML-RPC server.
+ /// Object The value returned from the method invocation on the server.
+ /// If an exception generated on the server side.
+ public Object Invoke(String url)
+ {
+ XmlRpcResponse res = Send(url, 10000);
+
+ if (res.IsFault)
+ throw new XmlRpcException(res.FaultCode, res.FaultString);
+
+ return res.Value;
+ }
+
+ /// Send the request to the server.
+ /// String The url of the XML-RPC server.
+ /// Milliseconds before the connection times out.
+ /// XmlRpcResponse The response generated.
+ public XmlRpcResponse Send(String url, int timeout)
+ {
+ // Override SSL authentication mechanisms
+ ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();
+
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
+ if (request == null)
+ throw new XmlRpcException(XmlRpcErrorCodes.TRANSPORT_ERROR,
+ XmlRpcErrorCodes.TRANSPORT_ERROR_MSG + ": Could not create request with " + url);
+ request.Method = "POST";
+ request.ContentType = "text/xml";
+ request.AllowWriteStreamBuffering = true;
+ request.Timeout = timeout;
+
+ Stream stream = request.GetRequestStream();
+ XmlTextWriter xml = new XmlTextWriter(stream, _encoding);
+ _serializer.Serialize(xml, this);
+ xml.Flush();
+ xml.Close();
+
+ HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+ StreamReader input = new StreamReader(response.GetResponseStream());
+
+ XmlRpcResponse resp = (XmlRpcResponse)_deserializer.Deserialize(input);
+ input.Close();
+ response.Close();
+ return resp;
+ }
+
+ /// Produce String representation of the object.
+ /// String representation of the object.
+ override public String ToString()
+ {
+ return _serializer.Serialize(this);
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcRequestDeserializer.cs b/XmlRpcCS/XmlRpcRequestDeserializer.cs
new file mode 100644
index 0000000..0770b7e
--- /dev/null
+++ b/XmlRpcCS/XmlRpcRequestDeserializer.cs
@@ -0,0 +1,64 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Xml;
+
+ /// Class to deserialize XML data representing a request.
+ public class XmlRpcRequestDeserializer : XmlRpcDeserializer
+ {
+ static private XmlRpcRequestDeserializer _singleton;
+ /// A static singleton instance of this deserializer.
+ [Obsolete("This object is now thread safe, just use an instance.", false)]
+ static public XmlRpcRequestDeserializer Singleton
+ {
+ get
+ {
+ if (_singleton == null)
+ _singleton = new XmlRpcRequestDeserializer();
+
+ return _singleton;
+ }
+ }
+
+ /// Static method that parses XML data into a request using the Singleton.
+ /// StreamReader containing an XML-RPC request.
+ /// XmlRpcRequest object resulting from the parse.
+ override public Object Deserialize(TextReader xmlData)
+ {
+ XmlTextReader reader = new XmlTextReader(xmlData);
+ XmlRpcRequest request = new XmlRpcRequest();
+ bool done = false;
+
+ lock (this)
+ {
+ Reset();
+ while (!done && reader.Read())
+ {
+ DeserializeNode(reader); // Parent parse...
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.EndElement:
+ switch (reader.Name)
+ {
+ case METHOD_NAME:
+ request.MethodName = _text;
+ break;
+ case METHOD_CALL:
+ done = true;
+ break;
+ case PARAM:
+ request.Params.Add(_value);
+ _text = null;
+ break;
+ }
+ break;
+ }
+ }
+ }
+ return request;
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcRequestSerializer.cs b/XmlRpcCS/XmlRpcRequestSerializer.cs
new file mode 100644
index 0000000..8099bdb
--- /dev/null
+++ b/XmlRpcCS/XmlRpcRequestSerializer.cs
@@ -0,0 +1,51 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.Xml;
+ using System.IO;
+
+ /// Class responsible for serializing an XML-RPC request.
+ /// This class handles the request envelope, depending on XmlRpcSerializer
+ /// to serialize the payload.
+ ///
+ public class XmlRpcRequestSerializer : XmlRpcSerializer
+ {
+ static private XmlRpcRequestSerializer _singleton;
+ /// A static singleton instance of this deserializer.
+ static public XmlRpcRequestSerializer Singleton
+ {
+ get
+ {
+ if (_singleton == null)
+ _singleton = new XmlRpcRequestSerializer();
+
+ return _singleton;
+ }
+ }
+
+ /// Serialize the XmlRpcRequest to the output stream.
+ /// An XmlTextWriter stream to write data to.
+ /// An XmlRpcRequest to serialize.
+ ///
+ override public void Serialize(XmlTextWriter output, Object obj)
+ {
+ XmlRpcRequest request = (XmlRpcRequest)obj;
+ output.WriteStartDocument();
+ output.WriteStartElement(METHOD_CALL);
+ output.WriteElementString(METHOD_NAME, request.MethodName);
+ output.WriteStartElement(PARAMS);
+ foreach (Object param in request.Params)
+ {
+ output.WriteStartElement(PARAM);
+ output.WriteStartElement(VALUE);
+ SerializeObject(output, param);
+ output.WriteEndElement();
+ output.WriteEndElement();
+ }
+
+ output.WriteEndElement();
+ output.WriteEndElement();
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcResponder.cs b/XmlRpcCS/XmlRpcResponder.cs
new file mode 100644
index 0000000..0412568
--- /dev/null
+++ b/XmlRpcCS/XmlRpcResponder.cs
@@ -0,0 +1,98 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Xml;
+ using System.Net.Sockets;
+
+ /// The class is a container of the context of an XML-RPC dialog on the server side.
+ /// Instances of this class maintain the context for an individual XML-RPC server
+ /// side dialog. Namely they manage an inbound deserializer and an outbound serializer.
+ public class XmlRpcResponder
+ {
+ private XmlRpcRequestDeserializer _deserializer = new XmlRpcRequestDeserializer();
+ private XmlRpcResponseSerializer _serializer = new XmlRpcResponseSerializer();
+ private XmlRpcServer _server;
+ private TcpClient _client;
+ private SimpleHttpRequest _httpReq;
+
+ /// The SimpleHttpRequest based on the TcpClient.
+ public SimpleHttpRequest HttpReq
+ {
+ get { return _httpReq; }
+ }
+
+ /// Basic constructor.
+ /// XmlRpcServer that this XmlRpcResponder services.
+ /// TcpClient with the connection.
+ public XmlRpcResponder(XmlRpcServer server, TcpClient client)
+ {
+ _server = server;
+ _client = client;
+ _httpReq = new SimpleHttpRequest(_client);
+ }
+
+ /// Call close to insure proper shutdown.
+ ~XmlRpcResponder()
+ {
+ Close();
+ }
+
+ ///Respond using this responders HttpReq.
+ public void Respond()
+ {
+ Respond(HttpReq);
+ }
+
+ /// Handle an HTTP request containing an XML-RPC request.
+ /// This method deserializes the XML-RPC request, invokes the
+ /// described method, serializes the response (or fault) and sends the XML-RPC response
+ /// back as a valid HTTP page.
+ ///
+ /// SimpleHttpRequest containing the request.
+ public void Respond(SimpleHttpRequest httpReq)
+ {
+ XmlRpcRequest xmlRpcReq = (XmlRpcRequest)_deserializer.Deserialize(httpReq.Input);
+ XmlRpcResponse xmlRpcResp = new XmlRpcResponse();
+
+ try
+ {
+ xmlRpcResp.Value = _server.Invoke(xmlRpcReq);
+ }
+ catch (XmlRpcException e)
+ {
+ xmlRpcResp.SetFault(e.FaultCode, e.FaultString);
+ }
+ catch (Exception e2)
+ {
+ xmlRpcResp.SetFault(XmlRpcErrorCodes.APPLICATION_ERROR,
+ XmlRpcErrorCodes.APPLICATION_ERROR_MSG + ": " + e2.Message);
+ }
+
+ if (Logger.Delegate != null)
+ Logger.WriteEntry(xmlRpcResp.ToString(), LogLevel.Information);
+
+ XmlRpcServer.HttpHeader(httpReq.Protocol, "text/xml", 0, " 200 OK", httpReq.Output);
+ httpReq.Output.Flush();
+ XmlTextWriter xml = new XmlTextWriter(httpReq.Output);
+ _serializer.Serialize(xml, xmlRpcResp);
+ xml.Flush();
+ httpReq.Output.Flush();
+ }
+
+ ///Close all contained resources, both the HttpReq and client.
+ public void Close()
+ {
+ if (_httpReq != null)
+ {
+ _httpReq.Close();
+ _httpReq = null;
+ }
+
+ if (_client != null)
+ {
+ _client.Close();
+ _client = null;
+ }
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcResponse.cs b/XmlRpcCS/XmlRpcResponse.cs
new file mode 100644
index 0000000..8ff8354
--- /dev/null
+++ b/XmlRpcCS/XmlRpcResponse.cs
@@ -0,0 +1,85 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Xml;
+
+ /// Class designed to represent an XML-RPC response.
+ public class XmlRpcResponse
+ {
+ private Object _value;
+ /// bool indicating if this response represents a fault.
+ public bool IsFault;
+
+ /// Basic constructor
+ public XmlRpcResponse()
+ {
+ Value = null;
+ IsFault = false;
+ }
+
+ /// Constructor for a fault.
+ /// int the numeric faultCode value.
+ /// String the faultString value.
+ public XmlRpcResponse(int code, String message)
+ : this()
+ {
+ SetFault(code, message);
+ }
+
+ /// The data value of the response, may be fault data.
+ public Object Value
+ {
+ get { return _value; }
+ set
+ {
+ IsFault = false;
+ _value = value;
+ }
+ }
+
+ /// The faultCode if this is a fault.
+ public int FaultCode
+ {
+ get
+ {
+ if (!IsFault)
+ return 0;
+ else
+ return (int)((Hashtable)_value)[XmlRpcXmlTokens.FAULT_CODE];
+ }
+ }
+
+ /// The faultString if this is a fault.
+ public String FaultString
+ {
+ get
+ {
+ if (!IsFault)
+ return "";
+ else
+ return (String)((Hashtable)_value)[XmlRpcXmlTokens.FAULT_STRING];
+ }
+ }
+
+ /// Set this response to be a fault.
+ /// int the numeric faultCode value.
+ /// String the faultString value.
+ public void SetFault(int code, String message)
+ {
+ Hashtable fault = new Hashtable();
+ fault.Add("faultCode", code);
+ fault.Add("faultString", message);
+ Value = fault;
+ IsFault = true;
+ }
+
+ /// Form a useful string representation of the object, in this case the XML response.
+ /// String The XML serialized XML-RPC response.
+ override public String ToString()
+ {
+ return XmlRpcResponseSerializer.Singleton.Serialize(this);
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcResponseDeserializer.cs b/XmlRpcCS/XmlRpcResponseDeserializer.cs
new file mode 100644
index 0000000..032d8a3
--- /dev/null
+++ b/XmlRpcCS/XmlRpcResponseDeserializer.cs
@@ -0,0 +1,65 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Xml;
+
+ /// Class to deserialize XML data representing a response.
+ public class XmlRpcResponseDeserializer : XmlRpcDeserializer
+ {
+ static private XmlRpcResponseDeserializer _singleton;
+ /// A static singleton instance of this deserializer.
+ [Obsolete("This object is now thread safe, just use an instance.", false)]
+ static public XmlRpcResponseDeserializer Singleton
+ {
+ get
+ {
+ if (_singleton == null)
+ _singleton = new XmlRpcResponseDeserializer();
+
+ return _singleton;
+ }
+ }
+
+ /// Static method that parses XML data into a response using the Singleton.
+ /// StreamReader containing an XML-RPC response.
+ /// XmlRpcResponse object resulting from the parse.
+ override public Object Deserialize(TextReader xmlData)
+ {
+ XmlTextReader reader = new XmlTextReader(xmlData);
+ XmlRpcResponse response = new XmlRpcResponse();
+ bool done = false;
+
+ lock (this)
+ {
+ Reset();
+
+ while (!done && reader.Read())
+ {
+ DeserializeNode(reader); // Parent parse...
+ switch (reader.NodeType)
+ {
+ case XmlNodeType.EndElement:
+ switch (reader.Name)
+ {
+ case FAULT:
+ response.Value = _value;
+ response.IsFault = true;
+ break;
+ case PARAM:
+ response.Value = _value;
+ _value = null;
+ _text = null;
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return response;
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcResponseSerializer.cs b/XmlRpcCS/XmlRpcResponseSerializer.cs
new file mode 100644
index 0000000..72ca568
--- /dev/null
+++ b/XmlRpcCS/XmlRpcResponseSerializer.cs
@@ -0,0 +1,57 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.Xml;
+
+ /// Class responsible for serializing an XML-RPC response.
+ /// This class handles the response envelope, depending on XmlRpcSerializer
+ /// to serialize the payload.
+ ///
+ public class XmlRpcResponseSerializer : XmlRpcSerializer
+ {
+ static private XmlRpcResponseSerializer _singleton;
+ /// A static singleton instance of this deserializer.
+ static public XmlRpcResponseSerializer Singleton
+ {
+ get
+ {
+ if (_singleton == null)
+ _singleton = new XmlRpcResponseSerializer();
+
+ return _singleton;
+ }
+ }
+
+ /// Serialize the XmlRpcResponse to the output stream.
+ /// An XmlTextWriter stream to write data to.
+ /// An Object to serialize.
+ ///
+ override public void Serialize(XmlTextWriter output, Object obj)
+ {
+ XmlRpcResponse response = (XmlRpcResponse)obj;
+
+ output.WriteStartDocument();
+ output.WriteStartElement(METHOD_RESPONSE);
+
+ if (response.IsFault)
+ output.WriteStartElement(FAULT);
+ else
+ {
+ output.WriteStartElement(PARAMS);
+ output.WriteStartElement(PARAM);
+ }
+
+ output.WriteStartElement(VALUE);
+
+ SerializeObject(output, response.Value);
+
+ output.WriteEndElement();
+
+ output.WriteEndElement();
+ if (!response.IsFault)
+ output.WriteEndElement();
+ output.WriteEndElement();
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcSerializer.cs b/XmlRpcCS/XmlRpcSerializer.cs
new file mode 100644
index 0000000..0643d38
--- /dev/null
+++ b/XmlRpcCS/XmlRpcSerializer.cs
@@ -0,0 +1,109 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Xml;
+
+ /// Base class of classes serializing data to XML-RPC's XML format.
+ /// This class handles the basic type conversions like Integer to <i4>.
+ ///
+ public class XmlRpcSerializer : XmlRpcXmlTokens
+ {
+
+ /// Serialize the XmlRpcRequest to the output stream.
+ /// An XmlTextWriter stream to write data to.
+ /// An Object to serialize.
+ ///
+ virtual public void Serialize(XmlTextWriter output, Object obj)
+ {
+ }
+
+ /// Serialize the XmlRpcRequest to a String.
+ /// Note this may represent a real memory hog for a large request.
+ /// An Object to serialize.
+ /// String containing XML-RPC representation of the request.
+ ///
+ public String Serialize(Object obj)
+ {
+ StringWriter strBuf = new StringWriter();
+ XmlTextWriter xml = new XmlTextWriter(strBuf);
+ xml.Formatting = Formatting.Indented;
+ xml.Indentation = 4;
+ Serialize(xml, obj);
+ xml.Flush();
+ String returns = strBuf.ToString();
+ xml.Close();
+ return returns;
+ }
+
+ /// Serialize the object to the output stream.
+ /// An XmlTextWriter stream to write data to.
+ /// An Object to serialize.
+ public void SerializeObject(XmlTextWriter output, Object obj)
+ {
+ if (obj == null)
+ return;
+
+ if (obj is byte[])
+ {
+ byte[] ba = (byte[])obj;
+ output.WriteStartElement(BASE64);
+ output.WriteBase64(ba, 0, ba.Length);
+ output.WriteEndElement();
+ }
+ else if (obj is String)
+ {
+ output.WriteElementString(STRING, obj.ToString());
+ }
+ else if (obj is Int32)
+ {
+ output.WriteElementString(INT, obj.ToString());
+ }
+ else if (obj is DateTime)
+ {
+ output.WriteElementString(DATETIME, ((DateTime)obj).ToString(ISO_DATETIME));
+ }
+ else if (obj is Double)
+ {
+ output.WriteElementString(DOUBLE, obj.ToString());
+ }
+ else if (obj is Boolean)
+ {
+ output.WriteElementString(BOOLEAN, ((((Boolean)obj) == true) ? "1" : "0"));
+ }
+ else if (obj is IList)
+ {
+ output.WriteStartElement(ARRAY);
+ output.WriteStartElement(DATA);
+ if (((ArrayList)obj).Count > 0)
+ {
+ foreach (Object member in ((IList)obj))
+ {
+ output.WriteStartElement(VALUE);
+ SerializeObject(output, member);
+ output.WriteEndElement();
+ }
+ }
+ output.WriteEndElement();
+ output.WriteEndElement();
+ }
+ else if (obj is IDictionary)
+ {
+ IDictionary h = (IDictionary)obj;
+ output.WriteStartElement(STRUCT);
+ foreach (String key in h.Keys)
+ {
+ output.WriteStartElement(MEMBER);
+ output.WriteElementString(NAME, key);
+ output.WriteStartElement(VALUE);
+ SerializeObject(output, h[key]);
+ output.WriteEndElement();
+ output.WriteEndElement();
+ }
+ output.WriteEndElement();
+ }
+
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcServer.cs b/XmlRpcCS/XmlRpcServer.cs
new file mode 100644
index 0000000..1c226c1
--- /dev/null
+++ b/XmlRpcCS/XmlRpcServer.cs
@@ -0,0 +1,239 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Net;
+ using System.Net.Sockets;
+ using System.Text;
+ using System.Threading;
+ using System.Xml;
+
+ /// A restricted HTTP server for use with XML-RPC.
+ /// It only handles POST requests, and only POSTs representing XML-RPC calls.
+ /// In addition to dispatching requests it also provides a registry for request handlers.
+ ///
+ public class XmlRpcServer : IEnumerable
+ {
+#pragma warning disable 0414 // disable "private field assigned but not used"
+ const int RESPONDER_COUNT = 10;
+ private TcpListener _myListener;
+ private int _port;
+ private IPAddress _address;
+ private IDictionary _handlers;
+ private XmlRpcSystemObject _system;
+ private WaitCallback _wc;
+#pragma warning restore 0414
+
+ ///Constructor with port and address.
+ ///This constructor sets up a TcpListener listening on the
+ ///given port and address. It also calls a Thread on the method StartListen().
+ ///IPAddress value of the address to listen on.
+ ///Int value of the port to listen on.
+ public XmlRpcServer(IPAddress address, int port)
+ {
+ _port = port;
+ _address = address;
+ _handlers = new Hashtable();
+ _system = new XmlRpcSystemObject(this);
+ _wc = new WaitCallback(WaitCallback);
+ }
+
+ ///Basic constructor.
+ ///This constructor sets up a TcpListener listening on the
+ ///given port. It also calls a Thread on the method StartListen(). IPAddress.Any
+ ///is assumed as the address here.
+ ///Int value of the port to listen on.
+ public XmlRpcServer(int port) : this(IPAddress.Any, port) { }
+
+ /// Start the server.
+ public void Start()
+ {
+ try
+ {
+ Stop();
+ //start listing on the given port
+ // IPAddress addr = IPAddress.Parse("127.0.0.1");
+ lock (this)
+ {
+ _myListener = new TcpListener(IPAddress.Any, _port);
+ _myListener.Start();
+ //start the thread which calls the method 'StartListen'
+ Thread th = new Thread(new ThreadStart(StartListen));
+ th.Start();
+ }
+ }
+ catch (Exception e)
+ {
+ Logger.WriteEntry("An Exception Occurred while Listening :" + e.ToString(), LogLevel.Error);
+ }
+ }
+
+ /// Stop the server.
+ public void Stop()
+ {
+ try
+ {
+ if (_myListener != null)
+ {
+ lock (this)
+ {
+ _myListener.Stop();
+ _myListener = null;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Logger.WriteEntry("An Exception Occurred while stopping :" +
+ e.ToString(), LogLevel.Error);
+ }
+ }
+
+ /// Get an enumeration of my XML-RPC handlers.
+ /// IEnumerable the handler enumeration.
+ public IEnumerator GetEnumerator()
+ {
+ return _handlers.GetEnumerator();
+ }
+
+ /// Retrieve a handler by name.
+ /// String naming a handler
+ /// Object that is the handler.
+ public Object this[String name]
+ {
+ get { return _handlers[name]; }
+ }
+
+ ///
+ ///This method Accepts new connections and dispatches them when appropriate.
+ ///
+ public void StartListen()
+ {
+ while (true && _myListener != null)
+ {
+ //Accept a new connection
+ XmlRpcResponder responder = new XmlRpcResponder(this, _myListener.AcceptTcpClient());
+ ThreadPool.QueueUserWorkItem(_wc, responder);
+ }
+ }
+
+
+ ///
+ ///Add an XML-RPC handler object by name.
+ ///
+ ///String XML-RPC dispatch name of this object.
+ ///Object The object that is the XML-RPC handler.
+ public void Add(String name, Object obj)
+ {
+ _handlers.Add(name, obj);
+ }
+
+ ///Return a C# object.method name for and XML-RPC object.method name pair.
+ ///The XML-RPC object.method.
+ ///String of form object.method for the underlying C# method.
+ public String MethodName(String methodName)
+ {
+ int dotAt = methodName.LastIndexOf('.');
+
+ if (dotAt == -1)
+ {
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD,
+ XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Bad method name " + methodName);
+ }
+
+ String objectName = methodName.Substring(0, dotAt);
+ Object target = _handlers[objectName];
+
+ if (target == null)
+ {
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD,
+ XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Object " + objectName + " not found");
+ }
+
+ return target.GetType().FullName + "." + methodName.Substring(dotAt + 1);
+ }
+
+ ///Invoke a method described in a request.
+ ///XmlRpcRequest containing a method descriptions.
+ ///
+ ///
+ public Object Invoke(XmlRpcRequest req)
+ {
+ return Invoke(req.MethodNameObject, req.MethodNameMethod, req.Params);
+ }
+
+ ///Invoke a method on a named handler.
+ ///String The name of the handler.
+ ///String The name of the method to invoke on the handler.
+ ///IList The parameters to invoke the method with.
+ ///
+ public Object Invoke(String objectName, String methodName, IList parameters)
+ {
+ Object target = _handlers[objectName];
+
+ if (target == null)
+ {
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD,
+ XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Object " + objectName + " not found");
+ }
+
+ return XmlRpcSystemObject.Invoke(target, methodName, parameters);
+ }
+
+ /// The method the thread pool invokes when a thread is available to handle an HTTP request.
+ /// TcpClient from the socket accept.
+ public void WaitCallback(object responder)
+ {
+ XmlRpcResponder resp = (XmlRpcResponder)responder;
+
+ if (resp.HttpReq.HttpMethod == "POST")
+ {
+ try
+ {
+ resp.Respond();
+ }
+ catch (Exception e)
+ {
+ Logger.WriteEntry("Failed on post: " + e, LogLevel.Error);
+ }
+ }
+ else
+ {
+ Logger.WriteEntry("Only POST methods are supported: " + resp.HttpReq.HttpMethod +
+ " ignored", LogLevel.Error);
+ }
+
+ resp.Close();
+ }
+
+ ///
+ /// This function send the Header Information to the client (Browser)
+ ///
+ /// HTTP Version
+ /// Mime Type
+ /// Total Bytes to be sent in the body
+ ///
+ /// Socket reference
+ static public void HttpHeader(string sHttpVersion, string sMIMEHeader, long iTotBytes, string sStatusCode, TextWriter output)
+ {
+ String sBuffer = "";
+
+ // if Mime type is not provided set default to text/html
+ if (sMIMEHeader.Length == 0)
+ {
+ sMIMEHeader = "text/html"; // Default Mime Type is text/html
+ }
+
+ sBuffer += sHttpVersion + sStatusCode + "\r\n";
+ sBuffer += "Connection: close\r\n";
+ if (iTotBytes > 0)
+ sBuffer += "Content-Length: " + iTotBytes + "\r\n";
+ sBuffer += "Server: XmlRpcServer \r\n";
+ sBuffer += "Content-Type: " + sMIMEHeader + "\r\n";
+ sBuffer += "\r\n";
+
+ output.Write(sBuffer);
+ }
+ }
+}
diff --git a/XmlRpcCS/XmlRpcSystemObject.cs b/XmlRpcCS/XmlRpcSystemObject.cs
new file mode 100644
index 0000000..5f79951
--- /dev/null
+++ b/XmlRpcCS/XmlRpcSystemObject.cs
@@ -0,0 +1,252 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+ using System.Collections;
+ using System.Reflection;
+
+ /// XML-RPC System object implementation of extended specifications.
+ [XmlRpcExposed]
+ public class XmlRpcSystemObject
+ {
+ private XmlRpcServer _server;
+ static private IDictionary _methodHelp = new Hashtable();
+
+ /// Static IDictionary to hold mappings of method name to associated documentation String
+ static public IDictionary MethodHelp
+ {
+ get { return _methodHelp; }
+ }
+
+ /// Constructor.
+ /// XmlRpcServer server to be the system object for.
+ public XmlRpcSystemObject(XmlRpcServer server)
+ {
+ _server = server;
+ server.Add("system", this);
+ _methodHelp.Add(this.GetType().FullName + ".methodHelp", "Return a string description.");
+ }
+
+ /// Invoke a method on a given object.
+ /// Using reflection, and respecting the XmlRpcExposed attribute,
+ /// invoke the methodName method on the target
+ /// instance with the parameters provided. All this packages other Invoke methods
+ /// end up calling this.
+ /// Object the value the invoked method returns.
+ /// If method does not exist, is not exposed, parameters invalid, or invocation
+ /// results in an exception. Note, the XmlRpcException.Code will indicate cause.
+ static public Object Invoke(Object target, String methodName, IList parameters)
+ {
+ if (target == null)
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD,
+ XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Invalid target object.");
+
+ Type type = target.GetType();
+ MethodInfo method = type.GetMethod(methodName);
+
+ try
+ {
+ if (!XmlRpcExposedAttribute.ExposedMethod(target, methodName))
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD,
+ XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Method " + methodName + " is not exposed.");
+ }
+ catch (MissingMethodException me)
+ {
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD,
+ XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": " + me.Message);
+ }
+
+ Object[] args = new Object[parameters.Count];
+
+ int index = 0;
+ foreach (Object arg in parameters)
+ {
+ args[index] = arg;
+ index++;
+ }
+
+ try
+ {
+ Object retValue = method.Invoke(target, args);
+ if (retValue == null)
+ throw new XmlRpcException(XmlRpcErrorCodes.APPLICATION_ERROR,
+ XmlRpcErrorCodes.APPLICATION_ERROR_MSG + ": Method returned NULL.");
+ return retValue;
+ }
+ catch (XmlRpcException e)
+ {
+ throw e;
+ }
+ catch (ArgumentException ae)
+ {
+ Logger.WriteEntry(XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": " + ae.Message,
+ LogLevel.Information);
+ String call = methodName + "( ";
+ foreach (Object o in args)
+ {
+ call += o.GetType().Name;
+ call += " ";
+ }
+ call += ")";
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_PARAMS,
+ XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": Arguement type mismatch invoking " + call);
+ }
+ catch (TargetParameterCountException tpce)
+ {
+ Logger.WriteEntry(XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": " + tpce.Message,
+ LogLevel.Information);
+ throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_PARAMS,
+ XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": Arguement count mismatch invoking " + methodName);
+ }
+ catch (TargetInvocationException tie)
+ {
+ throw new XmlRpcException(XmlRpcErrorCodes.APPLICATION_ERROR,
+ XmlRpcErrorCodes.APPLICATION_ERROR_MSG + " Invoked method " + methodName + ": " + tie.Message);
+ }
+ }
+
+ /// List methods available on all handlers of this server.
+ /// IList An array of Strings, each String will have form "object.method".
+ [XmlRpcExposed]
+ public IList listMethods()
+ {
+ IList methods = new ArrayList();
+ Boolean considerExposure;
+
+ foreach (DictionaryEntry handlerEntry in _server)
+ {
+ considerExposure = XmlRpcExposedAttribute.IsExposed(handlerEntry.Value.GetType());
+
+ foreach (MemberInfo mi in handlerEntry.Value.GetType().GetMembers())
+ {
+ if (mi.MemberType != MemberTypes.Method)
+ continue;
+
+ if (!((MethodInfo)mi).IsPublic)
+ continue;
+
+ if (considerExposure && !XmlRpcExposedAttribute.IsExposed(mi))
+ continue;
+
+ methods.Add(handlerEntry.Key + "." + mi.Name);
+ }
+ }
+
+ return methods;
+ }
+
+ /// Given a method name return the possible signatures for it.
+ /// String The object.method name to look up.
+ /// IList Of arrays of signatures.
+ [XmlRpcExposed]
+ public IList methodSignature(String name)
+ {
+ IList signatures = new ArrayList();
+ int index = name.IndexOf('.');
+
+ if (index < 0)
+ return signatures;
+
+ String oName = name.Substring(0, index);
+ Object obj = _server[oName];
+
+ if (obj == null)
+ return signatures;
+
+ MemberInfo[] mi = obj.GetType().GetMember(name.Substring(index + 1));
+
+ if (mi == null || mi.Length != 1) // for now we want a single signature
+ return signatures;
+
+ MethodInfo method;
+
+ try
+ {
+ method = (MethodInfo)mi[0];
+ }
+ catch (Exception e)
+ {
+ Logger.WriteEntry("Attempted methodSignature call on " + mi[0] + " caused: " + e,
+ LogLevel.Information);
+ return signatures;
+ }
+
+ if (!method.IsPublic)
+ return signatures;
+
+ IList signature = new ArrayList();
+ signature.Add(method.ReturnType.Name);
+
+ foreach (ParameterInfo param in method.GetParameters())
+ {
+ signature.Add(param.ParameterType.Name);
+ }
+
+
+ signatures.Add(signature);
+
+ return signatures;
+ }
+
+ /// Help for given method signature. Not implemented yet.
+ /// String The object.method name to look up.
+ /// String help text. Rich HTML text.
+ [XmlRpcExposed]
+ public String methodHelp(String name)
+ {
+ String help = null;
+
+ try
+ {
+ help = (String)_methodHelp[_server.MethodName(name)];
+ }
+ catch (XmlRpcException e)
+ {
+ throw e;
+ }
+ catch (Exception) { /* ignored */ };
+
+ if (help == null)
+ help = "No help available for: " + name;
+
+ return help;
+ }
+
+ /// Boxcarring support method.
+ /// IList of calls
+ /// ArrayList of results/faults.
+ [XmlRpcExposed]
+ public IList multiCall(IList calls)
+ {
+ IList responses = new ArrayList();
+ XmlRpcResponse fault = new XmlRpcResponse();
+
+ foreach (IDictionary call in calls)
+ {
+ try
+ {
+ XmlRpcRequest req = new XmlRpcRequest((String)call[XmlRpcXmlTokens.METHOD_NAME],
+ (ArrayList)call[XmlRpcXmlTokens.PARAMS]);
+ Object results = _server.Invoke(req);
+ IList response = new ArrayList();
+ response.Add(results);
+ responses.Add(response);
+ }
+ catch (XmlRpcException e)
+ {
+ fault.SetFault(e.FaultCode, e.FaultString);
+ responses.Add(fault.Value);
+ }
+ catch (Exception e2)
+ {
+ fault.SetFault(XmlRpcErrorCodes.APPLICATION_ERROR,
+ XmlRpcErrorCodes.APPLICATION_ERROR_MSG + ": " + e2.Message);
+ responses.Add(fault.Value);
+ }
+ }
+
+ return responses;
+ }
+
+ }
+}
+
diff --git a/XmlRpcCS/XmlRpcXmlTokens.cs b/XmlRpcCS/XmlRpcXmlTokens.cs
new file mode 100644
index 0000000..50788bd
--- /dev/null
+++ b/XmlRpcCS/XmlRpcXmlTokens.cs
@@ -0,0 +1,76 @@
+namespace Nwc.XmlRpc
+{
+ using System;
+
+ /// Class collecting String tokens that are part of XML-RPC files.
+ public class XmlRpcXmlTokens
+ {
+ /// C# formatting string to describe an ISO 8601 date.
+ public const String ISO_DATETIME = "yyyyMMdd\\THH\\:mm\\:ss";
+ /// Base64 field indicator.
+ /// Corresponds to the <base64> tag.
+ public const String BASE64 = "base64";
+ /// String field indicator.
+ /// Corresponds to the <string> tag.
+ public const String STRING = "string";
+ /// Integer field integer.
+ /// Corresponds to the <i4> tag.
+ public const String INT = "i4";
+ /// Alternate integer field indicator.
+ /// Corresponds to the <int> tag.
+ public const String ALT_INT = "int";
+ /// Date field indicator.
+ /// Corresponds to the <dateTime.iso8601> tag.
+ public const String DATETIME = "dateTime.iso8601";
+ /// Boolean field indicator.
+ /// Corresponds to the <boolean> tag.
+ public const String BOOLEAN = "boolean";
+ /// Value token.
+ /// Corresponds to the <value> tag.
+ public const String VALUE = "value";
+ /// Name token.
+ /// Corresponds to the <name> tag.
+ public const String NAME = "name";
+ /// Array field indicator..
+ /// Corresponds to the <array> tag.
+ public const String ARRAY = "array";
+ /// Data token.
+ /// Corresponds to the <data> tag.
+ public const String DATA = "data";
+ /// Member token.
+ /// Corresponds to the <member> tag.
+ public const String MEMBER = "member";
+ /// Stuct field indicator.
+ /// Corresponds to the <struct> tag.
+ public const String STRUCT = "struct";
+ /// Double field indicator.
+ /// Corresponds to the <double> tag.
+ public const String DOUBLE = "double";
+ /// Param token.
+ /// Corresponds to the <param> tag.
+ public const String PARAM = "param";
+ /// Params token.
+ /// Corresponds to the <params> tag.
+ public const String PARAMS = "params";
+ /// MethodCall token.
+ /// Corresponds to the <methodCall> tag.
+ public const String METHOD_CALL = "methodCall";
+ /// MethodName token.
+ /// Corresponds to the <methodName> tag.
+ public const String METHOD_NAME = "methodName";
+ /// MethodResponse token
+ /// Corresponds to the <methodResponse> tag.
+ public const String METHOD_RESPONSE = "methodResponse";
+ /// Fault response token.
+ /// Corresponds to the <fault> tag.
+ public const String FAULT = "fault";
+ /// FaultCode token.
+ /// Corresponds to the <faultCode> tag.
+ public const String FAULT_CODE = "faultCode";
+ /// FaultString token.
+ /// Corresponds to the <faultString> tag.
+ public const String FAULT_STRING = "faultString";
+ }
+}
+
+
diff --git a/bin/libsecondlife.dll b/bin/libsecondlife.dll
index 89d692a..5d6a82e 100644
Binary files a/bin/libsecondlife.dll and b/bin/libsecondlife.dll differ
diff --git a/prebuild.xml b/prebuild.xml
index 73c8f4c..741fc6d 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -32,6 +32,28 @@
+
+
+
+
+ ../bin/
+
+
+
+
+ ../bin/
+
+
+
+ ../bin/
+
+
+
+
+
+
+
+
@@ -51,6 +73,7 @@
+
@@ -93,6 +116,7 @@
+
@@ -122,6 +146,7 @@
+
@@ -149,6 +174,7 @@
+
@@ -272,6 +298,7 @@
+
@@ -439,6 +466,7 @@
+
--
cgit v1.1