This commit is contained in:
ManfredAabye
2025-06-22 15:06:06 +02:00
committed by GitHub
parent c5ca8e1b6d
commit 0af23d3608
28 changed files with 11738 additions and 0 deletions
@@ -0,0 +1,135 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/ See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Funktion
Die Datei definiert das C#-Interface IMoneyManager.
Sie legt die Methoden fest, die eine Klasse zur Verwaltung von Geldtransaktionen, Guthaben und Benutzerinformationen implementieren muss.
Typische Aufgaben des Interfaces:
Abfragen und Ändern von Benutzer-Guthaben (getBalance, withdrawMoney, giveMoney)
Hinzufügen und Abfragen von Transaktionen (addTransaction, FetchTransaction)
Verwaltung von Benutzern (addUser, addUserInfo, fetchUserInfo, updateUserInfo)
Validierung und Ablauf von Transaktionen (ValidateTransfer, SetTransExpired)
NullPointer-Checks & Fehlerquellen
Interface selbst:
Das Interface enthält keine Implementierung. Es ist lediglich eine Methodendefinition. Das bedeutet:
Es gibt keine Logik, also auch keine Möglichkeit für NullPointer-Fehler innerhalb dieser Datei.
Fehlerquellen oder NullPointer-Probleme hängen ausschließlich von den konkreten Implementierungen dieser Methoden ab.
Parameter:
Die Methoden nehmen meist Strings, UUIDs, Ints und komplexe Typen wie TransactionData oder UserInfo als Parameter.
In einer späteren Implementierung sollte geprüft werden, ob übergebene Objekte (z.B. user, transaction) null sind, bevor darauf zugegriffen wird.
Rückgabewerte wie TransactionData oder UserInfo könnten null sein, wenn nichts gefunden wird auch das ist Sache der Implementierung.
Rückgabewerte:
Methoden, die Objekte zurückgeben (FetchTransaction, fetchUserInfo), haben keine Angaben, ob sie null zurückgeben dürfen.
Das sollte dokumentiert oder in der Implementierung behandelt werden.
Zusammenfassung
NullPointer-Gefahr:
Im Interface selbst nicht möglich, da keine Ausführung erfolgt.
Fehlerquellen:
Keine im Interface; alle Fehlerquellen und NullPointer-Risiken entstehen erst in den Klassen, die dieses Interface implementieren.
Funktion:
Definition aller nötigen Methoden zur Verwaltung von Geldtransaktionen und Benutzerinformationen im OpenSim-Kontext.
Fazit:
Die Datei IMoneyManager.cs ist ein reines Methoden-Interface und enthält keine Logik, die zu NullPointer-Fehlern führen kann.
Typische Fehlerquellen und NullPointer sollten in den konkreten Implementierungen der Methoden sorgfältig behandelt werden (z.B. Nullprüfungen auf Parameter, Rückgabewerte).
*/
#pragma warning disable IDE1006
using OpenMetaverse;
namespace OpenSim.Data.MySQL.MySQLMoneyDataWrapper
{
public interface IMoneyManager
{
/// <summary>Gets the balance.</summary>
/// <param name="userID">The user identifier.</param>
int getBalance(string userID);
/// <summary>Withdraws the money.</summary>
/// <param name="transactionID">The transaction identifier.</param>
/// <param name="senderID">The sender identifier.</param>
/// <param name="amount">The amount.</param>
bool withdrawMoney(UUID transactionID, string senderID, int amount);
/// <summary>Gives the money.</summary>
/// <param name="transactionID">The transaction identifier.</param>
/// <param name="receiverID">The receiver identifier.</param>
/// <param name="amount">The amount.</param>
bool giveMoney(UUID transactionID, string receiverID, int amount);
/// <summary>Adds the transaction.</summary>
/// <param name="transaction">The transaction.</param>
bool addTransaction(TransactionData transaction);
/// <summary>Updates the transaction status.</summary>
/// <param name="transactionID">The transaction identifier.</param>
/// <param name="status">The status.</param>
/// <param name="description">The description.</param>
bool updateTransactionStatus(UUID transactionID, int status, string description);
/// <summary>Fetches the transaction.</summary>
/// <param name="transactionID">The transaction identifier.</param>
TransactionData FetchTransaction(UUID transactionID);
/// <summary>Fetches the transaction.</summary>
/// <param name="userID">The user identifier.</param>
/// <param name="startTime">The start time.</param>
/// <param name="endTime">The end time.</param>
/// <param name="index">The index.</param>
/// <param name="retNum">The ret number.</param>
TransactionData[] FetchTransaction(string userID, int startTime, int endTime, uint index, uint retNum);
/// <summary>Gets the transaction number.</summary>
/// <param name="userID">The user identifier.</param>
/// <param name="startTime">The start time.</param>
/// <param name="endTime">The end time.</param>
int getTransactionNum(string userID, int startTime, int endTime);
/// <summary>Adds the user.</summary>
/// <param name="userID">The user identifier.</param>
/// <param name="balance">The balance.</param>
/// <param name="status">The status.</param>
/// <param name="type">The type.</param>
bool addUser(string userID, int balance, int status, int type);
/// <summary>Sets the trans expired.</summary>
/// <param name="deadTime">The dead time.</param>
bool SetTransExpired(int deadTime);
/// <summary>Validates the transfer.</summary>
/// <param name="secureCode">The secure code.</param>
/// <param name="transactionID">The transaction identifier.</param>
bool ValidateTransfer(string secureCode, UUID transactionID);
/// <summary>Adds the user information.</summary>
/// <param name="user">The user.</param>
bool addUserInfo(UserInfo user);
/// <summary>Fetches the user information.</summary>
/// <param name="userID">The user identifier.</param>
UserInfo fetchUserInfo(string userID);
/// <summary>Updates the user information.</summary>
/// <param name="user">The user.</param>
bool updateUserInfo(UserInfo user);
}
}
@@ -0,0 +1,100 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/ See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Funktion
Die Klasse MySQLSuperManager dient als Wrapper/Manager für einen Thread-Sicherheitsmechanismus (Mutex) und kapselt eine Instanz von MySQLMoneyManager.
Sie enthält:
Ein Mutex-Objekt für Thread-Synchronisation.
Ein Flag Locked zur Statusanzeige.
Eine öffentliche Instanz von MySQLMoneyManager namens Manager.
Die Methode GetLock() blockiert, bis der Mutex verfügbar ist.
Die Methode Release() gibt den Mutex frei und behandelt freigabe-bezogene Fehler.
Ein String Running (wird hier aber nicht verwendet).
Null Pointer Checks
Manager: Im Konstruktor wird garantiert, dass Manager immer initialisiert ist (niemals null nach Konstruktion).
m_lock: Wird direkt beim Feld-Deklaration erstellt, kann also nie null sein.
Locked: Ist ein bool, daher nie null.
Running: Ist public, aber im Code nicht direkt verwendet. Wenn er von außen auf null gesetzt wird, kann das keinen Fehler verursachen, da er nicht verwendet wird.
Fehlerquellen
Mutex-Handling:
In Release() wird das Freigeben des Mutex von einem Try-Catch-Block umschlossen. Sollte ein Fehler beim Freigeben auftreten (z.B. Freigabe von einem Thread, der den Mutex nicht besitzt), wird die Exception geloggt und erneut geworfen.
In GetLock() wird WaitOne() direkt aufgerufen, was blockiert, bis der Lock verfügbar ist. Es gibt hier keine Exception-Absicherung, aber üblicherweise ist dies sicher, solange das Objekt korrekt verwendet wird.
Thread-Safety:
Die Klasse ist thread-safe bezüglich des Mutex, nicht aber bezüglich der Instanzvariablen (Running ist public ohne Schutz, aber nicht verwendet).
Es wird kein expliziter Null-Check auf Manager benötigt, da sie im Konstruktor immer initialisiert wird.
Unbenutzte Variable:
Das Feld Running ist nicht implementiert/genutzt. Das ist kein Fehler, aber ein Hinweis auf evtl. toten Code.
Zusammenfassung
Null Pointer: Keine Gefahr für NullPointer-Exceptions im aktuellen Code.
Fehlerquellen: Einzige potenzielle Fehlerquelle ist das Freigeben des Mutex in Release(), aber dies wird per Exception abgefangen und geloggt.
Funktion: Thread-Safe-Manager/Wrapper für den Zugriff auf einen MySQLMoneyManager.
Fazit:
Die Klasse ist solide und sicher gegen NullPointer-Fehler. Fehler beim Mutex-Handling werden korrekt behandelt. Es gibt keine offensichtlichen Schwachstellen.
Lediglich das Feld Running ist ungenutzt und könnte entfernt oder implementiert werden.
*/
using MySqlX.XDevAPI;
using OpenMetaverse.ImportExport.Collada14;
using OpenSim.Data.MySQL.MySQLMoneyDataWrapper;
using System;
using System.Diagnostics;
using System.Runtime.ConstrainedExecution;
using System.Threading;
namespace OpenSim.Data.MySQL.MySQLMoneyDataWrapper
{
public class MySQLSuperManager(string connectionString)
{
public bool Locked { get; private set; }
private readonly Mutex m_lock = new(false);
public MySQLMoneyManager Manager { get; } = new MySQLMoneyManager(connectionString);
public string Running;
/// <summary>Erwirbt die exklusive Sperre für kritische Operationen.</summary>
public void GetLock()
{
m_lock.WaitOne();
Locked = true;
}
/// <summary>Gibt die Sperre wieder frei.</summary>
public void Release()
{
try
{
m_lock.ReleaseMutex();
}
catch (Exception ex)
{
Console.WriteLine($"Ein Fehler beim Freigeben des Mutex ist aufgetreten: {ex.Message}");
throw;
}
finally
{
Locked = false;
}
}
}
}
@@ -0,0 +1,32 @@
using System.Reflection;
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.Data.MySQL.MySQLMoneyDataWrapper")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("OpenSim.Data.MySQL.MySQLMoneyDataWrapper")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2009")]
[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("03f4a266-2e30-47e4-b785-ff02cdb4bbb9")]
// 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,291 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/ See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSim Project nor the names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Funktion
TransactionData ist eine reine Datenklasse (POCO/DTO), die alle relevanten Felder für eine Finanztransaktion im OpenSim-Money-Modul kapselt.
Felder: UUIDs, Beträge, Balances, Typen, Zeiten, Status, Objekt- und Regionsdaten, Sicherheitscode, Beschreibung usw.
Für alle Felder gibt es Properties mit Getter/Setter.
Zwei Enums:
Status (SUCCESS, PENDING, FAILED, ERROR)
AvatarType (diverse Avatar-Typen, z.B. LOCAL, HG, GUEST, NPC)
UserInfo ist ebenfalls eine reine Datenklasse für Benutzerinformationen, mit Properties für UserID, SimIP, Name, Passwort-Hash, Typ, Klasse, ServerURL.
Null Pointer & Fehlerquellen
Null Pointer
Felder vom Typ string werden grundsätzlich mit string.Empty initialisiert (niemals null im Standardzustand).
UUIDs werden (soweit gesetzt) aus dem Typ OpenMetaverse.UUID initialisiert dieser Typ ist ein struct und kann daher nie null sein.
Es gibt keine Methoden mit Logik, daher auch keine Parameterprüfungen oder komplexe Objekt-Manipulationen, bei denen NullPointer auftreten könnten.
Setter/Getter der Properties geben direkt das Feld zurück oder setzen es, ohne Logik.
Die Enums können nicht null sein.
Fehlerquellen
Keine Methoden mit Logik, also keine klassische Fehlerquelle wie Division durch 0, Indexfehler o.ä.
Setter führen keine Validierung durch (z.B. auf gültige UUIDs, Wertebereiche),
was bei fehlerhafter Nutzung zu inkonsistenten Daten führen könnte das ist aber kein NullPointer und im Kontext von Datenklassen üblich.
UserInfo: Alle Felder sind mit sinnvollen Defaultwerten versehen (string.Empty oder ein Enum-Wert).
Zusammenfassung
Null Pointer: Es gibt im aktuellen Code keine Gefahr für NullPointer-Exceptions, da alle Felder mit Defaultwerten belegt sind und keine Logik existiert.
Fehlerquellen: Keine Methoden, keine Validierung klassisch für Datenklassen.
Fehler können nur entstehen, wenn von außen ungültige Werte gesetzt werden, aber das verursacht keine NullPointer-Fehler.
Funktion: Kapselt Daten für Transaktionen und Benutzer im OpenSim-Money-System.
Fazit:
Die Datei ist eine reine Datenstruktur und sicher gegenüber NullPointer-Fehlern. Es gibt keine gefährlichen Stellen im Code.
Die Nutzung ist robust, solange von außen sinnvolle Werte gesetzt werden.
*/
using OpenMetaverse;
namespace OpenSim.Data.MySQL.MySQLMoneyDataWrapper
{
public class TransactionData
{
UUID m_uuid;
string m_sender = string.Empty;
string m_receiver = string.Empty;
int m_amount;
int m_senderBalance;
int m_receiverBalance;
int m_type;
int m_time;
int m_status;
string m_objectID = UUID.Zero.ToString();
string m_objectName = string.Empty;
string m_regionHandle = string.Empty;
string m_regionUUID = string.Empty;
string m_secureCode = string.Empty;
string m_commonName = string.Empty;
string m_description = string.Empty;
/// <summary>Gets or sets the trans UUID.</summary>
/// <value>The trans UUID.</value>
public UUID TransUUID
{
get { return m_uuid; }
set { m_uuid = value; }
}
/// <summary>Gets or sets the sender.</summary>
/// <value>The sender.</value>
public string Sender
{
get { return m_sender; }
set { m_sender = value; }
}
/// <summary>Gets or sets the receiver.</summary>
/// <value>The receiver.</value>
public string Receiver
{
get { return m_receiver; }
set { m_receiver = value; }
}
/// <summary>Gets or sets the amount.</summary>
/// <value>The amount.</value>
public int Amount
{
get { return m_amount; }
set { m_amount = value; }
}
/// <summary>Gets or sets the sender balance.</summary>
/// <value>The sender balance.</value>
public int SenderBalance
{
get { return m_senderBalance; }
set { m_senderBalance = value; }
}
/// <summary>Gets or sets the receiver balance.</summary>
/// <value>The receiver balance.</value>
public int ReceiverBalance
{
get { return m_receiverBalance; }
set { m_receiverBalance = value; }
}
/// <summary>Gets or sets the type.</summary>
/// <value>The type.</value>
public int Type
{
get { return m_type; }
set { m_type = value; }
}
/// <summary>Gets or sets the time.</summary>
/// <value>The time.</value>
public int Time
{
get { return m_time; }
set { m_time = value; }
}
/// <summary>Gets or sets the status.</summary>
/// <value>The status.</value>
public int Status
{
get { return m_status; }
set { m_status = value; }
}
/// <summary>Gets or sets the description.</summary>
/// <value>The description.</value>
public string Description
{
get { return m_description; }
set { m_description = value; }
}
/// <summary>Gets or sets the object UUID.</summary>
/// <value>The object UUID.</value>
public string ObjectUUID
{
get { return m_objectID; }
set { m_objectID = value; }
}
/// <summary>Gets or sets the name of the object.</summary>
/// <value>The name of the object.</value>
public string ObjectName
{
get { return m_objectName; }
set { m_objectName = value; }
}
/// <summary>Gets or sets the region handle.</summary>
/// <value>The region handle.</value>
public string RegionHandle
{
get { return m_regionHandle; }
set { m_regionHandle = value; }
}
/// <summary>Gets or sets the region UUID.</summary>
/// <value>The region UUID.</value>
public string RegionUUID
{
get { return m_regionUUID; }
set { m_regionUUID = value; }
}
/// <summary>Gets or sets the secure code.</summary>
/// <value>The secure code.</value>
public string SecureCode
{
get { return m_secureCode; }
set { m_secureCode = value; }
}
/// <summary>Gets or sets the name of the common.</summary>
/// <value>The name of the common.</value>
public string CommonName
{
get { return m_commonName; }
set { m_commonName = value; }
}
}
public enum Status
{
SUCCESS_STATUS = 0,
PENDING_STATUS = 1,
FAILED_STATUS = 2,
ERROR_STATUS = 9
}
public enum AvatarType
{
LOCAL_AVATAR = 0,
HG_AVATAR = 1,
NPC_AVATAR = 2,
GUEST_AVATAR = 3,
FOREIGN_AVATAR = 8,
UNKNOWN_AVATAR = 9
}
public class UserInfo
{
string m_userID = string.Empty;
string m_simIP = string.Empty;
string m_avatarName = string.Empty;
string m_passwordHash = string.Empty;
int m_avatarType = (int)AvatarType.LOCAL_AVATAR;
int m_avatarClass = (int)AvatarType.LOCAL_AVATAR;
string m_serverURL = string.Empty;
/// <summary>Gets or sets the user identifier.</summary>
/// <value>The user identifier.</value>
public string UserID
{
get { return m_userID; }
set { m_userID = value; }
}
/// <summary>Gets or sets the sim ip.</summary>
/// <value>The sim ip.</value>
public string SimIP
{
get { return m_simIP; }
set { m_simIP = value; }
}
/// <summary>Gets or sets the avatar.</summary>
/// <value>The avatar.</value>
public string Avatar
{
get { return m_avatarName; }
set { m_avatarName = value; }
}
/// <summary>Gets or sets the PSW hash.</summary>
/// <value>The PSW hash.</value>
public string PswHash
{
get { return m_passwordHash; }
set { m_passwordHash = value; }
}
/// <summary>Gets or sets the type.</summary>
/// <value>The type.</value>
public int Type
{
get { return m_avatarType; }
set { m_avatarType = value; }
}
/// <summary>Gets or sets the class.</summary>
/// <value>The class.</value>
public int Class
{
get { return m_avatarClass; }
set { m_avatarClass = value; }
}
/// <summary>Gets or sets the server URL.</summary>
/// <value>The server URL.</value>
public string ServerURL
{
get { return m_serverURL; }
set { m_serverURL = value; }
}
}
}
@@ -0,0 +1,39 @@
<?xml version="1.0" ?>
<Project name="OpenSim.Data.MySQL.MySQLMoneyDataWrapper" path="addon-modules/OpenSim-Data-MySQL-MySQLMoneyDataWrapper" type="Library">
<Configuration name="Debug">
<Options>
<OutputPath>../../bin/</OutputPath>
<AllowUnsafe>true</AllowUnsafe>
</Options>
</Configuration>
<Configuration name="Release">
<Options>
<OutputPath>../../bin/</OutputPath>
<AllowUnsafe>true</AllowUnsafe>
</Options>
</Configuration>
<ReferencePath>../../bin/</ReferencePath>
<Reference name="Nini" path="../../bin/"/>
<Reference name="Mono.Addins" path="../../bin/"/>
<Reference name="log4net" path="../../bin/"/>
<Reference name="OpenMetaverse" path="../../bin/"/>
<Reference name="OpenMetaverseTypes" path="../../bin/"/>
<Reference name="XMLRPC" path="../../bin/"/>
<Reference name="MySql.Data" path="../../bin/"/>
<Reference name="OpenSim.Region.Framework"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Framework.Console"/>
<Reference name="OpenSim.Framework.Servers"/>
<Reference name="OpenSim.Framework.Servers.HttpServer"/>
<Reference name="OpenSim.Services.Interfaces"/>
<Reference name="OpenSim.Server.Base"/>
<Reference name="OpenSim.Data"/>
<Files>
<Match pattern="*.cs" recurse="true">
<Exclude name="obj" pattern="obj"/>
<Exclude name="Tests" pattern="Tests"/>
</Match>
</Files>
</Project>