From c52c68f314c67c76c7181a6d0828f476290fbd66 Mon Sep 17 00:00:00 2001
From: Sean Dague
Date: Wed, 2 Apr 2008 15:24:31 +0000
Subject: whole lot more moving
---
OpenSim/Data/DB4o/DB4oGridData.cs | 182 ++++++++++++++++++
OpenSim/Data/DB4o/DB4oManager.cs | 170 +++++++++++++++++
OpenSim/Data/DB4o/DB4oUserData.cs | 270 +++++++++++++++++++++++++++
OpenSim/Data/DB4o/Properties/AssemblyInfo.cs | 65 +++++++
4 files changed, 687 insertions(+)
create mode 100644 OpenSim/Data/DB4o/DB4oGridData.cs
create mode 100644 OpenSim/Data/DB4o/DB4oManager.cs
create mode 100644 OpenSim/Data/DB4o/DB4oUserData.cs
create mode 100644 OpenSim/Data/DB4o/Properties/AssemblyInfo.cs
(limited to 'OpenSim/Data/DB4o')
diff --git a/OpenSim/Data/DB4o/DB4oGridData.cs b/OpenSim/Data/DB4o/DB4oGridData.cs
new file mode 100644
index 0000000..31b13e3
--- /dev/null
+++ b/OpenSim/Data/DB4o/DB4oGridData.cs
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using libsecondlife;
+
+namespace OpenSim.Framework.Data.DB4o
+{
+ ///
+ /// A grid server storage mechanism employing the DB4o database system
+ ///
+ internal class DB4oGridData : GridDataBase
+ {
+ ///
+ /// The database manager object
+ ///
+ private DB4oGridManager manager;
+
+ ///
+ /// Called when the plugin is first loaded (as constructors are not called)
+ ///
+ override public void Initialise()
+ {
+ manager = new DB4oGridManager("gridserver.yap");
+ }
+
+ ///
+ /// Returns a list of regions within the specified ranges
+ ///
+ /// minimum X coordinate
+ /// minimum Y coordinate
+ /// maximum X coordinate
+ /// maximum Y coordinate
+ /// An array of region profiles
+ override public RegionProfileData[] GetProfilesInRange(uint a, uint b, uint c, uint d)
+ {
+ return null;
+ }
+
+ ///
+ /// Returns a region located at the specified regionHandle (warning multiple regions may occupy the one spot, first found is returned)
+ ///
+ /// The handle to search for
+ /// A region profile
+ override public RegionProfileData GetProfileByHandle(ulong handle)
+ {
+ lock (manager.simProfiles)
+ {
+ foreach (LLUUID UUID in manager.simProfiles.Keys)
+ {
+ if (manager.simProfiles[UUID].regionHandle == handle)
+ {
+ return manager.simProfiles[UUID];
+ }
+ }
+ }
+ throw new Exception("Unable to find profile with handle (" + handle.ToString() + ")");
+ }
+
+ ///
+ /// Returns a specific region
+ ///
+ /// The region ID code
+ /// A region profile
+ override public RegionProfileData GetProfileByLLUUID(LLUUID uuid)
+ {
+ lock (manager.simProfiles)
+ {
+ if (manager.simProfiles.ContainsKey(uuid))
+ return manager.simProfiles[uuid];
+ }
+ throw new Exception("Unable to find profile with UUID (" + uuid.ToString() +
+ "). Total Registered Regions: " + manager.simProfiles.Count);
+ }
+
+ override public RegionProfileData GetProfileByString(string regionName)
+ {
+ throw new Exception("GetProfileByString Not supported in DB4oGridData");
+ //return null;
+ }
+
+ ///
+ /// Adds a new specified region to the database
+ ///
+ /// The profile to add
+ /// A dataresponse enum indicating success
+ override public DataResponse AddProfile(RegionProfileData profile)
+ {
+ lock (manager.simProfiles)
+ {
+ if (manager.AddRow(profile))
+ {
+ return DataResponse.RESPONSE_OK;
+ }
+ else
+ {
+ return DataResponse.RESPONSE_ERROR;
+ }
+ }
+ }
+
+ ///
+ /// Authenticates a new region using the shared secrets. NOT SECURE.
+ ///
+ /// The UUID the region is authenticating with
+ /// The location the region is logging into (unused in Db4o)
+ /// The shared secret
+ /// Authenticated?
+ override public bool AuthenticateSim(LLUUID uuid, ulong handle, string key)
+ {
+ if (manager.simProfiles[uuid].regionRecvKey == key)
+ return true;
+ return false;
+ }
+
+ ///
+ /// Shuts down the database
+ ///
+ override public void Close()
+ {
+ manager = null;
+ }
+
+ ///
+ /// // Returns a list of avatar and UUIDs that match the query
+ ///
+ public List GeneratePickerResults(LLUUID queryID, string query)
+ {
+ //Do nothing yet
+ List returnlist = new List();
+ return returnlist;
+ }
+
+ ///
+ /// Returns the providers name
+ ///
+ /// The name of the storage system
+ override public string getName()
+ {
+ return "DB4o Grid Provider";
+ }
+
+ ///
+ /// Returns the providers version
+ ///
+ /// The version of the storage system
+ override public string getVersion()
+ {
+ return "0.1";
+ }
+
+ override public ReservationData GetReservationAtPoint(uint x, uint y)
+ {
+ return null;
+ }
+ }
+}
diff --git a/OpenSim/Data/DB4o/DB4oManager.cs b/OpenSim/Data/DB4o/DB4oManager.cs
new file mode 100644
index 0000000..9cacb5e
--- /dev/null
+++ b/OpenSim/Data/DB4o/DB4oManager.cs
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using Db4objects.Db4o;
+using libsecondlife;
+
+namespace OpenSim.Framework.Data.DB4o
+{
+ ///
+ /// A Database manager for Db4o
+ ///
+ internal class DB4oGridManager
+ {
+ ///
+ /// A list of the current regions connected (in-memory cache)
+ ///
+ public Dictionary simProfiles = new Dictionary();
+
+ ///
+ /// Database File Name
+ ///
+ private string dbfl;
+
+ ///
+ /// Creates a new grid storage manager
+ ///
+ /// Filename to the database file
+ public DB4oGridManager(string db4odb)
+ {
+ dbfl = db4odb;
+ IObjectContainer database;
+ database = Db4oFactory.OpenFile(dbfl);
+ IObjectSet result = database.Get(typeof (RegionProfileData));
+ // Loads the file into the in-memory cache
+ foreach (RegionProfileData row in result)
+ {
+ simProfiles.Add(row.UUID, row);
+ }
+ database.Close();
+ }
+
+ ///
+ /// Adds a new profile to the database (Warning: Probably slow.)
+ ///
+ /// The profile to add
+ /// Successful?
+ public bool AddRow(RegionProfileData row)
+ {
+ if (simProfiles.ContainsKey(row.UUID))
+ {
+ simProfiles[row.UUID] = row;
+ }
+ else
+ {
+ simProfiles.Add(row.UUID, row);
+ }
+
+ try
+ {
+ IObjectContainer database;
+ database = Db4oFactory.OpenFile(dbfl);
+ database.Set(row);
+ database.Close();
+ return true;
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+ }
+ }
+
+ ///
+ /// A manager for the DB4o database (user profiles)
+ ///
+ internal class DB4oUserManager
+ {
+ ///
+ /// A list of the user profiles (in memory cache)
+ ///
+ public Dictionary userProfiles = new Dictionary();
+
+ ///
+ /// Database filename
+ ///
+ private string dbfl;
+
+ ///
+ /// Initialises a new DB manager
+ ///
+ /// The filename to the database
+ public DB4oUserManager(string db4odb)
+ {
+ dbfl = db4odb;
+ IObjectContainer database;
+ database = Db4oFactory.OpenFile(dbfl);
+ // Load to cache
+ IObjectSet result = database.Get(typeof (UserProfileData));
+ foreach (UserProfileData row in result)
+ {
+ if (userProfiles.ContainsKey(row.UUID))
+ userProfiles[row.UUID] = row;
+ else
+ userProfiles.Add(row.UUID, row);
+ }
+ database.Close();
+ }
+
+ ///
+ /// Adds or updates a record to the user database. Do this when changes are needed
+ /// in the user profile that need to be persistant.
+ ///
+ /// TODO: the logic here is not ACID, the local cache will be
+ /// updated even if the persistant data is not. This may lead
+ /// to unexpected results.
+ ///
+ /// The profile to update
+ /// true on success, false on fail to persist to db
+ public bool UpdateRecord(UserProfileData record)
+ {
+ if (userProfiles.ContainsKey(record.UUID))
+ {
+ userProfiles[record.UUID] = record;
+ }
+ else
+ {
+ userProfiles.Add(record.UUID, record);
+ }
+
+ try
+ {
+ IObjectContainer database;
+ database = Db4oFactory.OpenFile(dbfl);
+ database.Set(record);
+ database.Close();
+ return true;
+ }
+ catch (Exception)
+ {
+ return false;
+ }
+ }
+ }
+}
diff --git a/OpenSim/Data/DB4o/DB4oUserData.cs b/OpenSim/Data/DB4o/DB4oUserData.cs
new file mode 100644
index 0000000..3072e81
--- /dev/null
+++ b/OpenSim/Data/DB4o/DB4oUserData.cs
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using libsecondlife;
+
+namespace OpenSim.Framework.Data.DB4o
+{
+ ///
+ /// A User storage interface for the DB4o database system
+ ///
+ public class DB4oUserData : IUserData
+ {
+ //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+
+ ///
+ /// The database manager
+ ///
+ private DB4oUserManager manager;
+
+ ///
+ /// Artificial constructor called upon plugin load
+ ///
+ public void Initialise()
+ {
+ manager = new DB4oUserManager(Path.Combine(Util.dataDir(), "userprofiles.yap"));
+ }
+
+ ///
+ /// Loads a specified user profile from a UUID
+ ///
+ /// The users UUID
+ /// A user profile
+ public UserProfileData GetUserByUUID(LLUUID uuid)
+ {
+ if (manager.userProfiles.ContainsKey(uuid))
+ return manager.userProfiles[uuid];
+ return null;
+ }
+
+ ///
+ /// Returns a user by searching for its name
+ ///
+ /// The users account name
+ /// A matching users profile
+ public UserProfileData GetUserByName(string name)
+ {
+ return GetUserByName(name.Split(' ')[0], name.Split(' ')[1]);
+ }
+
+ ///
+ /// Returns a user by searching for its name
+ ///
+ /// The first part of the users account name
+ /// The second part of the users account name
+ /// A matching users profile
+ public UserProfileData GetUserByName(string fname, string lname)
+ {
+ foreach (UserProfileData profile in manager.userProfiles.Values)
+ {
+ if (profile.username == fname && profile.surname == lname)
+ return profile;
+ }
+ return null;
+ }
+
+ ///
+ /// Returns a user by UUID direct
+ ///
+ /// The users account ID
+ /// A matching users profile
+ public UserAgentData GetAgentByUUID(LLUUID uuid)
+ {
+ try
+ {
+ return GetUserByUUID(uuid).currentAgent;
+ }
+ catch (Exception)
+ {
+ return null;
+ }
+ }
+
+ ///
+ /// Returns a session by account name
+ ///
+ /// The account name
+ /// The users session agent
+ public UserAgentData GetAgentByName(string name)
+ {
+ return GetAgentByName(name.Split(' ')[0], name.Split(' ')[1]);
+ }
+
+ ///
+ /// Returns a session by account name
+ ///
+ /// The first part of the users account name
+ /// The second part of the users account name
+ /// A user agent
+ public UserAgentData GetAgentByName(string fname, string lname)
+ {
+ try
+ {
+ return GetUserByName(fname, lname).currentAgent;
+ }
+ catch (Exception)
+ {
+ return null;
+ }
+ }
+ public void StoreWebLoginKey(LLUUID AgentID, LLUUID WebLoginKey)
+ {
+ UserProfileData user = GetUserByUUID(AgentID);
+ user.webLoginKey = WebLoginKey;
+ UpdateUserProfile(user);
+
+ }
+ #region User Friends List Data
+
+ public void AddNewUserFriend(LLUUID friendlistowner, LLUUID friend, uint perms)
+ {
+ //m_log.Info("[FRIEND]: Stub AddNewUserFriend called");
+ }
+
+ public void RemoveUserFriend(LLUUID friendlistowner, LLUUID friend)
+ {
+ //m_log.Info("[FRIEND]: Stub RemoveUserFriend called");
+ }
+ public void UpdateUserFriendPerms(LLUUID friendlistowner, LLUUID friend, uint perms)
+ {
+ //m_log.Info("[FRIEND]: Stub UpdateUserFriendPerms called");
+ }
+
+
+ public List GetUserFriendList(LLUUID friendlistowner)
+ {
+ //m_log.Info("[FRIEND]: Stub GetUserFriendList called");
+ return new List();
+ }
+
+ #endregion
+
+ public void UpdateUserCurrentRegion(LLUUID avatarid, LLUUID regionuuid)
+ {
+ //m_log.Info("[USER]: Stub UpdateUserCUrrentRegion called");
+ }
+
+
+
+ public List GeneratePickerResults(LLUUID queryID, string query)
+ {
+ //Do nothing yet
+ List returnlist = new List();
+ return returnlist;
+ }
+
+ ///
+ /// Creates a new user profile
+ ///
+ /// The profile to add to the database
+ public void AddNewUserProfile(UserProfileData user)
+ {
+ try
+ {
+ manager.UpdateRecord(user);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ }
+ }
+
+ ///
+ /// Creates a new user profile
+ ///
+ /// The profile to add to the database
+ /// True on success, false on error
+ public bool UpdateUserProfile(UserProfileData user)
+ {
+ try
+ {
+ return manager.UpdateRecord(user);
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e.ToString());
+ return false;
+ }
+ }
+
+
+ ///
+ /// Creates a new user agent
+ ///
+ /// The agent to add to the database
+ public void AddNewUserAgent(UserAgentData agent)
+ {
+ // Do nothing. yet.
+ }
+
+ ///
+ /// Transfers money between two user accounts
+ ///
+ /// Starting account
+ /// End account
+ /// The amount to move
+ /// Success?
+ public bool MoneyTransferRequest(LLUUID from, LLUUID to, uint amount)
+ {
+ return true;
+ }
+
+ ///
+ /// Transfers inventory between two accounts
+ ///
+ /// Move to inventory server
+ /// Senders account
+ /// Receivers account
+ /// Inventory item
+ /// Success?
+ public bool InventoryTransferRequest(LLUUID from, LLUUID to, LLUUID item)
+ {
+ return true;
+ }
+
+ ///
+ /// Returns the name of the storage provider
+ ///
+ /// Storage provider name
+ public string getName()
+ {
+ return "DB4o Userdata";
+ }
+
+ ///
+ /// Returns the version of the storage provider
+ ///
+ /// Storage provider version
+ public string GetVersion()
+ {
+ return "0.1";
+ }
+ }
+}
diff --git a/OpenSim/Data/DB4o/Properties/AssemblyInfo.cs b/OpenSim/Data/DB4o/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..ee84938
--- /dev/null
+++ b/OpenSim/Data/DB4o/Properties/AssemblyInfo.cs
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSim Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System.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.Framework.Data.DB4o")]
+[assembly : AssemblyDescription("")]
+[assembly : AssemblyConfiguration("")]
+[assembly : AssemblyCompany("")]
+[assembly : AssemblyProduct("OpenSim.Framework.Data.DB4o")]
+[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2008")]
+[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("57991e15-79da-41b7-aa06-2e6b49165a63")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly : AssemblyVersion("1.0.0.0")]
+[assembly : AssemblyFileVersion("1.0.0.0")]
--
cgit v1.1