From 651f9f47d0dec64e70bc257f4695313fad839b7a Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 21 Dec 2011 14:56:38 -0800 Subject: [PATCH 01/37] HG: Verify that the user is local --- OpenSim/Services/HypergridService/UserAgentService.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index cdc560c4f5..85386602d5 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -161,6 +161,14 @@ namespace OpenSim.Services.HypergridService { m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}", agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "stored IP" : clientIP.Address.ToString()), gatekeeper.ServerURI); + + if (m_UserAccountService.GetUserAccount(UUID.Zero, agentCircuit.AgentID) == null) + { + m_log.WarnFormat("[USER AGENT SERVICE]: Someone attempted to lauch a foreign user from here {0} {1}", agentCircuit.firstname, agentCircuit.lastname); + reason = "Forbidden to launch your agents from here"; + return false; + } + // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination GridRegion region = new GridRegion(gatekeeper); region.ServerURI = gatekeeper.ServerURI; From ddff2f246cb4862abcac5308ae2532c9828691fb Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Wed, 21 Dec 2011 15:17:26 -0800 Subject: [PATCH 02/37] Moved an external test into the method that uses those preconditions. --- .../Region/Framework/Scenes/ScenePresence.cs | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 36d8c0bd37..526fab3728 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1161,10 +1161,10 @@ namespace OpenSim.Region.Framework.Scenes public void CompleteMovement(IClientAPI client, bool openChildAgents) { // DateTime startTime = DateTime.Now; - -// m_log.DebugFormat( -// "[SCENE PRESENCE]: Completing movement of {0} into region {1}", -// client.Name, Scene.RegionInfo.RegionName); + + m_log.DebugFormat( + "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", + client.Name, Scene.RegionInfo.RegionName, AbsolutePosition); Vector3 look = Velocity; if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) @@ -2383,9 +2383,7 @@ namespace OpenSim.Region.Framework.Scenes m_lastVelocity = Velocity; } - // followed suggestion from mic bowman. reversed the two lines below. - if (ParentID == 0 && PhysicsActor != null || ParentID != 0) // Check that we have a physics actor or we're sitting on something - CheckForBorderCrossing(); + CheckForBorderCrossing(); CheckForSignificantMovement(); // sends update to the modules. } @@ -2741,7 +2739,8 @@ namespace OpenSim.Region.Framework.Scenes /// protected void CheckForBorderCrossing() { - if (IsChildAgent) + // Check that we we are not a child and have a physics actor or we're sitting on something + if (IsChildAgent || (ParentID == 0 && PhysicsActor != null || ParentID != 0)) return; Vector3 pos2 = AbsolutePosition; @@ -2757,7 +2756,6 @@ namespace OpenSim.Region.Framework.Scenes if (!IsInTransit) { // Checks if where it's headed exists a region - bool needsTransit = false; if (m_scene.TestBorderCross(pos2, Cardinals.W)) { @@ -2828,7 +2826,7 @@ namespace OpenSim.Region.Framework.Scenes Velocity = Vector3.Zero; AbsolutePosition = pos; -// m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); + m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); AddToPhysicalScene(isFlying); } @@ -2861,22 +2859,16 @@ namespace OpenSim.Region.Framework.Scenes } } else - { - // We must remove the agent from the physical scene if it has been placed in transit. If we don't, - // then this method continues to be called from ScenePresence.Update() until the handover of the client between - // regions is completed. Since this handover can take more than 1000ms (due to the 1000ms - // event queue polling response from the server), this results in the avatar pausing on the border - // for the handover period. - RemoveFromPhysicalScene(); - + { // This constant has been inferred from experimentation // I'm not sure what this value should be, so I tried a few values. timeStep = 0.04f; pos2 = AbsolutePosition; pos2.X = pos2.X + (vel.X * timeStep); pos2.Y = pos2.Y + (vel.Y * timeStep); - pos2.Z = pos2.Z + (vel.Z * timeStep); + // Don't touch the Z m_pos = pos2; + m_log.ErrorFormat("m_pos={0}", m_pos); } } From 219ec7ef20ccefb257be5ec650a13758b2a3cda3 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 22 Dec 2011 08:18:03 -0800 Subject: [PATCH 03/37] Fixing a bug introduced yesterday. This put the precondition test inside CheckForBorderCrossing the right way. --- .../Region/Framework/Scenes/ScenePresence.cs | 254 +++++++++--------- 1 file changed, 129 insertions(+), 125 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 6f02475648..040cbfcc3b 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2736,137 +2736,141 @@ namespace OpenSim.Region.Framework.Scenes /// protected void CheckForBorderCrossing() { - // Check that we we are not a child and have a physics actor or we're sitting on something - if (IsChildAgent || (ParentID == 0 && PhysicsActor != null || ParentID != 0)) + // Check that we we are not a child + if (IsChildAgent) return; - Vector3 pos2 = AbsolutePosition; - Vector3 vel = Velocity; - int neighbor = 0; - int[] fix = new int[2]; - - float timeStep = 0.1f; - pos2.X = pos2.X + (vel.X*timeStep); - pos2.Y = pos2.Y + (vel.Y*timeStep); - pos2.Z = pos2.Z + (vel.Z*timeStep); - - if (!IsInTransit) + // We only do this if we have a physics actor or we're sitting on something + if (ParentID == 0 && PhysicsActor != null || ParentID != 0) { - // Checks if where it's headed exists a region - bool needsTransit = false; - if (m_scene.TestBorderCross(pos2, Cardinals.W)) - { - if (m_scene.TestBorderCross(pos2, Cardinals.S)) - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix); - } - else if (m_scene.TestBorderCross(pos2, Cardinals.N)) - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix); - } - else - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix); - } - } - else if (m_scene.TestBorderCross(pos2, Cardinals.E)) - { - if (m_scene.TestBorderCross(pos2, Cardinals.S)) - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix); - } - else if (m_scene.TestBorderCross(pos2, Cardinals.N)) - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix); - } - else - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix); - } - } - else if (m_scene.TestBorderCross(pos2, Cardinals.S)) - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix); - } - else if (m_scene.TestBorderCross(pos2, Cardinals.N)) - { - needsTransit = true; - neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix); - } + Vector3 pos2 = AbsolutePosition; + Vector3 vel = Velocity; + int neighbor = 0; + int[] fix = new int[2]; - // Makes sure avatar does not end up outside region - if (neighbor <= 0) - { - if (needsTransit) - { - if (m_requestedSitTargetUUID == UUID.Zero) - { - bool isFlying = Flying; - RemoveFromPhysicalScene(); - - Vector3 pos = AbsolutePosition; - if (AbsolutePosition.X < 0) - pos.X += Velocity.X * 2; - else if (AbsolutePosition.X > Constants.RegionSize) - pos.X -= Velocity.X * 2; - if (AbsolutePosition.Y < 0) - pos.Y += Velocity.Y * 2; - else if (AbsolutePosition.Y > Constants.RegionSize) - pos.Y -= Velocity.Y * 2; - Velocity = Vector3.Zero; - AbsolutePosition = pos; - - m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); - - AddToPhysicalScene(isFlying); - } - } - } - else if (neighbor > 0) - { - if (!CrossToNewRegion()) - { - if (m_requestedSitTargetUUID == UUID.Zero) - { - bool isFlying = Flying; - RemoveFromPhysicalScene(); - - Vector3 pos = AbsolutePosition; - if (AbsolutePosition.X < 0) - pos.X += Velocity.X * 2; - else if (AbsolutePosition.X > Constants.RegionSize) - pos.X -= Velocity.X * 2; - if (AbsolutePosition.Y < 0) - pos.Y += Velocity.Y * 2; - else if (AbsolutePosition.Y > Constants.RegionSize) - pos.Y -= Velocity.Y * 2; - Velocity = Vector3.Zero; - AbsolutePosition = pos; - - AddToPhysicalScene(isFlying); - } - } - } - } - else - { - // This constant has been inferred from experimentation - // I'm not sure what this value should be, so I tried a few values. - timeStep = 0.04f; - pos2 = AbsolutePosition; + float timeStep = 0.1f; pos2.X = pos2.X + (vel.X * timeStep); pos2.Y = pos2.Y + (vel.Y * timeStep); - // Don't touch the Z - m_pos = pos2; - m_log.ErrorFormat("m_pos={0}", m_pos); - } + pos2.Z = pos2.Z + (vel.Z * timeStep); + + if (!IsInTransit) + { + // Checks if where it's headed exists a region + bool needsTransit = false; + if (m_scene.TestBorderCross(pos2, Cardinals.W)) + { + if (m_scene.TestBorderCross(pos2, Cardinals.S)) + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix); + } + else if (m_scene.TestBorderCross(pos2, Cardinals.N)) + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix); + } + else + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix); + } + } + else if (m_scene.TestBorderCross(pos2, Cardinals.E)) + { + if (m_scene.TestBorderCross(pos2, Cardinals.S)) + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix); + } + else if (m_scene.TestBorderCross(pos2, Cardinals.N)) + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix); + } + else + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix); + } + } + else if (m_scene.TestBorderCross(pos2, Cardinals.S)) + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix); + } + else if (m_scene.TestBorderCross(pos2, Cardinals.N)) + { + needsTransit = true; + neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix); + } + + // Makes sure avatar does not end up outside region + if (neighbor <= 0) + { + if (needsTransit) + { + if (m_requestedSitTargetUUID == UUID.Zero) + { + bool isFlying = Flying; + RemoveFromPhysicalScene(); + + Vector3 pos = AbsolutePosition; + if (AbsolutePosition.X < 0) + pos.X += Velocity.X * 2; + else if (AbsolutePosition.X > Constants.RegionSize) + pos.X -= Velocity.X * 2; + if (AbsolutePosition.Y < 0) + pos.Y += Velocity.Y * 2; + else if (AbsolutePosition.Y > Constants.RegionSize) + pos.Y -= Velocity.Y * 2; + Velocity = Vector3.Zero; + AbsolutePosition = pos; + + m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); + + AddToPhysicalScene(isFlying); + } + } + } + else if (neighbor > 0) + { + if (!CrossToNewRegion()) + { + if (m_requestedSitTargetUUID == UUID.Zero) + { + bool isFlying = Flying; + RemoveFromPhysicalScene(); + + Vector3 pos = AbsolutePosition; + if (AbsolutePosition.X < 0) + pos.X += Velocity.X * 2; + else if (AbsolutePosition.X > Constants.RegionSize) + pos.X -= Velocity.X * 2; + if (AbsolutePosition.Y < 0) + pos.Y += Velocity.Y * 2; + else if (AbsolutePosition.Y > Constants.RegionSize) + pos.Y -= Velocity.Y * 2; + Velocity = Vector3.Zero; + AbsolutePosition = pos; + + AddToPhysicalScene(isFlying); + } + } + } + } + else + { + // This constant has been inferred from experimentation + // I'm not sure what this value should be, so I tried a few values. + timeStep = 0.04f; + pos2 = AbsolutePosition; + pos2.X = pos2.X + (vel.X * timeStep); + pos2.Y = pos2.Y + (vel.Y * timeStep); + // Don't touch the Z + m_pos = pos2; + m_log.DebugFormat("[SCENE PRESENCE]: In transit m_pos={0}", m_pos); + } + } } /// From 2347593dac0d435851fb1437b87c42a5fd4f9060 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 22 Dec 2011 16:48:52 +0000 Subject: [PATCH 04/37] Harmonizing SP with Avination --- .../Region/Framework/Scenes/ScenePresence.cs | 100 ++++++++++-------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 040cbfcc3b..c578fc02f7 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -118,7 +118,7 @@ namespace OpenSim.Region.Framework.Scenes /// TODO: For some reason, we effectively have a list both here and in Appearance. Need to work out if this is /// necessary. /// - protected List m_attachments = new List(); + private List m_attachments = new List(); public Object AttachmentsSyncLock { get; private set; } @@ -550,8 +550,12 @@ namespace OpenSim.Region.Framework.Scenes } } - m_pos = value; - ParentPosition = Vector3.Zero; + // Don't update while sitting + if (ParentID == 0) + { + m_pos = value; + ParentPosition = Vector3.Zero; + } //m_log.DebugFormat( // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", @@ -566,6 +570,13 @@ namespace OpenSim.Region.Framework.Scenes public Vector3 OffsetPosition { get { return m_pos; } + set + { + // There is no offset position when not seated + if (ParentID == 0) + return; + m_pos = value; + } } /// @@ -2740,8 +2751,10 @@ namespace OpenSim.Region.Framework.Scenes if (IsChildAgent) return; - // We only do this if we have a physics actor or we're sitting on something - if (ParentID == 0 && PhysicsActor != null || ParentID != 0) + if (ParentID != 0) + return; + + if (!IsInTransit) { Vector3 pos2 = AbsolutePosition; Vector3 vel = Velocity; @@ -3100,30 +3113,28 @@ namespace OpenSim.Region.Framework.Scenes catch { } // Attachment objects - lock (m_attachments) + List attachments = GetAttachments(); + if (attachments.Count > 0) { - if (m_attachments.Count > 0) - { - cAgent.AttachmentObjects = new List(); - cAgent.AttachmentObjectStates = new List(); - // IScriptModule se = m_scene.RequestModuleInterface(); - InTransitScriptStates.Clear(); + cAgent.AttachmentObjects = new List(); + cAgent.AttachmentObjectStates = new List(); +// IScriptModule se = m_scene.RequestModuleInterface(); + InTransitScriptStates.Clear(); - foreach (SceneObjectGroup sog in m_attachments) - { - // We need to make a copy and pass that copy - // because of transfers withn the same sim - ISceneObject clone = sog.CloneForNewScene(); - // Attachment module assumes that GroupPosition holds the offsets...! - ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; - ((SceneObjectGroup)clone).IsAttachment = false; - cAgent.AttachmentObjects.Add(clone); - string state = sog.GetStateSnapshot(); - cAgent.AttachmentObjectStates.Add(state); - InTransitScriptStates.Add(state); - // Let's remove the scripts of the original object here - sog.RemoveScriptInstances(true); - } + foreach (SceneObjectGroup sog in attachments) + { + // We need to make a copy and pass that copy + // because of transfers withn the same sim + ISceneObject clone = sog.CloneForNewScene(); + // Attachment module assumes that GroupPosition holds the offsets...! + ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; + ((SceneObjectGroup)clone).IsAttachment = false; + cAgent.AttachmentObjects.Add(clone); + string state = sog.GetStateSnapshot(); + cAgent.AttachmentObjectStates.Add(state); + InTransitScriptStates.Add(state); + // Let's remove the scripts of the original object here + sog.RemoveScriptInstances(true); } } } @@ -3531,26 +3542,29 @@ namespace OpenSim.Region.Framework.Scenes /// The arguments for the event public void SendScriptEventToAttachments(string eventName, Object[] args) { - if (m_scriptEngines.Length == 0) - return; - - lock (m_attachments) + Util.FireAndForget(delegate(object x) { - foreach (SceneObjectGroup grp in m_attachments) - { - // 16384 is CHANGED_ANIMATION - // - // Send this to all attachment root prims - // - foreach (IScriptModule m in m_scriptEngines) - { - if (m == null) // No script engine loaded - continue; + if (m_scriptEngines.Length == 0) + return; - m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION }); + lock (m_attachments) + { + foreach (SceneObjectGroup grp in m_attachments) + { + // 16384 is CHANGED_ANIMATION + // + // Send this to all attachment root prims + // + foreach (IScriptModule m in m_scriptEngines) + { + if (m == null) // No script engine loaded + continue; + + m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION }); + } } } - } + }); } internal void PushForce(Vector3 impulse) From 6412349decb36a7278528477bacb5b71534ad657 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 22 Dec 2011 16:51:51 +0000 Subject: [PATCH 05/37] Add a few comments, correct a merge artefact --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c578fc02f7..fc6eb6d73d 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -570,6 +570,8 @@ namespace OpenSim.Region.Framework.Scenes public Vector3 OffsetPosition { get { return m_pos; } + // Don't remove setter. It's not currently used in core but + // upcoming Avination code needs it. set { // There is no offset position when not seated @@ -2751,7 +2753,10 @@ namespace OpenSim.Region.Framework.Scenes if (IsChildAgent) return; - if (ParentID != 0) + // If we don't have a PhysActor, we can't cross anyway + // Also don't do this while sat, sitting avatars cross with the + // object they sit on. + if (ParentID != 0 || PhysActor == null) return; if (!IsInTransit) From 7f527814d524fe6b0fb5243dbdb558e5b661e4a5 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 22 Dec 2011 16:57:49 +0000 Subject: [PATCH 06/37] And a typo fix --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index fc6eb6d73d..3d1c1b5ce4 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2756,7 +2756,7 @@ namespace OpenSim.Region.Framework.Scenes // If we don't have a PhysActor, we can't cross anyway // Also don't do this while sat, sitting avatars cross with the // object they sit on. - if (ParentID != 0 || PhysActor == null) + if (ParentID != 0 || PhysicsActor == null) return; if (!IsInTransit) From 469955889ed5499ed1dbb8fcc224d6912c651d06 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 22 Dec 2011 09:30:06 -0800 Subject: [PATCH 07/37] Region crossings redone: (1) removed WaitForCallback. Now that we are passing the entire agent with attachs in one big message we don't necessarily need to wait for confirmation. The callback sometimes is problematic and it adds delay to the process. (2) Z velocity sent to the viewer = 0. This is an heuristic; the Z velocity usually is negative, and it makes the viewer move the avie down. This only matters while the agent is in transit and therefore not being physically simulated by neither region. As soon as the receiving region receives CompleteMovement from the viewer, the position and velocity get corrected. --- .../EntityTransfer/EntityTransferModule.cs | 71 +++++++++---------- 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 87f292c102..b9d5d325ab 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -676,9 +676,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer Vector3 eastCross = new Vector3(boundaryDistance, 0, 0); Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0); - // distance to edge that will trigger crossing - - // distance into new region to place avatar const float enterDistance = 0.5f; @@ -960,29 +957,31 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat( "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); - - pos = pos + (agent.Velocity); - + + pos = pos + agent.Velocity; + Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); + + agent.RemoveFromPhysicalScene(); SetInTransit(agent.UUID); - AgentData cAgent = new AgentData(); + + AgentData cAgent = new AgentData(); agent.CopyTo(cAgent); cAgent.Position = pos; if (isFlying) cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; - cAgent.CallbackURI = m_scene.RegionInfo.ServerURI + - "agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/"; - + + // We don't need the callback anymnore + cAgent.CallbackURI = String.Empty; + if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) { // region doesn't take it ReInstantiateScripts(agent); + agent.AddToPhysicalScene(isFlying); ResetFromTransit(agent.UUID); return agent; } - // Next, let's close the child agent connections that are too far away. - agent.CloseChildAgents(neighbourx, neighboury); - //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); agent.ControllingClient.RequestClientInfo(); @@ -999,11 +998,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); - + IEventQueue eq = agent.Scene.RequestModuleInterface(); if (eq != null) { - eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, + eq.CrossRegion(neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, capsPath, agent.UUID, agent.ControllingClient.SessionId); } else @@ -1011,32 +1010,26 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, capsPath); } - - if (!WaitForCallback(agent.UUID)) - { - m_log.Debug("[ENTITY TRANSFER MODULE]: Callback never came in crossing agent"); - ReInstantiateScripts(agent); - ResetFromTransit(agent.UUID); - - // Yikes! We should just have a ref to scene here. - //agent.Scene.InformClientOfNeighbours(agent); - EnableChildAgents(agent); - - return agent; - } - + + // SUCCESS! agent.MakeChildAgent(); - + ResetFromTransit(agent.UUID); + // now we have a child agent in this region. Request all interesting data about other (root) agents agent.SendOtherAgentsAvatarDataToMe(); agent.SendOtherAgentsAppearanceToMe(); - - // Backwards compatibility + + // Backwards compatibility. Best effort if (version == "Unknown" || version == string.Empty) { - m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old neighbor, passing attachments one by one..."); + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); + Thread.Sleep(3000); // wait a little now that we're not waiting for the callback CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); } + + + // Next, let's close the child agent connections that are too far away. + agent.CloseChildAgents(neighbourx, neighboury); AgentHasMovedAway(agent, false); @@ -1069,16 +1062,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; ScenePresence agent = icon.EndInvoke(iar); - // If the cross was successful, this agent is a child agent - if (agent.IsChildAgent) - agent.Reset(); - else // Not successful - agent.RestoreInCurrentScene(); + //// If the cross was successful, this agent is a child agent + //if (agent.IsChildAgent) + // agent.Reset(); + //else // Not successful + // agent.RestoreInCurrentScene(); // In any case agent.IsInTransit = false; - //m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); + m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); } #endregion From 48113f0fc811f21f4a113176caa9dbd78c0d3446 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Dec 2011 19:44:52 +0000 Subject: [PATCH 08/37] Make it possible to force all prims to be phantom via the collidable_prim boolean setting in the OpenSim.ini config [Startup] section. Naturally, default is true. When set to false, "phantom" flags on prims can be set as usual but all prims remain phantom. This setting is for test purposes. This switch does not affect the collision of avatars with the terrain. --- OpenSim/Region/Framework/Scenes/Scene.cs | 9 +++++++++ OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 5 ++++- bin/OpenSimDefaults.ini | 5 +++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6666328271..96e6863727 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -79,6 +79,14 @@ namespace OpenSim.Region.Framework.Scenes /// public bool m_physicalPrim; + /// + /// Controls whether prims can be collided with. + /// + /// + /// If this is set to false then prims cannot be subject to physics either. + /// + public bool CollidablePrims { get; private set; } + public float m_maxNonphys = 256; public float m_maxPhys = 10; public bool m_clampPrimSize; @@ -651,6 +659,7 @@ namespace OpenSim.Region.Framework.Scenes m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); m_physicalPrim = startupConfig.GetBoolean("physical_prim", true); + CollidablePrims = startupConfig.GetBoolean("collidable_prim", true); m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); if (RegionInfo.NonphysPrimMax > 0) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index b29ecc6465..8fd136d373 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1473,6 +1473,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive) { + if (!ParentGroup.Scene.CollidablePrims) + return; + // m_log.DebugFormat( // "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}", // Name, LocalId, UUID, m_physicalPrim); @@ -4318,7 +4321,7 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup.Scene == null) return; - if (PhysActor == null) + if (ParentGroup.Scene.CollidablePrims && PhysActor == null) { // It's not phantom anymore. So make sure the physics engine get's knowledge of it PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape( diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 972efe4ae2..3e7f8a626f 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -181,6 +181,11 @@ ; ## PHYSICS ; ## + ; If true then prims can be collided with by avatars, other prims, etc. + ; If false then all prims are phantom, no matter whether their phantom flag is checked or unchecked. + ; Also, no prims are subject to physics. + collidable_prim = true + ; If true then prims can be made subject to physics (gravity, pushing, etc.). ; If false then physics flag can be set but it is not honoured. However, prims are still solid for the purposes of collision direction physical_prim = true From f7dbdba447cf91b03749c09d24709b03bc9f7831 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Dec 2011 19:52:09 +0000 Subject: [PATCH 09/37] Remove unused m_physicalPrim parameter from SOG.ApplyPhysics() --- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 1 - OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index a3e4b4638c..1e2901b835 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -333,7 +333,6 @@ namespace OpenSim.Region.Framework.Scenes if (rot != null) sceneObject.UpdateGroupRotationR((Quaternion)rot); - //group.ApplyPhysics(m_physicalPrim); if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero) { sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index abea7883da..0585477dcc 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -669,7 +669,7 @@ namespace OpenSim.Region.Framework.Scenes //m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID); } - ApplyPhysics(m_scene.m_physicalPrim); + ApplyPhysics(); // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled // for the same object with very different properties. The caller must schedule the update. @@ -1239,8 +1239,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Apply physics to this group /// - /// - public void ApplyPhysics(bool m_physicalPrim) + public void ApplyPhysics() { // Apply physics to the root prim m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive); From 7ccd8f8f1d8accb0c5f67e9e3bc9a43fbbfd93e2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Dec 2011 19:57:50 +0000 Subject: [PATCH 10/37] rename Scene.m_physicalPrim to PhysicalPrims since its public and access external as a property --- OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++-- OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 96e6863727..b4972d60ba 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -77,7 +77,7 @@ namespace OpenSim.Region.Framework.Scenes /// Controls whether physics can be applied to prims. Even if false, prims still have entries in a /// PhysicsScene in order to perform collision detection /// - public bool m_physicalPrim; + public bool PhysicalPrims { get; private set; } /// /// Controls whether prims can be collided with. @@ -658,7 +658,7 @@ namespace OpenSim.Region.Framework.Scenes //Animation states m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); - m_physicalPrim = startupConfig.GetBoolean("physical_prim", true); + PhysicalPrims = startupConfig.GetBoolean("physical_prim", true); CollidablePrims = startupConfig.GetBoolean("collidable_prim", true); m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 8fd136d373..aea47e6407 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1742,7 +1742,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) { - if (!ParentGroup.Scene.m_physicalPrim && UsePhysics) + if (!ParentGroup.Scene.PhysicalPrims && UsePhysics) return; if (IsJoint()) From 790ca65c84b8597b20f63ba48556c0fb2141a4f0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Dec 2011 20:22:15 +0000 Subject: [PATCH 11/37] Align default ODE_STEPSIZE with that already used through OpenSimDefaults.ini --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 04ba7380a0..2194ff0fe0 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -110,7 +110,7 @@ namespace OpenSim.Region.Physics.OdePlugin private const uint m_regionWidth = Constants.RegionSize; private const uint m_regionHeight = Constants.RegionSize; - private float ODE_STEPSIZE = 0.020f; + private float ODE_STEPSIZE = 0.0178f; private float metersInSpace = 29.9f; private float m_timeDilation = 1.0f; @@ -456,7 +456,7 @@ namespace OpenSim.Region.Physics.OdePlugin mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f); mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f); - ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); + ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); avDensity = physicsconfig.GetFloat("av_density", 80f); From 6b08c051a33d97d94d9c68d287926939f1a5d6b2 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 22 Dec 2011 15:31:51 -0800 Subject: [PATCH 12/37] Enables processing of hypergrid links through simiangrid services. Thanks otakup0pe --- .../SimianGrid/SimianGridServiceConnector.cs | 77 +++++++++++++------ 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index 918544f1f6..67a65ff623 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs @@ -341,26 +341,54 @@ namespace OpenSim.Services.Connectors.SimianGrid public List GetHyperlinks(UUID scopeID) { - // Hypergrid/linked regions are not supported - return new List(); + List foundRegions = new List(); + + NameValueCollection requestArgs = new NameValueCollection + { + { "RequestMethod", "GetScenes" }, + { "HyperGrid", "true" }, + { "Enabled", "1" } + }; + + OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); + if (response["Success"].AsBoolean()) + { + // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] found regions with name {0}",name); + + OSDArray array = response["Scenes"] as OSDArray; + if (array != null) + { + for (int i = 0; i < array.Count; i++) + { + GridRegion region = ResponseToGridRegion(array[i] as OSDMap); + if (region != null) + foundRegions.Add(region); + } + } + } + + return foundRegions; } - + public int GetRegionFlags(UUID scopeID, UUID regionID) { - const int REGION_ONLINE = 4; - NameValueCollection requestArgs = new NameValueCollection { { "RequestMethod", "GetScene" }, { "SceneID", regionID.ToString() } }; - // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString()); + m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString()); OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); if (response["Success"].AsBoolean()) { - return response["Enabled"].AsBoolean() ? REGION_ONLINE : 0; + OSDMap extraData = response["ExtraData"] as OSDMap; + int enabled = response["Enabled"].AsBoolean() ? (int) OpenSim.Data.RegionFlags.RegionOnline : 0; + int hypergrid = extraData["HyperGrid"].AsBoolean() ? (int) OpenSim.Data.RegionFlags.Hyperlink : 0; + int flags = enabled | hypergrid; + m_log.DebugFormat("[SGGC] enabled - {0} hg - {1} flags - {2}", enabled, hypergrid, flags); + return flags; } else { @@ -411,24 +439,27 @@ namespace OpenSim.Services.Connectors.SimianGrid Vector3d minPosition = response["MinPosition"].AsVector3d(); region.RegionLocX = (int)minPosition.X; region.RegionLocY = (int)minPosition.Y; + + if ( ! extraData["HyperGrid"] ) { + Uri httpAddress = response["Address"].AsUri(); + region.ExternalHostName = httpAddress.Host; + region.HttpPort = (uint)httpAddress.Port; - Uri httpAddress = response["Address"].AsUri(); - region.ExternalHostName = httpAddress.Host; - region.HttpPort = (uint)httpAddress.Port; + IPAddress internalAddress; + IPAddress.TryParse(extraData["InternalAddress"].AsString(), out internalAddress); + if (internalAddress == null) + internalAddress = IPAddress.Any; - region.ServerURI = extraData["ServerURI"].AsString(); - - IPAddress internalAddress; - IPAddress.TryParse(extraData["InternalAddress"].AsString(), out internalAddress); - if (internalAddress == null) - internalAddress = IPAddress.Any; - - region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger()); - region.TerrainImage = extraData["MapTexture"].AsUUID(); - region.Access = (byte)extraData["Access"].AsInteger(); - region.RegionSecret = extraData["RegionSecret"].AsString(); - region.EstateOwner = extraData["EstateOwner"].AsUUID(); - region.Token = extraData["Token"].AsString(); + region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger()); + region.TerrainImage = extraData["MapTexture"].AsUUID(); + region.Access = (byte)extraData["Access"].AsInteger(); + region.RegionSecret = extraData["RegionSecret"].AsString(); + region.EstateOwner = extraData["EstateOwner"].AsUUID(); + region.Token = extraData["Token"].AsString(); + region.ServerURI = extraData["ServerURI"].AsString(); + } else { + region.ServerURI = response["Address"]; + } return region; } From f394cb2e8f1605809dbf3d5503b9ae00dc1f5180 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 22 Dec 2011 16:21:32 -0800 Subject: [PATCH 13/37] fix the UsesPhysics flag to reference the physics flag rather than the temponrez flag --- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 0585477dcc..886076499b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -210,7 +210,7 @@ namespace OpenSim.Region.Framework.Scenes /// public bool UsesPhysics { - get { return (RootPart.Flags & PrimFlags.TemporaryOnRez) != 0; } + get { return (RootPart.Flags & PrimFlags.Physics) != 0; } } /// From 456c89a7a30c5c2ec2e228beb717b9c611106364 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 22 Dec 2011 16:59:51 -0800 Subject: [PATCH 14/37] Fixes some problems with objects that attempt to cross a region boundary into a region that does not exist. This is particularly problematic for physical objects where the velocity continues to move them out of the region causing an infinite number of failed region crossings. The patch forces an object that fails a crossing to be non-physical and moves it back into the starting region. --- .../EntityTransfer/EntityTransferModule.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index b9d5d325ab..098e5cb747 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1705,6 +1705,30 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer uint x = 0, y = 0; Utils.LongToUInts(newRegionHandle, out x, out y); GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); + + if (destination == null || !CrossPrimGroupIntoNewRegion(destination, grp, silent)) + { + m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID); + + // We are going to move the object back to the old position so long as the old position + // is in the region + oldGroupPosition.X = Util.Clamp(oldGroupPosition.X,1.0f,(float)Constants.RegionSize-1); + oldGroupPosition.Y = Util.Clamp(oldGroupPosition.Y,1.0f,(float)Constants.RegionSize-1); + oldGroupPosition.Z = Util.Clamp(oldGroupPosition.Z,1.0f,4096.0f); + + grp.RootPart.GroupPosition = oldGroupPosition; + + // Need to turn off the physics flags, otherwise the object will continue to attempt to + // move out of the region creating an infinite loop of failed attempts to cross + grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false); + + grp.ScheduleGroupForFullUpdate(); + } + + + + + if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent)) { grp.RootPart.GroupPosition = oldGroupPosition; From c6ce464dbc64dc24878a8032412e82b02b9314f6 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Fri, 23 Dec 2011 10:13:32 -0800 Subject: [PATCH 15/37] remove the old region crossing handler --- .../Framework/EntityTransfer/EntityTransferModule.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 098e5cb747..cbef6ce47b 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1724,16 +1724,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer grp.ScheduleGroupForFullUpdate(); } - - - - - - if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent)) - { - grp.RootPart.GroupPosition = oldGroupPosition; - grp.ScheduleGroupForFullUpdate(); - } } From 26bb95fe3d5239c183bc3b312ef05e73fc06749c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 23 Dec 2011 10:58:30 -0800 Subject: [PATCH 16/37] HG: AAdded a few missing /'s at the end of URLs --- OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs | 2 +- .../Connectors/SimianGrid/SimianAssetServiceConnector.cs | 2 ++ .../Connectors/SimianGrid/SimianInventoryServiceConnector.cs | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs index 7cfd6e8df3..ff1dd5f9ff 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs @@ -53,7 +53,7 @@ namespace OpenSim.Services.Connectors public virtual string Helo() { - HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI + "/helo"); + HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI + "/helo/"); // Eventually we need to switch to HEAD /* req.Method = "HEAD"; */ diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 9573e215cd..99523a1231 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs @@ -86,6 +86,8 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianAssetServiceConnector(string url) { + if (!url.EndsWith("/") && !url.EndsWith("=")) + url = url + '/'; m_serverUrl = url; } diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs index 39df1f5233..f828abbb58 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs @@ -92,7 +92,10 @@ namespace OpenSim.Services.Connectors.SimianGrid public SimianInventoryServiceConnector(string url) { + if (!url.EndsWith("/") && !url.EndsWith("=")) + url = url + '/'; m_serverUrl = url; + } public void Initialise(IConfigSource source) From f9a1fd5748a0f33adad3b8b06702f9474dbf6908 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 23 Dec 2011 15:08:13 -0800 Subject: [PATCH 17/37] HG: one more adjustment with trailing /s --- .../Framework/InventoryAccess/HGAssetMapper.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs index 81b65c5727..d20c9eb0a0 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs @@ -73,7 +73,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess public AssetBase FetchAsset(string url, UUID assetID) { - AssetBase asset = m_scene.AssetService.Get(url + "/" + assetID.ToString()); + if (!url.EndsWith("/") && !url.EndsWith("=")) + url = url + "/"; + + AssetBase asset = m_scene.AssetService.Get(url + assetID.ToString()); if (asset != null) { @@ -87,6 +90,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess { if (asset != null) { + if (!url.EndsWith("/") && !url.EndsWith("=")) + url = url + "/"; + // See long comment in AssetCache.AddAsset if (!asset.Temporary || asset.Local) { @@ -99,7 +105,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess Copy(asset, asset1); try { - asset1.ID = url + "/" + asset.ID; + asset1.ID = url + asset.ID; } catch { From b6cfe15c7c0b3697709179cbbf32818576919642 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 24 Dec 2011 07:44:26 -0800 Subject: [PATCH 18/37] HG: more / love for Xmas --- .../Region/ClientStack/Linden/UDP/J2KImage.cs | 7 +++-- .../Asset/HGAssetServiceConnector.cs | 21 +++++++++++++-- .../Hypergrid/HeloServiceConnector.cs | 27 +++++++++++++++++-- prebuild.xml | 1 + 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs index e9e2dca34b..1dea87e091 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs @@ -385,8 +385,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP string assetServerURL = string.Empty; if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL)) { - m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", id); - AssetService.Get(assetServerURL + "/" + id, InventoryAccessModule, AssetReceived); + if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("=")) + assetServerURL = assetServerURL + "/"; + + m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", assetServerURL + id); + AssetService.Get(assetServerURL + id, InventoryAccessModule, AssetReceived); return; } } diff --git a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs index 5c31639ac2..bb5d51fa59 100644 --- a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs @@ -29,7 +29,9 @@ using log4net; using Nini.Config; using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Reflection; +using System.Web; using OpenSim.Framework; using OpenSim.Services.Interfaces; using OpenSim.Services.Connectors.Hypergrid; @@ -73,11 +75,26 @@ namespace OpenSim.Services.Connectors if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) && assetUri.Scheme == Uri.UriSchemeHttp) { - url = "http://" + assetUri.Authority; - assetID = assetUri.LocalPath.Trim(new char[] {'/'}); + // Simian + if (assetUri.Query != string.Empty) + { + NameValueCollection qscoll = HttpUtility.ParseQueryString(assetUri.Query); + assetID = qscoll["id"]; + if (assetID != null) + url = id.Replace(assetID, ""); // Malformed again, as simian expects + else + url = id; // !!! best effort + } + else // robust + { + url = "http://" + assetUri.Authority; + assetID = assetUri.LocalPath.Trim(new char[] { '/' }); + } + return true; } + m_log.DebugFormat("[HG ASSET SERVICE]: Malformed URL {0}", id); return false; } diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs index ff1dd5f9ff..8ac89ccbbe 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs @@ -47,13 +47,36 @@ namespace OpenSim.Services.Connectors public HeloServicesConnector(string serverURI) { - m_ServerURI = serverURI.TrimEnd('/'); + if (!serverURI.EndsWith("=")) + m_ServerURI = serverURI.TrimEnd('/') + "/helo/"; + else + { + // Simian sends malformed urls like this: + // http://valley.virtualportland.org/simtest/Grid/?id= + // + try + { + Uri uri = new Uri(serverURI + "xxx"); + if (uri.Query == string.Empty) + m_ServerURI = serverURI.TrimEnd('/') + "/helo/"; + else + { + serverURI = serverURI + "xxx"; + m_ServerURI = serverURI.Replace("?" + uri.Query, ""); + m_ServerURI = m_ServerURI.TrimEnd('/') + "/helo/"; + } + } + catch (UriFormatException e) + { + m_log.WarnFormat("[HELO SERVICE]: Malformed URL {0}", serverURI); + } + } } public virtual string Helo() { - HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI + "/helo/"); + HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI); // Eventually we need to switch to HEAD /* req.Method = "HEAD"; */ diff --git a/prebuild.xml b/prebuild.xml index e951187111..4ea47080d7 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -926,6 +926,7 @@ ../../../bin/ + From f36fe45fa7468dd6e785d523c5df38666140135f Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 25 Dec 2011 00:04:42 -0500 Subject: [PATCH 19/37] Add Copy task to Prebuild.exe (vsxxxx targets) --- Prebuild/COPYING | 130 +- Prebuild/NEWS | 400 +-- Prebuild/Prebuild.exe | Bin 0 -> 226816 bytes Prebuild/README | 548 ++--- Prebuild/prebuild.xml | 6 +- Prebuild/scripts/SharpDevelop2.bat | 8 +- Prebuild/scripts/VS2008.bat | 8 +- Prebuild/scripts/VS2010.bat | 8 +- Prebuild/scripts/autotools.bat | 8 +- Prebuild/src/Core/Nodes/CleanFilesNode.cs | 158 +- Prebuild/src/Core/Nodes/CleanupNode.cs | 168 +- .../Core/Nodes/ConfigurationNodeCollection.cs | 142 +- .../src/Core/Nodes/DatabaseProjectNode.cs | 186 +- .../src/Core/Nodes/DatabaseReferenceNode.cs | 126 +- Prebuild/src/Core/Nodes/FileNode.cs | 9 +- Prebuild/src/Core/Nodes/FilesNode.cs | 34 + Prebuild/src/Core/Nodes/MatchNode.cs | 17 +- Prebuild/src/Core/Targets/AutotoolsTarget.cs | 2140 ++++++++--------- Prebuild/src/Core/Targets/DebugTarget.cs | 2 +- Prebuild/src/Core/Targets/VS2010Target.cs | 276 +-- Prebuild/src/Core/Targets/VSGenericTarget.cs | 1894 ++++++++------- Prebuild/src/Prebuild.cs | 2 +- Prebuild/src/data/prebuild-1.7.xsd | 700 +++--- Prebuild/src/data/prebuild-1.9.xsd | 672 +++--- bin/Prebuild.exe | Bin 228352 -> 226816 bytes 25 files changed, 3873 insertions(+), 3769 deletions(-) create mode 100755 Prebuild/Prebuild.exe diff --git a/Prebuild/COPYING b/Prebuild/COPYING index c57c080b15..d3cdf7e38e 100644 --- a/Prebuild/COPYING +++ b/Prebuild/COPYING @@ -1,65 +1,65 @@ -BSD License -Copyright (c)2004-2008 - -See AUTHORS file for list of copyright holders - -Dave Hudson (jendave@yahoo.com), -Matthew Holmes (matthew@wildfiregames.com) -Dan Moorehead (dan05a@gmail.com) -Rob Loach (http://www.robloach.net) -C.J. Adams-Collier (cjac@colliertech.org) - -http://dnpb.sourceforge.net -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote - products derived from this software without specific prior written - permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "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 - COPYRIGHT OWNER OR 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. - ---- - -Portions of src/Core/Targets/AutotoolsTarget.cs -// Copyright (C) 2006 Novell, Inc (http://www.novell.com) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +BSD License +Copyright (c)2004-2008 + +See AUTHORS file for list of copyright holders + +Dave Hudson (jendave@yahoo.com), +Matthew Holmes (matthew@wildfiregames.com) +Dan Moorehead (dan05a@gmail.com) +Rob Loach (http://www.robloach.net) +C.J. Adams-Collier (cjac@colliertech.org) + +http://dnpb.sourceforge.net +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. 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. + +3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "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 + COPYRIGHT OWNER OR 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. + +--- + +Portions of src/Core/Targets/AutotoolsTarget.cs +// Copyright (C) 2006 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Prebuild/NEWS b/Prebuild/NEWS index 3ab3108b4c..bea28dac26 100644 --- a/Prebuild/NEWS +++ b/Prebuild/NEWS @@ -1,200 +1,200 @@ -Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, MonoDevelop, and NAnt. - -Documentation and downloads are available at http://dnpb.sourceforge.net. - -Prebuild is licensed under the BSD license. - -[ XXXXXXX XX, XXX - 1.3.2 ] - + Added Keyfile signing to NAnt target and VS2005 target - + Updated XSD file to 1.7 - + Boo and VisualBasic Language support in VS2005 target - + Added basic Autotools target. It creates a non-recursive Autotools system. - ! Multiple files can be excluded from the Match node - ! VS2005 now handles .resx files correctly. - ! NAnt and Autotools now handle defines - ! NAnt and Autotools now handle resources - + Conditional XML variables can be passed through the command line. - + Added /install and /remove command line flags to install and remove assemblies from the GAC - + Many fixes to VS2005 target - -[ July 21, 2006 - 1.3.1 ] - ! VS2005 fixes from Rob Loach - ! NAnt fixes from Rob Loach and David Hudson - ! XML doc fixes from Rob Loach - + Added SharpDevelop2 target (really just uses VS2005 target) - ! Fixed bug with BuildEvents in Monodevelop target - + Passing /yes will default to answering yes to any warnings - -[ February 28, 2006 - 1.3 ] - + Added MonoDevelop target. - + Added NAnt target. - + Lots of fixes to all targets. - * Cleaned up the code using FXCop. - * Updated schema to 1.6 to fix a typo and add a new parameter. - * jendave is now the maintainer of the project. RobLoach has been added as a developer. - * Removed references to 'dnpb'. - + Added rudimentary support for pre- and post- build scripts - * Updated examples. - -[ August 5, 2004 - 1.2 ] - + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages - + Added the allowedgroups command line option followed by a pipe-delimited list of project group filter flags (eg. Group1|Group2) allow optional filtering of all projects that dont have at least one of these flags - + Added the filterGroups XML attribute to the project node and updated the scheme to v1.5 for this addition, it is used to specified the delimited list of filter groups to which a project belongs - * Modified the removedir command line option to allow for a pipe-delimited list of directory names - ! Modified the resource loading code to search for resourced without the prepended namespace (as Visual Studio .NET does it) to allow for it to be compiled with SharpDevelop as well - + Added the GenerateXmlDocFile boolean option to the Options XML element - * Changed the behavior of the XmlDocFile option so that if not specified it uses the assemblyName (without file extension) + .xml for the file name instead of just not generating the file since the new GenerateXmlDocFile takes care of this - -[ January 3, 2004 - 1.1 ] - ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems - + Added the checkOsVars attribute to the root element for enabling interpolation for Enviroment variables in the form ${var}, otherwise no checking is performed for efficiency-sake - * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version - -[ December 30, 2004 - 1.1 ] - ! Applied Leed's fix for SharpDevelop references - + Rewrote much of the processing for better validation and without the use of a temp file - + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs - * Changed all spaces into tabs - + Added support for the None build action - * Replaced all sequence's in the XML schema for all's because the order doesn't matter since the xml file is loaded into an XmlDocument - -[ December 25, 2004 - 1.0 ] - + Added the /removedir option for cleaning directories like obj before file releases - + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds - * Made path optional for Match elements (defaults to current directory) and updates schema for it - ! Fixed XML example in the readme.txt - + Added example xml files to docs directory - * Updated license.txt to add Dan Moorehead and update copyright years - + Updated prebuild.xml to take advantage of the default path attribute for match elements - + Updated Clean to delete the obj directories - -[ December 25, 2004 - 0.13 ] - + Added dnpb.exe so that it can be used to generate the project files - + Added dnpb.ico - * Added parameterless Write statement to Log for writing a single line - * Changed scehema to version 1.3 for support of icon attribute - * Added support for All configuration name under a Project node signifying common settings for all configurations - ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode - * Wrote documentation in docs/readme.txt - * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 - * Updated prebuild.xml - * Optimized Log class - * Updated OutputUsage() - * /clean targets all by default - * No log file is used by default, /log without value specified uses default file name - + Added support for the /pause which pauses the utility after execution to observe output - - -[ September 27, 2004 - 0.12.2a ] - ! Fixed a nasty bug when trying to delete our temp file for pre-processing. - -[ September 15, 2004 - 0.12.2 ] - + Expanded platform identification, thanks to the NAnt guys for shedding some - light on how to properly check for UNIX platforms! Thanks guys! - * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", - and "Unknown". - ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of - the Project tag. - + New command-line switch, /ppo, forces DNPB to pre-process the file and write - the pre-processed file. This allows you to test/debug your pre-processor - macros. No other processing will be done. You can specify a target file as - a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' - if you do not specify a file. - + The Match tag now has a 'buildAction' attribute which functions exactly like - the attribute of the same name for the File tag. - -[ August 5, 2004 - 0.12.1 ] - + Added environment variable expansion for all values. Environment variables - should be listed in the form ${VAR}. - -[ July 30, 2004 - 0.12.0 ] - + Added preprocessing via XML processing information tags. Available tags - are: ?>, ?>, and . The - current expression parser is very basic, but will be replaced with a more - capable parser over time. Current operators available are: =, !=, <, >, - <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, - RuntimeMinor, RuntimeRevision. - -[ July 27, 2004 - 0.11.4 ] - + Added 'useRegex' attribute to the Match tag. Matches can now use regular - expressions to match filenames. - + Added the 'assemblyName' attribute to the Project tag. Projects can now - set their output assembly name. - ! Fixed several bugs in the way that Project tags inheirt their parent - Solutions configuration options. This operation should now work fully as - intended. - ! Due to some wierdness, Project Guid's are now stored as part of the Project - node and created at parse time. - -[ May 11, 2004 - 0.11.3 ] - ! Fixed a bug where I was writing the wrong property name for a projects root - namespace. - ! Removed a DEBUG statement I had left in the code in 0.11.2. - ! Fixed a bug in the VS2002 writer which caused the version variables to not - be overriden correctly. - + Added the rootNamespace property to the element, allowing you to - specify the root namespace. - * /target and /clean are now mutually exclusive command line switches, and - they both now take the all option. In the case of /target all, all build - file for all targets will be created. In the case of /clean all, the user - will be prompted to make sure they want to do it, and if so, will clean - all build files for all targets. - -[ April 22, 2004 - 0.11.2 ] - ! Fixed a bug with the /file command-line operator. Was using the unresolved - file path rather then the resolved one, was making the attempt to open the - dnpb file fail. - ! Fixed a bug in the schema that required at least 1 solution and 1 reference - path. We can do just fine with 0 of either of these. Some files may be all - statements and not have any tags. - ! Fixed a bug that caused the project references not to be written with the - SharpDevelop target. - * Changed the schema to version 1.2, allowing for Configuration nodes to exist - under project nodes. The inheritance of values is hierarchical. Meaning, if - you define a configuration named Debug at the Soltion level, and one by the - same name at the Project level, the one at the Project level will first - inherit the options of the Solution level configuration, then set it's own - options. If you define a configuration at the Project level and it does not - exist at the Solution level, it will be created at the Solution level. - * Project references should now work correctly across the board. Note that due - to a restriction in Visual Studio, you can only reference projects in the same - solution. - -[ April 21, 2004 - 0.11.1 ] - ! Fixed a problem with resolving paths in various targets. Was not properly - setting the CWD. - * Schema updated to 1.1, moving the ReferencePath element from the Options - element to the Project element. This makes more logical sense, given that - reference paths are resolved relative to the project path. Any prebuild.xml - file referecning verison 1.0 will fail! Please update to the 1.1 schema. - -[ April 19, 2004 - 0.11.0 ] - * Added several attributes across the code to make FxCop happy - ! Fixed bugs in reference paths being written in the VS targets. - ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of - a Push/Pop pair. Was wreaking havoc with tags. - ! Fixed some bugs in the path tracking, both the Project and Solution nodes now - have a FullPath property, which is the full path to the file resolved at load - time. This should fix all path relativity problems. - + Added new /clean switch, allowing the target to clean up any files it generated. - in accordance, the ITarget interface has been updated to support a new Clean() - method. - + Completed addition of the tag, to allow the referencing of external - prebuild.xml files. - + Added the runtime attribute to the Project element. This allows the developer - to specify which runtime a project should target (Mono or Microsoft). This is - of course ignored in certain targets like the Visual Studio targets. - + Added the SharpDevelop target. - -[ April 13, 2004 - 0.10.1a ] - + Added the buildAction attribute to the File node. This is needed for dnpb - to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) - -[ April 13, 2004 - 0.10.1 ] - * First Release - -[ Key ] -* = Change or information -+ = Addition -! = Bug Fix - +Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, MonoDevelop, and NAnt. + +Documentation and downloads are available at http://dnpb.sourceforge.net. + +Prebuild is licensed under the BSD license. + +[ XXXXXXX XX, XXX - 1.3.2 ] + + Added Keyfile signing to NAnt target and VS2005 target + + Updated XSD file to 1.7 + + Boo and VisualBasic Language support in VS2005 target + + Added basic Autotools target. It creates a non-recursive Autotools system. + ! Multiple files can be excluded from the Match node + ! VS2005 now handles .resx files correctly. + ! NAnt and Autotools now handle defines + ! NAnt and Autotools now handle resources + + Conditional XML variables can be passed through the command line. + + Added /install and /remove command line flags to install and remove assemblies from the GAC + + Many fixes to VS2005 target + +[ July 21, 2006 - 1.3.1 ] + ! VS2005 fixes from Rob Loach + ! NAnt fixes from Rob Loach and David Hudson + ! XML doc fixes from Rob Loach + + Added SharpDevelop2 target (really just uses VS2005 target) + ! Fixed bug with BuildEvents in Monodevelop target + + Passing /yes will default to answering yes to any warnings + +[ February 28, 2006 - 1.3 ] + + Added MonoDevelop target. + + Added NAnt target. + + Lots of fixes to all targets. + * Cleaned up the code using FXCop. + * Updated schema to 1.6 to fix a typo and add a new parameter. + * jendave is now the maintainer of the project. RobLoach has been added as a developer. + * Removed references to 'dnpb'. + + Added rudimentary support for pre- and post- build scripts + * Updated examples. + +[ August 5, 2004 - 1.2 ] + + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages + + Added the allowedgroups command line option followed by a pipe-delimited list of project group filter flags (eg. Group1|Group2) allow optional filtering of all projects that dont have at least one of these flags + + Added the filterGroups XML attribute to the project node and updated the scheme to v1.5 for this addition, it is used to specified the delimited list of filter groups to which a project belongs + * Modified the removedir command line option to allow for a pipe-delimited list of directory names + ! Modified the resource loading code to search for resourced without the prepended namespace (as Visual Studio .NET does it) to allow for it to be compiled with SharpDevelop as well + + Added the GenerateXmlDocFile boolean option to the Options XML element + * Changed the behavior of the XmlDocFile option so that if not specified it uses the assemblyName (without file extension) + .xml for the file name instead of just not generating the file since the new GenerateXmlDocFile takes care of this + +[ January 3, 2004 - 1.1 ] + ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems + + Added the checkOsVars attribute to the root element for enabling interpolation for Enviroment variables in the form ${var}, otherwise no checking is performed for efficiency-sake + * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version + +[ December 30, 2004 - 1.1 ] + ! Applied Leed's fix for SharpDevelop references + + Rewrote much of the processing for better validation and without the use of a temp file + + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs + * Changed all spaces into tabs + + Added support for the None build action + * Replaced all sequence's in the XML schema for all's because the order doesn't matter since the xml file is loaded into an XmlDocument + +[ December 25, 2004 - 1.0 ] + + Added the /removedir option for cleaning directories like obj before file releases + + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds + * Made path optional for Match elements (defaults to current directory) and updates schema for it + ! Fixed XML example in the readme.txt + + Added example xml files to docs directory + * Updated license.txt to add Dan Moorehead and update copyright years + + Updated prebuild.xml to take advantage of the default path attribute for match elements + + Updated Clean to delete the obj directories + +[ December 25, 2004 - 0.13 ] + + Added dnpb.exe so that it can be used to generate the project files + + Added dnpb.ico + * Added parameterless Write statement to Log for writing a single line + * Changed scehema to version 1.3 for support of icon attribute + * Added support for All configuration name under a Project node signifying common settings for all configurations + ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode + * Wrote documentation in docs/readme.txt + * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 + * Updated prebuild.xml + * Optimized Log class + * Updated OutputUsage() + * /clean targets all by default + * No log file is used by default, /log without value specified uses default file name + + Added support for the /pause which pauses the utility after execution to observe output + + +[ September 27, 2004 - 0.12.2a ] + ! Fixed a nasty bug when trying to delete our temp file for pre-processing. + +[ September 15, 2004 - 0.12.2 ] + + Expanded platform identification, thanks to the NAnt guys for shedding some + light on how to properly check for UNIX platforms! Thanks guys! + * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", + and "Unknown". + ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of + the Project tag. + + New command-line switch, /ppo, forces DNPB to pre-process the file and write + the pre-processed file. This allows you to test/debug your pre-processor + macros. No other processing will be done. You can specify a target file as + a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' + if you do not specify a file. + + The Match tag now has a 'buildAction' attribute which functions exactly like + the attribute of the same name for the File tag. + +[ August 5, 2004 - 0.12.1 ] + + Added environment variable expansion for all values. Environment variables + should be listed in the form ${VAR}. + +[ July 30, 2004 - 0.12.0 ] + + Added preprocessing via XML processing information tags. Available tags + are: ?>, ?>, and . The + current expression parser is very basic, but will be replaced with a more + capable parser over time. Current operators available are: =, !=, <, >, + <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, + RuntimeMinor, RuntimeRevision. + +[ July 27, 2004 - 0.11.4 ] + + Added 'useRegex' attribute to the Match tag. Matches can now use regular + expressions to match filenames. + + Added the 'assemblyName' attribute to the Project tag. Projects can now + set their output assembly name. + ! Fixed several bugs in the way that Project tags inheirt their parent + Solutions configuration options. This operation should now work fully as + intended. + ! Due to some wierdness, Project Guid's are now stored as part of the Project + node and created at parse time. + +[ May 11, 2004 - 0.11.3 ] + ! Fixed a bug where I was writing the wrong property name for a projects root + namespace. + ! Removed a DEBUG statement I had left in the code in 0.11.2. + ! Fixed a bug in the VS2002 writer which caused the version variables to not + be overriden correctly. + + Added the rootNamespace property to the element, allowing you to + specify the root namespace. + * /target and /clean are now mutually exclusive command line switches, and + they both now take the all option. In the case of /target all, all build + file for all targets will be created. In the case of /clean all, the user + will be prompted to make sure they want to do it, and if so, will clean + all build files for all targets. + +[ April 22, 2004 - 0.11.2 ] + ! Fixed a bug with the /file command-line operator. Was using the unresolved + file path rather then the resolved one, was making the attempt to open the + dnpb file fail. + ! Fixed a bug in the schema that required at least 1 solution and 1 reference + path. We can do just fine with 0 of either of these. Some files may be all + statements and not have any tags. + ! Fixed a bug that caused the project references not to be written with the + SharpDevelop target. + * Changed the schema to version 1.2, allowing for Configuration nodes to exist + under project nodes. The inheritance of values is hierarchical. Meaning, if + you define a configuration named Debug at the Soltion level, and one by the + same name at the Project level, the one at the Project level will first + inherit the options of the Solution level configuration, then set it's own + options. If you define a configuration at the Project level and it does not + exist at the Solution level, it will be created at the Solution level. + * Project references should now work correctly across the board. Note that due + to a restriction in Visual Studio, you can only reference projects in the same + solution. + +[ April 21, 2004 - 0.11.1 ] + ! Fixed a problem with resolving paths in various targets. Was not properly + setting the CWD. + * Schema updated to 1.1, moving the ReferencePath element from the Options + element to the Project element. This makes more logical sense, given that + reference paths are resolved relative to the project path. Any prebuild.xml + file referecning verison 1.0 will fail! Please update to the 1.1 schema. + +[ April 19, 2004 - 0.11.0 ] + * Added several attributes across the code to make FxCop happy + ! Fixed bugs in reference paths being written in the VS targets. + ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of + a Push/Pop pair. Was wreaking havoc with tags. + ! Fixed some bugs in the path tracking, both the Project and Solution nodes now + have a FullPath property, which is the full path to the file resolved at load + time. This should fix all path relativity problems. + + Added new /clean switch, allowing the target to clean up any files it generated. + in accordance, the ITarget interface has been updated to support a new Clean() + method. + + Completed addition of the tag, to allow the referencing of external + prebuild.xml files. + + Added the runtime attribute to the Project element. This allows the developer + to specify which runtime a project should target (Mono or Microsoft). This is + of course ignored in certain targets like the Visual Studio targets. + + Added the SharpDevelop target. + +[ April 13, 2004 - 0.10.1a ] + + Added the buildAction attribute to the File node. This is needed for dnpb + to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) + +[ April 13, 2004 - 0.10.1 ] + * First Release + +[ Key ] +* = Change or information ++ = Addition +! = Bug Fix + diff --git a/Prebuild/Prebuild.exe b/Prebuild/Prebuild.exe new file mode 100755 index 0000000000000000000000000000000000000000..bdb25b6ebcb85cccccc6611a7c2f7aab6b03c87f GIT binary patch literal 226816 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

Wi4$P$jPQ;n@;q{>wgzw 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 E16+s2&j0`b literal 0 HcmV?d00001 diff --git a/Prebuild/README b/Prebuild/README index e8a2d69530..2b05fb598d 100644 --- a/Prebuild/README +++ b/Prebuild/README @@ -1,274 +1,274 @@ -Prebuild Instructions - -Prebuild is an XML-driven pre-build tool allowing developers to easily generate project or make files for major IDE's and .NET development tools including: Visual Studio 2005, Visual Studio 2003, Visual Studio 2002, SharpDevelop, SharpDevelop2, MonoDevelop, and NAnt. - -_______________________________________________________________________________ -Overview - -Prebuild can be either be run from the command line to generate the -project and make files or you can execute the included batch (*.bat) -and Unix Shell script (*.sh) files. - -_______________________________________________________________________________ -The currently supported developement tools and their associated batch -and shell script files. - -Visual Studio .NET 2005 (VS2005.bat) -Visual Studio .NET 2003 (VS2003.bat) -Visual Studio .NET 2002 (VS2002.bat) -SharpDevelop (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ -SharpDevelop2 (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ -MonoDevelop (MonoDevelop.sh) - http://www.monodevelop.com/ -NAnt (nant.sh and nant.bat) - http://nant.sourceforge.net/ -Autotools (autotools.bat and autotools.sh) - http://en.wikipedia.org/wiki/GNU_build_system - -Notes: - -A Unix Shell script is provided for MonoDevelop, as it does not run on -Windows at this time. - -Visual Studio .NET 2005 and the Visual Express IDE's can import -solutions from older versions of Visual Studio .NET. - -Makefiles are not currently supported. - -_______________________________________________________________________________ -Command Line Syntax: - -Example: -> Prebuild /target vs2003 - -This will generate the project files for Visual Studio.NET 2003 and -place the redirect the log to a file named PrebuildLog.txt in the -parent directory - - -The syntax structure is as below, where commandParameter is optional -depending on the command and you can provide several option-value -pairs. - -Note: The '> ' signifies the command prompt, do not enter this literally - -> Prebuild /

- /// Gets the signature. - /// - /// The signature. - public string Pattern - { - get - { - return m_Pattern; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if (node == null) - { - throw new ArgumentNullException("node"); - } - - m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; - m_Pattern = m_Pattern.Trim(); - } - - #endregion - } +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.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. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("CleanFiles")] + public class CleanFilesNode : DataNode + { + #region Fields + + private string m_Pattern; + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public string Pattern + { + get + { + return m_Pattern; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if (node == null) + { + throw new ArgumentNullException("node"); + } + + m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; + m_Pattern = m_Pattern.Trim(); + } + + #endregion + } } \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/CleanupNode.cs b/Prebuild/src/Core/Nodes/CleanupNode.cs index b8131b0ebb..a9b77eb105 100644 --- a/Prebuild/src/Core/Nodes/CleanupNode.cs +++ b/Prebuild/src/Core/Nodes/CleanupNode.cs @@ -1,85 +1,85 @@ -#region BSD License -/* -Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.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. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ -#endregion - -using System; -using System.Collections.Generic; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; - -namespace Prebuild.Core.Nodes -{ - [DataNode("Cleanup")] - public class CleanupNode : DataNode - { - #region Fields - - private List m_CleanFiles = new List(); - - #endregion - - #region Properties - - /// - /// Gets the signature. - /// - /// The signature. - public List CleanFiles - { - get - { - return m_CleanFiles; - } - } - - #endregion - - #region Public Methods - - /// - /// Parses the specified node. - /// - /// The node. - public override void Parse(XmlNode node) - { - if( node == null ) - { - throw new ArgumentNullException("node"); - } - - foreach (XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - if (dataNode is CleanFilesNode) - { - m_CleanFiles.Add((CleanFilesNode)dataNode); - } - } - } - - #endregion - } +#region BSD License +/* +Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.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. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; + +namespace Prebuild.Core.Nodes +{ + [DataNode("Cleanup")] + public class CleanupNode : DataNode + { + #region Fields + + private List m_CleanFiles = new List(); + + #endregion + + #region Properties + + /// + /// Gets the signature. + /// + /// The signature. + public List CleanFiles + { + get + { + return m_CleanFiles; + } + } + + #endregion + + #region Public Methods + + /// + /// Parses the specified node. + /// + /// The node. + public override void Parse(XmlNode node) + { + if( node == null ) + { + throw new ArgumentNullException("node"); + } + + foreach (XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + if (dataNode is CleanFilesNode) + { + m_CleanFiles.Add((CleanFilesNode)dataNode); + } + } + } + + #endregion + } } \ No newline at end of file diff --git a/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs index 1c38d9e443..7c59ac5050 100644 --- a/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs +++ b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs @@ -1,71 +1,71 @@ -#region BSD License -/* -Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) - -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. -* The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ -#endregion - -using System.Collections.Generic; - -namespace Prebuild.Core.Nodes -{ - /// - /// Implements a specialized list of configuration nodes which allows for lookup via - /// configuration name and platform. - /// - public class ConfigurationNodeCollection : List - { - #region Properties - - public ConfigurationNode this[string nameAndPlatform] - { - get - { - foreach (ConfigurationNode configurationNode in this) - { - if (configurationNode.NameAndPlatform == nameAndPlatform) - { - return configurationNode; - } - } - - return null; - } - - set - { - // See if the node - ConfigurationNode configurationNode = this[nameAndPlatform]; - - if (configurationNode != null) - { - this[IndexOf(configurationNode)] = value; - } - else - { - Add(value); - } - } - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) + +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. +* The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ +#endregion + +using System.Collections.Generic; + +namespace Prebuild.Core.Nodes +{ + /// + /// Implements a specialized list of configuration nodes which allows for lookup via + /// configuration name and platform. + /// + public class ConfigurationNodeCollection : List + { + #region Properties + + public ConfigurationNode this[string nameAndPlatform] + { + get + { + foreach (ConfigurationNode configurationNode in this) + { + if (configurationNode.NameAndPlatform == nameAndPlatform) + { + return configurationNode; + } + } + + return null; + } + + set + { + // See if the node + ConfigurationNode configurationNode = this[nameAndPlatform]; + + if (configurationNode != null) + { + this[IndexOf(configurationNode)] = value; + } + else + { + Add(value); + } + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs index 278ecd81ce..20095c36de 100644 --- a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs +++ b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs @@ -1,93 +1,93 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Xml; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - [DataNode("DatabaseProject")] - public class DatabaseProjectNode : DataNode - { - string name; - string path; - string fullpath; - Guid guid = Guid.NewGuid(); - readonly List authors = new List(); - readonly List references = new List(); - - public Guid Guid - { - get { return guid; } - } - - public string Name - { - get { return name; } - } - - public string Path - { - get { return path; } - } - - public string FullPath - { - get { return fullpath; } - } - - public IEnumerable References - { - get { return references; } - } - - public override void Parse(XmlNode node) - { - name = Helper.AttributeValue(node, "name", name); - path = Helper.AttributeValue(node, "path", name); - - try - { - fullpath = Helper.ResolvePath(path); - } - catch - { - throw new WarningException("Could not resolve Solution path: {0}", path); - } - - Kernel.Instance.CurrentWorkingDirectory.Push(); - - try - { - Helper.SetCurrentDir(fullpath); - - if (node == null) - { - throw new ArgumentNullException("node"); - } - - foreach (XmlNode child in node.ChildNodes) - { - IDataNode dataNode = Kernel.Instance.ParseNode(child, this); - - if (dataNode == null) - continue; - - if (dataNode is AuthorNode) - authors.Add((AuthorNode)dataNode); - else if (dataNode is DatabaseReferenceNode) - references.Add((DatabaseReferenceNode)dataNode); - } - } - finally - { - Kernel.Instance.CurrentWorkingDirectory.Pop(); - } - - base.Parse(node); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseProject")] + public class DatabaseProjectNode : DataNode + { + string name; + string path; + string fullpath; + Guid guid = Guid.NewGuid(); + readonly List authors = new List(); + readonly List references = new List(); + + public Guid Guid + { + get { return guid; } + } + + public string Name + { + get { return name; } + } + + public string Path + { + get { return path; } + } + + public string FullPath + { + get { return fullpath; } + } + + public IEnumerable References + { + get { return references; } + } + + public override void Parse(XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + path = Helper.AttributeValue(node, "path", name); + + try + { + fullpath = Helper.ResolvePath(path); + } + catch + { + throw new WarningException("Could not resolve Solution path: {0}", path); + } + + Kernel.Instance.CurrentWorkingDirectory.Push(); + + try + { + Helper.SetCurrentDir(fullpath); + + if (node == null) + { + throw new ArgumentNullException("node"); + } + + foreach (XmlNode child in node.ChildNodes) + { + IDataNode dataNode = Kernel.Instance.ParseNode(child, this); + + if (dataNode == null) + continue; + + if (dataNode is AuthorNode) + authors.Add((AuthorNode)dataNode); + else if (dataNode is DatabaseReferenceNode) + references.Add((DatabaseReferenceNode)dataNode); + } + } + finally + { + Kernel.Instance.CurrentWorkingDirectory.Pop(); + } + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs index 845db24b12..97c3964b8e 100644 --- a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs +++ b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs @@ -1,63 +1,63 @@ -using System; -using Prebuild.Core.Attributes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Nodes -{ - [DataNode("DatabaseReference")] - public class DatabaseReferenceNode : DataNode - { - string name; - Guid providerId; - string connectionString; - - public string Name - { - get { return name; } - } - - public Guid ProviderId - { - get { return providerId; } - } - - public string ConnectionString - { - get { return connectionString; } - } - - public override void Parse(System.Xml.XmlNode node) - { - name = Helper.AttributeValue(node, "name", name); - - string providerName = Helper.AttributeValue(node, "providerName", string.Empty); - if (providerName != null) - { - switch (providerName) - { - // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* - // Not sure if these will help other operating systems, or if there's a better way. - case "Microsoft.SqlServerCe.Client.3.5": - providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; - case "System.Data.OleDb": - providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; - case "System.Data.OracleClient": - providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; - case "System.Data.SqlClient": - providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; - case "System.Data.Odbc": - providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; - - default: - throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); - } - } - else - providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); - - connectionString = Helper.AttributeValue(node, "connectionString", connectionString); - - base.Parse(node); - } - } -} +using System; +using Prebuild.Core.Attributes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Nodes +{ + [DataNode("DatabaseReference")] + public class DatabaseReferenceNode : DataNode + { + string name; + Guid providerId; + string connectionString; + + public string Name + { + get { return name; } + } + + public Guid ProviderId + { + get { return providerId; } + } + + public string ConnectionString + { + get { return connectionString; } + } + + public override void Parse(System.Xml.XmlNode node) + { + name = Helper.AttributeValue(node, "name", name); + + string providerName = Helper.AttributeValue(node, "providerName", string.Empty); + if (providerName != null) + { + switch (providerName) + { + // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* + // Not sure if these will help other operating systems, or if there's a better way. + case "Microsoft.SqlServerCe.Client.3.5": + providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; + case "System.Data.OleDb": + providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; + case "System.Data.OracleClient": + providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; + case "System.Data.SqlClient": + providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; + case "System.Data.Odbc": + providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; + + default: + throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); + } + } + else + providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); + + connectionString = Helper.AttributeValue(node, "connectionString", connectionString); + + base.Parse(node); + } + } +} diff --git a/Prebuild/src/Core/Nodes/FileNode.cs b/Prebuild/src/Core/Nodes/FileNode.cs index 01cea1ebdb..b313ffac75 100644 --- a/Prebuild/src/Core/Nodes/FileNode.cs +++ b/Prebuild/src/Core/Nodes/FileNode.cs @@ -62,7 +62,11 @@ namespace Prebuild.Core.Nodes /// /// /// - Page + Page, + /// + /// + /// + Copy } ///
@@ -245,6 +249,9 @@ namespace Prebuild.Core.Nodes if (subType != String.Empty) m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); + Console.WriteLine("[FileNode]:BuildAction is {0}", buildAction); + + m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); if ( this.m_Link == true ) diff --git a/Prebuild/src/Core/Nodes/FilesNode.cs b/Prebuild/src/Core/Nodes/FilesNode.cs index 23a716cfde..16658f38f2 100644 --- a/Prebuild/src/Core/Nodes/FilesNode.cs +++ b/Prebuild/src/Core/Nodes/FilesNode.cs @@ -25,6 +25,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Xml; using Prebuild.Core.Attributes; @@ -49,6 +50,8 @@ namespace Prebuild.Core.Nodes private readonly Dictionary m_Links = new Dictionary(); private readonly Dictionary m_LinkPaths = new Dictionary(); private readonly Dictionary m_PreservePaths = new Dictionary(); + private readonly Dictionary m_DestinationPath = new Dictionary(); + private readonly NameValueCollection m_CopyFiles = new NameValueCollection(); #endregion @@ -62,6 +65,16 @@ namespace Prebuild.Core.Nodes } } + public string[] Destinations + { + get { return m_CopyFiles.AllKeys; } + } + + public int CopyFiles + { + get { return m_CopyFiles.Count; } + } + #endregion #region Public Methods @@ -76,6 +89,20 @@ namespace Prebuild.Core.Nodes return m_BuildActions[file]; } + public string GetDestinationPath(string file) + { + if( !m_DestinationPath.ContainsKey(file)) + { + return null; + } + return m_DestinationPath[file]; + } + + public string[] SourceFiles(string dest) + { + return m_CopyFiles.GetValues(dest); + } + public CopyToOutput GetCopyToOutput(string file) { if (!m_CopyToOutputs.ContainsKey(file)) @@ -178,6 +205,13 @@ namespace Prebuild.Core.Nodes m_BuildActions[file] = GetBuildActionByFileName(file); else m_BuildActions[file] = matchNode.BuildAction.Value; + + if (matchNode.BuildAction == BuildAction.Copy) + { + m_CopyFiles.Add(matchNode.DestinationPath, file); + m_DestinationPath[file] = matchNode.DestinationPath; + } + m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; m_ResourceNames[ file ] = matchNode.ResourceName; m_PreservePaths[ file ] = matchNode.PreservePath; diff --git a/Prebuild/src/Core/Nodes/MatchNode.cs b/Prebuild/src/Core/Nodes/MatchNode.cs index 9735265f05..000bde93c4 100644 --- a/Prebuild/src/Core/Nodes/MatchNode.cs +++ b/Prebuild/src/Core/Nodes/MatchNode.cs @@ -52,6 +52,7 @@ namespace Prebuild.Core.Nodes private bool m_Link; private string m_LinkPath; private bool m_PreservePath; + private string m_Destination = ""; private readonly List m_Exclusions = new List(); #endregion @@ -80,6 +81,13 @@ namespace Prebuild.Core.Nodes } } + public string DestinationPath + { + get + { + return m_Destination; + } + } /// /// /// @@ -285,12 +293,14 @@ namespace Prebuild.Core.Nodes } string path = Helper.AttributeValue(node, "path", "."); string pattern = Helper.AttributeValue(node, "pattern", "*"); + string destination = Helper.AttributeValue(node, "destination", string.Empty); bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); if (buildAction != string.Empty) m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); - + + //TODO: Figure out where the subtype node is being assigned //string subType = Helper.AttributeValue(node, "subType", string.Empty); //if (subType != String.Empty) @@ -304,11 +314,12 @@ namespace Prebuild.Core.Nodes } m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); + if ( buildAction == "Copy") + m_Destination = destination; if(path != null && path.Length == 0) - { path = ".";//use current directory - } + //throw new WarningException("Match must have a 'path' attribute"); if(pattern == null) diff --git a/Prebuild/src/Core/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs index 485e4dd724..e46b5a5f36 100644 --- a/Prebuild/src/Core/Targets/AutotoolsTarget.cs +++ b/Prebuild/src/Core/Targets/AutotoolsTarget.cs @@ -1,1070 +1,1070 @@ -#region BSD License -/* - -Copyright (c) 2004 - 2008 -Matthew Holmes (matthew@wildfiregames.com), -Dan Moorehead (dan05a@gmail.com), -Dave Hudson (jendave@yahoo.com), -C.J. Adams-Collier (cjac@colliertech.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. - -* The name of the author may not be used to endorse or promote -products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - -*/ -#endregion - -#region MIT X11 license - -/* - Portions of this file authored by Lluis Sanchez Gual - - Copyright (C) 2006 Novell, Inc (http://www.novell.com) - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#endregion -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Xsl; -using System.Net; -using System.Diagnostics; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; - -namespace Prebuild.Core.Targets -{ - public enum ClrVersion - { - Default, - Net_1_1, - Net_2_0 - } - - public class SystemPackage - { - string name; - string version; - string description; - string[] assemblies; - bool isInternal; - ClrVersion targetVersion; - - public void Initialize(string name, - string version, - string description, - string[] assemblies, - ClrVersion targetVersion, - bool isInternal) - { - this.isInternal = isInternal; - this.name = name; - this.version = version; - this.assemblies = assemblies; - this.description = description; - this.targetVersion = targetVersion; - } - - public string Name - { - get { return name; } - } - - public string Version - { - get { return version; } - } - - public string Description - { - get { return description; } - } - - public ClrVersion TargetVersion - { - get { return targetVersion; } - } - - // The package is part of the mono SDK - public bool IsCorePackage - { - get { return name == "mono"; } - } - - // The package has been registered by an add-in, and is not installed - // in the system. - public bool IsInternalPackage - { - get { return isInternal; } - } - - public string[] Assemblies - { - get { return assemblies; } - } - - } - - - /// - /// - /// - [Target("autotools")] - public class AutotoolsTarget : ITarget - { - #region Fields - - Kernel m_Kernel; - XmlDocument autotoolsDoc; - XmlUrlResolver xr; - System.Security.Policy.Evidence e; - readonly Dictionary assemblyPathToPackage = new Dictionary(); - readonly Dictionary assemblyFullNameToPath = new Dictionary(); - readonly Dictionary packagesHash = new Dictionary(); - readonly List packages = new List(); - - #endregion - - #region Private Methods - - private static void mkdirDashP(string dirName) - { - DirectoryInfo di = new DirectoryInfo(dirName); - if (di.Exists) - return; - - string parentDirName = System.IO.Path.GetDirectoryName(dirName); - DirectoryInfo parentDi = new DirectoryInfo(parentDirName); - if (!parentDi.Exists) - mkdirDashP(parentDirName); - - di.Create(); - } - - private static void chkMkDir(string dirName) - { - System.IO.DirectoryInfo di = - new System.IO.DirectoryInfo(dirName); - - if (!di.Exists) - di.Create(); - } - - private void transformToFile(string filename, XsltArgumentList argList, string nodeName) - { - // Create an XslTransform for this file - XslTransform templateTransformer = - new XslTransform(); - - // Load up the template - XmlNode templateNode = - autotoolsDoc.SelectSingleNode(nodeName + "/*"); - templateTransformer.Load(templateNode.CreateNavigator(), xr, e); - - // Create a writer for the transformed template - XmlTextWriter templateWriter = - new XmlTextWriter(filename, null); - - // Perform transformation, writing the file - templateTransformer.Transform - (m_Kernel.CurrentDoc, argList, templateWriter, xr); - } - - static string NormalizeAsmName(string name) - { - int i = name.IndexOf(", PublicKeyToken=null"); - if (i != -1) - return name.Substring(0, i).Trim(); - return name; - } - - private void AddAssembly(string assemblyfile, SystemPackage package) - { - if (!File.Exists(assemblyfile)) - return; - - try - { - System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); - assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; - assemblyPathToPackage[assemblyfile] = package; - } - catch - { - } - } - - private static List GetAssembliesWithLibInfo(string line, string file) - { - List references = new List(); - List libdirs = new List(); - List retval = new List(); - foreach (string piece in line.Split(' ')) - { - if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) - { - references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); - } - else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) - { - libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); - } - } - - foreach (string refrnc in references) - { - foreach (string libdir in libdirs) - { - if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) - { - retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); - } - } - } - - return retval; - } - - private static List GetAssembliesWithoutLibInfo(string line, string file) - { - List references = new List(); - foreach (string reference in line.Split(' ')) - { - if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) - { - string final_ref = reference.Substring(3).Trim(); - references.Add(ProcessPiece(final_ref, file)); - } - } - return references; - } - - private static string ProcessPiece(string piece, string pcfile) - { - int start = piece.IndexOf("${"); - if (start == -1) - return piece; - - int end = piece.IndexOf("}"); - if (end == -1) - return piece; - - string variable = piece.Substring(start + 2, end - start - 2); - string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); - return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); - } - - private static string GetVariableFromPkgConfig(string var, string pcfile) - { - ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); - psi.RedirectStandardOutput = true; - psi.UseShellExecute = false; - psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); - Process p = new Process(); - p.StartInfo = psi; - p.Start(); - string ret = p.StandardOutput.ReadToEnd().Trim(); - p.WaitForExit(); - if (String.IsNullOrEmpty(ret)) - return String.Empty; - return ret; - } - - private void ParsePCFile(string pcfile) - { - // Don't register the package twice - string pname = Path.GetFileNameWithoutExtension(pcfile); - if (packagesHash.ContainsKey(pname)) - return; - - List fullassemblies = null; - string version = ""; - string desc = ""; - - SystemPackage package = new SystemPackage(); - - using (StreamReader reader = new StreamReader(pcfile)) - { - string line; - while ((line = reader.ReadLine()) != null) - { - string lowerLine = line.ToLower(); - if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) - { - string choppedLine = line.Substring(5).Trim(); - if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) - { - fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); - } - else - { - fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); - } - } - else if (lowerLine.StartsWith("version:")) - { - // "version:".Length == 8 - version = line.Substring(8).Trim(); - } - else if (lowerLine.StartsWith("description:")) - { - // "description:".Length == 12 - desc = line.Substring(12).Trim(); - } - } - } - - if (fullassemblies == null) - return; - - foreach (string assembly in fullassemblies) - { - AddAssembly(assembly, package); - } - - package.Initialize(pname, - version, - desc, - fullassemblies.ToArray(), - ClrVersion.Default, - false); - packages.Add(package); - packagesHash[pname] = package; - } - - void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) - { - SystemPackage package = new SystemPackage(); - List list = new List(); - - string dir = Path.Combine(prefix, version); - if (!Directory.Exists(dir)) - { - return; - } - - foreach (string assembly in Directory.GetFiles(dir, "*.dll")) - { - AddAssembly(assembly, package); - list.Add(assembly); - } - - package.Initialize("mono", - version, - "The Mono runtime", - list.ToArray(), - ver, - false); - packages.Add(package); - } - - void RunInitialization() - { - string versionDir; - - if (Environment.Version.Major == 1) - { - versionDir = "1.0"; - } - else - { - versionDir = "2.0"; - } - - //Pull up assemblies from the installed mono system. - string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); - - if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) - prefix = Path.Combine(prefix, "mono"); - else - prefix = Path.GetDirectoryName(prefix); - - RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); - RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); - - string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); - string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); - - if (String.IsNullOrEmpty(libpath)) - { - string path_dirs = Environment.GetEnvironmentVariable("PATH"); - foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) - { - if (pathdir == null) - continue; - if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) - { - libpath = Path.Combine(pathdir, ".."); - libpath = Path.Combine(libpath, "lib"); - libpath = Path.Combine(libpath, "pkgconfig"); - break; - } - } - } - search_dirs += Path.PathSeparator + libpath; - if (!string.IsNullOrEmpty(search_dirs)) - { - List scanDirs = new List(); - foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) - { - if (!scanDirs.Contains(potentialDir)) - scanDirs.Add(potentialDir); - } - foreach (string pcdir in scanDirs) - { - if (pcdir == null) - continue; - - if (Directory.Exists(pcdir)) - { - foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) - { - ParsePCFile(pcfile); - } - } - } - } - } - - private void WriteCombine(SolutionNode solution) - { - #region "Create Solution directory if it doesn't exist" - string solutionDir = Path.Combine(solution.FullPath, - Path.Combine("autotools", - solution.Name)); - chkMkDir(solutionDir); - #endregion - - #region "Write Solution-level files" - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("solutionName", "", solution.Name); - // $solutionDir is $rootDir/$solutionName/ - transformToFile(Path.Combine(solutionDir, "configure.ac"), - argList, "/Autotools/SolutionConfigureAc"); - transformToFile(Path.Combine(solutionDir, "Makefile.am"), - argList, "/Autotools/SolutionMakefileAm"); - transformToFile(Path.Combine(solutionDir, "autogen.sh"), - argList, "/Autotools/SolutionAutogenSh"); - #endregion - - foreach (ProjectNode project in solution.ProjectsTableOrder) - { - m_Kernel.Log.Write(String.Format("Writing project: {0}", - project.Name)); - WriteProject(solution, project); - } - } - - private static string FindFileReference(string refName, - ProjectNode project) - { - foreach (ReferencePathNode refPath in project.ReferencePaths) - { - string fullPath = - Helper.MakeFilePath(refPath.Path, refName, "dll"); - - if (File.Exists(fullPath)) { - return fullPath; - } - } - - return null; - } - - /// - /// Gets the XML doc file. - /// - /// The project. - /// The conf. - /// - public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) - { - if (conf == null) - { - throw new ArgumentNullException("conf"); - } - if (project == null) - { - throw new ArgumentNullException("project"); - } - string docFile = (string)conf.Options["XmlDocFile"]; - // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified - // { - // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; - // } - return docFile; - } - - /// - /// Normalizes the path. - /// - /// The path. - /// - public static string NormalizePath(string path) - { - if (path == null) - { - return ""; - } - - StringBuilder tmpPath; - - if (Core.Parse.Preprocessor.GetOS() == "Win32") - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath.Replace("/", @"\\"); - } - else - { - tmpPath = new StringBuilder(path.Replace('\\', '/')); - tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); - } - return tmpPath.ToString(); - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); - string projectDir = Path.Combine(solutionDir, project.Name); - string projectVersion = project.Version; - bool hasAssemblyConfig = false; - chkMkDir(projectDir); - - List - compiledFiles = new List(), - contentFiles = new List(), - embeddedFiles = new List(), - - binaryLibs = new List(), - pkgLibs = new List(), - systemLibs = new List(), - runtimeLibs = new List(), - - extraDistFiles = new List(), - localCopyTargets = new List(); - - // If there exists a .config file for this assembly, copy - // it to the project folder - - // TODO: Support copying .config.osx files - // TODO: support processing the .config file for native library deps - string projectAssemblyName = project.Name; - if (project.AssemblyName != null) - projectAssemblyName = project.AssemblyName; - - if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) - { - hasAssemblyConfig = true; - System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); - extraDistFiles.Add(project.AssemblyName + ".dll.config"); - } - - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != string.Empty) - { - // Copy snk file into the project's directory - // Use the snk from the project directory directly - string source = Path.Combine(project.FullPath, conf.Options.KeyFile); - string keyFile = conf.Options.KeyFile; - Regex re = new Regex(".*/"); - keyFile = re.Replace(keyFile, ""); - - string dest = Path.Combine(projectDir, keyFile); - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - } - } - - // Copy compiled, embedded and content files into the project's directory - foreach (string filename in project.Files) - { - string source = Path.Combine(project.FullPath, filename); - string dest = Path.Combine(projectDir, filename); - - if (filename.Contains("AssemblyInfo.cs")) - { - // If we've got an AssemblyInfo.cs, pull the version number from it - string[] sources = { source }; - string[] args = { "" }; - Microsoft.CSharp.CSharpCodeProvider cscp = - new Microsoft.CSharp.CSharpCodeProvider(); - - string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); - System.CodeDom.Compiler.CompilerParameters cparam = - new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); - - System.CodeDom.Compiler.CompilerResults cr = - cscp.CompileAssemblyFromFile(cparam, sources); - - foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) - Console.WriteLine("Error! '{0}'", error.ErrorText); - - try { - string projectFullName = cr.CompiledAssembly.FullName; - Regex verRegex = new Regex("Version=([\\d\\.]+)"); - Match verMatch = verRegex.Match(projectFullName); - if (verMatch.Success) - projectVersion = verMatch.Groups[1].Value; - }catch{ - Console.WriteLine("Couldn't compile AssemblyInfo.cs"); - } - - // Clean up the temp file - try - { - if (File.Exists(tempAssemblyFile)) - File.Delete(tempAssemblyFile); - } - catch - { - Console.WriteLine("Error! '{0}'", e); - } - - } - - // Tell the user if there's a problem copying the file - try - { - mkdirDashP(System.IO.Path.GetDirectoryName(dest)); - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException e) - { - Console.WriteLine(e.Message); - } - - switch (project.Files.GetBuildAction(filename)) - { - case BuildAction.Compile: - compiledFiles.Add(filename); - break; - case BuildAction.Content: - contentFiles.Add(filename); - extraDistFiles.Add(filename); - break; - case BuildAction.EmbeddedResource: - embeddedFiles.Add(filename); - break; - } - } - - // Set up references - for (int refNum = 0; refNum < project.References.Count; refNum++) - { - ReferenceNode refr = project.References[refNum]; - Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); - - /* Determine which pkg-config (.pc) file refers to - this assembly */ - - SystemPackage package = null; - - if (packagesHash.ContainsKey(refr.Name)) - { - package = packagesHash[refr.Name]; - - } - else - { - string assemblyFullName = string.Empty; - if (refAssembly != null) - assemblyFullName = refAssembly.FullName; - - string assemblyFileName = string.Empty; - if (assemblyFullName != string.Empty && - assemblyFullNameToPath.ContainsKey(assemblyFullName) - ) - assemblyFileName = - assemblyFullNameToPath[assemblyFullName]; - - if (assemblyFileName != string.Empty && - assemblyPathToPackage.ContainsKey(assemblyFileName) - ) - package = assemblyPathToPackage[assemblyFileName]; - - } - - /* If we know the .pc file and it is not "mono" - (already in the path), add a -pkg: argument */ - - if (package != null && - package.Name != "mono" && - !pkgLibs.Contains(package.Name) - ) - pkgLibs.Add(package.Name); - - string fileRef = - FindFileReference(refr.Name, (ProjectNode)refr.Parent); - - if (refr.LocalCopy || - solution.ProjectsTable.ContainsKey(refr.Name) || - fileRef != null || - refr.Path != null - ) - { - - /* Attempt to copy the referenced lib to the - project's directory */ - - string filename = refr.Name + ".dll"; - string source = filename; - if (refr.Path != null) - source = Path.Combine(refr.Path, source); - source = Path.Combine(project.FullPath, source); - string dest = Path.Combine(projectDir, filename); - - /* Since we depend on this binary dll to build, we - * will add a compile- time dependency on the - * copied dll, and add the dll to the list of - * files distributed with this package - */ - - binaryLibs.Add(refr.Name + ".dll"); - extraDistFiles.Add(refr.Name + ".dll"); - - // TODO: Support copying .config.osx files - // TODO: Support for determining native dependencies - if (File.Exists(source + ".config")) - { - System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); - extraDistFiles.Add(refr.Name + ".dll.config"); - } - - try - { - System.IO.File.Copy(source, dest, true); - } - catch (System.IO.IOException) - { - if (solution.ProjectsTable.ContainsKey(refr.Name)){ - - /* If an assembly is referenced, marked for - * local copy, in the list of projects for - * this solution, but does not exist, put a - * target into the Makefile.am to build the - * assembly and copy it to this project's - * directory - */ - - ProjectNode sourcePrj = - ((solution.ProjectsTable[refr.Name])); - - string target = - String.Format("{0}:\n" + - "\t$(MAKE) -C ../{1}\n" + - "\tln ../{2}/$@ $@\n", - filename, - sourcePrj.Name, - sourcePrj.Name ); - - localCopyTargets.Add(target); - } - } - } - else if( !pkgLibs.Contains(refr.Name) ) - { - // Else, let's assume it's in the GAC or the lib path - string assemName = string.Empty; - int index = refr.Name.IndexOf(","); - - if (index > 0) - assemName = refr.Name.Substring(0, index); - else - assemName = refr.Name; - - m_Kernel.Log.Write(String.Format( - "Warning: Couldn't find an appropriate assembly " + - "for reference:\n'{0}'", refr.Name - )); - systemLibs.Add(assemName); - } - } - - const string lineSep = " \\\n\t"; - string compiledFilesString = string.Empty; - if (compiledFiles.Count > 0) - compiledFilesString = - lineSep + string.Join(lineSep, compiledFiles.ToArray()); - - string embeddedFilesString = ""; - if (embeddedFiles.Count > 0) - embeddedFilesString = - lineSep + string.Join(lineSep, embeddedFiles.ToArray()); - - string contentFilesString = ""; - if (contentFiles.Count > 0) - contentFilesString = - lineSep + string.Join(lineSep, contentFiles.ToArray()); - - string extraDistFilesString = ""; - if (extraDistFiles.Count > 0) - extraDistFilesString = - lineSep + string.Join(lineSep, extraDistFiles.ToArray()); - - string pkgLibsString = ""; - if (pkgLibs.Count > 0) - pkgLibsString = - lineSep + string.Join(lineSep, pkgLibs.ToArray()); - - string binaryLibsString = ""; - if (binaryLibs.Count > 0) - binaryLibsString = - lineSep + string.Join(lineSep, binaryLibs.ToArray()); - - string systemLibsString = ""; - if (systemLibs.Count > 0) - systemLibsString = - lineSep + string.Join(lineSep, systemLibs.ToArray()); - - string localCopyTargetsString = ""; - if (localCopyTargets.Count > 0) - localCopyTargetsString = - string.Join("\n", localCopyTargets.ToArray()); - - string monoPath = ""; - foreach (string runtimeLib in runtimeLibs) - { - monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; - } - - // Add the project name to the list of transformation - // parameters - XsltArgumentList argList = new XsltArgumentList(); - argList.AddParam("projectName", "", project.Name); - argList.AddParam("solutionName", "", solution.Name); - argList.AddParam("assemblyName", "", projectAssemblyName); - argList.AddParam("compiledFiles", "", compiledFilesString); - argList.AddParam("embeddedFiles", "", embeddedFilesString); - argList.AddParam("contentFiles", "", contentFilesString); - argList.AddParam("extraDistFiles", "", extraDistFilesString); - argList.AddParam("pkgLibs", "", pkgLibsString); - argList.AddParam("binaryLibs", "", binaryLibsString); - argList.AddParam("systemLibs", "", systemLibsString); - argList.AddParam("monoPath", "", monoPath); - argList.AddParam("localCopyTargets", "", localCopyTargetsString); - argList.AddParam("projectVersion", "", projectVersion); - argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); - - // Transform the templates - transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); - transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); - transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); - - if (project.Type == Core.Nodes.ProjectType.Library) - transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); - if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) - transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); - } - - private void CleanProject(ProjectNode project) - { - m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); - string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); - Helper.DeleteIfExists(projectFile); - } - - private void CleanSolution(SolutionNode solution) - { - m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); - Helper.DeleteIfExists(slnFile); - - slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); - Helper.DeleteIfExists(slnFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - m_Kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - m_Kernel.Log.Write("Parsing system pkg-config files"); - RunInitialization(); - - const string streamName = "autotools.xml"; - string fqStreamName = String.Format("Prebuild.data.{0}", - streamName - ); - - // Retrieve stream for the autotools template XML - Stream autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(fqStreamName); - - if(autotoolsStream == null) { - - /* - * try without the default namespace prepended, in - * case prebuild.exe assembly was compiled with - * something other than Visual Studio .NET - */ - - autotoolsStream = Assembly.GetExecutingAssembly() - .GetManifestResourceStream(streamName); - if(autotoolsStream == null){ - string errStr = - String.Format("Could not find embedded resource file:\n" + - "'{0}' or '{1}'", - streamName, fqStreamName - ); - - m_Kernel.Log.Write(errStr); - - throw new System.Reflection.TargetException(errStr); - } - } - - // Create an XML URL Resolver with default credentials - xr = new System.Xml.XmlUrlResolver(); - xr.Credentials = CredentialCache.DefaultCredentials; - - // Create a default evidence - no need to limit access - e = new System.Security.Policy.Evidence(); - - // Load the autotools XML - autotoolsDoc = new XmlDocument(); - autotoolsDoc.Load(autotoolsStream); - - /* rootDir is the filesystem location where the Autotools - * build tree will be created - for now we'll make it - * $PWD/autotools - */ - - string pwd = Directory.GetCurrentDirectory(); - //string pwd = System.Environment.GetEnvironmentVariable("PWD"); - //if (pwd.Length != 0) - //{ - string rootDir = Path.Combine(pwd, "autotools"); - //} - //else - //{ - // pwd = Assembly.GetExecutingAssembly() - //} - chkMkDir(rootDir); - - foreach (SolutionNode solution in kern.Solutions) - { - m_Kernel.Log.Write(String.Format("Writing solution: {0}", - solution.Name)); - WriteCombine(solution); - } - m_Kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - m_Kernel = kern; - foreach (SolutionNode sol in kern.Solutions) - { - CleanSolution(sol); - } - m_Kernel = null; - } - - /// - /// Gets the name. - /// - /// The name. - public string Name - { - get - { - return "autotools"; - } - } - - #endregion - } -} +#region BSD License +/* + +Copyright (c) 2004 - 2008 +Matthew Holmes (matthew@wildfiregames.com), +Dan Moorehead (dan05a@gmail.com), +Dave Hudson (jendave@yahoo.com), +C.J. Adams-Collier (cjac@colliertech.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. + +* The name of the author may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + +*/ +#endregion + +#region MIT X11 license + +/* + Portions of this file authored by Lluis Sanchez Gual + + Copyright (C) 2006 Novell, Inc (http://www.novell.com) + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#endregion +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Xsl; +using System.Net; +using System.Diagnostics; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; + +namespace Prebuild.Core.Targets +{ + public enum ClrVersion + { + Default, + Net_1_1, + Net_2_0 + } + + public class SystemPackage + { + string name; + string version; + string description; + string[] assemblies; + bool isInternal; + ClrVersion targetVersion; + + public void Initialize(string name, + string version, + string description, + string[] assemblies, + ClrVersion targetVersion, + bool isInternal) + { + this.isInternal = isInternal; + this.name = name; + this.version = version; + this.assemblies = assemblies; + this.description = description; + this.targetVersion = targetVersion; + } + + public string Name + { + get { return name; } + } + + public string Version + { + get { return version; } + } + + public string Description + { + get { return description; } + } + + public ClrVersion TargetVersion + { + get { return targetVersion; } + } + + // The package is part of the mono SDK + public bool IsCorePackage + { + get { return name == "mono"; } + } + + // The package has been registered by an add-in, and is not installed + // in the system. + public bool IsInternalPackage + { + get { return isInternal; } + } + + public string[] Assemblies + { + get { return assemblies; } + } + + } + + + /// + /// + /// + [Target("autotools")] + public class AutotoolsTarget : ITarget + { + #region Fields + + Kernel m_Kernel; + XmlDocument autotoolsDoc; + XmlUrlResolver xr; + System.Security.Policy.Evidence e; + readonly Dictionary assemblyPathToPackage = new Dictionary(); + readonly Dictionary assemblyFullNameToPath = new Dictionary(); + readonly Dictionary packagesHash = new Dictionary(); + readonly List packages = new List(); + + #endregion + + #region Private Methods + + private static void mkdirDashP(string dirName) + { + DirectoryInfo di = new DirectoryInfo(dirName); + if (di.Exists) + return; + + string parentDirName = System.IO.Path.GetDirectoryName(dirName); + DirectoryInfo parentDi = new DirectoryInfo(parentDirName); + if (!parentDi.Exists) + mkdirDashP(parentDirName); + + di.Create(); + } + + private static void chkMkDir(string dirName) + { + System.IO.DirectoryInfo di = + new System.IO.DirectoryInfo(dirName); + + if (!di.Exists) + di.Create(); + } + + private void transformToFile(string filename, XsltArgumentList argList, string nodeName) + { + // Create an XslTransform for this file + XslTransform templateTransformer = + new XslTransform(); + + // Load up the template + XmlNode templateNode = + autotoolsDoc.SelectSingleNode(nodeName + "/*"); + templateTransformer.Load(templateNode.CreateNavigator(), xr, e); + + // Create a writer for the transformed template + XmlTextWriter templateWriter = + new XmlTextWriter(filename, null); + + // Perform transformation, writing the file + templateTransformer.Transform + (m_Kernel.CurrentDoc, argList, templateWriter, xr); + } + + static string NormalizeAsmName(string name) + { + int i = name.IndexOf(", PublicKeyToken=null"); + if (i != -1) + return name.Substring(0, i).Trim(); + return name; + } + + private void AddAssembly(string assemblyfile, SystemPackage package) + { + if (!File.Exists(assemblyfile)) + return; + + try + { + System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); + assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; + assemblyPathToPackage[assemblyfile] = package; + } + catch + { + } + } + + private static List GetAssembliesWithLibInfo(string line, string file) + { + List references = new List(); + List libdirs = new List(); + List retval = new List(); + foreach (string piece in line.Split(' ')) + { + if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) + { + references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); + } + else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) + { + libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); + } + } + + foreach (string refrnc in references) + { + foreach (string libdir in libdirs) + { + if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) + { + retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); + } + } + } + + return retval; + } + + private static List GetAssembliesWithoutLibInfo(string line, string file) + { + List references = new List(); + foreach (string reference in line.Split(' ')) + { + if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) + { + string final_ref = reference.Substring(3).Trim(); + references.Add(ProcessPiece(final_ref, file)); + } + } + return references; + } + + private static string ProcessPiece(string piece, string pcfile) + { + int start = piece.IndexOf("${"); + if (start == -1) + return piece; + + int end = piece.IndexOf("}"); + if (end == -1) + return piece; + + string variable = piece.Substring(start + 2, end - start - 2); + string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); + return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); + } + + private static string GetVariableFromPkgConfig(string var, string pcfile) + { + ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); + psi.RedirectStandardOutput = true; + psi.UseShellExecute = false; + psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); + Process p = new Process(); + p.StartInfo = psi; + p.Start(); + string ret = p.StandardOutput.ReadToEnd().Trim(); + p.WaitForExit(); + if (String.IsNullOrEmpty(ret)) + return String.Empty; + return ret; + } + + private void ParsePCFile(string pcfile) + { + // Don't register the package twice + string pname = Path.GetFileNameWithoutExtension(pcfile); + if (packagesHash.ContainsKey(pname)) + return; + + List fullassemblies = null; + string version = ""; + string desc = ""; + + SystemPackage package = new SystemPackage(); + + using (StreamReader reader = new StreamReader(pcfile)) + { + string line; + while ((line = reader.ReadLine()) != null) + { + string lowerLine = line.ToLower(); + if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) + { + string choppedLine = line.Substring(5).Trim(); + if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) + { + fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); + } + else + { + fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); + } + } + else if (lowerLine.StartsWith("version:")) + { + // "version:".Length == 8 + version = line.Substring(8).Trim(); + } + else if (lowerLine.StartsWith("description:")) + { + // "description:".Length == 12 + desc = line.Substring(12).Trim(); + } + } + } + + if (fullassemblies == null) + return; + + foreach (string assembly in fullassemblies) + { + AddAssembly(assembly, package); + } + + package.Initialize(pname, + version, + desc, + fullassemblies.ToArray(), + ClrVersion.Default, + false); + packages.Add(package); + packagesHash[pname] = package; + } + + void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) + { + SystemPackage package = new SystemPackage(); + List list = new List(); + + string dir = Path.Combine(prefix, version); + if (!Directory.Exists(dir)) + { + return; + } + + foreach (string assembly in Directory.GetFiles(dir, "*.dll")) + { + AddAssembly(assembly, package); + list.Add(assembly); + } + + package.Initialize("mono", + version, + "The Mono runtime", + list.ToArray(), + ver, + false); + packages.Add(package); + } + + void RunInitialization() + { + string versionDir; + + if (Environment.Version.Major == 1) + { + versionDir = "1.0"; + } + else + { + versionDir = "2.0"; + } + + //Pull up assemblies from the installed mono system. + string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); + + if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) + prefix = Path.Combine(prefix, "mono"); + else + prefix = Path.GetDirectoryName(prefix); + + RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); + RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); + + string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); + string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); + + if (String.IsNullOrEmpty(libpath)) + { + string path_dirs = Environment.GetEnvironmentVariable("PATH"); + foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) + { + if (pathdir == null) + continue; + if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) + { + libpath = Path.Combine(pathdir, ".."); + libpath = Path.Combine(libpath, "lib"); + libpath = Path.Combine(libpath, "pkgconfig"); + break; + } + } + } + search_dirs += Path.PathSeparator + libpath; + if (!string.IsNullOrEmpty(search_dirs)) + { + List scanDirs = new List(); + foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) + { + if (!scanDirs.Contains(potentialDir)) + scanDirs.Add(potentialDir); + } + foreach (string pcdir in scanDirs) + { + if (pcdir == null) + continue; + + if (Directory.Exists(pcdir)) + { + foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) + { + ParsePCFile(pcfile); + } + } + } + } + } + + private void WriteCombine(SolutionNode solution) + { + #region "Create Solution directory if it doesn't exist" + string solutionDir = Path.Combine(solution.FullPath, + Path.Combine("autotools", + solution.Name)); + chkMkDir(solutionDir); + #endregion + + #region "Write Solution-level files" + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("solutionName", "", solution.Name); + // $solutionDir is $rootDir/$solutionName/ + transformToFile(Path.Combine(solutionDir, "configure.ac"), + argList, "/Autotools/SolutionConfigureAc"); + transformToFile(Path.Combine(solutionDir, "Makefile.am"), + argList, "/Autotools/SolutionMakefileAm"); + transformToFile(Path.Combine(solutionDir, "autogen.sh"), + argList, "/Autotools/SolutionAutogenSh"); + #endregion + + foreach (ProjectNode project in solution.ProjectsTableOrder) + { + m_Kernel.Log.Write(String.Format("Writing project: {0}", + project.Name)); + WriteProject(solution, project); + } + } + + private static string FindFileReference(string refName, + ProjectNode project) + { + foreach (ReferencePathNode refPath in project.ReferencePaths) + { + string fullPath = + Helper.MakeFilePath(refPath.Path, refName, "dll"); + + if (File.Exists(fullPath)) { + return fullPath; + } + } + + return null; + } + + /// + /// Gets the XML doc file. + /// + /// The project. + /// The conf. + /// + public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) + { + if (conf == null) + { + throw new ArgumentNullException("conf"); + } + if (project == null) + { + throw new ArgumentNullException("project"); + } + string docFile = (string)conf.Options["XmlDocFile"]; + // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified + // { + // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; + // } + return docFile; + } + + /// + /// Normalizes the path. + /// + /// The path. + /// + public static string NormalizePath(string path) + { + if (path == null) + { + return ""; + } + + StringBuilder tmpPath; + + if (Core.Parse.Preprocessor.GetOS() == "Win32") + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath.Replace("/", @"\\"); + } + else + { + tmpPath = new StringBuilder(path.Replace('\\', '/')); + tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); + } + return tmpPath.ToString(); + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); + string projectDir = Path.Combine(solutionDir, project.Name); + string projectVersion = project.Version; + bool hasAssemblyConfig = false; + chkMkDir(projectDir); + + List + compiledFiles = new List(), + contentFiles = new List(), + embeddedFiles = new List(), + + binaryLibs = new List(), + pkgLibs = new List(), + systemLibs = new List(), + runtimeLibs = new List(), + + extraDistFiles = new List(), + localCopyTargets = new List(); + + // If there exists a .config file for this assembly, copy + // it to the project folder + + // TODO: Support copying .config.osx files + // TODO: support processing the .config file for native library deps + string projectAssemblyName = project.Name; + if (project.AssemblyName != null) + projectAssemblyName = project.AssemblyName; + + if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) + { + hasAssemblyConfig = true; + System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); + extraDistFiles.Add(project.AssemblyName + ".dll.config"); + } + + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != string.Empty) + { + // Copy snk file into the project's directory + // Use the snk from the project directory directly + string source = Path.Combine(project.FullPath, conf.Options.KeyFile); + string keyFile = conf.Options.KeyFile; + Regex re = new Regex(".*/"); + keyFile = re.Replace(keyFile, ""); + + string dest = Path.Combine(projectDir, keyFile); + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + } + } + + // Copy compiled, embedded and content files into the project's directory + foreach (string filename in project.Files) + { + string source = Path.Combine(project.FullPath, filename); + string dest = Path.Combine(projectDir, filename); + + if (filename.Contains("AssemblyInfo.cs")) + { + // If we've got an AssemblyInfo.cs, pull the version number from it + string[] sources = { source }; + string[] args = { "" }; + Microsoft.CSharp.CSharpCodeProvider cscp = + new Microsoft.CSharp.CSharpCodeProvider(); + + string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); + System.CodeDom.Compiler.CompilerParameters cparam = + new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); + + System.CodeDom.Compiler.CompilerResults cr = + cscp.CompileAssemblyFromFile(cparam, sources); + + foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) + Console.WriteLine("Error! '{0}'", error.ErrorText); + + try { + string projectFullName = cr.CompiledAssembly.FullName; + Regex verRegex = new Regex("Version=([\\d\\.]+)"); + Match verMatch = verRegex.Match(projectFullName); + if (verMatch.Success) + projectVersion = verMatch.Groups[1].Value; + }catch{ + Console.WriteLine("Couldn't compile AssemblyInfo.cs"); + } + + // Clean up the temp file + try + { + if (File.Exists(tempAssemblyFile)) + File.Delete(tempAssemblyFile); + } + catch + { + Console.WriteLine("Error! '{0}'", e); + } + + } + + // Tell the user if there's a problem copying the file + try + { + mkdirDashP(System.IO.Path.GetDirectoryName(dest)); + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException e) + { + Console.WriteLine(e.Message); + } + + switch (project.Files.GetBuildAction(filename)) + { + case BuildAction.Compile: + compiledFiles.Add(filename); + break; + case BuildAction.Content: + contentFiles.Add(filename); + extraDistFiles.Add(filename); + break; + case BuildAction.EmbeddedResource: + embeddedFiles.Add(filename); + break; + } + } + + // Set up references + for (int refNum = 0; refNum < project.References.Count; refNum++) + { + ReferenceNode refr = project.References[refNum]; + Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); + + /* Determine which pkg-config (.pc) file refers to + this assembly */ + + SystemPackage package = null; + + if (packagesHash.ContainsKey(refr.Name)) + { + package = packagesHash[refr.Name]; + + } + else + { + string assemblyFullName = string.Empty; + if (refAssembly != null) + assemblyFullName = refAssembly.FullName; + + string assemblyFileName = string.Empty; + if (assemblyFullName != string.Empty && + assemblyFullNameToPath.ContainsKey(assemblyFullName) + ) + assemblyFileName = + assemblyFullNameToPath[assemblyFullName]; + + if (assemblyFileName != string.Empty && + assemblyPathToPackage.ContainsKey(assemblyFileName) + ) + package = assemblyPathToPackage[assemblyFileName]; + + } + + /* If we know the .pc file and it is not "mono" + (already in the path), add a -pkg: argument */ + + if (package != null && + package.Name != "mono" && + !pkgLibs.Contains(package.Name) + ) + pkgLibs.Add(package.Name); + + string fileRef = + FindFileReference(refr.Name, (ProjectNode)refr.Parent); + + if (refr.LocalCopy || + solution.ProjectsTable.ContainsKey(refr.Name) || + fileRef != null || + refr.Path != null + ) + { + + /* Attempt to copy the referenced lib to the + project's directory */ + + string filename = refr.Name + ".dll"; + string source = filename; + if (refr.Path != null) + source = Path.Combine(refr.Path, source); + source = Path.Combine(project.FullPath, source); + string dest = Path.Combine(projectDir, filename); + + /* Since we depend on this binary dll to build, we + * will add a compile- time dependency on the + * copied dll, and add the dll to the list of + * files distributed with this package + */ + + binaryLibs.Add(refr.Name + ".dll"); + extraDistFiles.Add(refr.Name + ".dll"); + + // TODO: Support copying .config.osx files + // TODO: Support for determining native dependencies + if (File.Exists(source + ".config")) + { + System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); + extraDistFiles.Add(refr.Name + ".dll.config"); + } + + try + { + System.IO.File.Copy(source, dest, true); + } + catch (System.IO.IOException) + { + if (solution.ProjectsTable.ContainsKey(refr.Name)){ + + /* If an assembly is referenced, marked for + * local copy, in the list of projects for + * this solution, but does not exist, put a + * target into the Makefile.am to build the + * assembly and copy it to this project's + * directory + */ + + ProjectNode sourcePrj = + ((solution.ProjectsTable[refr.Name])); + + string target = + String.Format("{0}:\n" + + "\t$(MAKE) -C ../{1}\n" + + "\tln ../{2}/$@ $@\n", + filename, + sourcePrj.Name, + sourcePrj.Name ); + + localCopyTargets.Add(target); + } + } + } + else if( !pkgLibs.Contains(refr.Name) ) + { + // Else, let's assume it's in the GAC or the lib path + string assemName = string.Empty; + int index = refr.Name.IndexOf(","); + + if (index > 0) + assemName = refr.Name.Substring(0, index); + else + assemName = refr.Name; + + m_Kernel.Log.Write(String.Format( + "Warning: Couldn't find an appropriate assembly " + + "for reference:\n'{0}'", refr.Name + )); + systemLibs.Add(assemName); + } + } + + const string lineSep = " \\\n\t"; + string compiledFilesString = string.Empty; + if (compiledFiles.Count > 0) + compiledFilesString = + lineSep + string.Join(lineSep, compiledFiles.ToArray()); + + string embeddedFilesString = ""; + if (embeddedFiles.Count > 0) + embeddedFilesString = + lineSep + string.Join(lineSep, embeddedFiles.ToArray()); + + string contentFilesString = ""; + if (contentFiles.Count > 0) + contentFilesString = + lineSep + string.Join(lineSep, contentFiles.ToArray()); + + string extraDistFilesString = ""; + if (extraDistFiles.Count > 0) + extraDistFilesString = + lineSep + string.Join(lineSep, extraDistFiles.ToArray()); + + string pkgLibsString = ""; + if (pkgLibs.Count > 0) + pkgLibsString = + lineSep + string.Join(lineSep, pkgLibs.ToArray()); + + string binaryLibsString = ""; + if (binaryLibs.Count > 0) + binaryLibsString = + lineSep + string.Join(lineSep, binaryLibs.ToArray()); + + string systemLibsString = ""; + if (systemLibs.Count > 0) + systemLibsString = + lineSep + string.Join(lineSep, systemLibs.ToArray()); + + string localCopyTargetsString = ""; + if (localCopyTargets.Count > 0) + localCopyTargetsString = + string.Join("\n", localCopyTargets.ToArray()); + + string monoPath = ""; + foreach (string runtimeLib in runtimeLibs) + { + monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; + } + + // Add the project name to the list of transformation + // parameters + XsltArgumentList argList = new XsltArgumentList(); + argList.AddParam("projectName", "", project.Name); + argList.AddParam("solutionName", "", solution.Name); + argList.AddParam("assemblyName", "", projectAssemblyName); + argList.AddParam("compiledFiles", "", compiledFilesString); + argList.AddParam("embeddedFiles", "", embeddedFilesString); + argList.AddParam("contentFiles", "", contentFilesString); + argList.AddParam("extraDistFiles", "", extraDistFilesString); + argList.AddParam("pkgLibs", "", pkgLibsString); + argList.AddParam("binaryLibs", "", binaryLibsString); + argList.AddParam("systemLibs", "", systemLibsString); + argList.AddParam("monoPath", "", monoPath); + argList.AddParam("localCopyTargets", "", localCopyTargetsString); + argList.AddParam("projectVersion", "", projectVersion); + argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); + + // Transform the templates + transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); + transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); + transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); + + if (project.Type == Core.Nodes.ProjectType.Library) + transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); + if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) + transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); + } + + private void CleanProject(ProjectNode project) + { + m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); + string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); + Helper.DeleteIfExists(projectFile); + } + + private void CleanSolution(SolutionNode solution) + { + m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); + Helper.DeleteIfExists(slnFile); + + slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); + Helper.DeleteIfExists(slnFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + m_Kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + m_Kernel.Log.Write("Parsing system pkg-config files"); + RunInitialization(); + + const string streamName = "autotools.xml"; + string fqStreamName = String.Format("Prebuild.data.{0}", + streamName + ); + + // Retrieve stream for the autotools template XML + Stream autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(fqStreamName); + + if(autotoolsStream == null) { + + /* + * try without the default namespace prepended, in + * case prebuild.exe assembly was compiled with + * something other than Visual Studio .NET + */ + + autotoolsStream = Assembly.GetExecutingAssembly() + .GetManifestResourceStream(streamName); + if(autotoolsStream == null){ + string errStr = + String.Format("Could not find embedded resource file:\n" + + "'{0}' or '{1}'", + streamName, fqStreamName + ); + + m_Kernel.Log.Write(errStr); + + throw new System.Reflection.TargetException(errStr); + } + } + + // Create an XML URL Resolver with default credentials + xr = new System.Xml.XmlUrlResolver(); + xr.Credentials = CredentialCache.DefaultCredentials; + + // Create a default evidence - no need to limit access + e = new System.Security.Policy.Evidence(); + + // Load the autotools XML + autotoolsDoc = new XmlDocument(); + autotoolsDoc.Load(autotoolsStream); + + /* rootDir is the filesystem location where the Autotools + * build tree will be created - for now we'll make it + * $PWD/autotools + */ + + string pwd = Directory.GetCurrentDirectory(); + //string pwd = System.Environment.GetEnvironmentVariable("PWD"); + //if (pwd.Length != 0) + //{ + string rootDir = Path.Combine(pwd, "autotools"); + //} + //else + //{ + // pwd = Assembly.GetExecutingAssembly() + //} + chkMkDir(rootDir); + + foreach (SolutionNode solution in kern.Solutions) + { + m_Kernel.Log.Write(String.Format("Writing solution: {0}", + solution.Name)); + WriteCombine(solution); + } + m_Kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + m_Kernel = kern; + foreach (SolutionNode sol in kern.Solutions) + { + CleanSolution(sol); + } + m_Kernel = null; + } + + /// + /// Gets the name. + /// + /// The name. + public string Name + { + get + { + return "autotools"; + } + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/DebugTarget.cs b/Prebuild/src/Core/Targets/DebugTarget.cs index 650007ecc6..d78064f429 100644 --- a/Prebuild/src/Core/Targets/DebugTarget.cs +++ b/Prebuild/src/Core/Targets/DebugTarget.cs @@ -27,7 +27,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O /* * $Source$ * $Author: jendave $ - * $Date: 2006-09-20 08:42:51 +0100 (Wed, 20 Sep 2006) $ + * $Date: 2006-09-20 03:42:51 -0400 (Wed, 20 Sep 2006) $ * $Revision: 164 $ */ #endregion diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs index b16120c389..ea9f736475 100644 --- a/Prebuild/src/Core/Targets/VS2010Target.cs +++ b/Prebuild/src/Core/Targets/VS2010Target.cs @@ -1,138 +1,138 @@ -using System; -using System.IO; -using System.Text; - -using Prebuild.Core.Attributes; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - [Target("vs2010")] - public class VS2010Target : VSGenericTarget - { - #region Fields - - string solutionVersion = "11.00"; - string productVersion = "9.0.30729"; - string schemaVersion = "2.0"; - string versionName = "Visual Studio 2010"; - string name = "vs2010"; - VSVersion version = VSVersion.VS10; - - #endregion - - #region Properties - - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public override string SolutionVersion - { - get - { - return solutionVersion; - } - } - - /// - /// Gets or sets the product version. - /// - /// The product version. - public override string ProductVersion - { - get - { - return productVersion; - } - } - - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public override string SchemaVersion - { - get - { - return schemaVersion; - } - } - - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public override string VersionName - { - get - { - return versionName; - } - } - - /// - /// Gets or sets the version. - /// - /// The version. - public override VSVersion Version - { - get - { - return version; - } - } - - /// - /// Gets the name. - /// - /// The name. - public override string Name - { - get - { - return name; - } - } - - protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) - { - switch (frameworkVersion) - { - case FrameworkVersion.v4_0: - case FrameworkVersion.v3_5: - return "ToolsVersion=\"4.0\""; - case FrameworkVersion.v3_0: - return "ToolsVersion=\"3.0\""; - default: - return "ToolsVersion=\"2.0\""; - } - } - - public override string SolutionTag - { - get { return "# Visual Studio 2010"; } - } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - public VS2010Target() - : base() - { - } - - #endregion - } -} +using System; +using System.IO; +using System.Text; + +using Prebuild.Core.Attributes; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + [Target("vs2010")] + public class VS2010Target : VSGenericTarget + { + #region Fields + + string solutionVersion = "11.00"; + string productVersion = "9.0.30729"; + string schemaVersion = "2.0"; + string versionName = "Visual Studio 2010"; + string name = "vs2010"; + VSVersion version = VSVersion.VS10; + + #endregion + + #region Properties + + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public override string SolutionVersion + { + get + { + return solutionVersion; + } + } + + /// + /// Gets or sets the product version. + /// + /// The product version. + public override string ProductVersion + { + get + { + return productVersion; + } + } + + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public override string SchemaVersion + { + get + { + return schemaVersion; + } + } + + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public override string VersionName + { + get + { + return versionName; + } + } + + /// + /// Gets or sets the version. + /// + /// The version. + public override VSVersion Version + { + get + { + return version; + } + } + + /// + /// Gets the name. + /// + /// The name. + public override string Name + { + get + { + return name; + } + } + + protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) + { + switch (frameworkVersion) + { + case FrameworkVersion.v4_0: + case FrameworkVersion.v3_5: + return "ToolsVersion=\"4.0\""; + case FrameworkVersion.v3_0: + return "ToolsVersion=\"3.0\""; + default: + return "ToolsVersion=\"2.0\""; + } + } + + public override string SolutionTag + { + get { return "# Visual Studio 2010"; } + } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + public VS2010Target() + : base() + { + } + + #endregion + } +} diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs index cd3f5bbe1d..af61704c40 100644 --- a/Prebuild/src/Core/Targets/VSGenericTarget.cs +++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs @@ -1,922 +1,972 @@ -#region BSD License -/* -Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) - -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. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ -#endregion - -using System; -using System.Collections.Generic; -using System.IO; -using Prebuild.Core.Interfaces; -using Prebuild.Core.Nodes; -using Prebuild.Core.Utilities; -using System.CodeDom.Compiler; - -namespace Prebuild.Core.Targets -{ - - /// - /// - /// - public abstract class VSGenericTarget : ITarget - { - #region Fields - - readonly Dictionary tools = new Dictionary(); - Kernel kernel; - #endregion - - #region Properties - /// - /// Gets or sets the solution version. - /// - /// The solution version. - public abstract string SolutionVersion { get; } - /// - /// Gets or sets the product version. - /// - /// The product version. - public abstract string ProductVersion { get; } - /// - /// Gets or sets the schema version. - /// - /// The schema version. - public abstract string SchemaVersion { get; } - /// - /// Gets or sets the name of the version. - /// - /// The name of the version. - public abstract string VersionName { get; } - /// - /// Gets or sets the version. - /// - /// The version. - public abstract VSVersion Version { get; } - /// - /// Gets the name. - /// - /// The name. - public abstract string Name { get; } - - protected abstract string GetToolsVersionXml(FrameworkVersion version); - public abstract string SolutionTag { get; } - - #endregion - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - protected VSGenericTarget() - { - tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); - tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); - tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); - tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); - tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); - } - - #endregion - - #region Private Methods - - private string MakeRefPath(ProjectNode project) - { - string ret = ""; - foreach (ReferencePathNode node in project.ReferencePaths) - { - try - { - string fullPath = Helper.ResolvePath(node.Path); - if (ret.Length < 1) - { - ret = fullPath; - } - else - { - ret += ";" + fullPath; - } - } - catch (ArgumentException) - { - kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); - } - } - - return ret; - } - - private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) - { - SolutionNode node = solution; - - while (node.Parent is SolutionNode) - node = node.Parent as SolutionNode; - - return FindProjectInSolutionRecursively(name, node); - } - - private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) - { - if (solution.ProjectsTable.ContainsKey(name)) - return solution.ProjectsTable[name]; - - foreach (SolutionNode child in solution.Solutions) - { - ProjectNode node = FindProjectInSolutionRecursively(name, child); - if (node != null) - return node; - } - - return null; - } - - private void WriteProject(SolutionNode solution, ProjectNode project) - { - if (!tools.ContainsKey(project.Language)) - { - throw new UnknownLanguageException("Unknown .NET language: " + project.Language); - } - - ToolInfo toolInfo = tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - StreamWriter ps = new StreamWriter(projectFile); - - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - #region Project File - using (ps) - { - ps.WriteLine("", GetToolsVersionXml(project.FrameworkVersion)); - ps.WriteLine(" "); - ps.WriteLine(" Local"); - ps.WriteLine(" {0}", ProductVersion); - ps.WriteLine(" {0}", SchemaVersion); - ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); - - // Visual Studio has a hard coded guid for the project type - if (project.Type == ProjectType.Web) - ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); - ps.WriteLine(" Debug"); - ps.WriteLine(" {0}", project.AppIcon); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", project.AssemblyName); - foreach (ConfigurationNode conf in project.Configurations) - { - if (conf.Options.KeyFile != "") - { - ps.WriteLine(" {0}", conf.Options.KeyFile); - ps.WriteLine(" true"); - break; - } - } - ps.WriteLine(" JScript"); - ps.WriteLine(" Grid"); - ps.WriteLine(" IE50"); - ps.WriteLine(" false"); - ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); - - ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); - ps.WriteLine(" {0}", project.DesignerFolder); - ps.WriteLine(" {0}", project.RootNamespace); - ps.WriteLine(" {0}", project.StartupObject); - if (string.IsNullOrEmpty(project.DebugStartParameters)) - { - ps.WriteLine(" {0}", project.DebugStartParameters); - } - ps.WriteLine(" "); - ps.WriteLine(" "); - - ps.WriteLine(" "); - - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" ", conf.Name, conf.Platform); - ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); - ps.WriteLine(" {0}", conf.Options["BaseAddress"]); - ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); - ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); - ps.WriteLine(" {0}", conf.Options["DebugInformation"]); - ps.WriteLine(" {0}", conf.Options["FileAlignment"]); - ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); - if (project.Type != ProjectType.Web) - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); - else - ps.WriteLine(" {0}", - Helper.EndPath(Helper.NormalizePath("bin\\"))); - - ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); - ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); - ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); - ps.WriteLine(" {0}", conf.Options["WarningLevel"]); - ps.WriteLine(" {0}", conf.Options["NoStdLib"]); - ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); - ps.WriteLine(" {0}", conf.Platform); - ps.WriteLine(" "); - } - - //ps.WriteLine(" "); - - Dictionary projectReferences = new Dictionary(); - List otherReferences = new List(); - - foreach (ReferenceNode refr in project.References) - { - ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); - - if (projectNode == null) - otherReferences.Add(refr); - else - projectReferences.Add(refr, projectNode); - } - // Assembly References - ps.WriteLine(" "); - - foreach (ReferenceNode refr in otherReferences) - { - ps.Write(" "); - ps.Write(" "); - ps.Write(refr.Name); - ps.WriteLine(""); - - if(!String.IsNullOrEmpty(refr.Path)) - { - // Use absolute path to assembly (for determining assembly type) - string absolutePath = Path.Combine(project.FullPath, refr.Path); - if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { - // Assembly is an executable (exe) - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); - } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { - // Assembly is an library (dll) - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); - } else { - string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); - kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); - ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); - } - } - - ps.WriteLine(" {0}", refr.LocalCopy); - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - //Project References - ps.WriteLine(" "); - foreach (KeyValuePair pair in projectReferences) - { - ToolInfo tool = tools[pair.Value.Language]; - if (tools == null) - throw new UnknownLanguageException(); - - string path = - Helper.MakePathRelativeTo(project.FullPath, - Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); - ps.WriteLine(" ", path); - - // TODO: Allow reference to visual basic projects - ps.WriteLine(" {0}", pair.Value.Name); - ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); - ps.WriteLine(" {0}", tool.Guid.ToUpper()); - - //This is the Copy Local flag in VS - ps.WriteLine(" {0}", pair.Key.LocalCopy); - - ps.WriteLine(" "); - } - ps.WriteLine(" "); - - // ps.WriteLine(" "); - ps.WriteLine(" "); - - // ps.WriteLine(" "); - List list = new List(); - - foreach (string path in project.Files) - { - string lower = path.ToLower(); - if (lower.EndsWith(".resx")) - { - string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); - if (!list.Contains(codebehind)) - list.Add(codebehind); - } - - } - - foreach (string filePath in project.Files) - { - // if (file == "Properties\\Bind.Designer.cs") - // { - // Console.WriteLine("Wait a minute!"); - // Console.WriteLine(project.Files.GetSubType(file).ToString()); - // } - SubType subType = project.Files.GetSubType(filePath); - - // Visual Studio chokes on file names if forward slash is used as a path separator - // instead of backslash. So we must make sure that all file paths written to the - // project file use \ as a path separator. - string file = filePath.Replace(@"/", @"\"); - - if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer - && subType != SubType.CodeBehind) - { - ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); - ps.WriteLine(" {0}", Path.GetFileName(file)); - ps.WriteLine(" Designer"); - ps.WriteLine(" "); - // - } - - if (subType == SubType.Designer) - { - ps.WriteLine(" ", file); - - string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; - string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; - - // Check for a parent .cs file with the same name as this designer file - if (File.Exists(Helper.NormalizePath(dependent_name))) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" ResXFileCodeGenerator"); - ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); - ps.WriteLine(" " + subType + ""); - } - - ps.WriteLine(" "); - if (File.Exists(Helper.NormalizePath(autogen_name))) - { - ps.WriteLine(" ", autogen_name); - //ps.WriteLine(" True"); - - // If a parent .cs file exists, link this autogen file to it. Otherwise link - // to the designer file - if (File.Exists(dependent_name)) - { - ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); - } - else - { - ps.WriteLine(" True"); - ps.WriteLine(" {0}", Path.GetFileName(filePath)); - } - - ps.WriteLine(" "); - } - list.Add(autogen_name); - } - if (subType == SubType.Settings) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - ps.WriteLine("Include=\"{0}\">", file); - string fileName = Path.GetFileName(filePath); - if (project.Files.GetBuildAction(filePath) == BuildAction.None) - { - ps.WriteLine(" SettingsSingleFileGenerator"); - ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); - } - else - { - ps.WriteLine(" Code"); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); - string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); - ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); - } - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - else if (subType != SubType.Designer) - { - string path = Helper.NormalizePath(file); - string path_lower = path.ToLower(); - - if (!list.Contains(filePath)) - { - ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); - - int startPos = 0; - if (project.Files.GetPreservePath(filePath)) - { - while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) - startPos++; - - } - else - { - startPos = file.LastIndexOf(Path.GetFileName(path)); - } - - // be sure to write out the path with backslashes so VS recognizes - // the file properly. - ps.WriteLine("Include=\"{0}\">", file); - - int last_period_index = file.LastIndexOf('.'); - string short_file_name = file.Substring(0, last_period_index); - string extension = Path.GetExtension(path); - // make this upper case, so that when File.Exists tests for the - // existence of a designer file on a case-sensitive platform, - // it is correctly identified. - string designer_format = string.Format(".Designer{0}", extension); - - if (path_lower.EndsWith(designer_format.ToLowerInvariant())) - { - int designer_index = path.IndexOf(designer_format); - string file_name = path.Substring(0, designer_index); - - // There are two corrections to the next lines: - // 1. Fix the connection between a designer file and a form - // or usercontrol that don't have an associated resx file. - // 2. Connect settings files to associated designer files. - if (File.Exists(file_name + extension)) - ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); - else if (File.Exists(file_name + ".resx")) - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); - else if (File.Exists(file_name + ".settings")) - { - ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); - ps.WriteLine(" True"); - ps.WriteLine(" True"); - } - } - else if (subType == SubType.CodeBehind) - { - ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); - } - if (project.Files.GetIsLink(filePath)) - { - string alias = project.Files.GetLinkPath(filePath); - alias += file.Substring(startPos); - alias = Helper.NormalizePath(alias); - ps.WriteLine(" {0}", alias); - } - else if (project.Files.GetBuildAction(filePath) != BuildAction.None) - { - if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) - { - ps.WriteLine(" {0}", subType); - } - } - - if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) - { - ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); - } - - ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); - } - } - } - - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(" "); - ps.WriteLine(""); - } - #endregion - - #region User File - - ps = new StreamWriter(projectFile + ".user"); - using (ps) - { - // Get the first configuration from the project. - ConfigurationNode firstConfiguration = null; - - if (project.Configurations.Count > 0) - { - firstConfiguration = project.Configurations[0]; - } - - ps.WriteLine(""); - //ps.WriteLine( "" ); - //ps.WriteLine(" <{0}>", toolInfo.XMLTag); - //ps.WriteLine(" "); - ps.WriteLine(" "); - //ps.WriteLine(" ", MakeRefPath(project)); - - if (firstConfiguration != null) - { - ps.WriteLine(" {0}", firstConfiguration.Name); - ps.WriteLine(" {0}", firstConfiguration.Platform); - } - - ps.WriteLine(" {0}", MakeRefPath(project)); - ps.WriteLine(" {0}", ProductVersion); - ps.WriteLine(" ProjectFiles"); - ps.WriteLine(" 0"); - ps.WriteLine(" "); - foreach (ConfigurationNode conf in project.Configurations) - { - ps.Write(" "); - } - ps.WriteLine(""); - } - #endregion - - kernel.CurrentWorkingDirectory.Pop(); - } - - private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) - { - kernel.Log.Write("Creating {0} solution and project files", VersionName); - - foreach (SolutionNode child in solution.Solutions) - { - kernel.Log.Write("...Creating folder: {0}", child.Name); - WriteSolution(child, false); - } - - foreach (ProjectNode project in solution.Projects) - { - kernel.Log.Write("...Creating project: {0}", project.Name); - WriteProject(solution, project); - } - - foreach (DatabaseProjectNode project in solution.DatabaseProjects) - { - kernel.Log.Write("...Creating database project: {0}", project.Name); - WriteDatabaseProject(solution, project); - } - - if (writeSolutionToDisk) // only write main solution - { - kernel.Log.Write(""); - string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - - using (StreamWriter ss = new StreamWriter(solutionFile)) - { - kernel.CurrentWorkingDirectory.Push(); - Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); - - ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); - ss.WriteLine(SolutionTag); - - WriteProjectDeclarations(ss, solution, solution); - - ss.WriteLine("Global"); - - ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); - foreach (ConfigurationNode conf in solution.Configurations) - { - ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); - } - ss.WriteLine("\tEndGlobalSection"); - - ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); - WriteConfigurationLines(solution.Configurations, solution, ss); - ss.WriteLine("\tEndGlobalSection"); - - if (solution.Solutions.Count > 0) - { - ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); - foreach (SolutionNode embeddedSolution in solution.Solutions) - { - WriteNestedProjectMap(ss, embeddedSolution); - } - ss.WriteLine("\tEndGlobalSection"); - } - - ss.WriteLine("EndGlobal"); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - } - - private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) - { - foreach (SolutionNode childSolution in embeddedSolution.Solutions) - { - WriteEmbeddedSolution(writer, childSolution); - WriteProjectDeclarations(writer, actualSolution, childSolution); - } - - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteProject(actualSolution, writer, project); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteProject(actualSolution, writer, dbProject); - } - - if (actualSolution.Guid == embeddedSolution.Guid) - { - WriteSolutionFiles(actualSolution, writer); - } - } - - private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) - { - foreach (ProjectNode project in embeddedSolution.Projects) - { - WriteNestedProject(writer, embeddedSolution, project.Guid); - } - - foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) - { - WriteNestedProject(writer, embeddedSolution, dbProject.Guid); - } - - foreach (SolutionNode child in embeddedSolution.Solutions) - { - WriteNestedProject(writer, embeddedSolution, child.Guid); - WriteNestedProjectMap(writer, child); - } - } - - private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) - { - WriteNestedFolder(writer, solution.Guid, projectGuid); - } - - private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) - { - writer.WriteLine("\t\t{0} = {1}", - childGuid.ToString("B").ToUpper(), - parentGuid.ToString("B").ToUpper()); - } - - private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) - { - foreach (ProjectNode project in solution.Projects) - { - foreach (ConfigurationNode conf in configurations) - { - ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - - ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", - project.Guid.ToString("B").ToUpper(), - conf.NameAndPlatform); - } - } - - foreach (SolutionNode child in solution.Solutions) - { - WriteConfigurationLines(configurations, child, ss); - } - } - - private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) - { - if(solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); - } - - private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) - { - WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) - { - WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); - } - - private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) - { - if (solution.Files != null && solution.Files.Count > 0) - WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); - } - - const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; - const string ProjectDeclarationEndFormat = "EndProject"; - - private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); - - path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); - - WriteProject(ss, language, guid, name, path); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) - { - WriteProject(writer, language, projectGuid, name, location, null); - } - - private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) - { - if (!tools.ContainsKey(language)) - throw new UnknownLanguageException("Unknown .NET language: " + language); - - ToolInfo toolInfo = tools[language]; - - writer.WriteLine(ProjectDeclarationBeginFormat, - toolInfo.Guid, - name, - location, - projectGuid.ToString("B").ToUpper()); - - if (files != null) - { - writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); - - foreach (string file in files) - writer.WriteLine("\t\t{0} = {0}", file); - - writer.WriteLine("\tEndProjectSection"); - } - - writer.WriteLine(ProjectDeclarationEndFormat); - } - - private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) - { - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); - IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); - - kernel.CurrentWorkingDirectory.Push(); - - Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); - - using (ps) - { - ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); - ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); - ps.Indent++; - ps.WriteLine("MSDTVersion = \"80\""); - // TODO: Use the project.Files property - if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) - WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); - - ps.WriteLine("Begin DBRefFolder = \"Database References\""); - ps.Indent++; - foreach (DatabaseReferenceNode reference in project.References) - { - ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); - ps.Indent++; - ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); - ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); - //ps.WriteLine("Colorizer = 5"); - ps.Indent--; - ps.WriteLine("End"); - } - ps.Indent--; - ps.WriteLine("End"); - ps.Indent--; - ps.WriteLine("End"); - - ps.Flush(); - } - - kernel.CurrentWorkingDirectory.Pop(); - } - - private static bool ContainsSqlFiles(string folder) - { - if(Directory.GetFiles(folder, "*.sql").Length > 0) - return true; // if the folder contains 1 .sql file, that's good enough - - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - return true; // if 1 child folder contains a .sql file, still good enough - } - - return false; - } - - private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) - { - foreach (string child in Directory.GetDirectories(folder)) - { - if (ContainsSqlFiles(child)) - { - writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); - writer.Indent++; - WriteDatabaseFoldersAndFiles(writer, child); - writer.Indent--; - writer.WriteLine("End"); - } - } - foreach (string file in Directory.GetFiles(folder, "*.sql")) - { - writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); - } - } - - private void CleanProject(ProjectNode project) - { - kernel.Log.Write("...Cleaning project: {0}", project.Name); - - ToolInfo toolInfo = tools[project.Language]; - string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); - string userFile = projectFile + ".user"; - - Helper.DeleteIfExists(projectFile); - Helper.DeleteIfExists(userFile); - } - - private void CleanSolution(SolutionNode solution) - { - kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); - - string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); - string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); - - Helper.DeleteIfExists(slnFile); - Helper.DeleteIfExists(suoFile); - - foreach (ProjectNode project in solution.Projects) - { - CleanProject(project); - } - - kernel.Log.Write(""); - } - - #endregion - - #region ITarget Members - - /// - /// Writes the specified kern. - /// - /// The kern. - public virtual void Write(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - WriteSolution(sol, true); - } - kernel = null; - } - - /// - /// Cleans the specified kern. - /// - /// The kern. - public virtual void Clean(Kernel kern) - { - if (kern == null) - { - throw new ArgumentNullException("kern"); - } - kernel = kern; - foreach (SolutionNode sol in kernel.Solutions) - { - CleanSolution(sol); - } - kernel = null; - } - - #endregion - } -} +#region BSD License +/* +Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) + +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. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.IO; +using Prebuild.Core.Interfaces; +using Prebuild.Core.Nodes; +using Prebuild.Core.Utilities; +using System.CodeDom.Compiler; + +namespace Prebuild.Core.Targets +{ + + /// + /// + /// + public abstract class VSGenericTarget : ITarget + { + #region Fields + + readonly Dictionary tools = new Dictionary(); +// NameValueCollection CopyFiles = new NameValueCollection(); + Kernel kernel; + #endregion + + #region Properties + /// + /// Gets or sets the solution version. + /// + /// The solution version. + public abstract string SolutionVersion { get; } + /// + /// Gets or sets the product version. + /// + /// The product version. + public abstract string ProductVersion { get; } + /// + /// Gets or sets the schema version. + /// + /// The schema version. + public abstract string SchemaVersion { get; } + /// + /// Gets or sets the name of the version. + /// + /// The name of the version. + public abstract string VersionName { get; } + /// + /// Gets or sets the version. + /// + /// The version. + public abstract VSVersion Version { get; } + /// + /// Gets the name. + /// + /// The name. + public abstract string Name { get; } + + protected abstract string GetToolsVersionXml(FrameworkVersion version); + public abstract string SolutionTag { get; } + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + protected VSGenericTarget() + { + tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); + tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); + tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); + tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); + tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); + } + + #endregion + + #region Private Methods + + private string MakeRefPath(ProjectNode project) + { + string ret = ""; + foreach (ReferencePathNode node in project.ReferencePaths) + { + try + { + string fullPath = Helper.ResolvePath(node.Path); + if (ret.Length < 1) + { + ret = fullPath; + } + else + { + ret += ";" + fullPath; + } + } + catch (ArgumentException) + { + kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); + } + } + + return ret; + } + + private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) + { + SolutionNode node = solution; + + while (node.Parent is SolutionNode) + node = node.Parent as SolutionNode; + + return FindProjectInSolutionRecursively(name, node); + } + + private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) + { + if (solution.ProjectsTable.ContainsKey(name)) + return solution.ProjectsTable[name]; + + foreach (SolutionNode child in solution.Solutions) + { + ProjectNode node = FindProjectInSolutionRecursively(name, child); + if (node != null) + return node; + } + + return null; + } + + private void WriteProject(SolutionNode solution, ProjectNode project) + { + if (!tools.ContainsKey(project.Language)) + { + throw new UnknownLanguageException("Unknown .NET language: " + project.Language); + } + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + StreamWriter ps = new StreamWriter(projectFile); + + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + #region Project File + using (ps) + { + string targets = ""; + + if(project.Files.CopyFiles > 0) + targets = "Build;CopyFiles"; + else + targets = "Build"; + + ps.WriteLine("", targets, GetToolsVersionXml(project.FrameworkVersion)); + ps.WriteLine(" "); + ps.WriteLine(" Local"); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" {0}", SchemaVersion); + ps.WriteLine(" {{{0}}}", project.Guid.ToString().ToUpper()); + + // Visual Studio has a hard coded guid for the project type + if (project.Type == ProjectType.Web) + ps.WriteLine(" {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}"); + ps.WriteLine(" Debug"); + ps.WriteLine(" {0}", project.AppIcon); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", project.AssemblyName); + foreach (ConfigurationNode conf in project.Configurations) + { + if (conf.Options.KeyFile != "") + { + ps.WriteLine(" {0}", conf.Options.KeyFile); + ps.WriteLine(" true"); + break; + } + } + ps.WriteLine(" JScript"); + ps.WriteLine(" Grid"); + ps.WriteLine(" IE50"); + ps.WriteLine(" false"); + ps.WriteLine(" {0}", project.FrameworkVersion.ToString().Replace("_", ".")); + + ps.WriteLine(" {0}", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); + ps.WriteLine(" {0}", project.DesignerFolder); + ps.WriteLine(" {0}", project.RootNamespace); + ps.WriteLine(" {0}", project.StartupObject); + if (string.IsNullOrEmpty(project.DebugStartParameters)) + { + ps.WriteLine(" {0}", project.DebugStartParameters); + } + ps.WriteLine(" "); + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" ", conf.Name, conf.Platform); + ps.WriteLine(" {0}", conf.Options["AllowUnsafe"]); + ps.WriteLine(" {0}", conf.Options["BaseAddress"]); + ps.WriteLine(" {0}", conf.Options["CheckUnderflowOverflow"]); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" {0}", conf.Options["CompilerDefines"]); + ps.WriteLine(" {0}", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); + ps.WriteLine(" {0}", conf.Options["DebugInformation"]); + ps.WriteLine(" {0}", conf.Options["FileAlignment"]); + ps.WriteLine(" {0}", conf.Options["OptimizeCode"]); + if (project.Type != ProjectType.Web) + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); + else + ps.WriteLine(" {0}", + Helper.EndPath(Helper.NormalizePath("bin\\"))); + + ps.WriteLine(" {0}", conf.Options["RegisterComInterop"]); + ps.WriteLine(" {0}", conf.Options["RemoveIntegerChecks"]); + ps.WriteLine(" {0}", conf.Options["WarningsAsErrors"]); + ps.WriteLine(" {0}", conf.Options["WarningLevel"]); + ps.WriteLine(" {0}", conf.Options["NoStdLib"]); + ps.WriteLine(" {0}", conf.Options["SuppressWarnings"]); + ps.WriteLine(" {0}", conf.Platform); + ps.WriteLine(" "); + } + + //ps.WriteLine(" "); + + Dictionary projectReferences = new Dictionary(); + List otherReferences = new List(); + + foreach (ReferenceNode refr in project.References) + { + ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); + + if (projectNode == null) + otherReferences.Add(refr); + else + projectReferences.Add(refr, projectNode); + } + // Assembly References + ps.WriteLine(" "); + + foreach (ReferenceNode refr in otherReferences) + { + ps.Write(" "); + ps.Write(" "); + ps.Write(refr.Name); + ps.WriteLine(""); + + if(!String.IsNullOrEmpty(refr.Path)) + { + // Use absolute path to assembly (for determining assembly type) + string absolutePath = Path.Combine(project.FullPath, refr.Path); + if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { + // Assembly is an executable (exe) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); + } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { + // Assembly is an library (dll) + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } else { + string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); + kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); + ps.WriteLine(" {0}", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); + } + } + + ps.WriteLine(" {0}", refr.LocalCopy); + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + //Project References + ps.WriteLine(" "); + foreach (KeyValuePair pair in projectReferences) + { + ToolInfo tool = tools[pair.Value.Language]; + if (tools == null) + throw new UnknownLanguageException(); + + string path = + Helper.MakePathRelativeTo(project.FullPath, + Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); + ps.WriteLine(" ", path); + + // TODO: Allow reference to visual basic projects + ps.WriteLine(" {0}", pair.Value.Name); + ps.WriteLine(" {0}", pair.Value.Guid.ToString("B").ToUpper()); + ps.WriteLine(" {0}", tool.Guid.ToUpper()); + + //This is the Copy Local flag in VS + ps.WriteLine(" {0}", pair.Key.LocalCopy); + + ps.WriteLine(" "); + } + ps.WriteLine(" "); + + // ps.WriteLine(" "); + ps.WriteLine(" "); + + // ps.WriteLine(" "); + List list = new List(); + + foreach (string path in project.Files) + { + string lower = path.ToLower(); + if (lower.EndsWith(".resx")) + { + string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); + if (!list.Contains(codebehind)) + list.Add(codebehind); + } + + } + + + foreach (string filePath in project.Files) + { + // Add the filePath with the destination as the key + // will use it later to form the copy parameters with Include lists + // for each destination + if (project.Files.GetBuildAction(filePath) == BuildAction.Copy) + continue; + // if (file == "Properties\\Bind.Designer.cs") + // { + // Console.WriteLine("Wait a minute!"); + // Console.WriteLine(project.Files.GetSubType(file).ToString()); + // } + SubType subType = project.Files.GetSubType(filePath); + + // Visual Studio chokes on file names if forward slash is used as a path separator + // instead of backslash. So we must make sure that all file paths written to the + // project file use \ as a path separator. + string file = filePath.Replace(@"/", @"\"); + + if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer + && subType != SubType.CodeBehind) + { + ps.WriteLine(" ", file.Substring(0, file.LastIndexOf('.')) + ".resx"); + ps.WriteLine(" {0}", Path.GetFileName(file)); + ps.WriteLine(" Designer"); + ps.WriteLine(" "); + // + } + + if (subType == SubType.Designer) + { + ps.WriteLine(" ", file); + + string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; + string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; + + // Check for a parent .cs file with the same name as this designer file + if (File.Exists(Helper.NormalizePath(dependent_name))) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" ResXFileCodeGenerator"); + ps.WriteLine(" {0}", Path.GetFileName(autogen_name)); + ps.WriteLine(" " + subType + ""); + } + + ps.WriteLine(" "); + if (File.Exists(Helper.NormalizePath(autogen_name))) + { + ps.WriteLine(" ", autogen_name); + //ps.WriteLine(" True"); + + // If a parent .cs file exists, link this autogen file to it. Otherwise link + // to the designer file + if (File.Exists(dependent_name)) + { + ps.WriteLine(" {0}", Path.GetFileName(dependent_name)); + } + else + { + ps.WriteLine(" True"); + ps.WriteLine(" {0}", Path.GetFileName(filePath)); + } + + ps.WriteLine(" "); + } + list.Add(autogen_name); + } + if (subType == SubType.Settings) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + ps.WriteLine("Include=\"{0}\">", file); + string fileName = Path.GetFileName(filePath); + if (project.Files.GetBuildAction(filePath) == BuildAction.None) + { + ps.WriteLine(" SettingsSingleFileGenerator"); + ps.WriteLine(" {0}", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); + } + else + { + ps.WriteLine(" Code"); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); + string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); + ps.WriteLine(" {0}", Path.GetFileName(fileNameShorter + ".settings")); + } + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + else if (subType != SubType.Designer) + { + string path = Helper.NormalizePath(file); + string path_lower = path.ToLower(); + + if (!list.Contains(filePath)) + { + ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); + + int startPos = 0; + if (project.Files.GetPreservePath(filePath)) + { + while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) + startPos++; + + } + else + { + startPos = file.LastIndexOf(Path.GetFileName(path)); + } + + // be sure to write out the path with backslashes so VS recognizes + // the file properly. + ps.WriteLine("Include=\"{0}\">", file); + + int last_period_index = file.LastIndexOf('.'); + string short_file_name = (last_period_index >= 0) + ? file.Substring(0, last_period_index) + : file; + string extension = Path.GetExtension(path); + // make this upper case, so that when File.Exists tests for the + // existence of a designer file on a case-sensitive platform, + // it is correctly identified. + string designer_format = string.Format(".Designer{0}", extension); + + if (path_lower.EndsWith(designer_format.ToLowerInvariant())) + { + int designer_index = path.IndexOf(designer_format); + string file_name = path.Substring(0, designer_index); + + // There are two corrections to the next lines: + // 1. Fix the connection between a designer file and a form + // or usercontrol that don't have an associated resx file. + // 2. Connect settings files to associated designer files. + if (File.Exists(file_name + extension)) + ps.WriteLine(" {0}", Path.GetFileName(file_name + extension)); + else if (File.Exists(file_name + ".resx")) + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".resx")); + else if (File.Exists(file_name + ".settings")) + { + ps.WriteLine(" {0}", Path.GetFileName(file_name + ".settings")); + ps.WriteLine(" True"); + ps.WriteLine(" True"); + } + } + else if (subType == SubType.CodeBehind) + { + ps.WriteLine(" {0}", Path.GetFileName(short_file_name)); + } + if (project.Files.GetIsLink(filePath)) + { + string alias = project.Files.GetLinkPath(filePath); + alias += file.Substring(startPos); + alias = Helper.NormalizePath(alias); + ps.WriteLine(" {0}", alias); + } + else if (project.Files.GetBuildAction(filePath) != BuildAction.None) + { + if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) + { + ps.WriteLine(" {0}", subType); + } + } + + if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) + { + ps.WriteLine(" {0}", project.Files.GetCopyToOutput(filePath)); + } + + ps.WriteLine(" ", project.Files.GetBuildAction(filePath)); + } + } + } + ps.WriteLine(" "); + + /* + * Copy Task + * + */ + if ( project.Files.CopyFiles > 0 ) { + + Dictionary IncludeTags = new Dictionary(); + int TagCount = 0; + + // Handle Copy tasks + ps.WriteLine(" "); + foreach (string destPath in project.Files.Destinations) + { + string tag = "FilesToCopy_" + TagCount.ToString("0000"); + + ps.WriteLine(" <{0} Include=\"{1}\" />", tag, String.Join(";", project.Files.SourceFiles(destPath))); + IncludeTags.Add(destPath, tag); + TagCount++; + } + + ps.WriteLine(" "); + + ps.WriteLine(" "); + + foreach (string destPath in project.Files.Destinations) + { + ps.WriteLine(" ", + IncludeTags[destPath], destPath); + } + + ps.WriteLine(" "); + } + + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(" "); + ps.WriteLine(""); + } + #endregion + + #region User File + + ps = new StreamWriter(projectFile + ".user"); + using (ps) + { + // Get the first configuration from the project. + ConfigurationNode firstConfiguration = null; + + if (project.Configurations.Count > 0) + { + firstConfiguration = project.Configurations[0]; + } + + ps.WriteLine(""); + //ps.WriteLine( "" ); + //ps.WriteLine(" <{0}>", toolInfo.XMLTag); + //ps.WriteLine(" "); + ps.WriteLine(" "); + //ps.WriteLine(" ", MakeRefPath(project)); + + if (firstConfiguration != null) + { + ps.WriteLine(" {0}", firstConfiguration.Name); + ps.WriteLine(" {0}", firstConfiguration.Platform); + } + + ps.WriteLine(" {0}", MakeRefPath(project)); + ps.WriteLine(" {0}", ProductVersion); + ps.WriteLine(" ProjectFiles"); + ps.WriteLine(" 0"); + ps.WriteLine(" "); + foreach (ConfigurationNode conf in project.Configurations) + { + ps.Write(" "); + } + ps.WriteLine(""); + } + #endregion + + kernel.CurrentWorkingDirectory.Pop(); + } + + private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) + { + kernel.Log.Write("Creating {0} solution and project files", VersionName); + + foreach (SolutionNode child in solution.Solutions) + { + kernel.Log.Write("...Creating folder: {0}", child.Name); + WriteSolution(child, false); + } + + foreach (ProjectNode project in solution.Projects) + { + kernel.Log.Write("...Creating project: {0}", project.Name); + WriteProject(solution, project); + } + + foreach (DatabaseProjectNode project in solution.DatabaseProjects) + { + kernel.Log.Write("...Creating database project: {0}", project.Name); + WriteDatabaseProject(solution, project); + } + + if (writeSolutionToDisk) // only write main solution + { + kernel.Log.Write(""); + string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + + using (StreamWriter ss = new StreamWriter(solutionFile)) + { + kernel.CurrentWorkingDirectory.Push(); + Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); + + ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); + ss.WriteLine(SolutionTag); + + WriteProjectDeclarations(ss, solution, solution); + + ss.WriteLine("Global"); + + ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); + foreach (ConfigurationNode conf in solution.Configurations) + { + ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); + } + ss.WriteLine("\tEndGlobalSection"); + + ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); + WriteConfigurationLines(solution.Configurations, solution, ss); + ss.WriteLine("\tEndGlobalSection"); + + if (solution.Solutions.Count > 0) + { + ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); + foreach (SolutionNode embeddedSolution in solution.Solutions) + { + WriteNestedProjectMap(ss, embeddedSolution); + } + ss.WriteLine("\tEndGlobalSection"); + } + + ss.WriteLine("EndGlobal"); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + } + + private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) + { + foreach (SolutionNode childSolution in embeddedSolution.Solutions) + { + WriteEmbeddedSolution(writer, childSolution); + WriteProjectDeclarations(writer, actualSolution, childSolution); + } + + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteProject(actualSolution, writer, project); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteProject(actualSolution, writer, dbProject); + } + + if (actualSolution.Guid == embeddedSolution.Guid) + { + WriteSolutionFiles(actualSolution, writer); + } + } + + private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) + { + foreach (ProjectNode project in embeddedSolution.Projects) + { + WriteNestedProject(writer, embeddedSolution, project.Guid); + } + + foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) + { + WriteNestedProject(writer, embeddedSolution, dbProject.Guid); + } + + foreach (SolutionNode child in embeddedSolution.Solutions) + { + WriteNestedProject(writer, embeddedSolution, child.Guid); + WriteNestedProjectMap(writer, child); + } + } + + private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) + { + WriteNestedFolder(writer, solution.Guid, projectGuid); + } + + private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) + { + writer.WriteLine("\t\t{0} = {1}", + childGuid.ToString("B").ToUpper(), + parentGuid.ToString("B").ToUpper()); + } + + private static void WriteConfigurationLines(IEnumerable configurations, SolutionNode solution, TextWriter ss) + { + foreach (ProjectNode project in solution.Projects) + { + foreach (ConfigurationNode conf in configurations) + { + ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + + ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", + project.Guid.ToString("B").ToUpper(), + conf.NameAndPlatform); + } + } + + foreach (SolutionNode child in solution.Solutions) + { + WriteConfigurationLines(configurations, child, ss); + } + } + + private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) + { + if(solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); + } + + private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) + { + WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) + { + WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); + } + + private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) + { + if (solution.Files != null && solution.Files.Count > 0) + WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); + } + + const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; + const string ProjectDeclarationEndFormat = "EndProject"; + + private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); + + path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); + + WriteProject(ss, language, guid, name, path); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) + { + WriteProject(writer, language, projectGuid, name, location, null); + } + + private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) + { + if (!tools.ContainsKey(language)) + throw new UnknownLanguageException("Unknown .NET language: " + language); + + ToolInfo toolInfo = tools[language]; + + writer.WriteLine(ProjectDeclarationBeginFormat, + toolInfo.Guid, + name, + location, + projectGuid.ToString("B").ToUpper()); + + if (files != null) + { + writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); + + foreach (string file in files) + writer.WriteLine("\t\t{0} = {0}", file); + + writer.WriteLine("\tEndProjectSection"); + } + + writer.WriteLine(ProjectDeclarationEndFormat); + } + + private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) + { + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); + IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); + + kernel.CurrentWorkingDirectory.Push(); + + Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); + + using (ps) + { + ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); + ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); + ps.Indent++; + ps.WriteLine("MSDTVersion = \"80\""); + // TODO: Use the project.Files property + if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) + WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); + + ps.WriteLine("Begin DBRefFolder = \"Database References\""); + ps.Indent++; + foreach (DatabaseReferenceNode reference in project.References) + { + ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); + ps.Indent++; + ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); + ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); + //ps.WriteLine("Colorizer = 5"); + ps.Indent--; + ps.WriteLine("End"); + } + ps.Indent--; + ps.WriteLine("End"); + ps.Indent--; + ps.WriteLine("End"); + + ps.Flush(); + } + + kernel.CurrentWorkingDirectory.Pop(); + } + + private static bool ContainsSqlFiles(string folder) + { + if(Directory.GetFiles(folder, "*.sql").Length > 0) + return true; // if the folder contains 1 .sql file, that's good enough + + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + return true; // if 1 child folder contains a .sql file, still good enough + } + + return false; + } + + private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) + { + foreach (string child in Directory.GetDirectories(folder)) + { + if (ContainsSqlFiles(child)) + { + writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); + writer.Indent++; + WriteDatabaseFoldersAndFiles(writer, child); + writer.Indent--; + writer.WriteLine("End"); + } + } + foreach (string file in Directory.GetFiles(folder, "*.sql")) + { + writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); + } + } + + private void CleanProject(ProjectNode project) + { + kernel.Log.Write("...Cleaning project: {0}", project.Name); + + ToolInfo toolInfo = tools[project.Language]; + string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); + string userFile = projectFile + ".user"; + + Helper.DeleteIfExists(projectFile); + Helper.DeleteIfExists(userFile); + } + + private void CleanSolution(SolutionNode solution) + { + kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); + + string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); + string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); + + Helper.DeleteIfExists(slnFile); + Helper.DeleteIfExists(suoFile); + + foreach (ProjectNode project in solution.Projects) + { + CleanProject(project); + } + + kernel.Log.Write(""); + } + + #endregion + + #region ITarget Members + + /// + /// Writes the specified kern. + /// + /// The kern. + public virtual void Write(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + WriteSolution(sol, true); + } + kernel = null; + } + + /// + /// Cleans the specified kern. + /// + /// The kern. + public virtual void Clean(Kernel kern) + { + if (kern == null) + { + throw new ArgumentNullException("kern"); + } + kernel = kern; + foreach (SolutionNode sol in kernel.Solutions) + { + CleanSolution(sol); + } + kernel = null; + } + + #endregion + } +} diff --git a/Prebuild/src/Prebuild.cs b/Prebuild/src/Prebuild.cs index 081c89c404..35a5dfaf44 100644 --- a/Prebuild/src/Prebuild.cs +++ b/Prebuild/src/Prebuild.cs @@ -27,7 +27,7 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O /* * $Source$ * $Author: kunnis $ - * $Date: 2009-04-15 02:33:14 +0100 (Wed, 15 Apr 2009) $ + * $Date: 2009-04-14 21:33:14 -0400 (Tue, 14 Apr 2009) $ * $Revision: 308 $ */ #endregion diff --git a/Prebuild/src/data/prebuild-1.7.xsd b/Prebuild/src/data/prebuild-1.7.xsd index 3675503bab..a7f5c88d09 100644 --- a/Prebuild/src/data/prebuild-1.7.xsd +++ b/Prebuild/src/data/prebuild-1.7.xsd @@ -1,350 +1,350 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - 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. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR '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 AUTHOR 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) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + 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. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR '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 AUTHOR 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. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Prebuild/src/data/prebuild-1.9.xsd b/Prebuild/src/data/prebuild-1.9.xsd index fbca556f19..d647e087ae 100644 --- a/Prebuild/src/data/prebuild-1.9.xsd +++ b/Prebuild/src/data/prebuild-1.9.xsd @@ -1,336 +1,336 @@ - - - - - Copyright (c) 2004-2007 - Matthew Holmes (calefaction at houston . rr . com), - Dan Moorehead (dan05a at gmail . com), - David Hudson (jendave at yahoo dot com), - C.J. Adams-Collier (cjac at colliertech dot com) - - .NET Prebuild is a cross-platform XML-driven pre-build tool which - allows developers to easily generate project or make files for major - IDE's and .NET development tools including: Visual Studio .NET 2002, - 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. - - BSD License: - - 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. - * The name of the author may not be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR '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 AUTHOR 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) 2004-2007 + Matthew Holmes (calefaction at houston . rr . com), + Dan Moorehead (dan05a at gmail . com), + David Hudson (jendave at yahoo dot com), + C.J. Adams-Collier (cjac at colliertech dot com) + + .NET Prebuild is a cross-platform XML-driven pre-build tool which + allows developers to easily generate project or make files for major + IDE's and .NET development tools including: Visual Studio .NET 2002, + 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. + + BSD License: + + 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. + * The name of the author may not be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR '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 AUTHOR 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. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe index ead3c6b9662a5f235e58570ace76fe523137031b..bdb25b6ebcb85cccccc6611a7c2f7aab6b03c87f 100755 GIT binary patch literal 226816 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 /// Set the current Windlight scene to a target avatar From 70e36ee2b41da03e41b4f61ab348bc85bd872801 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Dec 2011 12:17:58 -0800 Subject: [PATCH 21/37] HG: more adjustments for making HG Simian work. Added server_uri as new key on get_agent_home in UAS. --- .../Framework/EntityTransfer/HGEntityTransferModule.cs | 5 +++-- .../Services/Connectors/Hypergrid/HeloServiceConnector.cs | 2 +- .../Connectors/Hypergrid/UserAgentServiceConnector.cs | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index cc9ba9733a..841363cf39 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -227,8 +227,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer IEventQueue eq = sp.Scene.RequestModuleInterface(); GridRegion homeGatekeeper = MakeRegion(aCircuit); - m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}:{5}", - aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName); + m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}", + aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName); DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); } @@ -347,6 +347,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer region.ExternalHostName = uri.Host; region.HttpPort = (uint)uri.Port; + region.ServerURI = uri.ToString(); region.RegionName = string.Empty; region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); return region; diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs index 8ac89ccbbe..c030bca077 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs @@ -62,7 +62,7 @@ namespace OpenSim.Services.Connectors else { serverURI = serverURI + "xxx"; - m_ServerURI = serverURI.Replace("?" + uri.Query, ""); + m_ServerURI = serverURI.Replace(uri.Query, ""); m_ServerURI = m_ServerURI.TrimEnd('/') + "/helo/"; } } diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index 0c55c2e7d3..57b6d16fe5 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -334,6 +334,9 @@ namespace OpenSim.Services.Connectors.Hypergrid UInt32.TryParse((string)hash["http_port"], out p); region.HttpPort = p; } + if (hash.ContainsKey("server_uri") && hash["server_uri"] != null) + region.ServerURI = (string)hash["server_uri"]; + if (hash["internal_port"] != null) { int p = 0; From 6974596e83b9029b30913e8e0ed71cbe1da46358 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Dec 2011 12:34:57 -0800 Subject: [PATCH 22/37] Fixed mix-up in UserAccount fields when passing UserAccounts remotely. --- .../Handlers/UserAccounts/UserAccountServerPostHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs index ab383ef065..3fd69aed50 100644 --- a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs +++ b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs @@ -231,7 +231,7 @@ namespace OpenSim.Server.Handlers.UserAccounts int userLevel = 0; if (request.ContainsKey("UserLevel") && int.TryParse(request["UserLevel"].ToString(), out userLevel)) - existingAccount.UserFlags = userLevel; + existingAccount.UserLevel = userLevel; int userFlags = 0; if (request.ContainsKey("UserFlags") && int.TryParse(request["UserFlags"].ToString(), out userFlags)) From ef4d989f37bdfbdc6ae34c4d0fc444341b806296 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Dec 2011 15:21:56 -0800 Subject: [PATCH 23/37] Deleted unused methods from HGAssetBroker --- .../Asset/HGAssetBroker.cs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs index e31be21a8c..8395f8321d 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs @@ -382,23 +382,5 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset return result; } - #region IHyperAssetService - - public string GetUserAssetServer(UUID userID) - { - UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, userID); - - if (account != null && account.ServiceURLs.ContainsKey("AssetServerURI") && account.ServiceURLs["AssetServerURI"] != null) - return account.ServiceURLs["AssetServerURI"].ToString(); - - return string.Empty; - } - - public string GetSimAssetServer() - { - return m_LocalAssetServiceURI; - } - - #endregion } } From 98ab3dffa35a007986a43fd15b9ce93202c92ef5 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Dec 2011 15:33:04 -0800 Subject: [PATCH 24/37] Deleted two obsolete files in Inventory modules. --- .../Inventory/BaseInventoryConnector.cs | 223 ---------------- .../Inventory/InventoryCache.cs | 237 ------------------ 2 files changed, 460 deletions(-) delete mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs delete mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs deleted file mode 100644 index dcf08e3d80..0000000000 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs +++ /dev/null @@ -1,223 +0,0 @@ -/* - * 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 OpenSimulator 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 OpenMetaverse; -using Nini.Config; -using log4net; -using OpenSim.Framework; -using OpenSim.Services.Interfaces; - -namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory -{ - public abstract class BaseInventoryConnector : IInventoryService - { - protected static InventoryCache m_cache; - private static bool m_Initialized; - - protected virtual void Init(IConfigSource source) - { - if (!m_Initialized) - { - m_cache = new InventoryCache(); - m_cache.Init(source, this); - m_Initialized = true; - } - } - - /// - /// Create the entire inventory for a given user - /// - /// - /// - public abstract bool CreateUserInventory(UUID user); - - /// - /// Gets the skeleton of the inventory -- folders only - /// - /// - /// - public abstract List GetInventorySkeleton(UUID userId); - - /// - /// Synchronous inventory fetch. - /// - /// - /// - public abstract InventoryCollection GetUserInventory(UUID userID); - - /// - /// Request the inventory for a user. This is an asynchronous operation that will call the callback when the - /// inventory has been received - /// - /// - /// - public abstract void GetUserInventory(UUID userID, InventoryReceiptCallback callback); - - /// - /// Retrieve the root inventory folder for the given user. - /// - /// - /// null if no root folder was found - public InventoryFolderBase GetRootFolder(UUID userID) - { - // Root folder is here as system type Folder. - return m_cache.GetFolderForType(userID, AssetType.Folder); - } - - public abstract Dictionary GetSystemFolders(UUID userID); - - /// - /// Gets the user folder for the given folder-type - /// - /// - /// - /// - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) - { - return m_cache.GetFolderForType(userID, type); - } - - /// - /// Gets everything (folders and items) inside a folder - /// - /// - /// - /// - public abstract InventoryCollection GetFolderContent(UUID userID, UUID folderID); - - /// - /// Gets the items inside a folder - /// - /// - /// - /// - public abstract List GetFolderItems(UUID userID, UUID folderID); - - /// - /// Add a new folder to the user's inventory - /// - /// - /// true if the folder was successfully added - public abstract bool AddFolder(InventoryFolderBase folder); - - /// - /// Update a folder in the user's inventory - /// - /// - /// true if the folder was successfully updated - public abstract bool UpdateFolder(InventoryFolderBase folder); - - /// - /// Move an inventory folder to a new location - /// - /// A folder containing the details of the new location - /// true if the folder was successfully moved - public abstract bool MoveFolder(InventoryFolderBase folder); - - /// - /// Delete a list of inventory folders (from trash) - /// - public abstract bool DeleteFolders(UUID ownerID, List folderIDs); - - /// - /// Purge an inventory folder of all its items and subfolders. - /// - /// - /// true if the folder was successfully purged - public abstract bool PurgeFolder(InventoryFolderBase folder); - - /// - /// Add a new item to the user's inventory. - /// If the given item has to parent folder, it tries to find the most - /// suitable folder for it. - /// - /// - /// true if the item was successfully added - public bool AddItem(InventoryItemBase item) - { - if (item == null) - return false; - - if (item.Folder == UUID.Zero) - { - InventoryFolderBase f = GetFolderForType(item.Owner, (AssetType)item.AssetType); - if (f != null) - item.Folder = f.ID; - else - { - f = GetRootFolder(item.Owner); - if (f != null) - item.Folder = f.ID; - else - return false; - } - } - - return AddItemPlain(item); - } - - protected abstract bool AddItemPlain(InventoryItemBase item); - - /// - /// Update an item in the user's inventory - /// - /// - /// true if the item was successfully updated - public abstract bool UpdateItem(InventoryItemBase item); - - public abstract bool MoveItems(UUID ownerID, List items); - - /// - /// Delete an item from the user's inventory - /// - /// - /// true if the item was successfully deleted - public abstract bool DeleteItems(UUID ownerID, List itemIDs); - - public abstract InventoryItemBase GetItem(InventoryItemBase item); - - public abstract InventoryFolderBase GetFolder(InventoryFolderBase folder); - - /// - /// Does the given user have an inventory structure? - /// - /// - /// - public abstract bool HasInventoryForUser(UUID userID); - - /// - /// Get the active gestures of the agent. - /// - /// - /// - public abstract List GetActiveGestures(UUID userId); - - public abstract int GetAssetPermissions(UUID userID, UUID assetID); - } -} diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs deleted file mode 100644 index 2322d7cb45..0000000000 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs +++ /dev/null @@ -1,237 +0,0 @@ -/* - * 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 OpenSimulator 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.Reflection; - -using OpenSim.Framework; -using OpenSim.Framework.Client; -using OpenSim.Region.Framework.Scenes; - -using OpenMetaverse; -using Nini.Config; -using log4net; - -namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory -{ - public class InventoryCache - { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); - - protected BaseInventoryConnector m_Connector; - protected List m_Scenes; - - // The cache proper - protected Dictionary> m_InventoryCache; - - // A cache of userIDs --> ServiceURLs, for HGBroker only - protected Dictionary m_InventoryURLs = - new Dictionary(); - - public virtual void Init(IConfigSource source, BaseInventoryConnector connector) - { - m_Scenes = new List(); - m_InventoryCache = new Dictionary>(); - m_Connector = connector; - } - - public virtual void AddRegion(Scene scene) - { - m_Scenes.Add(scene); - scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; - scene.EventManager.OnClientClosed += OnClientClosed; - } - - public virtual void RemoveRegion(Scene scene) - { - if ((m_Scenes != null) && m_Scenes.Contains(scene)) - { - m_Scenes.Remove(scene); - } - } - - void OnMakeRootAgent(ScenePresence presence) - { - // Get system folders - - // First check if they're here already - lock (m_InventoryCache) - { - if (m_InventoryCache.ContainsKey(presence.UUID)) - { - m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, system folders for {0} {1} already in cache", presence.Firstname, presence.Lastname); - return; - } - } - - // If not, go get them and place them in the cache - Dictionary folders = CacheSystemFolders(presence.UUID); - CacheInventoryServiceURL(presence.Scene, presence.UUID); - - m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}", - presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count); - - } - - void OnClientClosed(UUID clientID, Scene scene) - { - if (m_InventoryCache.ContainsKey(clientID)) // if it's still in cache - { - ScenePresence sp = null; - foreach (Scene s in m_Scenes) - { - s.TryGetScenePresence(clientID, out sp); - if ((sp != null) && !sp.IsChildAgent && (s != scene)) - { - m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping system folders in cache", - scene.RegionInfo.RegionName, clientID); - return; - } - } - - m_log.DebugFormat( - "[INVENTORY CACHE]: OnClientClosed in {0}, user {1} out of sim. Dropping system folders", - scene.RegionInfo.RegionName, clientID); - DropCachedSystemFolders(clientID); - DropInventoryServiceURL(clientID); - } - } - - /// - /// Cache a user's 'system' folders. - /// - /// - /// Folders cached - protected Dictionary CacheSystemFolders(UUID userID) - { - // If not, go get them and place them in the cache - Dictionary folders = m_Connector.GetSystemFolders(userID); - - if (folders.Count > 0) - lock (m_InventoryCache) - m_InventoryCache.Add(userID, folders); - - return folders; - } - - /// - /// Drop a user's cached 'system' folders - /// - /// - protected void DropCachedSystemFolders(UUID userID) - { - // Drop system folders - lock (m_InventoryCache) - if (m_InventoryCache.ContainsKey(userID)) - m_InventoryCache.Remove(userID); - } - - /// - /// Get the system folder for a particular asset type - /// - /// - /// - /// - public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) - { - m_log.DebugFormat("[INVENTORY CACHE]: Getting folder for asset type {0} for user {1}", type, userID); - - Dictionary folders = null; - - lock (m_InventoryCache) - { - m_InventoryCache.TryGetValue(userID, out folders); - - // In some situations (such as non-secured standalones), system folders can be requested without - // the user being logged in. So we need to try caching them here if we don't already have them. - if (null == folders) - CacheSystemFolders(userID); - - m_InventoryCache.TryGetValue(userID, out folders); - } - - if ((folders != null) && folders.ContainsKey(type)) - { - m_log.DebugFormat( - "[INVENTORY CACHE]: Returning folder {0} as type {1} for {2}", folders[type], type, userID); - - return folders[type]; - } - - m_log.WarnFormat("[INVENTORY CACHE]: Could not find folder for system type {0} for {1}", type, userID); - - return null; - } - - /// - /// Gets the user's inventory URL from its serviceURLs, if the user is foreign, - /// and sticks it in the cache - /// - /// - private void CacheInventoryServiceURL(Scene scene, UUID userID) - { - if (scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, userID) == null) - { - // The user does not have a local account; let's cache its service URL - string inventoryURL = string.Empty; - ScenePresence sp = null; - scene.TryGetScenePresence(userID, out sp); - if (sp != null) - { - AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); - if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) - { - inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); - if (inventoryURL != null && inventoryURL != string.Empty) - { - inventoryURL = inventoryURL.Trim(new char[] { '/' }); - m_InventoryURLs.Add(userID, inventoryURL); - } - } - } - } - } - - private void DropInventoryServiceURL(UUID userID) - { - lock (m_InventoryURLs) - if (m_InventoryURLs.ContainsKey(userID)) - m_InventoryURLs.Remove(userID); - } - - public string GetInventoryServiceURL(UUID userID) - { - if (m_InventoryURLs.ContainsKey(userID)) - return m_InventoryURLs[userID]; - - return null; - } - } -} From 42f5394677a0a033e501f343cc3ccf02627e09d8 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Dec 2011 15:39:12 -0800 Subject: [PATCH 25/37] Added field LocalToGrid in UserAccount. Context: make HG work in Simian. --- OpenSim/Services/Interfaces/IUserAccountService.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OpenSim/Services/Interfaces/IUserAccountService.cs b/OpenSim/Services/Interfaces/IUserAccountService.cs index 6cc8eb8eaf..4f80549982 100644 --- a/OpenSim/Services/Interfaces/IUserAccountService.cs +++ b/OpenSim/Services/Interfaces/IUserAccountService.cs @@ -37,11 +37,13 @@ namespace OpenSim.Services.Interfaces { public UserAccount() { + LocalToGrid = true; } public UserAccount(UUID principalID) { PrincipalID = principalID; + LocalToGrid = true; } /// @@ -70,6 +72,7 @@ namespace OpenSim.Services.Interfaces Email = email; ServiceURLs = new Dictionary(); Created = Util.UnixTimeSinceEpoch(); + LocalToGrid = true; } public UserAccount(UUID scopeID, UUID principalID, string firstName, string lastName, string email) @@ -81,6 +84,7 @@ namespace OpenSim.Services.Interfaces Email = email; ServiceURLs = new Dictionary(); Created = Util.UnixTimeSinceEpoch(); + LocalToGrid = true; } public string FirstName; @@ -91,6 +95,7 @@ namespace OpenSim.Services.Interfaces public int UserLevel; public int UserFlags; public string UserTitle; + public Boolean LocalToGrid; public Dictionary ServiceURLs; @@ -119,6 +124,8 @@ namespace OpenSim.Services.Interfaces UserFlags = Convert.ToInt32(kvp["UserFlags"].ToString()); if (kvp.ContainsKey("UserTitle")) UserTitle = kvp["UserTitle"].ToString(); + if (kvp.ContainsKey("LocalToGrid")) + Boolean.TryParse(kvp["LocalToGrid"].ToString(), out LocalToGrid); if (kvp.ContainsKey("Created")) Created = Convert.ToInt32(kvp["Created"].ToString()); @@ -152,6 +159,7 @@ namespace OpenSim.Services.Interfaces result["UserLevel"] = UserLevel.ToString(); result["UserFlags"] = UserFlags.ToString(); result["UserTitle"] = UserTitle; + result["LocalToGrid"] = LocalToGrid.ToString(); string str = string.Empty; foreach (KeyValuePair kvp in ServiceURLs) From 571efeddb20f38bb4164074b3c217be5387ca2e0 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Dec 2011 16:12:06 -0800 Subject: [PATCH 26/37] Added UserManagementModule.IsLocalGridUser(UUID) to be used throughout region Scenes and Modules. Changed existing modules to use it instead of assuming that foreign = null account. --- .../Avatar/Friends/HGFriendsModule.cs | 81 ++++++++++++++----- .../InstantMessage/HGMessageTransferModule.cs | 3 +- .../EntityTransfer/HGEntityTransferModule.cs | 7 +- .../HGInventoryAccessModule.cs | 10 +-- .../UserManagement/UserManagementModule.cs | 9 +++ .../Inventory/HGInventoryBroker.cs | 4 +- .../Framework/Interfaces/IUserManagement.cs | 2 + 7 files changed, 80 insertions(+), 36 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index 9a97925bfc..a77646c2e9 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs @@ -50,6 +50,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + IUserManagement m_uMan; + IUserManagement UserManagementModule + { + get + { + if (m_uMan == null) + m_uMan = m_Scenes[0].RequestModuleInterface(); + return m_uMan; + } + } + #region ISharedRegionModule public override string Name { @@ -369,9 +380,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends protected override FriendInfo[] GetFriendsFromService(IClientAPI client) { // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); + Boolean agentIsLocal = true; + if (UserManagementModule != null) + agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); - UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, client.AgentId); - if (account1 != null) + if (agentIsLocal) return base.GetFriendsFromService(client); FriendInfo[] finfos = new FriendInfo[0]; @@ -392,16 +405,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends protected override bool StoreRights(UUID agentID, UUID friendID, int rights) { - UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); - UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID); + Boolean agentIsLocal = true; + Boolean friendIsLocal = true; + if (UserManagementModule != null) + { + agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); + friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); + } + // Are they both local users? - if (account1 != null && account2 != null) + if (agentIsLocal && friendIsLocal) { // local grid users return base.StoreRights(agentID, friendID, rights); } - if (account1 != null) // agent is local, friend is foreigner + if (agentIsLocal) // agent is local, friend is foreigner { FriendInfo[] finfos = GetFriends(agentID); FriendInfo finfo = GetFriend(finfos, friendID); @@ -412,7 +431,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends } } - if (account2 != null) // agent is foreigner, friend is local + if (friendIsLocal) // agent is foreigner, friend is local { string agentUUI = GetUUI(friendID, agentID); if (agentUUI != string.Empty) @@ -427,10 +446,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends protected override void StoreBackwards(UUID friendID, UUID agentID) { - UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); - UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID); + Boolean agentIsLocal = true; + Boolean friendIsLocal = true; + if (UserManagementModule != null) + { + agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); + friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); + } + // Are they both local users? - if (account1 != null && account2 != null) + if (agentIsLocal && friendIsLocal) { // local grid users m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local"); @@ -444,10 +469,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends protected override void StoreFriendships(UUID agentID, UUID friendID) { - UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); - UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID); + Boolean agentIsLocal = true; + Boolean friendIsLocal = true; + if (UserManagementModule != null) + { + agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); + friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); + } + // Are they both local users? - if (agentAccount != null && friendAccount != null) + if (agentIsLocal && friendIsLocal) { // local grid users m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local"); @@ -465,13 +496,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends string agentFriendService = string.Empty; string friendFriendService = string.Empty; - if (agentClient != null) + if (agentIsLocal) { agentClientCircuit = ((Scene)(agentClient.Scene)).AuthenticateHandler.GetAgentCircuitData(agentClient.CircuitCode); agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); agentFriendService = agentClientCircuit.ServiceURLs["FriendsServerURI"].ToString(); } - if (friendClient != null) + if (friendIsLocal) { friendClientCircuit = ((Scene)(friendClient.Scene)).AuthenticateHandler.GetAgentCircuitData(friendClient.CircuitCode); friendUUI = Util.ProduceUserUniversalIdentifier(friendClientCircuit); @@ -484,7 +515,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends // Generate a random 8-character hex number that will sign this friendship string secret = UUID.Random().ToString().Substring(0, 8); - if (agentAccount != null) // agent is local, 'friend' is foreigner + if (agentIsLocal) // agent is local, 'friend' is foreigner { // This may happen when the agent returned home, in which case the friend is not there // We need to look for its information in the friends list itself @@ -520,7 +551,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends friendsConn.NewFriendship(friendID, agentUUI + ";" + secret); } } - else if (friendAccount != null) // 'friend' is local, agent is foreigner + else if (friendIsLocal) // 'friend' is local, agent is foreigner { // store in the local friends service a reference to the foreign agent FriendsService.StoreFriend(friendID.ToString(), agentUUI + ";" + secret, 1); @@ -553,10 +584,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends protected override bool DeleteFriendship(UUID agentID, UUID exfriendID) { - UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); - UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, exfriendID); + Boolean agentIsLocal = true; + Boolean friendIsLocal = true; + if (UserManagementModule != null) + { + agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); + friendIsLocal = UserManagementModule.IsLocalGridUser(exfriendID); + } + // Are they both local users? - if (agentAccount != null && friendAccount != null) + if (agentIsLocal && friendIsLocal) { // local grid users return base.DeleteFriendship(agentID, exfriendID); @@ -566,7 +603,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends string agentUUI = string.Empty; string friendUUI = string.Empty; - if (agentAccount != null) // agent is local, 'friend' is foreigner + if (agentIsLocal) // agent is local, 'friend' is foreigner { // We need to look for its information in the friends list itself FriendInfo[] finfos = GetFriends(agentID); @@ -587,7 +624,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends return true; } } - else if (friendAccount != null) // agent is foreigner, 'friend' is local + else if (friendIsLocal) // agent is foreigner, 'friend' is local { agentUUI = GetUUI(exfriendID, agentID); diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs index 560d9136ca..bf1d78760b 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs @@ -180,10 +180,9 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage // m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); // Is the user a local user? - UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, toAgentID); string url = string.Empty; bool foreigner = false; - if (account == null) // foreign user + if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(toAgentID)) // foreign user { url = UserManagementModule.GetUserServerURL(toAgentID, "IMServerURI"); foreigner = true; diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index 841363cf39..8d41728880 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs @@ -187,8 +187,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); // Let's find out if this is a foreign user or a local user - UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, id); - if (account != null) + IUserManagement uMan = m_aScene.RequestModuleInterface(); + if (uMan != null && uMan.IsLocalGridUser(id)) { // local grid user m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local"); @@ -313,8 +313,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer } // Let's find out if this is a foreign user or a local user + IUserManagement uMan = m_aScene.RequestModuleInterface(); UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, obj.AgentId); - if (account != null) + if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) { // local grid user return; diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index 49d484b0e8..bf24ebc66a 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs @@ -124,8 +124,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess protected override string GenerateLandmark(ScenePresence presence, out string prefix, out string suffix) { - UserAccount account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, presence.UUID); - if (account == null) + if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(presence.UUID)) prefix = "HG "; else prefix = string.Empty; @@ -210,12 +209,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess public override bool IsForeignUser(UUID userID, out string assetServerURL) { assetServerURL = string.Empty; - UserAccount account = null; - if (m_Scene.UserAccountService != null) - account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID); - if (account == null) // foreign - { + if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID)) + { // foreign ScenePresence sp = null; if (m_Scene.TryGetScenePresence(userID, out sp)) { diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index a40a6a4822..dbe2560493 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs @@ -425,6 +425,15 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement //} + public bool IsLocalGridUser(UUID uuid) + { + UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, uuid); + if (account == null || (account != null && !account.LocalToGrid)) + return false; + + return true; + } + #endregion IUserManagement private void HandleShowUsers(string module, string[] cmd) diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 0d121edb97..b5c0af6686 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs @@ -218,9 +218,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory /// private void CacheInventoryServiceURL(UUID userID) { - if (m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID) == null) + if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID)) { - // The user does not have a local account; let's cache its service URL + // The user is not local; let's cache its service URL string inventoryURL = string.Empty; ScenePresence sp = null; foreach (Scene scene in m_Scenes) diff --git a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs index c66e053aa3..ea0ba5935b 100644 --- a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs +++ b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs @@ -48,5 +48,7 @@ namespace OpenSim.Region.Framework.Interfaces /// /// void AddUser(UUID uuid, string firstName, string lastName, string profileURL); + + bool IsLocalGridUser(UUID uuid); } } From 967ea519800a5a6b3bfba586172a218e545c2009 Mon Sep 17 00:00:00 2001 From: Mic Bowman Date: Thu, 29 Dec 2011 16:37:16 -0800 Subject: [PATCH 27/37] Set the local grid flag in the user account through the simian connector This should make bi-directional hypergrid work. --- .../SimianGrid/SimianUserAccountServiceConnector.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 91e2976586..4350749295 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs @@ -287,6 +287,10 @@ namespace OpenSim.Services.Connectors.SimianGrid account.UserFlags = response["UserFlags"].AsInteger(); account.UserLevel = response["AccessLevel"].AsInteger(); account.UserTitle = response["UserTitle"].AsString(); + account.LocalToGrid = true; + if (response.ContainsKey("LocalToGrid")) + account.LocalToGrid = (response["LocalToGrid"].AsString() == "true" ? true : false); + GetFirstLastName(response["Name"].AsString(), out account.FirstName, out account.LastName); // Cache the user account info From 5aad1f7afed9770b94b4cabdd2f681781a16d662 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 30 Dec 2011 10:40:57 -0800 Subject: [PATCH 28/37] Default LocalToGrid to true. Fixes minor bug introduced yesterday where old robust UserAccount service would result is LocalToGrid at the sim being false. --- OpenSim/Services/Interfaces/IUserAccountService.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/OpenSim/Services/Interfaces/IUserAccountService.cs b/OpenSim/Services/Interfaces/IUserAccountService.cs index 4f80549982..1b859805a6 100644 --- a/OpenSim/Services/Interfaces/IUserAccountService.cs +++ b/OpenSim/Services/Interfaces/IUserAccountService.cs @@ -37,13 +37,11 @@ namespace OpenSim.Services.Interfaces { public UserAccount() { - LocalToGrid = true; } public UserAccount(UUID principalID) { PrincipalID = principalID; - LocalToGrid = true; } /// @@ -72,7 +70,6 @@ namespace OpenSim.Services.Interfaces Email = email; ServiceURLs = new Dictionary(); Created = Util.UnixTimeSinceEpoch(); - LocalToGrid = true; } public UserAccount(UUID scopeID, UUID principalID, string firstName, string lastName, string email) @@ -84,7 +81,6 @@ namespace OpenSim.Services.Interfaces Email = email; ServiceURLs = new Dictionary(); Created = Util.UnixTimeSinceEpoch(); - LocalToGrid = true; } public string FirstName; @@ -95,7 +91,7 @@ namespace OpenSim.Services.Interfaces public int UserLevel; public int UserFlags; public string UserTitle; - public Boolean LocalToGrid; + public Boolean LocalToGrid = true; public Dictionary ServiceURLs; From 5d8ed077bc01b46cdd4a6854cc08c735ebb66c24 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 30 Dec 2011 19:17:35 -0800 Subject: [PATCH 29/37] Bring back the Hyperlinker to the Robust console. Moved the config to [GridService]. Changed all HG-related .inis, including HyperSimianGrid. No changes in user-facing inis. --- .../Services/GridService/HypergridLinker.cs | 57 +++++++++---------- bin/Robust.HG.ini.example | 2 + bin/config-include/GridHypergrid.ini | 2 +- bin/config-include/HyperSimianGrid.ini | 2 +- bin/config-include/StandaloneHypergrid.ini | 2 +- 5 files changed, 31 insertions(+), 34 deletions(-) diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs index 90c022f743..78eab3dd2b 100644 --- a/OpenSim/Services/GridService/HypergridLinker.cs +++ b/OpenSim/Services/GridService/HypergridLinker.cs @@ -102,50 +102,45 @@ namespace OpenSim.Services.GridService public HypergridLinker(IConfigSource config, GridService gridService, IRegionData db) { - IConfig modulesConfig = config.Configs["Modules"]; - if (modulesConfig == null) - return; + IConfig gridConfig = config.Configs["GridService"]; + if (gridConfig == null) + return; - if (modulesConfig.GetString("HypergridLinker", "") != "HypergridLinker") - return; - - m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType()); + if (!gridConfig.GetBoolean("HypergridLinker", false)) + return; m_Database = db; m_GridService = gridService; + m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType()); - IConfig gridConfig = config.Configs["GridService"]; - if (gridConfig != null) - { - string assetService = gridConfig.GetString("AssetService", string.Empty); + string assetService = gridConfig.GetString("AssetService", string.Empty); - Object[] args = new Object[] { config }; + Object[] args = new Object[] { config }; - if (assetService != string.Empty) - m_AssetService = ServerUtils.LoadPlugin(assetService, args); + if (assetService != string.Empty) + m_AssetService = ServerUtils.LoadPlugin(assetService, args); - string scope = gridConfig.GetString("ScopeID", string.Empty); - if (scope != string.Empty) - UUID.TryParse(scope, out m_ScopeID); + string scope = gridConfig.GetString("ScopeID", string.Empty); + if (scope != string.Empty) + UUID.TryParse(scope, out m_ScopeID); // m_Check4096 = gridConfig.GetBoolean("Check4096", true); - m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles"); + m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles"); - m_ThisGatekeeper = gridConfig.GetString("Gatekeeper", string.Empty); - try - { - m_ThisGatekeeperURI = new Uri(m_ThisGatekeeper); - } - catch - { - m_log.WarnFormat("[HYPERGRID LINKER]: Malformed URL in [GridService], variable Gatekeeper = {0}", m_ThisGatekeeper); - } - - m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); - - m_log.Debug("[HYPERGRID LINKER]: Loaded all services..."); + m_ThisGatekeeper = gridConfig.GetString("Gatekeeper", string.Empty); + try + { + m_ThisGatekeeperURI = new Uri(m_ThisGatekeeper); } + catch + { + m_log.WarnFormat("[HYPERGRID LINKER]: Malformed URL in [GridService], variable Gatekeeper = {0}", m_ThisGatekeeper); + } + + m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); + + m_log.Debug("[HYPERGRID LINKER]: Loaded all services..."); if (!string.IsNullOrEmpty(m_MapTileDirectory)) { diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index eee7dc894c..49ee41a5b6 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -82,6 +82,8 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 ; * [GridService] LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" + HypergridLinker = true + ; Realm = "regions" ; AllowDuplicateNames = "True" diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini index 4c3249816c..5f0ba370e1 100644 --- a/bin/config-include/GridHypergrid.ini +++ b/bin/config-include/GridHypergrid.ini @@ -26,7 +26,6 @@ LandServices = "RemoteLandServicesConnector" FriendsModule = "HGFriendsModule" MapImageService = "MapImageServiceModule" - HypergridLinker = "HypergridLinker" LandServiceInConnector = true NeighbourServiceInConnector = true @@ -60,6 +59,7 @@ ; Needed to display non-default map tile images for linked regions AssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector" + HypergridLinker = true AllowHypergridMapSearch = true [LibraryService] diff --git a/bin/config-include/HyperSimianGrid.ini b/bin/config-include/HyperSimianGrid.ini index ec4efc0274..99a589c74c 100644 --- a/bin/config-include/HyperSimianGrid.ini +++ b/bin/config-include/HyperSimianGrid.ini @@ -40,7 +40,6 @@ LibraryModule = false AssetCaching = "FlotsamAssetCache" - HypergridLinker = "HypergridLinker" [SimulationDataStore] LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" @@ -56,6 +55,7 @@ StorageProvider = "OpenSim.Data.Null.dll:NullRegionData" NetworkConnector = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector" + HypergridLinker = true AllowHypergridMapSearch = true [LibraryService] diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini index f8c258a8a3..00beb31f10 100644 --- a/bin/config-include/StandaloneHypergrid.ini +++ b/bin/config-include/StandaloneHypergrid.ini @@ -22,7 +22,6 @@ EntityTransferModule = "HGEntityTransferModule" InventoryAccessModule = "HGInventoryAccessModule" FriendsModule = "HGFriendsModule" - HypergridLinker = "HypergridLinker" InventoryServiceInConnector = true AssetServiceInConnector = true @@ -84,6 +83,7 @@ ; Needed to display non-default map tile images for remote regions AssetService = "OpenSim.Services.AssetService.dll:AssetService" + HypergridLinker = true AllowHypergridMapSearch = true [PresenceService] From 56dbcae402000e199e556827944dfdd1bb3a64be Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Fri, 30 Dec 2011 21:32:28 -0800 Subject: [PATCH 30/37] Bug fix in map tiles in standalone: the map has been blank since commit 01ae916bad672722aa62ee712b7b580d6f5f4370 r/17324 (Nov.18, justincc). But the root cause comes from commit 02e54c57c4901167779f07ed3e89fb1d24ffc22a Author: Oren Hurvitz Date: 7/22/2011 This is a nasty situation. The map tile UUID is, in principle, stored authoritatively in RegionSettings. However, it also needs to be stored in the Grid Service because that's how other sims can retrieve it to send it in Map Blocks to non-V3 viewers. So every time the tile image changes, that change needs to propagate to the Grid Service, and this is done via RegisterRegion (ugh!). Interestingly, this problem didn't affect grids because by default AllowRemoteDelete is false, so the prior images aren't being deleted from the asset servers -- but they were not being correctly updated in the map either, the map was stuck with old images. --- OpenSim/Region/Framework/Scenes/Scene.cs | 33 ++++++++++++++---------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b4972d60ba..0f84da970f 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -710,7 +710,7 @@ namespace OpenSim.Region.Framework.Scenes if (maptileRefresh != 0) { m_mapGenerationTimer.Interval = maptileRefresh * 1000; - m_mapGenerationTimer.Elapsed += RegenerateMaptile; + m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister; m_mapGenerationTimer.AutoReset = true; m_mapGenerationTimer.Start(); } @@ -1647,21 +1647,17 @@ namespace OpenSim.Region.Framework.Scenes { m_sceneGridService.SetScene(this); + //// Unfortunately this needs to be here and it can't be async. + //// The map tile image is stored in RegionSettings, but it also needs to be + //// stored in the GridService, because that's what the world map module uses + //// to send the map image UUIDs (of other regions) to the viewer... + if (m_generateMaptiles) + RegenerateMaptile(); + GridRegion region = new GridRegion(RegionInfo); string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); if (error != String.Empty) - { throw new Exception(error); - } - - // Generate the maptile asynchronously, because sometimes it can be very slow and we - // don't want this to delay starting the region. - if (m_generateMaptiles) - { - Util.FireAndForget(delegate { - RegenerateMaptile(null, null); - }); - } } #endregion @@ -5032,13 +5028,24 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - public void RegenerateMaptile(object sender, ElapsedEventArgs e) + private void RegenerateMaptile() { IWorldMapModule mapModule = RequestModuleInterface(); if (mapModule != null) mapModule.GenerateMaptile(); } + private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) + { + RegenerateMaptile(); + + // We need to propagate the new image UUID to the grid service + // so that all simulators can retrieve it + string error = GridService.RegisterRegion(RegionInfo.ScopeID, new GridRegion(RegionInfo)); + if (error != string.Empty) + throw new Exception(error); + } + // This method is called across the simulation connector to // determine if a given agent is allowed in this region // AS A ROOT AGENT. Returning false here will prevent them From 87374274b9a53003de40828f7eb2906ecd9ed8ed Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 1 Jan 2012 23:44:46 -0500 Subject: [PATCH 31/37] Fix for failed http request status Thanks "sendapatch" for fixes to llHTTPRequest status reporting. --- .../HttpRequest/ScriptsHttpRequests.cs | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs index 43672d114d..8fb5d75aec 100644 --- a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs +++ b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs @@ -411,8 +411,21 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest } Request.Timeout = HttpTimeout; - // execute the request - response = (HttpWebResponse) Request.GetResponse(); + try + { + // execute the request + response = (HttpWebResponse) Request.GetResponse(); + } + catch (WebException e) + { + if (e.Status != WebExceptionStatus.ProtocolError) + { + throw; + } + response = (HttpWebResponse)e.Response; + } + + Status = (int)response.StatusCode; Stream resStream = response.GetResponseStream(); @@ -436,17 +449,8 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest } catch (Exception e) { - if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError) - { - HttpWebResponse webRsp = (HttpWebResponse)((WebException)e).Response; - Status = (int)webRsp.StatusCode; - ResponseBody = webRsp.StatusDescription; - } - else - { - Status = (int)OSHttpStatusCode.ClientErrorJoker; - ResponseBody = e.Message; - } + Status = (int)OSHttpStatusCode.ClientErrorJoker; + ResponseBody = e.Message; _finished = true; return; @@ -457,7 +461,6 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest response.Close(); } - Status = (int)OSHttpStatusCode.SuccessOk; _finished = true; } From 014a86c26b138e4fc861fd30634e866b83dbabdb Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 2 Jan 2012 19:46:30 +0000 Subject: [PATCH 32/37] Adding commented out log messages and some minor formatting for future bug hunting. No functional changes. --- .../WebFetchInvDescHandler.cs | 148 +++++++++--------- .../ClientStack/Linden/UDP/LLImageManager.cs | 9 +- .../Agent/TextureSender/J2KDecoderModule.cs | 3 + .../Asset/LocalAssetServiceConnector.cs | 2 + OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 1 + .../Connectors/Asset/AssetServiceConnector.cs | 6 + 6 files changed, 97 insertions(+), 72 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index e91a4b8b88..3ce4e667c6 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs @@ -240,78 +240,84 @@ namespace OpenSim.Capabilities.Handlers if (containingFolder != null) { +// m_log.DebugFormat( +// "[WEB FETCH INV DESC HANDLER]: Retrieved folder {0} {1} for agent id {2}", +// containingFolder.Name, containingFolder.ID, agentID); + version = containingFolder.Version; - - if (fetchItems) - { - /* - List linkedItemsToAdd = new List(); - - foreach (InventoryItemBase item in contents.Items) - { - if (item.AssetType == (int)AssetType.Link) - { - InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); - - // Take care of genuinely broken links where the target doesn't exist - // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, - // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles - // rather than having to keep track of every folder requested in the recursion. - if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link && linkedItem.AssetType == (int)AssetType.Object) - linkedItemsToAdd.Add(linkedItem); - } - } - - foreach (InventoryItemBase linkedItem in linkedItemsToAdd) - { - m_log.DebugFormat( - "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}", - linkedItem.Name, folderID, agentID); - - contents.Items.Insert(0, linkedItem); - } - */ - - /* - // If the folder requested contains links, then we need to send those folders first, otherwise the links - // will be broken in the viewer. - HashSet linkedItemFolderIdsToSend = new HashSet(); - foreach (InventoryItemBase item in contents.Items) - { - if (item.AssetType == (int)AssetType.Link) - { - InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); - - // Take care of genuinely broken links where the target doesn't exist - // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, - // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles - // rather than having to keep track of every folder requested in the recursion. - if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) - { - // We don't need to send the folder if source and destination of the link are in the same - // folder. - if (linkedItem.Folder != containingFolder.ID) - linkedItemFolderIdsToSend.Add(linkedItem.Folder); - } - } - } - - foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend) - { - m_log.DebugFormat( - "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}", - linkedItemFolderId, folderID, agentID); - - int dummyVersion; - InventoryCollection linkedCollection - = Fetch( - agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion); - - contents.Folders.AddRange(linkedCollection.Folders); - contents.Items.AddRange(linkedCollection.Items); - } - */ - } +// +// if (fetchItems) +// { +// List linkedItemsToAdd = new List(); +// +// foreach (InventoryItemBase item in contents.Items) +// { +// if (item.AssetType == (int)AssetType.Link) +// { +// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); +// +// // Take care of genuinely broken links where the target doesn't exist +// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, +// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles +// // rather than having to keep track of every folder requested in the recursion. +// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) +// linkedItemsToAdd.Insert(0, linkedItem); +// } +// } +// +// foreach (InventoryItemBase linkedItem in linkedItemsToAdd) +// { +// m_log.DebugFormat( +// "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}", +// linkedItem.Name, folderID, agentID); +// +// contents.Items.Add(linkedItem); +// } +// +// // If the folder requested contains links, then we need to send those folders first, otherwise the links +// // will be broken in the viewer. +// HashSet linkedItemFolderIdsToSend = new HashSet(); +// foreach (InventoryItemBase item in contents.Items) +// { +// if (item.AssetType == (int)AssetType.Link) +// { +// InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); +// +// // Take care of genuinely broken links where the target doesn't exist +// // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, +// // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles +// // rather than having to keep track of every folder requested in the recursion. +// if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) +// { +// // We don't need to send the folder if source and destination of the link are in the same +// // folder. +// if (linkedItem.Folder != containingFolder.ID) +// linkedItemFolderIdsToSend.Add(linkedItem.Folder); +// } +// } +// } +// +// foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend) +// { +// m_log.DebugFormat( +// "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}", +// linkedItemFolderId, folderID, agentID); +// +// int dummyVersion; +// InventoryCollection linkedCollection +// = Fetch( +// agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion); +// +// InventoryFolderBase linkedFolder = new InventoryFolderBase(linkedItemFolderId); +// linkedFolder.Owner = agentID; +// linkedFolder = m_InventoryService.GetFolder(linkedFolder); +// +//// contents.Folders.AddRange(linkedCollection.Folders); +// +// contents.Folders.Add(linkedFolder); +// contents.Items.AddRange(linkedCollection.Items); +// } +// } } } else diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs index 9e0db12734..5c4a6624c4 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs @@ -39,6 +39,9 @@ using log4net; namespace OpenSim.Region.ClientStack.LindenUDP { + /// + /// This class handles UDP texture requests. + /// public class LLImageManager { private sealed class J2KImageComparer : IComparer @@ -228,15 +231,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP image.PriorityQueueHandle = null; lock (m_syncRoot) + { try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); } catch (Exception) { } + } } void RemoveImageFromQueue(J2KImage image) { lock (m_syncRoot) + { try { m_priorityQueue.Delete(image.PriorityQueueHandle); } catch (Exception) { } + } } void UpdateImageInQueue(J2KImage image) @@ -254,4 +261,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP #endregion Priority Queue Helpers } -} +} \ No newline at end of file diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs index 1386e86729..7dd90874b6 100644 --- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs +++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs @@ -152,6 +152,9 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender /// JPEG2000 data private void DoJ2KDecode(UUID assetID, byte[] j2kData) { +// m_log.DebugFormat( +// "[J2KDecoderModule]: Doing J2K decoding of {0} bytes for asset {1}", j2kData.Length, assetID); + //int DecodeTime = 0; //DecodeTime = Environment.TickCount; OpenJPEG.J2KLayerInfo[] layers; diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs index cc5d06199e..2e6ec908e1 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs @@ -170,6 +170,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset public AssetBase GetCached(string id) { +// m_log.DebugFormat("[LOCAL ASSET SERVICES CONNECTOR]: Cache request for {0}", id); + if (m_Cache != null) return m_Cache.Get(id); diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 2194ff0fe0..228eca9896 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -2822,6 +2822,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_global_contactcount = 0; d.WorldQuickStep(world, ODE_STEPSIZE); + d.JointGroupEmpty(contactgroup); } catch (Exception e) diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs index fdab254ed8..d7b2ff85ed 100644 --- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs @@ -100,6 +100,8 @@ namespace OpenSim.Services.Connectors public AssetBase Get(string id) { +// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Synchronous get request for {0}", id); + string uri = m_ServerURI + "/assets/" + id; AssetBase asset = null; @@ -119,6 +121,8 @@ namespace OpenSim.Services.Connectors public AssetBase GetCached(string id) { +// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Cache request for {0}", id); + if (m_Cache != null) return m_Cache.Get(id); @@ -177,6 +181,8 @@ namespace OpenSim.Services.Connectors public bool Get(string id, Object sender, AssetRetrieved handler) { +// m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Potentially asynchronous get request for {0}", id); + string uri = m_ServerURI + "/assets/" + id; AssetBase asset = null; From fac8c258515c533854549109f14615b8be3ddc15 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Mon, 2 Jan 2012 21:31:42 +0000 Subject: [PATCH 33/37] Reduce accessibility of some J2KImage/LLImageManager properties and methods to reduce potential code complexity and make code reading easier. --- .../Region/ClientStack/Linden/UDP/J2KImage.cs | 16 ++++++++-------- .../ClientStack/Linden/UDP/LLImageManager.cs | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs index 1dea87e091..cb9692a77b 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs @@ -56,9 +56,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP public IAssetService AssetService; public UUID AgentID; public IInventoryAccessModule InventoryAccessModule; - public OpenJPEG.J2KLayerInfo[] Layers; - public bool IsDecoded; - public bool HasAsset; + private OpenJPEG.J2KLayerInfo[] m_layers; + public bool IsDecoded { get; private set; } + public bool HasAsset { get; private set; } public C5.IPriorityQueueHandle PriorityQueueHandle; private uint m_currentPacket; @@ -170,14 +170,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (DiscardLevel >= 0 || m_stopPacket == 0) { // This shouldn't happen, but if it does, we really can't proceed - if (Layers == null) + if (m_layers == null) { m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer"); m_currentPacket = m_stopPacket; return; } - int maxDiscardLevel = Math.Max(0, Layers.Length - 1); + int maxDiscardLevel = Math.Max(0, m_layers.Length - 1); // Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel if (DiscardLevel < 0 && m_stopPacket == 0) @@ -187,9 +187,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel); //Calculate the m_stopPacket - if (Layers.Length > 0) + if (m_layers.Length > 0) { - m_stopPacket = (uint)GetPacketForBytePosition(Layers[(Layers.Length - 1) - DiscardLevel].End); + m_stopPacket = (uint)GetPacketForBytePosition(m_layers[(m_layers.Length - 1) - DiscardLevel].End); //I don't know why, but the viewer seems to expect the final packet if the file //is just one packet bigger. if (TexturePacketCount() == m_stopPacket + 1) @@ -341,7 +341,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers) { - Layers = layers; + m_layers = layers; IsDecoded = true; RunUpdate(); } diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs index 5c4a6624c4..e3a881f790 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs @@ -211,7 +211,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region Priority Queue Helpers - J2KImage GetHighestPriorityImage() + private J2KImage GetHighestPriorityImage() { J2KImage image = null; @@ -226,7 +226,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP return image; } - void AddImageToQueue(J2KImage image) + private void AddImageToQueue(J2KImage image) { image.PriorityQueueHandle = null; @@ -237,7 +237,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - void RemoveImageFromQueue(J2KImage image) + private void RemoveImageFromQueue(J2KImage image) { lock (m_syncRoot) { @@ -246,7 +246,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - void UpdateImageInQueue(J2KImage image) + private void UpdateImageInQueue(J2KImage image) { lock (m_syncRoot) { From fa79588a20fb4bcc79a24214b7c055efaff97f77 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 3 Jan 2012 15:42:36 +0000 Subject: [PATCH 34/37] minor: add missing newlines to pCampbot usage statement --- OpenSim/Tools/pCampBot/pCampBot.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenSim/Tools/pCampBot/pCampBot.cs b/OpenSim/Tools/pCampBot/pCampBot.cs index 6249fae019..a73fcbec8f 100644 --- a/OpenSim/Tools/pCampBot/pCampBot.cs +++ b/OpenSim/Tools/pCampBot/pCampBot.cs @@ -112,10 +112,10 @@ namespace pCampBot " -lastname lastname for the bots. Each lastname will have _ appended, e.g. Ima Bot_0\n" + " -password password for the bots\n" + " -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p\n" + - " current options are:" + - " p (physics)" + - " g (grab)" + - " t (teleport)" + + " current options are:\n" + + " p (physics)\n" + + " g (grab)\n" + + " t (teleport)\n" + // " c (cross)" + " -wear set appearance folder to load from (default: no)\n" + " -h, -help show this message"); From 6941058824e418bcdc2932c35f226bbcc5cea2ad Mon Sep 17 00:00:00 2001 From: BlueWall Date: Sun, 1 Jan 2012 14:57:13 -0500 Subject: [PATCH 35/37] Profile Updates Update basic profile to use the replaceable interface, making configuration less error-prone. Add support to query avatar's home user account and profile service for regions usng the updated OpenProfileModule with Hypergrid. --- OpenSim/Framework/IProfileModule.cs | 37 ++++++++ .../Avatar/Profile/BasicProfileModule.cs | 12 ++- .../UserManagement/UserManagementModule.cs | 93 +++++++++++++++++++ .../Framework/Interfaces/IUserManagement.cs | 3 + .../Hypergrid/UserAgentServerConnector.cs | 33 +++++++ .../Hypergrid/UserAgentServiceConnector.cs | 54 +++++++++++ .../HypergridService/UserAgentService.cs | 25 +++++ .../Services/Interfaces/IHypergridServices.cs | 1 + 8 files changed, 253 insertions(+), 5 deletions(-) create mode 100644 OpenSim/Framework/IProfileModule.cs diff --git a/OpenSim/Framework/IProfileModule.cs b/OpenSim/Framework/IProfileModule.cs new file mode 100644 index 0000000000..ef03d4a62a --- /dev/null +++ b/OpenSim/Framework/IProfileModule.cs @@ -0,0 +1,37 @@ +/* + * 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 OpenSimulator 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 OpenMetaverse; + +namespace OpenSim.Framework +{ + public interface IProfileModule + { + void RequestAvatarProperties(IClientAPI remoteClient, UUID avatarID); + + } +} diff --git a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs index dee0ad4bfc..eb1e4b5f13 100644 --- a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs @@ -43,7 +43,7 @@ using OpenSim.Services.Interfaces; namespace OpenSim.Region.CoreModules.Avatar.Profile { [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] - public class BasicProfileModule : ISharedRegionModule + public class BasicProfileModule : IProfileModule, ISharedRegionModule { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -57,6 +57,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile public void Initialise(IConfigSource config) { + // This can be reduced later as the loader will determine + // whether we are needed if (config.Configs["Profile"] != null) { if (config.Configs["Profile"].GetString("Module", string.Empty) != "BasicProfileModule") @@ -65,14 +67,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled"); m_Enabled = true; - } public void AddRegion(Scene scene) { if (!m_Enabled) return; - + lock (m_Scenes) { if (!m_Scenes.Contains(scene)) @@ -80,6 +81,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile m_Scenes.Add(scene); // Hook up events scene.EventManager.OnNewClient += OnNewClient; + scene.RegisterModuleInterface(this); } } } @@ -116,7 +118,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile public Type ReplaceableInterface { - get { return null; } + get { return typeof(IProfileModule); } } #endregion @@ -170,4 +172,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index dbe2560493..37292d66fd 100644 --- a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs +++ b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs @@ -50,6 +50,9 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement public string LastName { get; set; } public string HomeURL { get; set; } public Dictionary ServerURLs { get; set; } + public string Title { get; set; } + public int Flags { get; set; } + public int Created { get; set; } } public class UserManagementModule : ISharedRegionModule, IUserManagement @@ -281,6 +284,94 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement return string.Empty; } + public int GetUserFlags(UUID userID) + { + UserData userdata; + lock (m_UserCache) + m_UserCache.TryGetValue(userID, out userdata); + + if (userdata.Flags == -1) + GetUserInfo(userID); + + if (userdata.Flags != -1) + return userdata.Flags; + + return 0; + } + + public int GetUserCreated(UUID userID) + { + UserData userdata; + lock (m_UserCache) + m_UserCache.TryGetValue(userID, out userdata); + + if (userdata.Flags == -1) + GetUserInfo(userID); + + if (userdata.Created != -1) + return userdata.Created; + + return 0; + } + + public string GetUserTitle(UUID userID) + { + UserData userdata; + lock (m_UserCache) + m_UserCache.TryGetValue(userID, out userdata); + + if (userdata.Flags == -1) + GetUserInfo(userID); + + if (userdata.Created != -1) + return userdata.Title; + + return string.Empty; + } + + // This will cache the user data + // Change this to return bool + private bool GetUserInfo(UUID userID) + { + UserData userdata; + lock (m_UserCache) + m_UserCache.TryGetValue(userID, out userdata); + + if (userdata != null) + { +// m_log.DebugFormat("[USER MANAGEMENT MODULE]: Requested url type {0} for {1}", serverType, userID); + + if (userdata.Flags >= 0) + { + // This is already populated + return true; + } + + if (userdata.HomeURL != null && userdata.HomeURL != string.Empty) + { + m_log.DebugFormat( + "[USER MANAGEMENT MODULE]: Requesting user flags from '{0}' for {1}", + userdata.HomeURL, userID); + + UserAgentServiceConnector uConn = new UserAgentServiceConnector(userdata.HomeURL); + Dictionary info = uConn.GetUserInfo(userID); + + // Pull our data now + if (info["result"].ToString() == "success") + { + userdata.Flags = (int)info["user_flags"]; + userdata.Created = (int)info["user_created"]; + userdata.Title = (string)info["user_title"]; + + return true; + } + } + } + + return false; + } + + public string GetUserUUI(UUID userID) { UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID); @@ -352,6 +443,8 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement { UserData user = new UserData(); user.Id = id; + user.Flags = -1; + user.Created = -1; if (creatorData != null && creatorData != string.Empty) { diff --git a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs index ea0ba5935b..54dfaf4c63 100644 --- a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs +++ b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs @@ -14,6 +14,9 @@ namespace OpenSim.Region.Framework.Interfaces string GetUserHomeURL(UUID uuid); string GetUserUUI(UUID uuid); string GetUserServerURL(UUID uuid, string serverType); + int GetUserFlags(UUID userID); + int GetUserCreated(UUID userID); + string GetUserTitle(UUID userID); /// /// Add a user. diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs index 07c69624b7..1bd37062db 100644 --- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs @@ -91,6 +91,7 @@ namespace OpenSim.Server.Handlers.Hypergrid server.AddXmlRPCHandler("status_notification", StatusNotification, false); server.AddXmlRPCHandler("get_online_friends", GetOnlineFriends, false); + server.AddXmlRPCHandler("get_user_info", GetUserInfo, false); server.AddXmlRPCHandler("get_server_urls", GetServerURLs, false); server.AddXmlRPCHandler("locate_user", LocateUser, false); @@ -299,6 +300,38 @@ namespace OpenSim.Server.Handlers.Hypergrid } + public XmlRpcResponse GetUserInfo(XmlRpcRequest request, IPEndPoint remoteClient) + { + Hashtable hash = new Hashtable(); + Hashtable requestData = (Hashtable)request.Params[0]; + + // This needs checking! + if (requestData.ContainsKey("userID")) + { + string userID_str = (string)requestData["userID"]; + UUID userID = UUID.Zero; + UUID.TryParse(userID_str, out userID); + + //int userFlags = m_HomeUsersService.GetUserFlags(userID); + Dictionary userInfo = m_HomeUsersService.GetUserInfo(userID); + if (userInfo.Count > 0) + { + foreach (KeyValuePair kvp in userInfo) + { + hash[kvp.Key] = kvp.Value; + } + } + else + { + hash["result"] = "failure"; + } + } + + XmlRpcResponse response = new XmlRpcResponse(); + response.Value = hash; + return response; + } + public XmlRpcResponse GetServerURLs(XmlRpcRequest request, IPEndPoint remoteClient) { Hashtable hash = new Hashtable(); diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index 57b6d16fe5..5b27cf6427 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs @@ -561,6 +561,60 @@ namespace OpenSim.Services.Connectors.Hypergrid return online; } + public Dictionary GetUserInfo (UUID userID) + { + Hashtable hash = new Hashtable(); + hash["userID"] = userID.ToString(); + + IList paramList = new ArrayList(); + paramList.Add(hash); + + XmlRpcRequest request = new XmlRpcRequest("get_user_info", paramList); + + Dictionary info = new Dictionary(); + XmlRpcResponse response = null; + try + { + response = request.Send(m_ServerURL, 10000); + } + catch + { + m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for GetUserInfo", m_ServerURL); + return info; + } + + if (response.IsFault) + { + m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for GetServerURLs returned an error: {1}", m_ServerURL, response.FaultString); + return info; + } + + hash = (Hashtable)response.Value; + try + { + if (hash == null) + { + m_log.ErrorFormat("[USER AGENT CONNECTOR]: GetUserInfo Got null response from {0}! THIS IS BAAAAD", m_ServerURL); + return info; + } + + // Here is the actual response + foreach (object key in hash.Keys) + { + if (hash[key] != null) + { + info.Add(key.ToString(), hash[key]); + } + } + } + catch + { + m_log.ErrorFormat("[USER AGENT CONNECTOR]: Got exception on GetOnlineFriends response."); + } + + return info; + } + public Dictionary GetServerURLs(UUID userID) { Hashtable hash = new Hashtable(); diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index 85386602d5..f681df4243 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs @@ -488,6 +488,31 @@ namespace OpenSim.Services.HypergridService return online; } + public Dictionary GetUserInfo(UUID userID) + { + Dictionary info = new Dictionary(); + + if (m_UserAccountService == null) + { + m_log.WarnFormat("[USER AGENT SERVICE]: Unable to get user flags because user account service is missing"); + info["result"] = "fail"; + info["message"] = "UserAccountService is missing!"; + return info; + } + + UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero /*!!!*/, userID); + + if (account != null) + { + info.Add("user_flags", (object)account.UserFlags); + info.Add("user_created", (object)account.Created); + info.Add("user_title", (object)account.UserTitle); + info.Add("result", "success"); + } + + return info; + } + public Dictionary GetServerURLs(UUID userID) { if (m_UserAccountService == null) diff --git a/OpenSim/Services/Interfaces/IHypergridServices.cs b/OpenSim/Services/Interfaces/IHypergridServices.cs index e86ec519e5..5b293acbee 100644 --- a/OpenSim/Services/Interfaces/IHypergridServices.cs +++ b/OpenSim/Services/Interfaces/IHypergridServices.cs @@ -55,6 +55,7 @@ namespace OpenSim.Services.Interfaces void LogoutAgent(UUID userID, UUID sessionID); GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt); Dictionary GetServerURLs(UUID userID); + Dictionary GetUserInfo(UUID userID); string LocateUser(UUID userID); // Tries to get the universal user identifier for the targetUserId From 983b49c0c872e997576d7fc167319e28e6f970e3 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 3 Jan 2012 18:25:31 +0000 Subject: [PATCH 36/37] commented out "Prevented flyoff" log message for now as this becomes problematic with bot testing. Please uncomment if still needed. --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3d1c1b5ce4..42cd4be1e4 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2844,7 +2844,7 @@ namespace OpenSim.Region.Framework.Scenes Velocity = Vector3.Zero; AbsolutePosition = pos; - m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); +// m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); AddToPhysicalScene(isFlying); } From 6166a40440aaa505e55c5b9a71c8b7ba1daf07e0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Tue, 3 Jan 2012 20:22:15 +0000 Subject: [PATCH 37/37] Update C5.dll to version 1.1.1 from 1.1.0 C5 is a collections library and can be found at http://www.itu.dk/research/c5/ This is used in the UDP texture (image) sending code. --- bin/C5.dll | Bin 272384 -> 276992 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/C5.dll b/bin/C5.dll index 1234ce9ff84660be75d5d3a2bdc128797d698a7b..42093e5f845ad7bb7c07e4f2e64faa6f94cb441c 100755 GIT binary patch literal 276992 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 F{|BW|up9sY

Wi4$P$jPQ;n@;q{>wgzw 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 E16+s2&j0`b literal 228352 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%0DAu1xsGdL%OD34ZT`s`|B?R7s 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 z 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 Q4JJKz#{d8Oe@+Ac1)r!5$^ZZW From 5b52440e61648a98d418cff11b588352a3cfff67 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sat, 24 Dec 2011 16:18:01 +0100 Subject: [PATCH 20/37] Introduce a LightShare kill packet ans send it when needed. Currently only understood by AVN v0.3 --- .../CoreModules/LightShare/LightShareModule.cs | 17 ++++++++++++----- .../Shared/Api/Implementation/LS_Api.cs | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs index cabbd317fb..16cbbf5d37 100644 --- a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs +++ b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs @@ -153,10 +153,18 @@ namespace OpenSim.Region.CoreModules.World.LightShare public void SendProfileToClient(IClientAPI client, RegionLightShareData wl) { - if (m_enableWindlight && m_scene.RegionInfo.WindlightSettings.valid) + if (m_enableWindlight) { - List param = compileWindlightSettings(wl); - client.SendGenericMessage("Windlight", param); + if (m_scene.RegionInfo.WindlightSettings.valid) + { + List param = compileWindlightSettings(wl); + client.SendGenericMessage("Windlight", param); + } + else + { + List param = new List(); + client.SendGenericMessage("WindlightReset", param); + } } } @@ -175,8 +183,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare private void EventManager_OnSaveNewWindlightProfile() { - if (m_scene.RegionInfo.WindlightSettings.valid) - m_scene.ForEachRootClient(SendProfileToClient); + m_scene.ForEachRootClient(SendProfileToClient); } public void PostInitialise() diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index cb0d7658aa..77a784d077 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs @@ -486,6 +486,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false; if (m_host.ParentGroup.Scene.SimulationDataService != null) m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID); + m_host.ParentGroup.Scene.EventManager.TriggerOnSaveNewWindlightProfile(); } ///