More refactoring.
commit
c3797efab6
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual C# Express 2005
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OGS-UserServer", "userserver\src\OGS-UserServer.csproj", "{D45B6E48-5668-478D-B9CB-6D46E665FACF}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OGS-GridServer", "gridserver\src\OGS-GridServer.csproj", "{FE50A574-C8ED-433B-95F0-213A5EED2AB2}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerConsole", "ServerConsole\ServerConsole.csproj", "{7667E6E2-F227-41A2-B1B2-315613E1BAFC}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSim.Framework", "..\OpenSim.FrameWork\OpenSim.Framework.csproj", "{2E46A825-3168-492F-93BC-637126B5B72B}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D45B6E48-5668-478D-B9CB-6D46E665FACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{D45B6E48-5668-478D-B9CB-6D46E665FACF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{D45B6E48-5668-478D-B9CB-6D46E665FACF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{D45B6E48-5668-478D-B9CB-6D46E665FACF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{FE50A574-C8ED-433B-95F0-213A5EED2AB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{FE50A574-C8ED-433B-95F0-213A5EED2AB2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{FE50A574-C8ED-433B-95F0-213A5EED2AB2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{FE50A574-C8ED-433B-95F0-213A5EED2AB2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{7667E6E2-F227-41A2-B1B2-315613E1BAFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{7667E6E2-F227-41A2-B1B2-315613E1BAFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{7667E6E2-F227-41A2-B1B2-315613E1BAFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{7667E6E2-F227-41A2-B1B2-315613E1BAFC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{2E46A825-3168-492F-93BC-637126B5B72B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{2E46A825-3168-492F-93BC-637126B5B72B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{2E46A825-3168-492F-93BC-637126B5B72B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{2E46A825-3168-492F-93BC-637126B5B72B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("ServerConsole")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("ServerConsole")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2007")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("c4d85def-4c2e-449d-bf4a-449b8cf03736")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ServerConsole
|
||||||
|
{
|
||||||
|
public class MainConsole {
|
||||||
|
|
||||||
|
private static ConsoleBase instance;
|
||||||
|
|
||||||
|
public static ConsoleBase Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
instance = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public MainConsole()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class conscmd_callback {
|
||||||
|
public abstract void RunCmd(string cmd, string[] cmdparams);
|
||||||
|
public abstract void Show(string ShowWhat);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract class ConsoleBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public enum ConsoleType {
|
||||||
|
Local, // Use stdio
|
||||||
|
TCP, // Use TCP/telnet
|
||||||
|
SimChat // Use in-world chat (for gods)
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void Close();
|
||||||
|
|
||||||
|
// You know what ReadLine() and WriteLine() do, right? And Read() and Write()? Right, you do actually know C#, right? Are you actually a programmer? Do you know english? Do you find my sense of humour in comments irritating? Good, glad you're still here
|
||||||
|
public abstract void WriteLine(string Line) ;
|
||||||
|
|
||||||
|
public abstract string ReadLine();
|
||||||
|
|
||||||
|
public abstract int Read() ;
|
||||||
|
|
||||||
|
public abstract void Write(string Line) ;
|
||||||
|
|
||||||
|
public abstract string PasswdPrompt(string prompt);
|
||||||
|
|
||||||
|
// Displays a command prompt and waits for the user to enter a string, then returns that string
|
||||||
|
public abstract string CmdPrompt(string prompt) ;
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value if the user simply presses enter
|
||||||
|
public abstract string CmdPrompt(string prompt, string defaultresponse);
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value, user may only enter 1 of 2 options
|
||||||
|
public abstract string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB) ;
|
||||||
|
|
||||||
|
// Runs a command with a number of parameters
|
||||||
|
public abstract Object RunCmd(string Cmd, string[] cmdparams) ;
|
||||||
|
|
||||||
|
// Shows data about something
|
||||||
|
public abstract void ShowCommands(string ShowWhat) ;
|
||||||
|
|
||||||
|
// Displays a prompt to the user and then runs the command they entered
|
||||||
|
public abstract void MainConsolePrompt() ;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.50727</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{7667E6E2-F227-41A2-B1B2-315613E1BAFC}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>ServerConsole</RootNamespace>
|
||||||
|
<AssemblyName>ServerConsole</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>..\common\bin\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ServerConsole.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,48 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<project name="ServerConsole" default="build" basedir=".">
|
||||||
|
<property name="debug" value="true" overwrite="false" />
|
||||||
|
<target name="clean" description="remove all generated files">
|
||||||
|
<delete file="../common/bin/ServerConsole.dll" failonerror="false" />
|
||||||
|
<delete file="../common/bin/ServerConsole.dll.mdb" failonerror="false" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="svnupdate" description="updates to latest SVN">
|
||||||
|
<exec program="svn">
|
||||||
|
<arg value="update" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||||
|
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="build" description="compiles the source code">
|
||||||
|
|
||||||
|
<loadfile file="../VERSION" property="svnver"/>
|
||||||
|
<asminfo output="AssemblyInfo.cs" language="CSharp">
|
||||||
|
<imports>
|
||||||
|
<import namespace="System" />
|
||||||
|
<import namespace="System.Reflection" />
|
||||||
|
<import namespace="System.Runtime.InteropServices" />
|
||||||
|
</imports>
|
||||||
|
<attributes>
|
||||||
|
<attribute type="ComVisibleAttribute" value="false" />
|
||||||
|
<attribute type="CLSCompliantAttribute" value="false" />
|
||||||
|
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||||
|
<attribute type="AssemblyTitleAttribute" value="ogs-serverconsole" />
|
||||||
|
<attribute type="AssemblyDescriptionAttribute" value="The default server console" />
|
||||||
|
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||||
|
</attributes>
|
||||||
|
</asminfo>
|
||||||
|
|
||||||
|
<csc target="library" output="../common/bin/ServerConsole.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||||
|
<references>
|
||||||
|
<include name="System" />
|
||||||
|
<include name="System.Xml" />
|
||||||
|
</references>
|
||||||
|
<sources>
|
||||||
|
<include name="*.cs" />
|
||||||
|
</sources>
|
||||||
|
</csc>
|
||||||
|
</target>
|
||||||
|
</project>
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class VersionInfo
|
||||||
|
{
|
||||||
|
public static string Version = "0.1, Build 1173843165, Revision 193:206M";
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,181 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using ServerConsole;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Description of ServerConsole.
|
||||||
|
/// </summary>
|
||||||
|
public class MServerConsole : ConsoleBase
|
||||||
|
{
|
||||||
|
|
||||||
|
private ConsoleType ConsType;
|
||||||
|
StreamWriter Log;
|
||||||
|
public conscmd_callback cmdparser;
|
||||||
|
public string componentname;
|
||||||
|
|
||||||
|
// STUPID HACK ALERT!!!! STUPID HACK ALERT!!!!!
|
||||||
|
// constype - the type of console to use (see enum ConsoleType)
|
||||||
|
// sparam - depending on the console type:
|
||||||
|
// TCP - the IP to bind to (127.0.0.1 if blank)
|
||||||
|
// Local - param ignored
|
||||||
|
// and for the iparam:
|
||||||
|
// TCP - the port to bind to
|
||||||
|
// Local - param ignored
|
||||||
|
// LogFile - duh
|
||||||
|
// componentname - which component of the OGS system? (user, asset etc)
|
||||||
|
// cmdparser - a reference to a conscmd_callback object
|
||||||
|
|
||||||
|
public MServerConsole(ConsoleType constype, string sparam, int iparam, string LogFile, string componentname, conscmd_callback cmdparser) {
|
||||||
|
ConsType = constype;
|
||||||
|
this.componentname = componentname;
|
||||||
|
this.cmdparser = cmdparser;
|
||||||
|
switch(constype) {
|
||||||
|
case ConsoleType.Local:
|
||||||
|
Console.WriteLine("ServerConsole.cs - creating new local console");
|
||||||
|
Console.WriteLine("Logs will be saved to current directory in " + LogFile);
|
||||||
|
Log=File.AppendText(LogFile);
|
||||||
|
Log.WriteLine("========================================================================");
|
||||||
|
Log.WriteLine(componentname + " " + VersionInfo.Version + " Started at " + DateTime.Now.ToString());
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ConsoleType.TCP:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console.WriteLine("ServerConsole.cs - what are you smoking? that isn't a valid console type!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Close() {
|
||||||
|
Log.WriteLine("Shutdown at " + DateTime.Now.ToString());
|
||||||
|
Log.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// You know what ReadLine() and WriteLine() do, right? And Read() and Write()? Right, you do actually know C#, right? Are you actually a programmer? Do you know english? Do you find my sense of humour in comments irritating? Good, glad you're still here
|
||||||
|
public override void WriteLine(string Line) {
|
||||||
|
Log.WriteLine(Line);
|
||||||
|
Console.WriteLine(Line);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ReadLine() {
|
||||||
|
string TempStr=Console.ReadLine();
|
||||||
|
Log.WriteLine(TempStr);
|
||||||
|
return TempStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int Read() {
|
||||||
|
int TempInt= Console.Read();
|
||||||
|
Log.Write((char)TempInt);
|
||||||
|
return TempInt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(string Line) {
|
||||||
|
Console.Write(Line);
|
||||||
|
Log.Write(Line);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Displays a prompt and waits for the user to enter a string, then returns that string
|
||||||
|
// Done with no echo and suitable for passwords
|
||||||
|
public override string PasswdPrompt(string prompt) {
|
||||||
|
// FIXME: Needs to be better abstracted
|
||||||
|
Log.WriteLine(prompt);
|
||||||
|
this.Write(prompt);
|
||||||
|
ConsoleColor oldfg=Console.ForegroundColor;
|
||||||
|
Console.ForegroundColor=Console.BackgroundColor;
|
||||||
|
string temp=Console.ReadLine();
|
||||||
|
Console.ForegroundColor=oldfg;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displays a command prompt and waits for the user to enter a string, then returns that string
|
||||||
|
public override string CmdPrompt(string prompt) {
|
||||||
|
this.Write(prompt);
|
||||||
|
return this.ReadLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value if the user simply presses enter
|
||||||
|
public override string CmdPrompt(string prompt, string defaultresponse) {
|
||||||
|
string temp=CmdPrompt(prompt);
|
||||||
|
if(temp=="") {
|
||||||
|
return defaultresponse;
|
||||||
|
} else {
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value, user may only enter 1 of 2 options
|
||||||
|
public override string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB) {
|
||||||
|
bool itisdone=false;
|
||||||
|
string temp=CmdPrompt(prompt,defaultresponse);
|
||||||
|
while(itisdone==false) {
|
||||||
|
if((temp==OptionA) || (temp==OptionB)) {
|
||||||
|
itisdone=true;
|
||||||
|
} else {
|
||||||
|
this.WriteLine("Valid options are " + OptionA + " or " + OptionB);
|
||||||
|
temp=CmdPrompt(prompt,defaultresponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs a command with a number of parameters
|
||||||
|
public override Object RunCmd(string Cmd, string[] cmdparams) {
|
||||||
|
cmdparser.RunCmd(Cmd, cmdparams);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shows data about something
|
||||||
|
public override void ShowCommands(string ShowWhat) {
|
||||||
|
cmdparser.Show(ShowWhat);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void MainConsolePrompt() {
|
||||||
|
string[] tempstrarray;
|
||||||
|
string tempstr = this.CmdPrompt(this.componentname + "# ");
|
||||||
|
tempstrarray = tempstr.Split(' ');
|
||||||
|
string cmd=tempstrarray[0];
|
||||||
|
Array.Reverse(tempstrarray);
|
||||||
|
Array.Resize<string>(ref tempstrarray,tempstrarray.Length-1);
|
||||||
|
Array.Reverse(tempstrarray);
|
||||||
|
string[] cmdparams=(string[])tempstrarray;
|
||||||
|
RunCmd(cmd,cmdparams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class VersionInfo
|
||||||
|
{
|
||||||
|
public static string Version = "@@VERSION";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<project name="GridServer" default="build" basedir="./">
|
||||||
|
<property name="debug" value="true" overwrite="false" />
|
||||||
|
<target name="clean" description="remove all generated files">
|
||||||
|
<delete>
|
||||||
|
<fileset failonempty="false">
|
||||||
|
<include name="bin/*.dll" />
|
||||||
|
<include name="bin/*.exe" />
|
||||||
|
<include name="bin/*.mdb" />
|
||||||
|
</fileset>
|
||||||
|
</delete>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="svnupdate" description="updates to latest SVN">
|
||||||
|
<exec program="svn">
|
||||||
|
<arg value="update" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||||
|
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="build" description="compiles the source code">
|
||||||
|
|
||||||
|
<loadfile file="../VERSION" property="svnver"/>
|
||||||
|
<asminfo output="src/AssemblyInfo.cs" language="CSharp">
|
||||||
|
<imports>
|
||||||
|
<import namespace="System" />
|
||||||
|
<import namespace="System.Reflection" />
|
||||||
|
<import namespace="System.Runtime.InteropServices" />
|
||||||
|
</imports>
|
||||||
|
<attributes>
|
||||||
|
<attribute type="ComVisibleAttribute" value="false" />
|
||||||
|
<attribute type="CLSCompliantAttribute" value="false" />
|
||||||
|
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||||
|
<attribute type="AssemblyTitleAttribute" value="ogs-GridServer" />
|
||||||
|
<attribute type="AssemblyDescriptionAttribute" value="The core OGS Grid Server" />
|
||||||
|
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||||
|
</attributes>
|
||||||
|
</asminfo>
|
||||||
|
|
||||||
|
<csc target="exe" output="bin/GridServer.exe" debug="${debug}" verbose="true" warninglevel="4">
|
||||||
|
<references failonempty="true">
|
||||||
|
<include name="System" />
|
||||||
|
<include name="System.Xml" />
|
||||||
|
<include name="../common/bin/ServerConsole.dll" />
|
||||||
|
<include name="../common/bin/libsecondlife.dll" />
|
||||||
|
</references>
|
||||||
|
<sources>
|
||||||
|
<include name="../common/src/VersionInfo.cs" />
|
||||||
|
<include name="../common/src/OGS-Console.cs" />
|
||||||
|
<include name="../common/src/Util.cs" />
|
||||||
|
<include name="src/*.cs" />
|
||||||
|
</sources>
|
||||||
|
</csc>
|
||||||
|
|
||||||
|
<copy todir="bin/">
|
||||||
|
<fileset basedir="../common/bin">
|
||||||
|
<include name="*.*" />
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
</project>
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using ServerConsole;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
|
||||||
|
public class GridConsole : conscmd_callback {
|
||||||
|
public GridConsole() { }
|
||||||
|
|
||||||
|
public override void RunCmd(string cmd, string[] cmdparams) {
|
||||||
|
switch(cmd) {
|
||||||
|
case "help":
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("shutdown - shutdown the grid (USE CAUTION!)"
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "shutdown":
|
||||||
|
ServerConsole.MainConsole.Instance.Close();
|
||||||
|
Environment.Exit(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Show(string ShowWhat) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,166 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenGrid project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Net;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using libsecondlife;
|
||||||
|
using ServerConsole;
|
||||||
|
using OpenSim.Framework.Sims;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
public class GridHTTPServer {
|
||||||
|
public Thread HTTPD;
|
||||||
|
public HttpListener Listener;
|
||||||
|
|
||||||
|
public GridHTTPServer() {
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Starting up HTTP Server");
|
||||||
|
HTTPD = new Thread(new ThreadStart(StartHTTP));
|
||||||
|
HTTPD.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartHTTP() {
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("GridHttp.cs:StartHTTP() - Spawned main thread OK");
|
||||||
|
Listener = new HttpListener();
|
||||||
|
|
||||||
|
Listener.Prefixes.Add("http://+:8001/gridserver/");
|
||||||
|
Listener.Start();
|
||||||
|
|
||||||
|
HttpListenerContext context;
|
||||||
|
while(true) {
|
||||||
|
context = Listener.GetContext();
|
||||||
|
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ParseXMLRPC(string requestBody) {
|
||||||
|
try{
|
||||||
|
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
||||||
|
|
||||||
|
Hashtable requestData = (Hashtable)request.Params[0];
|
||||||
|
switch(request.MethodName) {
|
||||||
|
case "get_sim_info":
|
||||||
|
ulong req_handle=(ulong)Convert.ToInt64(requestData["region_handle"]);
|
||||||
|
SimProfileBase TheSim = OpenGrid_Main.thegrid._regionmanager.GetProfileByHandle(req_handle);
|
||||||
|
string RecvKey="";
|
||||||
|
string caller=(string)requestData["caller"];
|
||||||
|
switch(caller) {
|
||||||
|
case "userserver":
|
||||||
|
RecvKey=OpenGrid_Main.thegrid.UserRecvKey;
|
||||||
|
break;
|
||||||
|
case "assetserver":
|
||||||
|
RecvKey=OpenGrid_Main.thegrid.AssetRecvKey;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if((TheSim!=null) && (string)requestData["authkey"]==RecvKey) {
|
||||||
|
XmlRpcResponse SimInfoResp = new XmlRpcResponse();
|
||||||
|
Hashtable SimInfoData = new Hashtable();
|
||||||
|
SimInfoData["UUID"]=TheSim.UUID.ToString();
|
||||||
|
SimInfoData["regionhandle"]=TheSim.regionhandle.ToString();
|
||||||
|
SimInfoData["regionname"]=TheSim.regionname;
|
||||||
|
SimInfoData["sim_ip"]=TheSim.sim_ip;
|
||||||
|
SimInfoData["sim_port"]=TheSim.sim_port.ToString();
|
||||||
|
SimInfoData["caps_url"]=TheSim.caps_url;
|
||||||
|
SimInfoData["RegionLocX"]=TheSim.RegionLocX.ToString();
|
||||||
|
SimInfoData["RegionLocY"]=TheSim.RegionLocY.ToString();
|
||||||
|
SimInfoData["sendkey"]=TheSim.sendkey;
|
||||||
|
SimInfoData["recvkey"]=TheSim.recvkey;
|
||||||
|
SimInfoResp.Value=SimInfoData;
|
||||||
|
return(Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(SimInfoResp),"utf-16","utf-8"));
|
||||||
|
} else {
|
||||||
|
XmlRpcResponse SimErrorResp = new XmlRpcResponse();
|
||||||
|
Hashtable SimErrorData = new Hashtable();
|
||||||
|
SimErrorData["error"]="sim not found";
|
||||||
|
SimErrorResp.Value=SimErrorData;
|
||||||
|
return(XmlRpcResponseSerializer.Singleton.Serialize(SimErrorResp));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ParseREST(string requestBody, string requestURL) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void HandleRequest(Object stateinfo) {
|
||||||
|
HttpListenerContext context=(HttpListenerContext)stateinfo;
|
||||||
|
|
||||||
|
HttpListenerRequest request = context.Request;
|
||||||
|
HttpListenerResponse response = context.Response;
|
||||||
|
|
||||||
|
response.KeepAlive=false;
|
||||||
|
response.SendChunked=false;
|
||||||
|
|
||||||
|
System.IO.Stream body = request.InputStream;
|
||||||
|
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
|
||||||
|
System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
|
||||||
|
|
||||||
|
string requestBody = reader.ReadToEnd();
|
||||||
|
body.Close();
|
||||||
|
reader.Close();
|
||||||
|
|
||||||
|
string responseString="";
|
||||||
|
switch(request.ContentType) {
|
||||||
|
case "text/xml":
|
||||||
|
// must be XML-RPC, so pass to the XML-RPC parser
|
||||||
|
|
||||||
|
responseString=ParseXMLRPC(requestBody);
|
||||||
|
response.AddHeader("Content-type","text/xml");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case null:
|
||||||
|
// must be REST or invalid crap, so pass to the REST parser
|
||||||
|
responseString=ParseREST(request.Url.OriginalString,requestBody);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
|
||||||
|
System.IO.Stream output = response.OutputStream;
|
||||||
|
response.SendChunked=false;
|
||||||
|
response.ContentLength64=buffer.Length;
|
||||||
|
output.Write(buffer,0,buffer.Length);
|
||||||
|
output.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using ServerConsole;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class OpenGrid_Main
|
||||||
|
{
|
||||||
|
|
||||||
|
public static OpenGrid_Main thegrid;
|
||||||
|
public string GridOwner;
|
||||||
|
public string DefaultStartupMsg;
|
||||||
|
public string DefaultAssetServer;
|
||||||
|
public string AssetSendKey;
|
||||||
|
public string AssetRecvKey;
|
||||||
|
public string DefaultUserServer;
|
||||||
|
public string UserSendKey;
|
||||||
|
public string UserRecvKey;
|
||||||
|
|
||||||
|
public GridHTTPServer _httpd;
|
||||||
|
public SimProfileManager _regionmanager;
|
||||||
|
|
||||||
|
[STAThread]
|
||||||
|
public static void Main( string[] args )
|
||||||
|
{
|
||||||
|
Console.WriteLine("OpenGrid " + VersionInfo.Version + "\n");
|
||||||
|
Console.WriteLine("Starting...\n");
|
||||||
|
ServerConsole.MainConsole.Instance = new MServerConsole(ServerConsole.ConsoleBase.ConsoleType.Local, "", 0, "opengrid-console.log", "OpenGrid", new GridConsole());
|
||||||
|
|
||||||
|
thegrid = new OpenGrid_Main();
|
||||||
|
thegrid.Startup();
|
||||||
|
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("\nEnter help for a list of commands\n");
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
ServerConsole.MainConsole.Instance.MainConsolePrompt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Startup() {
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Please press enter to retain default settings");
|
||||||
|
|
||||||
|
this.GridOwner=ServerConsole.MainConsole.Instance.CmdPrompt("Grid owner [OGS development team]: ","OGS development team");
|
||||||
|
this.DefaultStartupMsg=ServerConsole.MainConsole.Instance.CmdPrompt("Default startup message for clients [Welcome to OGS!]: ","Welcome to OGS!");
|
||||||
|
|
||||||
|
this.DefaultAssetServer=ServerConsole.MainConsole.Instance.CmdPrompt("Default asset server [no default]: ");
|
||||||
|
this.AssetSendKey=ServerConsole.MainConsole.Instance.CmdPrompt("Key to send to asset server: ");
|
||||||
|
this.AssetRecvKey=ServerConsole.MainConsole.Instance.CmdPrompt("Key to expect from asset server: ");
|
||||||
|
|
||||||
|
this.DefaultUserServer=ServerConsole.MainConsole.Instance.CmdPrompt("Default user server [no default]: ");
|
||||||
|
this.UserSendKey=ServerConsole.MainConsole.Instance.CmdPrompt("Key to send to user server: ");
|
||||||
|
this.UserRecvKey=ServerConsole.MainConsole.Instance.CmdPrompt("Key to expect from user server: ");
|
||||||
|
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting HTTP process");
|
||||||
|
_httpd = new GridHTTPServer();
|
||||||
|
|
||||||
|
this._regionmanager=new SimProfileManager();
|
||||||
|
_regionmanager.CreateNewProfile("OpenSim Test", "http://there-is-no-caps.com", "4.78.190.75", 9000, 997, 996, this.UserSendKey, this.UserRecvKey);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.50727</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{FE50A574-C8ED-433B-95F0-213A5EED2AB2}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>OGS_GridServer</RootNamespace>
|
||||||
|
<AssemblyName>OGS-GridServer</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="libsecondlife, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\common\bin\libsecondlife.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\common\src\OGS-Console.cs">
|
||||||
|
<Link>OGS-Console.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\..\common\VersionInfo\VersionInfo.cs">
|
||||||
|
<Link>VersionInfo.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="ConsoleCmds.cs" />
|
||||||
|
<Compile Include="GridHttp.cs" />
|
||||||
|
<Compile Include="Main.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="SimProfiles.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\OpenSim.FrameWork\OpenSim.Framework.csproj">
|
||||||
|
<Project>{2E46A825-3168-492F-93BC-637126B5B72B}</Project>
|
||||||
|
<Name>OpenSim.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\ServerConsole\ServerConsole.csproj">
|
||||||
|
<Project>{7667E6E2-F227-41A2-B1B2-315613E1BAFC}</Project>
|
||||||
|
<Name>ServerConsole</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("OGS-GridServer")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("OGS-GridServer")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2007")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("b541b244-3d1d-4625-9003-bc2a3a6a39a4")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,114 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenGrid project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using libsecondlife;
|
||||||
|
using ServerConsole;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
|
using OpenSim.Framework.Sims;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class SimProfileManager {
|
||||||
|
|
||||||
|
public Dictionary<LLUUID, SimProfileBase> SimProfiles = new Dictionary<LLUUID, SimProfileBase>();
|
||||||
|
|
||||||
|
public SimProfileManager() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InitSimProfiles() {
|
||||||
|
// TODO: need to load from database
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimProfileBase GetProfileByHandle(ulong reqhandle) {
|
||||||
|
foreach (libsecondlife.LLUUID UUID in SimProfiles.Keys) {
|
||||||
|
if(SimProfiles[UUID].regionhandle==reqhandle) return SimProfiles[UUID];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimProfileBase GetProfileByLLUUID(LLUUID ProfileLLUUID) {
|
||||||
|
return SimProfiles[ProfileLLUUID];
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool AuthenticateSim(LLUUID RegionUUID, uint regionhandle, string simrecvkey) {
|
||||||
|
SimProfileBase TheSim=GetProfileByHandle(regionhandle);
|
||||||
|
if(TheSim != null)
|
||||||
|
if(TheSim.recvkey==simrecvkey) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
} else return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimProfileBase CreateNewProfile(string regionname, string caps_url, string sim_ip, uint sim_port, uint RegionLocX, uint RegionLocY, string sendkey, string recvkey) {
|
||||||
|
SimProfileBase newprofile = new SimProfileBase();
|
||||||
|
newprofile.regionname=regionname;
|
||||||
|
newprofile.sim_ip=sim_ip;
|
||||||
|
newprofile.sim_port=sim_port;
|
||||||
|
newprofile.RegionLocX=RegionLocX;
|
||||||
|
newprofile.RegionLocY=RegionLocY;
|
||||||
|
newprofile.caps_url="http://" + sim_ip + ":9000/";
|
||||||
|
newprofile.sendkey=sendkey;
|
||||||
|
newprofile.recvkey=recvkey;
|
||||||
|
newprofile.regionhandle=Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
|
||||||
|
newprofile.UUID=LLUUID.Random();
|
||||||
|
this.SimProfiles.Add(newprofile.UUID,newprofile);
|
||||||
|
return newprofile;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* is in OpenSim.Framework
|
||||||
|
public class SimProfileBase {
|
||||||
|
public LLUUID UUID;
|
||||||
|
public ulong regionhandle;
|
||||||
|
public string regionname;
|
||||||
|
public string sim_ip;
|
||||||
|
public uint sim_port;
|
||||||
|
public string caps_url;
|
||||||
|
public uint RegionLocX;
|
||||||
|
public uint RegionLocY;
|
||||||
|
public string sendkey;
|
||||||
|
public string recvkey;
|
||||||
|
|
||||||
|
|
||||||
|
public SimProfileBase() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using ServerConsole;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
|
||||||
|
public class UserConsole : conscmd_callback {
|
||||||
|
public UserConsole() { }
|
||||||
|
|
||||||
|
public override void RunCmd(string cmd, string[] cmdparams) {
|
||||||
|
switch(cmd) {
|
||||||
|
case "help":
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("shutdown - shutdown the user server (USE CAUTION!)"
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "shutdown":
|
||||||
|
ServerConsole.MainConsole.Instance.Close();
|
||||||
|
Environment.Exit(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Show(string ShowWhat) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using ServerConsole;
|
||||||
|
using OpenSim.Framework.User;
|
||||||
|
using OpenSim.Framework.Sims;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class OpenUser_Main
|
||||||
|
{
|
||||||
|
|
||||||
|
public static OpenUser_Main userserver;
|
||||||
|
|
||||||
|
public UserHTTPServer _httpd;
|
||||||
|
public UserProfileManager _profilemanager;
|
||||||
|
public UserProfile GridGod;
|
||||||
|
public string DefaultStartupMsg;
|
||||||
|
public string GridURL;
|
||||||
|
public string GridSendKey;
|
||||||
|
public string GridRecvKey;
|
||||||
|
|
||||||
|
public Dictionary<LLUUID, UserProfile> UserSessions = new Dictionary<LLUUID, UserProfile>();
|
||||||
|
|
||||||
|
[STAThread]
|
||||||
|
public static void Main( string[] args )
|
||||||
|
{
|
||||||
|
Console.WriteLine("OpenUser " + VersionInfo.Version + "\n");
|
||||||
|
Console.WriteLine("Starting...\n");
|
||||||
|
ServerConsole.MainConsole.Instance = new MServerConsole(ServerConsole.ConsoleBase.ConsoleType.Local, "", 0, "opengrid-console.log", "OpenUser", new UserConsole());
|
||||||
|
|
||||||
|
userserver = new OpenUser_Main();
|
||||||
|
userserver.Startup();
|
||||||
|
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("\nEnter help for a list of commands\n");
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
ServerConsole.MainConsole.Instance.MainConsolePrompt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Startup() {
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Please press enter to retain default settings");
|
||||||
|
|
||||||
|
this.GridURL=ServerConsole.MainConsole.Instance.CmdPrompt("Grid URL: ");
|
||||||
|
this.GridSendKey=ServerConsole.MainConsole.Instance.CmdPrompt("Key to send to grid: ");
|
||||||
|
this.GridRecvKey=ServerConsole.MainConsole.Instance.CmdPrompt("Key to expect from grid: ");
|
||||||
|
|
||||||
|
this.DefaultStartupMsg=ServerConsole.MainConsole.Instance.CmdPrompt("Default startup message for clients [Welcome to OGS!] :","Welcome to OGS!");
|
||||||
|
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Creating user profile manager");
|
||||||
|
_profilemanager = new UserProfileManager();
|
||||||
|
_profilemanager.InitUserProfiles();
|
||||||
|
_profilemanager.SetKeys(GridSendKey, GridRecvKey, GridURL, DefaultStartupMsg);
|
||||||
|
|
||||||
|
|
||||||
|
string tempfirstname;
|
||||||
|
string templastname;
|
||||||
|
string tempMD5Passwd;
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Please configure the grid god user:");
|
||||||
|
tempfirstname=ServerConsole.MainConsole.Instance.CmdPrompt("First name: ");
|
||||||
|
templastname=ServerConsole.MainConsole.Instance.CmdPrompt("Last name: ");
|
||||||
|
tempMD5Passwd=ServerConsole.MainConsole.Instance.PasswdPrompt("Password: ");
|
||||||
|
|
||||||
|
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
|
||||||
|
byte[] bs = System.Text.Encoding.UTF8.GetBytes(tempMD5Passwd);
|
||||||
|
bs = x.ComputeHash(bs);
|
||||||
|
System.Text.StringBuilder s = new System.Text.StringBuilder();
|
||||||
|
foreach (byte b in bs)
|
||||||
|
{
|
||||||
|
s.Append(b.ToString("x2").ToLower());
|
||||||
|
}
|
||||||
|
tempMD5Passwd = "$1$" + s.ToString();
|
||||||
|
|
||||||
|
GridGod=_profilemanager.CreateNewProfile(tempfirstname,templastname,tempMD5Passwd);
|
||||||
|
_profilemanager.SetGod(GridGod.UUID);
|
||||||
|
GridGod.homelookat = new LLVector3(-0.57343f, -0.819255f, 0f);
|
||||||
|
GridGod.homepos = new LLVector3(128f,128f,23f);
|
||||||
|
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting HTTP process");
|
||||||
|
_httpd = new UserHTTPServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.50727</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{D45B6E48-5668-478D-B9CB-6D46E665FACF}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>OGS_UserServer</RootNamespace>
|
||||||
|
<AssemblyName>OGS-UserServer</AssemblyName>
|
||||||
|
<StartupObject>OpenGridServices.OpenUser_Main</StartupObject>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="libsecondlife, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\common\bin\libsecondlife.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\common\src\OGS-Console.cs">
|
||||||
|
<Link>OGS-Console.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="..\..\common\VersionInfo\VersionInfo.cs">
|
||||||
|
<Link>VersionInfo.cs</Link>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="ConsoleCmds.cs" />
|
||||||
|
<Compile Include="Main.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="UserHttp.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\OpenSim.FrameWork\OpenSim.Framework.csproj">
|
||||||
|
<Project>{2E46A825-3168-492F-93BC-637126B5B72B}</Project>
|
||||||
|
<Name>OpenSim.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\ServerConsole\ServerConsole.csproj">
|
||||||
|
<Project>{7667E6E2-F227-41A2-B1B2-315613E1BAFC}</Project>
|
||||||
|
<Name>ServerConsole</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<PublishUrlHistory>publish\</PublishUrlHistory>
|
||||||
|
<ApplicationRevision>0</ApplicationRevision>
|
||||||
|
<FallbackCulture>en-US</FallbackCulture>
|
||||||
|
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("OGS-UserServer")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("OGS-UserServer")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2007")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("e266513a-090b-4d38-80f6-8599eef68c8c")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,146 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenGrid project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Net;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using libsecondlife;
|
||||||
|
using ServerConsole;
|
||||||
|
using OpenSim.Framework.User;
|
||||||
|
using OpenSim.Framework.Sims;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
|
||||||
|
namespace OpenGridServices
|
||||||
|
{
|
||||||
|
public class UserHTTPServer {
|
||||||
|
public Thread HTTPD;
|
||||||
|
public HttpListener Listener;
|
||||||
|
|
||||||
|
public UserHTTPServer() {
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("Starting up HTTP Server");
|
||||||
|
HTTPD = new Thread(new ThreadStart(StartHTTP));
|
||||||
|
HTTPD.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartHTTP() {
|
||||||
|
ServerConsole.MainConsole.Instance.WriteLine("UserHttp.cs:StartHTTP() - Spawned main thread OK");
|
||||||
|
Listener = new HttpListener();
|
||||||
|
|
||||||
|
Listener.Prefixes.Add("http://+:8002/userserver/");
|
||||||
|
Listener.Prefixes.Add("http://+:8002/usersessions/");
|
||||||
|
Listener.Start();
|
||||||
|
|
||||||
|
HttpListenerContext context;
|
||||||
|
while(true) {
|
||||||
|
context = Listener.GetContext();
|
||||||
|
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ParseXMLRPC(string requestBody) {
|
||||||
|
return OpenGridServices.OpenUser_Main.userserver._profilemanager.ParseXMLRPC(requestBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ParseREST(HttpListenerRequest www_req) {
|
||||||
|
Console.WriteLine("INCOMING REST - " + www_req.RawUrl);
|
||||||
|
|
||||||
|
char[] splitter = {'/'};
|
||||||
|
string[] rest_params = www_req.RawUrl.Split(splitter);
|
||||||
|
string req_type = rest_params[1]; // First part of the URL is the type of request - usersessions/userprofiles/inventory/blabla
|
||||||
|
switch(req_type) {
|
||||||
|
case "usersessions":
|
||||||
|
LLUUID sessionid = new LLUUID(rest_params[2]); // get usersessions/sessionid
|
||||||
|
if(www_req.HttpMethod=="DELETE") {
|
||||||
|
foreach (libsecondlife.LLUUID UUID in OpenUser_Main.userserver._profilemanager.UserProfiles.Keys) {
|
||||||
|
if(OpenUser_Main.userserver._profilemanager.UserProfiles[UUID].CurrentSessionID==sessionid) {
|
||||||
|
OpenUser_Main.userserver._profilemanager.UserProfiles[UUID].CurrentSessionID=null;
|
||||||
|
OpenUser_Main.userserver._profilemanager.UserProfiles[UUID].CurrentSecureSessionID=null;
|
||||||
|
OpenUser_Main.userserver._profilemanager.UserProfiles[UUID].Circuits.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return "OK";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void HandleRequest(Object stateinfo) {
|
||||||
|
HttpListenerContext context=(HttpListenerContext)stateinfo;
|
||||||
|
|
||||||
|
HttpListenerRequest request = context.Request;
|
||||||
|
HttpListenerResponse response = context.Response;
|
||||||
|
|
||||||
|
response.KeepAlive=false;
|
||||||
|
response.SendChunked=false;
|
||||||
|
|
||||||
|
System.IO.Stream body = request.InputStream;
|
||||||
|
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
|
||||||
|
System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
|
||||||
|
|
||||||
|
string requestBody = reader.ReadToEnd();
|
||||||
|
body.Close();
|
||||||
|
reader.Close();
|
||||||
|
|
||||||
|
string responseString="";
|
||||||
|
switch(request.ContentType) {
|
||||||
|
case "text/xml":
|
||||||
|
// must be XML-RPC, so pass to the XML-RPC parser
|
||||||
|
|
||||||
|
responseString=ParseXMLRPC(requestBody);
|
||||||
|
response.AddHeader("Content-type","text/xml");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "text/plaintext":
|
||||||
|
responseString=ParseREST(request);
|
||||||
|
response.AddHeader("Content-type","text/plaintext");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
|
||||||
|
System.IO.Stream output = response.OutputStream;
|
||||||
|
response.SendChunked=false;
|
||||||
|
response.ContentLength64=buffer.Length;
|
||||||
|
output.Write(buffer,0,buffer.Length);
|
||||||
|
output.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("SimConfig")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("SimConfig")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,176 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenSim;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Terrain;
|
||||||
|
//using OpenSim.world;
|
||||||
|
using Db4objects.Db4o;
|
||||||
|
|
||||||
|
namespace OpenSim.Config.SimConfigDb4o
|
||||||
|
{
|
||||||
|
public class Db40ConfigPlugin: ISimConfig
|
||||||
|
{
|
||||||
|
public SimConfig GetConfigObject()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Loading Db40Config dll");
|
||||||
|
return ( new DbSimConfig());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DbSimConfig : SimConfig
|
||||||
|
{
|
||||||
|
private bool isSandbox;
|
||||||
|
private IObjectContainer db;
|
||||||
|
|
||||||
|
public void LoadDefaults() {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadDefaults() - Please press enter to retain default or enter new settings");
|
||||||
|
|
||||||
|
this.RegionName=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Name [OpenSim test]: ","OpenSim test");
|
||||||
|
this.RegionLocX=(uint)Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid Location X [997]: ","997"));
|
||||||
|
this.RegionLocY=(uint)Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid Location Y [996]: ","996"));
|
||||||
|
this.IPListenPort=Convert.ToInt32(OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("UDP port for client connections [9000]: ","9000"));
|
||||||
|
this.IPListenAddr=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("IP Address to listen on for client connections [127.0.0.1]: ","127.0.0.1");
|
||||||
|
|
||||||
|
if(!isSandbox)
|
||||||
|
{
|
||||||
|
this.AssetURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server URL: ");
|
||||||
|
this.AssetSendKey=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Asset server key: ");
|
||||||
|
this.GridURL=OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Grid server URL: ");
|
||||||
|
this.GridSendKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to send to grid server: ");
|
||||||
|
this.GridRecvKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to expect from grid server: ");
|
||||||
|
this.UserURL = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("User server URL: ");
|
||||||
|
this.UserSendKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to send to user server: ");
|
||||||
|
this.UserRecvKey = OpenSim.Framework.Console.MainConsole.Instance.CmdPrompt("Key to expect from user server: ");
|
||||||
|
}
|
||||||
|
this.RegionHandle = Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void InitConfig(bool sandboxMode) {
|
||||||
|
this.isSandbox = sandboxMode;
|
||||||
|
try {
|
||||||
|
db = Db4oFactory.OpenFile("opensim.yap");
|
||||||
|
IObjectSet result = db.Get(typeof(DbSimConfig));
|
||||||
|
if(result.Count==1) {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:InitConfig() - Found a SimConfig object in the local database, loading");
|
||||||
|
foreach (DbSimConfig cfg in result) {
|
||||||
|
this.RegionName = cfg.RegionName;
|
||||||
|
this.RegionLocX = cfg.RegionLocX;
|
||||||
|
this.RegionLocY = cfg.RegionLocY;
|
||||||
|
this.RegionHandle = Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
|
||||||
|
this.IPListenPort = cfg.IPListenPort;
|
||||||
|
this.IPListenAddr = cfg.IPListenAddr;
|
||||||
|
this.AssetURL = cfg.AssetURL;
|
||||||
|
this.AssetSendKey = cfg.AssetSendKey;
|
||||||
|
this.GridURL = cfg.GridURL;
|
||||||
|
this.GridSendKey = cfg.GridSendKey;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:InitConfig() - Could not find object in database, loading precompiled defaults");
|
||||||
|
LoadDefaults();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Writing out default settings to local database");
|
||||||
|
db.Set(this);
|
||||||
|
}
|
||||||
|
} catch(Exception e) {
|
||||||
|
db.Close();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:InitConfig() - Exception occured");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Sim settings loaded:");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Name: " + this.RegionName);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Region Location: [" + this.RegionLocX.ToString() + "," + this.RegionLocY + "]");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Region Handle: " + this.RegionHandle.ToString());
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Listening on IP: " + this.IPListenAddr + ":" + this.IPListenPort);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Sandbox Mode? " + isSandbox.ToString());
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Asset URL: " + this.AssetURL);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Asset key: " + this.AssetSendKey);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Grid URL: " + this.GridURL);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Grid key: " + this.GridSendKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override float[] LoadWorld()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Loading world....");
|
||||||
|
//World blank = new World();
|
||||||
|
float[] heightmap = null;
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Looking for a heightmap in local DB");
|
||||||
|
IObjectSet world_result = db.Get(typeof(MapStorage));
|
||||||
|
if(world_result.Count>0) {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Found a heightmap in local database, loading");
|
||||||
|
MapStorage map=(MapStorage)world_result.Next();
|
||||||
|
//blank.LandMap = map.Map;
|
||||||
|
heightmap = map.Map;
|
||||||
|
} else {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - No heightmap found, generating new one");
|
||||||
|
HeightmapGenHills hills = new HeightmapGenHills();
|
||||||
|
// blank.LandMap = hills.GenerateHeightmap(200, 4.0f, 80.0f, false);
|
||||||
|
heightmap = hills.GenerateHeightmap(200, 4.0f, 80.0f, false);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Saving heightmap to local database");
|
||||||
|
MapStorage map= new MapStorage();
|
||||||
|
map.Map = heightmap; //blank.LandMap;
|
||||||
|
db.Set(map);
|
||||||
|
db.Commit();
|
||||||
|
}
|
||||||
|
return heightmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SaveMap(float[] heightmap)
|
||||||
|
{
|
||||||
|
IObjectSet world_result = db.Get(typeof(MapStorage));
|
||||||
|
if(world_result.Count>0) {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - updating saved copy of heightmap in local database");
|
||||||
|
MapStorage map=(MapStorage)world_result.Next();
|
||||||
|
db.Delete(map);
|
||||||
|
}
|
||||||
|
MapStorage map1= new MapStorage();
|
||||||
|
map1.Map = heightmap; //OpenSim_Main.local_world.LandMap;
|
||||||
|
db.Set(map1);
|
||||||
|
db.Commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void LoadFromGrid() {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Config.cs:LoadFromGrid() - dummy function, DOING ABSOLUTELY NOTHING AT ALL!!!");
|
||||||
|
// TODO: Make this crap work
|
||||||
|
/* WebRequest GridLogin = WebRequest.Create(this.GridURL + "regions/" + this.RegionHandle.ToString() + "/login");
|
||||||
|
WebResponse GridResponse = GridLogin.GetResponse();
|
||||||
|
byte[] idata = new byte[(int)GridResponse.ContentLength];
|
||||||
|
BinaryReader br = new BinaryReader(GridResponse.GetResponseStream());
|
||||||
|
|
||||||
|
br.Close();
|
||||||
|
GridResponse.Close();
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Shutdown() {
|
||||||
|
db.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.Config.SimConfigDb4o
|
||||||
|
{
|
||||||
|
public class MapStorage
|
||||||
|
{
|
||||||
|
public float[] Map;
|
||||||
|
|
||||||
|
public MapStorage()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>OpenSim.Config.SimConfigDb4o</RootNamespace>
|
||||||
|
<AssemblyName>SimConfig</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{B063760D-DB8D-4F64-B6FE-335FAD1E650A}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>..\..\..\bin\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>True</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>..\..\bin\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Db4objects.Db4o, Version=6.0.1.0, Culture=neutral, PublicKeyToken=6199cd4f203aa8eb, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\Db4objects.Db4o.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="DbSimConfig.cs" />
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
<Compile Include="MapStorage.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.FrameWork\OpenSim.Framework.csproj">
|
||||||
|
<Project>{2E46A825-3168-492F-93BC-637126B5B72B}</Project>
|
||||||
|
<Name>OpenSim.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.Framework.Console\OpenSim.Framework.Console.csproj">
|
||||||
|
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||||
|
<Name>OpenSim.Framework.Console</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public class AgentCircuitData
|
||||||
|
{
|
||||||
|
public AgentCircuitData() { }
|
||||||
|
public LLUUID AgentID;
|
||||||
|
public LLUUID SessionID;
|
||||||
|
public LLUUID SecureSessionID;
|
||||||
|
public string firstname;
|
||||||
|
public string lastname;
|
||||||
|
public uint circuitcode;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Assets
|
||||||
|
{
|
||||||
|
public class AssetBase
|
||||||
|
{
|
||||||
|
public byte[] Data;
|
||||||
|
public LLUUID FullID;
|
||||||
|
public sbyte Type;
|
||||||
|
public sbyte InvType;
|
||||||
|
public string Name;
|
||||||
|
public string Description;
|
||||||
|
|
||||||
|
public AssetBase()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Utilities
|
||||||
|
{
|
||||||
|
public class BlockingQueue<T>
|
||||||
|
{
|
||||||
|
private Queue<T> _queue = new Queue<T>();
|
||||||
|
private object _queueSync = new object();
|
||||||
|
|
||||||
|
public void Enqueue(T value)
|
||||||
|
{
|
||||||
|
lock (_queueSync)
|
||||||
|
{
|
||||||
|
_queue.Enqueue(value);
|
||||||
|
Monitor.Pulse(_queueSync);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Dequeue()
|
||||||
|
{
|
||||||
|
lock (_queueSync)
|
||||||
|
{
|
||||||
|
if (_queue.Count < 1)
|
||||||
|
Monitor.Wait(_queueSync);
|
||||||
|
|
||||||
|
return _queue.Dequeue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,149 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Terrain
|
||||||
|
{
|
||||||
|
public class HeightmapGenHills
|
||||||
|
{
|
||||||
|
private Random Rand = new Random();
|
||||||
|
private int NumHills;
|
||||||
|
private float HillMin;
|
||||||
|
private float HillMax;
|
||||||
|
private bool Island;
|
||||||
|
private float[] heightmap;
|
||||||
|
|
||||||
|
public float[] GenerateHeightmap(int numHills, float hillMin, float hillMax, bool island)
|
||||||
|
{
|
||||||
|
NumHills = numHills;
|
||||||
|
HillMin = hillMin;
|
||||||
|
HillMax = hillMax;
|
||||||
|
Island = island;
|
||||||
|
|
||||||
|
heightmap = new float[256 * 256];
|
||||||
|
|
||||||
|
for (int i = 0; i < numHills; i++)
|
||||||
|
{
|
||||||
|
AddHill();
|
||||||
|
}
|
||||||
|
|
||||||
|
Normalize();
|
||||||
|
|
||||||
|
return heightmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddHill()
|
||||||
|
{
|
||||||
|
float x, y;
|
||||||
|
float radius = RandomRange(HillMin, HillMax);
|
||||||
|
|
||||||
|
if (Island)
|
||||||
|
{
|
||||||
|
// Which direction from the center of the map the hill is placed
|
||||||
|
float theta = RandomRange(0, 6.28f);
|
||||||
|
|
||||||
|
// How far from the center of the map to place the hill. The radius
|
||||||
|
// is subtracted from the range to prevent any part of the hill from
|
||||||
|
// reaching the edge of the map
|
||||||
|
float distance = RandomRange(radius / 2.0f, 128.0f - radius);
|
||||||
|
|
||||||
|
x = 128.0f + (float)Math.Cos(theta) * distance;
|
||||||
|
y = 128.0f + (float)Math.Sin(theta) * distance;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x = RandomRange(-radius, 256.0f + radius);
|
||||||
|
y = RandomRange(-radius, 256.0f + radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
float radiusSq = radius * radius;
|
||||||
|
float distSq;
|
||||||
|
float height;
|
||||||
|
|
||||||
|
int xMin = (int)(x - radius) - 1;
|
||||||
|
int xMax = (int)(x + radius) + 1;
|
||||||
|
if (xMin < 0) xMin = 0;
|
||||||
|
if (xMax > 255) xMax = 255;
|
||||||
|
|
||||||
|
int yMin = (int)(y - radius) - 1;
|
||||||
|
int yMax = (int)(y + radius) + 1;
|
||||||
|
if (yMin < 0) yMin = 0;
|
||||||
|
if (yMax > 255) yMax = 255;
|
||||||
|
|
||||||
|
// Loop through each affected cell and determine the height at that point
|
||||||
|
for (int v = yMin; v <= yMax; ++v)
|
||||||
|
{
|
||||||
|
float fv = (float)v;
|
||||||
|
|
||||||
|
for (int h = xMin; h <= xMax; ++h)
|
||||||
|
{
|
||||||
|
float fh = (float)h;
|
||||||
|
|
||||||
|
// Determine how far from the center of this hill this point is
|
||||||
|
distSq = (x - fh) * (x - fh) + (y - fv) * (y - fv);
|
||||||
|
height = radiusSq - distSq;
|
||||||
|
|
||||||
|
// Don't add negative hill values
|
||||||
|
if (height > 0.0f) heightmap[h + v * 256] += height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Normalize()
|
||||||
|
{
|
||||||
|
float min = heightmap[0];
|
||||||
|
float max = heightmap[0];
|
||||||
|
|
||||||
|
for (int x = 0; x < 256; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < 256; y++)
|
||||||
|
{
|
||||||
|
if (heightmap[x + y * 256] < min) min = heightmap[x + y * 256];
|
||||||
|
if (heightmap[x + y * 256] > max) max = heightmap[x + y * 256];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Avoid a rare divide by zero
|
||||||
|
if (min != max)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 256; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < 256; y++)
|
||||||
|
{
|
||||||
|
heightmap[x + y * 256] = ((heightmap[x + y * 256] - min) / (max - min)) * (HillMax - HillMin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private float RandomRange(float min, float max)
|
||||||
|
{
|
||||||
|
return (float)Rand.NextDouble() * (max - min) + min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Description of IAssetServer.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public interface IAssetServer
|
||||||
|
{
|
||||||
|
void SetReceiver(IAssetReceiver receiver);
|
||||||
|
void RequestAsset(LLUUID assetID, bool isTexture);
|
||||||
|
void UpdateAsset(AssetBase asset);
|
||||||
|
void UploadNewAsset(AssetBase asset);
|
||||||
|
void SetServerInfo(string ServerUrl, string ServerKey);
|
||||||
|
void Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// could change to delegate?
|
||||||
|
public interface IAssetReceiver
|
||||||
|
{
|
||||||
|
void AssetReceived(AssetBase asset, bool IsTexture);
|
||||||
|
void AssetNotFound(AssetBase asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAssetPlugin
|
||||||
|
{
|
||||||
|
IAssetServer GetAssetServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct ARequest
|
||||||
|
{
|
||||||
|
public LLUUID AssetID;
|
||||||
|
public bool IsTexture;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
|
||||||
|
* Copyright (c) <year>, <copyright holder>
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using libsecondlife;
|
||||||
|
//using OpenSim.world;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This class handles connection to the underlying database used for configuration of the region.
|
||||||
|
/// Region content is also stored by this class. The main entry point is InitConfig() which attempts to locate
|
||||||
|
/// opensim.yap in the current working directory. If opensim.yap can not be found, default settings are loaded from
|
||||||
|
/// what is hardcoded here and then saved into opensim.yap for future startups.
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class SimConfig
|
||||||
|
{
|
||||||
|
public string RegionName;
|
||||||
|
|
||||||
|
public uint RegionLocX;
|
||||||
|
public uint RegionLocY;
|
||||||
|
public ulong RegionHandle;
|
||||||
|
|
||||||
|
public int IPListenPort;
|
||||||
|
public string IPListenAddr;
|
||||||
|
|
||||||
|
public string AssetURL;
|
||||||
|
public string AssetSendKey;
|
||||||
|
|
||||||
|
public string GridURL;
|
||||||
|
public string GridSendKey;
|
||||||
|
public string GridRecvKey;
|
||||||
|
public string UserURL;
|
||||||
|
public string UserSendKey;
|
||||||
|
public string UserRecvKey;
|
||||||
|
|
||||||
|
public abstract void InitConfig(bool sandboxMode);
|
||||||
|
public abstract void LoadFromGrid();
|
||||||
|
public abstract float[] LoadWorld();
|
||||||
|
public abstract void SaveMap(float[] heightmap);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ISimConfig
|
||||||
|
{
|
||||||
|
SimConfig GetConfigObject();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.IO;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Handles connection to Grid Servers.
|
||||||
|
/// also Sim to Sim connections?
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public interface IGridServer
|
||||||
|
{
|
||||||
|
UUIDBlock RequestUUIDBlock();
|
||||||
|
NeighbourInfo[] RequestNeighbours(); //should return a array of neighbouring regions
|
||||||
|
AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||||
|
bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||||
|
string GetName();
|
||||||
|
bool RequestConnection();
|
||||||
|
void SetServerInfo(string ServerUrl, string SendKey, string RecvKey);
|
||||||
|
void Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct UUIDBlock
|
||||||
|
{
|
||||||
|
public LLUUID BlockStart;
|
||||||
|
public LLUUID BlockEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AuthenticateResponse
|
||||||
|
{
|
||||||
|
public bool Authorised;
|
||||||
|
public Login LoginInfo;
|
||||||
|
|
||||||
|
public AuthenticateResponse()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IGridPlugin
|
||||||
|
{
|
||||||
|
IGridServer GetGridServer();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ILocalStorage. Really hacked together right now needs cleaning up
|
||||||
|
/// </summary>
|
||||||
|
public interface ILocalStorage
|
||||||
|
{
|
||||||
|
void StorePrim(PrimData prim);
|
||||||
|
void RemovePrim(LLUUID primID);
|
||||||
|
void LoadPrimitives(ILocalStorageReceiver receiver);
|
||||||
|
void ShutDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ILocalStorageReceiver
|
||||||
|
{
|
||||||
|
void PrimFromStorage(PrimData prim);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public interface IUserServer
|
||||||
|
{
|
||||||
|
AgentInventory RequestAgentsInventory(LLUUID agentID);
|
||||||
|
void SetServerInfo(string ServerUrl, string SendKey, string RecvKey);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,127 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Inventory
|
||||||
|
{
|
||||||
|
public class AgentInventory
|
||||||
|
{
|
||||||
|
//Holds the local copy of Inventory info for a agent
|
||||||
|
public Dictionary<LLUUID, InventoryFolder> InventoryFolders;
|
||||||
|
public Dictionary<LLUUID, InventoryItem> InventoryItems;
|
||||||
|
public InventoryFolder InventoryRoot;
|
||||||
|
public int LastCached; //maybe used by opensim app, time this was last stored/compared to user server
|
||||||
|
public LLUUID AgentID;
|
||||||
|
public AvatarWearable[] Wearables;
|
||||||
|
|
||||||
|
public AgentInventory()
|
||||||
|
{
|
||||||
|
InventoryFolders = new Dictionary<LLUUID, InventoryFolder>();
|
||||||
|
InventoryItems = new Dictionary<LLUUID, InventoryItem>();
|
||||||
|
this.Initialise();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Initialise()
|
||||||
|
{
|
||||||
|
Wearables = new AvatarWearable[2]; //should be 12 of these
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
Wearables[i] = new AvatarWearable();
|
||||||
|
}
|
||||||
|
|
||||||
|
InventoryRoot = new InventoryFolder();
|
||||||
|
InventoryRoot.FolderID = LLUUID.Random();
|
||||||
|
InventoryRoot.ParentID = new LLUUID();
|
||||||
|
InventoryRoot.Version = 1;
|
||||||
|
InventoryRoot.DefaultType = 8;
|
||||||
|
InventoryRoot.FolderName = "My Inventory";
|
||||||
|
InventoryFolders.Add(InventoryRoot.FolderID, InventoryRoot);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool CreateNewFolder(LLUUID folderID)
|
||||||
|
{
|
||||||
|
InventoryFolder Folder = new InventoryFolder();
|
||||||
|
Folder.FolderID = folderID;
|
||||||
|
Folder.OwnerID = this.AgentID;
|
||||||
|
this.InventoryFolders.Add(Folder.FolderID, Folder);
|
||||||
|
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LLUUID AddToInventory(LLUUID folderID, AssetBase asset)
|
||||||
|
{
|
||||||
|
if (this.InventoryFolders.ContainsKey(folderID))
|
||||||
|
{
|
||||||
|
LLUUID NewItemID = LLUUID.Random();
|
||||||
|
|
||||||
|
InventoryItem Item = new InventoryItem();
|
||||||
|
Item.FolderID = folderID;
|
||||||
|
Item.OwnerID = AgentID;
|
||||||
|
Item.AssetID = asset.FullID;
|
||||||
|
Item.ItemID = NewItemID;
|
||||||
|
Item.Type = asset.Type;
|
||||||
|
Item.Name = asset.Name;
|
||||||
|
Item.Description = asset.Description;
|
||||||
|
Item.InvType = asset.InvType;
|
||||||
|
this.InventoryItems.Add(Item.ItemID, Item);
|
||||||
|
InventoryFolder Folder = InventoryFolders[Item.FolderID];
|
||||||
|
Folder.Items.Add(Item);
|
||||||
|
return (Item.ItemID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InventoryFolder
|
||||||
|
{
|
||||||
|
public List<InventoryItem> Items;
|
||||||
|
//public List<InventoryFolder> Subfolders;
|
||||||
|
public LLUUID FolderID;
|
||||||
|
public LLUUID OwnerID;
|
||||||
|
public LLUUID ParentID;
|
||||||
|
public string FolderName;
|
||||||
|
public ushort DefaultType;
|
||||||
|
public ushort Version;
|
||||||
|
|
||||||
|
public InventoryFolder()
|
||||||
|
{
|
||||||
|
Items = new List<InventoryItem>();
|
||||||
|
//Subfolders = new List<InventoryFolder>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InventoryItem
|
||||||
|
{
|
||||||
|
public LLUUID FolderID;
|
||||||
|
public LLUUID OwnerID;
|
||||||
|
public LLUUID ItemID;
|
||||||
|
public LLUUID AssetID;
|
||||||
|
public LLUUID CreatorID;
|
||||||
|
public sbyte InvType;
|
||||||
|
public sbyte Type;
|
||||||
|
public string Name;
|
||||||
|
public string Description;
|
||||||
|
|
||||||
|
public InventoryItem()
|
||||||
|
{
|
||||||
|
this.CreatorID = LLUUID.Zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AvatarWearable
|
||||||
|
{
|
||||||
|
public LLUUID AssetID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
public LLUUID ItemID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
|
||||||
|
public AvatarWearable()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public abstract class LocalGridBase : IGridServer
|
||||||
|
{
|
||||||
|
public abstract UUIDBlock RequestUUIDBlock();
|
||||||
|
public abstract NeighbourInfo[] RequestNeighbours();
|
||||||
|
public abstract AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||||
|
public abstract bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||||
|
public abstract string GetName();
|
||||||
|
public abstract bool RequestConnection();
|
||||||
|
public abstract void SetServerInfo(string ServerUrl, string SendKey, string RecvKey);
|
||||||
|
public abstract void AddNewSession(Login session);
|
||||||
|
public abstract void Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public class Login
|
||||||
|
{
|
||||||
|
public string First = "Test";
|
||||||
|
public string Last = "User";
|
||||||
|
public LLUUID Agent;
|
||||||
|
public LLUUID Session;
|
||||||
|
public LLUUID InventoryFolder;
|
||||||
|
public LLUUID BaseFolder;
|
||||||
|
public Login()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Grid
|
||||||
|
{
|
||||||
|
public abstract class LoginService
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public class NeighbourInfo
|
||||||
|
{
|
||||||
|
public NeighbourInfo()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public ulong regionhandle;
|
||||||
|
public uint RegionLocX;
|
||||||
|
public uint RegionLocY;
|
||||||
|
public string sim_ip;
|
||||||
|
public uint sim_port;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.50727</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{2E46A825-3168-492F-93BC-637126B5B72B}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>OpenSim.Framework</RootNamespace>
|
||||||
|
<AssemblyName>OpenSim.Framework</AssemblyName>
|
||||||
|
<StartupObject>
|
||||||
|
</StartupObject>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="libsecondlife, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\bin\libsecondlife.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="AgentCiruitData.cs" />
|
||||||
|
<Compile Include="AssetBase.cs" />
|
||||||
|
<Compile Include="BlockingQueue.cs" />
|
||||||
|
<Compile Include="HeightMapGenHills.cs" />
|
||||||
|
<Compile Include="IAssetServer.cs" />
|
||||||
|
<Compile Include="IConfig.cs" />
|
||||||
|
<Compile Include="IGridServer.cs" />
|
||||||
|
<Compile Include="ILocalStorage.cs" />
|
||||||
|
<Compile Include="Inventory.cs" />
|
||||||
|
<Compile Include="IUserServer.cs" />
|
||||||
|
<Compile Include="LocalGridBase.cs" />
|
||||||
|
<Compile Include="Login.cs" />
|
||||||
|
<Compile Include="LoginService.cs" />
|
||||||
|
<Compile Include="NeighbourInfo.cs" />
|
||||||
|
<Compile Include="PrimData.cs" />
|
||||||
|
<Compile Include="RemoteGridBase.cs" />
|
||||||
|
<Compile Include="SimProfile.cs" />
|
||||||
|
<Compile Include="SimProfileBase.cs" />
|
||||||
|
<Compile Include="UserProfile.cs" />
|
||||||
|
<Compile Include="UserProfileManager.cs" />
|
||||||
|
<Compile Include="UserProfileManagerBase.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Util.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
|
@ -0,0 +1,45 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Assets
|
||||||
|
{
|
||||||
|
public class PrimData
|
||||||
|
{
|
||||||
|
public LLUUID OwnerID;
|
||||||
|
public byte PCode;
|
||||||
|
public byte PathBegin;
|
||||||
|
public byte PathEnd;
|
||||||
|
public byte PathScaleX;
|
||||||
|
public byte PathScaleY;
|
||||||
|
public byte PathShearX;
|
||||||
|
public byte PathShearY;
|
||||||
|
public sbyte PathSkew;
|
||||||
|
public byte ProfileBegin;
|
||||||
|
public byte ProfileEnd;
|
||||||
|
public LLVector3 Scale;
|
||||||
|
public byte PathCurve;
|
||||||
|
public byte ProfileCurve;
|
||||||
|
public uint ParentID = 0;
|
||||||
|
public byte ProfileHollow;
|
||||||
|
public sbyte PathRadiusOffset;
|
||||||
|
public byte PathRevolutions;
|
||||||
|
public sbyte PathTaperX;
|
||||||
|
public sbyte PathTaperY;
|
||||||
|
public sbyte PathTwist;
|
||||||
|
public sbyte PathTwistBegin;
|
||||||
|
public byte[] Texture;
|
||||||
|
|
||||||
|
//following only used during prim storage
|
||||||
|
public LLVector3 Position;
|
||||||
|
public LLQuaternion Rotation;
|
||||||
|
public uint LocalID;
|
||||||
|
public LLUUID FullID;
|
||||||
|
|
||||||
|
public PrimData()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("OpenSim.FrameWork")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("OpenSim.FrameWork")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2007")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("a08e20c7-f191-4137-b1f0-9291408fa521")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,25 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Interfaces
|
||||||
|
{
|
||||||
|
public abstract class RemoteGridBase : IGridServer
|
||||||
|
{
|
||||||
|
public abstract Dictionary<uint, AgentCircuitData> agentcircuits
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract UUIDBlock RequestUUIDBlock();
|
||||||
|
public abstract NeighbourInfo[] RequestNeighbours();
|
||||||
|
public abstract AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||||
|
public abstract bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||||
|
public abstract string GetName();
|
||||||
|
public abstract bool RequestConnection();
|
||||||
|
public abstract void SetServerInfo(string ServerUrl, string SendKey, string RecvKey);
|
||||||
|
public abstract void Close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Xml;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Sims
|
||||||
|
{
|
||||||
|
public class SimProfile : SimProfileBase
|
||||||
|
{
|
||||||
|
public SimProfile LoadFromGrid(ulong region_handle, string GridURL, string SendKey, string RecvKey)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Hashtable GridReqParams = new Hashtable();
|
||||||
|
GridReqParams["region_handle"] = region_handle.ToString();
|
||||||
|
GridReqParams["caller"] = "userserver";
|
||||||
|
GridReqParams["authkey"] = SendKey;
|
||||||
|
ArrayList SendParams = new ArrayList();
|
||||||
|
SendParams.Add(GridReqParams);
|
||||||
|
XmlRpcRequest GridReq = new XmlRpcRequest("get_sim_info", SendParams);
|
||||||
|
|
||||||
|
XmlRpcResponse GridResp = GridReq.Send(GridURL, 3000);
|
||||||
|
|
||||||
|
Hashtable RespData = (Hashtable)GridResp.Value;
|
||||||
|
this.UUID = new LLUUID((string)RespData["UUID"]);
|
||||||
|
this.regionhandle = (ulong)Convert.ToUInt64(RespData["regionhandle"]);
|
||||||
|
this.regionname = (string)RespData["regionname"];
|
||||||
|
this.sim_ip = (string)RespData["sim_ip"];
|
||||||
|
this.sim_port = (uint)Convert.ToUInt16(RespData["sim_port"]);
|
||||||
|
this.caps_url = (string)RespData["caps_url"];
|
||||||
|
this.RegionLocX = (uint)Convert.ToUInt32(RespData["RegionLocX"]);
|
||||||
|
this.RegionLocY = (uint)Convert.ToUInt32(RespData["RegionLocY"]);
|
||||||
|
this.sendkey = (string)RespData["sendkey"];
|
||||||
|
this.recvkey = (string)RespData["recvkey"];
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimProfile()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Sims
|
||||||
|
{
|
||||||
|
public class SimProfileBase
|
||||||
|
{
|
||||||
|
public LLUUID UUID;
|
||||||
|
public ulong regionhandle;
|
||||||
|
public string regionname;
|
||||||
|
public string sim_ip;
|
||||||
|
public uint sim_port;
|
||||||
|
public string caps_url;
|
||||||
|
public uint RegionLocX;
|
||||||
|
public uint RegionLocY;
|
||||||
|
public string sendkey;
|
||||||
|
public string recvkey;
|
||||||
|
|
||||||
|
public SimProfileBase()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.User
|
||||||
|
{
|
||||||
|
public class UserProfile
|
||||||
|
{
|
||||||
|
|
||||||
|
public string firstname;
|
||||||
|
public string lastname;
|
||||||
|
public ulong homeregionhandle;
|
||||||
|
public LLVector3 homepos;
|
||||||
|
public LLVector3 homelookat;
|
||||||
|
|
||||||
|
public bool IsGridGod = false;
|
||||||
|
public bool IsLocal = true; // will be used in future for visitors from foreign grids
|
||||||
|
public string AssetURL;
|
||||||
|
public string MD5passwd;
|
||||||
|
|
||||||
|
public LLUUID CurrentSessionID;
|
||||||
|
public LLUUID CurrentSecureSessionID;
|
||||||
|
public LLUUID UUID;
|
||||||
|
public Dictionary<LLUUID, uint> Circuits = new Dictionary<LLUUID, uint>(); // tracks circuit codes
|
||||||
|
|
||||||
|
public AgentInventory Inventory;
|
||||||
|
|
||||||
|
public UserProfile()
|
||||||
|
{
|
||||||
|
Circuits = new Dictionary<LLUUID, uint>();
|
||||||
|
Inventory = new AgentInventory();
|
||||||
|
homeregionhandle = Helpers.UIntsToLong((997 * 256), (996 * 256)); ;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InitSessionData()
|
||||||
|
{
|
||||||
|
CurrentSessionID = LLUUID.Random();
|
||||||
|
CurrentSecureSessionID = LLUUID.Random();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddSimCircuit(uint circuitCode, LLUUID regionUUID)
|
||||||
|
{
|
||||||
|
if (this.Circuits.ContainsKey(regionUUID) == false)
|
||||||
|
this.Circuits.Add(regionUUID, circuitCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,222 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Xml;
|
||||||
|
using libsecondlife;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using OpenSim.Framework.Sims;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.User
|
||||||
|
{
|
||||||
|
public class UserProfileManager : UserProfileManagerBase
|
||||||
|
{
|
||||||
|
public string GridURL;
|
||||||
|
public string GridSendKey;
|
||||||
|
public string GridRecvKey;
|
||||||
|
public string DefaultStartupMsg;
|
||||||
|
|
||||||
|
public UserProfileManager()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetKeys(string sendKey, string recvKey, string url, string message)
|
||||||
|
{
|
||||||
|
GridRecvKey = recvKey;
|
||||||
|
GridSendKey = sendKey;
|
||||||
|
GridURL = url;
|
||||||
|
DefaultStartupMsg = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual string ParseXMLRPC(string requestBody)
|
||||||
|
{
|
||||||
|
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
||||||
|
|
||||||
|
Hashtable requestData = (Hashtable)request.Params[0];
|
||||||
|
switch (request.MethodName)
|
||||||
|
{
|
||||||
|
case "login_to_simulator":
|
||||||
|
bool GoodXML = (requestData.Contains("first") && requestData.Contains("last") && requestData.Contains("passwd"));
|
||||||
|
bool GoodLogin = false;
|
||||||
|
string firstname = "";
|
||||||
|
string lastname = "";
|
||||||
|
string passwd = "";
|
||||||
|
|
||||||
|
if (GoodXML)
|
||||||
|
{
|
||||||
|
firstname = (string)requestData["first"];
|
||||||
|
lastname = (string)requestData["last"];
|
||||||
|
passwd = (string)requestData["passwd"];
|
||||||
|
GoodLogin = AuthenticateUser(firstname, lastname, passwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!(GoodXML && GoodLogin))
|
||||||
|
{
|
||||||
|
XmlRpcResponse LoginErrorResp = new XmlRpcResponse();
|
||||||
|
Hashtable ErrorRespData = new Hashtable();
|
||||||
|
ErrorRespData["reason"] = "key";
|
||||||
|
ErrorRespData["message"] = "Error connecting to grid. Please double check your login details and check with the grid owner if you are sure these are correct";
|
||||||
|
ErrorRespData["login"] = "false";
|
||||||
|
LoginErrorResp.Value = ErrorRespData;
|
||||||
|
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(LoginErrorResp), " encoding=\"utf-16\"", ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
UserProfile TheUser = GetProfileByName(firstname, lastname);
|
||||||
|
|
||||||
|
if (!((TheUser.CurrentSessionID == null) && (TheUser.CurrentSecureSessionID == null)))
|
||||||
|
{
|
||||||
|
XmlRpcResponse PresenceErrorResp = new XmlRpcResponse();
|
||||||
|
Hashtable PresenceErrorRespData = new Hashtable();
|
||||||
|
PresenceErrorRespData["reason"] = "presence";
|
||||||
|
PresenceErrorRespData["message"] = "You appear to be already logged in, if this is not the case please wait for your session to timeout, if this takes longer than a few minutes please contact the grid owner";
|
||||||
|
PresenceErrorRespData["login"] = "false";
|
||||||
|
PresenceErrorResp.Value = PresenceErrorRespData;
|
||||||
|
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", ""));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LLUUID AgentID = TheUser.UUID;
|
||||||
|
TheUser.InitSessionData();
|
||||||
|
// SimProfile SimInfo = new SimProfile();
|
||||||
|
// SimInfo = SimInfo.LoadFromGrid(TheUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
||||||
|
|
||||||
|
XmlRpcResponse LoginGoodResp = new XmlRpcResponse();
|
||||||
|
Hashtable LoginGoodData = new Hashtable();
|
||||||
|
|
||||||
|
Hashtable GlobalT = new Hashtable();
|
||||||
|
GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
|
||||||
|
GlobalT["cloud_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
|
||||||
|
GlobalT["moon_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
|
||||||
|
ArrayList GlobalTextures = new ArrayList();
|
||||||
|
GlobalTextures.Add(GlobalT);
|
||||||
|
|
||||||
|
Hashtable LoginFlagsHash = new Hashtable();
|
||||||
|
LoginFlagsHash["daylight_savings"] = "N";
|
||||||
|
LoginFlagsHash["stipend_since_login"] = "N";
|
||||||
|
LoginFlagsHash["gendered"] = "Y";
|
||||||
|
LoginFlagsHash["ever_logged_in"] = "Y";
|
||||||
|
ArrayList LoginFlags = new ArrayList();
|
||||||
|
LoginFlags.Add(LoginFlagsHash);
|
||||||
|
|
||||||
|
Hashtable uiconfig = new Hashtable();
|
||||||
|
uiconfig["allow_first_life"] = "Y";
|
||||||
|
ArrayList ui_config = new ArrayList();
|
||||||
|
ui_config.Add(uiconfig);
|
||||||
|
|
||||||
|
Hashtable ClassifiedCategoriesHash = new Hashtable();
|
||||||
|
ClassifiedCategoriesHash["category_name"] = "bla bla";
|
||||||
|
ClassifiedCategoriesHash["category_id"] = (Int32)1;
|
||||||
|
ArrayList ClassifiedCategories = new ArrayList();
|
||||||
|
ClassifiedCategories.Add(ClassifiedCategoriesHash);
|
||||||
|
|
||||||
|
ArrayList AgentInventory = new ArrayList();
|
||||||
|
foreach (InventoryFolder InvFolder in TheUser.Inventory.InventoryFolders.Values)
|
||||||
|
{
|
||||||
|
Hashtable TempHash = new Hashtable();
|
||||||
|
TempHash["name"] = InvFolder.FolderName;
|
||||||
|
TempHash["parent_id"] = InvFolder.ParentID.ToStringHyphenated();
|
||||||
|
TempHash["version"] = (Int32)InvFolder.Version;
|
||||||
|
TempHash["type_default"] = (Int32)InvFolder.DefaultType;
|
||||||
|
TempHash["folder_id"] = InvFolder.FolderID.ToStringHyphenated();
|
||||||
|
AgentInventory.Add(TempHash);
|
||||||
|
}
|
||||||
|
|
||||||
|
Hashtable InventoryRootHash = new Hashtable();
|
||||||
|
InventoryRootHash["folder_id"] = TheUser.Inventory.InventoryRoot.FolderID.ToStringHyphenated();
|
||||||
|
ArrayList InventoryRoot = new ArrayList();
|
||||||
|
InventoryRoot.Add(InventoryRootHash);
|
||||||
|
|
||||||
|
Hashtable InitialOutfitHash = new Hashtable();
|
||||||
|
InitialOutfitHash["folder_name"] = "Nightclub Female";
|
||||||
|
InitialOutfitHash["gender"] = "female";
|
||||||
|
ArrayList InitialOutfit = new ArrayList();
|
||||||
|
InitialOutfit.Add(InitialOutfitHash);
|
||||||
|
|
||||||
|
uint circode = (uint)(new Random()).Next();
|
||||||
|
//TheUser.AddSimCircuit(circode, SimInfo.UUID);
|
||||||
|
|
||||||
|
LoginGoodData["last_name"] = "\"" + TheUser.firstname + "\"";
|
||||||
|
LoginGoodData["ui-config"] = ui_config;
|
||||||
|
LoginGoodData["sim_ip"] = "127.0.0.1"; //SimInfo.sim_ip.ToString();
|
||||||
|
LoginGoodData["login-flags"] = LoginFlags;
|
||||||
|
LoginGoodData["global-textures"] = GlobalTextures;
|
||||||
|
LoginGoodData["classified_categories"] = ClassifiedCategories;
|
||||||
|
LoginGoodData["event_categories"] = new ArrayList();
|
||||||
|
LoginGoodData["inventory-skeleton"] = AgentInventory;
|
||||||
|
LoginGoodData["inventory-skel-lib"] = new ArrayList();
|
||||||
|
LoginGoodData["inventory-root"] = InventoryRoot;
|
||||||
|
LoginGoodData["event_notifications"] = new ArrayList();
|
||||||
|
LoginGoodData["gestures"] = new ArrayList();
|
||||||
|
LoginGoodData["inventory-lib-owner"] = new ArrayList();
|
||||||
|
LoginGoodData["initial-outfit"] = InitialOutfit;
|
||||||
|
LoginGoodData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||||
|
LoginGoodData["start_location"] = "last";
|
||||||
|
LoginGoodData["home"] = "{'region_handle':[r" + (997 * 256).ToString() + ",r" + (996 * 256).ToString() + "], 'position':[r" + TheUser.homepos.X.ToString() + ",r" + TheUser.homepos.Y.ToString() + ",r" + TheUser.homepos.Z.ToString() + "], 'look_at':[r" + TheUser.homelookat.X.ToString() + ",r" + TheUser.homelookat.Y.ToString() + ",r" + TheUser.homelookat.Z.ToString() + "]}";
|
||||||
|
LoginGoodData["message"] = DefaultStartupMsg;
|
||||||
|
LoginGoodData["first_name"] = "\"" + firstname + "\"";
|
||||||
|
LoginGoodData["circuit_code"] = (Int32)circode;
|
||||||
|
LoginGoodData["sim_port"] = 9000; //(Int32)SimInfo.sim_port;
|
||||||
|
LoginGoodData["secure_session_id"] = TheUser.CurrentSecureSessionID.ToStringHyphenated();
|
||||||
|
LoginGoodData["look_at"] = "\n[r" + TheUser.homelookat.X.ToString() + ",r" + TheUser.homelookat.Y.ToString() + ",r" + TheUser.homelookat.Z.ToString() + "]\n";
|
||||||
|
LoginGoodData["agent_id"] = AgentID.ToStringHyphenated();
|
||||||
|
LoginGoodData["region_y"] = (Int32) 996 * 256; // (Int32)SimInfo.RegionLocY * 256;
|
||||||
|
LoginGoodData["region_x"] = (Int32) 997 * 256; //SimInfo.RegionLocX * 256;
|
||||||
|
LoginGoodData["seed_capability"] = null;
|
||||||
|
LoginGoodData["agent_access"] = "M";
|
||||||
|
LoginGoodData["session_id"] = TheUser.CurrentSessionID.ToStringHyphenated();
|
||||||
|
LoginGoodData["login"] = "true";
|
||||||
|
|
||||||
|
this.CustomiseResponse(ref LoginGoodData, TheUser);
|
||||||
|
LoginGoodResp.Value = LoginGoodData;
|
||||||
|
//TheUser.SendDataToSim(SimInfo);
|
||||||
|
return (Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(LoginGoodResp), "utf-16", "utf-8"));
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception E)
|
||||||
|
{
|
||||||
|
Console.WriteLine(E.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void CustomiseResponse(ref Hashtable response, UserProfile theUser)
|
||||||
|
{
|
||||||
|
//default method set up to act as ogs user server
|
||||||
|
SimProfile SimInfo = new SimProfile();
|
||||||
|
//get siminfo from grid server
|
||||||
|
SimInfo = SimInfo.LoadFromGrid(theUser.homeregionhandle, GridURL, GridSendKey, GridRecvKey);
|
||||||
|
uint circode = (uint)response["circuit_code"];
|
||||||
|
theUser.AddSimCircuit(circode, SimInfo.UUID);
|
||||||
|
response["home"] = "{'region_handle':[r" + (SimInfo.RegionLocX * 256).ToString() + ",r" + (SimInfo.RegionLocY * 256).ToString() + "], 'position':[r" + theUser.homepos.X.ToString() + ",r" + theUser.homepos.Y.ToString() + ",r" + theUser.homepos.Z.ToString() + "], 'look_at':[r" + theUser.homelookat.X.ToString() + ",r" + theUser.homelookat.Y.ToString() + ",r" + theUser.homelookat.Z.ToString() + "]}";
|
||||||
|
response["sim_ip"] = SimInfo.sim_ip.ToString();
|
||||||
|
response["sim_port"] = (Int32)SimInfo.sim_port;
|
||||||
|
response["region_y"] = (Int32) SimInfo.RegionLocY * 256;
|
||||||
|
response["region_x"] = (Int32) SimInfo.RegionLocX * 256;
|
||||||
|
|
||||||
|
//default is ogs user server, so let the sim know about the user via a XmlRpcRequest
|
||||||
|
Console.WriteLine(SimInfo.caps_url);
|
||||||
|
Hashtable SimParams = new Hashtable();
|
||||||
|
SimParams["session_id"] = theUser.CurrentSessionID.ToString();
|
||||||
|
SimParams["secure_session_id"] = theUser.CurrentSecureSessionID.ToString();
|
||||||
|
SimParams["firstname"] = theUser.firstname;
|
||||||
|
SimParams["lastname"] = theUser.lastname;
|
||||||
|
SimParams["agent_id"] = theUser.UUID.ToString();
|
||||||
|
SimParams["circuit_code"] = (Int32)theUser.Circuits[SimInfo.UUID];
|
||||||
|
ArrayList SendParams = new ArrayList();
|
||||||
|
SendParams.Add(SimParams);
|
||||||
|
|
||||||
|
XmlRpcRequest GridReq = new XmlRpcRequest("expect_user", SendParams);
|
||||||
|
XmlRpcResponse GridResp = GridReq.Send(SimInfo.caps_url, 3000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.User
|
||||||
|
{
|
||||||
|
public class UserProfileManagerBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public Dictionary<LLUUID, UserProfile> UserProfiles = new Dictionary<LLUUID, UserProfile>();
|
||||||
|
|
||||||
|
public UserProfileManagerBase()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void InitUserProfiles()
|
||||||
|
{
|
||||||
|
// TODO: need to load from database
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserProfile GetProfileByName(string firstname, string lastname)
|
||||||
|
{
|
||||||
|
foreach (libsecondlife.LLUUID UUID in UserProfiles.Keys)
|
||||||
|
{
|
||||||
|
if ((UserProfiles[UUID].firstname == firstname) && (UserProfiles[UUID].lastname == lastname))
|
||||||
|
{
|
||||||
|
return UserProfiles[UUID];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserProfile GetProfileByLLUUID(LLUUID ProfileLLUUID)
|
||||||
|
{
|
||||||
|
return UserProfiles[ProfileLLUUID];
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool AuthenticateUser(string firstname, string lastname, string passwd)
|
||||||
|
{
|
||||||
|
UserProfile TheUser = GetProfileByName(firstname, lastname);
|
||||||
|
if (TheUser != null)
|
||||||
|
{
|
||||||
|
if (TheUser.MD5passwd == passwd)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetGod(LLUUID GodID)
|
||||||
|
{
|
||||||
|
this.UserProfiles[GodID].IsGridGod = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual UserProfile CreateNewProfile(string firstname, string lastname, string MD5passwd)
|
||||||
|
{
|
||||||
|
UserProfile newprofile = new UserProfile();
|
||||||
|
newprofile.homeregionhandle = Helpers.UIntsToLong((997 * 256), (996 * 256));
|
||||||
|
newprofile.firstname = firstname;
|
||||||
|
newprofile.lastname = lastname;
|
||||||
|
newprofile.MD5passwd = MD5passwd;
|
||||||
|
newprofile.UUID = LLUUID.Random();
|
||||||
|
this.UserProfiles.Add(newprofile.UUID, newprofile);
|
||||||
|
return newprofile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual AgentInventory GetUsersInventory(LLUUID agentID)
|
||||||
|
{
|
||||||
|
UserProfile user = this.GetProfileByLLUUID(agentID);
|
||||||
|
if (user != null)
|
||||||
|
{
|
||||||
|
return user.Inventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Utilities
|
||||||
|
{
|
||||||
|
public class Util
|
||||||
|
{
|
||||||
|
private static Random randomClass = new Random();
|
||||||
|
|
||||||
|
public static ulong UIntsToLong(uint X, uint Y)
|
||||||
|
{
|
||||||
|
return Helpers.UIntsToLong(X, Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Random RandomClass
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return randomClass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Util()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("ServerConsole")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("ServerConsole")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,45 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Console
|
||||||
|
{
|
||||||
|
public abstract class ConsoleBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public enum ConsoleType
|
||||||
|
{
|
||||||
|
Local, // Use stdio
|
||||||
|
TCP, // Use TCP/telnet
|
||||||
|
SimChat // Use in-world chat (for gods)
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void Close();
|
||||||
|
|
||||||
|
public abstract void Write(string format, params object[] args);
|
||||||
|
|
||||||
|
public abstract void WriteLine(string format, params object[] args);
|
||||||
|
|
||||||
|
public abstract string ReadLine();
|
||||||
|
|
||||||
|
public abstract int Read();
|
||||||
|
|
||||||
|
// Displays a command prompt and waits for the user to enter a string, then returns that string
|
||||||
|
public abstract string CmdPrompt(string prompt);
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value if the user simply presses enter
|
||||||
|
public abstract string CmdPrompt(string prompt, string defaultresponse);
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value, user may only enter 1 of 2 options
|
||||||
|
public abstract string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB);
|
||||||
|
|
||||||
|
// Runs a command with a number of parameters
|
||||||
|
public abstract Object RunCmd(string Cmd, string[] cmdparams);
|
||||||
|
|
||||||
|
// Shows data about something
|
||||||
|
public abstract void ShowCommands(string ShowWhat);
|
||||||
|
|
||||||
|
// Displays a prompt to the user and then runs the command they entered
|
||||||
|
public abstract void MainConsolePrompt();
|
||||||
|
|
||||||
|
public abstract void SetStatus(string status);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenSim.Framework.Console
|
||||||
|
{
|
||||||
|
public class MainConsole {
|
||||||
|
|
||||||
|
private static ConsoleBase instance;
|
||||||
|
|
||||||
|
public static ConsoleBase Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
instance = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>OpenSim.Framework.Console</RootNamespace>
|
||||||
|
<AssemblyName>ServerConsole</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>True</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ConsoleBase.cs" />
|
||||||
|
<Compile Include="MainConsole.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("LocalGridServers")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("LocalGridServers")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,202 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.IO;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
|
using libsecondlife;
|
||||||
|
using Db4objects.Db4o;
|
||||||
|
using Db4objects.Db4o.Query;
|
||||||
|
|
||||||
|
namespace OpenSim.GridInterfaces.Local
|
||||||
|
{
|
||||||
|
public class LocalAssetPlugin : IAssetPlugin
|
||||||
|
{
|
||||||
|
public LocalAssetPlugin()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IAssetServer GetAssetServer()
|
||||||
|
{
|
||||||
|
return (new LocalAssetServer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LocalAssetServer : IAssetServer
|
||||||
|
{
|
||||||
|
private IAssetReceiver _receiver;
|
||||||
|
private BlockingQueue<ARequest> _assetRequests;
|
||||||
|
private IObjectContainer db;
|
||||||
|
private Thread _localAssetServerThread;
|
||||||
|
|
||||||
|
public LocalAssetServer()
|
||||||
|
{
|
||||||
|
bool yapfile;
|
||||||
|
this._assetRequests = new BlockingQueue<ARequest>();
|
||||||
|
yapfile = System.IO.File.Exists("assets.yap");
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Local Asset Server class created");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
db = Db4oFactory.OpenFile("assets.yap");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Db4 Asset database creation");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
db.Close();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Db4 Asset server :Constructor - Exception occured");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
if (!yapfile)
|
||||||
|
{
|
||||||
|
this.SetUpAssetDatabase();
|
||||||
|
}
|
||||||
|
this._localAssetServerThread = new Thread(new ThreadStart(RunRequests));
|
||||||
|
this._localAssetServerThread.IsBackground = true;
|
||||||
|
this._localAssetServerThread.Start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetReceiver(IAssetReceiver receiver)
|
||||||
|
{
|
||||||
|
this._receiver = receiver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RequestAsset(LLUUID assetID, bool isTexture)
|
||||||
|
{
|
||||||
|
ARequest req = new ARequest();
|
||||||
|
req.AssetID = assetID;
|
||||||
|
req.IsTexture = isTexture;
|
||||||
|
this._assetRequests.Enqueue(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateAsset(AssetBase asset)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UploadNewAsset(AssetBase asset)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetServerInfo(string ServerUrl, string ServerKey)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
if (db != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Closing local Asset server database");
|
||||||
|
db.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunRequests()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
byte[] idata = null;
|
||||||
|
bool found = false;
|
||||||
|
AssetStorage foundAsset = null;
|
||||||
|
ARequest req = this._assetRequests.Dequeue();
|
||||||
|
IObjectSet result = db.Query(new AssetUUIDQuery(req.AssetID));
|
||||||
|
if (result.Count > 0)
|
||||||
|
{
|
||||||
|
foundAsset = (AssetStorage)result.Next();
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetBase asset = new AssetBase();
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
asset.FullID = foundAsset.UUID;
|
||||||
|
asset.Type = foundAsset.Type;
|
||||||
|
asset.InvType = foundAsset.Type;
|
||||||
|
asset.Name = foundAsset.Name;
|
||||||
|
idata = foundAsset.Data;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
asset.FullID = LLUUID.Zero;
|
||||||
|
}
|
||||||
|
asset.Data = idata;
|
||||||
|
_receiver.AssetReceived(asset, req.IsTexture);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetUpAssetDatabase()
|
||||||
|
{
|
||||||
|
Console.WriteLine("setting up Asset database");
|
||||||
|
|
||||||
|
AssetBase Image = new AssetBase();
|
||||||
|
Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001");
|
||||||
|
Image.Name = "test Texture";
|
||||||
|
this.LoadAsset(Image, true, "testpic2.jp2");
|
||||||
|
AssetStorage store = new AssetStorage();
|
||||||
|
store.Data = Image.Data;
|
||||||
|
store.Name = Image.Name;
|
||||||
|
store.UUID = Image.FullID;
|
||||||
|
db.Set(store);
|
||||||
|
db.Commit();
|
||||||
|
|
||||||
|
Image = new AssetBase();
|
||||||
|
Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002");
|
||||||
|
Image.Name = "test Texture2";
|
||||||
|
this.LoadAsset(Image, true, "map_base.jp2");
|
||||||
|
store = new AssetStorage();
|
||||||
|
store.Data = Image.Data;
|
||||||
|
store.Name = Image.Name;
|
||||||
|
store.UUID = Image.FullID;
|
||||||
|
db.Set(store);
|
||||||
|
db.Commit();
|
||||||
|
|
||||||
|
|
||||||
|
Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005");
|
||||||
|
Image.Name = "Prim Base Texture";
|
||||||
|
store = new AssetStorage();
|
||||||
|
store.Data = Image.Data;
|
||||||
|
store.Name = Image.Name;
|
||||||
|
store.UUID = Image.FullID;
|
||||||
|
db.Set(store);
|
||||||
|
db.Commit();
|
||||||
|
|
||||||
|
Image = new AssetBase();
|
||||||
|
Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
|
||||||
|
Image.Name = "Shape";
|
||||||
|
this.LoadAsset(Image, false, "base_shape.dat");
|
||||||
|
store = new AssetStorage();
|
||||||
|
store.Data = Image.Data;
|
||||||
|
store.Name = Image.Name;
|
||||||
|
store.UUID = Image.FullID;
|
||||||
|
db.Set(store);
|
||||||
|
db.Commit();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadAsset(AssetBase info, bool image, string filename)
|
||||||
|
{
|
||||||
|
//should request Asset from storage manager
|
||||||
|
//but for now read from file
|
||||||
|
|
||||||
|
string dataPath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "assets"); //+ folder;
|
||||||
|
string fileName = Path.Combine(dataPath, filename);
|
||||||
|
FileInfo fInfo = new FileInfo(fileName);
|
||||||
|
long numBytes = fInfo.Length;
|
||||||
|
FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
|
||||||
|
byte[] idata = new byte[numBytes];
|
||||||
|
BinaryReader br = new BinaryReader(fStream);
|
||||||
|
idata = br.ReadBytes((int)numBytes);
|
||||||
|
br.Close();
|
||||||
|
fStream.Close();
|
||||||
|
info.Data = idata;
|
||||||
|
//info.loaded=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.IO;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
using libsecondlife;
|
||||||
|
using Db4objects.Db4o;
|
||||||
|
using Db4objects.Db4o.Query;
|
||||||
|
|
||||||
|
namespace OpenSim.GridInterfaces.Local
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
///
|
||||||
|
public class LocalGridPlugin : IGridPlugin
|
||||||
|
{
|
||||||
|
public LocalGridPlugin()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IGridServer GetGridServer()
|
||||||
|
{
|
||||||
|
return(new LocalGridServer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LocalGridServer : LocalGridBase
|
||||||
|
{
|
||||||
|
public List<Login> Sessions = new List<Login>();
|
||||||
|
|
||||||
|
public LocalGridServer()
|
||||||
|
{
|
||||||
|
Sessions = new List<Login>();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Local Grid Server class created");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool RequestConnection()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetName()
|
||||||
|
{
|
||||||
|
return "Local";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
|
||||||
|
{
|
||||||
|
//we are running local
|
||||||
|
AuthenticateResponse user = new AuthenticateResponse();
|
||||||
|
|
||||||
|
lock(this.Sessions)
|
||||||
|
{
|
||||||
|
|
||||||
|
for(int i = 0; i < Sessions.Count; i++)
|
||||||
|
{
|
||||||
|
if((Sessions[i].Agent == agentID) && (Sessions[i].Session == sessionID))
|
||||||
|
{
|
||||||
|
user.Authorised = true;
|
||||||
|
user.LoginInfo = Sessions[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
|
||||||
|
{
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override UUIDBlock RequestUUIDBlock()
|
||||||
|
{
|
||||||
|
UUIDBlock uuidBlock = new UUIDBlock();
|
||||||
|
return(uuidBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override NeighbourInfo[] RequestNeighbours()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetServerInfo(string ServerUrl, string SendKey, string RecvKey)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Close()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// used by the local login server to inform us of new sessions
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="session"></param>
|
||||||
|
public override void AddNewSession(Login session)
|
||||||
|
{
|
||||||
|
lock(this.Sessions)
|
||||||
|
{
|
||||||
|
this.Sessions.Add(session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AssetUUIDQuery : Predicate
|
||||||
|
{
|
||||||
|
private LLUUID _findID;
|
||||||
|
|
||||||
|
public AssetUUIDQuery(LLUUID find)
|
||||||
|
{
|
||||||
|
_findID = find;
|
||||||
|
}
|
||||||
|
public bool Match(AssetStorage asset)
|
||||||
|
{
|
||||||
|
return (asset.UUID == _findID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AssetStorage
|
||||||
|
{
|
||||||
|
public byte[] Data;
|
||||||
|
public sbyte Type;
|
||||||
|
public string Name;
|
||||||
|
public LLUUID UUID;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>OpenSim.GridInterfaces.Local</RootNamespace>
|
||||||
|
<AssemblyName>LocalGridServers</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{D7F0395B-FADC-4936-80A0-D95AACE92F62}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>..\..\..\bin\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>True</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>..\..\bin\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Db4objects.Db4o, Version=6.0.1.0, Culture=neutral, PublicKeyToken=6199cd4f203aa8eb, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\Db4objects.Db4o.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="libsecondlife, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\libsecondlife.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="LocalAssetServer.cs" />
|
||||||
|
<Compile Include="LocalGridServer.cs" />
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.FrameWork\OpenSim.Framework.csproj">
|
||||||
|
<Project>{2E46A825-3168-492F-93BC-637126B5B72B}</Project>
|
||||||
|
<Name>OpenSim.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.Framework.Console\OpenSim.Framework.Console.csproj">
|
||||||
|
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||||
|
<Name>OpenSim.Framework.Console</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("RemoteGridServers")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("RemoteGridServers")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,51 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>OpenSim.GridInterfaces.Remote</RootNamespace>
|
||||||
|
<AssemblyName>RemoteGridServers</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>..\..\..\bin\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>True</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>..\..\bin\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="libsecondlife, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\libsecondlife.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="RemoteAssetServer.cs" />
|
||||||
|
<Compile Include="RemoteGridServer.cs" />
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.FrameWork\OpenSim.Framework.csproj">
|
||||||
|
<Project>{2E46A825-3168-492F-93BC-637126B5B72B}</Project>
|
||||||
|
<Name>OpenSim.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.Framework.Console\OpenSim.Framework.Console.csproj">
|
||||||
|
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||||
|
<Name>OpenSim.Framework.Console</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,102 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.IO;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
|
|
||||||
|
namespace OpenSim.GridInterfaces.Remote
|
||||||
|
{
|
||||||
|
public class RemoteAssetServer : IAssetServer
|
||||||
|
{
|
||||||
|
private IAssetReceiver _receiver;
|
||||||
|
private BlockingQueue<ARequest> _assetRequests;
|
||||||
|
private Thread _remoteAssetServerThread;
|
||||||
|
private string AssetServerUrl;
|
||||||
|
private string AssetSendKey;
|
||||||
|
|
||||||
|
public RemoteAssetServer()
|
||||||
|
{
|
||||||
|
this._assetRequests = new BlockingQueue<ARequest>();
|
||||||
|
this._remoteAssetServerThread = new Thread(new ThreadStart(RunRequests));
|
||||||
|
this._remoteAssetServerThread.IsBackground = true;
|
||||||
|
this._remoteAssetServerThread.Start();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Remote Asset Server class created");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetReceiver(IAssetReceiver receiver)
|
||||||
|
{
|
||||||
|
this._receiver = receiver;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RequestAsset(LLUUID assetID, bool isTexture)
|
||||||
|
{
|
||||||
|
ARequest req = new ARequest();
|
||||||
|
req.AssetID = assetID;
|
||||||
|
req.IsTexture = isTexture;
|
||||||
|
this._assetRequests.Enqueue(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateAsset(AssetBase asset)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UploadNewAsset(AssetBase asset)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetServerInfo(string ServerUrl, string ServerKey)
|
||||||
|
{
|
||||||
|
this.AssetServerUrl = ServerUrl;
|
||||||
|
this.AssetSendKey = ServerKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunRequests()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
//we need to add support for the asset server not knowing about a requested asset
|
||||||
|
ARequest req = this._assetRequests.Dequeue();
|
||||||
|
LLUUID assetID = req.AssetID;
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(" RemoteAssetServer- Got a AssetServer request, processing it");
|
||||||
|
WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "getasset/" + AssetSendKey + "/" + assetID + "/data");
|
||||||
|
WebResponse AssetResponse = AssetLoad.GetResponse();
|
||||||
|
byte[] idata = new byte[(int)AssetResponse.ContentLength];
|
||||||
|
BinaryReader br = new BinaryReader(AssetResponse.GetResponseStream());
|
||||||
|
idata = br.ReadBytes((int)AssetResponse.ContentLength);
|
||||||
|
br.Close();
|
||||||
|
|
||||||
|
AssetBase asset = new AssetBase();
|
||||||
|
asset.FullID = assetID;
|
||||||
|
asset.Data = idata;
|
||||||
|
_receiver.AssetReceived(asset, req.IsTexture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RemoteAssetPlugin : IAssetPlugin
|
||||||
|
{
|
||||||
|
public RemoteAssetPlugin()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IAssetServer GetAssetServer()
|
||||||
|
{
|
||||||
|
return (new RemoteAssetServer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.IO;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.GridInterfaces.Remote
|
||||||
|
{
|
||||||
|
public class RemoteGridServer : RemoteGridBase
|
||||||
|
{
|
||||||
|
private string GridServerUrl;
|
||||||
|
private string GridSendKey;
|
||||||
|
private string GridRecvKey;
|
||||||
|
private Dictionary<uint, AgentCircuitData> AgentCircuits = new Dictionary<uint, AgentCircuitData>();
|
||||||
|
|
||||||
|
public override Dictionary<uint, AgentCircuitData> agentcircuits
|
||||||
|
{
|
||||||
|
get { return AgentCircuits; }
|
||||||
|
set { AgentCircuits = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public RemoteGridServer()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Remote Grid Server class created");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool RequestConnection()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitcode)
|
||||||
|
{
|
||||||
|
AgentCircuitData validcircuit = null;
|
||||||
|
if (this.AgentCircuits.ContainsKey(circuitcode))
|
||||||
|
{
|
||||||
|
validcircuit = this.AgentCircuits[circuitcode];
|
||||||
|
}
|
||||||
|
AuthenticateResponse user = new AuthenticateResponse();
|
||||||
|
if (validcircuit == null)
|
||||||
|
{
|
||||||
|
//don't have this circuit code in our list
|
||||||
|
user.Authorised = false;
|
||||||
|
return (user);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sessionID == validcircuit.SessionID) && (agentID == validcircuit.AgentID))
|
||||||
|
{
|
||||||
|
// YAY! Valid login
|
||||||
|
user.Authorised = true;
|
||||||
|
user.LoginInfo = new Login();
|
||||||
|
user.LoginInfo.Agent = agentID;
|
||||||
|
user.LoginInfo.Session = sessionID;
|
||||||
|
user.LoginInfo.First = validcircuit.firstname;
|
||||||
|
user.LoginInfo.Last = validcircuit.lastname;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Invalid
|
||||||
|
user.Authorised = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (user);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
|
||||||
|
{
|
||||||
|
WebRequest DeleteSession = WebRequest.Create(GridServerUrl + "/usersessions/" + sessionID.ToString());
|
||||||
|
DeleteSession.Method = "DELETE";
|
||||||
|
DeleteSession.ContentType = "text/plaintext";
|
||||||
|
DeleteSession.ContentLength = 0;
|
||||||
|
|
||||||
|
StreamWriter stOut = new StreamWriter(DeleteSession.GetRequestStream(), System.Text.Encoding.ASCII);
|
||||||
|
stOut.Write("");
|
||||||
|
stOut.Close();
|
||||||
|
|
||||||
|
StreamReader stIn = new StreamReader(DeleteSession.GetResponse().GetResponseStream());
|
||||||
|
string GridResponse = stIn.ReadToEnd();
|
||||||
|
stIn.Close();
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override UUIDBlock RequestUUIDBlock()
|
||||||
|
{
|
||||||
|
UUIDBlock uuidBlock = new UUIDBlock();
|
||||||
|
return (uuidBlock);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override NeighbourInfo[] RequestNeighbours()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetServerInfo(string ServerUrl, string SendKey, string RecvKey)
|
||||||
|
{
|
||||||
|
this.GridServerUrl = ServerUrl;
|
||||||
|
this.GridSendKey = SendKey;
|
||||||
|
this.GridRecvKey = RecvKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetName()
|
||||||
|
{
|
||||||
|
return "Remote";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Close()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RemoteGridPlugin : IGridPlugin
|
||||||
|
{
|
||||||
|
public RemoteGridPlugin()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public IGridServer GetGridServer()
|
||||||
|
{
|
||||||
|
return (new RemoteGridServer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("PhysXplugin")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("PhysXplugin")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,251 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenSim.Physics.Manager;
|
||||||
|
|
||||||
|
namespace OpenSim.Physics.BasicPhysicsPlugin
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Will be the PhysX plugin but for now will be a very basic physics engine
|
||||||
|
/// </summary>
|
||||||
|
public class BasicPhysicsPlugin : IPhysicsPlugin
|
||||||
|
{
|
||||||
|
private BasicScene _mScene;
|
||||||
|
|
||||||
|
public BasicPhysicsPlugin()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Init()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PhysicsScene GetScene()
|
||||||
|
{
|
||||||
|
if(_mScene == null)
|
||||||
|
{
|
||||||
|
_mScene = new BasicScene();
|
||||||
|
}
|
||||||
|
return(_mScene);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetName()
|
||||||
|
{
|
||||||
|
return("basicphysics");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BasicScene :PhysicsScene
|
||||||
|
{
|
||||||
|
private List<BasicActor> _actors = new List<BasicActor>();
|
||||||
|
private float[] _heightMap;
|
||||||
|
|
||||||
|
public BasicScene()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsActor AddAvatar(PhysicsVector position)
|
||||||
|
{
|
||||||
|
BasicActor act = new BasicActor();
|
||||||
|
act.Position = position;
|
||||||
|
_actors.Add(act);
|
||||||
|
return act;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Simulate(float timeStep)
|
||||||
|
{
|
||||||
|
foreach (BasicActor actor in _actors)
|
||||||
|
{
|
||||||
|
actor.Position.X = actor.Position.X + (actor.Velocity.X * timeStep);
|
||||||
|
actor.Position.Y = actor.Position.Y + (actor.Velocity.Y * timeStep);
|
||||||
|
actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep);
|
||||||
|
/*if(actor.Flying)
|
||||||
|
{
|
||||||
|
actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
actor.Position.Z = actor.Position.Z + ((-9.8f + actor.Velocity.Z) * timeStep);
|
||||||
|
}
|
||||||
|
if(actor.Position.Z < (_heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1))
|
||||||
|
{*/
|
||||||
|
actor.Position.Z = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1;
|
||||||
|
//}
|
||||||
|
if(actor.Position.X<0)
|
||||||
|
{
|
||||||
|
actor.Position.X = 0;
|
||||||
|
actor.Velocity.X = 0;
|
||||||
|
}
|
||||||
|
if(actor.Position.Y < 0)
|
||||||
|
{
|
||||||
|
actor.Position.Y = 0;
|
||||||
|
actor.Velocity.Y = 0;
|
||||||
|
}
|
||||||
|
if(actor.Position.X > 255)
|
||||||
|
{
|
||||||
|
actor.Position.X = 255;
|
||||||
|
actor.Velocity.X = 0;
|
||||||
|
}
|
||||||
|
if(actor.Position.Y > 255)
|
||||||
|
{
|
||||||
|
actor.Position.Y = 255;
|
||||||
|
actor.Velocity.X = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void GetResults()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsThreaded
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return(false); // for now we won't be multithreaded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetTerrain(float[] heightMap)
|
||||||
|
{
|
||||||
|
this._heightMap = heightMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BasicActor : PhysicsActor
|
||||||
|
{
|
||||||
|
private PhysicsVector _position;
|
||||||
|
private PhysicsVector _velocity;
|
||||||
|
private PhysicsVector _acceleration;
|
||||||
|
private bool flying;
|
||||||
|
public BasicActor()
|
||||||
|
{
|
||||||
|
_velocity = new PhysicsVector();
|
||||||
|
_position = new PhysicsVector();
|
||||||
|
_acceleration = new PhysicsVector();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Flying
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
flying= value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _position;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_position = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Velocity
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _velocity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_velocity = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Axiom.MathLib.Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Axiom.MathLib.Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Acceleration
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _acceleration;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Kinematic
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void SetAcceleration (PhysicsVector accel)
|
||||||
|
{
|
||||||
|
this._acceleration = accel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void AddForce(PhysicsVector force)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetMomentum(PhysicsVector momentum)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.50727</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{52BCCE7B-69EA-4AC3-9DBC-D571B96C2EA1}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>OpenSim.Physics.BasicPhysicsPlugin</RootNamespace>
|
||||||
|
<AssemblyName>BasicPhysicsplugin</AssemblyName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>..\..\..\bin\Physics\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>..\..\bin\Physics\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Axiom.MathLib, Version=0.7.0.25497, Culture=neutral">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\Axiom.MathLib.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="BasicPhysicsPlugin.cs" />
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Manager\OpenSim.Physics.Manager.csproj">
|
||||||
|
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
|
||||||
|
<Name>OpenSim.Physics.Manager</Name>
|
||||||
|
<Private>False</Private>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("PhysicsManager")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("PhysicsManager")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,49 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>OpenSim.Physics.Manager</RootNamespace>
|
||||||
|
<AssemblyName>PhysicsManager</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>True</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Axiom.MathLib, Version=0.7.0.25497, Culture=neutral">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\Axiom.MathLib.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="PhysicsActor.cs" />
|
||||||
|
<Compile Include="PhysicsManager.cs" />
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
<Compile Include="PhysicsScene.cs" />
|
||||||
|
<Compile Include="PhysicsVector.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.Framework.Console\OpenSim.Framework.Console.csproj">
|
||||||
|
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||||
|
<Name>OpenSim.Framework.Console</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.Physics.Manager
|
||||||
|
{
|
||||||
|
public abstract class PhysicsActor
|
||||||
|
{
|
||||||
|
public static PhysicsActor Null
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new NullPhysicsActor();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract PhysicsVector Position
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract PhysicsVector Velocity
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract PhysicsVector Acceleration
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract Axiom.MathLib.Quaternion Orientation
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract bool Flying
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract bool Kinematic
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void AddForce(PhysicsVector force);
|
||||||
|
|
||||||
|
public abstract void SetMomentum(PhysicsVector momentum);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NullPhysicsActor : PhysicsActor
|
||||||
|
{
|
||||||
|
public override PhysicsVector Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return PhysicsVector.Zero;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Velocity
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return PhysicsVector.Zero;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Axiom.MathLib.Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Axiom.MathLib.Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Acceleration
|
||||||
|
{
|
||||||
|
get { return PhysicsVector.Zero; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Flying
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Kinematic
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void AddForce(PhysicsVector force)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetMomentum(PhysicsVector momentum)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using Axiom.MathLib;
|
||||||
|
|
||||||
|
namespace OpenSim.Physics.Manager
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Description of MyClass.
|
||||||
|
/// </summary>
|
||||||
|
public class PhysicsManager
|
||||||
|
{
|
||||||
|
private Dictionary<string, IPhysicsPlugin> _plugins=new Dictionary<string, IPhysicsPlugin>();
|
||||||
|
|
||||||
|
public PhysicsManager()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public PhysicsScene GetPhysicsScene(string engineName)
|
||||||
|
{
|
||||||
|
if (String.IsNullOrEmpty(engineName))
|
||||||
|
{
|
||||||
|
return new NullPhysicsScene();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_plugins.ContainsKey(engineName))
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("creating "+engineName);
|
||||||
|
return _plugins[engineName].GetScene();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
string error = String.Format("couldn't find physicsEngine: {0}", engineName);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(error);
|
||||||
|
throw new ArgumentException(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadPlugins()
|
||||||
|
{
|
||||||
|
string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory ,"Physics");
|
||||||
|
string[] pluginFiles = Directory.GetFiles(path, "*.dll");
|
||||||
|
|
||||||
|
|
||||||
|
for(int i= 0; i<pluginFiles.Length; i++)
|
||||||
|
{
|
||||||
|
this.AddPlugin(pluginFiles[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddPlugin(string FileName)
|
||||||
|
{
|
||||||
|
Assembly pluginAssembly = Assembly.LoadFrom(FileName);
|
||||||
|
|
||||||
|
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (pluginType.IsPublic)
|
||||||
|
{
|
||||||
|
if (!pluginType.IsAbstract)
|
||||||
|
{
|
||||||
|
Type typeInterface = pluginType.GetInterface("IPhysicsPlugin", true);
|
||||||
|
|
||||||
|
if (typeInterface != null)
|
||||||
|
{
|
||||||
|
IPhysicsPlugin plug = (IPhysicsPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||||
|
plug.Init();
|
||||||
|
this._plugins.Add(plug.GetName(),plug);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
typeInterface = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pluginAssembly = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IPhysicsPlugin
|
||||||
|
{
|
||||||
|
bool Init();
|
||||||
|
PhysicsScene GetScene();
|
||||||
|
string GetName();
|
||||||
|
void Dispose();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.Physics.Manager
|
||||||
|
{
|
||||||
|
public abstract class PhysicsScene
|
||||||
|
{
|
||||||
|
public static PhysicsScene Null
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new NullPhysicsScene();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract PhysicsActor AddAvatar(PhysicsVector position);
|
||||||
|
|
||||||
|
public abstract PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size);
|
||||||
|
|
||||||
|
public abstract void Simulate(float timeStep);
|
||||||
|
|
||||||
|
public abstract void GetResults();
|
||||||
|
|
||||||
|
public abstract void SetTerrain(float[] heightMap);
|
||||||
|
|
||||||
|
public abstract bool IsThreaded
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NullPhysicsScene : PhysicsScene
|
||||||
|
{
|
||||||
|
private static int m_workIndicator;
|
||||||
|
|
||||||
|
public override PhysicsActor AddAvatar(PhysicsVector position)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("NullPhysicsScene : AddAvatar({0})", position);
|
||||||
|
return PhysicsActor.Null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("NullPhysicsScene : AddPrim({0},{1})", position, size);
|
||||||
|
return PhysicsActor.Null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Simulate(float timeStep)
|
||||||
|
{
|
||||||
|
m_workIndicator = (m_workIndicator + 1) % 10;
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.SetStatus(m_workIndicator.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void GetResults()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("NullPhysicsScene : GetResults()");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetTerrain(float[] heightMap)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("NullPhysicsScene : SetTerrain({0} items)", heightMap.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsThreaded
|
||||||
|
{
|
||||||
|
get { return false; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.Physics.Manager
|
||||||
|
{
|
||||||
|
public class PhysicsVector
|
||||||
|
{
|
||||||
|
public float X;
|
||||||
|
public float Y;
|
||||||
|
public float Z;
|
||||||
|
|
||||||
|
public PhysicsVector()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public PhysicsVector(float x, float y, float z)
|
||||||
|
{
|
||||||
|
X = x;
|
||||||
|
Y = y;
|
||||||
|
Z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly PhysicsVector Zero = new PhysicsVector(0f, 0f, 0f);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("RealPhysXplugin")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("RealPhysXplugin")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,50 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>OpenSim.Physics.PhysXPlugin</RootNamespace>
|
||||||
|
<AssemblyName>RealPhysXplugin</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{56C1D214-F389-4228-921A-0A3A0712C159}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>..\..\..\..\bin\Physics\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>True</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>..\..\bin\Physics\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Axiom.MathLib, Version=0.7.0.25497, Culture=neutral">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\Axiom.MathLib.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="PhysX_Wrapper_Dotnet, Version=1.0.2628.28883, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\PhysX_Wrapper_Dotnet.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="PhysXPlugin.cs" />
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Manager\OpenSim.Physics.Manager.csproj">
|
||||||
|
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
|
||||||
|
<Name>OpenSim.Physics.Manager</Name>
|
||||||
|
<Private>False</Private>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,422 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenSim.Physics.Manager;
|
||||||
|
using PhysXWrapper;
|
||||||
|
|
||||||
|
namespace OpenSim.Physics.PhysXPlugin
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Will be the PhysX plugin but for now will be a very basic physics engine
|
||||||
|
/// </summary>
|
||||||
|
public class PhysXPlugin : IPhysicsPlugin
|
||||||
|
{
|
||||||
|
private PhysXScene _mScene;
|
||||||
|
|
||||||
|
public PhysXPlugin()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Init()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PhysicsScene GetScene()
|
||||||
|
{
|
||||||
|
if(_mScene == null)
|
||||||
|
{
|
||||||
|
_mScene = new PhysXScene();
|
||||||
|
}
|
||||||
|
return(_mScene);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetName()
|
||||||
|
{
|
||||||
|
return("RealPhysX");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PhysXScene :PhysicsScene
|
||||||
|
{
|
||||||
|
private List<PhysXCharacter> _characters = new List<PhysXCharacter>();
|
||||||
|
private List<PhysXPrim> _prims = new List<PhysXPrim>();
|
||||||
|
private float[] _heightMap;
|
||||||
|
private NxPhysicsSDK mySdk;
|
||||||
|
private NxScene scene;
|
||||||
|
|
||||||
|
public PhysXScene()
|
||||||
|
{
|
||||||
|
mySdk = NxPhysicsSDK.CreateSDK();
|
||||||
|
Console.WriteLine("Sdk created - now creating scene");
|
||||||
|
scene = mySdk.CreateScene();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsActor AddAvatar(PhysicsVector position)
|
||||||
|
{
|
||||||
|
Vec3 pos = new Vec3();
|
||||||
|
pos.X = position.X;
|
||||||
|
pos.Y = position.Y;
|
||||||
|
pos.Z = position.Z;
|
||||||
|
PhysXCharacter act = new PhysXCharacter( scene.AddCharacter(pos));
|
||||||
|
act.Position = position;
|
||||||
|
_characters.Add(act);
|
||||||
|
return act;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
|
||||||
|
{
|
||||||
|
Vec3 pos = new Vec3();
|
||||||
|
pos.X = position.X;
|
||||||
|
pos.Y = position.Y;
|
||||||
|
pos.Z = position.Z;
|
||||||
|
Vec3 siz = new Vec3();
|
||||||
|
siz.X = size.X;
|
||||||
|
siz.Y = size.Y;
|
||||||
|
siz.Z = size.Z;
|
||||||
|
PhysXPrim act = new PhysXPrim( scene.AddNewBox(pos, siz));
|
||||||
|
_prims.Add(act);
|
||||||
|
return act;
|
||||||
|
}
|
||||||
|
public override void Simulate(float timeStep)
|
||||||
|
{
|
||||||
|
foreach (PhysXCharacter actor in _characters)
|
||||||
|
{
|
||||||
|
actor.Move(timeStep);
|
||||||
|
}
|
||||||
|
scene.Simulate(timeStep);
|
||||||
|
scene.FetchResults();
|
||||||
|
scene.UpdateControllers();
|
||||||
|
|
||||||
|
foreach (PhysXCharacter actor in _characters)
|
||||||
|
{
|
||||||
|
actor.UpdatePosition();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void GetResults()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsThreaded
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return(false); // for now we won't be multithreaded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetTerrain(float[] heightMap)
|
||||||
|
{
|
||||||
|
this._heightMap = heightMap;
|
||||||
|
this.scene.AddTerrain(heightMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PhysXCharacter : PhysicsActor
|
||||||
|
{
|
||||||
|
private PhysicsVector _position;
|
||||||
|
private PhysicsVector _velocity;
|
||||||
|
private PhysicsVector _acceleration;
|
||||||
|
private NxCharacter _character;
|
||||||
|
private bool flying;
|
||||||
|
private float gravityAccel;
|
||||||
|
|
||||||
|
public PhysXCharacter(NxCharacter character)
|
||||||
|
{
|
||||||
|
_velocity = new PhysicsVector();
|
||||||
|
_position = new PhysicsVector();
|
||||||
|
_acceleration = new PhysicsVector();
|
||||||
|
_character = character;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Flying
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return flying;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
flying = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _position;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_position = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Velocity
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _velocity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_velocity = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Kinematic
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Axiom.MathLib.Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Axiom.MathLib.Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Acceleration
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _acceleration;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public void SetAcceleration (PhysicsVector accel)
|
||||||
|
{
|
||||||
|
this._acceleration = accel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void AddForce(PhysicsVector force)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetMomentum(PhysicsVector momentum)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Move(float timeStep)
|
||||||
|
{
|
||||||
|
Vec3 vec = new Vec3();
|
||||||
|
vec.X = this._velocity.X * timeStep;
|
||||||
|
vec.Y = this._velocity.Y * timeStep;
|
||||||
|
if(flying)
|
||||||
|
{
|
||||||
|
vec.Z = ( this._velocity.Z) * timeStep;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gravityAccel+= -9.8f;
|
||||||
|
vec.Z = (gravityAccel + this._velocity.Z) * timeStep;
|
||||||
|
}
|
||||||
|
int res = this._character.Move(vec);
|
||||||
|
if(res == 1)
|
||||||
|
{
|
||||||
|
gravityAccel = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdatePosition()
|
||||||
|
{
|
||||||
|
Vec3 vec = this._character.Position;
|
||||||
|
this._position.X = vec.X;
|
||||||
|
this._position.Y = vec.Y;
|
||||||
|
this._position.Z = vec.Z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PhysXPrim : PhysicsActor
|
||||||
|
{
|
||||||
|
private PhysicsVector _position;
|
||||||
|
private PhysicsVector _velocity;
|
||||||
|
private PhysicsVector _acceleration;
|
||||||
|
private NxActor _prim;
|
||||||
|
|
||||||
|
public PhysXPrim(NxActor prim)
|
||||||
|
{
|
||||||
|
_velocity = new PhysicsVector();
|
||||||
|
_position = new PhysicsVector();
|
||||||
|
_acceleration = new PhysicsVector();
|
||||||
|
_prim = prim;
|
||||||
|
}
|
||||||
|
public override bool Flying
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return false; //no flying prims for you
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override PhysicsVector Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
PhysicsVector pos = new PhysicsVector();
|
||||||
|
Vec3 vec = this._prim.Position;
|
||||||
|
pos.X = vec.X;
|
||||||
|
pos.Y = vec.Y;
|
||||||
|
pos.Z = vec.Z;
|
||||||
|
return pos;
|
||||||
|
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
PhysicsVector vec = value;
|
||||||
|
Vec3 pos = new Vec3();
|
||||||
|
pos.X = vec.X;
|
||||||
|
pos.Y = vec.Y;
|
||||||
|
pos.Z = vec.Z;
|
||||||
|
this._prim.Position = pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Velocity
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _velocity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_velocity = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Kinematic
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this._prim.Kinematic;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this._prim.Kinematic = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Axiom.MathLib.Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Axiom.MathLib.Quaternion res = new Axiom.MathLib.Quaternion();
|
||||||
|
PhysXWrapper.Quaternion quat = this._prim.GetOrientation();
|
||||||
|
res.w = quat.W;
|
||||||
|
res.x = quat.X;
|
||||||
|
res.y = quat.Y;
|
||||||
|
res.z = quat.Z;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override PhysicsVector Acceleration
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _acceleration;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public void SetAcceleration (PhysicsVector accel)
|
||||||
|
{
|
||||||
|
this._acceleration = accel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void AddForce(PhysicsVector force)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SetMomentum(PhysicsVector momentum)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,560 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
using OpenSim;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.Assets
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Manages local cache of assets and their sending to viewers.
|
||||||
|
/// </summary>
|
||||||
|
public class AssetCache : IAssetReceiver
|
||||||
|
{
|
||||||
|
public Dictionary<libsecondlife.LLUUID, AssetInfo> Assets;
|
||||||
|
public Dictionary<libsecondlife.LLUUID, TextureImage> Textures;
|
||||||
|
|
||||||
|
public List<AssetRequest> AssetRequests = new List<AssetRequest>(); //assets ready to be sent to viewers
|
||||||
|
public List<AssetRequest> TextureRequests = new List<AssetRequest>(); //textures ready to be sent
|
||||||
|
|
||||||
|
public Dictionary<LLUUID, AssetRequest> RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); //Assets requested from the asset server
|
||||||
|
public Dictionary<LLUUID, AssetRequest> RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); //Textures requested from the asset server
|
||||||
|
|
||||||
|
private Dictionary<libsecondlife.LLUUID, AssetBase> IncomingAssets;
|
||||||
|
|
||||||
|
private IAssetServer _assetServer;
|
||||||
|
private Thread _assetCacheThread;
|
||||||
|
private LLUUID[] textureList = new LLUUID[2];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public AssetCache(IAssetServer assetServer)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Creating Asset cache");
|
||||||
|
_assetServer = assetServer;
|
||||||
|
_assetServer.SetReceiver(this);
|
||||||
|
Assets = new Dictionary<libsecondlife.LLUUID, AssetInfo>();
|
||||||
|
Textures = new Dictionary<libsecondlife.LLUUID, TextureImage>();
|
||||||
|
IncomingAssets = new Dictionary<libsecondlife.LLUUID, AssetBase>();
|
||||||
|
this._assetCacheThread = new Thread(new ThreadStart(RunAssetManager));
|
||||||
|
this._assetCacheThread.IsBackground = true;
|
||||||
|
this._assetCacheThread.Start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public void RunAssetManager()
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.ProcessAssetQueue();
|
||||||
|
this.ProcessTextureQueue();
|
||||||
|
Thread.Sleep(100);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadDefaultTextureSet()
|
||||||
|
{
|
||||||
|
//hack: so we can give each user a set of textures
|
||||||
|
textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001");
|
||||||
|
textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002");
|
||||||
|
for (int i = 0; i < textureList.Length; i++)
|
||||||
|
{
|
||||||
|
this._assetServer.RequestAsset(textureList[i], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssetBase[] CreateNewInventorySet(LLUUID agentID)
|
||||||
|
{
|
||||||
|
AssetBase[] inventorySet = new AssetBase[this.textureList.Length];
|
||||||
|
for (int i = 0; i < textureList.Length; i++)
|
||||||
|
{
|
||||||
|
if (this.Textures.ContainsKey(textureList[i]))
|
||||||
|
{
|
||||||
|
inventorySet[i] = this.CloneImage(agentID, this.Textures[textureList[i]]);
|
||||||
|
TextureImage image = new TextureImage(inventorySet[i]);
|
||||||
|
this.Textures.Add(image.FullID, image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inventorySet;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
private void ProcessTextureQueue()
|
||||||
|
{
|
||||||
|
if (this.TextureRequests.Count == 0)
|
||||||
|
{
|
||||||
|
//no requests waiting
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int num;
|
||||||
|
|
||||||
|
if (this.TextureRequests.Count < 5)
|
||||||
|
{
|
||||||
|
//lower than 5 so do all of them
|
||||||
|
num = this.TextureRequests.Count;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
num = 5;
|
||||||
|
}
|
||||||
|
AssetRequest req;
|
||||||
|
for (int i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
req = (AssetRequest)this.TextureRequests[i];
|
||||||
|
|
||||||
|
if (req.PacketCounter == 0)
|
||||||
|
{
|
||||||
|
//first time for this request so send imagedata packet
|
||||||
|
if (req.NumPackets == 1)
|
||||||
|
{
|
||||||
|
//only one packet so send whole file
|
||||||
|
ImageDataPacket im = new ImageDataPacket();
|
||||||
|
im.ImageID.Packets = 1;
|
||||||
|
im.ImageID.ID = req.ImageInfo.FullID;
|
||||||
|
im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
|
||||||
|
im.ImageData.Data = req.ImageInfo.Data;
|
||||||
|
im.ImageID.Codec = 2;
|
||||||
|
req.RequestUser.OutPacket(im);
|
||||||
|
req.PacketCounter++;
|
||||||
|
//req.ImageInfo.l= time;
|
||||||
|
//System.Console.WriteLine("sent texture: "+req.image_info.FullID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//more than one packet so split file up
|
||||||
|
ImageDataPacket im = new ImageDataPacket();
|
||||||
|
im.ImageID.Packets = (ushort)req.NumPackets;
|
||||||
|
im.ImageID.ID = req.ImageInfo.FullID;
|
||||||
|
im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
|
||||||
|
im.ImageData.Data = new byte[600];
|
||||||
|
Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600);
|
||||||
|
im.ImageID.Codec = 2;
|
||||||
|
req.RequestUser.OutPacket(im);
|
||||||
|
req.PacketCounter++;
|
||||||
|
//req.ImageInfo.last_used = time;
|
||||||
|
//System.Console.WriteLine("sent first packet of texture:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//send imagepacket
|
||||||
|
//more than one packet so split file up
|
||||||
|
ImagePacketPacket im = new ImagePacketPacket();
|
||||||
|
im.ImageID.Packet = (ushort)req.PacketCounter;
|
||||||
|
im.ImageID.ID = req.ImageInfo.FullID;
|
||||||
|
int size = req.ImageInfo.Data.Length - 600 - 1000 * (req.PacketCounter - 1);
|
||||||
|
if (size > 1000) size = 1000;
|
||||||
|
im.ImageData.Data = new byte[size];
|
||||||
|
Array.Copy(req.ImageInfo.Data, 600 + 1000 * (req.PacketCounter - 1), im.ImageData.Data, 0, size);
|
||||||
|
req.RequestUser.OutPacket(im);
|
||||||
|
req.PacketCounter++;
|
||||||
|
//req.ImageInfo.last_used = time;
|
||||||
|
//System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove requests that have been completed
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
req = (AssetRequest)this.TextureRequests[count];
|
||||||
|
if (req.PacketCounter == req.NumPackets)
|
||||||
|
{
|
||||||
|
this.TextureRequests.Remove(req);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public void AssetReceived(AssetBase asset, bool IsTexture)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server
|
||||||
|
{
|
||||||
|
//check if it is a texture or not
|
||||||
|
//then add to the correct cache list
|
||||||
|
//then check for waiting requests for this asset/texture (in the Requested lists)
|
||||||
|
//and move those requests into the Requests list.
|
||||||
|
if (IsTexture)
|
||||||
|
{
|
||||||
|
TextureImage image = new TextureImage(asset);
|
||||||
|
this.Textures.Add(image.FullID, image);
|
||||||
|
if (this.RequestedTextures.ContainsKey(image.FullID))
|
||||||
|
{
|
||||||
|
AssetRequest req = this.RequestedTextures[image.FullID];
|
||||||
|
req.ImageInfo = image;
|
||||||
|
this.RequestedTextures.Remove(image.FullID);
|
||||||
|
this.TextureRequests.Add(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AssetInfo assetInf = new AssetInfo(asset);
|
||||||
|
this.Assets.Add(assetInf.FullID, assetInf);
|
||||||
|
if (this.RequestedAssets.ContainsKey(assetInf.FullID))
|
||||||
|
{
|
||||||
|
AssetRequest req = this.RequestedAssets[assetInf.FullID];
|
||||||
|
req.AssetInf = assetInf;
|
||||||
|
this.RequestedAssets.Remove(assetInf.FullID);
|
||||||
|
this.AssetRequests.Add(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AssetNotFound(AssetBase asset)
|
||||||
|
{
|
||||||
|
//the asset server had no knowledge of requested asset
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Assets
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userInfo"></param>
|
||||||
|
/// <param name="transferRequest"></param>
|
||||||
|
public void AddAssetRequest(SimClient userInfo, TransferRequestPacket transferRequest)
|
||||||
|
{
|
||||||
|
LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0);
|
||||||
|
//check to see if asset is in local cache, if not we need to request it from asset server.
|
||||||
|
if (!this.Assets.ContainsKey(requestID))
|
||||||
|
{
|
||||||
|
//not found asset
|
||||||
|
// so request from asset server
|
||||||
|
if (!this.RequestedAssets.ContainsKey(requestID))
|
||||||
|
{
|
||||||
|
AssetRequest request = new AssetRequest();
|
||||||
|
request.RequestUser = userInfo;
|
||||||
|
request.RequestAssetID = requestID;
|
||||||
|
request.TransferRequestID = transferRequest.TransferInfo.TransferID;
|
||||||
|
this.RequestedAssets.Add(requestID, request);
|
||||||
|
this._assetServer.RequestAsset(requestID, false);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//it is in our cache
|
||||||
|
AssetInfo asset = this.Assets[requestID];
|
||||||
|
|
||||||
|
//work out how many packets it should be sent in
|
||||||
|
// and add to the AssetRequests list
|
||||||
|
AssetRequest req = new AssetRequest();
|
||||||
|
req.RequestUser = userInfo;
|
||||||
|
req.RequestAssetID = requestID;
|
||||||
|
req.TransferRequestID = transferRequest.TransferInfo.TransferID;
|
||||||
|
req.AssetInf = asset;
|
||||||
|
|
||||||
|
if (asset.Data.LongLength > 600)
|
||||||
|
{
|
||||||
|
//over 600 bytes so split up file
|
||||||
|
req.NumPackets = 1 + (int)(asset.Data.Length - 600 + 999) / 1000;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
req.NumPackets = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.AssetRequests.Add(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
private void ProcessAssetQueue()
|
||||||
|
{
|
||||||
|
if (this.AssetRequests.Count == 0)
|
||||||
|
{
|
||||||
|
//no requests waiting
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int num;
|
||||||
|
|
||||||
|
if (this.AssetRequests.Count < 5)
|
||||||
|
{
|
||||||
|
//lower than 5 so do all of them
|
||||||
|
num = this.AssetRequests.Count;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
num = 5;
|
||||||
|
}
|
||||||
|
AssetRequest req;
|
||||||
|
for (int i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
req = (AssetRequest)this.AssetRequests[i];
|
||||||
|
|
||||||
|
TransferInfoPacket Transfer = new TransferInfoPacket();
|
||||||
|
Transfer.TransferInfo.ChannelType = 2;
|
||||||
|
Transfer.TransferInfo.Status = 0;
|
||||||
|
Transfer.TransferInfo.TargetType = 0;
|
||||||
|
Transfer.TransferInfo.Params = req.RequestAssetID.GetBytes();
|
||||||
|
Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length;
|
||||||
|
Transfer.TransferInfo.TransferID = req.TransferRequestID;
|
||||||
|
req.RequestUser.OutPacket(Transfer);
|
||||||
|
|
||||||
|
if (req.NumPackets == 1)
|
||||||
|
{
|
||||||
|
TransferPacketPacket TransferPacket = new TransferPacketPacket();
|
||||||
|
TransferPacket.TransferData.Packet = 0;
|
||||||
|
TransferPacket.TransferData.ChannelType = 2;
|
||||||
|
TransferPacket.TransferData.TransferID = req.TransferRequestID;
|
||||||
|
TransferPacket.TransferData.Data = req.AssetInf.Data;
|
||||||
|
TransferPacket.TransferData.Status = 1;
|
||||||
|
req.RequestUser.OutPacket(TransferPacket);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//more than one packet so split file up , for now it can't be bigger than 2000 bytes
|
||||||
|
TransferPacketPacket TransferPacket = new TransferPacketPacket();
|
||||||
|
TransferPacket.TransferData.Packet = 0;
|
||||||
|
TransferPacket.TransferData.ChannelType = 2;
|
||||||
|
TransferPacket.TransferData.TransferID = req.TransferRequestID;
|
||||||
|
byte[] chunk = new byte[1000];
|
||||||
|
Array.Copy(req.AssetInf.Data, chunk, 1000);
|
||||||
|
TransferPacket.TransferData.Data = chunk;
|
||||||
|
TransferPacket.TransferData.Status = 0;
|
||||||
|
req.RequestUser.OutPacket(TransferPacket);
|
||||||
|
|
||||||
|
TransferPacket = new TransferPacketPacket();
|
||||||
|
TransferPacket.TransferData.Packet = 1;
|
||||||
|
TransferPacket.TransferData.ChannelType = 2;
|
||||||
|
TransferPacket.TransferData.TransferID = req.TransferRequestID;
|
||||||
|
byte[] chunk1 = new byte[(req.AssetInf.Data.Length - 1000)];
|
||||||
|
Array.Copy(req.AssetInf.Data, 1000, chunk1, 0, chunk1.Length);
|
||||||
|
TransferPacket.TransferData.Data = chunk1;
|
||||||
|
TransferPacket.TransferData.Status = 1;
|
||||||
|
req.RequestUser.OutPacket(TransferPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove requests that have been completed
|
||||||
|
for (int i = 0; i < num; i++)
|
||||||
|
{
|
||||||
|
this.AssetRequests.RemoveAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset)
|
||||||
|
{
|
||||||
|
AssetInfo newAsset = new AssetInfo();
|
||||||
|
newAsset.Data = new byte[sourceAsset.Data.Length];
|
||||||
|
Array.Copy(sourceAsset.Data, newAsset.Data, sourceAsset.Data.Length);
|
||||||
|
newAsset.FullID = LLUUID.Random();
|
||||||
|
newAsset.Type = sourceAsset.Type;
|
||||||
|
newAsset.InvType = sourceAsset.InvType;
|
||||||
|
return (newAsset);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Textures
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="userInfo"></param>
|
||||||
|
/// <param name="imageID"></param>
|
||||||
|
public void AddTextureRequest(SimClient userInfo, LLUUID imageID)
|
||||||
|
{
|
||||||
|
//check to see if texture is in local cache, if not request from asset server
|
||||||
|
if (!this.Textures.ContainsKey(imageID))
|
||||||
|
{
|
||||||
|
if (!this.RequestedTextures.ContainsKey(imageID))
|
||||||
|
{
|
||||||
|
//not is cache so request from asset server
|
||||||
|
AssetRequest request = new AssetRequest();
|
||||||
|
request.RequestUser = userInfo;
|
||||||
|
request.RequestAssetID = imageID;
|
||||||
|
request.IsTextureRequest = true;
|
||||||
|
this.RequestedTextures.Add(imageID, request);
|
||||||
|
this._assetServer.RequestAsset(imageID, true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureImage imag = this.Textures[imageID];
|
||||||
|
AssetRequest req = new AssetRequest();
|
||||||
|
req.RequestUser = userInfo;
|
||||||
|
req.RequestAssetID = imageID;
|
||||||
|
req.IsTextureRequest = true;
|
||||||
|
req.ImageInfo = imag;
|
||||||
|
|
||||||
|
if (imag.Data.LongLength > 600)
|
||||||
|
{
|
||||||
|
//over 600 bytes so split up file
|
||||||
|
req.NumPackets = 1 + (int)(imag.Data.Length - 600 + 999) / 1000;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
req.NumPackets = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.TextureRequests.Add(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextureImage CloneImage(LLUUID newOwner, TextureImage source)
|
||||||
|
{
|
||||||
|
TextureImage newImage = new TextureImage();
|
||||||
|
newImage.Data = new byte[source.Data.Length];
|
||||||
|
Array.Copy(source.Data, newImage.Data, source.Data.Length);
|
||||||
|
//newImage.filename = source.filename;
|
||||||
|
newImage.FullID = LLUUID.Random();
|
||||||
|
newImage.Name = source.Name;
|
||||||
|
return (newImage);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region viewer asset uploading
|
||||||
|
/* public AssetBase UploadPacket(AssetUploadRequestPacket pack)
|
||||||
|
{
|
||||||
|
AssetBase asset = null;
|
||||||
|
if(this.IncomingAssets.ContainsKey(pack.AssetBlock.TransactionID))
|
||||||
|
{
|
||||||
|
// not the first packet of this transaction
|
||||||
|
asset = this.IncomingAssets[pack.AssetBlock.TransactionID];
|
||||||
|
byte[] idata = new byte[asset.Data.Length + pack.AssetBlock.AssetData.Length];
|
||||||
|
Array.Copy(asset.Data, 0, idata, 0, asset.Data.Length);
|
||||||
|
Array.Copy(pack.AssetBlock.AssetData, 0, idata, asset.Data.Length, pack.AssetBlock.AssetData.Length);
|
||||||
|
asset.Data = idata;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//first packet for transaction
|
||||||
|
asset = new AssetBase();
|
||||||
|
asset.FullID = LLUUID.Random();
|
||||||
|
asset.Type = pack.AssetBlock.Type;
|
||||||
|
asset.InvType = asset.Type;
|
||||||
|
asset.Data = pack.AssetBlock.AssetData;
|
||||||
|
//this.IncomingAssets.Add(pack.AssetBlock.TransactionID,asset);
|
||||||
|
TextureImage image = new TextureImage(asset);
|
||||||
|
this.Textures.Add(image.FullID, image);
|
||||||
|
|
||||||
|
}
|
||||||
|
return asset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
public AssetBase TransactionComplete(LLUUID transactionID)
|
||||||
|
{
|
||||||
|
AssetBase asset = null;
|
||||||
|
if(this.IncomingAssets.ContainsKey(transactionID))
|
||||||
|
{
|
||||||
|
// not the first packet of this transaction
|
||||||
|
asset = this.IncomingAssets[transactionID];
|
||||||
|
if(asset.Type == 0)
|
||||||
|
{
|
||||||
|
TextureImage image = new TextureImage(asset);
|
||||||
|
this.Textures.Add(image.FullID, image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return asset;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AssetRequest
|
||||||
|
{
|
||||||
|
public SimClient RequestUser;
|
||||||
|
public LLUUID RequestAssetID;
|
||||||
|
public AssetInfo AssetInf;
|
||||||
|
public TextureImage ImageInfo;
|
||||||
|
public LLUUID TransferRequestID;
|
||||||
|
public long DataPointer = 0;
|
||||||
|
public int NumPackets = 0;
|
||||||
|
public int PacketCounter = 0;
|
||||||
|
public bool IsTextureRequest;
|
||||||
|
//public bool AssetInCache;
|
||||||
|
//public int TimeRequested;
|
||||||
|
|
||||||
|
public AssetRequest()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AssetInfo : AssetBase
|
||||||
|
{
|
||||||
|
public AssetInfo()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssetInfo(AssetBase aBase)
|
||||||
|
{
|
||||||
|
Data = aBase.Data;
|
||||||
|
FullID = aBase.FullID;
|
||||||
|
Type = aBase.Type;
|
||||||
|
InvType = aBase.InvType;
|
||||||
|
Name = aBase.Name;
|
||||||
|
Description = aBase.Description;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TextureImage : AssetBase
|
||||||
|
{
|
||||||
|
public TextureImage()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextureImage(AssetBase aBase)
|
||||||
|
{
|
||||||
|
Data = aBase.Data;
|
||||||
|
FullID = aBase.FullID;
|
||||||
|
Type = aBase.Type;
|
||||||
|
InvType = aBase.InvType;
|
||||||
|
Name = aBase.Name;
|
||||||
|
Description = aBase.Description;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,199 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
//using OpenSim.GridServers;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.Assets
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Description of InventoryManager.
|
||||||
|
/// </summary>
|
||||||
|
public class InventoryCache
|
||||||
|
{
|
||||||
|
private Dictionary<LLUUID, AgentInventory> _agentsInventory;
|
||||||
|
private List<UserServerRequest> _serverRequests; //list of requests made to user server.
|
||||||
|
private System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||||
|
private const uint FULL_MASK_PERMISSIONS = 2147483647;
|
||||||
|
|
||||||
|
public InventoryCache()
|
||||||
|
{
|
||||||
|
_agentsInventory = new Dictionary<LLUUID, AgentInventory>();
|
||||||
|
_serverRequests = new List<UserServerRequest>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddNewAgentsInventory(AgentInventory agentInventory)
|
||||||
|
{
|
||||||
|
this._agentsInventory.Add(agentInventory.AgentID, agentInventory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClientLeaving(LLUUID clientID)
|
||||||
|
{
|
||||||
|
if (this._agentsInventory.ContainsKey(clientID))
|
||||||
|
{
|
||||||
|
this._agentsInventory.Remove(clientID);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public bool CreateNewInventoryFolder(SimClient remoteClient, LLUUID folderID)
|
||||||
|
{
|
||||||
|
bool res = false;
|
||||||
|
if (folderID != LLUUID.Zero) //don't create a folder with a zero id
|
||||||
|
{
|
||||||
|
if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
|
||||||
|
{
|
||||||
|
res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LLUUID AddNewInventoryItem(SimClient remoteClient, LLUUID folderID, OpenSim.Framework.Assets.AssetBase asset)
|
||||||
|
{
|
||||||
|
LLUUID newItem = null;
|
||||||
|
if (this._agentsInventory.ContainsKey(remoteClient.AgentID))
|
||||||
|
{
|
||||||
|
newItem = this._agentsInventory[remoteClient.AgentID].AddToInventory(folderID, asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
return newItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void FetchInventoryDescendents(SimClient userInfo, FetchInventoryDescendentsPacket FetchDescend)
|
||||||
|
{
|
||||||
|
if (this._agentsInventory.ContainsKey(userInfo.AgentID))
|
||||||
|
{
|
||||||
|
AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
|
||||||
|
if (FetchDescend.InventoryData.FetchItems)
|
||||||
|
{
|
||||||
|
if (agentInventory.InventoryFolders.ContainsKey(FetchDescend.InventoryData.FolderID))
|
||||||
|
{
|
||||||
|
InventoryFolder Folder = agentInventory.InventoryFolders[FetchDescend.InventoryData.FolderID];
|
||||||
|
InventoryDescendentsPacket Descend = new InventoryDescendentsPacket();
|
||||||
|
Descend.AgentData.AgentID = userInfo.AgentID;
|
||||||
|
Descend.AgentData.OwnerID = Folder.OwnerID;
|
||||||
|
Descend.AgentData.FolderID = FetchDescend.InventoryData.FolderID;
|
||||||
|
Descend.AgentData.Descendents = Folder.Items.Count;
|
||||||
|
Descend.AgentData.Version = Folder.Items.Count;
|
||||||
|
|
||||||
|
|
||||||
|
Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count];
|
||||||
|
for (int i = 0; i < Folder.Items.Count; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
InventoryItem Item = Folder.Items[i];
|
||||||
|
Descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock();
|
||||||
|
Descend.ItemData[i].ItemID = Item.ItemID;
|
||||||
|
Descend.ItemData[i].AssetID = Item.AssetID;
|
||||||
|
Descend.ItemData[i].CreatorID = Item.CreatorID;
|
||||||
|
Descend.ItemData[i].BaseMask = FULL_MASK_PERMISSIONS;
|
||||||
|
Descend.ItemData[i].CreationDate = 1000;
|
||||||
|
Descend.ItemData[i].Description = _enc.GetBytes(Item.Description + "\0");
|
||||||
|
Descend.ItemData[i].EveryoneMask = FULL_MASK_PERMISSIONS;
|
||||||
|
Descend.ItemData[i].Flags = 1;
|
||||||
|
Descend.ItemData[i].FolderID = Item.FolderID;
|
||||||
|
Descend.ItemData[i].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
Descend.ItemData[i].GroupMask = FULL_MASK_PERMISSIONS;
|
||||||
|
Descend.ItemData[i].InvType = Item.InvType;
|
||||||
|
Descend.ItemData[i].Name = _enc.GetBytes(Item.Name + "\0");
|
||||||
|
Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS;
|
||||||
|
Descend.ItemData[i].OwnerID = Item.OwnerID;
|
||||||
|
Descend.ItemData[i].OwnerMask = FULL_MASK_PERMISSIONS;
|
||||||
|
Descend.ItemData[i].SalePrice = 100;
|
||||||
|
Descend.ItemData[i].SaleType = 0;
|
||||||
|
Descend.ItemData[i].Type = Item.Type;
|
||||||
|
Descend.ItemData[i].CRC = libsecondlife.Helpers.InventoryCRC(1000, 0, Descend.ItemData[i].InvType, Descend.ItemData[i].Type, Descend.ItemData[i].AssetID, Descend.ItemData[i].GroupID, 100, Descend.ItemData[i].OwnerID, Descend.ItemData[i].CreatorID, Descend.ItemData[i].ItemID, Descend.ItemData[i].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS);
|
||||||
|
}
|
||||||
|
userInfo.OutPacket(Descend);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("fetch subfolders");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void FetchInventory(SimClient userInfo, FetchInventoryPacket FetchItems)
|
||||||
|
{
|
||||||
|
if (this._agentsInventory.ContainsKey(userInfo.AgentID))
|
||||||
|
{
|
||||||
|
AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
|
||||||
|
|
||||||
|
for (int i = 0; i < FetchItems.InventoryData.Length; i++)
|
||||||
|
{
|
||||||
|
if (agentInventory.InventoryItems.ContainsKey(FetchItems.InventoryData[i].ItemID))
|
||||||
|
{
|
||||||
|
InventoryItem Item = agentInventory.InventoryItems[FetchItems.InventoryData[i].ItemID];
|
||||||
|
FetchInventoryReplyPacket InventoryReply = new FetchInventoryReplyPacket();
|
||||||
|
InventoryReply.AgentData.AgentID = userInfo.AgentID;
|
||||||
|
InventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
|
||||||
|
InventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
|
||||||
|
InventoryReply.InventoryData[0].ItemID = Item.ItemID;
|
||||||
|
InventoryReply.InventoryData[0].AssetID = Item.AssetID;
|
||||||
|
InventoryReply.InventoryData[0].CreatorID = Item.CreatorID;
|
||||||
|
InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS;
|
||||||
|
InventoryReply.InventoryData[0].CreationDate = 1000;
|
||||||
|
InventoryReply.InventoryData[0].Description = _enc.GetBytes(Item.Description + "\0");
|
||||||
|
InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS;
|
||||||
|
InventoryReply.InventoryData[0].Flags = 1;
|
||||||
|
InventoryReply.InventoryData[0].FolderID = Item.FolderID;
|
||||||
|
InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS;
|
||||||
|
InventoryReply.InventoryData[0].InvType = Item.InvType;
|
||||||
|
InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name + "\0");
|
||||||
|
InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS;
|
||||||
|
InventoryReply.InventoryData[0].OwnerID = Item.OwnerID;
|
||||||
|
InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS;
|
||||||
|
InventoryReply.InventoryData[0].SalePrice = 100;
|
||||||
|
InventoryReply.InventoryData[0].SaleType = 0;
|
||||||
|
InventoryReply.InventoryData[0].Type = Item.Type;
|
||||||
|
InventoryReply.InventoryData[0].CRC = libsecondlife.Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType, InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID, InventoryReply.InventoryData[0].GroupID, 100, InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID, InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS);
|
||||||
|
userInfo.OutPacket(InventoryReply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class UserServerRequest
|
||||||
|
{
|
||||||
|
public UserServerRequest()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,175 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSimCAPS project, http://osgrid.org/
|
||||||
|
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Net;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
|
||||||
|
namespace OpenSim.CAPS
|
||||||
|
{
|
||||||
|
// Dummy HTTP server, does nothing useful for now
|
||||||
|
|
||||||
|
public class SimCAPSHTTPServer
|
||||||
|
{
|
||||||
|
public Thread HTTPD;
|
||||||
|
public HttpListener Listener;
|
||||||
|
|
||||||
|
public SimCAPSHTTPServer()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Starting up HTTP Server");
|
||||||
|
HTTPD = new Thread(new ThreadStart(StartHTTP));
|
||||||
|
HTTPD.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StartHTTP()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("SimHttp.cs:StartHTTP() - Spawned main thread OK");
|
||||||
|
Listener = new HttpListener();
|
||||||
|
|
||||||
|
Listener.Prefixes.Add("http://+:" + OpenSimMain.Instance.Cfg.IPListenPort + "/");
|
||||||
|
Listener.Start();
|
||||||
|
|
||||||
|
HttpListenerContext context;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
context = Listener.GetContext();
|
||||||
|
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleRequest), context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ParseXMLRPC(string requestBody)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody);
|
||||||
|
|
||||||
|
Hashtable requestData = (Hashtable)request.Params[0];
|
||||||
|
switch (request.MethodName)
|
||||||
|
{
|
||||||
|
case "expect_user":
|
||||||
|
AgentCircuitData agent_data = new AgentCircuitData();
|
||||||
|
agent_data.SessionID = new LLUUID((string)requestData["session_id"]);
|
||||||
|
agent_data.SecureSessionID = new LLUUID((string)requestData["secure_session_id"]);
|
||||||
|
agent_data.firstname = (string)requestData["firstname"];
|
||||||
|
agent_data.lastname = (string)requestData["lastname"];
|
||||||
|
agent_data.AgentID = new LLUUID((string)requestData["agent_id"]);
|
||||||
|
agent_data.circuitcode = Convert.ToUInt32(requestData["circuit_code"]);
|
||||||
|
if (OpenSimMain.Instance.GridServers.GridServer.GetName() == "Remote")
|
||||||
|
{
|
||||||
|
((RemoteGridBase)OpenSimMain.Instance.GridServers.GridServer).agentcircuits.Add((uint)agent_data.circuitcode, agent_data);
|
||||||
|
}
|
||||||
|
return "<?xml version=\"1.0\"?><methodResponse><params /></methodResponse>";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ParseREST(string requestBody, string requestURL)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
static string ParseLLSDXML(string requestBody)
|
||||||
|
{
|
||||||
|
// dummy function for now - IMPLEMENT ME!
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
static void HandleRequest(Object stateinfo)
|
||||||
|
{
|
||||||
|
HttpListenerContext context = (HttpListenerContext)stateinfo;
|
||||||
|
|
||||||
|
HttpListenerRequest request = context.Request;
|
||||||
|
HttpListenerResponse response = context.Response;
|
||||||
|
|
||||||
|
response.KeepAlive = false;
|
||||||
|
response.SendChunked = false;
|
||||||
|
|
||||||
|
System.IO.Stream body = request.InputStream;
|
||||||
|
System.Text.Encoding encoding = System.Text.Encoding.UTF8;
|
||||||
|
System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding);
|
||||||
|
|
||||||
|
string requestBody = reader.ReadToEnd();
|
||||||
|
body.Close();
|
||||||
|
reader.Close();
|
||||||
|
|
||||||
|
string responseString = "";
|
||||||
|
switch (request.ContentType)
|
||||||
|
{
|
||||||
|
case "text/xml":
|
||||||
|
// must be XML-RPC, so pass to the XML-RPC parser
|
||||||
|
|
||||||
|
responseString = ParseXMLRPC(requestBody);
|
||||||
|
response.AddHeader("Content-type", "text/xml");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "application/xml":
|
||||||
|
// probably LLSD we hope, otherwise it should be ignored by the parser
|
||||||
|
responseString = ParseLLSDXML(requestBody);
|
||||||
|
response.AddHeader("Content-type", "application/xml");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case null:
|
||||||
|
// must be REST or invalid crap, so pass to the REST parser
|
||||||
|
responseString = ParseREST(request.Url.OriginalString, requestBody);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
|
||||||
|
System.IO.Stream output = response.OutputStream;
|
||||||
|
response.SendChunked = false;
|
||||||
|
response.ContentLength64 = buffer.Length;
|
||||||
|
output.Write(buffer, 0, buffer.Length);
|
||||||
|
output.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Reflection;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.UserServer;
|
||||||
|
|
||||||
|
namespace OpenSim
|
||||||
|
{
|
||||||
|
public class Grid
|
||||||
|
{
|
||||||
|
public IAssetServer AssetServer;
|
||||||
|
public IGridServer GridServer;
|
||||||
|
public string AssetDll = "";
|
||||||
|
public string GridDll = "";
|
||||||
|
|
||||||
|
public Grid()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadPlugins()
|
||||||
|
{
|
||||||
|
this.AssetServer = this.LoadAssetDll(this.AssetDll);
|
||||||
|
this.GridServer = this.LoadGridDll(this.GridDll);
|
||||||
|
}
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
this.AssetServer.Close();
|
||||||
|
this.GridServer.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IAssetServer LoadAssetDll(string dllName)
|
||||||
|
{
|
||||||
|
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
|
||||||
|
IAssetServer server = null;
|
||||||
|
|
||||||
|
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (pluginType.IsPublic)
|
||||||
|
{
|
||||||
|
if (!pluginType.IsAbstract)
|
||||||
|
{
|
||||||
|
Type typeInterface = pluginType.GetInterface("IAssetPlugin", true);
|
||||||
|
|
||||||
|
if (typeInterface != null)
|
||||||
|
{
|
||||||
|
IAssetPlugin plug = (IAssetPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||||
|
server = plug.GetAssetServer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
typeInterface = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pluginAssembly = null;
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IGridServer LoadGridDll(string dllName)
|
||||||
|
{
|
||||||
|
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
|
||||||
|
IGridServer server = null;
|
||||||
|
|
||||||
|
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (pluginType.IsPublic)
|
||||||
|
{
|
||||||
|
if (!pluginType.IsAbstract)
|
||||||
|
{
|
||||||
|
Type typeInterface = pluginType.GetInterface("IGridPlugin", true);
|
||||||
|
|
||||||
|
if (typeInterface != null)
|
||||||
|
{
|
||||||
|
IGridPlugin plug = (IGridPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||||
|
server = plug.GetGridServer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
typeInterface = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pluginAssembly = null;
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<RootNamespace>OpenSim</RootNamespace>
|
||||||
|
<AssemblyName>OpenSim</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}</ProjectGuid>
|
||||||
|
<StartupObject>OpenSim.OpenSimMain</StartupObject>
|
||||||
|
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
|
||||||
|
<NoStdLib>False</NoStdLib>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>bin\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>..\bin\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
|
||||||
|
<RegisterForComInterop>False</RegisterForComInterop>
|
||||||
|
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||||
|
<BaseAddress>4194304</BaseAddress>
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<FileAlignment>4096</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<OutputPath>..\bin\</OutputPath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="libsecondlife">
|
||||||
|
<HintPath>..\bin\libsecondlife.dll</HintPath>
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Axiom.MathLib">
|
||||||
|
<HintPath>..\bin\Axiom.MathLib.dll</HintPath>
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="log4net">
|
||||||
|
<HintPath>..\bin\log4net.dll</HintPath>
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Assets\InventoryCache.cs" />
|
||||||
|
<Compile Include="Grid.cs" />
|
||||||
|
<Compile Include="UserServer\LocalUserProfileManager.cs" />
|
||||||
|
<Compile Include="OpenSimMain.cs" />
|
||||||
|
<Compile Include="QueItem.cs" />
|
||||||
|
<Compile Include="SimClient.cs" />
|
||||||
|
<Compile Include="types\Mesh.cs" />
|
||||||
|
<Compile Include="types\Triangle.cs" />
|
||||||
|
<Compile Include="world\Avatar.cs" />
|
||||||
|
<Compile Include="world\Entity.cs" />
|
||||||
|
<Compile Include="world\Primitive.cs" />
|
||||||
|
<Compile Include="world\ScriptEngine.cs" />
|
||||||
|
<Compile Include="world\scripting\IScript.cs" />
|
||||||
|
<Compile Include="world\SurfacePatch.cs" />
|
||||||
|
<Compile Include="world\World.cs" />
|
||||||
|
<Compile Include="UserServer\LoginServer.cs" />
|
||||||
|
<Compile Include="Assets\AssetCache.cs" />
|
||||||
|
<Compile Include="SimConsole.cs" />
|
||||||
|
<Compile Include="VersionInfo.cs" />
|
||||||
|
<Compile Include="CAPS\SimHttp.cs">
|
||||||
|
</Compile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\OpenSim.FrameWork\OpenSim.Framework.csproj">
|
||||||
|
<Project>{2E46A825-3168-492F-93BC-637126B5B72B}</Project>
|
||||||
|
<Name>OpenSim.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\OpenSim.Physics\Manager\OpenSim.Physics.Manager.csproj">
|
||||||
|
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
|
||||||
|
<Name>OpenSim.Physics.Manager</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\OpenSim.Framework.Console\OpenSim.Framework.Console.csproj">
|
||||||
|
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||||
|
<Name>OpenSim.Framework.Console</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
|
@ -0,0 +1,295 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Timers;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
using OpenSim.world;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.UserServer;
|
||||||
|
using OpenSim.Assets;
|
||||||
|
using OpenSim.CAPS;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
|
using OpenSim.Physics.Manager;
|
||||||
|
|
||||||
|
namespace OpenSim
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Description of MainForm.
|
||||||
|
/// </summary>
|
||||||
|
public class OpenSimMain
|
||||||
|
{
|
||||||
|
private static OpenSimMain instance = null;
|
||||||
|
|
||||||
|
public static OpenSimMain Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public World LocalWorld;
|
||||||
|
public Grid GridServers;
|
||||||
|
public SimConfig Cfg;
|
||||||
|
public SimCAPSHTTPServer HttpServer;
|
||||||
|
public AssetCache AssetCache;
|
||||||
|
public InventoryCache InventoryCache;
|
||||||
|
|
||||||
|
public Socket Server;
|
||||||
|
private IPEndPoint ServerIncoming;
|
||||||
|
private byte[] RecvBuffer = new byte[4096];
|
||||||
|
private byte[] ZeroBuffer = new byte[8192];
|
||||||
|
private IPEndPoint ipeSender;
|
||||||
|
private EndPoint epSender;
|
||||||
|
private AsyncCallback ReceivedData;
|
||||||
|
|
||||||
|
public DateTime startuptime;
|
||||||
|
public Dictionary<EndPoint, SimClient> ClientThreads = new Dictionary<EndPoint, SimClient>();
|
||||||
|
private PhysicsManager physManager;
|
||||||
|
private System.Timers.Timer timer1 = new System.Timers.Timer();
|
||||||
|
private string ConfigDll = "SimConfig.dll";
|
||||||
|
private string _physicsEngine = "PhysX";
|
||||||
|
public bool sandbox = false;
|
||||||
|
public bool loginserver = false;
|
||||||
|
|
||||||
|
[STAThread]
|
||||||
|
public static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Console.WriteLine("OpenSim " + VersionInfo.Version + "\n");
|
||||||
|
Console.WriteLine("Starting...\n");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance = new SimConsole(OpenSim.Framework.Console.ConsoleBase.ConsoleType.Local, "", 0);
|
||||||
|
|
||||||
|
instance = new OpenSimMain();
|
||||||
|
|
||||||
|
Instance.sandbox = false;
|
||||||
|
Instance.loginserver = false;
|
||||||
|
Instance._physicsEngine = "PhysX";
|
||||||
|
|
||||||
|
for (int i = 0; i < args.Length; i++)
|
||||||
|
{
|
||||||
|
if (args[i] == "-sandbox")
|
||||||
|
{
|
||||||
|
Instance.sandbox = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args[i] == "-loginserver")
|
||||||
|
{
|
||||||
|
Instance.loginserver = true;
|
||||||
|
}
|
||||||
|
if (args[i] == "-realphysx")
|
||||||
|
{
|
||||||
|
Instance._physicsEngine = "RealPhysX";
|
||||||
|
OpenSim.world.Avatar.PhysicsEngineFlying = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenSimMain.Instance.GridServers = new Grid();
|
||||||
|
if (Instance.sandbox)
|
||||||
|
{
|
||||||
|
OpenSimMain.Instance.GridServers.AssetDll = "LocalGridServers.dll";
|
||||||
|
OpenSimMain.Instance.GridServers.GridDll = "LocalGridServers.dll";
|
||||||
|
OpenSimMain.Instance.GridServers.LoadPlugins();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Starting in Sandbox mode");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OpenSimMain.Instance.GridServers.AssetDll = "RemoteGridServers.dll";
|
||||||
|
OpenSimMain.Instance.GridServers.GridDll = "RemoteGridServers.dll";
|
||||||
|
OpenSimMain.Instance.GridServers.LoadPlugins();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Starting in Grid mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Instance.loginserver && Instance.sandbox)
|
||||||
|
{
|
||||||
|
LoginServer loginServer = new LoginServer(OpenSimMain.Instance.GridServers.GridServer);
|
||||||
|
loginServer.Startup();
|
||||||
|
}
|
||||||
|
Instance.AssetCache = new AssetCache(OpenSimMain.Instance.GridServers.AssetServer);
|
||||||
|
Instance.InventoryCache = new InventoryCache();
|
||||||
|
|
||||||
|
Instance.Startup();
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.MainConsolePrompt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private OpenSimMain()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Startup()
|
||||||
|
{
|
||||||
|
startuptime = DateTime.Now;
|
||||||
|
|
||||||
|
// We check our local database first, then the grid for config options
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Loading configuration");
|
||||||
|
Cfg = this.LoadConfigDll(this.ConfigDll);
|
||||||
|
Cfg.InitConfig(this.sandbox);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Contacting gridserver");
|
||||||
|
Cfg.LoadFromGrid();
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - We are " + Cfg.RegionName + " at " + Cfg.RegionLocX.ToString() + "," + Cfg.RegionLocY.ToString());
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Initialising world");
|
||||||
|
Instance.LocalWorld = new World();
|
||||||
|
Instance.LocalWorld.LandMap = Cfg.LoadWorld();
|
||||||
|
|
||||||
|
this.physManager = new OpenSim.Physics.Manager.PhysicsManager();
|
||||||
|
this.physManager.LoadPlugins();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting up messaging system");
|
||||||
|
Instance.LocalWorld.PhysScene = this.physManager.GetPhysicsScene(this._physicsEngine); //should be reading from the config file what physics engine to use
|
||||||
|
Instance.LocalWorld.PhysScene.SetTerrain(Instance.LocalWorld.LandMap);
|
||||||
|
|
||||||
|
OpenSimMain.Instance.GridServers.AssetServer.SetServerInfo(OpenSimMain.Instance.Cfg.AssetURL, OpenSimMain.Instance.Cfg.AssetSendKey);
|
||||||
|
OpenSimMain.Instance.GridServers.GridServer.SetServerInfo(OpenSimMain.Instance.Cfg.GridURL, OpenSimMain.Instance.Cfg.GridSendKey, OpenSimMain.Instance.Cfg.GridRecvKey);
|
||||||
|
|
||||||
|
Instance.LocalWorld.LoadStorageDLL("Db4LocalStorage.dll"); //all these dll names shouldn't be hard coded.
|
||||||
|
Instance.LocalWorld.LoadPrimsFromStorage();
|
||||||
|
|
||||||
|
if (this.sandbox)
|
||||||
|
{
|
||||||
|
this.AssetCache.LoadDefaultTextureSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting CAPS HTTP server");
|
||||||
|
HttpServer = new SimCAPSHTTPServer();
|
||||||
|
|
||||||
|
timer1.Enabled = true;
|
||||||
|
timer1.Interval = 100;
|
||||||
|
timer1.Elapsed += new ElapsedEventHandler(this.Timer1Tick);
|
||||||
|
|
||||||
|
MainServerListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
private SimConfig LoadConfigDll(string dllName)
|
||||||
|
{
|
||||||
|
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
|
||||||
|
SimConfig config = null;
|
||||||
|
|
||||||
|
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (pluginType.IsPublic)
|
||||||
|
{
|
||||||
|
if (!pluginType.IsAbstract)
|
||||||
|
{
|
||||||
|
Type typeInterface = pluginType.GetInterface("ISimConfig", true);
|
||||||
|
|
||||||
|
if (typeInterface != null)
|
||||||
|
{
|
||||||
|
ISimConfig plug = (ISimConfig)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||||
|
config = plug.GetConfigObject();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
typeInterface = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pluginAssembly = null;
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnReceivedData(IAsyncResult result)
|
||||||
|
{
|
||||||
|
ipeSender = new IPEndPoint(IPAddress.Any, 0);
|
||||||
|
epSender = (EndPoint)ipeSender;
|
||||||
|
Packet packet = null;
|
||||||
|
int numBytes = Server.EndReceiveFrom(result, ref epSender);
|
||||||
|
int packetEnd = numBytes - 1;
|
||||||
|
packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
|
||||||
|
|
||||||
|
// This is either a new client or a packet to send to an old one
|
||||||
|
if (ClientThreads.ContainsKey(epSender))
|
||||||
|
{
|
||||||
|
ClientThreads[epSender].InPacket(packet);
|
||||||
|
}
|
||||||
|
else if (packet.Type == PacketType.UseCircuitCode)
|
||||||
|
{ // new client
|
||||||
|
SimClient newuser = new SimClient(epSender, (UseCircuitCodePacket)packet);
|
||||||
|
ClientThreads.Add(epSender, newuser);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // invalid client
|
||||||
|
Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
|
||||||
|
}
|
||||||
|
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MainServerListener()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - New thread started");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Opening UDP socket on " + Cfg.IPListenAddr + ":" + Cfg.IPListenPort);
|
||||||
|
|
||||||
|
ServerIncoming = new IPEndPoint(IPAddress.Any, Cfg.IPListenPort);
|
||||||
|
Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
||||||
|
Server.Bind(ServerIncoming);
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - UDP socket bound, getting ready to listen");
|
||||||
|
|
||||||
|
ipeSender = new IPEndPoint(IPAddress.Any, 0);
|
||||||
|
epSender = (EndPoint)ipeSender;
|
||||||
|
ReceivedData = new AsyncCallback(this.OnReceivedData);
|
||||||
|
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Listening...");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Shutdown()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing all threads");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing listener thread");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing clients");
|
||||||
|
// IMPLEMENT THIS
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing console and terminating");
|
||||||
|
OpenSimMain.Instance.LocalWorld.Close();
|
||||||
|
OpenSimMain.Instance.GridServers.Close();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.Close();
|
||||||
|
Environment.Exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Timer1Tick(object sender, System.EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
Instance.LocalWorld.Update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
|
||||||
|
namespace OpenSim
|
||||||
|
{
|
||||||
|
public class QueItem
|
||||||
|
{
|
||||||
|
public QueItem()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Packet Packet;
|
||||||
|
public bool Incoming;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,635 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Timers;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
|
using OpenSim.world;
|
||||||
|
using OpenSim.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Handles new client connections
|
||||||
|
/// Constructor takes a single Packet and authenticates everything
|
||||||
|
/// </summary>
|
||||||
|
public class SimClient
|
||||||
|
{
|
||||||
|
|
||||||
|
public LLUUID AgentID;
|
||||||
|
public LLUUID SessionID;
|
||||||
|
public uint CircuitCode;
|
||||||
|
public world.Avatar ClientAvatar;
|
||||||
|
private UseCircuitCodePacket cirpack;
|
||||||
|
private Thread ClientThread;
|
||||||
|
public EndPoint userEP;
|
||||||
|
private BlockingQueue<QueItem> PacketQueue;
|
||||||
|
private Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>();
|
||||||
|
private Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>();
|
||||||
|
private Dictionary<LLUUID, AssetBase> UploadedAssets = new Dictionary<LLUUID, AssetBase>();
|
||||||
|
private System.Timers.Timer AckTimer;
|
||||||
|
private uint Sequence = 0;
|
||||||
|
private object SequenceLock = new object();
|
||||||
|
private const int MAX_APPENDED_ACKS = 10;
|
||||||
|
private const int RESEND_TIMEOUT = 4000;
|
||||||
|
private const int MAX_SEQUENCE = 0xFFFFFF;
|
||||||
|
private LLUUID newAssetFolder = LLUUID.Zero;
|
||||||
|
private bool debug = false;
|
||||||
|
|
||||||
|
public void ack_pack(Packet Pack)
|
||||||
|
{
|
||||||
|
//libsecondlife.Packets.PacketAckPacket ack_it = new PacketAckPacket();
|
||||||
|
//ack_it.Packets = new PacketAckPacket.PacketsBlock[1];
|
||||||
|
//ack_it.Packets[0] = new PacketAckPacket.PacketsBlock();
|
||||||
|
//ack_it.Packets[0].ID = Pack.Header.ID;
|
||||||
|
//ack_it.Header.Reliable = false;
|
||||||
|
|
||||||
|
//OutPacket(ack_it);
|
||||||
|
|
||||||
|
if (Pack.Header.Reliable)
|
||||||
|
{
|
||||||
|
lock (PendingAcks)
|
||||||
|
{
|
||||||
|
uint sequence = (uint)Pack.Header.Sequence;
|
||||||
|
if (!PendingAcks.ContainsKey(sequence)) { PendingAcks[sequence] = sequence; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ProcessInPacket(Packet Pack)
|
||||||
|
{
|
||||||
|
ack_pack(Pack);
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
if (Pack.Type != PacketType.AgentUpdate)
|
||||||
|
{
|
||||||
|
Console.WriteLine(Pack.Type.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (Pack.Type)
|
||||||
|
{
|
||||||
|
case PacketType.CompleteAgentMovement:
|
||||||
|
ClientAvatar.CompleteMovement(OpenSimMain.Instance.LocalWorld);
|
||||||
|
ClientAvatar.SendInitialPosition();
|
||||||
|
break;
|
||||||
|
case PacketType.RegionHandshakeReply:
|
||||||
|
OpenSimMain.Instance.LocalWorld.SendLayerData(this);
|
||||||
|
break;
|
||||||
|
case PacketType.AgentWearablesRequest:
|
||||||
|
ClientAvatar.SendInitialAppearance();
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
if (client.AgentID != this.AgentID)
|
||||||
|
{
|
||||||
|
ObjectUpdatePacket objupdate = client.ClientAvatar.CreateUpdatePacket();
|
||||||
|
this.OutPacket(objupdate);
|
||||||
|
client.ClientAvatar.SendAppearanceToOtherAgent(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpenSimMain.Instance.LocalWorld.GetInitialPrims(this);
|
||||||
|
break;
|
||||||
|
case PacketType.ObjectAdd:
|
||||||
|
OpenSimMain.Instance.LocalWorld.AddNewPrim((ObjectAddPacket)Pack, this);
|
||||||
|
break;
|
||||||
|
case PacketType.ObjectLink:
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(Pack.ToString());
|
||||||
|
break;
|
||||||
|
case PacketType.ObjectScale:
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(Pack.ToString());
|
||||||
|
break;
|
||||||
|
case PacketType.ObjectShape:
|
||||||
|
ObjectShapePacket shape = (ObjectShapePacket)Pack;
|
||||||
|
for (int i = 0; i < shape.ObjectData.Length; i++)
|
||||||
|
{
|
||||||
|
foreach (Entity ent in OpenSimMain.Instance.LocalWorld.Entities.Values)
|
||||||
|
{
|
||||||
|
if (ent.localid == shape.ObjectData[i].ObjectLocalID)
|
||||||
|
{
|
||||||
|
((OpenSim.world.Primitive)ent).UpdateShape(shape.ObjectData[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PacketType.MultipleObjectUpdate:
|
||||||
|
MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)Pack;
|
||||||
|
|
||||||
|
for (int i = 0; i < multipleupdate.ObjectData.Length; i++)
|
||||||
|
{
|
||||||
|
if (multipleupdate.ObjectData[i].Type == 9) //change position
|
||||||
|
{
|
||||||
|
libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[i].Data, 0);
|
||||||
|
foreach (Entity ent in OpenSimMain.Instance.LocalWorld.Entities.Values)
|
||||||
|
{
|
||||||
|
if (ent.localid == multipleupdate.ObjectData[i].ObjectLocalID)
|
||||||
|
{
|
||||||
|
((OpenSim.world.Primitive)ent).UpdatePosition(pos);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//should update stored position of the prim
|
||||||
|
}
|
||||||
|
else if (multipleupdate.ObjectData[i].Type == 10)//rotation
|
||||||
|
{
|
||||||
|
libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true);
|
||||||
|
foreach (Entity ent in OpenSimMain.Instance.LocalWorld.Entities.Values)
|
||||||
|
{
|
||||||
|
if (ent.localid == multipleupdate.ObjectData[i].ObjectLocalID)
|
||||||
|
{
|
||||||
|
ent.rotation = new Axiom.MathLib.Quaternion(rot.W, rot.X, rot.Y, rot.W);
|
||||||
|
((OpenSim.world.Primitive)ent).UpdateFlag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (multipleupdate.ObjectData[i].Type == 13)//scale
|
||||||
|
{
|
||||||
|
|
||||||
|
libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[i].Data, 12);
|
||||||
|
foreach (Entity ent in OpenSimMain.Instance.LocalWorld.Entities.Values)
|
||||||
|
{
|
||||||
|
if (ent.localid == multipleupdate.ObjectData[i].ObjectLocalID)
|
||||||
|
{
|
||||||
|
((OpenSim.world.Primitive)ent).Scale = scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PacketType.RequestImage:
|
||||||
|
RequestImagePacket imageRequest = (RequestImagePacket)Pack;
|
||||||
|
for (int i = 0; i < imageRequest.RequestImage.Length; i++)
|
||||||
|
{
|
||||||
|
OpenSimMain.Instance.AssetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PacketType.TransferRequest:
|
||||||
|
//Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request");
|
||||||
|
TransferRequestPacket transfer = (TransferRequestPacket)Pack;
|
||||||
|
OpenSimMain.Instance.AssetCache.AddAssetRequest(this, transfer);
|
||||||
|
break;
|
||||||
|
case PacketType.AgentUpdate:
|
||||||
|
ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack);
|
||||||
|
break;
|
||||||
|
case PacketType.LogoutRequest:
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got a logout request");
|
||||||
|
//send reply to let the client logout
|
||||||
|
LogoutReplyPacket logReply = new LogoutReplyPacket();
|
||||||
|
logReply.AgentData.AgentID = this.AgentID;
|
||||||
|
logReply.AgentData.SessionID = this.SessionID;
|
||||||
|
logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
|
||||||
|
logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
|
||||||
|
logReply.InventoryData[0].ItemID = LLUUID.Zero;
|
||||||
|
OutPacket(logReply);
|
||||||
|
//tell all clients to kill our object
|
||||||
|
KillObjectPacket kill = new KillObjectPacket();
|
||||||
|
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
|
||||||
|
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
|
||||||
|
kill.ObjectData[0].ID = this.ClientAvatar.localid;
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(kill);
|
||||||
|
}
|
||||||
|
OpenSimMain.Instance.GridServers.GridServer.LogoutSession(this.SessionID, this.AgentID, this.CircuitCode);
|
||||||
|
lock (OpenSimMain.Instance.LocalWorld.Entities)
|
||||||
|
{
|
||||||
|
OpenSimMain.Instance.LocalWorld.Entities.Remove(this.AgentID);
|
||||||
|
}
|
||||||
|
//need to do other cleaning up here too
|
||||||
|
OpenSimMain.Instance.ClientThreads.Remove(this.userEP);
|
||||||
|
this.ClientThread.Abort();
|
||||||
|
break;
|
||||||
|
case PacketType.ChatFromViewer:
|
||||||
|
ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
|
||||||
|
if (Helpers.FieldToString(inchatpack.ChatData.Message) == "") break;
|
||||||
|
|
||||||
|
System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||||
|
libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket();
|
||||||
|
reply.ChatData.Audible = 1;
|
||||||
|
reply.ChatData.Message = inchatpack.ChatData.Message;
|
||||||
|
reply.ChatData.ChatType = 1;
|
||||||
|
reply.ChatData.SourceType = 1;
|
||||||
|
reply.ChatData.Position = this.ClientAvatar.position;
|
||||||
|
reply.ChatData.FromName = _enc.GetBytes(this.ClientAvatar.firstname + " " + this.ClientAvatar.lastname + "\0");
|
||||||
|
reply.ChatData.OwnerID = this.AgentID;
|
||||||
|
reply.ChatData.SourceID = this.AgentID;
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(reply);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PacketType.ObjectImage:
|
||||||
|
ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
|
||||||
|
for (int i = 0; i < imagePack.ObjectData.Length; i++)
|
||||||
|
{
|
||||||
|
foreach (Entity ent in OpenSimMain.Instance.LocalWorld.Entities.Values)
|
||||||
|
{
|
||||||
|
if (ent.localid == imagePack.ObjectData[i].ObjectLocalID)
|
||||||
|
{
|
||||||
|
((OpenSim.world.Primitive)ent).UpdateTexture(imagePack.ObjectData[i].TextureEntry);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PacketType.ObjectFlagUpdate:
|
||||||
|
ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
|
||||||
|
foreach (Entity ent in OpenSimMain.Instance.LocalWorld.Entities.Values)
|
||||||
|
{
|
||||||
|
if (ent.localid == flags.AgentData.ObjectLocalID)
|
||||||
|
{
|
||||||
|
((OpenSim.world.Primitive)ent).UpdateObjectFlags(flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case PacketType.AssetUploadRequest:
|
||||||
|
//AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
|
||||||
|
//Console.WriteLine("upload request "+ request.AssetBlock.TransactionID);
|
||||||
|
//AssetBase newAsset = OpenSim_Main.sim.assetCache.UploadPacket(request);
|
||||||
|
//Console.WriteLine(request.ToString());
|
||||||
|
|
||||||
|
/*if(newAsset != null)
|
||||||
|
{
|
||||||
|
if(!this.UploadedAssets.ContainsKey(newAsset.FullID))
|
||||||
|
{
|
||||||
|
this.UploadedAssets.Add(newAsset.FullID, newAsset);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
/*AssetUploadCompletePacket response = new AssetUploadCompletePacket();
|
||||||
|
response.AssetBlock.Type =request.AssetBlock.Type;
|
||||||
|
response.AssetBlock.Success = false;
|
||||||
|
response.AssetBlock.UUID = request.AssetBlock.TransactionID;
|
||||||
|
|
||||||
|
this.OutPacket(response);*/
|
||||||
|
break;
|
||||||
|
case PacketType.AssetUploadComplete:
|
||||||
|
//AssetUploadCompletePacket complete = (AssetUploadCompletePacket)Pack;
|
||||||
|
//Console.WriteLine("upload complete "+ complete.AssetBlock.UUID);
|
||||||
|
|
||||||
|
/*AssetBase completedAsset = OpenSim_Main.sim.assetCache.TransactionComplete(complete.AssetBlock.UUID);
|
||||||
|
if(completedAsset != null)
|
||||||
|
{
|
||||||
|
if(!this.UploadedAssets.ContainsKey(completedAsset.FullID))
|
||||||
|
{
|
||||||
|
this.UploadedAssets.Remove(completedAsset.FullID);
|
||||||
|
if(this.newAssetFolder != LLUUID.Zero)
|
||||||
|
{
|
||||||
|
OpenSim_Main.sim.inventoryManager.AddNewInventoryItem(this, this.newAssetFolder, completedAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} */
|
||||||
|
break;
|
||||||
|
case PacketType.CreateInventoryFolder:
|
||||||
|
Console.WriteLine(Pack.ToString());
|
||||||
|
break;
|
||||||
|
case PacketType.CreateInventoryItem:
|
||||||
|
Console.WriteLine(Pack.ToString());
|
||||||
|
break;
|
||||||
|
case PacketType.FetchInventory:
|
||||||
|
Console.WriteLine("fetch item packet");
|
||||||
|
FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack;
|
||||||
|
OpenSimMain.Instance.InventoryCache.FetchInventory(this, FetchInventory);
|
||||||
|
break;
|
||||||
|
case PacketType.FetchInventoryDescendents:
|
||||||
|
FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
|
||||||
|
OpenSimMain.Instance.InventoryCache.FetchInventoryDescendents(this, Fetch);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResendUnacked()
|
||||||
|
{
|
||||||
|
int now = Environment.TickCount;
|
||||||
|
|
||||||
|
lock (NeedAck)
|
||||||
|
{
|
||||||
|
foreach (Packet packet in NeedAck.Values)
|
||||||
|
{
|
||||||
|
if ((now - packet.TickCount > RESEND_TIMEOUT) && (!packet.Header.Resent))
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Resending " + packet.Type.ToString() + " packet, " +
|
||||||
|
(now - packet.TickCount) + "ms have passed");
|
||||||
|
|
||||||
|
packet.Header.Resent = true;
|
||||||
|
OutPacket(packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SendAcks()
|
||||||
|
{
|
||||||
|
lock (PendingAcks)
|
||||||
|
{
|
||||||
|
if (PendingAcks.Count > 0)
|
||||||
|
{
|
||||||
|
if (PendingAcks.Count > 250)
|
||||||
|
{
|
||||||
|
// FIXME: Handle the odd case where we have too many pending ACKs queued up
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Too many ACKs queued up!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Sending PacketAck");
|
||||||
|
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
PacketAckPacket acks = new PacketAckPacket();
|
||||||
|
acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count];
|
||||||
|
|
||||||
|
foreach (uint ack in PendingAcks.Values)
|
||||||
|
{
|
||||||
|
acks.Packets[i] = new PacketAckPacket.PacketsBlock();
|
||||||
|
acks.Packets[i].ID = ack;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
acks.Header.Reliable = false;
|
||||||
|
OutPacket(acks);
|
||||||
|
|
||||||
|
PendingAcks.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AckTimer_Elapsed(object sender, ElapsedEventArgs ea)
|
||||||
|
{
|
||||||
|
SendAcks();
|
||||||
|
ResendUnacked();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ProcessOutPacket(Packet Pack)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Keep track of when this packet was sent out
|
||||||
|
Pack.TickCount = Environment.TickCount;
|
||||||
|
|
||||||
|
if (!Pack.Header.Resent)
|
||||||
|
{
|
||||||
|
// Set the sequence number
|
||||||
|
lock (SequenceLock)
|
||||||
|
{
|
||||||
|
if (Sequence >= MAX_SEQUENCE)
|
||||||
|
Sequence = 1;
|
||||||
|
else
|
||||||
|
Sequence++;
|
||||||
|
Pack.Header.Sequence = Sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Pack.Header.Reliable) //DIRTY HACK
|
||||||
|
{
|
||||||
|
lock (NeedAck)
|
||||||
|
{
|
||||||
|
if (!NeedAck.ContainsKey(Pack.Header.Sequence))
|
||||||
|
{
|
||||||
|
NeedAck.Add(Pack.Header.Sequence, Pack);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Client.Log("Attempted to add a duplicate sequence number (" +
|
||||||
|
// packet.Header.Sequence + ") to the NeedAck dictionary for packet type " +
|
||||||
|
// packet.Type.ToString(), Helpers.LogLevel.Warning);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't append ACKs to resent packets, in case that's what was causing the
|
||||||
|
// delivery to fail
|
||||||
|
if (!Pack.Header.Resent)
|
||||||
|
{
|
||||||
|
// Append any ACKs that need to be sent out to this packet
|
||||||
|
lock (PendingAcks)
|
||||||
|
{
|
||||||
|
if (PendingAcks.Count > 0 && PendingAcks.Count < MAX_APPENDED_ACKS &&
|
||||||
|
Pack.Type != PacketType.PacketAck &&
|
||||||
|
Pack.Type != PacketType.LogoutRequest)
|
||||||
|
{
|
||||||
|
Pack.Header.AckList = new uint[PendingAcks.Count];
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
foreach (uint ack in PendingAcks.Values)
|
||||||
|
{
|
||||||
|
Pack.Header.AckList[i] = ack;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
PendingAcks.Clear();
|
||||||
|
Pack.Header.AppendedAcks = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//ServerConsole.MainConsole.Instance.WriteLine("OUT: \n" + Pack.ToString());
|
||||||
|
|
||||||
|
byte[] ZeroOutBuffer = new byte[4096];
|
||||||
|
byte[] sendbuffer;
|
||||||
|
sendbuffer = Pack.ToBytes();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (Pack.Header.Zerocoded)
|
||||||
|
{
|
||||||
|
int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
|
||||||
|
OpenSimMain.Instance.Server.SendTo(ZeroOutBuffer, packetsize, SocketFlags.None, userEP);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OpenSimMain.Instance.Server.SendTo(sendbuffer, sendbuffer.Length, SocketFlags.None, userEP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " + userEP.ToString() + " - killing thread");
|
||||||
|
ClientThread.Abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void InPacket(Packet NewPack)
|
||||||
|
{
|
||||||
|
// Handle appended ACKs
|
||||||
|
if (NewPack.Header.AppendedAcks)
|
||||||
|
{
|
||||||
|
lock (NeedAck)
|
||||||
|
{
|
||||||
|
foreach (uint ack in NewPack.Header.AckList)
|
||||||
|
{
|
||||||
|
NeedAck.Remove(ack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle PacketAck packets
|
||||||
|
if (NewPack.Type == PacketType.PacketAck)
|
||||||
|
{
|
||||||
|
PacketAckPacket ackPacket = (PacketAckPacket)NewPack;
|
||||||
|
|
||||||
|
lock (NeedAck)
|
||||||
|
{
|
||||||
|
foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets)
|
||||||
|
{
|
||||||
|
NeedAck.Remove(block.ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((NewPack.Type == PacketType.StartPingCheck))
|
||||||
|
{
|
||||||
|
//reply to pingcheck
|
||||||
|
libsecondlife.Packets.StartPingCheckPacket startPing = (libsecondlife.Packets.StartPingCheckPacket)NewPack;
|
||||||
|
libsecondlife.Packets.CompletePingCheckPacket endPing = new CompletePingCheckPacket();
|
||||||
|
endPing.PingID.PingID = startPing.PingID.PingID;
|
||||||
|
OutPacket(endPing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QueItem item = new QueItem();
|
||||||
|
item.Packet = NewPack;
|
||||||
|
item.Incoming = true;
|
||||||
|
this.PacketQueue.Enqueue(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OutPacket(Packet NewPack)
|
||||||
|
{
|
||||||
|
QueItem item = new QueItem();
|
||||||
|
item.Packet = NewPack;
|
||||||
|
item.Incoming = false;
|
||||||
|
this.PacketQueue.Enqueue(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
public SimClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs - Started up new client thread to handle incoming request");
|
||||||
|
cirpack = initialcirpack;
|
||||||
|
userEP = remoteEP;
|
||||||
|
PacketQueue = new BlockingQueue<QueItem>();
|
||||||
|
AckTimer = new System.Timers.Timer(500);
|
||||||
|
AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed);
|
||||||
|
AckTimer.Start();
|
||||||
|
|
||||||
|
ClientThread = new Thread(new ThreadStart(AuthUser));
|
||||||
|
ClientThread.IsBackground = true;
|
||||||
|
ClientThread.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ClientLoop()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs:ClientLoop() - Entered loop");
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
QueItem nextPacket = PacketQueue.Dequeue();
|
||||||
|
if (nextPacket.Incoming)
|
||||||
|
{
|
||||||
|
//is a incoming packet
|
||||||
|
ProcessInPacket(nextPacket.Packet);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//is a out going packet
|
||||||
|
ProcessOutPacket(nextPacket.Packet);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitNewClient()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs:InitNewClient() - Adding viewer agent to world");
|
||||||
|
OpenSimMain.Instance.LocalWorld.AddViewerAgent(this);
|
||||||
|
world.Entity tempent = OpenSimMain.Instance.LocalWorld.Entities[this.AgentID];
|
||||||
|
this.ClientAvatar = (world.Avatar)tempent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AuthUser()
|
||||||
|
{
|
||||||
|
AuthenticateResponse sessionInfo = OpenSimMain.Instance.GridServers.GridServer.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code);
|
||||||
|
if (!sessionInfo.Authorised)
|
||||||
|
{
|
||||||
|
//session/circuit not authorised
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs:AuthUser() - New user request denied to " + userEP.ToString());
|
||||||
|
ClientThread.Abort();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("OpenSimClient.cs:AuthUser() - Got authenticated connection from " + userEP.ToString());
|
||||||
|
//session is authorised
|
||||||
|
this.AgentID = cirpack.CircuitCode.ID;
|
||||||
|
this.SessionID = cirpack.CircuitCode.SessionID;
|
||||||
|
this.CircuitCode = cirpack.CircuitCode.Code;
|
||||||
|
InitNewClient();
|
||||||
|
this.ClientAvatar.firstname = sessionInfo.LoginInfo.First;
|
||||||
|
this.ClientAvatar.lastname = sessionInfo.LoginInfo.Last;
|
||||||
|
|
||||||
|
// Create Inventory, currently only works for sandbox mode
|
||||||
|
if (OpenSimMain.Instance.sandbox)
|
||||||
|
{
|
||||||
|
if (sessionInfo.LoginInfo.InventoryFolder != null)
|
||||||
|
{
|
||||||
|
this.CreateInventory(sessionInfo.LoginInfo.InventoryFolder);
|
||||||
|
if (sessionInfo.LoginInfo.BaseFolder != null)
|
||||||
|
{
|
||||||
|
OpenSimMain.Instance.InventoryCache.CreateNewInventoryFolder(this, sessionInfo.LoginInfo.BaseFolder);
|
||||||
|
this.newAssetFolder = sessionInfo.LoginInfo.BaseFolder;
|
||||||
|
AssetBase[] inventorySet = OpenSimMain.Instance.AssetCache.CreateNewInventorySet(this.AgentID);
|
||||||
|
if (inventorySet != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < inventorySet.Length; i++)
|
||||||
|
{
|
||||||
|
if (inventorySet[i] != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine(Helpers.FieldToString(inventorySet[i].Data));
|
||||||
|
OpenSimMain.Instance.InventoryCache.AddNewInventoryItem(this, sessionInfo.LoginInfo.BaseFolder, inventorySet[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientLoop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateInventory(LLUUID baseFolder)
|
||||||
|
{
|
||||||
|
AgentInventory inventory = new AgentInventory();
|
||||||
|
inventory.AgentID = this.AgentID;
|
||||||
|
OpenSimMain.Instance.InventoryCache.AddNewAgentsInventory(inventory);
|
||||||
|
OpenSimMain.Instance.InventoryCache.CreateNewInventoryFolder(this, baseFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,211 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
|
|
||||||
|
namespace OpenSim
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Description of ServerConsole.
|
||||||
|
/// </summary>
|
||||||
|
public class SimConsole : ConsoleBase
|
||||||
|
{
|
||||||
|
|
||||||
|
private ConsoleType ConsType;
|
||||||
|
StreamWriter Log;
|
||||||
|
|
||||||
|
|
||||||
|
// STUPID HACK ALERT!!!! STUPID HACK ALERT!!!!!
|
||||||
|
// constype - the type of console to use (see enum ConsoleType)
|
||||||
|
// sparam - depending on the console type:
|
||||||
|
// TCP - the IP to bind to (127.0.0.1 if blank)
|
||||||
|
// Local - param ignored
|
||||||
|
// SimChat - the AgentID of this sim's admin
|
||||||
|
// and for the iparam:
|
||||||
|
// TCP - the port to bind to
|
||||||
|
// Local - param ignored
|
||||||
|
// SimChat - the chat channel to accept commands from
|
||||||
|
public SimConsole(ConsoleType constype, string sparam, int iparam) {
|
||||||
|
ConsType = constype;
|
||||||
|
switch(constype) {
|
||||||
|
case ConsoleType.Local:
|
||||||
|
|
||||||
|
Console.WriteLine("ServerConsole.cs - creating new local console");
|
||||||
|
Console.WriteLine("Logs will be saved to current directory in opensim-console.log");
|
||||||
|
Log=File.AppendText("opensim-console.log");
|
||||||
|
Log.WriteLine("========================================================================");
|
||||||
|
//Log.WriteLine("OpenSim " + VersionInfo.Version + " Started at " + DateTime.Now.ToString());
|
||||||
|
break;
|
||||||
|
case ConsoleType.TCP:
|
||||||
|
break;
|
||||||
|
case ConsoleType.SimChat:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Console.WriteLine("ServerConsole.cs - what are you smoking? that isn't a valid console type!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Close() {
|
||||||
|
Log.WriteLine("OpenSim shutdown at " + DateTime.Now.ToString());
|
||||||
|
Log.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(string format, params object[] args)
|
||||||
|
{
|
||||||
|
Log.Write(format, args);
|
||||||
|
Console.Write(format, args);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteLine(string format, params object[] args)
|
||||||
|
{
|
||||||
|
Log.WriteLine(format, args);
|
||||||
|
Console.WriteLine(format, args);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ReadLine()
|
||||||
|
{
|
||||||
|
string TempStr=Console.ReadLine();
|
||||||
|
Log.WriteLine(TempStr);
|
||||||
|
return TempStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int Read() {
|
||||||
|
int TempInt= Console.Read();
|
||||||
|
Log.Write((char)TempInt);
|
||||||
|
return TempInt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displays a command prompt and waits for the user to enter a string, then returns that string
|
||||||
|
public override string CmdPrompt(string prompt) {
|
||||||
|
this.Write(prompt);
|
||||||
|
return this.ReadLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value if the user simply presses enter
|
||||||
|
public override string CmdPrompt(string prompt, string defaultresponse) {
|
||||||
|
string temp=CmdPrompt(prompt);
|
||||||
|
if(temp=="") {
|
||||||
|
return defaultresponse;
|
||||||
|
} else {
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displays a command prompt and returns a default value, user may only enter 1 of 2 options
|
||||||
|
public override string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB) {
|
||||||
|
bool itisdone=false;
|
||||||
|
string temp=CmdPrompt(prompt,defaultresponse);
|
||||||
|
while(itisdone==false) {
|
||||||
|
if((temp==OptionA) || (temp==OptionB)) {
|
||||||
|
itisdone=true;
|
||||||
|
} else {
|
||||||
|
this.WriteLine("Valid options are " + OptionA + " or " + OptionB);
|
||||||
|
temp=CmdPrompt(prompt,defaultresponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Runs a command with a number of parameters
|
||||||
|
public override Object RunCmd(string Cmd, string[] cmdparams) {
|
||||||
|
switch(Cmd) {
|
||||||
|
case "help":
|
||||||
|
this.WriteLine("show users - show info about connected users");
|
||||||
|
this.WriteLine("shutdown - disconnect all clients and shutdown");
|
||||||
|
this.WriteLine("regenerate - regenerate the sim's terrain");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "show":
|
||||||
|
ShowCommands(cmdparams[0]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "regenerate":
|
||||||
|
OpenSimMain.Instance.LocalWorld.RegenerateTerrain();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "shutdown":
|
||||||
|
OpenSimMain.Shutdown();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shows data about something
|
||||||
|
public override void ShowCommands(string ShowWhat) {
|
||||||
|
switch(ShowWhat) {
|
||||||
|
case "uptime":
|
||||||
|
this.WriteLine("OpenSim has been running since " + OpenSimMain.Instance.startuptime.ToString());
|
||||||
|
this.WriteLine("That is " + (DateTime.Now-OpenSimMain.Instance.startuptime).ToString());
|
||||||
|
break;
|
||||||
|
case "users":
|
||||||
|
OpenSim.world.Avatar TempAv;
|
||||||
|
this.WriteLine(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16}{5,-16}","Firstname", "Lastname","Agent ID", "Session ID", "Circuit", "IP"));
|
||||||
|
foreach (libsecondlife.LLUUID UUID in OpenSimMain.Instance.LocalWorld.Entities.Keys) {
|
||||||
|
if(OpenSimMain.Instance.LocalWorld.Entities[UUID].ToString()== "OpenSim.world.Avatar")
|
||||||
|
{
|
||||||
|
TempAv=(OpenSim.world.Avatar)OpenSimMain.Instance.LocalWorld.Entities[UUID];
|
||||||
|
this.WriteLine(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}",TempAv.firstname, TempAv.lastname,UUID, TempAv.ControllingClient.SessionID, TempAv.ControllingClient.CircuitCode, TempAv.ControllingClient.userEP.ToString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displays a prompt to the user and then runs the command they entered
|
||||||
|
public override void MainConsolePrompt() {
|
||||||
|
string[] tempstrarray;
|
||||||
|
string tempstr = this.CmdPrompt("OpenSim-" + OpenSimMain.Instance.Cfg.RegionHandle.ToString() + " # ");
|
||||||
|
tempstrarray = tempstr.Split(' ');
|
||||||
|
string cmd=tempstrarray[0];
|
||||||
|
Array.Reverse(tempstrarray);
|
||||||
|
Array.Resize<string>(ref tempstrarray,tempstrarray.Length-1);
|
||||||
|
Array.Reverse(tempstrarray);
|
||||||
|
string[] cmdparams=(string[])tempstrarray;
|
||||||
|
RunCmd(cmd,cmdparams);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override void SetStatus(string status)
|
||||||
|
{
|
||||||
|
Console.Write( status + "\r" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Text;
|
||||||
|
using OpenSim.Framework.User;
|
||||||
|
using OpenSim.Framework.Grid;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.UserServer
|
||||||
|
{
|
||||||
|
class LocalUserProfileManager : UserProfileManager
|
||||||
|
{
|
||||||
|
private IGridServer _gridServer;
|
||||||
|
|
||||||
|
public LocalUserProfileManager(IGridServer gridServer)
|
||||||
|
{
|
||||||
|
_gridServer = gridServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void InitUserProfiles()
|
||||||
|
{
|
||||||
|
// TODO: need to load from database
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void CustomiseResponse(ref System.Collections.Hashtable response, UserProfile theUser)
|
||||||
|
{
|
||||||
|
uint circode = (uint)response["circuit_code"];
|
||||||
|
theUser.AddSimCircuit(circode, LLUUID.Random());
|
||||||
|
response["home"] = "{'region_handle':[r" + (997 * 256).ToString() + ",r" + (996 * 256).ToString() + "], 'position':[r" + theUser.homepos.X.ToString() + ",r" + theUser.homepos.Y.ToString() + ",r" + theUser.homepos.Z.ToString() + "], 'look_at':[r" + theUser.homelookat.X.ToString() + ",r" + theUser.homelookat.Y.ToString() + ",r" + theUser.homelookat.Z.ToString() + "]}";
|
||||||
|
response["sim_port"] = OpenSimMain.Instance.Cfg.IPListenPort;
|
||||||
|
response["sim_ip"] = OpenSimMain.Instance.Cfg.IPListenAddr;
|
||||||
|
response["region_y"] = (Int32)996 * 256;
|
||||||
|
response["region_x"] = (Int32)997* 256;
|
||||||
|
|
||||||
|
string first;
|
||||||
|
string last;
|
||||||
|
if (response.Contains("first"))
|
||||||
|
{
|
||||||
|
first = (string)response["first"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
first = "test";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.Contains("last"))
|
||||||
|
{
|
||||||
|
last = (string)response["last"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last = "User";
|
||||||
|
}
|
||||||
|
|
||||||
|
ArrayList InventoryList = (ArrayList)response["inventory-skeleton"];
|
||||||
|
Hashtable Inventory1 = (Hashtable)InventoryList[0];
|
||||||
|
|
||||||
|
Login _login = new Login();
|
||||||
|
//copy data to login object
|
||||||
|
_login.First = first;
|
||||||
|
_login.Last = last;
|
||||||
|
_login.Agent = new LLUUID((string)response["agent_id"]) ;
|
||||||
|
_login.Session = new LLUUID((string)response["session_id"]);
|
||||||
|
_login.BaseFolder = null;
|
||||||
|
_login.InventoryFolder = new LLUUID((string)Inventory1["folder_id"]);
|
||||||
|
|
||||||
|
//working on local computer if so lets add to the gridserver's list of sessions?
|
||||||
|
if (OpenSimMain.Instance.GridServers.GridServer.GetName() == "Local")
|
||||||
|
{
|
||||||
|
((LocalGridBase)this._gridServer).AddNewSession(_login);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,410 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
using Nwc.XmlRpc;
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
using System.Xml;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Grid;
|
||||||
|
using OpenSim.Framework.Inventory;
|
||||||
|
using OpenSim.Framework.User;
|
||||||
|
using OpenSim.Framework.Utilities;
|
||||||
|
|
||||||
|
namespace OpenSim.UserServer
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// When running in local (default) mode , handles client logins.
|
||||||
|
/// </summary>
|
||||||
|
public class LoginServer : LoginService , IUserServer
|
||||||
|
{
|
||||||
|
private IGridServer _gridServer;
|
||||||
|
private ushort _loginPort = 8080;
|
||||||
|
public IPAddress clientAddress = IPAddress.Loopback;
|
||||||
|
public IPAddress remoteAddress = IPAddress.Any;
|
||||||
|
private Socket loginServer;
|
||||||
|
private int NumClients;
|
||||||
|
private string _defaultResponse;
|
||||||
|
private bool userAccounts = false;
|
||||||
|
private string _mpasswd;
|
||||||
|
private bool _needPasswd = false;
|
||||||
|
private LocalUserProfileManager userManager;
|
||||||
|
|
||||||
|
public LoginServer(IGridServer gridServer)
|
||||||
|
{
|
||||||
|
_gridServer = gridServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitializeLogin: initialize the login
|
||||||
|
private void InitializeLogin()
|
||||||
|
{
|
||||||
|
this._needPasswd = false;
|
||||||
|
//read in default response string
|
||||||
|
StreamReader SR;
|
||||||
|
string lines;
|
||||||
|
SR = File.OpenText("new-login.dat");
|
||||||
|
|
||||||
|
//lines=SR.ReadLine();
|
||||||
|
|
||||||
|
while (!SR.EndOfStream)
|
||||||
|
{
|
||||||
|
lines = SR.ReadLine();
|
||||||
|
_defaultResponse += lines;
|
||||||
|
//lines = SR.ReadLine();
|
||||||
|
}
|
||||||
|
SR.Close();
|
||||||
|
this._mpasswd = EncodePassword("testpass");
|
||||||
|
|
||||||
|
userManager = new LocalUserProfileManager(this._gridServer);
|
||||||
|
userManager.InitUserProfiles();
|
||||||
|
userManager.SetKeys("", "", "", "Welcome to OpenSim");
|
||||||
|
|
||||||
|
loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort));
|
||||||
|
loginServer.Listen(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Startup()
|
||||||
|
{
|
||||||
|
this.InitializeLogin();
|
||||||
|
Thread runLoginProxy = new Thread(new ThreadStart(RunLogin));
|
||||||
|
runLoginProxy.IsBackground = true;
|
||||||
|
runLoginProxy.Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunLogin()
|
||||||
|
{
|
||||||
|
Console.WriteLine("Starting Login Server");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for (; ; )
|
||||||
|
{
|
||||||
|
Socket client = loginServer.Accept();
|
||||||
|
IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint;
|
||||||
|
|
||||||
|
|
||||||
|
NetworkStream networkStream = new NetworkStream(client);
|
||||||
|
StreamReader networkReader = new StreamReader(networkStream);
|
||||||
|
StreamWriter networkWriter = new StreamWriter(networkStream);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LoginRequest(networkReader, networkWriter);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
networkWriter.Close();
|
||||||
|
networkReader.Close();
|
||||||
|
networkStream.Close();
|
||||||
|
|
||||||
|
client.Close();
|
||||||
|
|
||||||
|
// send any packets queued for injection
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Console.WriteLine(e.Message);
|
||||||
|
Console.WriteLine(e.StackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProxyLogin: proxy a login request
|
||||||
|
private void LoginRequest(StreamReader reader, StreamWriter writer)
|
||||||
|
{
|
||||||
|
lock (this)
|
||||||
|
{
|
||||||
|
string line;
|
||||||
|
int contentLength = 0;
|
||||||
|
// read HTTP header
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// read one line of the header
|
||||||
|
line = reader.ReadLine();
|
||||||
|
|
||||||
|
// check for premature EOF
|
||||||
|
if (line == null)
|
||||||
|
throw new Exception("EOF in client HTTP header");
|
||||||
|
|
||||||
|
// look for Content-Length
|
||||||
|
Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line);
|
||||||
|
if (match.Success)
|
||||||
|
contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString());
|
||||||
|
} while (line != "");
|
||||||
|
|
||||||
|
// read the HTTP body into a buffer
|
||||||
|
char[] content = new char[contentLength];
|
||||||
|
reader.Read(content, 0, contentLength);
|
||||||
|
|
||||||
|
if (this.userAccounts)
|
||||||
|
{
|
||||||
|
//ask the UserProfile Manager to process the request
|
||||||
|
string reply = this.userManager.ParseXMLRPC(new String(content));
|
||||||
|
// forward the XML-RPC response to the client
|
||||||
|
writer.WriteLine("HTTP/1.0 200 OK");
|
||||||
|
writer.WriteLine("Content-type: text/xml");
|
||||||
|
writer.WriteLine();
|
||||||
|
writer.WriteLine(reply);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//handle ourselves
|
||||||
|
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content));
|
||||||
|
if (request.MethodName == "login_to_simulator")
|
||||||
|
{
|
||||||
|
this.ProcessXmlRequest(request, writer);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XmlRpcResponse PresenceErrorResp = new XmlRpcResponse();
|
||||||
|
Hashtable PresenceErrorRespData = new Hashtable();
|
||||||
|
PresenceErrorRespData["reason"] = "XmlRequest"; ;
|
||||||
|
PresenceErrorRespData["message"] = "Unknown Rpc request";
|
||||||
|
PresenceErrorRespData["login"] = "false";
|
||||||
|
PresenceErrorResp.Value = PresenceErrorRespData;
|
||||||
|
string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", "");
|
||||||
|
writer.WriteLine("HTTP/1.0 200 OK");
|
||||||
|
writer.WriteLine("Content-type: text/xml");
|
||||||
|
writer.WriteLine();
|
||||||
|
writer.WriteLine(reply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ProcessXmlRequest(XmlRpcRequest request, StreamWriter writer)
|
||||||
|
{
|
||||||
|
Hashtable requestData = (Hashtable)request.Params[0];
|
||||||
|
string first;
|
||||||
|
string last;
|
||||||
|
string passwd;
|
||||||
|
LLUUID Agent;
|
||||||
|
LLUUID Session;
|
||||||
|
|
||||||
|
//get login name
|
||||||
|
if (requestData.Contains("first"))
|
||||||
|
{
|
||||||
|
first = (string)requestData["first"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
first = "test";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestData.Contains("last"))
|
||||||
|
{
|
||||||
|
last = (string)requestData["last"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last = "User" + NumClients.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestData.Contains("passwd"))
|
||||||
|
{
|
||||||
|
passwd = (string)requestData["passwd"];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
passwd = "notfound";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Authenticate(first, last, passwd))
|
||||||
|
{
|
||||||
|
XmlRpcResponse PresenceErrorResp = new XmlRpcResponse();
|
||||||
|
Hashtable PresenceErrorRespData = new Hashtable();
|
||||||
|
PresenceErrorRespData["reason"] = "key"; ;
|
||||||
|
PresenceErrorRespData["message"] = "You have entered an invalid name/password combination. Check Caps/lock.";
|
||||||
|
PresenceErrorRespData["login"] = "false";
|
||||||
|
PresenceErrorResp.Value = PresenceErrorRespData;
|
||||||
|
string reply = Regex.Replace(XmlRpcResponseSerializer.Singleton.Serialize(PresenceErrorResp), " encoding=\"utf-16\"", "");
|
||||||
|
writer.WriteLine("HTTP/1.0 200 OK");
|
||||||
|
writer.WriteLine("Content-type: text/xml");
|
||||||
|
writer.WriteLine();
|
||||||
|
writer.WriteLine(reply);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
NumClients++;
|
||||||
|
|
||||||
|
//create a agent and session LLUUID
|
||||||
|
Agent = GetAgentId(first, last);
|
||||||
|
int SessionRand = Util.RandomClass.Next(1, 999);
|
||||||
|
Session = new LLUUID("aaaabbbb-0200-" + SessionRand.ToString("0000") + "-8664-58f53e442797");
|
||||||
|
|
||||||
|
//create some login info
|
||||||
|
Hashtable LoginFlagsHash = new Hashtable();
|
||||||
|
LoginFlagsHash["daylight_savings"] = "N";
|
||||||
|
LoginFlagsHash["stipend_since_login"] = "N";
|
||||||
|
LoginFlagsHash["gendered"] = "Y";
|
||||||
|
LoginFlagsHash["ever_logged_in"] = "Y";
|
||||||
|
ArrayList LoginFlags = new ArrayList();
|
||||||
|
LoginFlags.Add(LoginFlagsHash);
|
||||||
|
|
||||||
|
Hashtable GlobalT = new Hashtable();
|
||||||
|
GlobalT["sun_texture_id"] = "cce0f112-878f-4586-a2e2-a8f104bba271";
|
||||||
|
GlobalT["cloud_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
|
||||||
|
GlobalT["moon_texture_id"] = "fc4b9f0b-d008-45c6-96a4-01dd947ac621";
|
||||||
|
ArrayList GlobalTextures = new ArrayList();
|
||||||
|
GlobalTextures.Add(GlobalT);
|
||||||
|
|
||||||
|
XmlRpcResponse response = (XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
|
||||||
|
Hashtable responseData = (Hashtable)response.Value;
|
||||||
|
|
||||||
|
responseData["sim_port"] = OpenSimMain.Instance.Cfg.IPListenPort;
|
||||||
|
responseData["sim_ip"] = OpenSimMain.Instance.Cfg.IPListenAddr;
|
||||||
|
responseData["agent_id"] = Agent.ToStringHyphenated();
|
||||||
|
responseData["session_id"] = Session.ToStringHyphenated();
|
||||||
|
responseData["seconds_since_epoch"] = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||||
|
responseData["login-flags"] = LoginFlags;
|
||||||
|
responseData["global-textures"] = GlobalTextures;
|
||||||
|
|
||||||
|
//inventory
|
||||||
|
ArrayList InventoryList = (ArrayList)responseData["inventory-skeleton"];
|
||||||
|
Hashtable Inventory1 = (Hashtable)InventoryList[0];
|
||||||
|
Hashtable Inventory2 = (Hashtable)InventoryList[1];
|
||||||
|
LLUUID BaseFolderID = LLUUID.Random();
|
||||||
|
LLUUID InventoryFolderID = LLUUID.Random();
|
||||||
|
Inventory2["name"] = "Base";
|
||||||
|
Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated();
|
||||||
|
Inventory2["type_default"] = 6;
|
||||||
|
Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||||
|
|
||||||
|
ArrayList InventoryRoot = (ArrayList)responseData["inventory-root"];
|
||||||
|
Hashtable Inventoryroot = (Hashtable)InventoryRoot[0];
|
||||||
|
Inventoryroot["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||||
|
|
||||||
|
CustomiseLoginResponse(responseData, first, last);
|
||||||
|
|
||||||
|
Login _login = new Login();
|
||||||
|
//copy data to login object
|
||||||
|
_login.First = first;
|
||||||
|
_login.Last = last;
|
||||||
|
_login.Agent = Agent;
|
||||||
|
_login.Session = Session;
|
||||||
|
_login.BaseFolder = BaseFolderID;
|
||||||
|
_login.InventoryFolder = InventoryFolderID;
|
||||||
|
|
||||||
|
//working on local computer if so lets add to the gridserver's list of sessions?
|
||||||
|
if (OpenSimMain.Instance.GridServers.GridServer.GetName() == "Local")
|
||||||
|
{
|
||||||
|
((LocalGridBase)this._gridServer).AddNewSession(_login);
|
||||||
|
}
|
||||||
|
|
||||||
|
// forward the XML-RPC response to the client
|
||||||
|
writer.WriteLine("HTTP/1.0 200 OK");
|
||||||
|
writer.WriteLine("Content-type: text/xml");
|
||||||
|
writer.WriteLine();
|
||||||
|
|
||||||
|
XmlTextWriter responseWriter = new XmlTextWriter(writer);
|
||||||
|
XmlRpcResponseSerializer.Singleton.Serialize(responseWriter, response);
|
||||||
|
responseWriter.Close();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual void CustomiseLoginResponse(Hashtable responseData, string first, string last)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual LLUUID GetAgentId(string firstName, string lastName)
|
||||||
|
{
|
||||||
|
LLUUID Agent;
|
||||||
|
int AgentRand = Util.RandomClass.Next(1, 9999);
|
||||||
|
Agent = new LLUUID("99998888-0100-" + AgentRand.ToString("0000") + "-8ec1-0b1d5cd6aead");
|
||||||
|
return Agent;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected virtual bool Authenticate(string first, string last, string passwd)
|
||||||
|
{
|
||||||
|
if (this._needPasswd)
|
||||||
|
{
|
||||||
|
//every user needs the password to login
|
||||||
|
string encodedPass = passwd.Remove(0, 3); //remove $1$
|
||||||
|
if (encodedPass == this._mpasswd)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//do not need password to login
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string EncodePassword(string passwd)
|
||||||
|
{
|
||||||
|
Byte[] originalBytes;
|
||||||
|
Byte[] encodedBytes;
|
||||||
|
MD5 md5;
|
||||||
|
|
||||||
|
md5 = new MD5CryptoServiceProvider();
|
||||||
|
originalBytes = ASCIIEncoding.Default.GetBytes(passwd);
|
||||||
|
encodedBytes = md5.ComputeHash(originalBytes);
|
||||||
|
|
||||||
|
return Regex.Replace(BitConverter.ToString(encodedBytes), "-", "").ToLower();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AgentInventory RequestAgentsInventory(LLUUID agentID)
|
||||||
|
{
|
||||||
|
AgentInventory aInventory = null;
|
||||||
|
if (this.userAccounts)
|
||||||
|
{
|
||||||
|
aInventory = this.userManager.GetUsersInventory(agentID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return aInventory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetServerInfo(string ServerUrl, string SendKey, string RecvKey)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) OpenSim project, http://osgrid.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace OpenSim
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class VersionInfo
|
||||||
|
{
|
||||||
|
public static string Version = "0.1, Build 1173843165, Revision 193:206M";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.types
|
||||||
|
{
|
||||||
|
// TODO: This will need some performance tuning no doubt.
|
||||||
|
public class Mesh
|
||||||
|
{
|
||||||
|
public List<Triangle> mesh;
|
||||||
|
|
||||||
|
public Mesh()
|
||||||
|
{
|
||||||
|
mesh = new List<Triangle>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddTri(Triangle tri)
|
||||||
|
{
|
||||||
|
mesh.Add(tri);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Mesh operator +(Mesh a, Mesh b)
|
||||||
|
{
|
||||||
|
a.mesh.AddRange(b.mesh);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Axiom.MathLib;
|
||||||
|
|
||||||
|
namespace OpenSim.types
|
||||||
|
{
|
||||||
|
public class Triangle
|
||||||
|
{
|
||||||
|
Vector3 a;
|
||||||
|
Vector3 b;
|
||||||
|
Vector3 c;
|
||||||
|
|
||||||
|
public Triangle()
|
||||||
|
{
|
||||||
|
a = new Vector3();
|
||||||
|
b = new Vector3();
|
||||||
|
c = new Vector3();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Triangle(Vector3 A, Vector3 B, Vector3 C)
|
||||||
|
{
|
||||||
|
a = A;
|
||||||
|
b = B;
|
||||||
|
c = C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,501 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
using OpenSim.Physics.Manager;
|
||||||
|
using Axiom.MathLib;
|
||||||
|
|
||||||
|
namespace OpenSim.world
|
||||||
|
{
|
||||||
|
public class Avatar : Entity
|
||||||
|
{
|
||||||
|
public static bool PhysicsEngineFlying = false;
|
||||||
|
public string firstname;
|
||||||
|
public string lastname;
|
||||||
|
public SimClient ControllingClient;
|
||||||
|
private PhysicsActor _physActor;
|
||||||
|
private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate;
|
||||||
|
private bool updateflag = false;
|
||||||
|
private byte movementflag = 0;
|
||||||
|
private List<NewForce> forcesList = new List<NewForce>();
|
||||||
|
private short _updateCount = 0;
|
||||||
|
private Axiom.MathLib.Quaternion bodyRot;
|
||||||
|
|
||||||
|
public Avatar(SimClient TheClient)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)");
|
||||||
|
ControllingClient = TheClient;
|
||||||
|
localid = 8880000 + (OpenSimMain.Instance.LocalWorld._localNumber++);
|
||||||
|
position = new LLVector3(100.0f, 100.0f, 30.0f);
|
||||||
|
position.Z = OpenSimMain.Instance.LocalWorld.LandMap[(int)position.Y * 256 + (int)position.X] + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PhysicsActor PhysActor
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this._physActor = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void addForces()
|
||||||
|
{
|
||||||
|
lock (this.forcesList)
|
||||||
|
{
|
||||||
|
if (this.forcesList.Count > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < this.forcesList.Count; i++)
|
||||||
|
{
|
||||||
|
NewForce force = this.forcesList[i];
|
||||||
|
PhysicsVector phyVector = new PhysicsVector(force.X, force.Y, force.Z);
|
||||||
|
this._physActor.Velocity = phyVector;
|
||||||
|
this.updateflag = true;
|
||||||
|
this.velocity = new LLVector3(force.X, force.Y, force.Z); //shouldn't really be doing this
|
||||||
|
// but as we are setting the velocity (rather than using real forces) at the moment it is okay.
|
||||||
|
}
|
||||||
|
for (int i = 0; i < this.forcesList.Count; i++)
|
||||||
|
{
|
||||||
|
this.forcesList.RemoveAt(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update()
|
||||||
|
{
|
||||||
|
|
||||||
|
if (this.updateflag)
|
||||||
|
{
|
||||||
|
//need to send movement info
|
||||||
|
//so create the improvedterseobjectupdate packet
|
||||||
|
//use CreateTerseBlock()
|
||||||
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock();
|
||||||
|
ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
|
||||||
|
terse.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle; // FIXME
|
||||||
|
terse.RegionData.TimeDilation = 64096;
|
||||||
|
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
terse.ObjectData[0] = terseBlock;
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(terse);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateflag = false;
|
||||||
|
//this._updateCount = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//if((movementflag & 1) !=0)
|
||||||
|
//{
|
||||||
|
_updateCount++;
|
||||||
|
if (((!PhysicsEngineFlying) && (_updateCount > 3)) || (_updateCount > 0))
|
||||||
|
{
|
||||||
|
//It has been a while since last update was sent so lets send one.
|
||||||
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock();
|
||||||
|
ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
|
||||||
|
terse.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle; // FIXME
|
||||||
|
terse.RegionData.TimeDilation = 64096;
|
||||||
|
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
terse.ObjectData[0] = terseBlock;
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(terse);
|
||||||
|
}
|
||||||
|
_updateCount = 0;
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SetupTemplate(string name)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
FileInfo fInfo = new FileInfo(name);
|
||||||
|
long numBytes = fInfo.Length;
|
||||||
|
FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read);
|
||||||
|
BinaryReader br = new BinaryReader(fStream);
|
||||||
|
byte[] data1 = br.ReadBytes((int)numBytes);
|
||||||
|
br.Close();
|
||||||
|
fStream.Close();
|
||||||
|
|
||||||
|
libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
|
||||||
|
|
||||||
|
System.Text.Encoding enc = System.Text.Encoding.ASCII;
|
||||||
|
libsecondlife.LLVector3 pos = new LLVector3(objdata.ObjectData, 16);
|
||||||
|
pos.X = 100f;
|
||||||
|
objdata.ID = 8880000;
|
||||||
|
objdata.NameValue = enc.GetBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User \0");
|
||||||
|
libsecondlife.LLVector3 pos2 = new LLVector3(100f, 100f, 23f);
|
||||||
|
//objdata.FullID=user.AgentID;
|
||||||
|
byte[] pb = pos.GetBytes();
|
||||||
|
Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length);
|
||||||
|
|
||||||
|
Avatar.AvatarTemplate = objdata;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CompleteMovement(World RegionInfo)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs:CompleteMovement() - Constructing AgentMovementComplete packet");
|
||||||
|
AgentMovementCompletePacket mov = new AgentMovementCompletePacket();
|
||||||
|
mov.AgentData.SessionID = this.ControllingClient.SessionID;
|
||||||
|
mov.AgentData.AgentID = this.ControllingClient.AgentID;
|
||||||
|
mov.Data.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle;
|
||||||
|
// TODO - dynamicalise this stuff
|
||||||
|
mov.Data.Timestamp = 1172750370;
|
||||||
|
mov.Data.Position = new LLVector3(100f, 100f, 23f);
|
||||||
|
mov.Data.LookAt = new LLVector3(0.99f, 0.042f, 0);
|
||||||
|
|
||||||
|
ControllingClient.OutPacket(mov);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendInitialPosition()
|
||||||
|
{
|
||||||
|
|
||||||
|
System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||||
|
//send a objectupdate packet with information about the clients avatar
|
||||||
|
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
|
||||||
|
objupdate.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle;
|
||||||
|
objupdate.RegionData.TimeDilation = 64096;
|
||||||
|
objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
|
||||||
|
objupdate.ObjectData[0] = AvatarTemplate;
|
||||||
|
//give this avatar object a local id and assign the user a name
|
||||||
|
objupdate.ObjectData[0].ID = this.localid;
|
||||||
|
this.uuid = objupdate.ObjectData[0].FullID = ControllingClient.AgentID;
|
||||||
|
objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstname + "\nLastName STRING RW SV " + lastname + " \0");
|
||||||
|
|
||||||
|
libsecondlife.LLVector3 pos2 = new LLVector3((float)this.position.X, (float)this.position.Y, (float)this.position.Z);
|
||||||
|
|
||||||
|
byte[] pb = pos2.GetBytes();
|
||||||
|
|
||||||
|
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
|
||||||
|
OpenSimMain.Instance.LocalWorld._localNumber++;
|
||||||
|
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(objupdate);
|
||||||
|
if (client.AgentID != ControllingClient.AgentID)
|
||||||
|
{
|
||||||
|
SendAppearanceToOtherAgent(client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//this.ControllingClient.OutPacket(objupdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendInitialAppearance()
|
||||||
|
{
|
||||||
|
AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket();
|
||||||
|
aw.AgentData.AgentID = this.ControllingClient.AgentID;
|
||||||
|
aw.AgentData.SerialNum = 0;
|
||||||
|
aw.AgentData.SessionID = ControllingClient.SessionID;
|
||||||
|
|
||||||
|
aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
|
||||||
|
AgentWearablesUpdatePacket.WearableDataBlock awb = new AgentWearablesUpdatePacket.WearableDataBlock();
|
||||||
|
awb.WearableType = (byte)0;
|
||||||
|
awb.AssetID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
|
||||||
|
awb.ItemID = LLUUID.Random();
|
||||||
|
aw.WearableData[0] = awb;
|
||||||
|
|
||||||
|
for (int i = 1; i < 13; i++)
|
||||||
|
{
|
||||||
|
awb = new AgentWearablesUpdatePacket.WearableDataBlock();
|
||||||
|
awb.WearableType = (byte)i;
|
||||||
|
awb.AssetID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
awb.ItemID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
aw.WearableData[i] = awb;
|
||||||
|
}
|
||||||
|
|
||||||
|
ControllingClient.OutPacket(aw);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjectUpdatePacket CreateUpdatePacket()
|
||||||
|
{
|
||||||
|
System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||||
|
//send a objectupdate packet with information about the clients avatar
|
||||||
|
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
|
||||||
|
objupdate.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle;
|
||||||
|
objupdate.RegionData.TimeDilation = 64096;
|
||||||
|
objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
|
||||||
|
objupdate.ObjectData[0] = AvatarTemplate;
|
||||||
|
//give this avatar object a local id and assign the user a name
|
||||||
|
objupdate.ObjectData[0].ID = this.localid;
|
||||||
|
objupdate.ObjectData[0].FullID = ControllingClient.AgentID;
|
||||||
|
objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstname + "\nLastName STRING RW SV " + lastname + " \0");
|
||||||
|
|
||||||
|
libsecondlife.LLVector3 pos2 = new LLVector3((float)this._physActor.Position.X, (float)this._physActor.Position.Y, (float)this._physActor.Position.Z);
|
||||||
|
|
||||||
|
byte[] pb = pos2.GetBytes();
|
||||||
|
|
||||||
|
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
|
||||||
|
return objupdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendAppearanceToOtherAgent(SimClient userInfo)
|
||||||
|
{
|
||||||
|
AvatarAppearancePacket avp = new AvatarAppearancePacket();
|
||||||
|
|
||||||
|
|
||||||
|
avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
|
||||||
|
//avp.ObjectData.TextureEntry=this.avatar_template.TextureEntry;// br.ReadBytes((int)numBytes);
|
||||||
|
|
||||||
|
LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-0000-000000000005"));
|
||||||
|
avp.ObjectData.TextureEntry = ntex.ToBytes();
|
||||||
|
|
||||||
|
AvatarAppearancePacket.VisualParamBlock avblock = null;
|
||||||
|
for (int i = 0; i < 218; i++)
|
||||||
|
{
|
||||||
|
avblock = new AvatarAppearancePacket.VisualParamBlock();
|
||||||
|
avblock.ParamValue = (byte)100;
|
||||||
|
avp.VisualParam[i] = avblock;
|
||||||
|
}
|
||||||
|
|
||||||
|
avp.Sender.IsTrial = false;
|
||||||
|
avp.Sender.ID = ControllingClient.AgentID;
|
||||||
|
userInfo.OutPacket(avp);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void HandleUpdate(AgentUpdatePacket pack)
|
||||||
|
{
|
||||||
|
if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_FLY) != 0)
|
||||||
|
{
|
||||||
|
this._physActor.Flying = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this._physActor.Flying = false;
|
||||||
|
}
|
||||||
|
if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS) != 0)
|
||||||
|
{
|
||||||
|
Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
|
||||||
|
if (((movementflag & 1) == 0) || (q != this.bodyRot))
|
||||||
|
{
|
||||||
|
//we should add a new force to the list
|
||||||
|
// but for now we will deal with velocities
|
||||||
|
NewForce newVelocity = new NewForce();
|
||||||
|
Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0);
|
||||||
|
Axiom.MathLib.Vector3 direc = q * v3;
|
||||||
|
direc.Normalize();
|
||||||
|
|
||||||
|
//work out velocity for sim physics system
|
||||||
|
direc = direc * ((0.03f) * 128f);
|
||||||
|
if (this._physActor.Flying)
|
||||||
|
direc *= 2;
|
||||||
|
|
||||||
|
newVelocity.X = direc.x;
|
||||||
|
newVelocity.Y = direc.y;
|
||||||
|
newVelocity.Z = direc.z;
|
||||||
|
this.forcesList.Add(newVelocity);
|
||||||
|
movementflag = 1;
|
||||||
|
this.bodyRot = q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_POS) != 0) && (PhysicsEngineFlying))
|
||||||
|
{
|
||||||
|
if (((movementflag & 2) == 0) && this._physActor.Flying)
|
||||||
|
{
|
||||||
|
//we should add a new force to the list
|
||||||
|
// but for now we will deal with velocities
|
||||||
|
NewForce newVelocity = new NewForce();
|
||||||
|
Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(0, 0, 1);
|
||||||
|
Axiom.MathLib.Vector3 direc = v3;
|
||||||
|
direc.Normalize();
|
||||||
|
|
||||||
|
//work out velocity for sim physics system
|
||||||
|
direc = direc * ((0.03f) * 128f * 2);
|
||||||
|
newVelocity.X = direc.x;
|
||||||
|
newVelocity.Y = direc.y;
|
||||||
|
newVelocity.Z = direc.z;
|
||||||
|
this.forcesList.Add(newVelocity);
|
||||||
|
movementflag = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_UP_NEG) != 0) && (PhysicsEngineFlying))
|
||||||
|
{
|
||||||
|
if (((movementflag & 4) == 0) && this._physActor.Flying)
|
||||||
|
{
|
||||||
|
//we should add a new force to the list
|
||||||
|
// but for now we will deal with velocities
|
||||||
|
NewForce newVelocity = new NewForce();
|
||||||
|
Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(0, 0, -1);
|
||||||
|
//Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
|
||||||
|
Axiom.MathLib.Vector3 direc = v3;
|
||||||
|
direc.Normalize();
|
||||||
|
|
||||||
|
//work out velocity for sim physics system
|
||||||
|
direc = direc * ((0.03f) * 128f * 2);
|
||||||
|
newVelocity.X = direc.x;
|
||||||
|
newVelocity.Y = direc.y;
|
||||||
|
newVelocity.Z = direc.z;
|
||||||
|
this.forcesList.Add(newVelocity);
|
||||||
|
movementflag = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (((uint)pack.AgentData.ControlFlags & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_NEG) != 0)
|
||||||
|
{
|
||||||
|
Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
|
||||||
|
if (((movementflag & 8) == 0) || (q != this.bodyRot))
|
||||||
|
{
|
||||||
|
//we should add a new force to the list
|
||||||
|
// but for now we will deal with velocities
|
||||||
|
NewForce newVelocity = new NewForce();
|
||||||
|
Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(-1, 0, 0);
|
||||||
|
Axiom.MathLib.Vector3 direc = q * v3;
|
||||||
|
direc.Normalize();
|
||||||
|
|
||||||
|
//work out velocity for sim physics system
|
||||||
|
direc = direc * ((0.03f) * 128f);
|
||||||
|
if (this._physActor.Flying)
|
||||||
|
direc *= 2;
|
||||||
|
|
||||||
|
newVelocity.X = direc.x;
|
||||||
|
newVelocity.Y = direc.y;
|
||||||
|
newVelocity.Z = direc.z;
|
||||||
|
this.forcesList.Add(newVelocity);
|
||||||
|
movementflag = 8;
|
||||||
|
this.bodyRot = q;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ((movementflag) != 0)
|
||||||
|
{
|
||||||
|
NewForce newVelocity = new NewForce();
|
||||||
|
newVelocity.X = 0;
|
||||||
|
newVelocity.Y = 0;
|
||||||
|
newVelocity.Z = 0;
|
||||||
|
this.forcesList.Add(newVelocity);
|
||||||
|
movementflag = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//should be moved somewhere else
|
||||||
|
public void SendRegionHandshake(World RegionInfo)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs:SendRegionHandshake() - Creating empty RegionHandshake packet");
|
||||||
|
System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||||
|
RegionHandshakePacket handshake = new RegionHandshakePacket();
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs:SendRegionhandshake() - Filling in RegionHandshake details");
|
||||||
|
handshake.RegionInfo.BillableFactor = 0;
|
||||||
|
handshake.RegionInfo.IsEstateManager = false;
|
||||||
|
handshake.RegionInfo.TerrainHeightRange00 = 60;
|
||||||
|
handshake.RegionInfo.TerrainHeightRange01 = 60;
|
||||||
|
handshake.RegionInfo.TerrainHeightRange10 = 60;
|
||||||
|
handshake.RegionInfo.TerrainHeightRange11 = 60;
|
||||||
|
handshake.RegionInfo.TerrainStartHeight00 = 10;
|
||||||
|
handshake.RegionInfo.TerrainStartHeight01 = 10;
|
||||||
|
handshake.RegionInfo.TerrainStartHeight10 = 10;
|
||||||
|
handshake.RegionInfo.TerrainStartHeight11 = 10;
|
||||||
|
handshake.RegionInfo.SimAccess = 13;
|
||||||
|
handshake.RegionInfo.WaterHeight = 20;
|
||||||
|
handshake.RegionInfo.RegionFlags = 72458694;
|
||||||
|
handshake.RegionInfo.SimName = _enc.GetBytes(OpenSimMain.Instance.Cfg.RegionName + "\0");
|
||||||
|
handshake.RegionInfo.SimOwner = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
handshake.RegionInfo.TerrainBase0 = new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975");
|
||||||
|
handshake.RegionInfo.TerrainBase1 = new LLUUID("abb783e6-3e93-26c0-248a-247666855da3");
|
||||||
|
handshake.RegionInfo.TerrainBase2 = new LLUUID("179cdabd-398a-9b6b-1391-4dc333ba321f");
|
||||||
|
handshake.RegionInfo.TerrainBase3 = new LLUUID("beb169c7-11ea-fff2-efe5-0f24dc881df2");
|
||||||
|
handshake.RegionInfo.TerrainDetail0 = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
handshake.RegionInfo.TerrainDetail1 = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
handshake.RegionInfo.TerrainDetail2 = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
handshake.RegionInfo.TerrainDetail3 = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
handshake.RegionInfo.CacheID = new LLUUID("545ec0a5-5751-1026-8a0b-216e38a7ab37");
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Avatar.cs:SendRegionHandshake() - Sending RegionHandshake packet");
|
||||||
|
this.ControllingClient.OutPacket(handshake);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateTerseBlock()
|
||||||
|
{
|
||||||
|
byte[] bytes = new byte[60];
|
||||||
|
int i = 0;
|
||||||
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
|
||||||
|
dat.TextureEntry = AvatarTemplate.TextureEntry;
|
||||||
|
libsecondlife.LLVector3 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z);
|
||||||
|
|
||||||
|
uint ID = this.localid;
|
||||||
|
|
||||||
|
bytes[i++] = (byte)(ID % 256);
|
||||||
|
bytes[i++] = (byte)((ID >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)((ID >> 16) % 256);
|
||||||
|
bytes[i++] = (byte)((ID >> 24) % 256);
|
||||||
|
bytes[i++] = 0;
|
||||||
|
bytes[i++] = 1;
|
||||||
|
i += 14;
|
||||||
|
bytes[i++] = 128;
|
||||||
|
bytes[i++] = 63;
|
||||||
|
|
||||||
|
byte[] pb = pos2.GetBytes();
|
||||||
|
Array.Copy(pb, 0, bytes, i, pb.Length);
|
||||||
|
i += 12;
|
||||||
|
ushort InternVelocityX;
|
||||||
|
ushort InternVelocityY;
|
||||||
|
ushort InternVelocityZ;
|
||||||
|
|
||||||
|
Axiom.MathLib.Vector3 internDirec = new Axiom.MathLib.Vector3(this._physActor.Velocity.X, this._physActor.Velocity.Y, this._physActor.Velocity.Z);
|
||||||
|
internDirec = internDirec / 128.0f;
|
||||||
|
internDirec.x += 1;
|
||||||
|
internDirec.y += 1;
|
||||||
|
internDirec.z += 1;
|
||||||
|
|
||||||
|
InternVelocityX = (ushort)(32768 * internDirec.x);
|
||||||
|
InternVelocityY = (ushort)(32768 * internDirec.y);
|
||||||
|
InternVelocityZ = (ushort)(32768 * internDirec.z);
|
||||||
|
|
||||||
|
ushort ac = 32767;
|
||||||
|
bytes[i++] = (byte)(InternVelocityX % 256);
|
||||||
|
bytes[i++] = (byte)((InternVelocityX >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(InternVelocityY % 256);
|
||||||
|
bytes[i++] = (byte)((InternVelocityY >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(InternVelocityZ % 256);
|
||||||
|
bytes[i++] = (byte)((InternVelocityZ >> 8) % 256);
|
||||||
|
|
||||||
|
//accel
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
|
||||||
|
//rot
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
|
||||||
|
//rotation vel
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
|
||||||
|
dat.Data = bytes;
|
||||||
|
return (dat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NewForce
|
||||||
|
{
|
||||||
|
public float X;
|
||||||
|
public float Y;
|
||||||
|
public float Z;
|
||||||
|
|
||||||
|
public NewForce()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using Axiom.MathLib;
|
||||||
|
using OpenSim.types;
|
||||||
|
using libsecondlife;
|
||||||
|
|
||||||
|
namespace OpenSim.world
|
||||||
|
{
|
||||||
|
public class Entity
|
||||||
|
{
|
||||||
|
public libsecondlife.LLUUID uuid;
|
||||||
|
public uint localid;
|
||||||
|
public LLVector3 position;
|
||||||
|
public LLVector3 velocity;
|
||||||
|
public Quaternion rotation;
|
||||||
|
protected string name;
|
||||||
|
protected List<Entity> children;
|
||||||
|
|
||||||
|
public Entity()
|
||||||
|
{
|
||||||
|
uuid = new libsecondlife.LLUUID();
|
||||||
|
localid = 0;
|
||||||
|
position = new LLVector3();
|
||||||
|
velocity = new LLVector3();
|
||||||
|
rotation = new Quaternion();
|
||||||
|
name = "(basic entity)";
|
||||||
|
children = new List<Entity>();
|
||||||
|
}
|
||||||
|
public virtual void addForces()
|
||||||
|
{
|
||||||
|
foreach (Entity child in children)
|
||||||
|
{
|
||||||
|
child.addForces();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public virtual void update() {
|
||||||
|
// Do any per-frame updates needed that are applicable to every type of entity
|
||||||
|
foreach (Entity child in children)
|
||||||
|
{
|
||||||
|
child.update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual string getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Mesh getMesh()
|
||||||
|
{
|
||||||
|
Mesh mesh = new Mesh();
|
||||||
|
|
||||||
|
foreach (Entity child in children)
|
||||||
|
{
|
||||||
|
mesh += child.getMesh();
|
||||||
|
}
|
||||||
|
|
||||||
|
return mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void BackUp()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,485 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using OpenSim.types;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Physics.Manager;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.world
|
||||||
|
{
|
||||||
|
public class Primitive : Entity
|
||||||
|
{
|
||||||
|
protected float mesh_cutbegin;
|
||||||
|
protected float mesh_cutend;
|
||||||
|
protected PrimData primData;
|
||||||
|
protected bool newPrimFlag = false;
|
||||||
|
protected bool updateFlag = false;
|
||||||
|
protected bool dirtyFlag = false;
|
||||||
|
private ObjectUpdatePacket OurPacket;
|
||||||
|
private PhysicsActor _physActor;
|
||||||
|
private bool physicsEnabled = false;
|
||||||
|
private bool physicstest = false; //just added for testing
|
||||||
|
|
||||||
|
public bool PhysicsEnabled
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return physicsEnabled;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
physicsEnabled = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool UpdateFlag
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return updateFlag;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
updateFlag = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public LLVector3 Scale
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.primData.Scale = value;
|
||||||
|
this.dirtyFlag = true;
|
||||||
|
}
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.primData.Scale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public PhysicsActor PhysActor
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this._physActor = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Primitive()
|
||||||
|
{
|
||||||
|
mesh_cutbegin = 0.0f;
|
||||||
|
mesh_cutend = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Mesh getMesh()
|
||||||
|
{
|
||||||
|
Mesh mesh = new Mesh();
|
||||||
|
Triangle tri = new Triangle(
|
||||||
|
new Axiom.MathLib.Vector3(0.0f, 1.0f, 1.0f),
|
||||||
|
new Axiom.MathLib.Vector3(1.0f, 0.0f, 1.0f),
|
||||||
|
new Axiom.MathLib.Vector3(1.0f, 1.0f, 0.0f));
|
||||||
|
|
||||||
|
mesh.AddTri(tri);
|
||||||
|
mesh += base.getMesh();
|
||||||
|
|
||||||
|
return mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdatePosition(LLVector3 pos)
|
||||||
|
{
|
||||||
|
this.position = pos;
|
||||||
|
if (this._physActor != null) // && this.physicsEnabled)
|
||||||
|
{
|
||||||
|
this._physActor.Position = new PhysicsVector(pos.X, pos.Y, pos.Z);
|
||||||
|
}
|
||||||
|
this.updateFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void update()
|
||||||
|
{
|
||||||
|
if (this.newPrimFlag)
|
||||||
|
{
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(OurPacket);
|
||||||
|
}
|
||||||
|
this.newPrimFlag = false;
|
||||||
|
}
|
||||||
|
else if (this.updateFlag)
|
||||||
|
{
|
||||||
|
ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
|
||||||
|
terse.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle; // FIXME
|
||||||
|
terse.RegionData.TimeDilation = 64096;
|
||||||
|
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
terse.ObjectData[0] = this.CreateImprovedBlock();
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(terse);
|
||||||
|
}
|
||||||
|
this.updateFlag = false;
|
||||||
|
}
|
||||||
|
else if (this.dirtyFlag)
|
||||||
|
{
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
UpdateClient(client);
|
||||||
|
}
|
||||||
|
this.dirtyFlag = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (this._physActor != null && this.physicsEnabled)
|
||||||
|
{
|
||||||
|
ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket();
|
||||||
|
terse.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle; // FIXME
|
||||||
|
terse.RegionData.TimeDilation = 64096;
|
||||||
|
terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
terse.ObjectData[0] = this.CreateImprovedBlock();
|
||||||
|
foreach (SimClient client in OpenSimMain.Instance.ClientThreads.Values)
|
||||||
|
{
|
||||||
|
client.OutPacket(terse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.physicstest)
|
||||||
|
{
|
||||||
|
LLVector3 pos = this.position;
|
||||||
|
pos.Z += 0.0001f;
|
||||||
|
this.UpdatePosition(pos);
|
||||||
|
this.physicstest = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateClient(SimClient RemoteClient)
|
||||||
|
{
|
||||||
|
|
||||||
|
LLVector3 lPos;
|
||||||
|
if (this._physActor != null && this.physicsEnabled)
|
||||||
|
{
|
||||||
|
PhysicsVector pPos = this._physActor.Position;
|
||||||
|
lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lPos = this.position;
|
||||||
|
}
|
||||||
|
byte[] pb = lPos.GetBytes();
|
||||||
|
Array.Copy(pb, 0, OurPacket.ObjectData[0].ObjectData, 0, pb.Length);
|
||||||
|
|
||||||
|
// OurPacket should be update with the follwing in updateShape() rather than having to do it here
|
||||||
|
OurPacket.ObjectData[0].OwnerID = this.primData.OwnerID;
|
||||||
|
OurPacket.ObjectData[0].PCode = this.primData.PCode;
|
||||||
|
OurPacket.ObjectData[0].PathBegin = this.primData.PathBegin;
|
||||||
|
OurPacket.ObjectData[0].PathEnd = this.primData.PathEnd;
|
||||||
|
OurPacket.ObjectData[0].PathScaleX = this.primData.PathScaleX;
|
||||||
|
OurPacket.ObjectData[0].PathScaleY = this.primData.PathScaleY;
|
||||||
|
OurPacket.ObjectData[0].PathShearX = this.primData.PathShearX;
|
||||||
|
OurPacket.ObjectData[0].PathShearY = this.primData.PathShearY;
|
||||||
|
OurPacket.ObjectData[0].PathSkew = this.primData.PathSkew;
|
||||||
|
OurPacket.ObjectData[0].ProfileBegin = this.primData.ProfileBegin;
|
||||||
|
OurPacket.ObjectData[0].ProfileEnd = this.primData.ProfileEnd;
|
||||||
|
OurPacket.ObjectData[0].Scale = this.primData.Scale;
|
||||||
|
OurPacket.ObjectData[0].PathCurve = this.primData.PathCurve;
|
||||||
|
OurPacket.ObjectData[0].ProfileCurve = this.primData.ProfileCurve;
|
||||||
|
OurPacket.ObjectData[0].ParentID = 0;
|
||||||
|
OurPacket.ObjectData[0].ProfileHollow = this.primData.ProfileHollow;
|
||||||
|
//finish off copying rest of shape data
|
||||||
|
OurPacket.ObjectData[0].PathRadiusOffset = this.primData.PathRadiusOffset;
|
||||||
|
OurPacket.ObjectData[0].PathRevolutions = this.primData.PathRevolutions;
|
||||||
|
OurPacket.ObjectData[0].PathTaperX = this.primData.PathTaperX;
|
||||||
|
OurPacket.ObjectData[0].PathTaperY = this.primData.PathTaperY;
|
||||||
|
OurPacket.ObjectData[0].PathTwist = this.primData.PathTwist;
|
||||||
|
OurPacket.ObjectData[0].PathTwistBegin = this.primData.PathTwistBegin;
|
||||||
|
|
||||||
|
RemoteClient.OutPacket(OurPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateShape(ObjectShapePacket.ObjectDataBlock addPacket)
|
||||||
|
{
|
||||||
|
this.primData.PathBegin = addPacket.PathBegin;
|
||||||
|
this.primData.PathEnd = addPacket.PathEnd;
|
||||||
|
this.primData.PathScaleX = addPacket.PathScaleX;
|
||||||
|
this.primData.PathScaleY = addPacket.PathScaleY;
|
||||||
|
this.primData.PathShearX = addPacket.PathShearX;
|
||||||
|
this.primData.PathShearY = addPacket.PathShearY;
|
||||||
|
this.primData.PathSkew = addPacket.PathSkew;
|
||||||
|
this.primData.ProfileBegin = addPacket.ProfileBegin;
|
||||||
|
this.primData.ProfileEnd = addPacket.ProfileEnd;
|
||||||
|
this.primData.PathCurve = addPacket.PathCurve;
|
||||||
|
this.primData.ProfileCurve = addPacket.ProfileCurve;
|
||||||
|
this.primData.ProfileHollow = addPacket.ProfileHollow;
|
||||||
|
this.primData.PathRadiusOffset = addPacket.PathRadiusOffset;
|
||||||
|
this.primData.PathRevolutions = addPacket.PathRevolutions;
|
||||||
|
this.primData.PathTaperX = addPacket.PathTaperX;
|
||||||
|
this.primData.PathTaperY = addPacket.PathTaperY;
|
||||||
|
this.primData.PathTwist = addPacket.PathTwist;
|
||||||
|
this.primData.PathTwistBegin = addPacket.PathTwistBegin;
|
||||||
|
this.dirtyFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateTexture(byte[] tex)
|
||||||
|
{
|
||||||
|
this.primData.Texture = this.OurPacket.ObjectData[0].TextureEntry = tex;
|
||||||
|
this.dirtyFlag = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateObjectFlags(ObjectFlagUpdatePacket pack)
|
||||||
|
{
|
||||||
|
if (this._physActor != null)
|
||||||
|
{
|
||||||
|
if (this._physActor.Kinematic == pack.AgentData.UsePhysics)
|
||||||
|
{
|
||||||
|
this._physActor.Kinematic = !pack.AgentData.UsePhysics; //if Usephysics = true, then Kinematic should = false
|
||||||
|
}
|
||||||
|
this.physicsEnabled = pack.AgentData.UsePhysics;
|
||||||
|
if (this._physActor.Kinematic == false)
|
||||||
|
{
|
||||||
|
LLVector3 pos = this.position;
|
||||||
|
this.UpdatePosition(pos);
|
||||||
|
pos.Z += 0.000001f;
|
||||||
|
this.UpdatePosition(pos);
|
||||||
|
this.physicstest = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PhysicsVector vec = this._physActor.Position;
|
||||||
|
LLVector3 pos = new LLVector3(vec.X, vec.Y, vec.Z);
|
||||||
|
this.position = pos;
|
||||||
|
this.updateFlag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CreateFromPacket(ObjectAddPacket addPacket, LLUUID agentID, uint localID)
|
||||||
|
{
|
||||||
|
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
|
||||||
|
objupdate.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle;
|
||||||
|
objupdate.RegionData.TimeDilation = 64096;
|
||||||
|
|
||||||
|
objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
PrimData PData = new PrimData();
|
||||||
|
this.primData = PData;
|
||||||
|
objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
objupdate.ObjectData[0].PSBlock = new byte[0];
|
||||||
|
objupdate.ObjectData[0].ExtraParams = new byte[1];
|
||||||
|
objupdate.ObjectData[0].MediaURL = new byte[0];
|
||||||
|
objupdate.ObjectData[0].NameValue = new byte[0];
|
||||||
|
objupdate.ObjectData[0].Text = new byte[0];
|
||||||
|
objupdate.ObjectData[0].TextColor = new byte[4];
|
||||||
|
objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0, 0, 0);
|
||||||
|
objupdate.ObjectData[0].JointPivot = new LLVector3(0, 0, 0);
|
||||||
|
objupdate.ObjectData[0].Material = 3;
|
||||||
|
objupdate.ObjectData[0].UpdateFlags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456;
|
||||||
|
objupdate.ObjectData[0].TextureAnim = new byte[0];
|
||||||
|
objupdate.ObjectData[0].Sound = LLUUID.Zero;
|
||||||
|
LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
|
||||||
|
objupdate.ObjectData[0].TextureEntry = ntex.ToBytes();
|
||||||
|
objupdate.ObjectData[0].State = 0;
|
||||||
|
objupdate.ObjectData[0].Data = new byte[0];
|
||||||
|
PData.OwnerID = objupdate.ObjectData[0].OwnerID = agentID;
|
||||||
|
PData.PCode = objupdate.ObjectData[0].PCode = addPacket.ObjectData.PCode;
|
||||||
|
PData.PathBegin = objupdate.ObjectData[0].PathBegin = addPacket.ObjectData.PathBegin;
|
||||||
|
PData.PathEnd = objupdate.ObjectData[0].PathEnd = addPacket.ObjectData.PathEnd;
|
||||||
|
PData.PathScaleX = objupdate.ObjectData[0].PathScaleX = addPacket.ObjectData.PathScaleX;
|
||||||
|
PData.PathScaleY = objupdate.ObjectData[0].PathScaleY = addPacket.ObjectData.PathScaleY;
|
||||||
|
PData.PathShearX = objupdate.ObjectData[0].PathShearX = addPacket.ObjectData.PathShearX;
|
||||||
|
PData.PathShearY = objupdate.ObjectData[0].PathShearY = addPacket.ObjectData.PathShearY;
|
||||||
|
PData.PathSkew = objupdate.ObjectData[0].PathSkew = addPacket.ObjectData.PathSkew;
|
||||||
|
PData.ProfileBegin = objupdate.ObjectData[0].ProfileBegin = addPacket.ObjectData.ProfileBegin;
|
||||||
|
PData.ProfileEnd = objupdate.ObjectData[0].ProfileEnd = addPacket.ObjectData.ProfileEnd;
|
||||||
|
PData.Scale = objupdate.ObjectData[0].Scale = addPacket.ObjectData.Scale;
|
||||||
|
PData.PathCurve = objupdate.ObjectData[0].PathCurve = addPacket.ObjectData.PathCurve;
|
||||||
|
PData.ProfileCurve = objupdate.ObjectData[0].ProfileCurve = addPacket.ObjectData.ProfileCurve;
|
||||||
|
PData.ParentID = objupdate.ObjectData[0].ParentID = 0;
|
||||||
|
PData.ProfileHollow = objupdate.ObjectData[0].ProfileHollow = addPacket.ObjectData.ProfileHollow;
|
||||||
|
|
||||||
|
PData.PathRadiusOffset = objupdate.ObjectData[0].PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
|
||||||
|
PData.PathRevolutions = objupdate.ObjectData[0].PathRevolutions = addPacket.ObjectData.PathRevolutions;
|
||||||
|
PData.PathTaperX = objupdate.ObjectData[0].PathTaperX = addPacket.ObjectData.PathTaperX;
|
||||||
|
PData.PathTaperY = objupdate.ObjectData[0].PathTaperY = addPacket.ObjectData.PathTaperY;
|
||||||
|
PData.PathTwist = objupdate.ObjectData[0].PathTwist = addPacket.ObjectData.PathTwist;
|
||||||
|
PData.PathTwistBegin = objupdate.ObjectData[0].PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
|
||||||
|
|
||||||
|
objupdate.ObjectData[0].ID = (uint)(localID);
|
||||||
|
objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efef" + (localID - 702000).ToString("00000"));
|
||||||
|
objupdate.ObjectData[0].ObjectData = new byte[60];
|
||||||
|
objupdate.ObjectData[0].ObjectData[46] = 128;
|
||||||
|
objupdate.ObjectData[0].ObjectData[47] = 63;
|
||||||
|
LLVector3 pos1 = addPacket.ObjectData.RayEnd;
|
||||||
|
//update position
|
||||||
|
byte[] pb = pos1.GetBytes();
|
||||||
|
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length);
|
||||||
|
|
||||||
|
this.newPrimFlag = true;
|
||||||
|
this.uuid = objupdate.ObjectData[0].FullID;
|
||||||
|
this.localid = objupdate.ObjectData[0].ID;
|
||||||
|
this.position = pos1;
|
||||||
|
this.OurPacket = objupdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CreateFromStorage(PrimData store)
|
||||||
|
{
|
||||||
|
//need to clean this up as it shares a lot of code with CreateFromPacket()
|
||||||
|
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
|
||||||
|
objupdate.RegionData.RegionHandle = OpenSimMain.Instance.Cfg.RegionHandle;
|
||||||
|
objupdate.RegionData.TimeDilation = 64096;
|
||||||
|
objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
||||||
|
|
||||||
|
this.primData = store;
|
||||||
|
objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
objupdate.ObjectData[0].PSBlock = new byte[0];
|
||||||
|
objupdate.ObjectData[0].ExtraParams = new byte[1];
|
||||||
|
objupdate.ObjectData[0].MediaURL = new byte[0];
|
||||||
|
objupdate.ObjectData[0].NameValue = new byte[0];
|
||||||
|
objupdate.ObjectData[0].Text = new byte[0];
|
||||||
|
objupdate.ObjectData[0].TextColor = new byte[4];
|
||||||
|
objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0, 0, 0);
|
||||||
|
objupdate.ObjectData[0].JointPivot = new LLVector3(0, 0, 0);
|
||||||
|
objupdate.ObjectData[0].Material = 3;
|
||||||
|
objupdate.ObjectData[0].UpdateFlags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456;
|
||||||
|
objupdate.ObjectData[0].TextureAnim = new byte[0];
|
||||||
|
objupdate.ObjectData[0].Sound = LLUUID.Zero;
|
||||||
|
|
||||||
|
if (store.Texture == null)
|
||||||
|
{
|
||||||
|
LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005"));
|
||||||
|
objupdate.ObjectData[0].TextureEntry = ntex.ToBytes();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
objupdate.ObjectData[0].TextureEntry = store.Texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
objupdate.ObjectData[0].State = 0;
|
||||||
|
objupdate.ObjectData[0].Data = new byte[0];
|
||||||
|
objupdate.ObjectData[0].OwnerID = this.primData.OwnerID;
|
||||||
|
objupdate.ObjectData[0].PCode = this.primData.PCode;
|
||||||
|
objupdate.ObjectData[0].PathBegin = this.primData.PathBegin;
|
||||||
|
objupdate.ObjectData[0].PathEnd = this.primData.PathEnd;
|
||||||
|
objupdate.ObjectData[0].PathScaleX = this.primData.PathScaleX;
|
||||||
|
objupdate.ObjectData[0].PathScaleY = this.primData.PathScaleY;
|
||||||
|
objupdate.ObjectData[0].PathShearX = this.primData.PathShearX;
|
||||||
|
objupdate.ObjectData[0].PathShearY = this.primData.PathShearY;
|
||||||
|
objupdate.ObjectData[0].PathSkew = this.primData.PathSkew;
|
||||||
|
objupdate.ObjectData[0].ProfileBegin = this.primData.ProfileBegin;
|
||||||
|
objupdate.ObjectData[0].ProfileEnd = this.primData.ProfileEnd;
|
||||||
|
objupdate.ObjectData[0].Scale = this.primData.Scale;
|
||||||
|
objupdate.ObjectData[0].PathCurve = this.primData.PathCurve;
|
||||||
|
objupdate.ObjectData[0].ProfileCurve = this.primData.ProfileCurve;
|
||||||
|
objupdate.ObjectData[0].ParentID = 0;
|
||||||
|
objupdate.ObjectData[0].ProfileHollow = this.primData.ProfileHollow;
|
||||||
|
//finish off copying rest of shape data
|
||||||
|
objupdate.ObjectData[0].PathRadiusOffset = this.primData.PathRadiusOffset;
|
||||||
|
objupdate.ObjectData[0].PathRevolutions = this.primData.PathRevolutions;
|
||||||
|
objupdate.ObjectData[0].PathTaperX = this.primData.PathTaperX;
|
||||||
|
objupdate.ObjectData[0].PathTaperY = this.primData.PathTaperY;
|
||||||
|
objupdate.ObjectData[0].PathTwist = this.primData.PathTwist;
|
||||||
|
objupdate.ObjectData[0].PathTwistBegin = this.primData.PathTwistBegin;
|
||||||
|
|
||||||
|
objupdate.ObjectData[0].ID = (uint)store.LocalID;
|
||||||
|
objupdate.ObjectData[0].FullID = store.FullID;
|
||||||
|
|
||||||
|
objupdate.ObjectData[0].ObjectData = new byte[60];
|
||||||
|
objupdate.ObjectData[0].ObjectData[46] = 128;
|
||||||
|
objupdate.ObjectData[0].ObjectData[47] = 63;
|
||||||
|
LLVector3 pos1 = store.Position;
|
||||||
|
//update position
|
||||||
|
byte[] pb = pos1.GetBytes();
|
||||||
|
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length);
|
||||||
|
|
||||||
|
this.uuid = objupdate.ObjectData[0].FullID;
|
||||||
|
this.localid = objupdate.ObjectData[0].ID;
|
||||||
|
this.position = pos1;
|
||||||
|
this.OurPacket = objupdate;
|
||||||
|
|
||||||
|
}
|
||||||
|
public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedBlock()
|
||||||
|
{
|
||||||
|
uint ID = this.localid;
|
||||||
|
byte[] bytes = new byte[60];
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
dat.TextureEntry = this.OurPacket.ObjectData[0].TextureEntry;
|
||||||
|
|
||||||
|
bytes[i++] = (byte)(ID % 256);
|
||||||
|
bytes[i++] = (byte)((ID >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)((ID >> 16) % 256);
|
||||||
|
bytes[i++] = (byte)((ID >> 24) % 256);
|
||||||
|
bytes[i++] = 0;
|
||||||
|
bytes[i++] = 0;
|
||||||
|
|
||||||
|
LLVector3 lPos;
|
||||||
|
Axiom.MathLib.Quaternion lRot;
|
||||||
|
if (this._physActor != null && this.physicsEnabled)
|
||||||
|
{
|
||||||
|
PhysicsVector pPos = this._physActor.Position;
|
||||||
|
lPos = new LLVector3(pPos.X, pPos.Y, pPos.Z);
|
||||||
|
lRot = this._physActor.Orientation;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lPos = this.position;
|
||||||
|
lRot = this.rotation;
|
||||||
|
}
|
||||||
|
byte[] pb = lPos.GetBytes();
|
||||||
|
Array.Copy(pb, 0, bytes, i, pb.Length);
|
||||||
|
i += 12;
|
||||||
|
ushort ac = 32767;
|
||||||
|
|
||||||
|
//vel
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
|
||||||
|
//accel
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
|
||||||
|
ushort rw, rx, ry, rz;
|
||||||
|
rw = (ushort)(32768 * (lRot.w + 1));
|
||||||
|
rx = (ushort)(32768 * (lRot.x + 1));
|
||||||
|
ry = (ushort)(32768 * (lRot.y + 1));
|
||||||
|
rz = (ushort)(32768 * (lRot.z + 1));
|
||||||
|
|
||||||
|
//rot
|
||||||
|
bytes[i++] = (byte)(rx % 256);
|
||||||
|
bytes[i++] = (byte)((rx >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ry % 256);
|
||||||
|
bytes[i++] = (byte)((ry >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(rz % 256);
|
||||||
|
bytes[i++] = (byte)((rz >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(rw % 256);
|
||||||
|
bytes[i++] = (byte)((rw >> 8) % 256);
|
||||||
|
|
||||||
|
//rotation vel
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
bytes[i++] = (byte)(ac % 256);
|
||||||
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
||||||
|
|
||||||
|
dat.Data = bytes;
|
||||||
|
return dat;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void BackUp()
|
||||||
|
{
|
||||||
|
this.primData.FullID = this.uuid;
|
||||||
|
this.primData.LocalID = this.localid;
|
||||||
|
this.primData.Position = this.position;
|
||||||
|
this.primData.Rotation = new LLQuaternion(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w);
|
||||||
|
OpenSimMain.Instance.LocalWorld.localStorage.StorePrim(this.primData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.world
|
||||||
|
{
|
||||||
|
public class ScriptEngine
|
||||||
|
{
|
||||||
|
public ScriptEngine(World env)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadScript()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.world
|
||||||
|
{
|
||||||
|
public class SurfacePatch
|
||||||
|
{
|
||||||
|
public float[] HeightMap;
|
||||||
|
|
||||||
|
public SurfacePatch() {
|
||||||
|
HeightMap = new float[16*16];
|
||||||
|
|
||||||
|
int xinc;
|
||||||
|
int yinc;
|
||||||
|
for(xinc=0; xinc<16; xinc++) for(yinc=0; yinc<16; yinc++) {
|
||||||
|
HeightMap[xinc+(yinc*16)]=100.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,213 @@
|
||||||
|
using System;
|
||||||
|
using libsecondlife;
|
||||||
|
using libsecondlife.Packets;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.IO;
|
||||||
|
using OpenSim.Physics.Manager;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
using OpenSim.Framework.Terrain;
|
||||||
|
|
||||||
|
namespace OpenSim.world
|
||||||
|
{
|
||||||
|
public class World : ILocalStorageReceiver
|
||||||
|
{
|
||||||
|
public Dictionary<libsecondlife.LLUUID, Entity> Entities;
|
||||||
|
public float[] LandMap;
|
||||||
|
public ScriptEngine Scripts;
|
||||||
|
public uint _localNumber=0;
|
||||||
|
private PhysicsScene phyScene;
|
||||||
|
private float timeStep= 0.1f;
|
||||||
|
private libsecondlife.TerrainManager TerrainManager;
|
||||||
|
public ILocalStorage localStorage;
|
||||||
|
private Random Rand = new Random();
|
||||||
|
private uint _primCount = 702000;
|
||||||
|
private int storageCount;
|
||||||
|
|
||||||
|
public World()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs - creating new entitities instance");
|
||||||
|
Entities = new Dictionary<libsecondlife.LLUUID, Entity>();
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs - creating LandMap");
|
||||||
|
TerrainManager = new TerrainManager(new SecondLife());
|
||||||
|
Avatar.SetupTemplate("avatar-template.dat");
|
||||||
|
// ServerConsole.MainConsole.Instance.WriteLine("World.cs - Creating script engine instance");
|
||||||
|
// Initialise this only after the world has loaded
|
||||||
|
// Scripts = new ScriptEngine(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PhysicsScene PhysScene
|
||||||
|
{
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.phyScene = value;
|
||||||
|
}
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return(this.phyScene);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Update()
|
||||||
|
{
|
||||||
|
if(this.phyScene.IsThreaded)
|
||||||
|
{
|
||||||
|
this.phyScene.GetResults();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (libsecondlife.LLUUID UUID in Entities.Keys)
|
||||||
|
{
|
||||||
|
Entities[UUID].addForces();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.phyScene.Simulate(timeStep);
|
||||||
|
|
||||||
|
foreach (libsecondlife.LLUUID UUID in Entities.Keys)
|
||||||
|
{
|
||||||
|
Entities[UUID].update();
|
||||||
|
}
|
||||||
|
|
||||||
|
//backup world data
|
||||||
|
this.storageCount++;
|
||||||
|
if(storageCount> 1200) //set to how often you want to backup
|
||||||
|
{
|
||||||
|
this.Backup();
|
||||||
|
storageCount =0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool LoadStorageDLL(string dllName)
|
||||||
|
{
|
||||||
|
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
|
||||||
|
ILocalStorage store = null;
|
||||||
|
|
||||||
|
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (pluginType.IsPublic)
|
||||||
|
{
|
||||||
|
if (!pluginType.IsAbstract)
|
||||||
|
{
|
||||||
|
Type typeInterface = pluginType.GetInterface("ILocalStorage", true);
|
||||||
|
|
||||||
|
if (typeInterface != null)
|
||||||
|
{
|
||||||
|
ILocalStorage plug = (ILocalStorage)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||||
|
store = plug;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
typeInterface = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pluginAssembly = null;
|
||||||
|
this.localStorage = store;
|
||||||
|
return(store == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegenerateTerrain()
|
||||||
|
{
|
||||||
|
HeightmapGenHills hills = new HeightmapGenHills();
|
||||||
|
this.LandMap = hills.GenerateHeightmap(200, 4.0f, 80.0f, false);
|
||||||
|
this.phyScene.SetTerrain(this.LandMap);
|
||||||
|
OpenSimMain.Instance.Cfg.SaveMap(this.LandMap);
|
||||||
|
|
||||||
|
foreach(SimClient client in OpenSimMain.Instance.ClientThreads.Values) {
|
||||||
|
this.SendLayerData(client);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void LoadPrimsFromStorage()
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: LoadPrimsFromStorage() - Loading primitives");
|
||||||
|
this.localStorage.LoadPrimitives(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrimFromStorage(PrimData prim)
|
||||||
|
{
|
||||||
|
if(prim.LocalID >= this._primCount)
|
||||||
|
{
|
||||||
|
_primCount = prim.LocalID + 1;
|
||||||
|
}
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: PrimFromStorage() - Reloading prim (localId "+ prim.LocalID+ " ) from storage");
|
||||||
|
Primitive nPrim = new Primitive();
|
||||||
|
nPrim.CreateFromStorage(prim);
|
||||||
|
this.Entities.Add(nPrim.uuid, nPrim);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
this.localStorage.ShutDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendLayerData(SimClient RemoteClient) {
|
||||||
|
int[] patches = new int[4];
|
||||||
|
|
||||||
|
for (int y = 0; y < 16; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < 16; x = x + 4)
|
||||||
|
{
|
||||||
|
patches[0] = x + 0 + y * 16;
|
||||||
|
patches[1] = x + 1 + y * 16;
|
||||||
|
patches[2] = x + 2 + y * 16;
|
||||||
|
patches[3] = x + 3 + y * 16;
|
||||||
|
|
||||||
|
Packet layerpack = TerrainManager.CreateLandPacket(LandMap, patches);
|
||||||
|
RemoteClient.OutPacket(layerpack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetInitialPrims(SimClient RemoteClient)
|
||||||
|
{
|
||||||
|
foreach (libsecondlife.LLUUID UUID in Entities.Keys)
|
||||||
|
{
|
||||||
|
if(Entities[UUID].ToString()== "OpenSim.world.Primitive")
|
||||||
|
{
|
||||||
|
((OpenSim.world.Primitive)Entities[UUID]).UpdateClient(RemoteClient);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddViewerAgent(SimClient AgentClient) {
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Creating new avatar for remote viewer agent");
|
||||||
|
Avatar NewAvatar = new Avatar(AgentClient);
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Adding new avatar to world");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs:AddViewerAgent() - Starting RegionHandshake ");
|
||||||
|
NewAvatar.SendRegionHandshake(this);
|
||||||
|
PhysicsVector pVec = new PhysicsVector(NewAvatar.position.X, NewAvatar.position.Y, NewAvatar.position.Z);
|
||||||
|
NewAvatar.PhysActor = this.phyScene.AddAvatar(pVec);
|
||||||
|
this.Entities.Add(AgentClient.AgentID, NewAvatar);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddNewPrim(ObjectAddPacket addPacket, SimClient AgentClient)
|
||||||
|
{
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: AddNewPrim() - Creating new prim");
|
||||||
|
Primitive prim = new Primitive();
|
||||||
|
prim.CreateFromPacket(addPacket, AgentClient.AgentID, this._primCount);
|
||||||
|
PhysicsVector pVec = new PhysicsVector(prim.position.X, prim.position.Y, prim.position.Z);
|
||||||
|
PhysicsVector pSize = new PhysicsVector( 0.255f, 0.255f, 0.255f);
|
||||||
|
if(OpenSim.world.Avatar.PhysicsEngineFlying)
|
||||||
|
{
|
||||||
|
prim.PhysActor = this.phyScene.AddPrim(pVec, pSize );
|
||||||
|
}
|
||||||
|
//prim.PhysicsEnabled = true;
|
||||||
|
this.Entities.Add(prim.uuid, prim);
|
||||||
|
this._primCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Backup() {
|
||||||
|
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("World.cs: Backup() - Backing up Primitives");
|
||||||
|
foreach (libsecondlife.LLUUID UUID in Entities.Keys)
|
||||||
|
{
|
||||||
|
Entities[UUID].BackUp();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace OpenSim.world.scripting
|
||||||
|
{
|
||||||
|
public interface IScriptHost {
|
||||||
|
bool Register(IScript iscript);
|
||||||
|
}
|
||||||
|
public interface IScript
|
||||||
|
{
|
||||||
|
string Name{get;set;}
|
||||||
|
IScriptHost Host{get;set;}
|
||||||
|
void Show();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Information about this assembly is defined by the following
|
||||||
|
// attributes.
|
||||||
|
//
|
||||||
|
// change them to the information which is associated with the assembly
|
||||||
|
// you compile.
|
||||||
|
|
||||||
|
[assembly: AssemblyTitle("Db4LocalStorage")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("Db4LocalStorage")]
|
||||||
|
[assembly: AssemblyCopyright("")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// This sets the default COM visibility of types in the assembly to invisible.
|
||||||
|
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The assembly version has following format :
|
||||||
|
//
|
||||||
|
// Major.Minor.Build.Revision
|
||||||
|
//
|
||||||
|
// You can specify all values by your own or you can build default build and revision
|
||||||
|
// numbers with the '*' character (the default):
|
||||||
|
|
||||||
|
[assembly: AssemblyVersion("1.0.*")]
|
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the <organization> nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Db4objects.Db4o;
|
||||||
|
using Db4objects.Db4o.Query;
|
||||||
|
using libsecondlife;
|
||||||
|
using OpenSim.Framework.Interfaces;
|
||||||
|
using OpenSim.Framework.Assets;
|
||||||
|
|
||||||
|
namespace OpenSim.Storage.LocalStorageDb4o
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public class Db4LocalStorage : ILocalStorage
|
||||||
|
{
|
||||||
|
private IObjectContainer db;
|
||||||
|
|
||||||
|
public Db4LocalStorage()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
db = Db4oFactory.OpenFile("localworld.yap");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Db4LocalStorage creation");
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
db.Close();
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Db4LocalStorage :Constructor - Exception occured");
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine(e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StorePrim(PrimData prim)
|
||||||
|
{
|
||||||
|
IObjectSet result = db.Query(new UUIDQuery(prim.FullID));
|
||||||
|
if(result.Count>0)
|
||||||
|
{
|
||||||
|
//prim already in storage
|
||||||
|
//so update it
|
||||||
|
PrimData found = (PrimData) result.Next();
|
||||||
|
found.PathBegin = prim.PathBegin;
|
||||||
|
found.PathCurve= prim.PathCurve;
|
||||||
|
found.PathEnd = prim.PathEnd;
|
||||||
|
found.PathRadiusOffset = prim.PathRadiusOffset;
|
||||||
|
found.PathRevolutions = prim.PathRevolutions;
|
||||||
|
found.PathScaleX= prim.PathScaleX;
|
||||||
|
found.PathScaleY = prim.PathScaleY;
|
||||||
|
found.PathShearX = prim.PathShearX;
|
||||||
|
found.PathShearY = prim.PathShearY;
|
||||||
|
found.PathSkew = prim.PathSkew;
|
||||||
|
found.PathTaperX = prim.PathTaperX;
|
||||||
|
found.PathTaperY = prim.PathTaperY;
|
||||||
|
found.PathTwist = prim.PathTwist;
|
||||||
|
found.PathTwistBegin = prim.PathTwistBegin;
|
||||||
|
found.PCode = prim.PCode;
|
||||||
|
found.ProfileBegin = prim.ProfileBegin;
|
||||||
|
found.ProfileCurve = prim.ProfileCurve;
|
||||||
|
found.ProfileEnd = prim.ProfileEnd;
|
||||||
|
found.ProfileHollow = prim.ProfileHollow;
|
||||||
|
found.Position = prim.Position;
|
||||||
|
found.Rotation = prim.Rotation;
|
||||||
|
found.Texture = prim.Texture;
|
||||||
|
db.Set(found);
|
||||||
|
db.Commit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//not in storage
|
||||||
|
db.Set(prim);
|
||||||
|
db.Commit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemovePrim(LLUUID primID)
|
||||||
|
{
|
||||||
|
IObjectSet result = db.Query(new UUIDQuery(primID));
|
||||||
|
if(result.Count>0)
|
||||||
|
{
|
||||||
|
PrimData found = (PrimData) result.Next();
|
||||||
|
db.Delete(found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void LoadPrimitives(ILocalStorageReceiver receiver)
|
||||||
|
{
|
||||||
|
IObjectSet result = db.Get(typeof(PrimData));
|
||||||
|
OpenSim.Framework.Console.MainConsole.Instance.WriteLine("Db4LocalStorage.cs: LoadPrimitives() - number of prims in storages is "+result.Count);
|
||||||
|
foreach (PrimData prim in result) {
|
||||||
|
receiver.PrimFromStorage(prim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShutDown()
|
||||||
|
{
|
||||||
|
db.Commit();
|
||||||
|
db.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<RootNamespace>OpenSim.Storage.LocalStorageDb4o</RootNamespace>
|
||||||
|
<AssemblyName>Db4LocalStorage</AssemblyName>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{74784F23-B0FD-484C-82C1-96C0215733DC}</ProjectGuid>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||||
|
<OutputPath>..\..\..\bin\</OutputPath>
|
||||||
|
<Optimize>False</Optimize>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>True</DebugSymbols>
|
||||||
|
<DebugType>Full</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
<OutputPath>..\..\bin\</OutputPath>
|
||||||
|
<Optimize>True</Optimize>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<DebugSymbols>False</DebugSymbols>
|
||||||
|
<DebugType>None</DebugType>
|
||||||
|
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Db4objects.Db4o, Version=6.0.1.0, Culture=neutral, PublicKeyToken=6199cd4f203aa8eb, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\Db4objects.Db4o.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="libsecondlife, Version=0.9.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
<HintPath>..\..\bin\libsecondlife.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Db4LocalStorage.cs" />
|
||||||
|
<Compile Include="AssemblyInfo.cs" />
|
||||||
|
<Compile Include="UUIDQuery.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.Framework.Console\OpenSim.Framework.Console.csproj">
|
||||||
|
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||||
|
<Name>OpenSim.Framework.Console</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\..\OpenSim.FrameWork\OpenSim.Framework.csproj">
|
||||||
|
<Project>{2E46A825-3168-492F-93BC-637126B5B72B}</Project>
|
||||||
|
<Name>OpenSim.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||||
|
</Project>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue