diff options
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.
48 files changed, 2539 insertions, 135 deletions
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 @@ | |||
98 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | 98 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> |
99 | <Private>False</Private> | 99 | <Private>False</Private> |
100 | </ProjectReference> | 100 | </ProjectReference> |
101 | <ProjectReference Include="..\XmlRpcCS\XMLRPC.csproj"> | ||
102 | <Name>XMLRPC</Name> | ||
103 | <Project>{8E81D43C-0000-0000-0000-000000000000}</Project> | ||
104 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | ||
105 | <Private>False</Private> | ||
106 | </ProjectReference> | ||
101 | </ItemGroup> | 107 | </ItemGroup> |
102 | <ItemGroup> | 108 | <ItemGroup> |
103 | <Compile Include="Main.cs"> | 109 | <Compile Include="Main.cs"> |
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 @@ | |||
28 | <include name="../bin/OpenSim.Servers.dll" /> | 28 | <include name="../bin/OpenSim.Servers.dll" /> |
29 | <include name="../bin/libsecondlife.dll" /> | 29 | <include name="../bin/libsecondlife.dll" /> |
30 | <include name="../bin/Db4objects.Db4o.dll" /> | 30 | <include name="../bin/Db4objects.Db4o.dll" /> |
31 | <include name="../bin/XMLRPC.dll" /> | ||
31 | </references> | 32 | </references> |
32 | </csc> | 33 | </csc> |
33 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> | 34 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> |
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 @@ | |||
98 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | 98 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> |
99 | <Private>False</Private> | 99 | <Private>False</Private> |
100 | </ProjectReference> | 100 | </ProjectReference> |
101 | <ProjectReference Include="..\XmlRpcCS\XMLRPC.csproj"> | ||
102 | <Name>XMLRPC</Name> | ||
103 | <Project>{8E81D43C-0000-0000-0000-000000000000}</Project> | ||
104 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | ||
105 | <Private>False</Private> | ||
106 | </ProjectReference> | ||
101 | </ItemGroup> | 107 | </ItemGroup> |
102 | <ItemGroup> | 108 | <ItemGroup> |
103 | <Compile Include="Main.cs"> | 109 | <Compile Include="Main.cs"> |
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 @@ | |||
27 | <include name="../bin/OpenSim.Servers.dll" /> | 27 | <include name="../bin/OpenSim.Servers.dll" /> |
28 | <include name="../bin/libsecondlife.dll" /> | 28 | <include name="../bin/libsecondlife.dll" /> |
29 | <include name="../bin/Db4objects.Db4o.dll" /> | 29 | <include name="../bin/Db4objects.Db4o.dll" /> |
30 | <include name="../bin/XMLRPC.dll" /> | ||
30 | </references> | 31 | </references> |
31 | </csc> | 32 | </csc> |
32 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> | 33 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> |
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; | |||
4 | using libsecondlife; | 4 | using libsecondlife; |
5 | using libsecondlife.Packets; | 5 | using libsecondlife.Packets; |
6 | using OpenSim.Framework.Types; | 6 | using OpenSim.Framework.Types; |
7 | using OpenSim.Framework.Utilities; | ||
7 | 8 | ||
8 | namespace OpenSim.Framework.Inventory | 9 | namespace OpenSim.Framework.Inventory |
9 | { | 10 | { |
@@ -114,9 +115,9 @@ namespace OpenSim.Framework.Inventory | |||
114 | Console.WriteLine("updating inventory item details"); | 115 | Console.WriteLine("updating inventory item details"); |
115 | if (this.InventoryItems.ContainsKey(itemID)) | 116 | if (this.InventoryItems.ContainsKey(itemID)) |
116 | { | 117 | { |
117 | Console.WriteLine("changing name to "+ Helpers.FieldToString(packet.Name)); | 118 | Console.WriteLine("changing name to "+ Util.FieldToString(packet.Name)); |
118 | InventoryItem Item = this.InventoryItems[itemID]; | 119 | InventoryItem Item = this.InventoryItems[itemID]; |
119 | Item.Name = Helpers.FieldToString(packet.Name); | 120 | Item.Name = Util.FieldToString(packet.Name); |
120 | Console.WriteLine("updated inventory item " + itemID.ToStringHyphenated()); | 121 | Console.WriteLine("updated inventory item " + itemID.ToStringHyphenated()); |
121 | //TODO need to update the rest of the info | 122 | //TODO need to update the rest of the info |
122 | } | 123 | } |
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 @@ | |||
76 | </Reference> | 76 | </Reference> |
77 | </ItemGroup> | 77 | </ItemGroup> |
78 | <ItemGroup> | 78 | <ItemGroup> |
79 | <ProjectReference Include="..\XmlRpcCS\XMLRPC.csproj"> | ||
80 | <Name>XMLRPC</Name> | ||
81 | <Project>{8E81D43C-0000-0000-0000-000000000000}</Project> | ||
82 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | ||
83 | <Private>False</Private> | ||
84 | </ProjectReference> | ||
79 | </ItemGroup> | 85 | </ItemGroup> |
80 | <ItemGroup> | 86 | <ItemGroup> |
81 | <Compile Include="AgentInventory.cs"> | 87 | <Compile Include="AgentInventory.cs"> |
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 @@ | |||
50 | <include name="System.Xml.dll" /> | 50 | <include name="System.Xml.dll" /> |
51 | <include name="../bin/libsecondlife.dll" /> | 51 | <include name="../bin/libsecondlife.dll" /> |
52 | <include name="../bin/Db4objects.Db4o.dll" /> | 52 | <include name="../bin/Db4objects.Db4o.dll" /> |
53 | <include name="../bin/XMLRPC.dll" /> | ||
53 | </references> | 54 | </references> |
54 | </csc> | 55 | </csc> |
55 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> | 56 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> |
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 | |||
36 | return id; | 36 | return id; |
37 | } | 37 | } |
38 | 38 | ||
39 | public static int fast_distance2d(int x, int y) | ||
40 | { | ||
41 | x = System.Math.Abs(x); | ||
42 | y = System.Math.Abs(y); | ||
43 | |||
44 | int min = System.Math.Min(x, y); | ||
45 | |||
46 | return (x + y - (min >> 1) - (min >> 2) + (min >> 4)); | ||
47 | } | ||
48 | |||
49 | public static string FieldToString(byte[] bytes) | ||
50 | { | ||
51 | return FieldToString(bytes, String.Empty); | ||
52 | } | ||
53 | |||
54 | /// <summary> | ||
55 | /// Convert a variable length field (byte array) to a string, with a | ||
56 | /// field name prepended to each line of the output | ||
57 | /// </summary> | ||
58 | /// <remarks>If the byte array has unprintable characters in it, a | ||
59 | /// hex dump will be put in the string instead</remarks> | ||
60 | /// <param name="bytes">The byte array to convert to a string</param> | ||
61 | /// <param name="fieldName">A field name to prepend to each line of output</param> | ||
62 | /// <returns>An ASCII string or a string containing a hex dump, minus | ||
63 | /// the null terminator</returns> | ||
64 | public static string FieldToString(byte[] bytes, string fieldName) | ||
65 | { | ||
66 | // Check for a common case | ||
67 | if (bytes.Length == 0) return String.Empty; | ||
68 | |||
69 | StringBuilder output = new StringBuilder(); | ||
70 | bool printable = true; | ||
71 | |||
72 | for (int i = 0; i < bytes.Length; ++i) | ||
73 | { | ||
74 | // Check if there are any unprintable characters in the array | ||
75 | if ((bytes[i] < 0x20 || bytes[i] > 0x7E) && bytes[i] != 0x09 | ||
76 | && bytes[i] != 0x0D && bytes[i] != 0x0A && bytes[i] != 0x00) | ||
77 | { | ||
78 | printable = false; | ||
79 | break; | ||
80 | } | ||
81 | } | ||
82 | |||
83 | if (printable) | ||
84 | { | ||
85 | if (fieldName.Length > 0) | ||
86 | { | ||
87 | output.Append(fieldName); | ||
88 | output.Append(": "); | ||
89 | } | ||
90 | |||
91 | if (bytes[bytes.Length - 1] == 0x00) | ||
92 | output.Append(UTF8Encoding.UTF8.GetString(bytes, 0, bytes.Length - 1)); | ||
93 | else | ||
94 | output.Append(UTF8Encoding.UTF8.GetString(bytes)); | ||
95 | } | ||
96 | else | ||
97 | { | ||
98 | for (int i = 0; i < bytes.Length; i += 16) | ||
99 | { | ||
100 | if (i != 0) | ||
101 | output.Append(Environment.NewLine); | ||
102 | if (fieldName.Length > 0) | ||
103 | { | ||
104 | output.Append(fieldName); | ||
105 | output.Append(": "); | ||
106 | } | ||
107 | |||
108 | for (int j = 0; j < 16; j++) | ||
109 | { | ||
110 | if ((i + j) < bytes.Length) | ||
111 | output.Append(String.Format("{0:X2} ", bytes[i + j])); | ||
112 | else | ||
113 | output.Append(" "); | ||
114 | } | ||
115 | |||
116 | for (int j = 0; j < 16 && (i + j) < bytes.Length; j++) | ||
117 | { | ||
118 | if (bytes[i + j] >= 0x20 && bytes[i + j] < 0x7E) | ||
119 | output.Append((char)bytes[i + j]); | ||
120 | else | ||
121 | output.Append("."); | ||
122 | } | ||
123 | } | ||
124 | } | ||
125 | |||
126 | return output.ToString(); | ||
127 | } | ||
39 | public Util() | 128 | public Util() |
40 | { | 129 | { |
41 | 130 | ||
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 @@ | |||
84 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | 84 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> |
85 | <Private>False</Private> | 85 | <Private>False</Private> |
86 | </ProjectReference> | 86 | </ProjectReference> |
87 | <ProjectReference Include="..\..\XmlRpcCS\XMLRPC.csproj"> | ||
88 | <Name>XMLRPC</Name> | ||
89 | <Project>{8E81D43C-0000-0000-0000-000000000000}</Project> | ||
90 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | ||
91 | <Private>False</Private> | ||
92 | </ProjectReference> | ||
87 | </ItemGroup> | 93 | </ItemGroup> |
88 | <ItemGroup> | 94 | <ItemGroup> |
89 | <Compile Include="AssemblyInfo.cs"> | 95 | <Compile Include="AssemblyInfo.cs"> |
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 @@ | |||
25 | <include name="../../bin/libsecondlife.dll" /> | 25 | <include name="../../bin/libsecondlife.dll" /> |
26 | <include name="../../bin/OpenSim.Framework.dll" /> | 26 | <include name="../../bin/OpenSim.Framework.dll" /> |
27 | <include name="../../bin/OpenSim.Framework.Console.dll" /> | 27 | <include name="../../bin/OpenSim.Framework.Console.dll" /> |
28 | <include name="../../bin/XMLRPC.dll" /> | ||
28 | </references> | 29 | </references> |
29 | </csc> | 30 | </csc> |
30 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../../bin/" /> | 31 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../../bin/" /> |
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 | |||
109 | {*/ | 109 | {*/ |
110 | actor.Position.Z = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1; | 110 | actor.Position.Z = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1; |
111 | //} | 111 | //} |
112 | 112 | ||
113 | 113 | ||
114 | 114 | ||
115 | // This code needs sorting out - border crossings etc | 115 | // This code needs sorting out - border crossings etc |
116 | /* if(actor.Position.X<0) | 116 | /* if(actor.Position.X<0) |
117 | { | 117 | { |
118 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); | 118 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); |
119 | actor.Position.X = 0; | 119 | actor.Position.X = 0; |
120 | actor.Velocity.X = 0; | 120 | actor.Velocity.X = 0; |
121 | } | 121 | } |
122 | if(actor.Position.Y < 0) | 122 | if(actor.Position.Y < 0) |
123 | { | 123 | { |
124 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); | 124 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); |
125 | actor.Position.Y = 0; | 125 | actor.Position.Y = 0; |
126 | actor.Velocity.Y = 0; | 126 | actor.Velocity.Y = 0; |
127 | } | 127 | } |
128 | if(actor.Position.X > 255) | 128 | if(actor.Position.X > 255) |
129 | { | 129 | { |
130 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); | 130 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); |
131 | actor.Position.X = 255; | 131 | actor.Position.X = 255; |
132 | actor.Velocity.X = 0; | 132 | actor.Velocity.X = 0; |
133 | } | 133 | } |
134 | if(actor.Position.Y > 255) | 134 | if(actor.Position.Y > 255) |
135 | { | 135 | { |
136 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); | 136 | ControllingClient.CrossSimBorder(new LLVector3(this.Position.X,this.Position.Y,this.Position.Z)); |
137 | actor.Position.Y = 255; | 137 | actor.Position.Y = 255; |
138 | actor.Velocity.X = 0; | 138 | actor.Velocity.X = 0; |
139 | }*/ | 139 | }*/ |
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 | |||
196 | if (this.transactions.ContainsKey(packet.InventoryBlock.TransactionID)) | 196 | if (this.transactions.ContainsKey(packet.InventoryBlock.TransactionID)) |
197 | { | 197 | { |
198 | AssetTransaction trans = this.transactions[packet.InventoryBlock.TransactionID]; | 198 | AssetTransaction trans = this.transactions[packet.InventoryBlock.TransactionID]; |
199 | trans.Asset.Description = Helpers.FieldToString(packet.InventoryBlock.Description); | 199 | trans.Asset.Description = Util.FieldToString(packet.InventoryBlock.Description); |
200 | trans.Asset.Name = Helpers.FieldToString(packet.InventoryBlock.Name); | 200 | trans.Asset.Name = Util.FieldToString(packet.InventoryBlock.Name); |
201 | trans.Asset.Type = packet.InventoryBlock.Type; | 201 | trans.Asset.Type = packet.InventoryBlock.Type; |
202 | trans.Asset.InvType = packet.InventoryBlock.InvType; | 202 | trans.Asset.InvType = packet.InventoryBlock.InvType; |
203 | if (trans.UploadComplete) | 203 | 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 @@ | |||
116 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | 116 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> |
117 | <Private>False</Private> | 117 | <Private>False</Private> |
118 | </ProjectReference> | 118 | </ProjectReference> |
119 | <ProjectReference Include="..\XmlRpcCS\XMLRPC.csproj"> | ||
120 | <Name>XMLRPC</Name> | ||
121 | <Project>{8E81D43C-0000-0000-0000-000000000000}</Project> | ||
122 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | ||
123 | <Private>False</Private> | ||
124 | </ProjectReference> | ||
119 | </ItemGroup> | 125 | </ItemGroup> |
120 | <ItemGroup> | 126 | <ItemGroup> |
121 | <Compile Include="AgentAssetUpload.cs"> | 127 | <Compile Include="AgentAssetUpload.cs"> |
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 @@ | |||
58 | <include name="../bin/OpenSim.GenericConfig.Xml.dll" /> | 58 | <include name="../bin/OpenSim.GenericConfig.Xml.dll" /> |
59 | <include name="../bin/OpenSim.Physics.Manager.dll" /> | 59 | <include name="../bin/OpenSim.Physics.Manager.dll" /> |
60 | <include name="../bin/OpenSim.Servers.dll" /> | 60 | <include name="../bin/OpenSim.Servers.dll" /> |
61 | <include name="../bin/XMLRPC.dll" /> | ||
61 | </references> | 62 | </references> |
62 | </csc> | 63 | </csc> |
63 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> | 64 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> |
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 | |||
374 | this.gridLocalAsset = Convert.ToBoolean(attri); | 374 | this.gridLocalAsset = Convert.ToBoolean(attri); |
375 | } | 375 | } |
376 | 376 | ||
377 | // Grid mode hack to use local asset server | 377 | // Grid mode hack to use local asset server |
378 | attri = ""; | 378 | attri = ""; |
379 | attri = configData.GetAttribute("PhysicsEngine"); | 379 | attri = configData.GetAttribute("PhysicsEngine"); |
380 | if (attri == "") | 380 | if (attri == "") |
@@ -437,6 +437,7 @@ namespace OpenSim | |||
437 | Packet packet = null; | 437 | Packet packet = null; |
438 | int numBytes = Server.EndReceiveFrom(result, ref epSender); | 438 | int numBytes = Server.EndReceiveFrom(result, ref epSender); |
439 | int packetEnd = numBytes - 1; | 439 | int packetEnd = numBytes - 1; |
440 | |||
440 | packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); | 441 | packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); |
441 | 442 | ||
442 | // This is either a new client or a packet to send to an old one | 443 | // This is either a new client or a packet to send to an old one |
@@ -509,6 +510,7 @@ namespace OpenSim | |||
509 | { // invalid client | 510 | { // invalid client |
510 | Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString()); | 511 | Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString()); |
511 | } | 512 | } |
513 | |||
512 | Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); | 514 | Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null); |
513 | } | 515 | } |
514 | 516 | ||
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 | |||
17 | public uint RegionLocX; | 17 | public uint RegionLocX; |
18 | public uint RegionLocY; | 18 | public uint RegionLocY; |
19 | public ulong RegionHandle; | 19 | public ulong RegionHandle; |
20 | public ushort RegionWaterHeight = 20; | ||
21 | public bool RegionTerraform = true; | ||
20 | 22 | ||
21 | public int IPListenPort; | 23 | public int IPListenPort; |
22 | public string IPListenAddr; | 24 | 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 | |||
491 | break; | 491 | break; |
492 | case PacketType.CreateInventoryFolder: | 492 | case PacketType.CreateInventoryFolder: |
493 | CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack; | 493 | CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack; |
494 | m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Helpers.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID); | 494 | m_inventoryCache.CreateNewInventoryFolder(this, invFolder.FolderData.FolderID, (ushort)invFolder.FolderData.Type, Util.FieldToString(invFolder.FolderData.Name), invFolder.FolderData.ParentID); |
495 | //Console.WriteLine(Pack.ToString()); | 495 | //Console.WriteLine(Pack.ToString()); |
496 | break; | 496 | break; |
497 | case PacketType.CreateInventoryItem: | 497 | case PacketType.CreateInventoryItem: |
@@ -603,7 +603,7 @@ namespace OpenSim | |||
603 | { | 603 | { |
604 | if (ent is OpenSim.world.Primitive) | 604 | if (ent is OpenSim.world.Primitive) |
605 | { | 605 | { |
606 | this.m_world.AddScript(ent, Helpers.FieldToString(assBase.Data)); | 606 | this.m_world.AddScript(ent, Util.FieldToString(assBase.Data)); |
607 | } | 607 | } |
608 | } | 608 | } |
609 | } | 609 | } |
@@ -1081,8 +1081,8 @@ namespace OpenSim | |||
1081 | { | 1081 | { |
1082 | //lets try this out with creating a notecard | 1082 | //lets try this out with creating a notecard |
1083 | AssetBase asset = new AssetBase(); | 1083 | AssetBase asset = new AssetBase(); |
1084 | asset.Name = Helpers.FieldToString(packet.InventoryBlock.Name); | 1084 | asset.Name = Util.FieldToString(packet.InventoryBlock.Name); |
1085 | asset.Description = Helpers.FieldToString(packet.InventoryBlock.Description); | 1085 | asset.Description = Util.FieldToString(packet.InventoryBlock.Description); |
1086 | asset.InvType = packet.InventoryBlock.InvType; | 1086 | asset.InvType = packet.InventoryBlock.InvType; |
1087 | asset.Type = packet.InventoryBlock.Type; | 1087 | asset.Type = packet.InventoryBlock.Type; |
1088 | asset.FullID = LLUUID.Random(); | 1088 | 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 | |||
32 | private ulong m_regionHandle; | 32 | private ulong m_regionHandle; |
33 | private Dictionary<uint, SimClient> m_clientThreads; | 33 | private Dictionary<uint, SimClient> m_clientThreads; |
34 | private string m_regionName; | 34 | private string m_regionName; |
35 | private ushort m_regionWaterHeight; | ||
36 | private bool m_regionTerraform; | ||
35 | //private bool childShadowAvatar = false; | 37 | //private bool childShadowAvatar = false; |
36 | 38 | ||
37 | public Avatar(SimClient TheClient, World world, string regionName, Dictionary<uint, SimClient> clientThreads, ulong regionHandle) | 39 | public Avatar(SimClient TheClient, World world, string regionName, Dictionary<uint, SimClient> clientThreads, ulong regionHandle, bool regionTerraform, ushort regionWater) |
38 | { | 40 | { |
39 | m_world = world; | 41 | m_world = world; |
40 | m_clientThreads = clientThreads; | 42 | m_clientThreads = clientThreads; |
41 | m_regionName = regionName; | 43 | m_regionName = regionName; |
42 | m_regionHandle = regionHandle; | 44 | m_regionHandle = regionHandle; |
45 | m_regionTerraform = regionTerraform; | ||
46 | m_regionWaterHeight = regionWater; | ||
43 | 47 | ||
44 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)"); | 48 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)"); |
45 | ControllingClient = TheClient; | 49 | ControllingClient = TheClient; |
@@ -139,7 +143,7 @@ namespace OpenSim.world | |||
139 | 143 | ||
140 | public void HandleUpdate(AgentUpdatePacket pack) | 144 | public void HandleUpdate(AgentUpdatePacket pack) |
141 | { | 145 | { |
142 | if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY) != 0) | 146 | if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0) |
143 | { | 147 | { |
144 | if (this._physActor.Flying == false) | 148 | if (this._physActor.Flying == false) |
145 | { | 149 | { |
@@ -160,7 +164,7 @@ namespace OpenSim.world | |||
160 | } | 164 | } |
161 | this._physActor.Flying = false; | 165 | this._physActor.Flying = false; |
162 | } | 166 | } |
163 | if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS) != 0) | 167 | if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_POS) != 0) |
164 | { | 168 | { |
165 | Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); | 169 | Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); |
166 | if (((movementflag & 1) == 0) || (q != this.bodyRot)) | 170 | if (((movementflag & 1) == 0) || (q != this.bodyRot)) |
@@ -194,7 +198,7 @@ namespace OpenSim.world | |||
194 | this.bodyRot = q; | 198 | this.bodyRot = q; |
195 | } | 199 | } |
196 | } | 200 | } |
197 | else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS) != 0) && (PhysicsEngineFlying)) | 201 | else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_UP_POS) != 0) && (PhysicsEngineFlying)) |
198 | { | 202 | { |
199 | if (((movementflag & 2) == 0) && this._physActor.Flying) | 203 | if (((movementflag & 2) == 0) && this._physActor.Flying) |
200 | { | 204 | { |
@@ -214,7 +218,7 @@ namespace OpenSim.world | |||
214 | movementflag = 2; | 218 | movementflag = 2; |
215 | } | 219 | } |
216 | } | 220 | } |
217 | else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG) != 0) && (PhysicsEngineFlying)) | 221 | else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) && (PhysicsEngineFlying)) |
218 | { | 222 | { |
219 | if (((movementflag & 4) == 0) && this._physActor.Flying) | 223 | if (((movementflag & 4) == 0) && this._physActor.Flying) |
220 | { | 224 | { |
@@ -235,7 +239,7 @@ namespace OpenSim.world | |||
235 | movementflag = 4; | 239 | movementflag = 4; |
236 | } | 240 | } |
237 | } | 241 | } |
238 | else if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG) != 0) | 242 | else if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_AT_NEG) != 0) |
239 | { | 243 | { |
240 | Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); | 244 | Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z); |
241 | if (((movementflag & 8) == 0) || (q != this.bodyRot)) | 245 | if (((movementflag & 8) == 0) || (q != this.bodyRot)) |
@@ -287,7 +291,7 @@ namespace OpenSim.world | |||
287 | } | 291 | } |
288 | } | 292 | } |
289 | 293 | ||
290 | //really really should be moved somewhere else | 294 | //really really should be moved somewhere else (RegionInfo.cs ?) |
291 | public void SendRegionHandshake(World RegionInfo) | 295 | public void SendRegionHandshake(World RegionInfo) |
292 | { | 296 | { |
293 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs:SendRegionHandshake() - Creating empty RegionHandshake packet"); | 297 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs:SendRegionHandshake() - Creating empty RegionHandshake packet"); |
@@ -306,8 +310,13 @@ namespace OpenSim.world | |||
306 | handshake.RegionInfo.TerrainStartHeight10 = 10; | 310 | handshake.RegionInfo.TerrainStartHeight10 = 10; |
307 | handshake.RegionInfo.TerrainStartHeight11 = 10; | 311 | handshake.RegionInfo.TerrainStartHeight11 = 10; |
308 | handshake.RegionInfo.SimAccess = 13; | 312 | handshake.RegionInfo.SimAccess = 13; |
309 | handshake.RegionInfo.WaterHeight = 20; | 313 | handshake.RegionInfo.WaterHeight = m_regionWaterHeight; |
310 | handshake.RegionInfo.RegionFlags = 72458694 - 32; | 314 | uint regionFlags = 72458694; |
315 | if (this.m_regionTerraform) | ||
316 | { | ||
317 | regionFlags -= 64; | ||
318 | } | ||
319 | handshake.RegionInfo.RegionFlags = regionFlags; | ||
311 | handshake.RegionInfo.SimName = _enc.GetBytes(m_regionName + "\0"); | 320 | handshake.RegionInfo.SimName = _enc.GetBytes(m_regionName + "\0"); |
312 | handshake.RegionInfo.SimOwner = new LLUUID("00000000-0000-0000-0000-000000000000"); | 321 | handshake.RegionInfo.SimOwner = new LLUUID("00000000-0000-0000-0000-000000000000"); |
313 | handshake.RegionInfo.TerrainBase0 = new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975"); | 322 | 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 | |||
272 | PData.PathTwist = objupdate.ObjectData[0].PathTwist = addPacket.ObjectData.PathTwist; | 272 | PData.PathTwist = objupdate.ObjectData[0].PathTwist = addPacket.ObjectData.PathTwist; |
273 | PData.PathTwistBegin = objupdate.ObjectData[0].PathTwistBegin = addPacket.ObjectData.PathTwistBegin; | 273 | PData.PathTwistBegin = objupdate.ObjectData[0].PathTwistBegin = addPacket.ObjectData.PathTwistBegin; |
274 | objupdate.ObjectData[0].ID = (uint)(localID); | 274 | objupdate.ObjectData[0].ID = (uint)(localID); |
275 | objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efef" + (localID - 702000).ToString("00000")); | 275 | objupdate.ObjectData[0].FullID = LLUUID.Random(); |
276 | LLVector3 pos1 = addPacket.ObjectData.RayEnd; | 276 | LLVector3 pos1 = addPacket.ObjectData.RayEnd; |
277 | //update position | 277 | //update position |
278 | byte[] pb = pos1.GetBytes(); | 278 | 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 | |||
542 | try | 542 | try |
543 | { | 543 | { |
544 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent"); | 544 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent"); |
545 | Avatar newAvatar = new Avatar(agentClient, this, m_regionName, m_clientThreads, m_regionHandle); | 545 | Avatar newAvatar = new Avatar(agentClient, this, m_regionName, m_clientThreads, m_regionHandle, true, 20); |
546 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Adding new avatar to world"); | 546 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Adding new avatar to world"); |
547 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Starting RegionHandshake "); | 547 | OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Starting RegionHandshake "); |
548 | newAvatar.SendRegionHandshake(this); | 548 | 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; | |||
8 | using OpenSim.Framework.Types; | 8 | using OpenSim.Framework.Types; |
9 | using OpenSim.Framework.Terrain; | 9 | using OpenSim.Framework.Terrain; |
10 | using OpenSim.Framework.Inventory; | 10 | using OpenSim.Framework.Inventory; |
11 | using OpenSim.Framework.Utilities; | ||
11 | using OpenSim.Assets; | 12 | using OpenSim.Assets; |
12 | 13 | ||
13 | namespace OpenSim.world | 14 | namespace OpenSim.world |
@@ -44,7 +45,7 @@ namespace OpenSim.world | |||
44 | { | 45 | { |
45 | System.Text.Encoding enc = System.Text.Encoding.ASCII; | 46 | System.Text.Encoding enc = System.Text.Encoding.ASCII; |
46 | ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)packet; | 47 | ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)packet; |
47 | if (Helpers.FieldToString(inchatpack.ChatData.Message) == "") | 48 | if (Util.FieldToString(inchatpack.ChatData.Message) == "") |
48 | { | 49 | { |
49 | //empty message so don't bother with it | 50 | //empty message so don't bother with it |
50 | return true; | 51 | return true; |
@@ -53,7 +54,7 @@ namespace OpenSim.world | |||
53 | libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); | 54 | libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket(); |
54 | reply.ChatData.Audible = 1; | 55 | reply.ChatData.Audible = 1; |
55 | reply.ChatData.Message = inchatpack.ChatData.Message; | 56 | reply.ChatData.Message = inchatpack.ChatData.Message; |
56 | reply.ChatData.ChatType = 1; | 57 | reply.ChatData.ChatType = inchatpack.ChatData.Type; |
57 | reply.ChatData.SourceType = 1; | 58 | reply.ChatData.SourceType = 1; |
58 | reply.ChatData.Position = simClient.ClientAvatar.Pos; | 59 | reply.ChatData.Position = simClient.ClientAvatar.Pos; |
59 | reply.ChatData.FromName = enc.GetBytes(simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname + "\0"); | 60 | reply.ChatData.FromName = enc.GetBytes(simClient.ClientAvatar.firstname + " " + simClient.ClientAvatar.lastname + "\0"); |
@@ -61,7 +62,31 @@ namespace OpenSim.world | |||
61 | reply.ChatData.SourceID = simClient.AgentID; | 62 | reply.ChatData.SourceID = simClient.AgentID; |
62 | foreach (SimClient client in m_clientThreads.Values) | 63 | foreach (SimClient client in m_clientThreads.Values) |
63 | { | 64 | { |
64 | client.OutPacket(reply); | 65 | switch (inchatpack.ChatData.Type) |
66 | { | ||
67 | case 0: | ||
68 | int dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X),(int)( client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); | ||
69 | if ((dis < 10) && (dis > -10)) | ||
70 | { | ||
71 | client.OutPacket(reply); | ||
72 | } | ||
73 | break; | ||
74 | case 1: | ||
75 | dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X), (int)(client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); | ||
76 | if ((dis < 30) && (dis > -30)) | ||
77 | { | ||
78 | client.OutPacket(reply); | ||
79 | } | ||
80 | break; | ||
81 | case 2: | ||
82 | dis = Util.fast_distance2d((int)(client.ClientAvatar.Pos.X - simClient.ClientAvatar.Pos.X),(int)( client.ClientAvatar.Pos.Y - simClient.ClientAvatar.Pos.Y)); | ||
83 | if ((dis < 100) && (dis > -100)) | ||
84 | { | ||
85 | client.OutPacket(reply); | ||
86 | } | ||
87 | break; | ||
88 | } | ||
89 | |||
65 | } | 90 | } |
66 | return true; | 91 | return true; |
67 | } | 92 | } |
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 @@ | |||
84 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | 84 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> |
85 | <Private>False</Private> | 85 | <Private>False</Private> |
86 | </ProjectReference> | 86 | </ProjectReference> |
87 | <ProjectReference Include="..\XmlRpcCS\XMLRPC.csproj"> | ||
88 | <Name>XMLRPC</Name> | ||
89 | <Project>{8E81D43C-0000-0000-0000-000000000000}</Project> | ||
90 | <Package>{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</Package> | ||
91 | <Private>False</Private> | ||
92 | </ProjectReference> | ||
87 | </ItemGroup> | 93 | </ItemGroup> |
88 | <ItemGroup> | 94 | <ItemGroup> |
89 | <Compile Include="BaseHttpServer.cs"> | 95 | <Compile Include="BaseHttpServer.cs"> |
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 @@ | |||
30 | <include name="../bin/OpenSim.Framework.dll" /> | 30 | <include name="../bin/OpenSim.Framework.dll" /> |
31 | <include name="../bin/OpenSim.Framework.Console.dll" /> | 31 | <include name="../bin/OpenSim.Framework.Console.dll" /> |
32 | <include name="../bin/libsecondlife.dll" /> | 32 | <include name="../bin/libsecondlife.dll" /> |
33 | <include name="../bin/XMLRPC.dll" /> | ||
33 | </references> | 34 | </references> |
34 | </csc> | 35 | </csc> |
35 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> | 36 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> |
diff --git a/OpenSim.build b/OpenSim.build index 71e631e..06743ed 100644 --- a/OpenSim.build +++ b/OpenSim.build | |||
@@ -54,22 +54,24 @@ | |||
54 | <nant buildfile="OpenSim/OpenSim.exe.build" target="clean" /> | 54 | <nant buildfile="OpenSim/OpenSim.exe.build" target="clean" /> |
55 | <nant buildfile="OpenSim.GenericConfig/Xml/OpenSim.GenericConfig.Xml.dll.build" target="clean" /> | 55 | <nant buildfile="OpenSim.GenericConfig/Xml/OpenSim.GenericConfig.Xml.dll.build" target="clean" /> |
56 | <nant buildfile="OpenSim.Physics/Manager/OpenSim.Physics.Manager.dll.build" target="clean" /> | 56 | <nant buildfile="OpenSim.Physics/Manager/OpenSim.Physics.Manager.dll.build" target="clean" /> |
57 | <nant buildfile="OpenSim.Scripting/EmbeddedJVM/OpenSim.Scripting.EmbeddedJVM.dll.build" target="clean" /> | ||
58 | <nant buildfile="OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build" target="clean" /> | 57 | <nant buildfile="OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build" target="clean" /> |
59 | <nant buildfile="OpenSim.Physics/BasicPhysicsPlugin/OpenSim.Physics.BasicPhysicsPlugin.dll.build" target="clean" /> | 58 | <nant buildfile="OpenSim.Physics/BasicPhysicsPlugin/OpenSim.Physics.BasicPhysicsPlugin.dll.build" target="clean" /> |
60 | <nant buildfile="OpenGrid.Config/GridConfigDb4o/OpenGrid.Config.GridConfigDb4o.dll.build" target="clean" /> | 59 | <nant buildfile="OpenGrid.Config/GridConfigDb4o/OpenGrid.Config.GridConfigDb4o.dll.build" target="clean" /> |
60 | <nant buildfile="OpenSim.Servers/OpenSim.Servers.dll.build" target="clean" /> | ||
61 | <nant buildfile="OpenSim.Physics/PhysXPlugin/OpenSim.Physics.PhysXPlugin.dll.build" target="clean" /> | 61 | <nant buildfile="OpenSim.Physics/PhysXPlugin/OpenSim.Physics.PhysXPlugin.dll.build" target="clean" /> |
62 | <nant buildfile="OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build" target="clean" /> | 62 | <nant buildfile="OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build" target="clean" /> |
63 | <nant buildfile="OpenSim.Framework/OpenSim.Framework.dll.build" target="clean" /> | 63 | <nant buildfile="OpenSim.Framework/OpenSim.Framework.dll.build" target="clean" /> |
64 | <nant buildfile="OpenSim.Servers/OpenSim.Servers.dll.build" target="clean" /> | 64 | <nant buildfile="OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build" target="clean" /> |
65 | <nant buildfile="OpenSim.Storage/LocalStorageDb4o/OpenSim.Storage.LocalStorageDb4o.dll.build" target="clean" /> | 65 | <nant buildfile="OpenSim.Storage/LocalStorageDb4o/OpenSim.Storage.LocalStorageDb4o.dll.build" target="clean" /> |
66 | <nant buildfile="OpenSim.Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build" target="clean" /> | 66 | <nant buildfile="OpenSim.Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build" target="clean" /> |
67 | <nant buildfile="OpenUser.Config/UserConfigDb4o/OpenUser.Config.UserConfigDb4o.dll.build" target="clean" /> | 67 | <nant buildfile="OpenUser.Config/UserConfigDb4o/OpenUser.Config.UserConfigDb4o.dll.build" target="clean" /> |
68 | <nant buildfile="OpenSim.Scripting/EmbeddedJVM/OpenSim.Scripting.EmbeddedJVM.dll.build" target="clean" /> | ||
68 | <nant buildfile="OpenSim.GridInterfaces/Local/OpenSim.GridInterfaces.Local.dll.build" target="clean" /> | 69 | <nant buildfile="OpenSim.GridInterfaces/Local/OpenSim.GridInterfaces.Local.dll.build" target="clean" /> |
69 | <nant buildfile="OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build" target="clean" /> | 70 | <nant buildfile="XmlRpcCS/XMLRPC.dll.build" target="clean" /> |
70 | </target> | 71 | </target> |
71 | 72 | ||
72 | <target name="build" depends="init" description=""> | 73 | <target name="build" depends="init" description=""> |
74 | <nant buildfile="XmlRpcCS/XMLRPC.dll.build" target="build" /> | ||
73 | <nant buildfile="OpenSim.Framework/OpenSim.Framework.dll.build" target="build" /> | 75 | <nant buildfile="OpenSim.Framework/OpenSim.Framework.dll.build" target="build" /> |
74 | <nant buildfile="OpenSim.Framework.Console/OpenSim.Framework.Console.dll.build" target="build" /> | 76 | <nant buildfile="OpenSim.Framework.Console/OpenSim.Framework.Console.dll.build" target="build" /> |
75 | <nant buildfile="OpenSim.Servers/OpenSim.Servers.dll.build" target="build" /> | 77 | <nant buildfile="OpenSim.Servers/OpenSim.Servers.dll.build" target="build" /> |
@@ -109,19 +111,20 @@ | |||
109 | <nant buildfile="OpenSim/OpenSim.exe.build" target="doc" /> | 111 | <nant buildfile="OpenSim/OpenSim.exe.build" target="doc" /> |
110 | <nant buildfile="OpenSim.GenericConfig/Xml/OpenSim.GenericConfig.Xml.dll.build" target="doc" /> | 112 | <nant buildfile="OpenSim.GenericConfig/Xml/OpenSim.GenericConfig.Xml.dll.build" target="doc" /> |
111 | <nant buildfile="OpenSim.Physics/Manager/OpenSim.Physics.Manager.dll.build" target="doc" /> | 113 | <nant buildfile="OpenSim.Physics/Manager/OpenSim.Physics.Manager.dll.build" target="doc" /> |
112 | <nant buildfile="OpenSim.Scripting/EmbeddedJVM/OpenSim.Scripting.EmbeddedJVM.dll.build" target="doc" /> | ||
113 | <nant buildfile="OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build" target="doc" /> | 114 | <nant buildfile="OpenGridServices.UserServer/OpenGridServices.UserServer.exe.build" target="doc" /> |
114 | <nant buildfile="OpenSim.Physics/BasicPhysicsPlugin/OpenSim.Physics.BasicPhysicsPlugin.dll.build" target="doc" /> | 115 | <nant buildfile="OpenSim.Physics/BasicPhysicsPlugin/OpenSim.Physics.BasicPhysicsPlugin.dll.build" target="doc" /> |
115 | <nant buildfile="OpenGrid.Config/GridConfigDb4o/OpenGrid.Config.GridConfigDb4o.dll.build" target="doc" /> | 116 | <nant buildfile="OpenGrid.Config/GridConfigDb4o/OpenGrid.Config.GridConfigDb4o.dll.build" target="doc" /> |
117 | <nant buildfile="OpenSim.Servers/OpenSim.Servers.dll.build" target="doc" /> | ||
116 | <nant buildfile="OpenSim.Physics/PhysXPlugin/OpenSim.Physics.PhysXPlugin.dll.build" target="doc" /> | 118 | <nant buildfile="OpenSim.Physics/PhysXPlugin/OpenSim.Physics.PhysXPlugin.dll.build" target="doc" /> |
117 | <nant buildfile="OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build" target="doc" /> | 119 | <nant buildfile="OpenSim.GridInterfaces/Remote/OpenSim.GridInterfaces.Remote.dll.build" target="doc" /> |
118 | <nant buildfile="OpenSim.Framework/OpenSim.Framework.dll.build" target="doc" /> | 120 | <nant buildfile="OpenSim.Framework/OpenSim.Framework.dll.build" target="doc" /> |
119 | <nant buildfile="OpenSim.Servers/OpenSim.Servers.dll.build" target="doc" /> | 121 | <nant buildfile="OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build" target="doc" /> |
120 | <nant buildfile="OpenSim.Storage/LocalStorageDb4o/OpenSim.Storage.LocalStorageDb4o.dll.build" target="doc" /> | 122 | <nant buildfile="OpenSim.Storage/LocalStorageDb4o/OpenSim.Storage.LocalStorageDb4o.dll.build" target="doc" /> |
121 | <nant buildfile="OpenSim.Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build" target="doc" /> | 123 | <nant buildfile="OpenSim.Storage/LocalStorageSQLite/OpenSim.Storage.LocalStorageSQLite.dll.build" target="doc" /> |
122 | <nant buildfile="OpenUser.Config/UserConfigDb4o/OpenUser.Config.UserConfigDb4o.dll.build" target="doc" /> | 124 | <nant buildfile="OpenUser.Config/UserConfigDb4o/OpenUser.Config.UserConfigDb4o.dll.build" target="doc" /> |
125 | <nant buildfile="OpenSim.Scripting/EmbeddedJVM/OpenSim.Scripting.EmbeddedJVM.dll.build" target="doc" /> | ||
123 | <nant buildfile="OpenSim.GridInterfaces/Local/OpenSim.GridInterfaces.Local.dll.build" target="doc" /> | 126 | <nant buildfile="OpenSim.GridInterfaces/Local/OpenSim.GridInterfaces.Local.dll.build" target="doc" /> |
124 | <nant buildfile="OpenGridServices.GridServer/OpenGridServices.GridServer.exe.build" target="doc" /> | 127 | <nant buildfile="XmlRpcCS/XMLRPC.dll.build" target="doc" /> |
125 | </target> | 128 | </target> |
126 | 129 | ||
127 | </project> | 130 | </project> |
diff --git a/OpenSim.sln b/OpenSim.sln index aefeb45..aa84470 100644 --- a/OpenSim.sln +++ b/OpenSim.sln | |||
@@ -1,5 +1,5 @@ | |||
1 | Microsoft Visual Studio Solution File, Format Version 9.00 | 1 | Microsoft Visual Studio Solution File, Format Version 9.00 |
2 | # Visual C# Express 2005 | 2 | # Visual Studio 2005 |
3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Terrain.BasicTerrain", "OpenSim.Terrain.BasicTerrain\OpenSim.Terrain.BasicTerrain.csproj", "{2270B8FE-0000-0000-0000-000000000000}" | 3 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Terrain.BasicTerrain", "OpenSim.Terrain.BasicTerrain\OpenSim.Terrain.BasicTerrain.csproj", "{2270B8FE-0000-0000-0000-000000000000}" |
4 | EndProject | 4 | EndProject |
5 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.RegionServer", "OpenSim.RegionServer\OpenSim.RegionServer.csproj", "{632E1BFD-0000-0000-0000-000000000000}" | 5 | 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", | |||
16 | EndProject | 16 | EndProject |
17 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.Manager", "OpenSim.Physics\Manager\OpenSim.Physics.Manager.csproj", "{8BE16150-0000-0000-0000-000000000000}" | 17 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.Manager", "OpenSim.Physics\Manager\OpenSim.Physics.Manager.csproj", "{8BE16150-0000-0000-0000-000000000000}" |
18 | EndProject | 18 | EndProject |
19 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Scripting.EmbeddedJVM", "OpenSim.Scripting\EmbeddedJVM\OpenSim.Scripting.EmbeddedJVM.csproj", "{97A82740-0000-0000-0000-000000000000}" | ||
20 | EndProject | ||
21 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.UserServer", "OpenGridServices.UserServer\OpenGridServices.UserServer.csproj", "{66591469-0000-0000-0000-000000000000}" | 19 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.UserServer", "OpenGridServices.UserServer\OpenGridServices.UserServer.csproj", "{66591469-0000-0000-0000-000000000000}" |
22 | EndProject | 20 | EndProject |
23 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.BasicPhysicsPlugin", "OpenSim.Physics\BasicPhysicsPlugin\OpenSim.Physics.BasicPhysicsPlugin.csproj", "{4F874463-0000-0000-0000-000000000000}" | 21 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.BasicPhysicsPlugin", "OpenSim.Physics\BasicPhysicsPlugin\OpenSim.Physics.BasicPhysicsPlugin.csproj", "{4F874463-0000-0000-0000-000000000000}" |
24 | EndProject | 22 | EndProject |
25 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGrid.Config.GridConfigDb4o", "OpenGrid.Config\GridConfigDb4o\OpenGrid.Config.GridConfigDb4o.csproj", "{B0027747-0000-0000-0000-000000000000}" | 23 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGrid.Config.GridConfigDb4o", "OpenGrid.Config\GridConfigDb4o\OpenGrid.Config.GridConfigDb4o.csproj", "{B0027747-0000-0000-0000-000000000000}" |
26 | EndProject | 24 | EndProject |
25 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Servers", "OpenSim.Servers\OpenSim.Servers.csproj", "{8BB20F0A-0000-0000-0000-000000000000}" | ||
26 | EndProject | ||
27 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.PhysXPlugin", "OpenSim.Physics\PhysXPlugin\OpenSim.Physics.PhysXPlugin.csproj", "{988F0AC4-0000-0000-0000-000000000000}" | 27 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Physics.PhysXPlugin", "OpenSim.Physics\PhysXPlugin\OpenSim.Physics.PhysXPlugin.csproj", "{988F0AC4-0000-0000-0000-000000000000}" |
28 | EndProject | 28 | EndProject |
29 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridInterfaces.Remote", "OpenSim.GridInterfaces\Remote\OpenSim.GridInterfaces.Remote.csproj", "{B55C0B5D-0000-0000-0000-000000000000}" | 29 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridInterfaces.Remote", "OpenSim.GridInterfaces\Remote\OpenSim.GridInterfaces.Remote.csproj", "{B55C0B5D-0000-0000-0000-000000000000}" |
30 | EndProject | 30 | EndProject |
31 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework", "OpenSim.Framework\OpenSim.Framework.csproj", "{8ACA2445-0000-0000-0000-000000000000}" | 31 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework", "OpenSim.Framework\OpenSim.Framework.csproj", "{8ACA2445-0000-0000-0000-000000000000}" |
32 | EndProject | 32 | EndProject |
33 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Servers", "OpenSim.Servers\OpenSim.Servers.csproj", "{8BB20F0A-0000-0000-0000-000000000000}" | 33 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.GridServer", "OpenGridServices.GridServer\OpenGridServices.GridServer.csproj", "{21BFC8E2-0000-0000-0000-000000000000}" |
34 | EndProject | 34 | EndProject |
35 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Storage.LocalStorageDb4o", "OpenSim.Storage\LocalStorageDb4o\OpenSim.Storage.LocalStorageDb4o.csproj", "{E1B79ECF-0000-0000-0000-000000000000}" | 35 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Storage.LocalStorageDb4o", "OpenSim.Storage\LocalStorageDb4o\OpenSim.Storage.LocalStorageDb4o.csproj", "{E1B79ECF-0000-0000-0000-000000000000}" |
36 | EndProject | 36 | EndProject |
@@ -38,102 +38,156 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Storage.LocalStorag | |||
38 | EndProject | 38 | EndProject |
39 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenUser.Config.UserConfigDb4o", "OpenUser.Config\UserConfigDb4o\OpenUser.Config.UserConfigDb4o.csproj", "{7E494328-0000-0000-0000-000000000000}" | 39 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenUser.Config.UserConfigDb4o", "OpenUser.Config\UserConfigDb4o\OpenUser.Config.UserConfigDb4o.csproj", "{7E494328-0000-0000-0000-000000000000}" |
40 | EndProject | 40 | EndProject |
41 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Scripting.EmbeddedJVM", "OpenSim.Scripting\EmbeddedJVM\OpenSim.Scripting.EmbeddedJVM.csproj", "{97A82740-0000-0000-0000-000000000000}" | ||
42 | EndProject | ||
41 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridInterfaces.Local", "OpenSim.GridInterfaces\Local\OpenSim.GridInterfaces.Local.csproj", "{546099CD-0000-0000-0000-000000000000}" | 43 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.GridInterfaces.Local", "OpenSim.GridInterfaces\Local\OpenSim.GridInterfaces.Local.csproj", "{546099CD-0000-0000-0000-000000000000}" |
42 | EndProject | 44 | EndProject |
43 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenGridServices.GridServer", "OpenGridServices.GridServer\OpenGridServices.GridServer.csproj", "{21BFC8E2-0000-0000-0000-000000000000}" | 45 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLRPC", "XmlRpcCS\XMLRPC.csproj", "{8E81D43C-0000-0000-0000-000000000000}" |
44 | EndProject | 46 | EndProject |
45 | Global | 47 | Global |
46 | GlobalSection(SolutionConfigurationPlatforms) = preSolution | 48 | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
47 | Debug|Any CPU = Debug|Any CPU | 49 | Debug|Any CPU = Debug|Any CPU |
48 | Release|Any CPU = Release|Any CPU | 50 | Release|Any CPU = Release|Any CPU |
49 | EndGlobalSection | 51 | EndGlobalSection |
50 | GlobalSection(ProjectConfigurationPlatforms) = postSolution | 52 | GlobalSection(ProjectDependencies) = postSolution |
51 | {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 53 | ({632E1BFD-0000-0000-0000-000000000000}).5 = ({2270B8FE-0000-0000-0000-000000000000}) |
52 | {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 54 | ({632E1BFD-0000-0000-0000-000000000000}).6 = ({8ACA2445-0000-0000-0000-000000000000}) |
53 | {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 55 | ({632E1BFD-0000-0000-0000-000000000000}).7 = ({A7CD0630-0000-0000-0000-000000000000}) |
54 | {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 56 | ({632E1BFD-0000-0000-0000-000000000000}).8 = ({E88EF749-0000-0000-0000-000000000000}) |
55 | {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 57 | ({632E1BFD-0000-0000-0000-000000000000}).9 = ({8BE16150-0000-0000-0000-000000000000}) |
56 | {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 58 | ({632E1BFD-0000-0000-0000-000000000000}).10 = ({8BB20F0A-0000-0000-0000-000000000000}) |
57 | {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 59 | ({632E1BFD-0000-0000-0000-000000000000}).11 = ({8E81D43C-0000-0000-0000-000000000000}) |
58 | {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 60 | ({63A05FE9-0000-0000-0000-000000000000}).2 = ({8BE16150-0000-0000-0000-000000000000}) |
59 | {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 61 | ({EE9E5D96-0000-0000-0000-000000000000}).6 = ({8ACA2445-0000-0000-0000-000000000000}) |
60 | {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 62 | ({EE9E5D96-0000-0000-0000-000000000000}).7 = ({A7CD0630-0000-0000-0000-000000000000}) |
61 | {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 63 | ({438A9556-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000}) |
62 | {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 64 | ({438A9556-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000}) |
63 | {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 65 | ({438A9556-0000-0000-0000-000000000000}).7 = ({8BE16150-0000-0000-0000-000000000000}) |
64 | {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 66 | ({438A9556-0000-0000-0000-000000000000}).8 = ({8BB20F0A-0000-0000-0000-000000000000}) |
65 | {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 67 | ({438A9556-0000-0000-0000-000000000000}).9 = ({632E1BFD-0000-0000-0000-000000000000}) |
66 | {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 68 | ({E88EF749-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000}) |
67 | {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 69 | ({8BE16150-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000}) |
68 | {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 70 | ({8BE16150-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000}) |
69 | {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 71 | ({66591469-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000}) |
70 | {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 72 | ({66591469-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000}) |
71 | {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 73 | ({66591469-0000-0000-0000-000000000000}).5 = ({8BB20F0A-0000-0000-0000-000000000000}) |
72 | {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 74 | ({66591469-0000-0000-0000-000000000000}).8 = ({8E81D43C-0000-0000-0000-000000000000}) |
73 | {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 75 | ({4F874463-0000-0000-0000-000000000000}).2 = ({8BE16150-0000-0000-0000-000000000000}) |
74 | {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 76 | ({B0027747-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000}) |
75 | {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 77 | ({B0027747-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000}) |
76 | {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 78 | ({8BB20F0A-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000}) |
77 | {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 79 | ({8BB20F0A-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000}) |
78 | {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 80 | ({8BB20F0A-0000-0000-0000-000000000000}).5 = ({8E81D43C-0000-0000-0000-000000000000}) |
79 | {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 81 | ({988F0AC4-0000-0000-0000-000000000000}).3 = ({8BE16150-0000-0000-0000-000000000000}) |
80 | {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 82 | ({B55C0B5D-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000}) |
81 | {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 83 | ({B55C0B5D-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000}) |
82 | {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 84 | ({B55C0B5D-0000-0000-0000-000000000000}).5 = ({8E81D43C-0000-0000-0000-000000000000}) |
83 | {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 85 | ({8ACA2445-0000-0000-0000-000000000000}).4 = ({8E81D43C-0000-0000-0000-000000000000}) |
84 | {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 86 | ({21BFC8E2-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000}) |
85 | {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 87 | ({21BFC8E2-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000}) |
86 | {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 88 | ({21BFC8E2-0000-0000-0000-000000000000}).5 = ({8BB20F0A-0000-0000-0000-000000000000}) |
87 | {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 89 | ({21BFC8E2-0000-0000-0000-000000000000}).8 = ({8E81D43C-0000-0000-0000-000000000000}) |
88 | {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 90 | ({E1B79ECF-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000}) |
89 | {66591469-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 91 | ({E1B79ECF-0000-0000-0000-000000000000}).5 = ({A7CD0630-0000-0000-0000-000000000000}) |
90 | {66591469-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 92 | ({6B20B603-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000}) |
91 | {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 93 | ({6B20B603-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000}) |
92 | {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 94 | ({7E494328-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000}) |
93 | {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 95 | ({7E494328-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000}) |
94 | {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 96 | ({97A82740-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000}) |
95 | {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 97 | ({546099CD-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000}) |
96 | {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 98 | ({546099CD-0000-0000-0000-000000000000}).5 = ({A7CD0630-0000-0000-0000-000000000000}) |
97 | {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 99 | EndGlobalSection |
98 | {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 100 | GlobalSection(ProjectConfigurationPlatforms) = postSolution |
99 | {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 101 | {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
100 | {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 102 | {2270B8FE-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
101 | {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 103 | {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
102 | {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 104 | {2270B8FE-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
103 | {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 105 | {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
104 | {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 106 | {632E1BFD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
105 | {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 107 | {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
106 | {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 108 | {632E1BFD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
107 | {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 109 | {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
108 | {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 110 | {63A05FE9-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
109 | {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 111 | {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
110 | {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 112 | {63A05FE9-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
111 | {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 113 | {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
112 | {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 114 | {A7CD0630-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
113 | {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 115 | {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
114 | {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 116 | {A7CD0630-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
115 | {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 117 | {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
116 | {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 118 | {EE9E5D96-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
117 | {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 119 | {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
118 | {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 120 | {EE9E5D96-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
119 | {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 121 | {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
120 | {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 122 | {438A9556-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
121 | {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 123 | {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
122 | {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 124 | {438A9556-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
123 | {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 125 | {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
124 | {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 126 | {E88EF749-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
125 | {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 127 | {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
126 | {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 128 | {E88EF749-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
127 | {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 129 | {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
128 | {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 130 | {8BE16150-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
129 | {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 131 | {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
130 | {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 132 | {8BE16150-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
131 | {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 133 | {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
132 | {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | 134 | {66591469-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
133 | {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | 135 | {66591469-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
134 | {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | 136 | {66591469-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
135 | EndGlobalSection | 137 | {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
136 | GlobalSection(SolutionProperties) = preSolution | 138 | {4F874463-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU |
137 | HideSolutionNode = FALSE | 139 | {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU |
138 | EndGlobalSection | 140 | {4F874463-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU |
141 | {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
142 | {B0027747-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
143 | {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
144 | {B0027747-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
145 | {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
146 | {8BB20F0A-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
147 | {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
148 | {8BB20F0A-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
149 | {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
150 | {988F0AC4-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
151 | {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
152 | {988F0AC4-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
153 | {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
154 | {B55C0B5D-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
155 | {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
156 | {B55C0B5D-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
157 | {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
158 | {8ACA2445-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
159 | {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
160 | {8ACA2445-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
161 | {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
162 | {21BFC8E2-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
163 | {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
164 | {21BFC8E2-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
165 | {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
166 | {E1B79ECF-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
167 | {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
168 | {E1B79ECF-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
169 | {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
170 | {6B20B603-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
171 | {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
172 | {6B20B603-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
173 | {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
174 | {7E494328-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
175 | {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
176 | {7E494328-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
177 | {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
178 | {97A82740-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
179 | {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
180 | {97A82740-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
181 | {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
182 | {546099CD-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
183 | {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
184 | {546099CD-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
185 | {8E81D43C-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
186 | {8E81D43C-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
187 | {8E81D43C-0000-0000-0000-000000000000}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
188 | {8E81D43C-0000-0000-0000-000000000000}.Release|Any CPU.Build.0 = Release|Any CPU | ||
189 | EndGlobalSection | ||
190 | GlobalSection(SolutionProperties) = preSolution | ||
191 | HideSolutionNode = FALSE | ||
192 | EndGlobalSection | ||
139 | EndGlobal | 193 | 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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | |||
5 | /// <summary>Define levels of logging.</summary><remarks> This duplicates | ||
6 | /// similar enumerations in System.Diagnostics.EventLogEntryType. The | ||
7 | /// duplication was merited because .NET Compact Framework lacked the EventLogEntryType enum.</remarks> | ||
8 | public enum LogLevel | ||
9 | { | ||
10 | /// <summary>Information level, log entry for informational reasons only.</summary> | ||
11 | Information, | ||
12 | /// <summary>Warning level, indicates a possible problem.</summary> | ||
13 | Warning, | ||
14 | /// <summary>Error level, implies a significant problem.</summary> | ||
15 | Error | ||
16 | } | ||
17 | |||
18 | ///<summary> | ||
19 | ///Logging singleton with swappable output delegate. | ||
20 | ///</summary> | ||
21 | ///<remarks> | ||
22 | ///This singleton provides a centralized log. The actual WriteEntry calls are passed | ||
23 | ///off to a delegate however. Having a delegate do the actual logginh allows you to | ||
24 | ///implement different logging mechanism and have them take effect throughout the system. | ||
25 | ///</remarks> | ||
26 | public class Logger | ||
27 | { | ||
28 | ///<summary>Delegate definition for logging.</summary> | ||
29 | ///<param name="message">The message <c>String</c> to log.</param> | ||
30 | ///<param name="level">The <c>LogLevel</c> of your message.</param> | ||
31 | public delegate void LoggerDelegate(String message, LogLevel level); | ||
32 | ///<summary>The LoggerDelegate that will recieve WriteEntry requests.</summary> | ||
33 | static public LoggerDelegate Delegate = null; | ||
34 | |||
35 | ///<summary> | ||
36 | ///Method logging events are sent to. | ||
37 | ///</summary> | ||
38 | ///<param name="message">The message <c>String</c> to log.</param> | ||
39 | ///<param name="level">The <c>LogLevel</c> of your message.</param> | ||
40 | static public void WriteEntry(String message, LogLevel level) | ||
41 | { | ||
42 | if (Delegate != null) | ||
43 | Delegate(message, level); | ||
44 | } | ||
45 | } | ||
46 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.IO; | ||
5 | using System.Net.Sockets; | ||
6 | using System.Collections; | ||
7 | |||
8 | ///<summary>Very basic HTTP request handler.</summary> | ||
9 | ///<remarks>This class is designed to accept a TcpClient and treat it as an HTTP request. | ||
10 | /// It will do some basic header parsing and manage the input and output streams associated | ||
11 | /// with the request.</remarks> | ||
12 | public class SimpleHttpRequest | ||
13 | { | ||
14 | private String _httpMethod = null; | ||
15 | private String _protocol; | ||
16 | private String _filePathFile = null; | ||
17 | private String _filePathDir = null; | ||
18 | private String __filePath; | ||
19 | private TcpClient _client; | ||
20 | private StreamReader _input; | ||
21 | private StreamWriter _output; | ||
22 | private Hashtable _headers; | ||
23 | |||
24 | /// <summary>A constructor which accepts the TcpClient.</summary> | ||
25 | /// <remarks>It creates the associated input and output streams, determines the request type, | ||
26 | /// and parses the remaining HTTP header.</remarks> | ||
27 | /// <param name="client">The <c>TcpClient</c> associated with the HTTP connection.</param> | ||
28 | public SimpleHttpRequest(TcpClient client) | ||
29 | { | ||
30 | _client = client; | ||
31 | _output = new StreamWriter(client.GetStream()); | ||
32 | _input = new StreamReader(client.GetStream()); | ||
33 | GetRequestMethod(); | ||
34 | GetRequestHeaders(); | ||
35 | } | ||
36 | |||
37 | /// <summary>The output <c>StreamWriter</c> associated with the request.</summary> | ||
38 | public StreamWriter Output | ||
39 | { | ||
40 | get { return _output; } | ||
41 | } | ||
42 | |||
43 | /// <summary>The input <c>StreamReader</c> associated with the request.</summary> | ||
44 | public StreamReader Input | ||
45 | { | ||
46 | get { return _input; } | ||
47 | } | ||
48 | |||
49 | /// <summary>The <c>TcpClient</c> with the request.</summary> | ||
50 | public TcpClient Client | ||
51 | { | ||
52 | get { return _client; } | ||
53 | } | ||
54 | |||
55 | private String _filePath | ||
56 | { | ||
57 | get { return __filePath; } | ||
58 | set | ||
59 | { | ||
60 | __filePath = value; | ||
61 | _filePathDir = null; | ||
62 | _filePathFile = null; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | /// <summary>The type of HTTP request (i.e. PUT, GET, etc.).</summary> | ||
67 | public String HttpMethod | ||
68 | { | ||
69 | get { return _httpMethod; } | ||
70 | } | ||
71 | |||
72 | /// <summary>The level of the HTTP protocol.</summary> | ||
73 | public String Protocol | ||
74 | { | ||
75 | get { return _protocol; } | ||
76 | } | ||
77 | |||
78 | /// <summary>The "path" which is part of any HTTP request.</summary> | ||
79 | public String FilePath | ||
80 | { | ||
81 | get { return _filePath; } | ||
82 | } | ||
83 | |||
84 | /// <summary>The file portion of the "path" which is part of any HTTP request.</summary> | ||
85 | public String FilePathFile | ||
86 | { | ||
87 | get | ||
88 | { | ||
89 | if (_filePathFile != null) | ||
90 | return _filePathFile; | ||
91 | |||
92 | int i = FilePath.LastIndexOf("/"); | ||
93 | |||
94 | if (i == -1) | ||
95 | return ""; | ||
96 | |||
97 | i++; | ||
98 | _filePathFile = FilePath.Substring(i, FilePath.Length - i); | ||
99 | return _filePathFile; | ||
100 | } | ||
101 | } | ||
102 | |||
103 | /// <summary>The directory portion of the "path" which is part of any HTTP request.</summary> | ||
104 | public String FilePathDir | ||
105 | { | ||
106 | get | ||
107 | { | ||
108 | if (_filePathDir != null) | ||
109 | return _filePathDir; | ||
110 | |||
111 | int i = FilePath.LastIndexOf("/"); | ||
112 | |||
113 | if (i == -1) | ||
114 | return ""; | ||
115 | |||
116 | i++; | ||
117 | _filePathDir = FilePath.Substring(0, i); | ||
118 | return _filePathDir; | ||
119 | } | ||
120 | } | ||
121 | |||
122 | private void GetRequestMethod() | ||
123 | { | ||
124 | string req = _input.ReadLine(); | ||
125 | if (req == null) | ||
126 | throw new ApplicationException("Void request."); | ||
127 | |||
128 | if (0 == String.Compare("GET ", req.Substring(0, 4), true)) | ||
129 | _httpMethod = "GET"; | ||
130 | else if (0 == String.Compare("POST ", req.Substring(0, 5), true)) | ||
131 | _httpMethod = "POST"; | ||
132 | else | ||
133 | throw new InvalidOperationException("Unrecognized method in query: " + req); | ||
134 | |||
135 | req = req.TrimEnd(); | ||
136 | int idx = req.IndexOf(' ') + 1; | ||
137 | if (idx >= req.Length) | ||
138 | throw new ApplicationException("What do you want?"); | ||
139 | |||
140 | string page_protocol = req.Substring(idx); | ||
141 | int idx2 = page_protocol.IndexOf(' '); | ||
142 | if (idx2 == -1) | ||
143 | idx2 = page_protocol.Length; | ||
144 | |||
145 | _filePath = page_protocol.Substring(0, idx2).Trim(); | ||
146 | _protocol = page_protocol.Substring(idx2).Trim(); | ||
147 | } | ||
148 | |||
149 | private void GetRequestHeaders() | ||
150 | { | ||
151 | String line; | ||
152 | int idx; | ||
153 | |||
154 | _headers = new Hashtable(); | ||
155 | |||
156 | while ((line = _input.ReadLine()) != "") | ||
157 | { | ||
158 | if (line == null) | ||
159 | { | ||
160 | break; | ||
161 | } | ||
162 | |||
163 | idx = line.IndexOf(':'); | ||
164 | if (idx == -1 || idx == line.Length - 1) | ||
165 | { | ||
166 | Logger.WriteEntry("Malformed header line: " + line, LogLevel.Information); | ||
167 | continue; | ||
168 | } | ||
169 | |||
170 | String key = line.Substring(0, idx); | ||
171 | String value = line.Substring(idx + 1); | ||
172 | |||
173 | try | ||
174 | { | ||
175 | _headers.Add(key, value); | ||
176 | } | ||
177 | catch (Exception) | ||
178 | { | ||
179 | Logger.WriteEntry("Duplicate header key in line: " + line, LogLevel.Information); | ||
180 | } | ||
181 | } | ||
182 | } | ||
183 | |||
184 | /// <summary> | ||
185 | /// Format the object contents into a useful string representation. | ||
186 | /// </summary> | ||
187 | ///<returns><c>String</c> representation of the <c>SimpleHttpRequest</c> as the <i>HttpMethod FilePath Protocol</i>.</returns> | ||
188 | override public String ToString() | ||
189 | { | ||
190 | return HttpMethod + " " + FilePath + " " + Protocol; | ||
191 | } | ||
192 | |||
193 | /// <summary> | ||
194 | /// Close the <c>SimpleHttpRequest</c>. This flushes and closes all associated io streams. | ||
195 | /// </summary> | ||
196 | public void Close() | ||
197 | { | ||
198 | _output.Flush(); | ||
199 | _output.Close(); | ||
200 | _input.Close(); | ||
201 | _client.Close(); | ||
202 | } | ||
203 | } | ||
204 | } | ||
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 @@ | |||
1 | <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||
2 | <PropertyGroup> | ||
3 | <ProjectType>Local</ProjectType> | ||
4 | <ProductVersion>8.0.50727</ProductVersion> | ||
5 | <SchemaVersion>2.0</SchemaVersion> | ||
6 | <ProjectGuid>{8E81D43C-0000-0000-0000-000000000000}</ProjectGuid> | ||
7 | <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> | ||
8 | <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> | ||
9 | <ApplicationIcon></ApplicationIcon> | ||
10 | <AssemblyKeyContainerName> | ||
11 | </AssemblyKeyContainerName> | ||
12 | <AssemblyName>XMLRPC</AssemblyName> | ||
13 | <DefaultClientScript>JScript</DefaultClientScript> | ||
14 | <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout> | ||
15 | <DefaultTargetSchema>IE50</DefaultTargetSchema> | ||
16 | <DelaySign>false</DelaySign> | ||
17 | <OutputType>Library</OutputType> | ||
18 | <AppDesignerFolder></AppDesignerFolder> | ||
19 | <RootNamespace>XMLRPC</RootNamespace> | ||
20 | <StartupObject></StartupObject> | ||
21 | <FileUpgradeFlags> | ||
22 | </FileUpgradeFlags> | ||
23 | </PropertyGroup> | ||
24 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> | ||
25 | <AllowUnsafeBlocks>False</AllowUnsafeBlocks> | ||
26 | <BaseAddress>285212672</BaseAddress> | ||
27 | <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow> | ||
28 | <ConfigurationOverrideFile> | ||
29 | </ConfigurationOverrideFile> | ||
30 | <DefineConstants>TRACE;DEBUG</DefineConstants> | ||
31 | <DocumentationFile></DocumentationFile> | ||
32 | <DebugSymbols>True</DebugSymbols> | ||
33 | <FileAlignment>4096</FileAlignment> | ||
34 | <Optimize>False</Optimize> | ||
35 | <OutputPath>..\bin\</OutputPath> | ||
36 | <RegisterForComInterop>False</RegisterForComInterop> | ||
37 | <RemoveIntegerChecks>False</RemoveIntegerChecks> | ||
38 | <TreatWarningsAsErrors>False</TreatWarningsAsErrors> | ||
39 | <WarningLevel>4</WarningLevel> | ||
40 | <NoWarn></NoWarn> | ||
41 | </PropertyGroup> | ||
42 | <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> | ||
43 | <AllowUnsafeBlocks>False</AllowUnsafeBlocks> | ||
44 | <BaseAddress>285212672</BaseAddress> | ||
45 | <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow> | ||
46 | <ConfigurationOverrideFile> | ||
47 | </ConfigurationOverrideFile> | ||
48 | <DefineConstants>TRACE</DefineConstants> | ||
49 | <DocumentationFile></DocumentationFile> | ||
50 | <DebugSymbols>False</DebugSymbols> | ||
51 | <FileAlignment>4096</FileAlignment> | ||
52 | <Optimize>True</Optimize> | ||
53 | <OutputPath>..\bin\</OutputPath> | ||
54 | <RegisterForComInterop>False</RegisterForComInterop> | ||
55 | <RemoveIntegerChecks>False</RemoveIntegerChecks> | ||
56 | <TreatWarningsAsErrors>False</TreatWarningsAsErrors> | ||
57 | <WarningLevel>4</WarningLevel> | ||
58 | <NoWarn></NoWarn> | ||
59 | </PropertyGroup> | ||
60 | <ItemGroup> | ||
61 | <Reference Include="System" > | ||
62 | <HintPath>System.dll</HintPath> | ||
63 | <Private>False</Private> | ||
64 | </Reference> | ||
65 | <Reference Include="System.Xml" > | ||
66 | <HintPath>System.Xml.dll</HintPath> | ||
67 | <Private>False</Private> | ||
68 | </Reference> | ||
69 | </ItemGroup> | ||
70 | <ItemGroup> | ||
71 | </ItemGroup> | ||
72 | <ItemGroup> | ||
73 | <Compile Include="Logger.cs"> | ||
74 | <SubType>Code</SubType> | ||
75 | </Compile> | ||
76 | <Compile Include="SimpleHttpRequest.cs"> | ||
77 | <SubType>Code</SubType> | ||
78 | </Compile> | ||
79 | <Compile Include="XmlRpcBoxcarRequest.cs"> | ||
80 | <SubType>Code</SubType> | ||
81 | </Compile> | ||
82 | <Compile Include="XmlRpcClientProxy.cs"> | ||
83 | <SubType>Code</SubType> | ||
84 | </Compile> | ||
85 | <Compile Include="XmlRpcDeserializer.cs"> | ||
86 | <SubType>Code</SubType> | ||
87 | </Compile> | ||
88 | <Compile Include="XmlRpcErrorCodes.cs"> | ||
89 | <SubType>Code</SubType> | ||
90 | </Compile> | ||
91 | <Compile Include="XmlRpcException.cs"> | ||
92 | <SubType>Code</SubType> | ||
93 | </Compile> | ||
94 | <Compile Include="XmlRpcExposedAttribute.cs"> | ||
95 | <SubType>Code</SubType> | ||
96 | </Compile> | ||
97 | <Compile Include="XmlRpcRequest.cs"> | ||
98 | <SubType>Code</SubType> | ||
99 | </Compile> | ||
100 | <Compile Include="XmlRpcRequestDeserializer.cs"> | ||
101 | <SubType>Code</SubType> | ||
102 | </Compile> | ||
103 | <Compile Include="XmlRpcRequestSerializer.cs"> | ||
104 | <SubType>Code</SubType> | ||
105 | </Compile> | ||
106 | <Compile Include="XmlRpcResponder.cs"> | ||
107 | <SubType>Code</SubType> | ||
108 | </Compile> | ||
109 | <Compile Include="XmlRpcResponse.cs"> | ||
110 | <SubType>Code</SubType> | ||
111 | </Compile> | ||
112 | <Compile Include="XmlRpcResponseDeserializer.cs"> | ||
113 | <SubType>Code</SubType> | ||
114 | </Compile> | ||
115 | <Compile Include="XmlRpcResponseSerializer.cs"> | ||
116 | <SubType>Code</SubType> | ||
117 | </Compile> | ||
118 | <Compile Include="XmlRpcSerializer.cs"> | ||
119 | <SubType>Code</SubType> | ||
120 | </Compile> | ||
121 | <Compile Include="XmlRpcServer.cs"> | ||
122 | <SubType>Code</SubType> | ||
123 | </Compile> | ||
124 | <Compile Include="XmlRpcSystemObject.cs"> | ||
125 | <SubType>Code</SubType> | ||
126 | </Compile> | ||
127 | <Compile Include="XmlRpcXmlTokens.cs"> | ||
128 | <SubType>Code</SubType> | ||
129 | </Compile> | ||
130 | </ItemGroup> | ||
131 | <Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" /> | ||
132 | <PropertyGroup> | ||
133 | <PreBuildEvent> | ||
134 | </PreBuildEvent> | ||
135 | <PostBuildEvent> | ||
136 | </PostBuildEvent> | ||
137 | </PropertyGroup> | ||
138 | </Project> | ||
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 @@ | |||
1 | <?xml version="1.0" ?> | ||
2 | <project name="XMLRPC" default="build"> | ||
3 | <target name="build"> | ||
4 | <echo message="Build Directory is ${project::get-base-directory()}/${build.dir}" /> | ||
5 | <mkdir dir="${project::get-base-directory()}/${build.dir}" /> | ||
6 | <copy todir="${project::get-base-directory()}/${build.dir}"> | ||
7 | <fileset basedir="${project::get-base-directory()}"> | ||
8 | </fileset> | ||
9 | </copy> | ||
10 | <csc target="library" debug="${build.debug}" unsafe="False" define="TRACE;DEBUG" output="${project::get-base-directory()}/${build.dir}/${project::get-name()}.dll"> | ||
11 | <resources prefix="XMLRPC" dynamicprefix="true" > | ||
12 | </resources> | ||
13 | <sources failonempty="true"> | ||
14 | <include name="Logger.cs" /> | ||
15 | <include name="SimpleHttpRequest.cs" /> | ||
16 | <include name="XmlRpcBoxcarRequest.cs" /> | ||
17 | <include name="XmlRpcClientProxy.cs" /> | ||
18 | <include name="XmlRpcDeserializer.cs" /> | ||
19 | <include name="XmlRpcErrorCodes.cs" /> | ||
20 | <include name="XmlRpcException.cs" /> | ||
21 | <include name="XmlRpcExposedAttribute.cs" /> | ||
22 | <include name="XmlRpcRequest.cs" /> | ||
23 | <include name="XmlRpcRequestDeserializer.cs" /> | ||
24 | <include name="XmlRpcRequestSerializer.cs" /> | ||
25 | <include name="XmlRpcResponder.cs" /> | ||
26 | <include name="XmlRpcResponse.cs" /> | ||
27 | <include name="XmlRpcResponseDeserializer.cs" /> | ||
28 | <include name="XmlRpcResponseSerializer.cs" /> | ||
29 | <include name="XmlRpcSerializer.cs" /> | ||
30 | <include name="XmlRpcServer.cs" /> | ||
31 | <include name="XmlRpcSystemObject.cs" /> | ||
32 | <include name="XmlRpcXmlTokens.cs" /> | ||
33 | </sources> | ||
34 | <references basedir="${project::get-base-directory()}"> | ||
35 | <lib> | ||
36 | <include name="${project::get-base-directory()}" /> | ||
37 | <include name="${project::get-base-directory()}/${build.dir}" /> | ||
38 | </lib> | ||
39 | <include name="System.dll" /> | ||
40 | <include name="System.Xml.dll" /> | ||
41 | </references> | ||
42 | </csc> | ||
43 | <echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../bin/" /> | ||
44 | <mkdir dir="${project::get-base-directory()}/../bin/"/> | ||
45 | <copy todir="${project::get-base-directory()}/../bin/"> | ||
46 | <fileset basedir="${project::get-base-directory()}/${build.dir}/" > | ||
47 | <include name="*.dll"/> | ||
48 | <include name="*.exe"/> | ||
49 | </fileset> | ||
50 | </copy> | ||
51 | </target> | ||
52 | <target name="clean"> | ||
53 | <delete dir="${bin.dir}" failonerror="false" /> | ||
54 | <delete dir="${obj.dir}" failonerror="false" /> | ||
55 | </target> | ||
56 | <target name="doc" description="Creates documentation."> | ||
57 | </target> | ||
58 | </project> | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Xml; | ||
7 | using System.Net; | ||
8 | using System.Text; | ||
9 | using System.Reflection; | ||
10 | |||
11 | /// <summary>Class that collects individual <c>XmlRpcRequest</c> objects and submits them as a <i>boxcarred</i> request.</summary> | ||
12 | /// <remarks>A boxcared request is when a number of request are collected before being sent via XML-RPC, and then are sent via | ||
13 | /// a single HTTP connection. This results in a speed up from reduced connection time. The results are then retuned collectively | ||
14 | /// as well. | ||
15 | ///</remarks> | ||
16 | /// <seealso cref="XmlRpcRequest"/> | ||
17 | public class XmlRpcBoxcarRequest : XmlRpcRequest | ||
18 | { | ||
19 | /// <summary>ArrayList to collect the requests to boxcar.</summary> | ||
20 | public IList Requests = new ArrayList(); | ||
21 | |||
22 | /// <summary>Basic constructor.</summary> | ||
23 | public XmlRpcBoxcarRequest() | ||
24 | { | ||
25 | } | ||
26 | |||
27 | /// <summary>Returns the <c>String</c> "system.multiCall" which is the server method that handles boxcars.</summary> | ||
28 | public override String MethodName | ||
29 | { | ||
30 | get { return "system.multiCall"; } | ||
31 | } | ||
32 | |||
33 | /// <summary>The <c>ArrayList</c> of boxcarred <paramref>Requests</paramref> as properly formed parameters.</summary> | ||
34 | public override IList Params | ||
35 | { | ||
36 | get { | ||
37 | _params.Clear(); | ||
38 | ArrayList reqArray = new ArrayList(); | ||
39 | foreach (XmlRpcRequest request in Requests) | ||
40 | { | ||
41 | Hashtable requestEntry = new Hashtable(); | ||
42 | requestEntry.Add(XmlRpcXmlTokens.METHOD_NAME, request.MethodName); | ||
43 | requestEntry.Add(XmlRpcXmlTokens.PARAMS, request.Params); | ||
44 | reqArray.Add(requestEntry); | ||
45 | } | ||
46 | _params.Add(reqArray); | ||
47 | return _params; | ||
48 | } | ||
49 | } | ||
50 | } | ||
51 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Runtime.Remoting.Proxies; | ||
5 | using System.Runtime.Remoting.Messaging; | ||
6 | |||
7 | /// <summary>This class provides support for creating local proxies of XML-RPC remote objects</summary> | ||
8 | /// <remarks> | ||
9 | /// To create a local proxy you need to create a local C# interface and then, via <i>createProxy</i> | ||
10 | /// associate that interface with a remote object at a given URL. | ||
11 | /// </remarks> | ||
12 | public class XmlRpcClientProxy : RealProxy | ||
13 | { | ||
14 | private String _remoteObjectName; | ||
15 | private String _url; | ||
16 | private XmlRpcRequest _client = new XmlRpcRequest(); | ||
17 | |||
18 | /// <summary>Factory method to create proxies.</summary> | ||
19 | /// <remarks> | ||
20 | /// To create a local proxy you need to create a local C# interface with methods that mirror those of the server object. | ||
21 | /// Next, pass that interface into <c>createProxy</c> along with the object name and URL of the remote object and | ||
22 | /// cast the resulting object to the specifice interface. | ||
23 | /// </remarks> | ||
24 | /// <param name="remoteObjectName"><c>String</c> The name of the remote object.</param> | ||
25 | /// <param name="url"><c>String</c> The URL of the remote object.</param> | ||
26 | /// <param name="anInterface"><c>Type</c> The typeof() of a C# interface.</param> | ||
27 | /// <returns><c>Object</c> A proxy for your specified interface. Cast to appropriate type.</returns> | ||
28 | public static Object createProxy(String remoteObjectName, String url, Type anInterface) | ||
29 | { | ||
30 | return new XmlRpcClientProxy(remoteObjectName, url, anInterface).GetTransparentProxy(); | ||
31 | } | ||
32 | |||
33 | private XmlRpcClientProxy(String remoteObjectName, String url, Type t) : base(t) | ||
34 | { | ||
35 | _remoteObjectName = remoteObjectName; | ||
36 | _url = url; | ||
37 | } | ||
38 | |||
39 | /// <summary>The local method dispatcher - do not invoke.</summary> | ||
40 | override public IMessage Invoke(IMessage msg) | ||
41 | { | ||
42 | IMethodCallMessage methodMessage = (IMethodCallMessage)msg; | ||
43 | |||
44 | _client.MethodName = _remoteObjectName + "." + methodMessage.MethodName; | ||
45 | _client.Params.Clear(); | ||
46 | foreach (Object o in methodMessage.Args) | ||
47 | _client.Params.Add(o); | ||
48 | |||
49 | try | ||
50 | { | ||
51 | Object ret = _client.Invoke(_url); | ||
52 | return new ReturnMessage(ret,null,0, | ||
53 | methodMessage.LogicalCallContext, methodMessage); | ||
54 | } | ||
55 | catch (Exception e) | ||
56 | { | ||
57 | return new ReturnMessage(e, methodMessage); | ||
58 | } | ||
59 | } | ||
60 | } | ||
61 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Xml; | ||
7 | using System.Globalization; | ||
8 | |||
9 | /// <summary>Parser context, we maintain contexts in a stack to avoiding recursion. </summary> | ||
10 | struct Context | ||
11 | { | ||
12 | public String Name; | ||
13 | public Object Container; | ||
14 | } | ||
15 | |||
16 | /// <summary>Basic XML-RPC data deserializer.</summary> | ||
17 | /// <remarks>Uses <c>XmlTextReader</c> to parse the XML data. This level of the class | ||
18 | /// only handles the tokens common to both Requests and Responses. This class is not useful in and of itself | ||
19 | /// but is designed to be subclassed.</remarks> | ||
20 | public class XmlRpcDeserializer : XmlRpcXmlTokens | ||
21 | { | ||
22 | private static DateTimeFormatInfo _dateFormat = new DateTimeFormatInfo(); | ||
23 | |||
24 | private Object _container; | ||
25 | private Stack _containerStack; | ||
26 | |||
27 | /// <summary>Protected reference to last text.</summary> | ||
28 | protected String _text; | ||
29 | /// <summary>Protected reference to last deserialized value.</summary> | ||
30 | protected Object _value; | ||
31 | /// <summary>Protected reference to last name field.</summary> | ||
32 | protected String _name; | ||
33 | |||
34 | |||
35 | /// <summary>Basic constructor.</summary> | ||
36 | public XmlRpcDeserializer() | ||
37 | { | ||
38 | Reset(); | ||
39 | _dateFormat.FullDateTimePattern = ISO_DATETIME; | ||
40 | } | ||
41 | |||
42 | /// <summary>Static method that parses XML data into a response using the Singleton.</summary> | ||
43 | /// <param name="xmlData"><c>StreamReader</c> containing an XML-RPC response.</param> | ||
44 | /// <returns><c>Object</c> object resulting from the deserialization.</returns> | ||
45 | virtual public Object Deserialize(TextReader xmlData) | ||
46 | { | ||
47 | return null; | ||
48 | } | ||
49 | |||
50 | /// <summary>Protected method to parse a node in an XML-RPC XML stream.</summary> | ||
51 | /// <remarks>Method deals with elements common to all XML-RPC data, subclasses of | ||
52 | /// this object deal with request/response spefic elements.</remarks> | ||
53 | /// <param name="reader"><c>XmlTextReader</c> of the in progress parsing data stream.</param> | ||
54 | protected void DeserializeNode(XmlTextReader reader) | ||
55 | { | ||
56 | switch (reader.NodeType) | ||
57 | { | ||
58 | case XmlNodeType.Element: | ||
59 | if (Logger.Delegate != null) | ||
60 | Logger.WriteEntry("START " + reader.Name, LogLevel.Information); | ||
61 | switch (reader.Name) | ||
62 | { | ||
63 | case VALUE: | ||
64 | _value = null; | ||
65 | _text = null; | ||
66 | break; | ||
67 | case STRUCT: | ||
68 | PushContext(); | ||
69 | _container = new Hashtable(); | ||
70 | break; | ||
71 | case ARRAY: | ||
72 | PushContext(); | ||
73 | _container = new ArrayList(); | ||
74 | break; | ||
75 | } | ||
76 | break; | ||
77 | case XmlNodeType.EndElement: | ||
78 | if (Logger.Delegate != null) | ||
79 | Logger.WriteEntry("END " + reader.Name, LogLevel.Information); | ||
80 | switch (reader.Name) | ||
81 | { | ||
82 | case BASE64: | ||
83 | _value = Convert.FromBase64String(_text); | ||
84 | break; | ||
85 | case BOOLEAN: | ||
86 | int val = Int16.Parse(_text); | ||
87 | if (val == 0) | ||
88 | _value = false; | ||
89 | else if (val == 1) | ||
90 | _value = true; | ||
91 | break; | ||
92 | case STRING: | ||
93 | _value = _text; | ||
94 | break; | ||
95 | case DOUBLE: | ||
96 | _value = Double.Parse(_text); | ||
97 | break; | ||
98 | case INT: | ||
99 | case ALT_INT: | ||
100 | _value = Int32.Parse(_text); | ||
101 | break; | ||
102 | case DATETIME: | ||
103 | #if __MONO__ | ||
104 | _value = DateParse(_text); | ||
105 | #else | ||
106 | _value = DateTime.ParseExact(_text, "F", _dateFormat); | ||
107 | #endif | ||
108 | break; | ||
109 | case NAME: | ||
110 | _name = _text; | ||
111 | break; | ||
112 | case VALUE: | ||
113 | if (_value == null) | ||
114 | _value = _text; // some kits don't use <string> tag, they just do <value> | ||
115 | |||
116 | if ((_container != null) && (_container is IList)) // in an array? If so add value to it. | ||
117 | ((IList)_container).Add(_value); | ||
118 | break; | ||
119 | case MEMBER: | ||
120 | if ((_container != null) && (_container is IDictionary)) // in an struct? If so add value to it. | ||
121 | ((IDictionary)_container).Add(_name, _value); | ||
122 | break; | ||
123 | case ARRAY: | ||
124 | case STRUCT: | ||
125 | _value = _container; | ||
126 | PopContext(); | ||
127 | break; | ||
128 | } | ||
129 | break; | ||
130 | case XmlNodeType.Text: | ||
131 | if (Logger.Delegate != null) | ||
132 | Logger.WriteEntry("Text " + reader.Value, LogLevel.Information); | ||
133 | _text = reader.Value; | ||
134 | break; | ||
135 | default: | ||
136 | break; | ||
137 | } | ||
138 | } | ||
139 | |||
140 | /// <summary>Static method that parses XML in a <c>String</c> into a | ||
141 | /// request using the Singleton.</summary> | ||
142 | /// <param name="xmlData"><c>String</c> containing an XML-RPC request.</param> | ||
143 | /// <returns><c>XmlRpcRequest</c> object resulting from the parse.</returns> | ||
144 | public Object Deserialize(String xmlData) | ||
145 | { | ||
146 | StringReader sr = new StringReader(xmlData); | ||
147 | return Deserialize(sr); | ||
148 | } | ||
149 | |||
150 | /// <summary>Pop a Context of the stack, an Array or Struct has closed.</summary> | ||
151 | private void PopContext() | ||
152 | { | ||
153 | Context c = (Context)_containerStack.Pop(); | ||
154 | _container = c.Container; | ||
155 | _name = c.Name; | ||
156 | } | ||
157 | |||
158 | /// <summary>Push a Context on the stack, an Array or Struct has opened.</summary> | ||
159 | private void PushContext() | ||
160 | { | ||
161 | Context context; | ||
162 | |||
163 | context.Container = _container; | ||
164 | context.Name = _name; | ||
165 | |||
166 | _containerStack.Push(context); | ||
167 | } | ||
168 | |||
169 | /// <summary>Reset the internal state of the deserializer.</summary> | ||
170 | protected void Reset() | ||
171 | { | ||
172 | _text = null; | ||
173 | _value = null; | ||
174 | _name = null; | ||
175 | _container = null; | ||
176 | _containerStack = new Stack(); | ||
177 | } | ||
178 | |||
179 | #if __MONO__ | ||
180 | private DateTime DateParse(String str) | ||
181 | { | ||
182 | int year = Int32.Parse(str.Substring(0,4)); | ||
183 | int month = Int32.Parse(str.Substring(4,2)); | ||
184 | int day = Int32.Parse(str.Substring(6,2)); | ||
185 | int hour = Int32.Parse(str.Substring(9,2)); | ||
186 | int min = Int32.Parse(str.Substring(12,2)); | ||
187 | int sec = Int32.Parse(str.Substring(15,2)); | ||
188 | return new DateTime(year,month,day,hour,min,sec); | ||
189 | } | ||
190 | #endif | ||
191 | |||
192 | } | ||
193 | } | ||
194 | |||
195 | |||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | |||
5 | /// <summary>Standard XML-RPC error codes.</summary> | ||
6 | public class XmlRpcErrorCodes | ||
7 | { | ||
8 | /// <summary></summary> | ||
9 | public const int PARSE_ERROR_MALFORMED = -32700; | ||
10 | /// <summary></summary> | ||
11 | public const String PARSE_ERROR_MALFORMED_MSG = "Parse Error, not well formed"; | ||
12 | |||
13 | /// <summary></summary> | ||
14 | public const int PARSE_ERROR_ENCODING = -32701; | ||
15 | /// <summary></summary> | ||
16 | public const String PARSE_ERROR_ENCODING_MSG = "Parse Error, unsupported encoding"; | ||
17 | |||
18 | // | ||
19 | // -32702 ---> parse error. invalid character for encoding | ||
20 | // -32600 ---> server error. invalid xml-rpc. not conforming to spec. | ||
21 | // | ||
22 | |||
23 | /// <summary></summary> | ||
24 | public const int SERVER_ERROR_METHOD = -32601; | ||
25 | /// <summary></summary> | ||
26 | public const String SERVER_ERROR_METHOD_MSG = "Server Error, requested method not found"; | ||
27 | |||
28 | /// <summary></summary> | ||
29 | public const int SERVER_ERROR_PARAMS = -32602; | ||
30 | /// <summary></summary> | ||
31 | public const String SERVER_ERROR_PARAMS_MSG = "Server Error, invalid method parameters"; | ||
32 | |||
33 | // | ||
34 | // -32603 ---> server error. internal xml-rpc error | ||
35 | // | ||
36 | |||
37 | /// <summary></summary> | ||
38 | public const int APPLICATION_ERROR = -32500; | ||
39 | /// <summary></summary> | ||
40 | public const String APPLICATION_ERROR_MSG = "Application Error"; | ||
41 | |||
42 | // | ||
43 | // -32400 ---> system error | ||
44 | // | ||
45 | |||
46 | /// <summary></summary> | ||
47 | public const int TRANSPORT_ERROR = -32300; | ||
48 | /// <summary></summary> | ||
49 | public const String TRANSPORT_ERROR_MSG = "Transport Layer Error"; | ||
50 | } | ||
51 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | |||
5 | /// <summary>An XML-RPC Exception.</summary> | ||
6 | /// <remarks>Maps a C# exception to an XML-RPC fault. Normal exceptions | ||
7 | /// include a message so this adds the code needed by XML-RPC.</remarks> | ||
8 | public class XmlRpcException : Exception | ||
9 | { | ||
10 | private int _code; | ||
11 | |||
12 | /// <summary>Instantiate an <c>XmlRpcException</c> with a code and message.</summary> | ||
13 | /// <param name="code"><c>Int</c> faultCode associated with this exception.</param> | ||
14 | /// <param name="message"><c>String</c> faultMessage associated with this exception.</param> | ||
15 | public XmlRpcException(int code, String message) | ||
16 | : base(message) | ||
17 | { | ||
18 | _code = code; | ||
19 | } | ||
20 | |||
21 | /// <summary>The value of the faults message, i.e. the faultString.</summary> | ||
22 | public String FaultString | ||
23 | { | ||
24 | get { return Message; } | ||
25 | } | ||
26 | |||
27 | /// <summary>The value of the faults code, i.e. the faultCode.</summary> | ||
28 | public int FaultCode | ||
29 | { | ||
30 | get { return _code; } | ||
31 | } | ||
32 | |||
33 | /// <summary>Format the message to include the code.</summary> | ||
34 | override public String ToString() | ||
35 | { | ||
36 | return "Code: " + FaultCode + " Message: " + base.ToString(); | ||
37 | } | ||
38 | } | ||
39 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Reflection; | ||
5 | |||
6 | /// <summary> | ||
7 | /// Simple tagging attribute to indicate participation is XML-RPC exposure. | ||
8 | /// </summary> | ||
9 | /// <remarks> | ||
10 | /// If present at the class level it indicates that this class does explicitly | ||
11 | /// expose methods. If present at the method level it denotes that the method | ||
12 | /// is exposed. | ||
13 | /// </remarks> | ||
14 | [AttributeUsage( | ||
15 | AttributeTargets.Class | AttributeTargets.Method, | ||
16 | AllowMultiple = false, | ||
17 | Inherited = true | ||
18 | )] | ||
19 | public class XmlRpcExposedAttribute : Attribute | ||
20 | { | ||
21 | /// <summary>Check if <paramref>obj</paramref> is an object utilizing the XML-RPC exposed Attribute.</summary> | ||
22 | /// <param name="obj"><c>Object</c> of a class or method to check for attribute.</param> | ||
23 | /// <returns><c>Boolean</c> true if attribute present.</returns> | ||
24 | public static Boolean ExposedObject(Object obj) | ||
25 | { | ||
26 | return IsExposed(obj.GetType()); | ||
27 | } | ||
28 | |||
29 | /// <summary>Check if <paramref>obj</paramref>.<paramref>methodName</paramref> is an XML-RPC exposed method.</summary> | ||
30 | /// <remarks>A method is considered to be exposed if it exists and, either, the object does not use the XmlRpcExposed attribute, | ||
31 | /// or the object does use the XmlRpcExposed attribute and the method has the XmlRpcExposed attribute as well.</remarks> | ||
32 | /// <returns><c>Boolean</c> true if the method is exposed.</returns> | ||
33 | public static Boolean ExposedMethod(Object obj, String methodName) | ||
34 | { | ||
35 | Type type = obj.GetType(); | ||
36 | MethodInfo method = type.GetMethod(methodName); | ||
37 | |||
38 | if (method == null) | ||
39 | throw new MissingMethodException("Method " + methodName + " not found."); | ||
40 | |||
41 | if (!IsExposed(type)) | ||
42 | return true; | ||
43 | |||
44 | return IsExposed(method); | ||
45 | } | ||
46 | |||
47 | /// <summary>Check if <paramref>mi</paramref> is XML-RPC exposed.</summary> | ||
48 | /// <param name="mi"><c>MemberInfo</c> of a class or method to check for attribute.</param> | ||
49 | /// <returns><c>Boolean</c> true if attribute present.</returns> | ||
50 | public static Boolean IsExposed(MemberInfo mi) | ||
51 | { | ||
52 | foreach (Attribute attr in mi.GetCustomAttributes(true)) | ||
53 | { | ||
54 | if (attr is XmlRpcExposedAttribute) | ||
55 | return true; | ||
56 | } | ||
57 | return false; | ||
58 | } | ||
59 | } | ||
60 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Xml; | ||
7 | using System.Net; | ||
8 | using System.Text; | ||
9 | using System.Reflection; | ||
10 | using System.Net.Security; | ||
11 | using System.Security.Cryptography.X509Certificates; | ||
12 | |||
13 | internal class AcceptAllCertificatePolicy : ICertificatePolicy | ||
14 | { | ||
15 | public AcceptAllCertificatePolicy() | ||
16 | { | ||
17 | } | ||
18 | |||
19 | public bool CheckValidationResult(ServicePoint sPoint, | ||
20 | System.Security.Cryptography.X509Certificates.X509Certificate cert, | ||
21 | WebRequest wRequest, int certProb) | ||
22 | { | ||
23 | // Always accept | ||
24 | return true; | ||
25 | } | ||
26 | } | ||
27 | |||
28 | /// <summary>Class supporting the request side of an XML-RPC transaction.</summary> | ||
29 | public class XmlRpcRequest | ||
30 | { | ||
31 | private String _methodName = null; | ||
32 | private Encoding _encoding = new ASCIIEncoding(); | ||
33 | private XmlRpcRequestSerializer _serializer = new XmlRpcRequestSerializer(); | ||
34 | private XmlRpcResponseDeserializer _deserializer = new XmlRpcResponseDeserializer(); | ||
35 | |||
36 | /// <summary><c>ArrayList</c> containing the parameters.</summary> | ||
37 | protected IList _params = null; | ||
38 | |||
39 | /// <summary>Instantiate an <c>XmlRpcRequest</c></summary> | ||
40 | public XmlRpcRequest() | ||
41 | { | ||
42 | _params = new ArrayList(); | ||
43 | } | ||
44 | |||
45 | /// <summary>Instantiate an <c>XmlRpcRequest</c> for a specified method and parameters.</summary> | ||
46 | /// <param name="methodName"><c>String</c> designating the <i>object.method</i> on the server the request | ||
47 | /// should be directed to.</param> | ||
48 | /// <param name="parameters"><c>ArrayList</c> of XML-RPC type parameters to invoke the request with.</param> | ||
49 | public XmlRpcRequest(String methodName, IList parameters) | ||
50 | { | ||
51 | MethodName = methodName; | ||
52 | _params = parameters; | ||
53 | } | ||
54 | |||
55 | /// <summary><c>ArrayList</c> conntaining the parameters for the request.</summary> | ||
56 | public virtual IList Params | ||
57 | { | ||
58 | get { return _params; } | ||
59 | } | ||
60 | |||
61 | /// <summary><c>String</c> conntaining the method name, both object and method, that the request will be sent to.</summary> | ||
62 | public virtual String MethodName | ||
63 | { | ||
64 | get { return _methodName; } | ||
65 | set { _methodName = value; } | ||
66 | } | ||
67 | |||
68 | /// <summary><c>String</c> object name portion of the method name.</summary> | ||
69 | public String MethodNameObject | ||
70 | { | ||
71 | get | ||
72 | { | ||
73 | int index = MethodName.IndexOf("."); | ||
74 | |||
75 | if (index == -1) | ||
76 | return MethodName; | ||
77 | |||
78 | return MethodName.Substring(0, index); | ||
79 | } | ||
80 | } | ||
81 | |||
82 | /// <summary><c>String</c> method name portion of the object.method name.</summary> | ||
83 | public String MethodNameMethod | ||
84 | { | ||
85 | get | ||
86 | { | ||
87 | int index = MethodName.IndexOf("."); | ||
88 | |||
89 | if (index == -1) | ||
90 | return MethodName; | ||
91 | |||
92 | return MethodName.Substring(index + 1, MethodName.Length - index - 1); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | /// <summary>Invoke this request on the server.</summary> | ||
97 | /// <param name="url"><c>String</c> The url of the XML-RPC server.</param> | ||
98 | /// <returns><c>Object</c> The value returned from the method invocation on the server.</returns> | ||
99 | /// <exception cref="XmlRpcException">If an exception generated on the server side.</exception> | ||
100 | public Object Invoke(String url) | ||
101 | { | ||
102 | XmlRpcResponse res = Send(url, 10000); | ||
103 | |||
104 | if (res.IsFault) | ||
105 | throw new XmlRpcException(res.FaultCode, res.FaultString); | ||
106 | |||
107 | return res.Value; | ||
108 | } | ||
109 | |||
110 | /// <summary>Send the request to the server.</summary> | ||
111 | /// <param name="url"><c>String</c> The url of the XML-RPC server.</param> | ||
112 | /// <param name="timeout">Milliseconds before the connection times out.</param> | ||
113 | /// <returns><c>XmlRpcResponse</c> The response generated.</returns> | ||
114 | public XmlRpcResponse Send(String url, int timeout) | ||
115 | { | ||
116 | // Override SSL authentication mechanisms | ||
117 | ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); | ||
118 | |||
119 | HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); | ||
120 | if (request == null) | ||
121 | throw new XmlRpcException(XmlRpcErrorCodes.TRANSPORT_ERROR, | ||
122 | XmlRpcErrorCodes.TRANSPORT_ERROR_MSG + ": Could not create request with " + url); | ||
123 | request.Method = "POST"; | ||
124 | request.ContentType = "text/xml"; | ||
125 | request.AllowWriteStreamBuffering = true; | ||
126 | request.Timeout = timeout; | ||
127 | |||
128 | Stream stream = request.GetRequestStream(); | ||
129 | XmlTextWriter xml = new XmlTextWriter(stream, _encoding); | ||
130 | _serializer.Serialize(xml, this); | ||
131 | xml.Flush(); | ||
132 | xml.Close(); | ||
133 | |||
134 | HttpWebResponse response = (HttpWebResponse)request.GetResponse(); | ||
135 | StreamReader input = new StreamReader(response.GetResponseStream()); | ||
136 | |||
137 | XmlRpcResponse resp = (XmlRpcResponse)_deserializer.Deserialize(input); | ||
138 | input.Close(); | ||
139 | response.Close(); | ||
140 | return resp; | ||
141 | } | ||
142 | |||
143 | /// <summary>Produce <c>String</c> representation of the object.</summary> | ||
144 | /// <returns><c>String</c> representation of the object.</returns> | ||
145 | override public String ToString() | ||
146 | { | ||
147 | return _serializer.Serialize(this); | ||
148 | } | ||
149 | } | ||
150 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.Diagnostics; | ||
6 | using System.IO; | ||
7 | using System.Xml; | ||
8 | |||
9 | /// <summary>Class to deserialize XML data representing a request.</summary> | ||
10 | public class XmlRpcRequestDeserializer : XmlRpcDeserializer | ||
11 | { | ||
12 | static private XmlRpcRequestDeserializer _singleton; | ||
13 | /// <summary>A static singleton instance of this deserializer.</summary> | ||
14 | [Obsolete("This object is now thread safe, just use an instance.", false)] | ||
15 | static public XmlRpcRequestDeserializer Singleton | ||
16 | { | ||
17 | get | ||
18 | { | ||
19 | if (_singleton == null) | ||
20 | _singleton = new XmlRpcRequestDeserializer(); | ||
21 | |||
22 | return _singleton; | ||
23 | } | ||
24 | } | ||
25 | |||
26 | /// <summary>Static method that parses XML data into a request using the Singleton.</summary> | ||
27 | /// <param name="xmlData"><c>StreamReader</c> containing an XML-RPC request.</param> | ||
28 | /// <returns><c>XmlRpcRequest</c> object resulting from the parse.</returns> | ||
29 | override public Object Deserialize(TextReader xmlData) | ||
30 | { | ||
31 | XmlTextReader reader = new XmlTextReader(xmlData); | ||
32 | XmlRpcRequest request = new XmlRpcRequest(); | ||
33 | bool done = false; | ||
34 | |||
35 | lock (this) | ||
36 | { | ||
37 | Reset(); | ||
38 | while (!done && reader.Read()) | ||
39 | { | ||
40 | DeserializeNode(reader); // Parent parse... | ||
41 | switch (reader.NodeType) | ||
42 | { | ||
43 | case XmlNodeType.EndElement: | ||
44 | switch (reader.Name) | ||
45 | { | ||
46 | case METHOD_NAME: | ||
47 | request.MethodName = _text; | ||
48 | break; | ||
49 | case METHOD_CALL: | ||
50 | done = true; | ||
51 | break; | ||
52 | case PARAM: | ||
53 | request.Params.Add(_value); | ||
54 | _text = null; | ||
55 | break; | ||
56 | } | ||
57 | break; | ||
58 | } | ||
59 | } | ||
60 | } | ||
61 | return request; | ||
62 | } | ||
63 | } | ||
64 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.Xml; | ||
6 | using System.IO; | ||
7 | |||
8 | /// <summary>Class responsible for serializing an XML-RPC request.</summary> | ||
9 | /// <remarks>This class handles the request envelope, depending on <c>XmlRpcSerializer</c> | ||
10 | /// to serialize the payload.</remarks> | ||
11 | /// <seealso cref="XmlRpcSerializer"/> | ||
12 | public class XmlRpcRequestSerializer : XmlRpcSerializer | ||
13 | { | ||
14 | static private XmlRpcRequestSerializer _singleton; | ||
15 | /// <summary>A static singleton instance of this deserializer.</summary> | ||
16 | static public XmlRpcRequestSerializer Singleton | ||
17 | { | ||
18 | get | ||
19 | { | ||
20 | if (_singleton == null) | ||
21 | _singleton = new XmlRpcRequestSerializer(); | ||
22 | |||
23 | return _singleton; | ||
24 | } | ||
25 | } | ||
26 | |||
27 | /// <summary>Serialize the <c>XmlRpcRequest</c> to the output stream.</summary> | ||
28 | /// <param name="output">An <c>XmlTextWriter</c> stream to write data to.</param> | ||
29 | /// <param name="obj">An <c>XmlRpcRequest</c> to serialize.</param> | ||
30 | /// <seealso cref="XmlRpcRequest"/> | ||
31 | override public void Serialize(XmlTextWriter output, Object obj) | ||
32 | { | ||
33 | XmlRpcRequest request = (XmlRpcRequest)obj; | ||
34 | output.WriteStartDocument(); | ||
35 | output.WriteStartElement(METHOD_CALL); | ||
36 | output.WriteElementString(METHOD_NAME, request.MethodName); | ||
37 | output.WriteStartElement(PARAMS); | ||
38 | foreach (Object param in request.Params) | ||
39 | { | ||
40 | output.WriteStartElement(PARAM); | ||
41 | output.WriteStartElement(VALUE); | ||
42 | SerializeObject(output, param); | ||
43 | output.WriteEndElement(); | ||
44 | output.WriteEndElement(); | ||
45 | } | ||
46 | |||
47 | output.WriteEndElement(); | ||
48 | output.WriteEndElement(); | ||
49 | } | ||
50 | } | ||
51 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Xml; | ||
5 | using System.Net.Sockets; | ||
6 | |||
7 | /// <summary>The class is a container of the context of an XML-RPC dialog on the server side.</summary> | ||
8 | /// <remarks>Instances of this class maintain the context for an individual XML-RPC server | ||
9 | /// side dialog. Namely they manage an inbound deserializer and an outbound serializer. </remarks> | ||
10 | public class XmlRpcResponder | ||
11 | { | ||
12 | private XmlRpcRequestDeserializer _deserializer = new XmlRpcRequestDeserializer(); | ||
13 | private XmlRpcResponseSerializer _serializer = new XmlRpcResponseSerializer(); | ||
14 | private XmlRpcServer _server; | ||
15 | private TcpClient _client; | ||
16 | private SimpleHttpRequest _httpReq; | ||
17 | |||
18 | /// <summary>The SimpleHttpRequest based on the TcpClient.</summary> | ||
19 | public SimpleHttpRequest HttpReq | ||
20 | { | ||
21 | get { return _httpReq; } | ||
22 | } | ||
23 | |||
24 | /// <summary>Basic constructor.</summary> | ||
25 | /// <param name="server">XmlRpcServer that this XmlRpcResponder services.</param> | ||
26 | /// <param name="client">TcpClient with the connection.</param> | ||
27 | public XmlRpcResponder(XmlRpcServer server, TcpClient client) | ||
28 | { | ||
29 | _server = server; | ||
30 | _client = client; | ||
31 | _httpReq = new SimpleHttpRequest(_client); | ||
32 | } | ||
33 | |||
34 | /// <summary>Call close to insure proper shutdown.</summary> | ||
35 | ~XmlRpcResponder() | ||
36 | { | ||
37 | Close(); | ||
38 | } | ||
39 | |||
40 | ///<summary>Respond using this responders HttpReq.</summary> | ||
41 | public void Respond() | ||
42 | { | ||
43 | Respond(HttpReq); | ||
44 | } | ||
45 | |||
46 | /// <summary>Handle an HTTP request containing an XML-RPC request.</summary> | ||
47 | /// <remarks>This method deserializes the XML-RPC request, invokes the | ||
48 | /// described method, serializes the response (or fault) and sends the XML-RPC response | ||
49 | /// back as a valid HTTP page. | ||
50 | /// </remarks> | ||
51 | /// <param name="httpReq"><c>SimpleHttpRequest</c> containing the request.</param> | ||
52 | public void Respond(SimpleHttpRequest httpReq) | ||
53 | { | ||
54 | XmlRpcRequest xmlRpcReq = (XmlRpcRequest)_deserializer.Deserialize(httpReq.Input); | ||
55 | XmlRpcResponse xmlRpcResp = new XmlRpcResponse(); | ||
56 | |||
57 | try | ||
58 | { | ||
59 | xmlRpcResp.Value = _server.Invoke(xmlRpcReq); | ||
60 | } | ||
61 | catch (XmlRpcException e) | ||
62 | { | ||
63 | xmlRpcResp.SetFault(e.FaultCode, e.FaultString); | ||
64 | } | ||
65 | catch (Exception e2) | ||
66 | { | ||
67 | xmlRpcResp.SetFault(XmlRpcErrorCodes.APPLICATION_ERROR, | ||
68 | XmlRpcErrorCodes.APPLICATION_ERROR_MSG + ": " + e2.Message); | ||
69 | } | ||
70 | |||
71 | if (Logger.Delegate != null) | ||
72 | Logger.WriteEntry(xmlRpcResp.ToString(), LogLevel.Information); | ||
73 | |||
74 | XmlRpcServer.HttpHeader(httpReq.Protocol, "text/xml", 0, " 200 OK", httpReq.Output); | ||
75 | httpReq.Output.Flush(); | ||
76 | XmlTextWriter xml = new XmlTextWriter(httpReq.Output); | ||
77 | _serializer.Serialize(xml, xmlRpcResp); | ||
78 | xml.Flush(); | ||
79 | httpReq.Output.Flush(); | ||
80 | } | ||
81 | |||
82 | ///<summary>Close all contained resources, both the HttpReq and client.</summary> | ||
83 | public void Close() | ||
84 | { | ||
85 | if (_httpReq != null) | ||
86 | { | ||
87 | _httpReq.Close(); | ||
88 | _httpReq = null; | ||
89 | } | ||
90 | |||
91 | if (_client != null) | ||
92 | { | ||
93 | _client.Close(); | ||
94 | _client = null; | ||
95 | } | ||
96 | } | ||
97 | } | ||
98 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Xml; | ||
7 | |||
8 | /// <summary>Class designed to represent an XML-RPC response.</summary> | ||
9 | public class XmlRpcResponse | ||
10 | { | ||
11 | private Object _value; | ||
12 | /// <summary><c>bool</c> indicating if this response represents a fault.</summary> | ||
13 | public bool IsFault; | ||
14 | |||
15 | /// <summary>Basic constructor</summary> | ||
16 | public XmlRpcResponse() | ||
17 | { | ||
18 | Value = null; | ||
19 | IsFault = false; | ||
20 | } | ||
21 | |||
22 | /// <summary>Constructor for a fault.</summary> | ||
23 | /// <param name="code"><c>int</c> the numeric faultCode value.</param> | ||
24 | /// <param name="message"><c>String</c> the faultString value.</param> | ||
25 | public XmlRpcResponse(int code, String message) | ||
26 | : this() | ||
27 | { | ||
28 | SetFault(code, message); | ||
29 | } | ||
30 | |||
31 | /// <summary>The data value of the response, may be fault data.</summary> | ||
32 | public Object Value | ||
33 | { | ||
34 | get { return _value; } | ||
35 | set | ||
36 | { | ||
37 | IsFault = false; | ||
38 | _value = value; | ||
39 | } | ||
40 | } | ||
41 | |||
42 | /// <summary>The faultCode if this is a fault.</summary> | ||
43 | public int FaultCode | ||
44 | { | ||
45 | get | ||
46 | { | ||
47 | if (!IsFault) | ||
48 | return 0; | ||
49 | else | ||
50 | return (int)((Hashtable)_value)[XmlRpcXmlTokens.FAULT_CODE]; | ||
51 | } | ||
52 | } | ||
53 | |||
54 | /// <summary>The faultString if this is a fault.</summary> | ||
55 | public String FaultString | ||
56 | { | ||
57 | get | ||
58 | { | ||
59 | if (!IsFault) | ||
60 | return ""; | ||
61 | else | ||
62 | return (String)((Hashtable)_value)[XmlRpcXmlTokens.FAULT_STRING]; | ||
63 | } | ||
64 | } | ||
65 | |||
66 | /// <summary>Set this response to be a fault.</summary> | ||
67 | /// <param name="code"><c>int</c> the numeric faultCode value.</param> | ||
68 | /// <param name="message"><c>String</c> the faultString value.</param> | ||
69 | public void SetFault(int code, String message) | ||
70 | { | ||
71 | Hashtable fault = new Hashtable(); | ||
72 | fault.Add("faultCode", code); | ||
73 | fault.Add("faultString", message); | ||
74 | Value = fault; | ||
75 | IsFault = true; | ||
76 | } | ||
77 | |||
78 | /// <summary>Form a useful string representation of the object, in this case the XML response.</summary> | ||
79 | /// <returns><c>String</c> The XML serialized XML-RPC response.</returns> | ||
80 | override public String ToString() | ||
81 | { | ||
82 | return XmlRpcResponseSerializer.Singleton.Serialize(this); | ||
83 | } | ||
84 | } | ||
85 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Xml; | ||
7 | |||
8 | /// <summary>Class to deserialize XML data representing a response.</summary> | ||
9 | public class XmlRpcResponseDeserializer : XmlRpcDeserializer | ||
10 | { | ||
11 | static private XmlRpcResponseDeserializer _singleton; | ||
12 | /// <summary>A static singleton instance of this deserializer.</summary> | ||
13 | [Obsolete("This object is now thread safe, just use an instance.", false)] | ||
14 | static public XmlRpcResponseDeserializer Singleton | ||
15 | { | ||
16 | get | ||
17 | { | ||
18 | if (_singleton == null) | ||
19 | _singleton = new XmlRpcResponseDeserializer(); | ||
20 | |||
21 | return _singleton; | ||
22 | } | ||
23 | } | ||
24 | |||
25 | /// <summary>Static method that parses XML data into a response using the Singleton.</summary> | ||
26 | /// <param name="xmlData"><c>StreamReader</c> containing an XML-RPC response.</param> | ||
27 | /// <returns><c>XmlRpcResponse</c> object resulting from the parse.</returns> | ||
28 | override public Object Deserialize(TextReader xmlData) | ||
29 | { | ||
30 | XmlTextReader reader = new XmlTextReader(xmlData); | ||
31 | XmlRpcResponse response = new XmlRpcResponse(); | ||
32 | bool done = false; | ||
33 | |||
34 | lock (this) | ||
35 | { | ||
36 | Reset(); | ||
37 | |||
38 | while (!done && reader.Read()) | ||
39 | { | ||
40 | DeserializeNode(reader); // Parent parse... | ||
41 | switch (reader.NodeType) | ||
42 | { | ||
43 | case XmlNodeType.EndElement: | ||
44 | switch (reader.Name) | ||
45 | { | ||
46 | case FAULT: | ||
47 | response.Value = _value; | ||
48 | response.IsFault = true; | ||
49 | break; | ||
50 | case PARAM: | ||
51 | response.Value = _value; | ||
52 | _value = null; | ||
53 | _text = null; | ||
54 | break; | ||
55 | } | ||
56 | break; | ||
57 | default: | ||
58 | break; | ||
59 | } | ||
60 | } | ||
61 | } | ||
62 | return response; | ||
63 | } | ||
64 | } | ||
65 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.Xml; | ||
6 | |||
7 | /// <summary>Class responsible for serializing an XML-RPC response.</summary> | ||
8 | /// <remarks>This class handles the response envelope, depending on XmlRpcSerializer | ||
9 | /// to serialize the payload.</remarks> | ||
10 | /// <seealso cref="XmlRpcSerializer"/> | ||
11 | public class XmlRpcResponseSerializer : XmlRpcSerializer | ||
12 | { | ||
13 | static private XmlRpcResponseSerializer _singleton; | ||
14 | /// <summary>A static singleton instance of this deserializer.</summary> | ||
15 | static public XmlRpcResponseSerializer Singleton | ||
16 | { | ||
17 | get | ||
18 | { | ||
19 | if (_singleton == null) | ||
20 | _singleton = new XmlRpcResponseSerializer(); | ||
21 | |||
22 | return _singleton; | ||
23 | } | ||
24 | } | ||
25 | |||
26 | /// <summary>Serialize the <c>XmlRpcResponse</c> to the output stream.</summary> | ||
27 | /// <param name="output">An <c>XmlTextWriter</c> stream to write data to.</param> | ||
28 | /// <param name="obj">An <c>Object</c> to serialize.</param> | ||
29 | /// <seealso cref="XmlRpcResponse"/> | ||
30 | override public void Serialize(XmlTextWriter output, Object obj) | ||
31 | { | ||
32 | XmlRpcResponse response = (XmlRpcResponse)obj; | ||
33 | |||
34 | output.WriteStartDocument(); | ||
35 | output.WriteStartElement(METHOD_RESPONSE); | ||
36 | |||
37 | if (response.IsFault) | ||
38 | output.WriteStartElement(FAULT); | ||
39 | else | ||
40 | { | ||
41 | output.WriteStartElement(PARAMS); | ||
42 | output.WriteStartElement(PARAM); | ||
43 | } | ||
44 | |||
45 | output.WriteStartElement(VALUE); | ||
46 | |||
47 | SerializeObject(output, response.Value); | ||
48 | |||
49 | output.WriteEndElement(); | ||
50 | |||
51 | output.WriteEndElement(); | ||
52 | if (!response.IsFault) | ||
53 | output.WriteEndElement(); | ||
54 | output.WriteEndElement(); | ||
55 | } | ||
56 | } | ||
57 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Xml; | ||
7 | |||
8 | /// <summary>Base class of classes serializing data to XML-RPC's XML format.</summary> | ||
9 | /// <remarks>This class handles the basic type conversions like Integer to <i4>. </remarks> | ||
10 | /// <seealso cref="XmlRpcXmlTokens"/> | ||
11 | public class XmlRpcSerializer : XmlRpcXmlTokens | ||
12 | { | ||
13 | |||
14 | /// <summary>Serialize the <c>XmlRpcRequest</c> to the output stream.</summary> | ||
15 | /// <param name="output">An <c>XmlTextWriter</c> stream to write data to.</param> | ||
16 | /// <param name="obj">An <c>Object</c> to serialize.</param> | ||
17 | /// <seealso cref="XmlRpcRequest"/> | ||
18 | virtual public void Serialize(XmlTextWriter output, Object obj) | ||
19 | { | ||
20 | } | ||
21 | |||
22 | /// <summary>Serialize the <c>XmlRpcRequest</c> to a String.</summary> | ||
23 | /// <remarks>Note this may represent a real memory hog for a large request.</remarks> | ||
24 | /// <param name="obj">An <c>Object</c> to serialize.</param> | ||
25 | /// <returns><c>String</c> containing XML-RPC representation of the request.</returns> | ||
26 | /// <seealso cref="XmlRpcRequest"/> | ||
27 | public String Serialize(Object obj) | ||
28 | { | ||
29 | StringWriter strBuf = new StringWriter(); | ||
30 | XmlTextWriter xml = new XmlTextWriter(strBuf); | ||
31 | xml.Formatting = Formatting.Indented; | ||
32 | xml.Indentation = 4; | ||
33 | Serialize(xml, obj); | ||
34 | xml.Flush(); | ||
35 | String returns = strBuf.ToString(); | ||
36 | xml.Close(); | ||
37 | return returns; | ||
38 | } | ||
39 | |||
40 | /// <remarks>Serialize the object to the output stream.</remarks> | ||
41 | /// <param name="output">An <c>XmlTextWriter</c> stream to write data to.</param> | ||
42 | /// <param name="obj">An <c>Object</c> to serialize.</param> | ||
43 | public void SerializeObject(XmlTextWriter output, Object obj) | ||
44 | { | ||
45 | if (obj == null) | ||
46 | return; | ||
47 | |||
48 | if (obj is byte[]) | ||
49 | { | ||
50 | byte[] ba = (byte[])obj; | ||
51 | output.WriteStartElement(BASE64); | ||
52 | output.WriteBase64(ba, 0, ba.Length); | ||
53 | output.WriteEndElement(); | ||
54 | } | ||
55 | else if (obj is String) | ||
56 | { | ||
57 | output.WriteElementString(STRING, obj.ToString()); | ||
58 | } | ||
59 | else if (obj is Int32) | ||
60 | { | ||
61 | output.WriteElementString(INT, obj.ToString()); | ||
62 | } | ||
63 | else if (obj is DateTime) | ||
64 | { | ||
65 | output.WriteElementString(DATETIME, ((DateTime)obj).ToString(ISO_DATETIME)); | ||
66 | } | ||
67 | else if (obj is Double) | ||
68 | { | ||
69 | output.WriteElementString(DOUBLE, obj.ToString()); | ||
70 | } | ||
71 | else if (obj is Boolean) | ||
72 | { | ||
73 | output.WriteElementString(BOOLEAN, ((((Boolean)obj) == true) ? "1" : "0")); | ||
74 | } | ||
75 | else if (obj is IList) | ||
76 | { | ||
77 | output.WriteStartElement(ARRAY); | ||
78 | output.WriteStartElement(DATA); | ||
79 | if (((ArrayList)obj).Count > 0) | ||
80 | { | ||
81 | foreach (Object member in ((IList)obj)) | ||
82 | { | ||
83 | output.WriteStartElement(VALUE); | ||
84 | SerializeObject(output, member); | ||
85 | output.WriteEndElement(); | ||
86 | } | ||
87 | } | ||
88 | output.WriteEndElement(); | ||
89 | output.WriteEndElement(); | ||
90 | } | ||
91 | else if (obj is IDictionary) | ||
92 | { | ||
93 | IDictionary h = (IDictionary)obj; | ||
94 | output.WriteStartElement(STRUCT); | ||
95 | foreach (String key in h.Keys) | ||
96 | { | ||
97 | output.WriteStartElement(MEMBER); | ||
98 | output.WriteElementString(NAME, key); | ||
99 | output.WriteStartElement(VALUE); | ||
100 | SerializeObject(output, h[key]); | ||
101 | output.WriteEndElement(); | ||
102 | output.WriteEndElement(); | ||
103 | } | ||
104 | output.WriteEndElement(); | ||
105 | } | ||
106 | |||
107 | } | ||
108 | } | ||
109 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.IO; | ||
6 | using System.Net; | ||
7 | using System.Net.Sockets; | ||
8 | using System.Text; | ||
9 | using System.Threading; | ||
10 | using System.Xml; | ||
11 | |||
12 | /// <summary>A restricted HTTP server for use with XML-RPC.</summary> | ||
13 | /// <remarks>It only handles POST requests, and only POSTs representing XML-RPC calls. | ||
14 | /// In addition to dispatching requests it also provides a registry for request handlers. | ||
15 | /// </remarks> | ||
16 | public class XmlRpcServer : IEnumerable | ||
17 | { | ||
18 | #pragma warning disable 0414 // disable "private field assigned but not used" | ||
19 | const int RESPONDER_COUNT = 10; | ||
20 | private TcpListener _myListener; | ||
21 | private int _port; | ||
22 | private IPAddress _address; | ||
23 | private IDictionary _handlers; | ||
24 | private XmlRpcSystemObject _system; | ||
25 | private WaitCallback _wc; | ||
26 | #pragma warning restore 0414 | ||
27 | |||
28 | ///<summary>Constructor with port and address.</summary> | ||
29 | ///<remarks>This constructor sets up a TcpListener listening on the | ||
30 | ///given port and address. It also calls a Thread on the method StartListen().</remarks> | ||
31 | ///<param name="address"><c>IPAddress</c> value of the address to listen on.</param> | ||
32 | ///<param name="port"><c>Int</c> value of the port to listen on.</param> | ||
33 | public XmlRpcServer(IPAddress address, int port) | ||
34 | { | ||
35 | _port = port; | ||
36 | _address = address; | ||
37 | _handlers = new Hashtable(); | ||
38 | _system = new XmlRpcSystemObject(this); | ||
39 | _wc = new WaitCallback(WaitCallback); | ||
40 | } | ||
41 | |||
42 | ///<summary>Basic constructor.</summary> | ||
43 | ///<remarks>This constructor sets up a TcpListener listening on the | ||
44 | ///given port. It also calls a Thread on the method StartListen(). IPAddress.Any | ||
45 | ///is assumed as the address here.</remarks> | ||
46 | ///<param name="port"><c>Int</c> value of the port to listen on.</param> | ||
47 | public XmlRpcServer(int port) : this(IPAddress.Any, port) { } | ||
48 | |||
49 | /// <summary>Start the server.</summary> | ||
50 | public void Start() | ||
51 | { | ||
52 | try | ||
53 | { | ||
54 | Stop(); | ||
55 | //start listing on the given port | ||
56 | // IPAddress addr = IPAddress.Parse("127.0.0.1"); | ||
57 | lock (this) | ||
58 | { | ||
59 | _myListener = new TcpListener(IPAddress.Any, _port); | ||
60 | _myListener.Start(); | ||
61 | //start the thread which calls the method 'StartListen' | ||
62 | Thread th = new Thread(new ThreadStart(StartListen)); | ||
63 | th.Start(); | ||
64 | } | ||
65 | } | ||
66 | catch (Exception e) | ||
67 | { | ||
68 | Logger.WriteEntry("An Exception Occurred while Listening :" + e.ToString(), LogLevel.Error); | ||
69 | } | ||
70 | } | ||
71 | |||
72 | /// <summary>Stop the server.</summary> | ||
73 | public void Stop() | ||
74 | { | ||
75 | try | ||
76 | { | ||
77 | if (_myListener != null) | ||
78 | { | ||
79 | lock (this) | ||
80 | { | ||
81 | _myListener.Stop(); | ||
82 | _myListener = null; | ||
83 | } | ||
84 | } | ||
85 | } | ||
86 | catch (Exception e) | ||
87 | { | ||
88 | Logger.WriteEntry("An Exception Occurred while stopping :" + | ||
89 | e.ToString(), LogLevel.Error); | ||
90 | } | ||
91 | } | ||
92 | |||
93 | /// <summary>Get an enumeration of my XML-RPC handlers.</summary> | ||
94 | /// <returns><c>IEnumerable</c> the handler enumeration.</returns> | ||
95 | public IEnumerator GetEnumerator() | ||
96 | { | ||
97 | return _handlers.GetEnumerator(); | ||
98 | } | ||
99 | |||
100 | /// <summary>Retrieve a handler by name.</summary> | ||
101 | /// <param name="name"><c>String</c> naming a handler</param> | ||
102 | /// <returns><c>Object</c> that is the handler.</returns> | ||
103 | public Object this[String name] | ||
104 | { | ||
105 | get { return _handlers[name]; } | ||
106 | } | ||
107 | |||
108 | ///<summary> | ||
109 | ///This method Accepts new connections and dispatches them when appropriate. | ||
110 | ///</summary> | ||
111 | public void StartListen() | ||
112 | { | ||
113 | while (true && _myListener != null) | ||
114 | { | ||
115 | //Accept a new connection | ||
116 | XmlRpcResponder responder = new XmlRpcResponder(this, _myListener.AcceptTcpClient()); | ||
117 | ThreadPool.QueueUserWorkItem(_wc, responder); | ||
118 | } | ||
119 | } | ||
120 | |||
121 | |||
122 | ///<summary> | ||
123 | ///Add an XML-RPC handler object by name. | ||
124 | ///</summary> | ||
125 | ///<param name="name"><c>String</c> XML-RPC dispatch name of this object.</param> | ||
126 | ///<param name="obj"><c>Object</c> The object that is the XML-RPC handler.</param> | ||
127 | public void Add(String name, Object obj) | ||
128 | { | ||
129 | _handlers.Add(name, obj); | ||
130 | } | ||
131 | |||
132 | ///<summary>Return a C# object.method name for and XML-RPC object.method name pair.</summary> | ||
133 | ///<param name="methodName">The XML-RPC object.method.</param> | ||
134 | ///<returns><c>String</c> of form object.method for the underlying C# method.</returns> | ||
135 | public String MethodName(String methodName) | ||
136 | { | ||
137 | int dotAt = methodName.LastIndexOf('.'); | ||
138 | |||
139 | if (dotAt == -1) | ||
140 | { | ||
141 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD, | ||
142 | XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Bad method name " + methodName); | ||
143 | } | ||
144 | |||
145 | String objectName = methodName.Substring(0, dotAt); | ||
146 | Object target = _handlers[objectName]; | ||
147 | |||
148 | if (target == null) | ||
149 | { | ||
150 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD, | ||
151 | XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Object " + objectName + " not found"); | ||
152 | } | ||
153 | |||
154 | return target.GetType().FullName + "." + methodName.Substring(dotAt + 1); | ||
155 | } | ||
156 | |||
157 | ///<summary>Invoke a method described in a request.</summary> | ||
158 | ///<param name="req"><c>XmlRpcRequest</c> containing a method descriptions.</param> | ||
159 | /// <seealso cref="XmlRpcSystemObject.Invoke"/> | ||
160 | /// <seealso cref="XmlRpcServer.Invoke(String,String,IList)"/> | ||
161 | public Object Invoke(XmlRpcRequest req) | ||
162 | { | ||
163 | return Invoke(req.MethodNameObject, req.MethodNameMethod, req.Params); | ||
164 | } | ||
165 | |||
166 | ///<summary>Invoke a method on a named handler.</summary> | ||
167 | ///<param name="objectName"><c>String</c> The name of the handler.</param> | ||
168 | ///<param name="methodName"><c>String</c> The name of the method to invoke on the handler.</param> | ||
169 | ///<param name="parameters"><c>IList</c> The parameters to invoke the method with.</param> | ||
170 | /// <seealso cref="XmlRpcSystemObject.Invoke"/> | ||
171 | public Object Invoke(String objectName, String methodName, IList parameters) | ||
172 | { | ||
173 | Object target = _handlers[objectName]; | ||
174 | |||
175 | if (target == null) | ||
176 | { | ||
177 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD, | ||
178 | XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Object " + objectName + " not found"); | ||
179 | } | ||
180 | |||
181 | return XmlRpcSystemObject.Invoke(target, methodName, parameters); | ||
182 | } | ||
183 | |||
184 | /// <summary>The method the thread pool invokes when a thread is available to handle an HTTP request.</summary> | ||
185 | /// <param name="responder">TcpClient from the socket accept.</param> | ||
186 | public void WaitCallback(object responder) | ||
187 | { | ||
188 | XmlRpcResponder resp = (XmlRpcResponder)responder; | ||
189 | |||
190 | if (resp.HttpReq.HttpMethod == "POST") | ||
191 | { | ||
192 | try | ||
193 | { | ||
194 | resp.Respond(); | ||
195 | } | ||
196 | catch (Exception e) | ||
197 | { | ||
198 | Logger.WriteEntry("Failed on post: " + e, LogLevel.Error); | ||
199 | } | ||
200 | } | ||
201 | else | ||
202 | { | ||
203 | Logger.WriteEntry("Only POST methods are supported: " + resp.HttpReq.HttpMethod + | ||
204 | " ignored", LogLevel.Error); | ||
205 | } | ||
206 | |||
207 | resp.Close(); | ||
208 | } | ||
209 | |||
210 | /// <summary> | ||
211 | /// This function send the Header Information to the client (Browser) | ||
212 | /// </summary> | ||
213 | /// <param name="sHttpVersion">HTTP Version</param> | ||
214 | /// <param name="sMIMEHeader">Mime Type</param> | ||
215 | /// <param name="iTotBytes">Total Bytes to be sent in the body</param> | ||
216 | /// <param name="sStatusCode"></param> | ||
217 | /// <param name="output">Socket reference</param> | ||
218 | static public void HttpHeader(string sHttpVersion, string sMIMEHeader, long iTotBytes, string sStatusCode, TextWriter output) | ||
219 | { | ||
220 | String sBuffer = ""; | ||
221 | |||
222 | // if Mime type is not provided set default to text/html | ||
223 | if (sMIMEHeader.Length == 0) | ||
224 | { | ||
225 | sMIMEHeader = "text/html"; // Default Mime Type is text/html | ||
226 | } | ||
227 | |||
228 | sBuffer += sHttpVersion + sStatusCode + "\r\n"; | ||
229 | sBuffer += "Connection: close\r\n"; | ||
230 | if (iTotBytes > 0) | ||
231 | sBuffer += "Content-Length: " + iTotBytes + "\r\n"; | ||
232 | sBuffer += "Server: XmlRpcServer \r\n"; | ||
233 | sBuffer += "Content-Type: " + sMIMEHeader + "\r\n"; | ||
234 | sBuffer += "\r\n"; | ||
235 | |||
236 | output.Write(sBuffer); | ||
237 | } | ||
238 | } | ||
239 | } | ||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | using System.Collections; | ||
5 | using System.Reflection; | ||
6 | |||
7 | /// <summary> XML-RPC System object implementation of extended specifications.</summary> | ||
8 | [XmlRpcExposed] | ||
9 | public class XmlRpcSystemObject | ||
10 | { | ||
11 | private XmlRpcServer _server; | ||
12 | static private IDictionary _methodHelp = new Hashtable(); | ||
13 | |||
14 | /// <summary>Static <c>IDictionary</c> to hold mappings of method name to associated documentation String</summary> | ||
15 | static public IDictionary MethodHelp | ||
16 | { | ||
17 | get { return _methodHelp; } | ||
18 | } | ||
19 | |||
20 | /// <summary>Constructor.</summary> | ||
21 | /// <param name="server"><c>XmlRpcServer</c> server to be the system object for.</param> | ||
22 | public XmlRpcSystemObject(XmlRpcServer server) | ||
23 | { | ||
24 | _server = server; | ||
25 | server.Add("system", this); | ||
26 | _methodHelp.Add(this.GetType().FullName + ".methodHelp", "Return a string description."); | ||
27 | } | ||
28 | |||
29 | /// <summary>Invoke a method on a given object.</summary> | ||
30 | /// <remarks>Using reflection, and respecting the <c>XmlRpcExposed</c> attribute, | ||
31 | /// invoke the <paramref>methodName</paramref> method on the <paramref>target</paramref> | ||
32 | /// instance with the <paramref>parameters</paramref> provided. All this packages other <c>Invoke</c> methods | ||
33 | /// end up calling this.</remarks> | ||
34 | /// <returns><c>Object</c> the value the invoked method returns.</returns> | ||
35 | /// <exception cref="XmlRpcException">If method does not exist, is not exposed, parameters invalid, or invocation | ||
36 | /// results in an exception. Note, the <c>XmlRpcException.Code</c> will indicate cause.</exception> | ||
37 | static public Object Invoke(Object target, String methodName, IList parameters) | ||
38 | { | ||
39 | if (target == null) | ||
40 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD, | ||
41 | XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Invalid target object."); | ||
42 | |||
43 | Type type = target.GetType(); | ||
44 | MethodInfo method = type.GetMethod(methodName); | ||
45 | |||
46 | try | ||
47 | { | ||
48 | if (!XmlRpcExposedAttribute.ExposedMethod(target, methodName)) | ||
49 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD, | ||
50 | XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": Method " + methodName + " is not exposed."); | ||
51 | } | ||
52 | catch (MissingMethodException me) | ||
53 | { | ||
54 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_METHOD, | ||
55 | XmlRpcErrorCodes.SERVER_ERROR_METHOD_MSG + ": " + me.Message); | ||
56 | } | ||
57 | |||
58 | Object[] args = new Object[parameters.Count]; | ||
59 | |||
60 | int index = 0; | ||
61 | foreach (Object arg in parameters) | ||
62 | { | ||
63 | args[index] = arg; | ||
64 | index++; | ||
65 | } | ||
66 | |||
67 | try | ||
68 | { | ||
69 | Object retValue = method.Invoke(target, args); | ||
70 | if (retValue == null) | ||
71 | throw new XmlRpcException(XmlRpcErrorCodes.APPLICATION_ERROR, | ||
72 | XmlRpcErrorCodes.APPLICATION_ERROR_MSG + ": Method returned NULL."); | ||
73 | return retValue; | ||
74 | } | ||
75 | catch (XmlRpcException e) | ||
76 | { | ||
77 | throw e; | ||
78 | } | ||
79 | catch (ArgumentException ae) | ||
80 | { | ||
81 | Logger.WriteEntry(XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": " + ae.Message, | ||
82 | LogLevel.Information); | ||
83 | String call = methodName + "( "; | ||
84 | foreach (Object o in args) | ||
85 | { | ||
86 | call += o.GetType().Name; | ||
87 | call += " "; | ||
88 | } | ||
89 | call += ")"; | ||
90 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_PARAMS, | ||
91 | XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": Arguement type mismatch invoking " + call); | ||
92 | } | ||
93 | catch (TargetParameterCountException tpce) | ||
94 | { | ||
95 | Logger.WriteEntry(XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": " + tpce.Message, | ||
96 | LogLevel.Information); | ||
97 | throw new XmlRpcException(XmlRpcErrorCodes.SERVER_ERROR_PARAMS, | ||
98 | XmlRpcErrorCodes.SERVER_ERROR_PARAMS_MSG + ": Arguement count mismatch invoking " + methodName); | ||
99 | } | ||
100 | catch (TargetInvocationException tie) | ||
101 | { | ||
102 | throw new XmlRpcException(XmlRpcErrorCodes.APPLICATION_ERROR, | ||
103 | XmlRpcErrorCodes.APPLICATION_ERROR_MSG + " Invoked method " + methodName + ": " + tie.Message); | ||
104 | } | ||
105 | } | ||
106 | |||
107 | /// <summary>List methods available on all handlers of this server.</summary> | ||
108 | /// <returns><c>IList</c> An array of <c>Strings</c>, each <c>String</c> will have form "object.method".</returns> | ||
109 | [XmlRpcExposed] | ||
110 | public IList listMethods() | ||
111 | { | ||
112 | IList methods = new ArrayList(); | ||
113 | Boolean considerExposure; | ||
114 | |||
115 | foreach (DictionaryEntry handlerEntry in _server) | ||
116 | { | ||
117 | considerExposure = XmlRpcExposedAttribute.IsExposed(handlerEntry.Value.GetType()); | ||
118 | |||
119 | foreach (MemberInfo mi in handlerEntry.Value.GetType().GetMembers()) | ||
120 | { | ||
121 | if (mi.MemberType != MemberTypes.Method) | ||
122 | continue; | ||
123 | |||
124 | if (!((MethodInfo)mi).IsPublic) | ||
125 | continue; | ||
126 | |||
127 | if (considerExposure && !XmlRpcExposedAttribute.IsExposed(mi)) | ||
128 | continue; | ||
129 | |||
130 | methods.Add(handlerEntry.Key + "." + mi.Name); | ||
131 | } | ||
132 | } | ||
133 | |||
134 | return methods; | ||
135 | } | ||
136 | |||
137 | /// <summary>Given a method name return the possible signatures for it.</summary> | ||
138 | /// <param name="name"><c>String</c> The object.method name to look up.</param> | ||
139 | /// <returns><c>IList</c> Of arrays of signatures.</returns> | ||
140 | [XmlRpcExposed] | ||
141 | public IList methodSignature(String name) | ||
142 | { | ||
143 | IList signatures = new ArrayList(); | ||
144 | int index = name.IndexOf('.'); | ||
145 | |||
146 | if (index < 0) | ||
147 | return signatures; | ||
148 | |||
149 | String oName = name.Substring(0, index); | ||
150 | Object obj = _server[oName]; | ||
151 | |||
152 | if (obj == null) | ||
153 | return signatures; | ||
154 | |||
155 | MemberInfo[] mi = obj.GetType().GetMember(name.Substring(index + 1)); | ||
156 | |||
157 | if (mi == null || mi.Length != 1) // for now we want a single signature | ||
158 | return signatures; | ||
159 | |||
160 | MethodInfo method; | ||
161 | |||
162 | try | ||
163 | { | ||
164 | method = (MethodInfo)mi[0]; | ||
165 | } | ||
166 | catch (Exception e) | ||
167 | { | ||
168 | Logger.WriteEntry("Attempted methodSignature call on " + mi[0] + " caused: " + e, | ||
169 | LogLevel.Information); | ||
170 | return signatures; | ||
171 | } | ||
172 | |||
173 | if (!method.IsPublic) | ||
174 | return signatures; | ||
175 | |||
176 | IList signature = new ArrayList(); | ||
177 | signature.Add(method.ReturnType.Name); | ||
178 | |||
179 | foreach (ParameterInfo param in method.GetParameters()) | ||
180 | { | ||
181 | signature.Add(param.ParameterType.Name); | ||
182 | } | ||
183 | |||
184 | |||
185 | signatures.Add(signature); | ||
186 | |||
187 | return signatures; | ||
188 | } | ||
189 | |||
190 | /// <summary>Help for given method signature. Not implemented yet.</summary> | ||
191 | /// <param name="name"><c>String</c> The object.method name to look up.</param> | ||
192 | /// <returns><c>String</c> help text. Rich HTML text.</returns> | ||
193 | [XmlRpcExposed] | ||
194 | public String methodHelp(String name) | ||
195 | { | ||
196 | String help = null; | ||
197 | |||
198 | try | ||
199 | { | ||
200 | help = (String)_methodHelp[_server.MethodName(name)]; | ||
201 | } | ||
202 | catch (XmlRpcException e) | ||
203 | { | ||
204 | throw e; | ||
205 | } | ||
206 | catch (Exception) { /* ignored */ }; | ||
207 | |||
208 | if (help == null) | ||
209 | help = "No help available for: " + name; | ||
210 | |||
211 | return help; | ||
212 | } | ||
213 | |||
214 | /// <summary>Boxcarring support method.</summary> | ||
215 | /// <param name="calls"><c>IList</c> of calls</param> | ||
216 | /// <returns><c>ArrayList</c> of results/faults.</returns> | ||
217 | [XmlRpcExposed] | ||
218 | public IList multiCall(IList calls) | ||
219 | { | ||
220 | IList responses = new ArrayList(); | ||
221 | XmlRpcResponse fault = new XmlRpcResponse(); | ||
222 | |||
223 | foreach (IDictionary call in calls) | ||
224 | { | ||
225 | try | ||
226 | { | ||
227 | XmlRpcRequest req = new XmlRpcRequest((String)call[XmlRpcXmlTokens.METHOD_NAME], | ||
228 | (ArrayList)call[XmlRpcXmlTokens.PARAMS]); | ||
229 | Object results = _server.Invoke(req); | ||
230 | IList response = new ArrayList(); | ||
231 | response.Add(results); | ||
232 | responses.Add(response); | ||
233 | } | ||
234 | catch (XmlRpcException e) | ||
235 | { | ||
236 | fault.SetFault(e.FaultCode, e.FaultString); | ||
237 | responses.Add(fault.Value); | ||
238 | } | ||
239 | catch (Exception e2) | ||
240 | { | ||
241 | fault.SetFault(XmlRpcErrorCodes.APPLICATION_ERROR, | ||
242 | XmlRpcErrorCodes.APPLICATION_ERROR_MSG + ": " + e2.Message); | ||
243 | responses.Add(fault.Value); | ||
244 | } | ||
245 | } | ||
246 | |||
247 | return responses; | ||
248 | } | ||
249 | |||
250 | } | ||
251 | } | ||
252 | |||
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 @@ | |||
1 | namespace Nwc.XmlRpc | ||
2 | { | ||
3 | using System; | ||
4 | |||
5 | /// <summary>Class collecting <c>String</c> tokens that are part of XML-RPC files.</summary> | ||
6 | public class XmlRpcXmlTokens | ||
7 | { | ||
8 | /// <summary>C# formatting string to describe an ISO 8601 date.</summary> | ||
9 | public const String ISO_DATETIME = "yyyyMMdd\\THH\\:mm\\:ss"; | ||
10 | /// <summary>Base64 field indicator.</summary> | ||
11 | /// <remarks>Corresponds to the <base64> tag.</remarks> | ||
12 | public const String BASE64 = "base64"; | ||
13 | /// <summary>String field indicator.</summary> | ||
14 | /// <remarks>Corresponds to the <string> tag.</remarks> | ||
15 | public const String STRING = "string"; | ||
16 | /// <summary>Integer field integer.</summary> | ||
17 | /// <remarks>Corresponds to the <i4> tag.</remarks> | ||
18 | public const String INT = "i4"; | ||
19 | /// <summary>Alternate integer field indicator.</summary> | ||
20 | /// <remarks>Corresponds to the <int> tag.</remarks> | ||
21 | public const String ALT_INT = "int"; | ||
22 | /// <summary>Date field indicator.</summary> | ||
23 | /// <remarks>Corresponds to the <dateTime.iso8601> tag.</remarks> | ||
24 | public const String DATETIME = "dateTime.iso8601"; | ||
25 | /// <summary>Boolean field indicator.</summary> | ||
26 | /// <remarks>Corresponds to the <boolean> tag.</remarks> | ||
27 | public const String BOOLEAN = "boolean"; | ||
28 | /// <summary>Value token.</summary> | ||
29 | /// <remarks>Corresponds to the <value> tag.</remarks> | ||
30 | public const String VALUE = "value"; | ||
31 | /// <summary>Name token.</summary> | ||
32 | /// <remarks>Corresponds to the <name> tag.</remarks> | ||
33 | public const String NAME = "name"; | ||
34 | /// <summary>Array field indicator..</summary> | ||
35 | /// <remarks>Corresponds to the <array> tag.</remarks> | ||
36 | public const String ARRAY = "array"; | ||
37 | /// <summary>Data token.</summary> | ||
38 | /// <remarks>Corresponds to the <data> tag.</remarks> | ||
39 | public const String DATA = "data"; | ||
40 | /// <summary>Member token.</summary> | ||
41 | /// <remarks>Corresponds to the <member> tag.</remarks> | ||
42 | public const String MEMBER = "member"; | ||
43 | /// <summary>Stuct field indicator.</summary> | ||
44 | /// <remarks>Corresponds to the <struct> tag.</remarks> | ||
45 | public const String STRUCT = "struct"; | ||
46 | /// <summary>Double field indicator.</summary> | ||
47 | /// <remarks>Corresponds to the <double> tag.</remarks> | ||
48 | public const String DOUBLE = "double"; | ||
49 | /// <summary>Param token.</summary> | ||
50 | /// <remarks>Corresponds to the <param> tag.</remarks> | ||
51 | public const String PARAM = "param"; | ||
52 | /// <summary>Params token.</summary> | ||
53 | /// <remarks>Corresponds to the <params> tag.</remarks> | ||
54 | public const String PARAMS = "params"; | ||
55 | /// <summary>MethodCall token.</summary> | ||
56 | /// <remarks>Corresponds to the <methodCall> tag.</remarks> | ||
57 | public const String METHOD_CALL = "methodCall"; | ||
58 | /// <summary>MethodName token.</summary> | ||
59 | /// <remarks>Corresponds to the <methodName> tag.</remarks> | ||
60 | public const String METHOD_NAME = "methodName"; | ||
61 | /// <summary>MethodResponse token</summary> | ||
62 | /// <remarks>Corresponds to the <methodResponse> tag.</remarks> | ||
63 | public const String METHOD_RESPONSE = "methodResponse"; | ||
64 | /// <summary>Fault response token.</summary> | ||
65 | /// <remarks>Corresponds to the <fault> tag.</remarks> | ||
66 | public const String FAULT = "fault"; | ||
67 | /// <summary>FaultCode token.</summary> | ||
68 | /// <remarks>Corresponds to the <faultCode> tag.</remarks> | ||
69 | public const String FAULT_CODE = "faultCode"; | ||
70 | /// <summary>FaultString token.</summary> | ||
71 | /// <remarks>Corresponds to the <faultString> tag.</remarks> | ||
72 | public const String FAULT_STRING = "faultString"; | ||
73 | } | ||
74 | } | ||
75 | |||
76 | |||
diff --git a/bin/libsecondlife.dll b/bin/libsecondlife.dll index 89d692a..5d6a82e 100644 --- a/bin/libsecondlife.dll +++ b/bin/libsecondlife.dll | |||
Binary files differ | |||
diff --git a/prebuild.xml b/prebuild.xml index 73c8f4c..741fc6d 100644 --- a/prebuild.xml +++ b/prebuild.xml | |||
@@ -32,6 +32,28 @@ | |||
32 | </Options> | 32 | </Options> |
33 | </Configuration> | 33 | </Configuration> |
34 | 34 | ||
35 | <!-- XML-RPC --> | ||
36 | <Project name="XMLRPC" path="XmlRpcCS" type="Library"> | ||
37 | <Configuration name="Debug"> | ||
38 | <Options> | ||
39 | <OutputPath>../bin/</OutputPath> | ||
40 | </Options> | ||
41 | </Configuration> | ||
42 | <Configuration name="Release"> | ||
43 | <Options> | ||
44 | <OutputPath>../bin/</OutputPath> | ||
45 | </Options> | ||
46 | </Configuration> | ||
47 | |||
48 | <ReferencePath>../bin/</ReferencePath> | ||
49 | <Reference name="System"/> | ||
50 | <Reference name="System.Xml"/> | ||
51 | |||
52 | <Files> | ||
53 | <Match pattern="*.cs" recurse="true"/> | ||
54 | </Files> | ||
55 | </Project> | ||
56 | |||
35 | <!-- Core OpenSim Projects --> | 57 | <!-- Core OpenSim Projects --> |
36 | 58 | ||
37 | <Project name="OpenSim.Framework" path="OpenSim.Framework" type="Library"> | 59 | <Project name="OpenSim.Framework" path="OpenSim.Framework" type="Library"> |
@@ -51,6 +73,7 @@ | |||
51 | <Reference name="System.Xml"/> | 73 | <Reference name="System.Xml"/> |
52 | <Reference name="libsecondlife.dll"/> | 74 | <Reference name="libsecondlife.dll"/> |
53 | <Reference name="Db4objects.Db4o.dll"/> | 75 | <Reference name="Db4objects.Db4o.dll"/> |
76 | <Reference name="XMLRPC"/> | ||
54 | <Files> | 77 | <Files> |
55 | <Match pattern="*.cs" recurse="true"/> | 78 | <Match pattern="*.cs" recurse="true"/> |
56 | </Files> | 79 | </Files> |
@@ -93,6 +116,7 @@ | |||
93 | <Reference name="OpenSim.Framework"/> | 116 | <Reference name="OpenSim.Framework"/> |
94 | <Reference name="OpenSim.Framework.Console"/> | 117 | <Reference name="OpenSim.Framework.Console"/> |
95 | <Reference name="libsecondlife.dll"/> | 118 | <Reference name="libsecondlife.dll"/> |
119 | <Reference name="XMLRPC"/> | ||
96 | 120 | ||
97 | <Files> | 121 | <Files> |
98 | <Match pattern="*.cs" recurse="true"/> | 122 | <Match pattern="*.cs" recurse="true"/> |
@@ -122,6 +146,7 @@ | |||
122 | <Reference name="OpenSim.Servers"/> | 146 | <Reference name="OpenSim.Servers"/> |
123 | <Reference name="libsecondlife.dll"/> | 147 | <Reference name="libsecondlife.dll"/> |
124 | <Reference name="Db4objects.Db4o.dll"/> | 148 | <Reference name="Db4objects.Db4o.dll"/> |
149 | <Reference name="XMLRPC"/> | ||
125 | 150 | ||
126 | <Files> | 151 | <Files> |
127 | <Match pattern="*.cs" recurse="true"/> | 152 | <Match pattern="*.cs" recurse="true"/> |
@@ -149,6 +174,7 @@ | |||
149 | <Reference name="OpenSim.Servers"/> | 174 | <Reference name="OpenSim.Servers"/> |
150 | <Reference name="libsecondlife.dll"/> | 175 | <Reference name="libsecondlife.dll"/> |
151 | <Reference name="Db4objects.Db4o.dll"/> | 176 | <Reference name="Db4objects.Db4o.dll"/> |
177 | <Reference name="XMLRPC"/> | ||
152 | 178 | ||
153 | <Files> | 179 | <Files> |
154 | <Match pattern="*.cs" recurse="true"/> | 180 | <Match pattern="*.cs" recurse="true"/> |
@@ -272,6 +298,7 @@ | |||
272 | <Reference name="libsecondlife.dll"/> | 298 | <Reference name="libsecondlife.dll"/> |
273 | <Reference name="OpenSim.Framework"/> | 299 | <Reference name="OpenSim.Framework"/> |
274 | <Reference name="OpenSim.Framework.Console"/> | 300 | <Reference name="OpenSim.Framework.Console"/> |
301 | <Reference name="XMLRPC"/> | ||
275 | <Files> | 302 | <Files> |
276 | <Match pattern="*.cs" recurse="true"/> | 303 | <Match pattern="*.cs" recurse="true"/> |
277 | </Files> | 304 | </Files> |
@@ -439,6 +466,7 @@ | |||
439 | <Reference name="OpenSim.GenericConfig.Xml"/> | 466 | <Reference name="OpenSim.GenericConfig.Xml"/> |
440 | <Reference name="OpenSim.Physics.Manager"/> | 467 | <Reference name="OpenSim.Physics.Manager"/> |
441 | <Reference name="OpenSim.Servers"/> | 468 | <Reference name="OpenSim.Servers"/> |
469 | <Reference name="XMLRPC"/> | ||
442 | 470 | ||
443 | <Files> | 471 | <Files> |
444 | <Match pattern="*.cs" recurse="true"/> | 472 | <Match pattern="*.cs" recurse="true"/> |