diff options
author | Dan Lake | 2012-01-03 16:52:53 -0800 |
---|---|---|
committer | Dan Lake | 2012-01-03 16:52:53 -0800 |
commit | ecf9824b63d181bd4e64bd5cb0ff37b952669bb9 (patch) | |
tree | 269207a773c6bd1fd8383885e0c5649d70b34a62 | |
parent | Access to these static methods to serialize objects are useful outside of ser... (diff) | |
parent | Update C5.dll to version 1.1.1 from 1.1.0 (diff) | |
download | opensim-SC-ecf9824b63d181bd4e64bd5cb0ff37b952669bb9.zip opensim-SC-ecf9824b63d181bd4e64bd5cb0ff37b952669bb9.tar.gz opensim-SC-ecf9824b63d181bd4e64bd5cb0ff37b952669bb9.tar.bz2 opensim-SC-ecf9824b63d181bd4e64bd5cb0ff37b952669bb9.tar.xz |
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
75 files changed, 4784 insertions, 4683 deletions
diff --git a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs index e91a4b8..3ce4e66 100644 --- a/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs +++ b/OpenSim/Capabilities/Handlers/WebFetchInventoryDescendents/WebFetchInvDescHandler.cs | |||
@@ -240,78 +240,84 @@ namespace OpenSim.Capabilities.Handlers | |||
240 | 240 | ||
241 | if (containingFolder != null) | 241 | if (containingFolder != null) |
242 | { | 242 | { |
243 | version = containingFolder.Version; | 243 | // m_log.DebugFormat( |
244 | // "[WEB FETCH INV DESC HANDLER]: Retrieved folder {0} {1} for agent id {2}", | ||
245 | // containingFolder.Name, containingFolder.ID, agentID); | ||
244 | 246 | ||
245 | if (fetchItems) | 247 | version = containingFolder.Version; |
246 | { | 248 | // |
247 | /* | 249 | // if (fetchItems) |
248 | List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>(); | 250 | // { |
249 | 251 | // List<InventoryItemBase> linkedItemsToAdd = new List<InventoryItemBase>(); | |
250 | foreach (InventoryItemBase item in contents.Items) | 252 | // |
251 | { | 253 | // foreach (InventoryItemBase item in contents.Items) |
252 | if (item.AssetType == (int)AssetType.Link) | 254 | // { |
253 | { | 255 | // if (item.AssetType == (int)AssetType.Link) |
254 | InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); | 256 | // { |
255 | 257 | // InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); | |
256 | // Take care of genuinely broken links where the target doesn't exist | 258 | // |
257 | // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, | 259 | // // Take care of genuinely broken links where the target doesn't exist |
258 | // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles | 260 | // // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, |
259 | // rather than having to keep track of every folder requested in the recursion. | 261 | // // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles |
260 | if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link && linkedItem.AssetType == (int)AssetType.Object) | 262 | // // rather than having to keep track of every folder requested in the recursion. |
261 | linkedItemsToAdd.Add(linkedItem); | 263 | // if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) |
262 | } | 264 | // linkedItemsToAdd.Insert(0, linkedItem); |
263 | } | 265 | // } |
264 | 266 | // } | |
265 | foreach (InventoryItemBase linkedItem in linkedItemsToAdd) | 267 | // |
266 | { | 268 | // foreach (InventoryItemBase linkedItem in linkedItemsToAdd) |
267 | m_log.DebugFormat( | 269 | // { |
268 | "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}", | 270 | // m_log.DebugFormat( |
269 | linkedItem.Name, folderID, agentID); | 271 | // "[WEB FETCH INV DESC HANDLER]: Inserted linked item {0} for link in folder {1} for agent {2}", |
270 | 272 | // linkedItem.Name, folderID, agentID); | |
271 | contents.Items.Insert(0, linkedItem); | 273 | // |
272 | } | 274 | // contents.Items.Add(linkedItem); |
273 | */ | 275 | // } |
274 | 276 | // | |
275 | /* | 277 | // // If the folder requested contains links, then we need to send those folders first, otherwise the links |
276 | // If the folder requested contains links, then we need to send those folders first, otherwise the links | 278 | // // will be broken in the viewer. |
277 | // will be broken in the viewer. | 279 | // HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>(); |
278 | HashSet<UUID> linkedItemFolderIdsToSend = new HashSet<UUID>(); | 280 | // foreach (InventoryItemBase item in contents.Items) |
279 | foreach (InventoryItemBase item in contents.Items) | 281 | // { |
280 | { | 282 | // if (item.AssetType == (int)AssetType.Link) |
281 | if (item.AssetType == (int)AssetType.Link) | 283 | // { |
282 | { | 284 | // InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); |
283 | InventoryItemBase linkedItem = m_InventoryService.GetItem(new InventoryItemBase(item.AssetID)); | 285 | // |
284 | 286 | // // Take care of genuinely broken links where the target doesn't exist | |
285 | // Take care of genuinely broken links where the target doesn't exist | 287 | // // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, |
286 | // HACK: Also, don't follow up links that just point to other links. In theory this is legitimate, | 288 | // // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles |
287 | // but no viewer has been observed to set these up and this is the lazy way of avoiding cycles | 289 | // // rather than having to keep track of every folder requested in the recursion. |
288 | // rather than having to keep track of every folder requested in the recursion. | 290 | // if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) |
289 | if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link) | 291 | // { |
290 | { | 292 | // // We don't need to send the folder if source and destination of the link are in the same |
291 | // We don't need to send the folder if source and destination of the link are in the same | 293 | // // folder. |
292 | // folder. | 294 | // if (linkedItem.Folder != containingFolder.ID) |
293 | if (linkedItem.Folder != containingFolder.ID) | 295 | // linkedItemFolderIdsToSend.Add(linkedItem.Folder); |
294 | linkedItemFolderIdsToSend.Add(linkedItem.Folder); | 296 | // } |
295 | } | 297 | // } |
296 | } | 298 | // } |
297 | } | 299 | // |
298 | 300 | // foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend) | |
299 | foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend) | 301 | // { |
300 | { | 302 | // m_log.DebugFormat( |
301 | m_log.DebugFormat( | 303 | // "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}", |
302 | "[WEB FETCH INV DESC HANDLER]: Recursively fetching folder {0} linked by item in folder {1} for agent {2}", | 304 | // linkedItemFolderId, folderID, agentID); |
303 | linkedItemFolderId, folderID, agentID); | 305 | // |
304 | 306 | // int dummyVersion; | |
305 | int dummyVersion; | 307 | // InventoryCollection linkedCollection |
306 | InventoryCollection linkedCollection | 308 | // = Fetch( |
307 | = Fetch( | 309 | // agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion); |
308 | agentID, linkedItemFolderId, ownerID, fetchFolders, fetchItems, sortOrder, out dummyVersion); | 310 | // |
309 | 311 | // InventoryFolderBase linkedFolder = new InventoryFolderBase(linkedItemFolderId); | |
310 | contents.Folders.AddRange(linkedCollection.Folders); | 312 | // linkedFolder.Owner = agentID; |
311 | contents.Items.AddRange(linkedCollection.Items); | 313 | // linkedFolder = m_InventoryService.GetFolder(linkedFolder); |
312 | } | 314 | // |
313 | */ | 315 | //// contents.Folders.AddRange(linkedCollection.Folders); |
314 | } | 316 | // |
317 | // contents.Folders.Add(linkedFolder); | ||
318 | // contents.Items.AddRange(linkedCollection.Items); | ||
319 | // } | ||
320 | // } | ||
315 | } | 321 | } |
316 | } | 322 | } |
317 | else | 323 | else |
diff --git a/OpenSim/Framework/IProfileModule.cs b/OpenSim/Framework/IProfileModule.cs new file mode 100644 index 0000000..ef03d4a --- /dev/null +++ b/OpenSim/Framework/IProfileModule.cs | |||
@@ -0,0 +1,37 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using OpenMetaverse; | ||
29 | |||
30 | namespace OpenSim.Framework | ||
31 | { | ||
32 | public interface IProfileModule | ||
33 | { | ||
34 | void RequestAvatarProperties(IClientAPI remoteClient, UUID avatarID); | ||
35 | |||
36 | } | ||
37 | } | ||
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs b/OpenSim/Region/ClientStack/Linden/UDP/J2KImage.cs index e9e2dca..cb9692a 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 | |||
56 | public IAssetService AssetService; | 56 | public IAssetService AssetService; |
57 | public UUID AgentID; | 57 | public UUID AgentID; |
58 | public IInventoryAccessModule InventoryAccessModule; | 58 | public IInventoryAccessModule InventoryAccessModule; |
59 | public OpenJPEG.J2KLayerInfo[] Layers; | 59 | private OpenJPEG.J2KLayerInfo[] m_layers; |
60 | public bool IsDecoded; | 60 | public bool IsDecoded { get; private set; } |
61 | public bool HasAsset; | 61 | public bool HasAsset { get; private set; } |
62 | public C5.IPriorityQueueHandle<J2KImage> PriorityQueueHandle; | 62 | public C5.IPriorityQueueHandle<J2KImage> PriorityQueueHandle; |
63 | 63 | ||
64 | private uint m_currentPacket; | 64 | private uint m_currentPacket; |
@@ -170,14 +170,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
170 | if (DiscardLevel >= 0 || m_stopPacket == 0) | 170 | if (DiscardLevel >= 0 || m_stopPacket == 0) |
171 | { | 171 | { |
172 | // This shouldn't happen, but if it does, we really can't proceed | 172 | // This shouldn't happen, but if it does, we really can't proceed |
173 | if (Layers == null) | 173 | if (m_layers == null) |
174 | { | 174 | { |
175 | m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer"); | 175 | m_log.Warn("[J2KIMAGE]: RunUpdate() called with missing Layers. Canceling texture transfer"); |
176 | m_currentPacket = m_stopPacket; | 176 | m_currentPacket = m_stopPacket; |
177 | return; | 177 | return; |
178 | } | 178 | } |
179 | 179 | ||
180 | int maxDiscardLevel = Math.Max(0, Layers.Length - 1); | 180 | int maxDiscardLevel = Math.Max(0, m_layers.Length - 1); |
181 | 181 | ||
182 | // Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel | 182 | // Treat initial texture downloads with a DiscardLevel of -1 a request for the highest DiscardLevel |
183 | if (DiscardLevel < 0 && m_stopPacket == 0) | 183 | if (DiscardLevel < 0 && m_stopPacket == 0) |
@@ -187,9 +187,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
187 | DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel); | 187 | DiscardLevel = (sbyte)Math.Min(DiscardLevel, maxDiscardLevel); |
188 | 188 | ||
189 | //Calculate the m_stopPacket | 189 | //Calculate the m_stopPacket |
190 | if (Layers.Length > 0) | 190 | if (m_layers.Length > 0) |
191 | { | 191 | { |
192 | m_stopPacket = (uint)GetPacketForBytePosition(Layers[(Layers.Length - 1) - DiscardLevel].End); | 192 | m_stopPacket = (uint)GetPacketForBytePosition(m_layers[(m_layers.Length - 1) - DiscardLevel].End); |
193 | //I don't know why, but the viewer seems to expect the final packet if the file | 193 | //I don't know why, but the viewer seems to expect the final packet if the file |
194 | //is just one packet bigger. | 194 | //is just one packet bigger. |
195 | if (TexturePacketCount() == m_stopPacket + 1) | 195 | if (TexturePacketCount() == m_stopPacket + 1) |
@@ -341,7 +341,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
341 | 341 | ||
342 | private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers) | 342 | private void J2KDecodedCallback(UUID AssetId, OpenJPEG.J2KLayerInfo[] layers) |
343 | { | 343 | { |
344 | Layers = layers; | 344 | m_layers = layers; |
345 | IsDecoded = true; | 345 | IsDecoded = true; |
346 | RunUpdate(); | 346 | RunUpdate(); |
347 | } | 347 | } |
@@ -385,8 +385,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
385 | string assetServerURL = string.Empty; | 385 | string assetServerURL = string.Empty; |
386 | if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL)) | 386 | if (InventoryAccessModule.IsForeignUser(AgentID, out assetServerURL)) |
387 | { | 387 | { |
388 | m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", id); | 388 | if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("=")) |
389 | AssetService.Get(assetServerURL + "/" + id, InventoryAccessModule, AssetReceived); | 389 | assetServerURL = assetServerURL + "/"; |
390 | |||
391 | m_log.DebugFormat("[J2KIMAGE]: texture {0} not found in local asset storage. Trying user's storage.", assetServerURL + id); | ||
392 | AssetService.Get(assetServerURL + id, InventoryAccessModule, AssetReceived); | ||
390 | return; | 393 | return; |
391 | } | 394 | } |
392 | } | 395 | } |
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs index 9e0db12..e3a881f 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLImageManager.cs | |||
@@ -39,6 +39,9 @@ using log4net; | |||
39 | 39 | ||
40 | namespace OpenSim.Region.ClientStack.LindenUDP | 40 | namespace OpenSim.Region.ClientStack.LindenUDP |
41 | { | 41 | { |
42 | /// <summary> | ||
43 | /// This class handles UDP texture requests. | ||
44 | /// </summary> | ||
42 | public class LLImageManager | 45 | public class LLImageManager |
43 | { | 46 | { |
44 | private sealed class J2KImageComparer : IComparer<J2KImage> | 47 | private sealed class J2KImageComparer : IComparer<J2KImage> |
@@ -208,7 +211,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
208 | 211 | ||
209 | #region Priority Queue Helpers | 212 | #region Priority Queue Helpers |
210 | 213 | ||
211 | J2KImage GetHighestPriorityImage() | 214 | private J2KImage GetHighestPriorityImage() |
212 | { | 215 | { |
213 | J2KImage image = null; | 216 | J2KImage image = null; |
214 | 217 | ||
@@ -223,23 +226,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
223 | return image; | 226 | return image; |
224 | } | 227 | } |
225 | 228 | ||
226 | void AddImageToQueue(J2KImage image) | 229 | private void AddImageToQueue(J2KImage image) |
227 | { | 230 | { |
228 | image.PriorityQueueHandle = null; | 231 | image.PriorityQueueHandle = null; |
229 | 232 | ||
230 | lock (m_syncRoot) | 233 | lock (m_syncRoot) |
234 | { | ||
231 | try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); } | 235 | try { m_priorityQueue.Add(ref image.PriorityQueueHandle, image); } |
232 | catch (Exception) { } | 236 | catch (Exception) { } |
237 | } | ||
233 | } | 238 | } |
234 | 239 | ||
235 | void RemoveImageFromQueue(J2KImage image) | 240 | private void RemoveImageFromQueue(J2KImage image) |
236 | { | 241 | { |
237 | lock (m_syncRoot) | 242 | lock (m_syncRoot) |
243 | { | ||
238 | try { m_priorityQueue.Delete(image.PriorityQueueHandle); } | 244 | try { m_priorityQueue.Delete(image.PriorityQueueHandle); } |
239 | catch (Exception) { } | 245 | catch (Exception) { } |
246 | } | ||
240 | } | 247 | } |
241 | 248 | ||
242 | void UpdateImageInQueue(J2KImage image) | 249 | private void UpdateImageInQueue(J2KImage image) |
243 | { | 250 | { |
244 | lock (m_syncRoot) | 251 | lock (m_syncRoot) |
245 | { | 252 | { |
@@ -254,4 +261,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
254 | 261 | ||
255 | #endregion Priority Queue Helpers | 262 | #endregion Priority Queue Helpers |
256 | } | 263 | } |
257 | } | 264 | } \ 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 1386e86..7dd9087 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 | |||
152 | /// <param name="j2kData">JPEG2000 data</param> | 152 | /// <param name="j2kData">JPEG2000 data</param> |
153 | private void DoJ2KDecode(UUID assetID, byte[] j2kData) | 153 | private void DoJ2KDecode(UUID assetID, byte[] j2kData) |
154 | { | 154 | { |
155 | // m_log.DebugFormat( | ||
156 | // "[J2KDecoderModule]: Doing J2K decoding of {0} bytes for asset {1}", j2kData.Length, assetID); | ||
157 | |||
155 | //int DecodeTime = 0; | 158 | //int DecodeTime = 0; |
156 | //DecodeTime = Environment.TickCount; | 159 | //DecodeTime = Environment.TickCount; |
157 | OpenJPEG.J2KLayerInfo[] layers; | 160 | OpenJPEG.J2KLayerInfo[] layers; |
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs index 9a97925..a77646c 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 | |||
50 | { | 50 | { |
51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 51 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
52 | 52 | ||
53 | IUserManagement m_uMan; | ||
54 | IUserManagement UserManagementModule | ||
55 | { | ||
56 | get | ||
57 | { | ||
58 | if (m_uMan == null) | ||
59 | m_uMan = m_Scenes[0].RequestModuleInterface<IUserManagement>(); | ||
60 | return m_uMan; | ||
61 | } | ||
62 | } | ||
63 | |||
53 | #region ISharedRegionModule | 64 | #region ISharedRegionModule |
54 | public override string Name | 65 | public override string Name |
55 | { | 66 | { |
@@ -369,9 +380,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
369 | protected override FriendInfo[] GetFriendsFromService(IClientAPI client) | 380 | protected override FriendInfo[] GetFriendsFromService(IClientAPI client) |
370 | { | 381 | { |
371 | // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); | 382 | // m_log.DebugFormat("[HGFRIENDS MODULE]: Entering GetFriendsFromService for {0}", client.Name); |
383 | Boolean agentIsLocal = true; | ||
384 | if (UserManagementModule != null) | ||
385 | agentIsLocal = UserManagementModule.IsLocalGridUser(client.AgentId); | ||
372 | 386 | ||
373 | UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, client.AgentId); | 387 | if (agentIsLocal) |
374 | if (account1 != null) | ||
375 | return base.GetFriendsFromService(client); | 388 | return base.GetFriendsFromService(client); |
376 | 389 | ||
377 | FriendInfo[] finfos = new FriendInfo[0]; | 390 | FriendInfo[] finfos = new FriendInfo[0]; |
@@ -392,16 +405,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
392 | 405 | ||
393 | protected override bool StoreRights(UUID agentID, UUID friendID, int rights) | 406 | protected override bool StoreRights(UUID agentID, UUID friendID, int rights) |
394 | { | 407 | { |
395 | UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); | 408 | Boolean agentIsLocal = true; |
396 | UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID); | 409 | Boolean friendIsLocal = true; |
410 | if (UserManagementModule != null) | ||
411 | { | ||
412 | agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); | ||
413 | friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); | ||
414 | } | ||
415 | |||
397 | // Are they both local users? | 416 | // Are they both local users? |
398 | if (account1 != null && account2 != null) | 417 | if (agentIsLocal && friendIsLocal) |
399 | { | 418 | { |
400 | // local grid users | 419 | // local grid users |
401 | return base.StoreRights(agentID, friendID, rights); | 420 | return base.StoreRights(agentID, friendID, rights); |
402 | } | 421 | } |
403 | 422 | ||
404 | if (account1 != null) // agent is local, friend is foreigner | 423 | if (agentIsLocal) // agent is local, friend is foreigner |
405 | { | 424 | { |
406 | FriendInfo[] finfos = GetFriends(agentID); | 425 | FriendInfo[] finfos = GetFriends(agentID); |
407 | FriendInfo finfo = GetFriend(finfos, friendID); | 426 | FriendInfo finfo = GetFriend(finfos, friendID); |
@@ -412,7 +431,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
412 | } | 431 | } |
413 | } | 432 | } |
414 | 433 | ||
415 | if (account2 != null) // agent is foreigner, friend is local | 434 | if (friendIsLocal) // agent is foreigner, friend is local |
416 | { | 435 | { |
417 | string agentUUI = GetUUI(friendID, agentID); | 436 | string agentUUI = GetUUI(friendID, agentID); |
418 | if (agentUUI != string.Empty) | 437 | if (agentUUI != string.Empty) |
@@ -427,10 +446,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
427 | 446 | ||
428 | protected override void StoreBackwards(UUID friendID, UUID agentID) | 447 | protected override void StoreBackwards(UUID friendID, UUID agentID) |
429 | { | 448 | { |
430 | UserAccount account1 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); | 449 | Boolean agentIsLocal = true; |
431 | UserAccount account2 = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID); | 450 | Boolean friendIsLocal = true; |
451 | if (UserManagementModule != null) | ||
452 | { | ||
453 | agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); | ||
454 | friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); | ||
455 | } | ||
456 | |||
432 | // Are they both local users? | 457 | // Are they both local users? |
433 | if (account1 != null && account2 != null) | 458 | if (agentIsLocal && friendIsLocal) |
434 | { | 459 | { |
435 | // local grid users | 460 | // local grid users |
436 | m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local"); | 461 | m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local"); |
@@ -444,10 +469,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
444 | 469 | ||
445 | protected override void StoreFriendships(UUID agentID, UUID friendID) | 470 | protected override void StoreFriendships(UUID agentID, UUID friendID) |
446 | { | 471 | { |
447 | UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); | 472 | Boolean agentIsLocal = true; |
448 | UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, friendID); | 473 | Boolean friendIsLocal = true; |
474 | if (UserManagementModule != null) | ||
475 | { | ||
476 | agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); | ||
477 | friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); | ||
478 | } | ||
479 | |||
449 | // Are they both local users? | 480 | // Are they both local users? |
450 | if (agentAccount != null && friendAccount != null) | 481 | if (agentIsLocal && friendIsLocal) |
451 | { | 482 | { |
452 | // local grid users | 483 | // local grid users |
453 | m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local"); | 484 | m_log.DebugFormat("[HGFRIENDS MODULE]: Users are both local"); |
@@ -465,13 +496,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
465 | string agentFriendService = string.Empty; | 496 | string agentFriendService = string.Empty; |
466 | string friendFriendService = string.Empty; | 497 | string friendFriendService = string.Empty; |
467 | 498 | ||
468 | if (agentClient != null) | 499 | if (agentIsLocal) |
469 | { | 500 | { |
470 | agentClientCircuit = ((Scene)(agentClient.Scene)).AuthenticateHandler.GetAgentCircuitData(agentClient.CircuitCode); | 501 | agentClientCircuit = ((Scene)(agentClient.Scene)).AuthenticateHandler.GetAgentCircuitData(agentClient.CircuitCode); |
471 | agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); | 502 | agentUUI = Util.ProduceUserUniversalIdentifier(agentClientCircuit); |
472 | agentFriendService = agentClientCircuit.ServiceURLs["FriendsServerURI"].ToString(); | 503 | agentFriendService = agentClientCircuit.ServiceURLs["FriendsServerURI"].ToString(); |
473 | } | 504 | } |
474 | if (friendClient != null) | 505 | if (friendIsLocal) |
475 | { | 506 | { |
476 | friendClientCircuit = ((Scene)(friendClient.Scene)).AuthenticateHandler.GetAgentCircuitData(friendClient.CircuitCode); | 507 | friendClientCircuit = ((Scene)(friendClient.Scene)).AuthenticateHandler.GetAgentCircuitData(friendClient.CircuitCode); |
477 | friendUUI = Util.ProduceUserUniversalIdentifier(friendClientCircuit); | 508 | friendUUI = Util.ProduceUserUniversalIdentifier(friendClientCircuit); |
@@ -484,7 +515,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
484 | // Generate a random 8-character hex number that will sign this friendship | 515 | // Generate a random 8-character hex number that will sign this friendship |
485 | string secret = UUID.Random().ToString().Substring(0, 8); | 516 | string secret = UUID.Random().ToString().Substring(0, 8); |
486 | 517 | ||
487 | if (agentAccount != null) // agent is local, 'friend' is foreigner | 518 | if (agentIsLocal) // agent is local, 'friend' is foreigner |
488 | { | 519 | { |
489 | // This may happen when the agent returned home, in which case the friend is not there | 520 | // This may happen when the agent returned home, in which case the friend is not there |
490 | // We need to look for its information in the friends list itself | 521 | // We need to look for its information in the friends list itself |
@@ -520,7 +551,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
520 | friendsConn.NewFriendship(friendID, agentUUI + ";" + secret); | 551 | friendsConn.NewFriendship(friendID, agentUUI + ";" + secret); |
521 | } | 552 | } |
522 | } | 553 | } |
523 | else if (friendAccount != null) // 'friend' is local, agent is foreigner | 554 | else if (friendIsLocal) // 'friend' is local, agent is foreigner |
524 | { | 555 | { |
525 | // store in the local friends service a reference to the foreign agent | 556 | // store in the local friends service a reference to the foreign agent |
526 | FriendsService.StoreFriend(friendID.ToString(), agentUUI + ";" + secret, 1); | 557 | FriendsService.StoreFriend(friendID.ToString(), agentUUI + ";" + secret, 1); |
@@ -553,10 +584,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
553 | 584 | ||
554 | protected override bool DeleteFriendship(UUID agentID, UUID exfriendID) | 585 | protected override bool DeleteFriendship(UUID agentID, UUID exfriendID) |
555 | { | 586 | { |
556 | UserAccount agentAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, agentID); | 587 | Boolean agentIsLocal = true; |
557 | UserAccount friendAccount = UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, exfriendID); | 588 | Boolean friendIsLocal = true; |
589 | if (UserManagementModule != null) | ||
590 | { | ||
591 | agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); | ||
592 | friendIsLocal = UserManagementModule.IsLocalGridUser(exfriendID); | ||
593 | } | ||
594 | |||
558 | // Are they both local users? | 595 | // Are they both local users? |
559 | if (agentAccount != null && friendAccount != null) | 596 | if (agentIsLocal && friendIsLocal) |
560 | { | 597 | { |
561 | // local grid users | 598 | // local grid users |
562 | return base.DeleteFriendship(agentID, exfriendID); | 599 | return base.DeleteFriendship(agentID, exfriendID); |
@@ -566,7 +603,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
566 | string agentUUI = string.Empty; | 603 | string agentUUI = string.Empty; |
567 | string friendUUI = string.Empty; | 604 | string friendUUI = string.Empty; |
568 | 605 | ||
569 | if (agentAccount != null) // agent is local, 'friend' is foreigner | 606 | if (agentIsLocal) // agent is local, 'friend' is foreigner |
570 | { | 607 | { |
571 | // We need to look for its information in the friends list itself | 608 | // We need to look for its information in the friends list itself |
572 | FriendInfo[] finfos = GetFriends(agentID); | 609 | FriendInfo[] finfos = GetFriends(agentID); |
@@ -587,7 +624,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends | |||
587 | return true; | 624 | return true; |
588 | } | 625 | } |
589 | } | 626 | } |
590 | else if (friendAccount != null) // agent is foreigner, 'friend' is local | 627 | else if (friendIsLocal) // agent is foreigner, 'friend' is local |
591 | { | 628 | { |
592 | agentUUI = GetUUI(exfriendID, agentID); | 629 | agentUUI = GetUUI(exfriendID, agentID); |
593 | 630 | ||
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs index 560d913..bf1d787 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 | |||
180 | 180 | ||
181 | // m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); | 181 | // m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); |
182 | // Is the user a local user? | 182 | // Is the user a local user? |
183 | UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, toAgentID); | ||
184 | string url = string.Empty; | 183 | string url = string.Empty; |
185 | bool foreigner = false; | 184 | bool foreigner = false; |
186 | if (account == null) // foreign user | 185 | if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(toAgentID)) // foreign user |
187 | { | 186 | { |
188 | url = UserManagementModule.GetUserServerURL(toAgentID, "IMServerURI"); | 187 | url = UserManagementModule.GetUserServerURL(toAgentID, "IMServerURI"); |
189 | foreigner = true; | 188 | foreigner = true; |
diff --git a/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/Profile/BasicProfileModule.cs index dee0ad4..eb1e4b5 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; | |||
43 | namespace OpenSim.Region.CoreModules.Avatar.Profile | 43 | namespace OpenSim.Region.CoreModules.Avatar.Profile |
44 | { | 44 | { |
45 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] | 45 | [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")] |
46 | public class BasicProfileModule : ISharedRegionModule | 46 | public class BasicProfileModule : IProfileModule, ISharedRegionModule |
47 | { | 47 | { |
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
49 | 49 | ||
@@ -57,6 +57,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile | |||
57 | 57 | ||
58 | public void Initialise(IConfigSource config) | 58 | public void Initialise(IConfigSource config) |
59 | { | 59 | { |
60 | // This can be reduced later as the loader will determine | ||
61 | // whether we are needed | ||
60 | if (config.Configs["Profile"] != null) | 62 | if (config.Configs["Profile"] != null) |
61 | { | 63 | { |
62 | if (config.Configs["Profile"].GetString("Module", string.Empty) != "BasicProfileModule") | 64 | if (config.Configs["Profile"].GetString("Module", string.Empty) != "BasicProfileModule") |
@@ -65,14 +67,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile | |||
65 | 67 | ||
66 | m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled"); | 68 | m_log.DebugFormat("[PROFILE MODULE]: Basic Profile Module enabled"); |
67 | m_Enabled = true; | 69 | m_Enabled = true; |
68 | |||
69 | } | 70 | } |
70 | 71 | ||
71 | public void AddRegion(Scene scene) | 72 | public void AddRegion(Scene scene) |
72 | { | 73 | { |
73 | if (!m_Enabled) | 74 | if (!m_Enabled) |
74 | return; | 75 | return; |
75 | 76 | ||
76 | lock (m_Scenes) | 77 | lock (m_Scenes) |
77 | { | 78 | { |
78 | if (!m_Scenes.Contains(scene)) | 79 | if (!m_Scenes.Contains(scene)) |
@@ -80,6 +81,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile | |||
80 | m_Scenes.Add(scene); | 81 | m_Scenes.Add(scene); |
81 | // Hook up events | 82 | // Hook up events |
82 | scene.EventManager.OnNewClient += OnNewClient; | 83 | scene.EventManager.OnNewClient += OnNewClient; |
84 | scene.RegisterModuleInterface<IProfileModule>(this); | ||
83 | } | 85 | } |
84 | } | 86 | } |
85 | } | 87 | } |
@@ -116,7 +118,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile | |||
116 | 118 | ||
117 | public Type ReplaceableInterface | 119 | public Type ReplaceableInterface |
118 | { | 120 | { |
119 | get { return null; } | 121 | get { return typeof(IProfileModule); } |
120 | } | 122 | } |
121 | 123 | ||
122 | #endregion | 124 | #endregion |
@@ -170,4 +172,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Profile | |||
170 | } | 172 | } |
171 | 173 | ||
172 | } | 174 | } |
173 | } \ No newline at end of file | 175 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 87f292c..cbef6ce 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 | |||
676 | Vector3 eastCross = new Vector3(boundaryDistance, 0, 0); | 676 | Vector3 eastCross = new Vector3(boundaryDistance, 0, 0); |
677 | Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0); | 677 | Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0); |
678 | 678 | ||
679 | // distance to edge that will trigger crossing | ||
680 | |||
681 | |||
682 | // distance into new region to place avatar | 679 | // distance into new region to place avatar |
683 | const float enterDistance = 0.5f; | 680 | const float enterDistance = 0.5f; |
684 | 681 | ||
@@ -960,29 +957,31 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
960 | m_log.DebugFormat( | 957 | m_log.DebugFormat( |
961 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", | 958 | "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.", |
962 | agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); | 959 | agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName); |
963 | 960 | ||
964 | pos = pos + (agent.Velocity); | 961 | pos = pos + agent.Velocity; |
965 | 962 | Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); | |
963 | |||
964 | agent.RemoveFromPhysicalScene(); | ||
966 | SetInTransit(agent.UUID); | 965 | SetInTransit(agent.UUID); |
967 | AgentData cAgent = new AgentData(); | 966 | |
967 | AgentData cAgent = new AgentData(); | ||
968 | agent.CopyTo(cAgent); | 968 | agent.CopyTo(cAgent); |
969 | cAgent.Position = pos; | 969 | cAgent.Position = pos; |
970 | if (isFlying) | 970 | if (isFlying) |
971 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; | 971 | cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; |
972 | cAgent.CallbackURI = m_scene.RegionInfo.ServerURI + | 972 | |
973 | "agent/" + agent.UUID.ToString() + "/" + m_scene.RegionInfo.RegionID.ToString() + "/release/"; | 973 | // We don't need the callback anymnore |
974 | 974 | cAgent.CallbackURI = String.Empty; | |
975 | |||
975 | if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) | 976 | if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) |
976 | { | 977 | { |
977 | // region doesn't take it | 978 | // region doesn't take it |
978 | ReInstantiateScripts(agent); | 979 | ReInstantiateScripts(agent); |
980 | agent.AddToPhysicalScene(isFlying); | ||
979 | ResetFromTransit(agent.UUID); | 981 | ResetFromTransit(agent.UUID); |
980 | return agent; | 982 | return agent; |
981 | } | 983 | } |
982 | 984 | ||
983 | // Next, let's close the child agent connections that are too far away. | ||
984 | agent.CloseChildAgents(neighbourx, neighboury); | ||
985 | |||
986 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); | 985 | //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo(); |
987 | agent.ControllingClient.RequestClientInfo(); | 986 | agent.ControllingClient.RequestClientInfo(); |
988 | 987 | ||
@@ -999,11 +998,11 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
999 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); | 998 | string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); |
1000 | 999 | ||
1001 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); | 1000 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID); |
1002 | 1001 | ||
1003 | IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); | 1002 | IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); |
1004 | if (eq != null) | 1003 | if (eq != null) |
1005 | { | 1004 | { |
1006 | eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | 1005 | eq.CrossRegion(neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, |
1007 | capsPath, agent.UUID, agent.ControllingClient.SessionId); | 1006 | capsPath, agent.UUID, agent.ControllingClient.SessionId); |
1008 | } | 1007 | } |
1009 | else | 1008 | else |
@@ -1011,32 +1010,26 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1011 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, | 1010 | agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint, |
1012 | capsPath); | 1011 | capsPath); |
1013 | } | 1012 | } |
1014 | 1013 | ||
1015 | if (!WaitForCallback(agent.UUID)) | 1014 | // SUCCESS! |
1016 | { | ||
1017 | m_log.Debug("[ENTITY TRANSFER MODULE]: Callback never came in crossing agent"); | ||
1018 | ReInstantiateScripts(agent); | ||
1019 | ResetFromTransit(agent.UUID); | ||
1020 | |||
1021 | // Yikes! We should just have a ref to scene here. | ||
1022 | //agent.Scene.InformClientOfNeighbours(agent); | ||
1023 | EnableChildAgents(agent); | ||
1024 | |||
1025 | return agent; | ||
1026 | } | ||
1027 | |||
1028 | agent.MakeChildAgent(); | 1015 | agent.MakeChildAgent(); |
1029 | 1016 | ResetFromTransit(agent.UUID); | |
1017 | |||
1030 | // now we have a child agent in this region. Request all interesting data about other (root) agents | 1018 | // now we have a child agent in this region. Request all interesting data about other (root) agents |
1031 | agent.SendOtherAgentsAvatarDataToMe(); | 1019 | agent.SendOtherAgentsAvatarDataToMe(); |
1032 | agent.SendOtherAgentsAppearanceToMe(); | 1020 | agent.SendOtherAgentsAppearanceToMe(); |
1033 | 1021 | ||
1034 | // Backwards compatibility | 1022 | // Backwards compatibility. Best effort |
1035 | if (version == "Unknown" || version == string.Empty) | 1023 | if (version == "Unknown" || version == string.Empty) |
1036 | { | 1024 | { |
1037 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old neighbor, passing attachments one by one..."); | 1025 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one..."); |
1026 | Thread.Sleep(3000); // wait a little now that we're not waiting for the callback | ||
1038 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); | 1027 | CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true); |
1039 | } | 1028 | } |
1029 | |||
1030 | |||
1031 | // Next, let's close the child agent connections that are too far away. | ||
1032 | agent.CloseChildAgents(neighbourx, neighboury); | ||
1040 | 1033 | ||
1041 | AgentHasMovedAway(agent, false); | 1034 | AgentHasMovedAway(agent, false); |
1042 | 1035 | ||
@@ -1069,16 +1062,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1069 | CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; | 1062 | CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; |
1070 | ScenePresence agent = icon.EndInvoke(iar); | 1063 | ScenePresence agent = icon.EndInvoke(iar); |
1071 | 1064 | ||
1072 | // If the cross was successful, this agent is a child agent | 1065 | //// If the cross was successful, this agent is a child agent |
1073 | if (agent.IsChildAgent) | 1066 | //if (agent.IsChildAgent) |
1074 | agent.Reset(); | 1067 | // agent.Reset(); |
1075 | else // Not successful | 1068 | //else // Not successful |
1076 | agent.RestoreInCurrentScene(); | 1069 | // agent.RestoreInCurrentScene(); |
1077 | 1070 | ||
1078 | // In any case | 1071 | // In any case |
1079 | agent.IsInTransit = false; | 1072 | agent.IsInTransit = false; |
1080 | 1073 | ||
1081 | //m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); | 1074 | m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname); |
1082 | } | 1075 | } |
1083 | 1076 | ||
1084 | #endregion | 1077 | #endregion |
@@ -1712,9 +1705,23 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1712 | uint x = 0, y = 0; | 1705 | uint x = 0, y = 0; |
1713 | Utils.LongToUInts(newRegionHandle, out x, out y); | 1706 | Utils.LongToUInts(newRegionHandle, out x, out y); |
1714 | GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); | 1707 | GridRegion destination = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); |
1715 | if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent)) | 1708 | |
1709 | if (destination == null || !CrossPrimGroupIntoNewRegion(destination, grp, silent)) | ||
1716 | { | 1710 | { |
1711 | m_log.InfoFormat("[ENTITY TRANSFER MODULE] cross region transfer failed for object {0}",grp.UUID); | ||
1712 | |||
1713 | // We are going to move the object back to the old position so long as the old position | ||
1714 | // is in the region | ||
1715 | oldGroupPosition.X = Util.Clamp<float>(oldGroupPosition.X,1.0f,(float)Constants.RegionSize-1); | ||
1716 | oldGroupPosition.Y = Util.Clamp<float>(oldGroupPosition.Y,1.0f,(float)Constants.RegionSize-1); | ||
1717 | oldGroupPosition.Z = Util.Clamp<float>(oldGroupPosition.Z,1.0f,4096.0f); | ||
1718 | |||
1717 | grp.RootPart.GroupPosition = oldGroupPosition; | 1719 | grp.RootPart.GroupPosition = oldGroupPosition; |
1720 | |||
1721 | // Need to turn off the physics flags, otherwise the object will continue to attempt to | ||
1722 | // move out of the region creating an infinite loop of failed attempts to cross | ||
1723 | grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false); | ||
1724 | |||
1718 | grp.ScheduleGroupForFullUpdate(); | 1725 | grp.ScheduleGroupForFullUpdate(); |
1719 | } | 1726 | } |
1720 | } | 1727 | } |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs index cc9ba97..8d41728 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 | |||
187 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); | 187 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.FirstName, client.LastName); |
188 | 188 | ||
189 | // Let's find out if this is a foreign user or a local user | 189 | // Let's find out if this is a foreign user or a local user |
190 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, id); | 190 | IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>(); |
191 | if (account != null) | 191 | if (uMan != null && uMan.IsLocalGridUser(id)) |
192 | { | 192 | { |
193 | // local grid user | 193 | // local grid user |
194 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local"); | 194 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: User is local"); |
@@ -227,8 +227,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
227 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); | 227 | IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); |
228 | GridRegion homeGatekeeper = MakeRegion(aCircuit); | 228 | GridRegion homeGatekeeper = MakeRegion(aCircuit); |
229 | 229 | ||
230 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}:{5}", | 230 | m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: teleporting user {0} {1} home to {2} via {3}:{4}", |
231 | aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ExternalHostName, homeGatekeeper.HttpPort, homeGatekeeper.RegionName); | 231 | aCircuit.firstname, aCircuit.lastname, finalDestination.RegionName, homeGatekeeper.ServerURI, homeGatekeeper.RegionName); |
232 | 232 | ||
233 | DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); | 233 | DoTeleport(sp, homeGatekeeper, finalDestination, position, lookAt, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaHome), eq); |
234 | } | 234 | } |
@@ -313,8 +313,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
313 | } | 313 | } |
314 | 314 | ||
315 | // Let's find out if this is a foreign user or a local user | 315 | // Let's find out if this is a foreign user or a local user |
316 | IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>(); | ||
316 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, obj.AgentId); | 317 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, obj.AgentId); |
317 | if (account != null) | 318 | if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) |
318 | { | 319 | { |
319 | // local grid user | 320 | // local grid user |
320 | return; | 321 | return; |
@@ -347,6 +348,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
347 | 348 | ||
348 | region.ExternalHostName = uri.Host; | 349 | region.ExternalHostName = uri.Host; |
349 | region.HttpPort = (uint)uri.Port; | 350 | region.HttpPort = (uint)uri.Port; |
351 | region.ServerURI = uri.ToString(); | ||
350 | region.RegionName = string.Empty; | 352 | region.RegionName = string.Empty; |
351 | region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); | 353 | region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); |
352 | return region; | 354 | return region; |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGAssetMapper.cs index 81b65c5..d20c9eb 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 | |||
73 | 73 | ||
74 | public AssetBase FetchAsset(string url, UUID assetID) | 74 | public AssetBase FetchAsset(string url, UUID assetID) |
75 | { | 75 | { |
76 | AssetBase asset = m_scene.AssetService.Get(url + "/" + assetID.ToString()); | 76 | if (!url.EndsWith("/") && !url.EndsWith("=")) |
77 | url = url + "/"; | ||
78 | |||
79 | AssetBase asset = m_scene.AssetService.Get(url + assetID.ToString()); | ||
77 | 80 | ||
78 | if (asset != null) | 81 | if (asset != null) |
79 | { | 82 | { |
@@ -87,6 +90,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
87 | { | 90 | { |
88 | if (asset != null) | 91 | if (asset != null) |
89 | { | 92 | { |
93 | if (!url.EndsWith("/") && !url.EndsWith("=")) | ||
94 | url = url + "/"; | ||
95 | |||
90 | // See long comment in AssetCache.AddAsset | 96 | // See long comment in AssetCache.AddAsset |
91 | if (!asset.Temporary || asset.Local) | 97 | if (!asset.Temporary || asset.Local) |
92 | { | 98 | { |
@@ -99,7 +105,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
99 | Copy(asset, asset1); | 105 | Copy(asset, asset1); |
100 | try | 106 | try |
101 | { | 107 | { |
102 | asset1.ID = url + "/" + asset.ID; | 108 | asset1.ID = url + asset.ID; |
103 | } | 109 | } |
104 | catch | 110 | catch |
105 | { | 111 | { |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index 49d484b..bf24ebc 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 | |||
124 | 124 | ||
125 | protected override string GenerateLandmark(ScenePresence presence, out string prefix, out string suffix) | 125 | protected override string GenerateLandmark(ScenePresence presence, out string prefix, out string suffix) |
126 | { | 126 | { |
127 | UserAccount account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, presence.UUID); | 127 | if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(presence.UUID)) |
128 | if (account == null) | ||
129 | prefix = "HG "; | 128 | prefix = "HG "; |
130 | else | 129 | else |
131 | prefix = string.Empty; | 130 | prefix = string.Empty; |
@@ -210,12 +209,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
210 | public override bool IsForeignUser(UUID userID, out string assetServerURL) | 209 | public override bool IsForeignUser(UUID userID, out string assetServerURL) |
211 | { | 210 | { |
212 | assetServerURL = string.Empty; | 211 | assetServerURL = string.Empty; |
213 | UserAccount account = null; | ||
214 | if (m_Scene.UserAccountService != null) | ||
215 | account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID); | ||
216 | 212 | ||
217 | if (account == null) // foreign | 213 | if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID)) |
218 | { | 214 | { // foreign |
219 | ScenePresence sp = null; | 215 | ScenePresence sp = null; |
220 | if (m_Scene.TryGetScenePresence(userID, out sp)) | 216 | if (m_Scene.TryGetScenePresence(userID, out sp)) |
221 | { | 217 | { |
diff --git a/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs b/OpenSim/Region/CoreModules/Framework/UserManagement/UserManagementModule.cs index a40a6a4..37292d6 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 | |||
50 | public string LastName { get; set; } | 50 | public string LastName { get; set; } |
51 | public string HomeURL { get; set; } | 51 | public string HomeURL { get; set; } |
52 | public Dictionary<string, object> ServerURLs { get; set; } | 52 | public Dictionary<string, object> ServerURLs { get; set; } |
53 | public string Title { get; set; } | ||
54 | public int Flags { get; set; } | ||
55 | public int Created { get; set; } | ||
53 | } | 56 | } |
54 | 57 | ||
55 | public class UserManagementModule : ISharedRegionModule, IUserManagement | 58 | public class UserManagementModule : ISharedRegionModule, IUserManagement |
@@ -281,6 +284,94 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
281 | return string.Empty; | 284 | return string.Empty; |
282 | } | 285 | } |
283 | 286 | ||
287 | public int GetUserFlags(UUID userID) | ||
288 | { | ||
289 | UserData userdata; | ||
290 | lock (m_UserCache) | ||
291 | m_UserCache.TryGetValue(userID, out userdata); | ||
292 | |||
293 | if (userdata.Flags == -1) | ||
294 | GetUserInfo(userID); | ||
295 | |||
296 | if (userdata.Flags != -1) | ||
297 | return userdata.Flags; | ||
298 | |||
299 | return 0; | ||
300 | } | ||
301 | |||
302 | public int GetUserCreated(UUID userID) | ||
303 | { | ||
304 | UserData userdata; | ||
305 | lock (m_UserCache) | ||
306 | m_UserCache.TryGetValue(userID, out userdata); | ||
307 | |||
308 | if (userdata.Flags == -1) | ||
309 | GetUserInfo(userID); | ||
310 | |||
311 | if (userdata.Created != -1) | ||
312 | return userdata.Created; | ||
313 | |||
314 | return 0; | ||
315 | } | ||
316 | |||
317 | public string GetUserTitle(UUID userID) | ||
318 | { | ||
319 | UserData userdata; | ||
320 | lock (m_UserCache) | ||
321 | m_UserCache.TryGetValue(userID, out userdata); | ||
322 | |||
323 | if (userdata.Flags == -1) | ||
324 | GetUserInfo(userID); | ||
325 | |||
326 | if (userdata.Created != -1) | ||
327 | return userdata.Title; | ||
328 | |||
329 | return string.Empty; | ||
330 | } | ||
331 | |||
332 | // This will cache the user data | ||
333 | // Change this to return bool | ||
334 | private bool GetUserInfo(UUID userID) | ||
335 | { | ||
336 | UserData userdata; | ||
337 | lock (m_UserCache) | ||
338 | m_UserCache.TryGetValue(userID, out userdata); | ||
339 | |||
340 | if (userdata != null) | ||
341 | { | ||
342 | // m_log.DebugFormat("[USER MANAGEMENT MODULE]: Requested url type {0} for {1}", serverType, userID); | ||
343 | |||
344 | if (userdata.Flags >= 0) | ||
345 | { | ||
346 | // This is already populated | ||
347 | return true; | ||
348 | } | ||
349 | |||
350 | if (userdata.HomeURL != null && userdata.HomeURL != string.Empty) | ||
351 | { | ||
352 | m_log.DebugFormat( | ||
353 | "[USER MANAGEMENT MODULE]: Requesting user flags from '{0}' for {1}", | ||
354 | userdata.HomeURL, userID); | ||
355 | |||
356 | UserAgentServiceConnector uConn = new UserAgentServiceConnector(userdata.HomeURL); | ||
357 | Dictionary<string, object> info = uConn.GetUserInfo(userID); | ||
358 | |||
359 | // Pull our data now | ||
360 | if (info["result"].ToString() == "success") | ||
361 | { | ||
362 | userdata.Flags = (int)info["user_flags"]; | ||
363 | userdata.Created = (int)info["user_created"]; | ||
364 | userdata.Title = (string)info["user_title"]; | ||
365 | |||
366 | return true; | ||
367 | } | ||
368 | } | ||
369 | } | ||
370 | |||
371 | return false; | ||
372 | } | ||
373 | |||
374 | |||
284 | public string GetUserUUI(UUID userID) | 375 | public string GetUserUUI(UUID userID) |
285 | { | 376 | { |
286 | UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID); | 377 | UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID); |
@@ -352,6 +443,8 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
352 | { | 443 | { |
353 | UserData user = new UserData(); | 444 | UserData user = new UserData(); |
354 | user.Id = id; | 445 | user.Id = id; |
446 | user.Flags = -1; | ||
447 | user.Created = -1; | ||
355 | 448 | ||
356 | if (creatorData != null && creatorData != string.Empty) | 449 | if (creatorData != null && creatorData != string.Empty) |
357 | { | 450 | { |
@@ -425,6 +518,15 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement | |||
425 | 518 | ||
426 | //} | 519 | //} |
427 | 520 | ||
521 | public bool IsLocalGridUser(UUID uuid) | ||
522 | { | ||
523 | UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, uuid); | ||
524 | if (account == null || (account != null && !account.LocalToGrid)) | ||
525 | return false; | ||
526 | |||
527 | return true; | ||
528 | } | ||
529 | |||
428 | #endregion IUserManagement | 530 | #endregion IUserManagement |
429 | 531 | ||
430 | private void HandleShowUsers(string module, string[] cmd) | 532 | private void HandleShowUsers(string module, string[] cmd) |
diff --git a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs index cabbd31..16cbbf5 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 | |||
153 | 153 | ||
154 | public void SendProfileToClient(IClientAPI client, RegionLightShareData wl) | 154 | public void SendProfileToClient(IClientAPI client, RegionLightShareData wl) |
155 | { | 155 | { |
156 | if (m_enableWindlight && m_scene.RegionInfo.WindlightSettings.valid) | 156 | if (m_enableWindlight) |
157 | { | 157 | { |
158 | List<byte[]> param = compileWindlightSettings(wl); | 158 | if (m_scene.RegionInfo.WindlightSettings.valid) |
159 | client.SendGenericMessage("Windlight", param); | 159 | { |
160 | List<byte[]> param = compileWindlightSettings(wl); | ||
161 | client.SendGenericMessage("Windlight", param); | ||
162 | } | ||
163 | else | ||
164 | { | ||
165 | List<byte[]> param = new List<byte[]>(); | ||
166 | client.SendGenericMessage("WindlightReset", param); | ||
167 | } | ||
160 | } | 168 | } |
161 | } | 169 | } |
162 | 170 | ||
@@ -175,8 +183,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare | |||
175 | 183 | ||
176 | private void EventManager_OnSaveNewWindlightProfile() | 184 | private void EventManager_OnSaveNewWindlightProfile() |
177 | { | 185 | { |
178 | if (m_scene.RegionInfo.WindlightSettings.valid) | 186 | m_scene.ForEachRootClient(SendProfileToClient); |
179 | m_scene.ForEachRootClient(SendProfileToClient); | ||
180 | } | 187 | } |
181 | 188 | ||
182 | public void PostInitialise() | 189 | public void PostInitialise() |
diff --git a/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs b/OpenSim/Region/CoreModules/Scripting/HttpRequest/ScriptsHttpRequests.cs index 43672d1..8fb5d75 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 | |||
411 | } | 411 | } |
412 | 412 | ||
413 | Request.Timeout = HttpTimeout; | 413 | Request.Timeout = HttpTimeout; |
414 | // execute the request | 414 | try |
415 | response = (HttpWebResponse) Request.GetResponse(); | 415 | { |
416 | // execute the request | ||
417 | response = (HttpWebResponse) Request.GetResponse(); | ||
418 | } | ||
419 | catch (WebException e) | ||
420 | { | ||
421 | if (e.Status != WebExceptionStatus.ProtocolError) | ||
422 | { | ||
423 | throw; | ||
424 | } | ||
425 | response = (HttpWebResponse)e.Response; | ||
426 | } | ||
427 | |||
428 | Status = (int)response.StatusCode; | ||
416 | 429 | ||
417 | Stream resStream = response.GetResponseStream(); | 430 | Stream resStream = response.GetResponseStream(); |
418 | 431 | ||
@@ -436,17 +449,8 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest | |||
436 | } | 449 | } |
437 | catch (Exception e) | 450 | catch (Exception e) |
438 | { | 451 | { |
439 | if (e is WebException && ((WebException)e).Status == WebExceptionStatus.ProtocolError) | 452 | Status = (int)OSHttpStatusCode.ClientErrorJoker; |
440 | { | 453 | ResponseBody = e.Message; |
441 | HttpWebResponse webRsp = (HttpWebResponse)((WebException)e).Response; | ||
442 | Status = (int)webRsp.StatusCode; | ||
443 | ResponseBody = webRsp.StatusDescription; | ||
444 | } | ||
445 | else | ||
446 | { | ||
447 | Status = (int)OSHttpStatusCode.ClientErrorJoker; | ||
448 | ResponseBody = e.Message; | ||
449 | } | ||
450 | 454 | ||
451 | _finished = true; | 455 | _finished = true; |
452 | return; | 456 | return; |
@@ -457,7 +461,6 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest | |||
457 | response.Close(); | 461 | response.Close(); |
458 | } | 462 | } |
459 | 463 | ||
460 | Status = (int)OSHttpStatusCode.SuccessOk; | ||
461 | _finished = true; | 464 | _finished = true; |
462 | } | 465 | } |
463 | 466 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs index e31be21..8395f83 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 | |||
382 | return result; | 382 | return result; |
383 | } | 383 | } |
384 | 384 | ||
385 | #region IHyperAssetService | ||
386 | |||
387 | public string GetUserAssetServer(UUID userID) | ||
388 | { | ||
389 | UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, userID); | ||
390 | |||
391 | if (account != null && account.ServiceURLs.ContainsKey("AssetServerURI") && account.ServiceURLs["AssetServerURI"] != null) | ||
392 | return account.ServiceURLs["AssetServerURI"].ToString(); | ||
393 | |||
394 | return string.Empty; | ||
395 | } | ||
396 | |||
397 | public string GetSimAssetServer() | ||
398 | { | ||
399 | return m_LocalAssetServiceURI; | ||
400 | } | ||
401 | |||
402 | #endregion | ||
403 | } | 385 | } |
404 | } | 386 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs index cc5d061..2e6ec90 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 | |||
170 | 170 | ||
171 | public AssetBase GetCached(string id) | 171 | public AssetBase GetCached(string id) |
172 | { | 172 | { |
173 | // m_log.DebugFormat("[LOCAL ASSET SERVICES CONNECTOR]: Cache request for {0}", id); | ||
174 | |||
173 | if (m_Cache != null) | 175 | if (m_Cache != null) |
174 | return m_Cache.Get(id); | 176 | return m_Cache.Get(id); |
175 | 177 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs deleted file mode 100644 index dcf08e3..0000000 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/BaseInventoryConnector.cs +++ /dev/null | |||
@@ -1,223 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using OpenMetaverse; | ||
31 | using Nini.Config; | ||
32 | using log4net; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Services.Interfaces; | ||
35 | |||
36 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | ||
37 | { | ||
38 | public abstract class BaseInventoryConnector : IInventoryService | ||
39 | { | ||
40 | protected static InventoryCache m_cache; | ||
41 | private static bool m_Initialized; | ||
42 | |||
43 | protected virtual void Init(IConfigSource source) | ||
44 | { | ||
45 | if (!m_Initialized) | ||
46 | { | ||
47 | m_cache = new InventoryCache(); | ||
48 | m_cache.Init(source, this); | ||
49 | m_Initialized = true; | ||
50 | } | ||
51 | } | ||
52 | |||
53 | /// <summary> | ||
54 | /// Create the entire inventory for a given user | ||
55 | /// </summary> | ||
56 | /// <param name="user"></param> | ||
57 | /// <returns></returns> | ||
58 | public abstract bool CreateUserInventory(UUID user); | ||
59 | |||
60 | /// <summary> | ||
61 | /// Gets the skeleton of the inventory -- folders only | ||
62 | /// </summary> | ||
63 | /// <param name="userId"></param> | ||
64 | /// <returns></returns> | ||
65 | public abstract List<InventoryFolderBase> GetInventorySkeleton(UUID userId); | ||
66 | |||
67 | /// <summary> | ||
68 | /// Synchronous inventory fetch. | ||
69 | /// </summary> | ||
70 | /// <param name="userID"></param> | ||
71 | /// <returns></returns> | ||
72 | public abstract InventoryCollection GetUserInventory(UUID userID); | ||
73 | |||
74 | /// <summary> | ||
75 | /// Request the inventory for a user. This is an asynchronous operation that will call the callback when the | ||
76 | /// inventory has been received | ||
77 | /// </summary> | ||
78 | /// <param name="userID"></param> | ||
79 | /// <param name="callback"></param> | ||
80 | public abstract void GetUserInventory(UUID userID, InventoryReceiptCallback callback); | ||
81 | |||
82 | /// <summary> | ||
83 | /// Retrieve the root inventory folder for the given user. | ||
84 | /// </summary> | ||
85 | /// <param name="userID"></param> | ||
86 | /// <returns>null if no root folder was found</returns> | ||
87 | public InventoryFolderBase GetRootFolder(UUID userID) | ||
88 | { | ||
89 | // Root folder is here as system type Folder. | ||
90 | return m_cache.GetFolderForType(userID, AssetType.Folder); | ||
91 | } | ||
92 | |||
93 | public abstract Dictionary<AssetType, InventoryFolderBase> GetSystemFolders(UUID userID); | ||
94 | |||
95 | /// <summary> | ||
96 | /// Gets the user folder for the given folder-type | ||
97 | /// </summary> | ||
98 | /// <param name="userID"></param> | ||
99 | /// <param name="type"></param> | ||
100 | /// <returns></returns> | ||
101 | public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) | ||
102 | { | ||
103 | return m_cache.GetFolderForType(userID, type); | ||
104 | } | ||
105 | |||
106 | /// <summary> | ||
107 | /// Gets everything (folders and items) inside a folder | ||
108 | /// </summary> | ||
109 | /// <param name="userId"></param> | ||
110 | /// <param name="folderID"></param> | ||
111 | /// <returns></returns> | ||
112 | public abstract InventoryCollection GetFolderContent(UUID userID, UUID folderID); | ||
113 | |||
114 | /// <summary> | ||
115 | /// Gets the items inside a folder | ||
116 | /// </summary> | ||
117 | /// <param name="userID"></param> | ||
118 | /// <param name="folderID"></param> | ||
119 | /// <returns></returns> | ||
120 | public abstract List<InventoryItemBase> GetFolderItems(UUID userID, UUID folderID); | ||
121 | |||
122 | /// <summary> | ||
123 | /// Add a new folder to the user's inventory | ||
124 | /// </summary> | ||
125 | /// <param name="folder"></param> | ||
126 | /// <returns>true if the folder was successfully added</returns> | ||
127 | public abstract bool AddFolder(InventoryFolderBase folder); | ||
128 | |||
129 | /// <summary> | ||
130 | /// Update a folder in the user's inventory | ||
131 | /// </summary> | ||
132 | /// <param name="folder"></param> | ||
133 | /// <returns>true if the folder was successfully updated</returns> | ||
134 | public abstract bool UpdateFolder(InventoryFolderBase folder); | ||
135 | |||
136 | /// <summary> | ||
137 | /// Move an inventory folder to a new location | ||
138 | /// </summary> | ||
139 | /// <param name="folder">A folder containing the details of the new location</param> | ||
140 | /// <returns>true if the folder was successfully moved</returns> | ||
141 | public abstract bool MoveFolder(InventoryFolderBase folder); | ||
142 | |||
143 | /// <summary> | ||
144 | /// Delete a list of inventory folders (from trash) | ||
145 | /// </summary> | ||
146 | public abstract bool DeleteFolders(UUID ownerID, List<UUID> folderIDs); | ||
147 | |||
148 | /// <summary> | ||
149 | /// Purge an inventory folder of all its items and subfolders. | ||
150 | /// </summary> | ||
151 | /// <param name="folder"></param> | ||
152 | /// <returns>true if the folder was successfully purged</returns> | ||
153 | public abstract bool PurgeFolder(InventoryFolderBase folder); | ||
154 | |||
155 | /// <summary> | ||
156 | /// Add a new item to the user's inventory. | ||
157 | /// If the given item has to parent folder, it tries to find the most | ||
158 | /// suitable folder for it. | ||
159 | /// </summary> | ||
160 | /// <param name="item"></param> | ||
161 | /// <returns>true if the item was successfully added</returns> | ||
162 | public bool AddItem(InventoryItemBase item) | ||
163 | { | ||
164 | if (item == null) | ||
165 | return false; | ||
166 | |||
167 | if (item.Folder == UUID.Zero) | ||
168 | { | ||
169 | InventoryFolderBase f = GetFolderForType(item.Owner, (AssetType)item.AssetType); | ||
170 | if (f != null) | ||
171 | item.Folder = f.ID; | ||
172 | else | ||
173 | { | ||
174 | f = GetRootFolder(item.Owner); | ||
175 | if (f != null) | ||
176 | item.Folder = f.ID; | ||
177 | else | ||
178 | return false; | ||
179 | } | ||
180 | } | ||
181 | |||
182 | return AddItemPlain(item); | ||
183 | } | ||
184 | |||
185 | protected abstract bool AddItemPlain(InventoryItemBase item); | ||
186 | |||
187 | /// <summary> | ||
188 | /// Update an item in the user's inventory | ||
189 | /// </summary> | ||
190 | /// <param name="item"></param> | ||
191 | /// <returns>true if the item was successfully updated</returns> | ||
192 | public abstract bool UpdateItem(InventoryItemBase item); | ||
193 | |||
194 | public abstract bool MoveItems(UUID ownerID, List<InventoryItemBase> items); | ||
195 | |||
196 | /// <summary> | ||
197 | /// Delete an item from the user's inventory | ||
198 | /// </summary> | ||
199 | /// <param name="item"></param> | ||
200 | /// <returns>true if the item was successfully deleted</returns> | ||
201 | public abstract bool DeleteItems(UUID ownerID, List<UUID> itemIDs); | ||
202 | |||
203 | public abstract InventoryItemBase GetItem(InventoryItemBase item); | ||
204 | |||
205 | public abstract InventoryFolderBase GetFolder(InventoryFolderBase folder); | ||
206 | |||
207 | /// <summary> | ||
208 | /// Does the given user have an inventory structure? | ||
209 | /// </summary> | ||
210 | /// <param name="userID"></param> | ||
211 | /// <returns></returns> | ||
212 | public abstract bool HasInventoryForUser(UUID userID); | ||
213 | |||
214 | /// <summary> | ||
215 | /// Get the active gestures of the agent. | ||
216 | /// </summary> | ||
217 | /// <param name="userId"></param> | ||
218 | /// <returns></returns> | ||
219 | public abstract List<InventoryItemBase> GetActiveGestures(UUID userId); | ||
220 | |||
221 | public abstract int GetAssetPermissions(UUID userID, UUID assetID); | ||
222 | } | ||
223 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker.cs index 0d121ed..b5c0af6 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 | |||
218 | /// <param name="userID"></param> | 218 | /// <param name="userID"></param> |
219 | private void CacheInventoryServiceURL(UUID userID) | 219 | private void CacheInventoryServiceURL(UUID userID) |
220 | { | 220 | { |
221 | if (m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, userID) == null) | 221 | if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID)) |
222 | { | 222 | { |
223 | // The user does not have a local account; let's cache its service URL | 223 | // The user is not local; let's cache its service URL |
224 | string inventoryURL = string.Empty; | 224 | string inventoryURL = string.Empty; |
225 | ScenePresence sp = null; | 225 | ScenePresence sp = null; |
226 | foreach (Scene scene in m_Scenes) | 226 | foreach (Scene scene in m_Scenes) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs deleted file mode 100644 index 2322d7c..0000000 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs +++ /dev/null | |||
@@ -1,237 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | |||
32 | using OpenSim.Framework; | ||
33 | using OpenSim.Framework.Client; | ||
34 | using OpenSim.Region.Framework.Scenes; | ||
35 | |||
36 | using OpenMetaverse; | ||
37 | using Nini.Config; | ||
38 | using log4net; | ||
39 | |||
40 | namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory | ||
41 | { | ||
42 | public class InventoryCache | ||
43 | { | ||
44 | private static readonly ILog m_log = | ||
45 | LogManager.GetLogger( | ||
46 | MethodBase.GetCurrentMethod().DeclaringType); | ||
47 | |||
48 | protected BaseInventoryConnector m_Connector; | ||
49 | protected List<Scene> m_Scenes; | ||
50 | |||
51 | // The cache proper | ||
52 | protected Dictionary<UUID, Dictionary<AssetType, InventoryFolderBase>> m_InventoryCache; | ||
53 | |||
54 | // A cache of userIDs --> ServiceURLs, for HGBroker only | ||
55 | protected Dictionary<UUID, string> m_InventoryURLs = | ||
56 | new Dictionary<UUID, string>(); | ||
57 | |||
58 | public virtual void Init(IConfigSource source, BaseInventoryConnector connector) | ||
59 | { | ||
60 | m_Scenes = new List<Scene>(); | ||
61 | m_InventoryCache = new Dictionary<UUID, Dictionary<AssetType, InventoryFolderBase>>(); | ||
62 | m_Connector = connector; | ||
63 | } | ||
64 | |||
65 | public virtual void AddRegion(Scene scene) | ||
66 | { | ||
67 | m_Scenes.Add(scene); | ||
68 | scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; | ||
69 | scene.EventManager.OnClientClosed += OnClientClosed; | ||
70 | } | ||
71 | |||
72 | public virtual void RemoveRegion(Scene scene) | ||
73 | { | ||
74 | if ((m_Scenes != null) && m_Scenes.Contains(scene)) | ||
75 | { | ||
76 | m_Scenes.Remove(scene); | ||
77 | } | ||
78 | } | ||
79 | |||
80 | void OnMakeRootAgent(ScenePresence presence) | ||
81 | { | ||
82 | // Get system folders | ||
83 | |||
84 | // First check if they're here already | ||
85 | lock (m_InventoryCache) | ||
86 | { | ||
87 | if (m_InventoryCache.ContainsKey(presence.UUID)) | ||
88 | { | ||
89 | m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent, system folders for {0} {1} already in cache", presence.Firstname, presence.Lastname); | ||
90 | return; | ||
91 | } | ||
92 | } | ||
93 | |||
94 | // If not, go get them and place them in the cache | ||
95 | Dictionary<AssetType, InventoryFolderBase> folders = CacheSystemFolders(presence.UUID); | ||
96 | CacheInventoryServiceURL(presence.Scene, presence.UUID); | ||
97 | |||
98 | m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}", | ||
99 | presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count); | ||
100 | |||
101 | } | ||
102 | |||
103 | void OnClientClosed(UUID clientID, Scene scene) | ||
104 | { | ||
105 | if (m_InventoryCache.ContainsKey(clientID)) // if it's still in cache | ||
106 | { | ||
107 | ScenePresence sp = null; | ||
108 | foreach (Scene s in m_Scenes) | ||
109 | { | ||
110 | s.TryGetScenePresence(clientID, out sp); | ||
111 | if ((sp != null) && !sp.IsChildAgent && (s != scene)) | ||
112 | { | ||
113 | m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping system folders in cache", | ||
114 | scene.RegionInfo.RegionName, clientID); | ||
115 | return; | ||
116 | } | ||
117 | } | ||
118 | |||
119 | m_log.DebugFormat( | ||
120 | "[INVENTORY CACHE]: OnClientClosed in {0}, user {1} out of sim. Dropping system folders", | ||
121 | scene.RegionInfo.RegionName, clientID); | ||
122 | DropCachedSystemFolders(clientID); | ||
123 | DropInventoryServiceURL(clientID); | ||
124 | } | ||
125 | } | ||
126 | |||
127 | /// <summary> | ||
128 | /// Cache a user's 'system' folders. | ||
129 | /// </summary> | ||
130 | /// <param name="userID"></param> | ||
131 | /// <returns>Folders cached</returns> | ||
132 | protected Dictionary<AssetType, InventoryFolderBase> CacheSystemFolders(UUID userID) | ||
133 | { | ||
134 | // If not, go get them and place them in the cache | ||
135 | Dictionary<AssetType, InventoryFolderBase> folders = m_Connector.GetSystemFolders(userID); | ||
136 | |||
137 | if (folders.Count > 0) | ||
138 | lock (m_InventoryCache) | ||
139 | m_InventoryCache.Add(userID, folders); | ||
140 | |||
141 | return folders; | ||
142 | } | ||
143 | |||
144 | /// <summary> | ||
145 | /// Drop a user's cached 'system' folders | ||
146 | /// </summary> | ||
147 | /// <param name="userID"></param> | ||
148 | protected void DropCachedSystemFolders(UUID userID) | ||
149 | { | ||
150 | // Drop system folders | ||
151 | lock (m_InventoryCache) | ||
152 | if (m_InventoryCache.ContainsKey(userID)) | ||
153 | m_InventoryCache.Remove(userID); | ||
154 | } | ||
155 | |||
156 | /// <summary> | ||
157 | /// Get the system folder for a particular asset type | ||
158 | /// </summary> | ||
159 | /// <param name="userID"></param> | ||
160 | /// <param name="type"></param> | ||
161 | /// <returns></returns> | ||
162 | public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) | ||
163 | { | ||
164 | m_log.DebugFormat("[INVENTORY CACHE]: Getting folder for asset type {0} for user {1}", type, userID); | ||
165 | |||
166 | Dictionary<AssetType, InventoryFolderBase> folders = null; | ||
167 | |||
168 | lock (m_InventoryCache) | ||
169 | { | ||
170 | m_InventoryCache.TryGetValue(userID, out folders); | ||
171 | |||
172 | // In some situations (such as non-secured standalones), system folders can be requested without | ||
173 | // the user being logged in. So we need to try caching them here if we don't already have them. | ||
174 | if (null == folders) | ||
175 | CacheSystemFolders(userID); | ||
176 | |||
177 | m_InventoryCache.TryGetValue(userID, out folders); | ||
178 | } | ||
179 | |||
180 | if ((folders != null) && folders.ContainsKey(type)) | ||
181 | { | ||
182 | m_log.DebugFormat( | ||
183 | "[INVENTORY CACHE]: Returning folder {0} as type {1} for {2}", folders[type], type, userID); | ||
184 | |||
185 | return folders[type]; | ||
186 | } | ||
187 | |||
188 | m_log.WarnFormat("[INVENTORY CACHE]: Could not find folder for system type {0} for {1}", type, userID); | ||
189 | |||
190 | return null; | ||
191 | } | ||
192 | |||
193 | /// <summary> | ||
194 | /// Gets the user's inventory URL from its serviceURLs, if the user is foreign, | ||
195 | /// and sticks it in the cache | ||
196 | /// </summary> | ||
197 | /// <param name="userID"></param> | ||
198 | private void CacheInventoryServiceURL(Scene scene, UUID userID) | ||
199 | { | ||
200 | if (scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, userID) == null) | ||
201 | { | ||
202 | // The user does not have a local account; let's cache its service URL | ||
203 | string inventoryURL = string.Empty; | ||
204 | ScenePresence sp = null; | ||
205 | scene.TryGetScenePresence(userID, out sp); | ||
206 | if (sp != null) | ||
207 | { | ||
208 | AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | ||
209 | if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) | ||
210 | { | ||
211 | inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); | ||
212 | if (inventoryURL != null && inventoryURL != string.Empty) | ||
213 | { | ||
214 | inventoryURL = inventoryURL.Trim(new char[] { '/' }); | ||
215 | m_InventoryURLs.Add(userID, inventoryURL); | ||
216 | } | ||
217 | } | ||
218 | } | ||
219 | } | ||
220 | } | ||
221 | |||
222 | private void DropInventoryServiceURL(UUID userID) | ||
223 | { | ||
224 | lock (m_InventoryURLs) | ||
225 | if (m_InventoryURLs.ContainsKey(userID)) | ||
226 | m_InventoryURLs.Remove(userID); | ||
227 | } | ||
228 | |||
229 | public string GetInventoryServiceURL(UUID userID) | ||
230 | { | ||
231 | if (m_InventoryURLs.ContainsKey(userID)) | ||
232 | return m_InventoryURLs[userID]; | ||
233 | |||
234 | return null; | ||
235 | } | ||
236 | } | ||
237 | } | ||
diff --git a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs index c66e053..54dfaf4 100644 --- a/OpenSim/Region/Framework/Interfaces/IUserManagement.cs +++ b/OpenSim/Region/Framework/Interfaces/IUserManagement.cs | |||
@@ -14,6 +14,9 @@ namespace OpenSim.Region.Framework.Interfaces | |||
14 | string GetUserHomeURL(UUID uuid); | 14 | string GetUserHomeURL(UUID uuid); |
15 | string GetUserUUI(UUID uuid); | 15 | string GetUserUUI(UUID uuid); |
16 | string GetUserServerURL(UUID uuid, string serverType); | 16 | string GetUserServerURL(UUID uuid, string serverType); |
17 | int GetUserFlags(UUID userID); | ||
18 | int GetUserCreated(UUID userID); | ||
19 | string GetUserTitle(UUID userID); | ||
17 | 20 | ||
18 | /// <summary> | 21 | /// <summary> |
19 | /// Add a user. | 22 | /// Add a user. |
@@ -48,5 +51,7 @@ namespace OpenSim.Region.Framework.Interfaces | |||
48 | /// <param name="firstName"></param> | 51 | /// <param name="firstName"></param> |
49 | /// <param name="profileURL"></param> | 52 | /// <param name="profileURL"></param> |
50 | void AddUser(UUID uuid, string firstName, string lastName, string profileURL); | 53 | void AddUser(UUID uuid, string firstName, string lastName, string profileURL); |
54 | |||
55 | bool IsLocalGridUser(UUID uuid); | ||
51 | } | 56 | } |
52 | } | 57 | } |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6666328..0f84da9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -77,7 +77,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
77 | /// Controls whether physics can be applied to prims. Even if false, prims still have entries in a | 77 | /// Controls whether physics can be applied to prims. Even if false, prims still have entries in a |
78 | /// PhysicsScene in order to perform collision detection | 78 | /// PhysicsScene in order to perform collision detection |
79 | /// </summary> | 79 | /// </summary> |
80 | public bool m_physicalPrim; | 80 | public bool PhysicalPrims { get; private set; } |
81 | |||
82 | /// <summary> | ||
83 | /// Controls whether prims can be collided with. | ||
84 | /// </summary> | ||
85 | /// <remarks> | ||
86 | /// If this is set to false then prims cannot be subject to physics either. | ||
87 | /// </summary> | ||
88 | public bool CollidablePrims { get; private set; } | ||
81 | 89 | ||
82 | public float m_maxNonphys = 256; | 90 | public float m_maxNonphys = 256; |
83 | public float m_maxPhys = 10; | 91 | public float m_maxPhys = 10; |
@@ -650,7 +658,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
650 | //Animation states | 658 | //Animation states |
651 | m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); | 659 | m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); |
652 | 660 | ||
653 | m_physicalPrim = startupConfig.GetBoolean("physical_prim", true); | 661 | PhysicalPrims = startupConfig.GetBoolean("physical_prim", true); |
662 | CollidablePrims = startupConfig.GetBoolean("collidable_prim", true); | ||
654 | 663 | ||
655 | m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); | 664 | m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys); |
656 | if (RegionInfo.NonphysPrimMax > 0) | 665 | if (RegionInfo.NonphysPrimMax > 0) |
@@ -701,7 +710,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
701 | if (maptileRefresh != 0) | 710 | if (maptileRefresh != 0) |
702 | { | 711 | { |
703 | m_mapGenerationTimer.Interval = maptileRefresh * 1000; | 712 | m_mapGenerationTimer.Interval = maptileRefresh * 1000; |
704 | m_mapGenerationTimer.Elapsed += RegenerateMaptile; | 713 | m_mapGenerationTimer.Elapsed += RegenerateMaptileAndReregister; |
705 | m_mapGenerationTimer.AutoReset = true; | 714 | m_mapGenerationTimer.AutoReset = true; |
706 | m_mapGenerationTimer.Start(); | 715 | m_mapGenerationTimer.Start(); |
707 | } | 716 | } |
@@ -1638,21 +1647,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1638 | { | 1647 | { |
1639 | m_sceneGridService.SetScene(this); | 1648 | m_sceneGridService.SetScene(this); |
1640 | 1649 | ||
1650 | //// Unfortunately this needs to be here and it can't be async. | ||
1651 | //// The map tile image is stored in RegionSettings, but it also needs to be | ||
1652 | //// stored in the GridService, because that's what the world map module uses | ||
1653 | //// to send the map image UUIDs (of other regions) to the viewer... | ||
1654 | if (m_generateMaptiles) | ||
1655 | RegenerateMaptile(); | ||
1656 | |||
1641 | GridRegion region = new GridRegion(RegionInfo); | 1657 | GridRegion region = new GridRegion(RegionInfo); |
1642 | string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); | 1658 | string error = GridService.RegisterRegion(RegionInfo.ScopeID, region); |
1643 | if (error != String.Empty) | 1659 | if (error != String.Empty) |
1644 | { | ||
1645 | throw new Exception(error); | 1660 | throw new Exception(error); |
1646 | } | ||
1647 | |||
1648 | // Generate the maptile asynchronously, because sometimes it can be very slow and we | ||
1649 | // don't want this to delay starting the region. | ||
1650 | if (m_generateMaptiles) | ||
1651 | { | ||
1652 | Util.FireAndForget(delegate { | ||
1653 | RegenerateMaptile(null, null); | ||
1654 | }); | ||
1655 | } | ||
1656 | } | 1661 | } |
1657 | 1662 | ||
1658 | #endregion | 1663 | #endregion |
@@ -5023,13 +5028,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
5023 | /// </summary> | 5028 | /// </summary> |
5024 | /// <param name="sender"></param> | 5029 | /// <param name="sender"></param> |
5025 | /// <param name="e"></param> | 5030 | /// <param name="e"></param> |
5026 | public void RegenerateMaptile(object sender, ElapsedEventArgs e) | 5031 | private void RegenerateMaptile() |
5027 | { | 5032 | { |
5028 | IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>(); | 5033 | IWorldMapModule mapModule = RequestModuleInterface<IWorldMapModule>(); |
5029 | if (mapModule != null) | 5034 | if (mapModule != null) |
5030 | mapModule.GenerateMaptile(); | 5035 | mapModule.GenerateMaptile(); |
5031 | } | 5036 | } |
5032 | 5037 | ||
5038 | private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) | ||
5039 | { | ||
5040 | RegenerateMaptile(); | ||
5041 | |||
5042 | // We need to propagate the new image UUID to the grid service | ||
5043 | // so that all simulators can retrieve it | ||
5044 | string error = GridService.RegisterRegion(RegionInfo.ScopeID, new GridRegion(RegionInfo)); | ||
5045 | if (error != string.Empty) | ||
5046 | throw new Exception(error); | ||
5047 | } | ||
5048 | |||
5033 | // This method is called across the simulation connector to | 5049 | // This method is called across the simulation connector to |
5034 | // determine if a given agent is allowed in this region | 5050 | // determine if a given agent is allowed in this region |
5035 | // AS A ROOT AGENT. Returning false here will prevent them | 5051 | // AS A ROOT AGENT. Returning false here will prevent them |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index a3e4b46..1e2901b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -333,7 +333,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
333 | if (rot != null) | 333 | if (rot != null) |
334 | sceneObject.UpdateGroupRotationR((Quaternion)rot); | 334 | sceneObject.UpdateGroupRotationR((Quaternion)rot); |
335 | 335 | ||
336 | //group.ApplyPhysics(m_physicalPrim); | ||
337 | if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero) | 336 | if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero) |
338 | { | 337 | { |
339 | sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false); | 338 | sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index abea788..8860764 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -210,7 +210,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
210 | /// </remarks> | 210 | /// </remarks> |
211 | public bool UsesPhysics | 211 | public bool UsesPhysics |
212 | { | 212 | { |
213 | get { return (RootPart.Flags & PrimFlags.TemporaryOnRez) != 0; } | 213 | get { return (RootPart.Flags & PrimFlags.Physics) != 0; } |
214 | } | 214 | } |
215 | 215 | ||
216 | /// <summary> | 216 | /// <summary> |
@@ -669,7 +669,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
669 | //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); | 669 | //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); |
670 | } | 670 | } |
671 | 671 | ||
672 | ApplyPhysics(m_scene.m_physicalPrim); | 672 | ApplyPhysics(); |
673 | 673 | ||
674 | // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled | 674 | // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled |
675 | // for the same object with very different properties. The caller must schedule the update. | 675 | // for the same object with very different properties. The caller must schedule the update. |
@@ -1239,8 +1239,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1239 | /// <summary> | 1239 | /// <summary> |
1240 | /// Apply physics to this group | 1240 | /// Apply physics to this group |
1241 | /// </summary> | 1241 | /// </summary> |
1242 | /// <param name="m_physicalPrim"></param> | 1242 | public void ApplyPhysics() |
1243 | public void ApplyPhysics(bool m_physicalPrim) | ||
1244 | { | 1243 | { |
1245 | // Apply physics to the root prim | 1244 | // Apply physics to the root prim |
1246 | m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive); | 1245 | m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index b29ecc6..aea47e6 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -1473,6 +1473,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1473 | /// <param name="VolumeDetectActive"></param> | 1473 | /// <param name="VolumeDetectActive"></param> |
1474 | public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive) | 1474 | public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive) |
1475 | { | 1475 | { |
1476 | if (!ParentGroup.Scene.CollidablePrims) | ||
1477 | return; | ||
1478 | |||
1476 | // m_log.DebugFormat( | 1479 | // m_log.DebugFormat( |
1477 | // "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}", | 1480 | // "[SCENE OBJECT PART]: Applying physics to {0} {1}, m_physicalPrim {2}", |
1478 | // Name, LocalId, UUID, m_physicalPrim); | 1481 | // Name, LocalId, UUID, m_physicalPrim); |
@@ -1739,7 +1742,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1739 | /// <param name="isNew"></param> | 1742 | /// <param name="isNew"></param> |
1740 | public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) | 1743 | public void DoPhysicsPropertyUpdate(bool UsePhysics, bool isNew) |
1741 | { | 1744 | { |
1742 | if (!ParentGroup.Scene.m_physicalPrim && UsePhysics) | 1745 | if (!ParentGroup.Scene.PhysicalPrims && UsePhysics) |
1743 | return; | 1746 | return; |
1744 | 1747 | ||
1745 | if (IsJoint()) | 1748 | if (IsJoint()) |
@@ -4318,7 +4321,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4318 | if (ParentGroup.Scene == null) | 4321 | if (ParentGroup.Scene == null) |
4319 | return; | 4322 | return; |
4320 | 4323 | ||
4321 | if (PhysActor == null) | 4324 | if (ParentGroup.Scene.CollidablePrims && PhysActor == null) |
4322 | { | 4325 | { |
4323 | // It's not phantom anymore. So make sure the physics engine get's knowledge of it | 4326 | // It's not phantom anymore. So make sure the physics engine get's knowledge of it |
4324 | PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape( | 4327 | PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape( |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index b8ae553..42cd4be 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -118,7 +118,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
118 | /// TODO: For some reason, we effectively have a list both here and in Appearance. Need to work out if this is | 118 | /// TODO: For some reason, we effectively have a list both here and in Appearance. Need to work out if this is |
119 | /// necessary. | 119 | /// necessary. |
120 | /// </remarks> | 120 | /// </remarks> |
121 | protected List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); | 121 | private List<SceneObjectGroup> m_attachments = new List<SceneObjectGroup>(); |
122 | 122 | ||
123 | public Object AttachmentsSyncLock { get; private set; } | 123 | public Object AttachmentsSyncLock { get; private set; } |
124 | 124 | ||
@@ -550,8 +550,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
550 | } | 550 | } |
551 | } | 551 | } |
552 | 552 | ||
553 | m_pos = value; | 553 | // Don't update while sitting |
554 | ParentPosition = Vector3.Zero; | 554 | if (ParentID == 0) |
555 | { | ||
556 | m_pos = value; | ||
557 | ParentPosition = Vector3.Zero; | ||
558 | } | ||
555 | 559 | ||
556 | //m_log.DebugFormat( | 560 | //m_log.DebugFormat( |
557 | // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", | 561 | // "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", |
@@ -566,6 +570,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
566 | public Vector3 OffsetPosition | 570 | public Vector3 OffsetPosition |
567 | { | 571 | { |
568 | get { return m_pos; } | 572 | get { return m_pos; } |
573 | // Don't remove setter. It's not currently used in core but | ||
574 | // upcoming Avination code needs it. | ||
575 | set | ||
576 | { | ||
577 | // There is no offset position when not seated | ||
578 | if (ParentID == 0) | ||
579 | return; | ||
580 | m_pos = value; | ||
581 | } | ||
569 | } | 582 | } |
570 | 583 | ||
571 | /// <summary> | 584 | /// <summary> |
@@ -1161,10 +1174,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1161 | public void CompleteMovement(IClientAPI client, bool openChildAgents) | 1174 | public void CompleteMovement(IClientAPI client, bool openChildAgents) |
1162 | { | 1175 | { |
1163 | // DateTime startTime = DateTime.Now; | 1176 | // DateTime startTime = DateTime.Now; |
1164 | 1177 | ||
1165 | // m_log.DebugFormat( | 1178 | m_log.DebugFormat( |
1166 | // "[SCENE PRESENCE]: Completing movement of {0} into region {1}", | 1179 | "[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}", |
1167 | // client.Name, Scene.RegionInfo.RegionName); | 1180 | client.Name, Scene.RegionInfo.RegionName, AbsolutePosition); |
1168 | 1181 | ||
1169 | Vector3 look = Velocity; | 1182 | Vector3 look = Velocity; |
1170 | if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) | 1183 | if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) |
@@ -2383,9 +2396,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2383 | m_lastVelocity = Velocity; | 2396 | m_lastVelocity = Velocity; |
2384 | } | 2397 | } |
2385 | 2398 | ||
2386 | // followed suggestion from mic bowman. reversed the two lines below. | 2399 | CheckForBorderCrossing(); |
2387 | if (ParentID == 0 && PhysicsActor != null || ParentID != 0) // Check that we have a physics actor or we're sitting on something | ||
2388 | CheckForBorderCrossing(); | ||
2389 | 2400 | ||
2390 | CheckForSignificantMovement(); // sends update to the modules. | 2401 | CheckForSignificantMovement(); // sends update to the modules. |
2391 | } | 2402 | } |
@@ -2738,143 +2749,146 @@ namespace OpenSim.Region.Framework.Scenes | |||
2738 | /// </remarks> | 2749 | /// </remarks> |
2739 | protected void CheckForBorderCrossing() | 2750 | protected void CheckForBorderCrossing() |
2740 | { | 2751 | { |
2741 | if (IsChildAgent) | 2752 | // Check that we we are not a child |
2753 | if (IsChildAgent) | ||
2742 | return; | 2754 | return; |
2743 | 2755 | ||
2744 | Vector3 pos2 = AbsolutePosition; | 2756 | // If we don't have a PhysActor, we can't cross anyway |
2745 | Vector3 vel = Velocity; | 2757 | // Also don't do this while sat, sitting avatars cross with the |
2746 | int neighbor = 0; | 2758 | // object they sit on. |
2747 | int[] fix = new int[2]; | 2759 | if (ParentID != 0 || PhysicsActor == null) |
2748 | 2760 | return; | |
2749 | float timeStep = 0.1f; | ||
2750 | pos2.X = pos2.X + (vel.X*timeStep); | ||
2751 | pos2.Y = pos2.Y + (vel.Y*timeStep); | ||
2752 | pos2.Z = pos2.Z + (vel.Z*timeStep); | ||
2753 | 2761 | ||
2754 | if (!IsInTransit) | 2762 | if (!IsInTransit) |
2755 | { | 2763 | { |
2756 | // Checks if where it's headed exists a region | 2764 | Vector3 pos2 = AbsolutePosition; |
2765 | Vector3 vel = Velocity; | ||
2766 | int neighbor = 0; | ||
2767 | int[] fix = new int[2]; | ||
2757 | 2768 | ||
2758 | bool needsTransit = false; | 2769 | float timeStep = 0.1f; |
2759 | if (m_scene.TestBorderCross(pos2, Cardinals.W)) | 2770 | pos2.X = pos2.X + (vel.X * timeStep); |
2771 | pos2.Y = pos2.Y + (vel.Y * timeStep); | ||
2772 | pos2.Z = pos2.Z + (vel.Z * timeStep); | ||
2773 | |||
2774 | if (!IsInTransit) | ||
2760 | { | 2775 | { |
2761 | if (m_scene.TestBorderCross(pos2, Cardinals.S)) | 2776 | // Checks if where it's headed exists a region |
2762 | { | 2777 | bool needsTransit = false; |
2763 | needsTransit = true; | 2778 | if (m_scene.TestBorderCross(pos2, Cardinals.W)) |
2764 | neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix); | ||
2765 | } | ||
2766 | else if (m_scene.TestBorderCross(pos2, Cardinals.N)) | ||
2767 | { | 2779 | { |
2768 | needsTransit = true; | 2780 | if (m_scene.TestBorderCross(pos2, Cardinals.S)) |
2769 | neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix); | 2781 | { |
2782 | needsTransit = true; | ||
2783 | neighbor = m_scene.HaveNeighbor(Cardinals.SW, ref fix); | ||
2784 | } | ||
2785 | else if (m_scene.TestBorderCross(pos2, Cardinals.N)) | ||
2786 | { | ||
2787 | needsTransit = true; | ||
2788 | neighbor = m_scene.HaveNeighbor(Cardinals.NW, ref fix); | ||
2789 | } | ||
2790 | else | ||
2791 | { | ||
2792 | needsTransit = true; | ||
2793 | neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix); | ||
2794 | } | ||
2770 | } | 2795 | } |
2771 | else | 2796 | else if (m_scene.TestBorderCross(pos2, Cardinals.E)) |
2772 | { | 2797 | { |
2773 | needsTransit = true; | 2798 | if (m_scene.TestBorderCross(pos2, Cardinals.S)) |
2774 | neighbor = m_scene.HaveNeighbor(Cardinals.W, ref fix); | 2799 | { |
2800 | needsTransit = true; | ||
2801 | neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix); | ||
2802 | } | ||
2803 | else if (m_scene.TestBorderCross(pos2, Cardinals.N)) | ||
2804 | { | ||
2805 | needsTransit = true; | ||
2806 | neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix); | ||
2807 | } | ||
2808 | else | ||
2809 | { | ||
2810 | needsTransit = true; | ||
2811 | neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix); | ||
2812 | } | ||
2775 | } | 2813 | } |
2776 | } | 2814 | else if (m_scene.TestBorderCross(pos2, Cardinals.S)) |
2777 | else if (m_scene.TestBorderCross(pos2, Cardinals.E)) | ||
2778 | { | ||
2779 | if (m_scene.TestBorderCross(pos2, Cardinals.S)) | ||
2780 | { | 2815 | { |
2781 | needsTransit = true; | 2816 | needsTransit = true; |
2782 | neighbor = m_scene.HaveNeighbor(Cardinals.SE, ref fix); | 2817 | neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix); |
2783 | } | 2818 | } |
2784 | else if (m_scene.TestBorderCross(pos2, Cardinals.N)) | 2819 | else if (m_scene.TestBorderCross(pos2, Cardinals.N)) |
2785 | { | 2820 | { |
2786 | needsTransit = true; | 2821 | needsTransit = true; |
2787 | neighbor = m_scene.HaveNeighbor(Cardinals.NE, ref fix); | 2822 | neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix); |
2788 | } | 2823 | } |
2789 | else | ||
2790 | { | ||
2791 | needsTransit = true; | ||
2792 | neighbor = m_scene.HaveNeighbor(Cardinals.E, ref fix); | ||
2793 | } | ||
2794 | } | ||
2795 | else if (m_scene.TestBorderCross(pos2, Cardinals.S)) | ||
2796 | { | ||
2797 | needsTransit = true; | ||
2798 | neighbor = m_scene.HaveNeighbor(Cardinals.S, ref fix); | ||
2799 | } | ||
2800 | else if (m_scene.TestBorderCross(pos2, Cardinals.N)) | ||
2801 | { | ||
2802 | needsTransit = true; | ||
2803 | neighbor = m_scene.HaveNeighbor(Cardinals.N, ref fix); | ||
2804 | } | ||
2805 | 2824 | ||
2806 | // Makes sure avatar does not end up outside region | 2825 | // Makes sure avatar does not end up outside region |
2807 | if (neighbor <= 0) | 2826 | if (neighbor <= 0) |
2808 | { | ||
2809 | if (needsTransit) | ||
2810 | { | 2827 | { |
2811 | if (m_requestedSitTargetUUID == UUID.Zero) | 2828 | if (needsTransit) |
2812 | { | 2829 | { |
2813 | bool isFlying = Flying; | 2830 | if (m_requestedSitTargetUUID == UUID.Zero) |
2814 | RemoveFromPhysicalScene(); | 2831 | { |
2815 | 2832 | bool isFlying = Flying; | |
2816 | Vector3 pos = AbsolutePosition; | 2833 | RemoveFromPhysicalScene(); |
2817 | if (AbsolutePosition.X < 0) | 2834 | |
2818 | pos.X += Velocity.X * 2; | 2835 | Vector3 pos = AbsolutePosition; |
2819 | else if (AbsolutePosition.X > Constants.RegionSize) | 2836 | if (AbsolutePosition.X < 0) |
2820 | pos.X -= Velocity.X * 2; | 2837 | pos.X += Velocity.X * 2; |
2821 | if (AbsolutePosition.Y < 0) | 2838 | else if (AbsolutePosition.X > Constants.RegionSize) |
2822 | pos.Y += Velocity.Y * 2; | 2839 | pos.X -= Velocity.X * 2; |
2823 | else if (AbsolutePosition.Y > Constants.RegionSize) | 2840 | if (AbsolutePosition.Y < 0) |
2824 | pos.Y -= Velocity.Y * 2; | 2841 | pos.Y += Velocity.Y * 2; |
2825 | Velocity = Vector3.Zero; | 2842 | else if (AbsolutePosition.Y > Constants.RegionSize) |
2826 | AbsolutePosition = pos; | 2843 | pos.Y -= Velocity.Y * 2; |
2827 | 2844 | Velocity = Vector3.Zero; | |
2828 | // m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); | 2845 | AbsolutePosition = pos; |
2829 | 2846 | ||
2830 | AddToPhysicalScene(isFlying); | 2847 | // m_log.DebugFormat("[SCENE PRESENCE]: Prevented flyoff for {0} at {1}", Name, AbsolutePosition); |
2848 | |||
2849 | AddToPhysicalScene(isFlying); | ||
2850 | } | ||
2831 | } | 2851 | } |
2832 | } | 2852 | } |
2833 | } | 2853 | else if (neighbor > 0) |
2834 | else if (neighbor > 0) | ||
2835 | { | ||
2836 | if (!CrossToNewRegion()) | ||
2837 | { | 2854 | { |
2838 | if (m_requestedSitTargetUUID == UUID.Zero) | 2855 | if (!CrossToNewRegion()) |
2839 | { | 2856 | { |
2840 | bool isFlying = Flying; | 2857 | if (m_requestedSitTargetUUID == UUID.Zero) |
2841 | RemoveFromPhysicalScene(); | 2858 | { |
2842 | 2859 | bool isFlying = Flying; | |
2843 | Vector3 pos = AbsolutePosition; | 2860 | RemoveFromPhysicalScene(); |
2844 | if (AbsolutePosition.X < 0) | 2861 | |
2845 | pos.X += Velocity.X * 2; | 2862 | Vector3 pos = AbsolutePosition; |
2846 | else if (AbsolutePosition.X > Constants.RegionSize) | 2863 | if (AbsolutePosition.X < 0) |
2847 | pos.X -= Velocity.X * 2; | 2864 | pos.X += Velocity.X * 2; |
2848 | if (AbsolutePosition.Y < 0) | 2865 | else if (AbsolutePosition.X > Constants.RegionSize) |
2849 | pos.Y += Velocity.Y * 2; | 2866 | pos.X -= Velocity.X * 2; |
2850 | else if (AbsolutePosition.Y > Constants.RegionSize) | 2867 | if (AbsolutePosition.Y < 0) |
2851 | pos.Y -= Velocity.Y * 2; | 2868 | pos.Y += Velocity.Y * 2; |
2852 | Velocity = Vector3.Zero; | 2869 | else if (AbsolutePosition.Y > Constants.RegionSize) |
2853 | AbsolutePosition = pos; | 2870 | pos.Y -= Velocity.Y * 2; |
2854 | 2871 | Velocity = Vector3.Zero; | |
2855 | AddToPhysicalScene(isFlying); | 2872 | AbsolutePosition = pos; |
2873 | |||
2874 | AddToPhysicalScene(isFlying); | ||
2875 | } | ||
2856 | } | 2876 | } |
2857 | } | 2877 | } |
2858 | } | 2878 | } |
2859 | } | 2879 | else |
2860 | else | 2880 | { |
2861 | { | 2881 | // This constant has been inferred from experimentation |
2862 | // We must remove the agent from the physical scene if it has been placed in transit. If we don't, | 2882 | // I'm not sure what this value should be, so I tried a few values. |
2863 | // then this method continues to be called from ScenePresence.Update() until the handover of the client between | 2883 | timeStep = 0.04f; |
2864 | // regions is completed. Since this handover can take more than 1000ms (due to the 1000ms | 2884 | pos2 = AbsolutePosition; |
2865 | // event queue polling response from the server), this results in the avatar pausing on the border | 2885 | pos2.X = pos2.X + (vel.X * timeStep); |
2866 | // for the handover period. | 2886 | pos2.Y = pos2.Y + (vel.Y * timeStep); |
2867 | RemoveFromPhysicalScene(); | 2887 | // Don't touch the Z |
2868 | 2888 | m_pos = pos2; | |
2869 | // This constant has been inferred from experimentation | 2889 | m_log.DebugFormat("[SCENE PRESENCE]: In transit m_pos={0}", m_pos); |
2870 | // I'm not sure what this value should be, so I tried a few values. | 2890 | } |
2871 | timeStep = 0.04f; | 2891 | } |
2872 | pos2 = AbsolutePosition; | ||
2873 | pos2.X = pos2.X + (vel.X * timeStep); | ||
2874 | pos2.Y = pos2.Y + (vel.Y * timeStep); | ||
2875 | pos2.Z = pos2.Z + (vel.Z * timeStep); | ||
2876 | m_pos = pos2; | ||
2877 | } | ||
2878 | } | 2892 | } |
2879 | 2893 | ||
2880 | /// <summary> | 2894 | /// <summary> |
@@ -3104,30 +3118,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
3104 | catch { } | 3118 | catch { } |
3105 | 3119 | ||
3106 | // Attachment objects | 3120 | // Attachment objects |
3107 | lock (m_attachments) | 3121 | List<SceneObjectGroup> attachments = GetAttachments(); |
3122 | if (attachments.Count > 0) | ||
3108 | { | 3123 | { |
3109 | if (m_attachments.Count > 0) | 3124 | cAgent.AttachmentObjects = new List<ISceneObject>(); |
3110 | { | 3125 | cAgent.AttachmentObjectStates = new List<string>(); |
3111 | cAgent.AttachmentObjects = new List<ISceneObject>(); | 3126 | // IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>(); |
3112 | cAgent.AttachmentObjectStates = new List<string>(); | 3127 | InTransitScriptStates.Clear(); |
3113 | // IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>(); | ||
3114 | InTransitScriptStates.Clear(); | ||
3115 | 3128 | ||
3116 | foreach (SceneObjectGroup sog in m_attachments) | 3129 | foreach (SceneObjectGroup sog in attachments) |
3117 | { | 3130 | { |
3118 | // We need to make a copy and pass that copy | 3131 | // We need to make a copy and pass that copy |
3119 | // because of transfers withn the same sim | 3132 | // because of transfers withn the same sim |
3120 | ISceneObject clone = sog.CloneForNewScene(); | 3133 | ISceneObject clone = sog.CloneForNewScene(); |
3121 | // Attachment module assumes that GroupPosition holds the offsets...! | 3134 | // Attachment module assumes that GroupPosition holds the offsets...! |
3122 | ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; | 3135 | ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; |
3123 | ((SceneObjectGroup)clone).IsAttachment = false; | 3136 | ((SceneObjectGroup)clone).IsAttachment = false; |
3124 | cAgent.AttachmentObjects.Add(clone); | 3137 | cAgent.AttachmentObjects.Add(clone); |
3125 | string state = sog.GetStateSnapshot(); | 3138 | string state = sog.GetStateSnapshot(); |
3126 | cAgent.AttachmentObjectStates.Add(state); | 3139 | cAgent.AttachmentObjectStates.Add(state); |
3127 | InTransitScriptStates.Add(state); | 3140 | InTransitScriptStates.Add(state); |
3128 | // Let's remove the scripts of the original object here | 3141 | // Let's remove the scripts of the original object here |
3129 | sog.RemoveScriptInstances(true); | 3142 | sog.RemoveScriptInstances(true); |
3130 | } | ||
3131 | } | 3143 | } |
3132 | } | 3144 | } |
3133 | } | 3145 | } |
@@ -3535,26 +3547,29 @@ namespace OpenSim.Region.Framework.Scenes | |||
3535 | /// <param name="args">The arguments for the event</param> | 3547 | /// <param name="args">The arguments for the event</param> |
3536 | public void SendScriptEventToAttachments(string eventName, Object[] args) | 3548 | public void SendScriptEventToAttachments(string eventName, Object[] args) |
3537 | { | 3549 | { |
3538 | if (m_scriptEngines.Length == 0) | 3550 | Util.FireAndForget(delegate(object x) |
3539 | return; | ||
3540 | |||
3541 | lock (m_attachments) | ||
3542 | { | 3551 | { |
3543 | foreach (SceneObjectGroup grp in m_attachments) | 3552 | if (m_scriptEngines.Length == 0) |
3553 | return; | ||
3554 | |||
3555 | lock (m_attachments) | ||
3544 | { | 3556 | { |
3545 | // 16384 is CHANGED_ANIMATION | 3557 | foreach (SceneObjectGroup grp in m_attachments) |
3546 | // | ||
3547 | // Send this to all attachment root prims | ||
3548 | // | ||
3549 | foreach (IScriptModule m in m_scriptEngines) | ||
3550 | { | 3558 | { |
3551 | if (m == null) // No script engine loaded | 3559 | // 16384 is CHANGED_ANIMATION |
3552 | continue; | 3560 | // |
3561 | // Send this to all attachment root prims | ||
3562 | // | ||
3563 | foreach (IScriptModule m in m_scriptEngines) | ||
3564 | { | ||
3565 | if (m == null) // No script engine loaded | ||
3566 | continue; | ||
3553 | 3567 | ||
3554 | m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION }); | 3568 | m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION }); |
3569 | } | ||
3555 | } | 3570 | } |
3556 | } | 3571 | } |
3557 | } | 3572 | }); |
3558 | } | 3573 | } |
3559 | 3574 | ||
3560 | internal void PushForce(Vector3 impulse) | 3575 | internal void PushForce(Vector3 impulse) |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 04ba738..228eca9 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs | |||
@@ -110,7 +110,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
110 | private const uint m_regionWidth = Constants.RegionSize; | 110 | private const uint m_regionWidth = Constants.RegionSize; |
111 | private const uint m_regionHeight = Constants.RegionSize; | 111 | private const uint m_regionHeight = Constants.RegionSize; |
112 | 112 | ||
113 | private float ODE_STEPSIZE = 0.020f; | 113 | private float ODE_STEPSIZE = 0.0178f; |
114 | private float metersInSpace = 29.9f; | 114 | private float metersInSpace = 29.9f; |
115 | private float m_timeDilation = 1.0f; | 115 | private float m_timeDilation = 1.0f; |
116 | 116 | ||
@@ -456,7 +456,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
456 | mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f); | 456 | mAvatarObjectContactFriction = physicsconfig.GetFloat("m_avatarobjectcontact_friction", 75f); |
457 | mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f); | 457 | mAvatarObjectContactBounce = physicsconfig.GetFloat("m_avatarobjectcontact_bounce", 0.1f); |
458 | 458 | ||
459 | ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", 0.020f); | 459 | ODE_STEPSIZE = physicsconfig.GetFloat("world_stepsize", ODE_STEPSIZE); |
460 | m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); | 460 | m_physicsiterations = physicsconfig.GetInt("world_internal_steps_without_collisions", 10); |
461 | 461 | ||
462 | avDensity = physicsconfig.GetFloat("av_density", 80f); | 462 | avDensity = physicsconfig.GetFloat("av_density", 80f); |
@@ -2822,6 +2822,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2822 | m_global_contactcount = 0; | 2822 | m_global_contactcount = 0; |
2823 | 2823 | ||
2824 | d.WorldQuickStep(world, ODE_STEPSIZE); | 2824 | d.WorldQuickStep(world, ODE_STEPSIZE); |
2825 | |||
2825 | d.JointGroupEmpty(contactgroup); | 2826 | d.JointGroupEmpty(contactgroup); |
2826 | } | 2827 | } |
2827 | catch (Exception e) | 2828 | catch (Exception e) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index cb0d765..77a784d 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 | |||
486 | m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false; | 486 | m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.valid = false; |
487 | if (m_host.ParentGroup.Scene.SimulationDataService != null) | 487 | if (m_host.ParentGroup.Scene.SimulationDataService != null) |
488 | m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID); | 488 | m_host.ParentGroup.Scene.SimulationDataService.RemoveRegionWindlightSettings(m_host.ParentGroup.Scene.RegionInfo.RegionID); |
489 | m_host.ParentGroup.Scene.EventManager.TriggerOnSaveNewWindlightProfile(); | ||
489 | } | 490 | } |
490 | /// <summary> | 491 | /// <summary> |
491 | /// Set the current Windlight scene to a target avatar | 492 | /// Set the current Windlight scene to a target avatar |
diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs index 07c6962..1bd3706 100644 --- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs | |||
@@ -91,6 +91,7 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
91 | 91 | ||
92 | server.AddXmlRPCHandler("status_notification", StatusNotification, false); | 92 | server.AddXmlRPCHandler("status_notification", StatusNotification, false); |
93 | server.AddXmlRPCHandler("get_online_friends", GetOnlineFriends, false); | 93 | server.AddXmlRPCHandler("get_online_friends", GetOnlineFriends, false); |
94 | server.AddXmlRPCHandler("get_user_info", GetUserInfo, false); | ||
94 | server.AddXmlRPCHandler("get_server_urls", GetServerURLs, false); | 95 | server.AddXmlRPCHandler("get_server_urls", GetServerURLs, false); |
95 | 96 | ||
96 | server.AddXmlRPCHandler("locate_user", LocateUser, false); | 97 | server.AddXmlRPCHandler("locate_user", LocateUser, false); |
@@ -299,6 +300,38 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
299 | 300 | ||
300 | } | 301 | } |
301 | 302 | ||
303 | public XmlRpcResponse GetUserInfo(XmlRpcRequest request, IPEndPoint remoteClient) | ||
304 | { | ||
305 | Hashtable hash = new Hashtable(); | ||
306 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
307 | |||
308 | // This needs checking! | ||
309 | if (requestData.ContainsKey("userID")) | ||
310 | { | ||
311 | string userID_str = (string)requestData["userID"]; | ||
312 | UUID userID = UUID.Zero; | ||
313 | UUID.TryParse(userID_str, out userID); | ||
314 | |||
315 | //int userFlags = m_HomeUsersService.GetUserFlags(userID); | ||
316 | Dictionary<string,object> userInfo = m_HomeUsersService.GetUserInfo(userID); | ||
317 | if (userInfo.Count > 0) | ||
318 | { | ||
319 | foreach (KeyValuePair<string, object> kvp in userInfo) | ||
320 | { | ||
321 | hash[kvp.Key] = kvp.Value; | ||
322 | } | ||
323 | } | ||
324 | else | ||
325 | { | ||
326 | hash["result"] = "failure"; | ||
327 | } | ||
328 | } | ||
329 | |||
330 | XmlRpcResponse response = new XmlRpcResponse(); | ||
331 | response.Value = hash; | ||
332 | return response; | ||
333 | } | ||
334 | |||
302 | public XmlRpcResponse GetServerURLs(XmlRpcRequest request, IPEndPoint remoteClient) | 335 | public XmlRpcResponse GetServerURLs(XmlRpcRequest request, IPEndPoint remoteClient) |
303 | { | 336 | { |
304 | Hashtable hash = new Hashtable(); | 337 | Hashtable hash = new Hashtable(); |
diff --git a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs index ab383ef..3fd69ae 100644 --- a/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs +++ b/OpenSim/Server/Handlers/UserAccounts/UserAccountServerPostHandler.cs | |||
@@ -231,7 +231,7 @@ namespace OpenSim.Server.Handlers.UserAccounts | |||
231 | 231 | ||
232 | int userLevel = 0; | 232 | int userLevel = 0; |
233 | if (request.ContainsKey("UserLevel") && int.TryParse(request["UserLevel"].ToString(), out userLevel)) | 233 | if (request.ContainsKey("UserLevel") && int.TryParse(request["UserLevel"].ToString(), out userLevel)) |
234 | existingAccount.UserFlags = userLevel; | 234 | existingAccount.UserLevel = userLevel; |
235 | 235 | ||
236 | int userFlags = 0; | 236 | int userFlags = 0; |
237 | if (request.ContainsKey("UserFlags") && int.TryParse(request["UserFlags"].ToString(), out userFlags)) | 237 | if (request.ContainsKey("UserFlags") && int.TryParse(request["UserFlags"].ToString(), out userFlags)) |
diff --git a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs index fdab254..d7b2ff8 100644 --- a/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/AssetServiceConnector.cs | |||
@@ -100,6 +100,8 @@ namespace OpenSim.Services.Connectors | |||
100 | 100 | ||
101 | public AssetBase Get(string id) | 101 | public AssetBase Get(string id) |
102 | { | 102 | { |
103 | // m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Synchronous get request for {0}", id); | ||
104 | |||
103 | string uri = m_ServerURI + "/assets/" + id; | 105 | string uri = m_ServerURI + "/assets/" + id; |
104 | 106 | ||
105 | AssetBase asset = null; | 107 | AssetBase asset = null; |
@@ -119,6 +121,8 @@ namespace OpenSim.Services.Connectors | |||
119 | 121 | ||
120 | public AssetBase GetCached(string id) | 122 | public AssetBase GetCached(string id) |
121 | { | 123 | { |
124 | // m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Cache request for {0}", id); | ||
125 | |||
122 | if (m_Cache != null) | 126 | if (m_Cache != null) |
123 | return m_Cache.Get(id); | 127 | return m_Cache.Get(id); |
124 | 128 | ||
@@ -177,6 +181,8 @@ namespace OpenSim.Services.Connectors | |||
177 | 181 | ||
178 | public bool Get(string id, Object sender, AssetRetrieved handler) | 182 | public bool Get(string id, Object sender, AssetRetrieved handler) |
179 | { | 183 | { |
184 | // m_log.DebugFormat("[ASSET SERVICE CONNECTOR]: Potentially asynchronous get request for {0}", id); | ||
185 | |||
180 | string uri = m_ServerURI + "/assets/" + id; | 186 | string uri = m_ServerURI + "/assets/" + id; |
181 | 187 | ||
182 | AssetBase asset = null; | 188 | AssetBase asset = null; |
diff --git a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs index 5c31639..bb5d51f 100644 --- a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs | |||
@@ -29,7 +29,9 @@ using log4net; | |||
29 | using Nini.Config; | 29 | using Nini.Config; |
30 | using System; | 30 | using System; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Collections.Specialized; | ||
32 | using System.Reflection; | 33 | using System.Reflection; |
34 | using System.Web; | ||
33 | using OpenSim.Framework; | 35 | using OpenSim.Framework; |
34 | using OpenSim.Services.Interfaces; | 36 | using OpenSim.Services.Interfaces; |
35 | using OpenSim.Services.Connectors.Hypergrid; | 37 | using OpenSim.Services.Connectors.Hypergrid; |
@@ -73,11 +75,26 @@ namespace OpenSim.Services.Connectors | |||
73 | if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) && | 75 | if (Uri.TryCreate(id, UriKind.Absolute, out assetUri) && |
74 | assetUri.Scheme == Uri.UriSchemeHttp) | 76 | assetUri.Scheme == Uri.UriSchemeHttp) |
75 | { | 77 | { |
76 | url = "http://" + assetUri.Authority; | 78 | // Simian |
77 | assetID = assetUri.LocalPath.Trim(new char[] {'/'}); | 79 | if (assetUri.Query != string.Empty) |
80 | { | ||
81 | NameValueCollection qscoll = HttpUtility.ParseQueryString(assetUri.Query); | ||
82 | assetID = qscoll["id"]; | ||
83 | if (assetID != null) | ||
84 | url = id.Replace(assetID, ""); // Malformed again, as simian expects | ||
85 | else | ||
86 | url = id; // !!! best effort | ||
87 | } | ||
88 | else // robust | ||
89 | { | ||
90 | url = "http://" + assetUri.Authority; | ||
91 | assetID = assetUri.LocalPath.Trim(new char[] { '/' }); | ||
92 | } | ||
93 | |||
78 | return true; | 94 | return true; |
79 | } | 95 | } |
80 | 96 | ||
97 | m_log.DebugFormat("[HG ASSET SERVICE]: Malformed URL {0}", id); | ||
81 | return false; | 98 | return false; |
82 | } | 99 | } |
83 | 100 | ||
diff --git a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs index 7cfd6e8..c030bca 100644 --- a/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/HeloServiceConnector.cs | |||
@@ -47,13 +47,36 @@ namespace OpenSim.Services.Connectors | |||
47 | 47 | ||
48 | public HeloServicesConnector(string serverURI) | 48 | public HeloServicesConnector(string serverURI) |
49 | { | 49 | { |
50 | m_ServerURI = serverURI.TrimEnd('/'); | 50 | if (!serverURI.EndsWith("=")) |
51 | m_ServerURI = serverURI.TrimEnd('/') + "/helo/"; | ||
52 | else | ||
53 | { | ||
54 | // Simian sends malformed urls like this: | ||
55 | // http://valley.virtualportland.org/simtest/Grid/?id= | ||
56 | // | ||
57 | try | ||
58 | { | ||
59 | Uri uri = new Uri(serverURI + "xxx"); | ||
60 | if (uri.Query == string.Empty) | ||
61 | m_ServerURI = serverURI.TrimEnd('/') + "/helo/"; | ||
62 | else | ||
63 | { | ||
64 | serverURI = serverURI + "xxx"; | ||
65 | m_ServerURI = serverURI.Replace(uri.Query, ""); | ||
66 | m_ServerURI = m_ServerURI.TrimEnd('/') + "/helo/"; | ||
67 | } | ||
68 | } | ||
69 | catch (UriFormatException e) | ||
70 | { | ||
71 | m_log.WarnFormat("[HELO SERVICE]: Malformed URL {0}", serverURI); | ||
72 | } | ||
73 | } | ||
51 | } | 74 | } |
52 | 75 | ||
53 | 76 | ||
54 | public virtual string Helo() | 77 | public virtual string Helo() |
55 | { | 78 | { |
56 | HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI + "/helo"); | 79 | HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(m_ServerURI); |
57 | // Eventually we need to switch to HEAD | 80 | // Eventually we need to switch to HEAD |
58 | /* req.Method = "HEAD"; */ | 81 | /* req.Method = "HEAD"; */ |
59 | 82 | ||
diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs index 0c55c2e..5b27cf6 100644 --- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs +++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs | |||
@@ -334,6 +334,9 @@ namespace OpenSim.Services.Connectors.Hypergrid | |||
334 | UInt32.TryParse((string)hash["http_port"], out p); | 334 | UInt32.TryParse((string)hash["http_port"], out p); |
335 | region.HttpPort = p; | 335 | region.HttpPort = p; |
336 | } | 336 | } |
337 | if (hash.ContainsKey("server_uri") && hash["server_uri"] != null) | ||
338 | region.ServerURI = (string)hash["server_uri"]; | ||
339 | |||
337 | if (hash["internal_port"] != null) | 340 | if (hash["internal_port"] != null) |
338 | { | 341 | { |
339 | int p = 0; | 342 | int p = 0; |
@@ -558,6 +561,60 @@ namespace OpenSim.Services.Connectors.Hypergrid | |||
558 | return online; | 561 | return online; |
559 | } | 562 | } |
560 | 563 | ||
564 | public Dictionary<string,object> GetUserInfo (UUID userID) | ||
565 | { | ||
566 | Hashtable hash = new Hashtable(); | ||
567 | hash["userID"] = userID.ToString(); | ||
568 | |||
569 | IList paramList = new ArrayList(); | ||
570 | paramList.Add(hash); | ||
571 | |||
572 | XmlRpcRequest request = new XmlRpcRequest("get_user_info", paramList); | ||
573 | |||
574 | Dictionary<string, object> info = new Dictionary<string, object>(); | ||
575 | XmlRpcResponse response = null; | ||
576 | try | ||
577 | { | ||
578 | response = request.Send(m_ServerURL, 10000); | ||
579 | } | ||
580 | catch | ||
581 | { | ||
582 | m_log.DebugFormat("[USER AGENT CONNECTOR]: Unable to contact remote server {0} for GetUserInfo", m_ServerURL); | ||
583 | return info; | ||
584 | } | ||
585 | |||
586 | if (response.IsFault) | ||
587 | { | ||
588 | m_log.ErrorFormat("[USER AGENT CONNECTOR]: remote call to {0} for GetServerURLs returned an error: {1}", m_ServerURL, response.FaultString); | ||
589 | return info; | ||
590 | } | ||
591 | |||
592 | hash = (Hashtable)response.Value; | ||
593 | try | ||
594 | { | ||
595 | if (hash == null) | ||
596 | { | ||
597 | m_log.ErrorFormat("[USER AGENT CONNECTOR]: GetUserInfo Got null response from {0}! THIS IS BAAAAD", m_ServerURL); | ||
598 | return info; | ||
599 | } | ||
600 | |||
601 | // Here is the actual response | ||
602 | foreach (object key in hash.Keys) | ||
603 | { | ||
604 | if (hash[key] != null) | ||
605 | { | ||
606 | info.Add(key.ToString(), hash[key]); | ||
607 | } | ||
608 | } | ||
609 | } | ||
610 | catch | ||
611 | { | ||
612 | m_log.ErrorFormat("[USER AGENT CONNECTOR]: Got exception on GetOnlineFriends response."); | ||
613 | } | ||
614 | |||
615 | return info; | ||
616 | } | ||
617 | |||
561 | public Dictionary<string, object> GetServerURLs(UUID userID) | 618 | public Dictionary<string, object> GetServerURLs(UUID userID) |
562 | { | 619 | { |
563 | Hashtable hash = new Hashtable(); | 620 | Hashtable hash = new Hashtable(); |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs index 9573e21..99523a1 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs | |||
@@ -86,6 +86,8 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
86 | 86 | ||
87 | public SimianAssetServiceConnector(string url) | 87 | public SimianAssetServiceConnector(string url) |
88 | { | 88 | { |
89 | if (!url.EndsWith("/") && !url.EndsWith("=")) | ||
90 | url = url + '/'; | ||
89 | m_serverUrl = url; | 91 | m_serverUrl = url; |
90 | } | 92 | } |
91 | 93 | ||
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs index 918544f..67a65ff 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs | |||
@@ -341,26 +341,54 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
341 | 341 | ||
342 | public List<GridRegion> GetHyperlinks(UUID scopeID) | 342 | public List<GridRegion> GetHyperlinks(UUID scopeID) |
343 | { | 343 | { |
344 | // Hypergrid/linked regions are not supported | 344 | List<GridRegion> foundRegions = new List<GridRegion>(); |
345 | return new List<GridRegion>(); | 345 | |
346 | NameValueCollection requestArgs = new NameValueCollection | ||
347 | { | ||
348 | { "RequestMethod", "GetScenes" }, | ||
349 | { "HyperGrid", "true" }, | ||
350 | { "Enabled", "1" } | ||
351 | }; | ||
352 | |||
353 | OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); | ||
354 | if (response["Success"].AsBoolean()) | ||
355 | { | ||
356 | // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] found regions with name {0}",name); | ||
357 | |||
358 | OSDArray array = response["Scenes"] as OSDArray; | ||
359 | if (array != null) | ||
360 | { | ||
361 | for (int i = 0; i < array.Count; i++) | ||
362 | { | ||
363 | GridRegion region = ResponseToGridRegion(array[i] as OSDMap); | ||
364 | if (region != null) | ||
365 | foundRegions.Add(region); | ||
366 | } | ||
367 | } | ||
368 | } | ||
369 | |||
370 | return foundRegions; | ||
346 | } | 371 | } |
347 | 372 | ||
348 | public int GetRegionFlags(UUID scopeID, UUID regionID) | 373 | public int GetRegionFlags(UUID scopeID, UUID regionID) |
349 | { | 374 | { |
350 | const int REGION_ONLINE = 4; | ||
351 | |||
352 | NameValueCollection requestArgs = new NameValueCollection | 375 | NameValueCollection requestArgs = new NameValueCollection |
353 | { | 376 | { |
354 | { "RequestMethod", "GetScene" }, | 377 | { "RequestMethod", "GetScene" }, |
355 | { "SceneID", regionID.ToString() } | 378 | { "SceneID", regionID.ToString() } |
356 | }; | 379 | }; |
357 | 380 | ||
358 | // m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString()); | 381 | m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request region flags for {0}",regionID.ToString()); |
359 | 382 | ||
360 | OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); | 383 | OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs); |
361 | if (response["Success"].AsBoolean()) | 384 | if (response["Success"].AsBoolean()) |
362 | { | 385 | { |
363 | return response["Enabled"].AsBoolean() ? REGION_ONLINE : 0; | 386 | OSDMap extraData = response["ExtraData"] as OSDMap; |
387 | int enabled = response["Enabled"].AsBoolean() ? (int) OpenSim.Data.RegionFlags.RegionOnline : 0; | ||
388 | int hypergrid = extraData["HyperGrid"].AsBoolean() ? (int) OpenSim.Data.RegionFlags.Hyperlink : 0; | ||
389 | int flags = enabled | hypergrid; | ||
390 | m_log.DebugFormat("[SGGC] enabled - {0} hg - {1} flags - {2}", enabled, hypergrid, flags); | ||
391 | return flags; | ||
364 | } | 392 | } |
365 | else | 393 | else |
366 | { | 394 | { |
@@ -411,24 +439,27 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
411 | Vector3d minPosition = response["MinPosition"].AsVector3d(); | 439 | Vector3d minPosition = response["MinPosition"].AsVector3d(); |
412 | region.RegionLocX = (int)minPosition.X; | 440 | region.RegionLocX = (int)minPosition.X; |
413 | region.RegionLocY = (int)minPosition.Y; | 441 | region.RegionLocY = (int)minPosition.Y; |
414 | 442 | ||
415 | Uri httpAddress = response["Address"].AsUri(); | 443 | if ( ! extraData["HyperGrid"] ) { |
416 | region.ExternalHostName = httpAddress.Host; | 444 | Uri httpAddress = response["Address"].AsUri(); |
417 | region.HttpPort = (uint)httpAddress.Port; | 445 | region.ExternalHostName = httpAddress.Host; |
418 | 446 | region.HttpPort = (uint)httpAddress.Port; | |
419 | region.ServerURI = extraData["ServerURI"].AsString(); | 447 | |
420 | 448 | IPAddress internalAddress; | |
421 | IPAddress internalAddress; | 449 | IPAddress.TryParse(extraData["InternalAddress"].AsString(), out internalAddress); |
422 | IPAddress.TryParse(extraData["InternalAddress"].AsString(), out internalAddress); | 450 | if (internalAddress == null) |
423 | if (internalAddress == null) | 451 | internalAddress = IPAddress.Any; |
424 | internalAddress = IPAddress.Any; | 452 | |
425 | 453 | region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger()); | |
426 | region.InternalEndPoint = new IPEndPoint(internalAddress, extraData["InternalPort"].AsInteger()); | 454 | region.TerrainImage = extraData["MapTexture"].AsUUID(); |
427 | region.TerrainImage = extraData["MapTexture"].AsUUID(); | 455 | region.Access = (byte)extraData["Access"].AsInteger(); |
428 | region.Access = (byte)extraData["Access"].AsInteger(); | 456 | region.RegionSecret = extraData["RegionSecret"].AsString(); |
429 | region.RegionSecret = extraData["RegionSecret"].AsString(); | 457 | region.EstateOwner = extraData["EstateOwner"].AsUUID(); |
430 | region.EstateOwner = extraData["EstateOwner"].AsUUID(); | 458 | region.Token = extraData["Token"].AsString(); |
431 | region.Token = extraData["Token"].AsString(); | 459 | region.ServerURI = extraData["ServerURI"].AsString(); |
460 | } else { | ||
461 | region.ServerURI = response["Address"]; | ||
462 | } | ||
432 | 463 | ||
433 | return region; | 464 | return region; |
434 | } | 465 | } |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs index 39df1f5..f828abb 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianInventoryServiceConnector.cs | |||
@@ -92,7 +92,10 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
92 | 92 | ||
93 | public SimianInventoryServiceConnector(string url) | 93 | public SimianInventoryServiceConnector(string url) |
94 | { | 94 | { |
95 | if (!url.EndsWith("/") && !url.EndsWith("=")) | ||
96 | url = url + '/'; | ||
95 | m_serverUrl = url; | 97 | m_serverUrl = url; |
98 | |||
96 | } | 99 | } |
97 | 100 | ||
98 | public void Initialise(IConfigSource source) | 101 | public void Initialise(IConfigSource source) |
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs index 91e2976..4350749 100644 --- a/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs +++ b/OpenSim/Services/Connectors/SimianGrid/SimianUserAccountServiceConnector.cs | |||
@@ -287,6 +287,10 @@ namespace OpenSim.Services.Connectors.SimianGrid | |||
287 | account.UserFlags = response["UserFlags"].AsInteger(); | 287 | account.UserFlags = response["UserFlags"].AsInteger(); |
288 | account.UserLevel = response["AccessLevel"].AsInteger(); | 288 | account.UserLevel = response["AccessLevel"].AsInteger(); |
289 | account.UserTitle = response["UserTitle"].AsString(); | 289 | account.UserTitle = response["UserTitle"].AsString(); |
290 | account.LocalToGrid = true; | ||
291 | if (response.ContainsKey("LocalToGrid")) | ||
292 | account.LocalToGrid = (response["LocalToGrid"].AsString() == "true" ? true : false); | ||
293 | |||
290 | GetFirstLastName(response["Name"].AsString(), out account.FirstName, out account.LastName); | 294 | GetFirstLastName(response["Name"].AsString(), out account.FirstName, out account.LastName); |
291 | 295 | ||
292 | // Cache the user account info | 296 | // Cache the user account info |
diff --git a/OpenSim/Services/GridService/HypergridLinker.cs b/OpenSim/Services/GridService/HypergridLinker.cs index 90c022f..78eab3d 100644 --- a/OpenSim/Services/GridService/HypergridLinker.cs +++ b/OpenSim/Services/GridService/HypergridLinker.cs | |||
@@ -102,50 +102,45 @@ namespace OpenSim.Services.GridService | |||
102 | 102 | ||
103 | public HypergridLinker(IConfigSource config, GridService gridService, IRegionData db) | 103 | public HypergridLinker(IConfigSource config, GridService gridService, IRegionData db) |
104 | { | 104 | { |
105 | IConfig modulesConfig = config.Configs["Modules"]; | 105 | IConfig gridConfig = config.Configs["GridService"]; |
106 | if (modulesConfig == null) | 106 | if (gridConfig == null) |
107 | return; | 107 | return; |
108 | |||
109 | if (modulesConfig.GetString("HypergridLinker", "") != "HypergridLinker") | ||
110 | return; | ||
111 | 108 | ||
112 | m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType()); | 109 | if (!gridConfig.GetBoolean("HypergridLinker", false)) |
110 | return; | ||
113 | 111 | ||
114 | m_Database = db; | 112 | m_Database = db; |
115 | m_GridService = gridService; | 113 | m_GridService = gridService; |
114 | m_log.DebugFormat("[HYPERGRID LINKER]: Starting with db {0}", db.GetType()); | ||
116 | 115 | ||
117 | IConfig gridConfig = config.Configs["GridService"]; | 116 | string assetService = gridConfig.GetString("AssetService", string.Empty); |
118 | if (gridConfig != null) | ||
119 | { | ||
120 | string assetService = gridConfig.GetString("AssetService", string.Empty); | ||
121 | 117 | ||
122 | Object[] args = new Object[] { config }; | 118 | Object[] args = new Object[] { config }; |
123 | 119 | ||
124 | if (assetService != string.Empty) | 120 | if (assetService != string.Empty) |
125 | m_AssetService = ServerUtils.LoadPlugin<IAssetService>(assetService, args); | 121 | m_AssetService = ServerUtils.LoadPlugin<IAssetService>(assetService, args); |
126 | 122 | ||
127 | string scope = gridConfig.GetString("ScopeID", string.Empty); | 123 | string scope = gridConfig.GetString("ScopeID", string.Empty); |
128 | if (scope != string.Empty) | 124 | if (scope != string.Empty) |
129 | UUID.TryParse(scope, out m_ScopeID); | 125 | UUID.TryParse(scope, out m_ScopeID); |
130 | 126 | ||
131 | // m_Check4096 = gridConfig.GetBoolean("Check4096", true); | 127 | // m_Check4096 = gridConfig.GetBoolean("Check4096", true); |
132 | 128 | ||
133 | m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles"); | 129 | m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles"); |
134 | 130 | ||
135 | m_ThisGatekeeper = gridConfig.GetString("Gatekeeper", string.Empty); | 131 | m_ThisGatekeeper = gridConfig.GetString("Gatekeeper", string.Empty); |
136 | try | 132 | try |
137 | { | 133 | { |
138 | m_ThisGatekeeperURI = new Uri(m_ThisGatekeeper); | 134 | m_ThisGatekeeperURI = new Uri(m_ThisGatekeeper); |
139 | } | 135 | } |
140 | catch | 136 | catch |
141 | { | 137 | { |
142 | m_log.WarnFormat("[HYPERGRID LINKER]: Malformed URL in [GridService], variable Gatekeeper = {0}", m_ThisGatekeeper); | 138 | m_log.WarnFormat("[HYPERGRID LINKER]: Malformed URL in [GridService], variable Gatekeeper = {0}", m_ThisGatekeeper); |
143 | } | 139 | } |
144 | 140 | ||
145 | m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); | 141 | m_GatekeeperConnector = new GatekeeperServiceConnector(m_AssetService); |
146 | 142 | ||
147 | m_log.Debug("[HYPERGRID LINKER]: Loaded all services..."); | 143 | m_log.Debug("[HYPERGRID LINKER]: Loaded all services..."); |
148 | } | ||
149 | 144 | ||
150 | if (!string.IsNullOrEmpty(m_MapTileDirectory)) | 145 | if (!string.IsNullOrEmpty(m_MapTileDirectory)) |
151 | { | 146 | { |
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs index cdc560c..f681df4 100644 --- a/OpenSim/Services/HypergridService/UserAgentService.cs +++ b/OpenSim/Services/HypergridService/UserAgentService.cs | |||
@@ -161,6 +161,14 @@ namespace OpenSim.Services.HypergridService | |||
161 | { | 161 | { |
162 | m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}", | 162 | m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}", |
163 | agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "stored IP" : clientIP.Address.ToString()), gatekeeper.ServerURI); | 163 | agentCircuit.firstname, agentCircuit.lastname, ((clientIP == null) ? "stored IP" : clientIP.Address.ToString()), gatekeeper.ServerURI); |
164 | |||
165 | if (m_UserAccountService.GetUserAccount(UUID.Zero, agentCircuit.AgentID) == null) | ||
166 | { | ||
167 | m_log.WarnFormat("[USER AGENT SERVICE]: Someone attempted to lauch a foreign user from here {0} {1}", agentCircuit.firstname, agentCircuit.lastname); | ||
168 | reason = "Forbidden to launch your agents from here"; | ||
169 | return false; | ||
170 | } | ||
171 | |||
164 | // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination | 172 | // Take the IP address + port of the gatekeeper (reg) plus the info of finalDestination |
165 | GridRegion region = new GridRegion(gatekeeper); | 173 | GridRegion region = new GridRegion(gatekeeper); |
166 | region.ServerURI = gatekeeper.ServerURI; | 174 | region.ServerURI = gatekeeper.ServerURI; |
@@ -480,6 +488,31 @@ namespace OpenSim.Services.HypergridService | |||
480 | return online; | 488 | return online; |
481 | } | 489 | } |
482 | 490 | ||
491 | public Dictionary<string, object> GetUserInfo(UUID userID) | ||
492 | { | ||
493 | Dictionary<string, object> info = new Dictionary<string, object>(); | ||
494 | |||
495 | if (m_UserAccountService == null) | ||
496 | { | ||
497 | m_log.WarnFormat("[USER AGENT SERVICE]: Unable to get user flags because user account service is missing"); | ||
498 | info["result"] = "fail"; | ||
499 | info["message"] = "UserAccountService is missing!"; | ||
500 | return info; | ||
501 | } | ||
502 | |||
503 | UserAccount account = m_UserAccountService.GetUserAccount(UUID.Zero /*!!!*/, userID); | ||
504 | |||
505 | if (account != null) | ||
506 | { | ||
507 | info.Add("user_flags", (object)account.UserFlags); | ||
508 | info.Add("user_created", (object)account.Created); | ||
509 | info.Add("user_title", (object)account.UserTitle); | ||
510 | info.Add("result", "success"); | ||
511 | } | ||
512 | |||
513 | return info; | ||
514 | } | ||
515 | |||
483 | public Dictionary<string, object> GetServerURLs(UUID userID) | 516 | public Dictionary<string, object> GetServerURLs(UUID userID) |
484 | { | 517 | { |
485 | if (m_UserAccountService == null) | 518 | if (m_UserAccountService == null) |
diff --git a/OpenSim/Services/Interfaces/IHypergridServices.cs b/OpenSim/Services/Interfaces/IHypergridServices.cs index e86ec51..5b293ac 100644 --- a/OpenSim/Services/Interfaces/IHypergridServices.cs +++ b/OpenSim/Services/Interfaces/IHypergridServices.cs | |||
@@ -55,6 +55,7 @@ namespace OpenSim.Services.Interfaces | |||
55 | void LogoutAgent(UUID userID, UUID sessionID); | 55 | void LogoutAgent(UUID userID, UUID sessionID); |
56 | GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt); | 56 | GridRegion GetHomeRegion(UUID userID, out Vector3 position, out Vector3 lookAt); |
57 | Dictionary<string, object> GetServerURLs(UUID userID); | 57 | Dictionary<string, object> GetServerURLs(UUID userID); |
58 | Dictionary<string,object> GetUserInfo(UUID userID); | ||
58 | 59 | ||
59 | string LocateUser(UUID userID); | 60 | string LocateUser(UUID userID); |
60 | // Tries to get the universal user identifier for the targetUserId | 61 | // Tries to get the universal user identifier for the targetUserId |
diff --git a/OpenSim/Services/Interfaces/IUserAccountService.cs b/OpenSim/Services/Interfaces/IUserAccountService.cs index 6cc8eb8..1b85980 100644 --- a/OpenSim/Services/Interfaces/IUserAccountService.cs +++ b/OpenSim/Services/Interfaces/IUserAccountService.cs | |||
@@ -91,6 +91,7 @@ namespace OpenSim.Services.Interfaces | |||
91 | public int UserLevel; | 91 | public int UserLevel; |
92 | public int UserFlags; | 92 | public int UserFlags; |
93 | public string UserTitle; | 93 | public string UserTitle; |
94 | public Boolean LocalToGrid = true; | ||
94 | 95 | ||
95 | public Dictionary<string, object> ServiceURLs; | 96 | public Dictionary<string, object> ServiceURLs; |
96 | 97 | ||
@@ -119,6 +120,8 @@ namespace OpenSim.Services.Interfaces | |||
119 | UserFlags = Convert.ToInt32(kvp["UserFlags"].ToString()); | 120 | UserFlags = Convert.ToInt32(kvp["UserFlags"].ToString()); |
120 | if (kvp.ContainsKey("UserTitle")) | 121 | if (kvp.ContainsKey("UserTitle")) |
121 | UserTitle = kvp["UserTitle"].ToString(); | 122 | UserTitle = kvp["UserTitle"].ToString(); |
123 | if (kvp.ContainsKey("LocalToGrid")) | ||
124 | Boolean.TryParse(kvp["LocalToGrid"].ToString(), out LocalToGrid); | ||
122 | 125 | ||
123 | if (kvp.ContainsKey("Created")) | 126 | if (kvp.ContainsKey("Created")) |
124 | Created = Convert.ToInt32(kvp["Created"].ToString()); | 127 | Created = Convert.ToInt32(kvp["Created"].ToString()); |
@@ -152,6 +155,7 @@ namespace OpenSim.Services.Interfaces | |||
152 | result["UserLevel"] = UserLevel.ToString(); | 155 | result["UserLevel"] = UserLevel.ToString(); |
153 | result["UserFlags"] = UserFlags.ToString(); | 156 | result["UserFlags"] = UserFlags.ToString(); |
154 | result["UserTitle"] = UserTitle; | 157 | result["UserTitle"] = UserTitle; |
158 | result["LocalToGrid"] = LocalToGrid.ToString(); | ||
155 | 159 | ||
156 | string str = string.Empty; | 160 | string str = string.Empty; |
157 | foreach (KeyValuePair<string, object> kvp in ServiceURLs) | 161 | foreach (KeyValuePair<string, object> kvp in ServiceURLs) |
diff --git a/OpenSim/Tools/pCampBot/pCampBot.cs b/OpenSim/Tools/pCampBot/pCampBot.cs index 6249fae..a73fcbe 100644 --- a/OpenSim/Tools/pCampBot/pCampBot.cs +++ b/OpenSim/Tools/pCampBot/pCampBot.cs | |||
@@ -112,10 +112,10 @@ namespace pCampBot | |||
112 | " -lastname lastname for the bots. Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n" + | 112 | " -lastname lastname for the bots. Each lastname will have _<bot-number> appended, e.g. Ima Bot_0\n" + |
113 | " -password password for the bots\n" + | 113 | " -password password for the bots\n" + |
114 | " -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p\n" + | 114 | " -b, behaviours behaviours for bots. Comma separated, e.g. p,g. Default is p\n" + |
115 | " current options are:" + | 115 | " current options are:\n" + |
116 | " p (physics)" + | 116 | " p (physics)\n" + |
117 | " g (grab)" + | 117 | " g (grab)\n" + |
118 | " t (teleport)" + | 118 | " t (teleport)\n" + |
119 | // " c (cross)" + | 119 | // " c (cross)" + |
120 | " -wear set appearance folder to load from (default: no)\n" + | 120 | " -wear set appearance folder to load from (default: no)\n" + |
121 | " -h, -help show this message"); | 121 | " -h, -help show this message"); |
diff --git a/Prebuild/COPYING b/Prebuild/COPYING index c57c080..d3cdf7e 100644 --- a/Prebuild/COPYING +++ b/Prebuild/COPYING | |||
@@ -1,65 +1,65 @@ | |||
1 | BSD License | 1 | BSD License |
2 | Copyright (c)2004-2008 | 2 | Copyright (c)2004-2008 |
3 | 3 | ||
4 | See AUTHORS file for list of copyright holders | 4 | See AUTHORS file for list of copyright holders |
5 | 5 | ||
6 | Dave Hudson (jendave@yahoo.com), | 6 | Dave Hudson (jendave@yahoo.com), |
7 | Matthew Holmes (matthew@wildfiregames.com) | 7 | Matthew Holmes (matthew@wildfiregames.com) |
8 | Dan Moorehead (dan05a@gmail.com) | 8 | Dan Moorehead (dan05a@gmail.com) |
9 | Rob Loach (http://www.robloach.net) | 9 | Rob Loach (http://www.robloach.net) |
10 | C.J. Adams-Collier (cjac@colliertech.org) | 10 | C.J. Adams-Collier (cjac@colliertech.org) |
11 | 11 | ||
12 | http://dnpb.sourceforge.net | 12 | http://dnpb.sourceforge.net |
13 | All rights reserved. | 13 | All rights reserved. |
14 | 14 | ||
15 | Redistribution and use in source and binary forms, with or without | 15 | Redistribution and use in source and binary forms, with or without |
16 | modification, are permitted provided that the following conditions | 16 | modification, are permitted provided that the following conditions |
17 | are met: | 17 | are met: |
18 | 18 | ||
19 | 1. Redistributions of source code must retain the above copyright notice, | 19 | 1. Redistributions of source code must retain the above copyright notice, |
20 | this list of conditions and the following disclaimer. | 20 | this list of conditions and the following disclaimer. |
21 | 21 | ||
22 | 2. Redistributions in binary form must reproduce the above copyright notice, | 22 | 2. Redistributions in binary form must reproduce the above copyright notice, |
23 | this list of conditions and the following disclaimer in the documentation | 23 | this list of conditions and the following disclaimer in the documentation |
24 | and/or other materials provided with the distribution. | 24 | and/or other materials provided with the distribution. |
25 | 25 | ||
26 | 3. The names of the authors may not be used to endorse or promote | 26 | 3. The names of the authors may not be used to endorse or promote |
27 | products derived from this software without specific prior written | 27 | products derived from this software without specific prior written |
28 | permission. | 28 | permission. |
29 | 29 | ||
30 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | 30 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
31 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | 31 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
32 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS | 32 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
33 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE | 33 | FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
34 | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, | 34 | COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
35 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, | 35 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
36 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 36 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
37 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 37 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
38 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 38 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
39 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN | 39 | LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
40 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 40 | ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
41 | POSSIBILITY OF SUCH DAMAGE. | 41 | POSSIBILITY OF SUCH DAMAGE. |
42 | 42 | ||
43 | --- | 43 | --- |
44 | 44 | ||
45 | Portions of src/Core/Targets/AutotoolsTarget.cs | 45 | Portions of src/Core/Targets/AutotoolsTarget.cs |
46 | // Copyright (C) 2006 Novell, Inc (http://www.novell.com) | 46 | // Copyright (C) 2006 Novell, Inc (http://www.novell.com) |
47 | // | 47 | // |
48 | // Permission is hereby granted, free of charge, to any person obtaining | 48 | // Permission is hereby granted, free of charge, to any person obtaining |
49 | // a copy of this software and associated documentation files (the | 49 | // a copy of this software and associated documentation files (the |
50 | // "Software"), to deal in the Software without restriction, including | 50 | // "Software"), to deal in the Software without restriction, including |
51 | // without limitation the rights to use, copy, modify, merge, publish, | 51 | // without limitation the rights to use, copy, modify, merge, publish, |
52 | // distribute, sublicense, and/or sell copies of the Software, and to | 52 | // distribute, sublicense, and/or sell copies of the Software, and to |
53 | // permit persons to whom the Software is furnished to do so, subject to | 53 | // permit persons to whom the Software is furnished to do so, subject to |
54 | // the following conditions: | 54 | // the following conditions: |
55 | // | 55 | // |
56 | // The above copyright notice and this permission notice shall be | 56 | // The above copyright notice and this permission notice shall be |
57 | // included in all copies or substantial portions of the Software. | 57 | // included in all copies or substantial portions of the Software. |
58 | // | 58 | // |
59 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 59 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
60 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 60 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
61 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 61 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
62 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | 62 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
63 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | 63 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
64 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | 64 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
65 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 65 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
diff --git a/Prebuild/NEWS b/Prebuild/NEWS index 3ab3108..bea28da 100644 --- a/Prebuild/NEWS +++ b/Prebuild/NEWS | |||
@@ -1,200 +1,200 @@ | |||
1 | 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. | 1 | 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. |
2 | 2 | ||
3 | Documentation and downloads are available at http://dnpb.sourceforge.net. | 3 | Documentation and downloads are available at http://dnpb.sourceforge.net. |
4 | 4 | ||
5 | Prebuild is licensed under the BSD license. | 5 | Prebuild is licensed under the BSD license. |
6 | 6 | ||
7 | [ XXXXXXX XX, XXX - 1.3.2 ] | 7 | [ XXXXXXX XX, XXX - 1.3.2 ] |
8 | + Added Keyfile signing to NAnt target and VS2005 target | 8 | + Added Keyfile signing to NAnt target and VS2005 target |
9 | + Updated XSD file to 1.7 | 9 | + Updated XSD file to 1.7 |
10 | + Boo and VisualBasic Language support in VS2005 target | 10 | + Boo and VisualBasic Language support in VS2005 target |
11 | + Added basic Autotools target. It creates a non-recursive Autotools system. | 11 | + Added basic Autotools target. It creates a non-recursive Autotools system. |
12 | ! Multiple files can be excluded from the Match node | 12 | ! Multiple files can be excluded from the Match node |
13 | ! VS2005 now handles .resx files correctly. | 13 | ! VS2005 now handles .resx files correctly. |
14 | ! NAnt and Autotools now handle defines | 14 | ! NAnt and Autotools now handle defines |
15 | ! NAnt and Autotools now handle resources | 15 | ! NAnt and Autotools now handle resources |
16 | + Conditional XML variables can be passed through the command line. | 16 | + Conditional XML variables can be passed through the command line. |
17 | + Added /install and /remove command line flags to install and remove assemblies from the GAC | 17 | + Added /install and /remove command line flags to install and remove assemblies from the GAC |
18 | + Many fixes to VS2005 target | 18 | + Many fixes to VS2005 target |
19 | 19 | ||
20 | [ July 21, 2006 - 1.3.1 ] | 20 | [ July 21, 2006 - 1.3.1 ] |
21 | ! VS2005 fixes from Rob Loach | 21 | ! VS2005 fixes from Rob Loach |
22 | ! NAnt fixes from Rob Loach and David Hudson | 22 | ! NAnt fixes from Rob Loach and David Hudson |
23 | ! XML doc fixes from Rob Loach | 23 | ! XML doc fixes from Rob Loach |
24 | + Added SharpDevelop2 target (really just uses VS2005 target) | 24 | + Added SharpDevelop2 target (really just uses VS2005 target) |
25 | ! Fixed bug with BuildEvents in Monodevelop target | 25 | ! Fixed bug with BuildEvents in Monodevelop target |
26 | + Passing /yes will default to answering yes to any warnings | 26 | + Passing /yes will default to answering yes to any warnings |
27 | 27 | ||
28 | [ February 28, 2006 - 1.3 ] | 28 | [ February 28, 2006 - 1.3 ] |
29 | + Added MonoDevelop target. | 29 | + Added MonoDevelop target. |
30 | + Added NAnt target. | 30 | + Added NAnt target. |
31 | + Lots of fixes to all targets. | 31 | + Lots of fixes to all targets. |
32 | * Cleaned up the code using FXCop. | 32 | * Cleaned up the code using FXCop. |
33 | * Updated schema to 1.6 to fix a typo and add a new parameter. | 33 | * Updated schema to 1.6 to fix a typo and add a new parameter. |
34 | * jendave is now the maintainer of the project. RobLoach has been added as a developer. | 34 | * jendave is now the maintainer of the project. RobLoach has been added as a developer. |
35 | * Removed references to 'dnpb'. | 35 | * Removed references to 'dnpb'. |
36 | + Added rudimentary support for pre- and post- build scripts | 36 | + Added rudimentary support for pre- and post- build scripts |
37 | * Updated examples. | 37 | * Updated examples. |
38 | 38 | ||
39 | [ August 5, 2004 - 1.2 ] | 39 | [ August 5, 2004 - 1.2 ] |
40 | + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages | 40 | + Added Visual Studio Express (vs2005express) target contributed by Borrillis and modified for use with different languages |
41 | + 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 | 41 | + 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 |
42 | + 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 | 42 | + 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 |
43 | * Modified the removedir command line option to allow for a pipe-delimited list of directory names | 43 | * Modified the removedir command line option to allow for a pipe-delimited list of directory names |
44 | ! 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 | 44 | ! 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 |
45 | + Added the GenerateXmlDocFile boolean option to the Options XML element | 45 | + Added the GenerateXmlDocFile boolean option to the Options XML element |
46 | * 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 | 46 | * 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 |
47 | 47 | ||
48 | [ January 3, 2004 - 1.1 ] | 48 | [ January 3, 2004 - 1.1 ] |
49 | ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems | 49 | ! Replaced regex use for more efficient manual parsing to allow use on non-windows platforms with Mono which has Regex problems |
50 | + 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 | 50 | + 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 |
51 | * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version | 51 | * Make the version attribute on the root element optional as it isn't used and not needed since the schema url contains the version |
52 | 52 | ||
53 | [ December 30, 2004 - 1.1 ] | 53 | [ December 30, 2004 - 1.1 ] |
54 | ! Applied Leed's fix for SharpDevelop references | 54 | ! Applied Leed's fix for SharpDevelop references |
55 | + Rewrote much of the processing for better validation and without the use of a temp file | 55 | + Rewrote much of the processing for better validation and without the use of a temp file |
56 | + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs | 56 | + Added support for configurations at the project level which are named All. They now apply changes to all Solution level defined configs |
57 | * Changed all spaces into tabs | 57 | * Changed all spaces into tabs |
58 | + Added support for the None build action | 58 | + Added support for the None build action |
59 | * 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 | 59 | * 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 |
60 | 60 | ||
61 | [ December 25, 2004 - 1.0 ] | 61 | [ December 25, 2004 - 1.0 ] |
62 | + Added the /removedir option for cleaning directories like obj before file releases | 62 | + Added the /removedir option for cleaning directories like obj before file releases |
63 | + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds | 63 | + Changed WriteTempXml() and the new DeleteTempXml() methods to be compiled only in DEBUG builds |
64 | * Made path optional for Match elements (defaults to current directory) and updates schema for it | 64 | * Made path optional for Match elements (defaults to current directory) and updates schema for it |
65 | ! Fixed XML example in the readme.txt | 65 | ! Fixed XML example in the readme.txt |
66 | + Added example xml files to docs directory | 66 | + Added example xml files to docs directory |
67 | * Updated license.txt to add Dan Moorehead and update copyright years | 67 | * Updated license.txt to add Dan Moorehead and update copyright years |
68 | + Updated prebuild.xml to take advantage of the default path attribute for match elements | 68 | + Updated prebuild.xml to take advantage of the default path attribute for match elements |
69 | + Updated Clean to delete the obj directories | 69 | + Updated Clean to delete the obj directories |
70 | 70 | ||
71 | [ December 25, 2004 - 0.13 ] | 71 | [ December 25, 2004 - 0.13 ] |
72 | + Added dnpb.exe so that it can be used to generate the project files | 72 | + Added dnpb.exe so that it can be used to generate the project files |
73 | + Added dnpb.ico | 73 | + Added dnpb.ico |
74 | * Added parameterless Write statement to Log for writing a single line | 74 | * Added parameterless Write statement to Log for writing a single line |
75 | * Changed scehema to version 1.3 for support of icon attribute | 75 | * Changed scehema to version 1.3 for support of icon attribute |
76 | * Added support for All configuration name under a Project node signifying common settings for all configurations | 76 | * Added support for All configuration name under a Project node signifying common settings for all configurations |
77 | ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode | 77 | ! Fixed the SupressWarnings by adding the corresponding field to OptionsNode |
78 | * Wrote documentation in docs/readme.txt | 78 | * Wrote documentation in docs/readme.txt |
79 | * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 | 79 | * Added Dan Moorehead to copyrights and extended date from 2004 to 2004-2005 |
80 | * Updated prebuild.xml | 80 | * Updated prebuild.xml |
81 | * Optimized Log class | 81 | * Optimized Log class |
82 | * Updated OutputUsage() | 82 | * Updated OutputUsage() |
83 | * /clean targets all by default | 83 | * /clean targets all by default |
84 | * No log file is used by default, /log without value specified uses default file name | 84 | * No log file is used by default, /log without value specified uses default file name |
85 | + Added support for the /pause which pauses the utility after execution to observe output | 85 | + Added support for the /pause which pauses the utility after execution to observe output |
86 | 86 | ||
87 | 87 | ||
88 | [ September 27, 2004 - 0.12.2a ] | 88 | [ September 27, 2004 - 0.12.2a ] |
89 | ! Fixed a nasty bug when trying to delete our temp file for pre-processing. | 89 | ! Fixed a nasty bug when trying to delete our temp file for pre-processing. |
90 | 90 | ||
91 | [ September 15, 2004 - 0.12.2 ] | 91 | [ September 15, 2004 - 0.12.2 ] |
92 | + Expanded platform identification, thanks to the NAnt guys for shedding some | 92 | + Expanded platform identification, thanks to the NAnt guys for shedding some |
93 | light on how to properly check for UNIX platforms! Thanks guys! | 93 | light on how to properly check for UNIX platforms! Thanks guys! |
94 | * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", | 94 | * POSIX OS identifier changed to UNIX. Valid OS names are now "Win32", "UNIX", |
95 | and "Unknown". | 95 | and "Unknown". |
96 | ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of | 96 | ! Fixed SharpDevelop target to properly use the 'rootNamespace' attribute of |
97 | the Project tag. | 97 | the Project tag. |
98 | + New command-line switch, /ppo, forces DNPB to pre-process the file and write | 98 | + New command-line switch, /ppo, forces DNPB to pre-process the file and write |
99 | the pre-processed file. This allows you to test/debug your pre-processor | 99 | the pre-processed file. This allows you to test/debug your pre-processor |
100 | macros. No other processing will be done. You can specify a target file as | 100 | macros. No other processing will be done. You can specify a target file as |
101 | a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' | 101 | a paramter for the /ppo switch, or DNPB will write the file 'preprocessed.xml' |
102 | if you do not specify a file. | 102 | if you do not specify a file. |
103 | + The Match tag now has a 'buildAction' attribute which functions exactly like | 103 | + The Match tag now has a 'buildAction' attribute which functions exactly like |
104 | the attribute of the same name for the File tag. | 104 | the attribute of the same name for the File tag. |
105 | 105 | ||
106 | [ August 5, 2004 - 0.12.1 ] | 106 | [ August 5, 2004 - 0.12.1 ] |
107 | + Added environment variable expansion for all values. Environment variables | 107 | + Added environment variable expansion for all values. Environment variables |
108 | should be listed in the form ${VAR}. | 108 | should be listed in the form ${VAR}. |
109 | 109 | ||
110 | [ July 30, 2004 - 0.12.0 ] | 110 | [ July 30, 2004 - 0.12.0 ] |
111 | + Added preprocessing via XML processing information tags. Available tags | 111 | + Added preprocessing via XML processing information tags. Available tags |
112 | are: <?if <exp> ?>, <?elseif <exp> ?>, <?else ?> and <?endif ?>. The | 112 | are: <?if <exp> ?>, <?elseif <exp> ?>, <?else ?> and <?endif ?>. The |
113 | current expression parser is very basic, but will be replaced with a more | 113 | current expression parser is very basic, but will be replaced with a more |
114 | capable parser over time. Current operators available are: =, !=, <, >, | 114 | capable parser over time. Current operators available are: =, !=, <, >, |
115 | <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, | 115 | <=, >=. Current test variables available: OS, RuntimeVersion, RuntimeMajor, |
116 | RuntimeMinor, RuntimeRevision. | 116 | RuntimeMinor, RuntimeRevision. |
117 | 117 | ||
118 | [ July 27, 2004 - 0.11.4 ] | 118 | [ July 27, 2004 - 0.11.4 ] |
119 | + Added 'useRegex' attribute to the Match tag. Matches can now use regular | 119 | + Added 'useRegex' attribute to the Match tag. Matches can now use regular |
120 | expressions to match filenames. | 120 | expressions to match filenames. |
121 | + Added the 'assemblyName' attribute to the Project tag. Projects can now | 121 | + Added the 'assemblyName' attribute to the Project tag. Projects can now |
122 | set their output assembly name. | 122 | set their output assembly name. |
123 | ! Fixed several bugs in the way that Project tags inheirt their parent | 123 | ! Fixed several bugs in the way that Project tags inheirt their parent |
124 | Solutions configuration options. This operation should now work fully as | 124 | Solutions configuration options. This operation should now work fully as |
125 | intended. | 125 | intended. |
126 | ! Due to some wierdness, Project Guid's are now stored as part of the Project | 126 | ! Due to some wierdness, Project Guid's are now stored as part of the Project |
127 | node and created at parse time. | 127 | node and created at parse time. |
128 | 128 | ||
129 | [ May 11, 2004 - 0.11.3 ] | 129 | [ May 11, 2004 - 0.11.3 ] |
130 | ! Fixed a bug where I was writing the wrong property name for a projects root | 130 | ! Fixed a bug where I was writing the wrong property name for a projects root |
131 | namespace. | 131 | namespace. |
132 | ! Removed a DEBUG statement I had left in the code in 0.11.2. | 132 | ! Removed a DEBUG statement I had left in the code in 0.11.2. |
133 | ! Fixed a bug in the VS2002 writer which caused the version variables to not | 133 | ! Fixed a bug in the VS2002 writer which caused the version variables to not |
134 | be overriden correctly. | 134 | be overriden correctly. |
135 | + Added the rootNamespace property to the <Project> element, allowing you to | 135 | + Added the rootNamespace property to the <Project> element, allowing you to |
136 | specify the root namespace. | 136 | specify the root namespace. |
137 | * /target and /clean are now mutually exclusive command line switches, and | 137 | * /target and /clean are now mutually exclusive command line switches, and |
138 | they both now take the all option. In the case of /target all, all build | 138 | they both now take the all option. In the case of /target all, all build |
139 | file for all targets will be created. In the case of /clean all, the user | 139 | file for all targets will be created. In the case of /clean all, the user |
140 | will be prompted to make sure they want to do it, and if so, will clean | 140 | will be prompted to make sure they want to do it, and if so, will clean |
141 | all build files for all targets. | 141 | all build files for all targets. |
142 | 142 | ||
143 | [ April 22, 2004 - 0.11.2 ] | 143 | [ April 22, 2004 - 0.11.2 ] |
144 | ! Fixed a bug with the /file command-line operator. Was using the unresolved | 144 | ! Fixed a bug with the /file command-line operator. Was using the unresolved |
145 | file path rather then the resolved one, was making the attempt to open the | 145 | file path rather then the resolved one, was making the attempt to open the |
146 | dnpb file fail. | 146 | dnpb file fail. |
147 | ! Fixed a bug in the schema that required at least 1 solution and 1 reference | 147 | ! Fixed a bug in the schema that required at least 1 solution and 1 reference |
148 | path. We can do just fine with 0 of either of these. Some files may be all | 148 | path. We can do just fine with 0 of either of these. Some files may be all |
149 | <Process> statements and not have any <Solution> tags. | 149 | <Process> statements and not have any <Solution> tags. |
150 | ! Fixed a bug that caused the project references not to be written with the | 150 | ! Fixed a bug that caused the project references not to be written with the |
151 | SharpDevelop target. | 151 | SharpDevelop target. |
152 | * Changed the schema to version 1.2, allowing for Configuration nodes to exist | 152 | * Changed the schema to version 1.2, allowing for Configuration nodes to exist |
153 | under project nodes. The inheritance of values is hierarchical. Meaning, if | 153 | under project nodes. The inheritance of values is hierarchical. Meaning, if |
154 | you define a configuration named Debug at the Soltion level, and one by the | 154 | you define a configuration named Debug at the Soltion level, and one by the |
155 | same name at the Project level, the one at the Project level will first | 155 | same name at the Project level, the one at the Project level will first |
156 | inherit the options of the Solution level configuration, then set it's own | 156 | inherit the options of the Solution level configuration, then set it's own |
157 | options. If you define a configuration at the Project level and it does not | 157 | options. If you define a configuration at the Project level and it does not |
158 | exist at the Solution level, it will be created at the Solution level. | 158 | exist at the Solution level, it will be created at the Solution level. |
159 | * Project references should now work correctly across the board. Note that due | 159 | * Project references should now work correctly across the board. Note that due |
160 | to a restriction in Visual Studio, you can only reference projects in the same | 160 | to a restriction in Visual Studio, you can only reference projects in the same |
161 | solution. | 161 | solution. |
162 | 162 | ||
163 | [ April 21, 2004 - 0.11.1 ] | 163 | [ April 21, 2004 - 0.11.1 ] |
164 | ! Fixed a problem with resolving paths in various targets. Was not properly | 164 | ! Fixed a problem with resolving paths in various targets. Was not properly |
165 | setting the CWD. | 165 | setting the CWD. |
166 | * Schema updated to 1.1, moving the ReferencePath element from the Options | 166 | * Schema updated to 1.1, moving the ReferencePath element from the Options |
167 | element to the Project element. This makes more logical sense, given that | 167 | element to the Project element. This makes more logical sense, given that |
168 | reference paths are resolved relative to the project path. Any prebuild.xml | 168 | reference paths are resolved relative to the project path. Any prebuild.xml |
169 | file referecning verison 1.0 will fail! Please update to the 1.1 schema. | 169 | file referecning verison 1.0 will fail! Please update to the 1.1 schema. |
170 | 170 | ||
171 | [ April 19, 2004 - 0.11.0 ] | 171 | [ April 19, 2004 - 0.11.0 ] |
172 | * Added several attributes across the code to make FxCop happy | 172 | * Added several attributes across the code to make FxCop happy |
173 | ! Fixed bugs in reference paths being written in the VS targets. | 173 | ! Fixed bugs in reference paths being written in the VS targets. |
174 | ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of | 174 | ! Fixed a bug in ProjectNode which was doing two CWDStack.Push() calls instead of |
175 | a Push/Pop pair. Was wreaking havoc with <Process> tags. | 175 | a Push/Pop pair. Was wreaking havoc with <Process> tags. |
176 | ! Fixed some bugs in the path tracking, both the Project and Solution nodes now | 176 | ! Fixed some bugs in the path tracking, both the Project and Solution nodes now |
177 | have a FullPath property, which is the full path to the file resolved at load | 177 | have a FullPath property, which is the full path to the file resolved at load |
178 | time. This should fix all path relativity problems. | 178 | time. This should fix all path relativity problems. |
179 | + Added new /clean switch, allowing the target to clean up any files it generated. | 179 | + Added new /clean switch, allowing the target to clean up any files it generated. |
180 | in accordance, the ITarget interface has been updated to support a new Clean() | 180 | in accordance, the ITarget interface has been updated to support a new Clean() |
181 | method. | 181 | method. |
182 | + Completed addition of the <Process> tag, to allow the referencing of external | 182 | + Completed addition of the <Process> tag, to allow the referencing of external |
183 | prebuild.xml files. | 183 | prebuild.xml files. |
184 | + Added the runtime attribute to the Project element. This allows the developer | 184 | + Added the runtime attribute to the Project element. This allows the developer |
185 | to specify which runtime a project should target (Mono or Microsoft). This is | 185 | to specify which runtime a project should target (Mono or Microsoft). This is |
186 | of course ignored in certain targets like the Visual Studio targets. | 186 | of course ignored in certain targets like the Visual Studio targets. |
187 | + Added the SharpDevelop target. | 187 | + Added the SharpDevelop target. |
188 | 188 | ||
189 | [ April 13, 2004 - 0.10.1a ] | 189 | [ April 13, 2004 - 0.10.1a ] |
190 | + Added the buildAction attribute to the File node. This is needed for dnpb | 190 | + Added the buildAction attribute to the File node. This is needed for dnpb |
191 | to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) | 191 | to even be able to bootstrap itself (dnpb-1.0.xsd must be an embedded resource) |
192 | 192 | ||
193 | [ April 13, 2004 - 0.10.1 ] | 193 | [ April 13, 2004 - 0.10.1 ] |
194 | * First Release | 194 | * First Release |
195 | 195 | ||
196 | [ Key ] | 196 | [ Key ] |
197 | * = Change or information | 197 | * = Change or information |
198 | + = Addition | 198 | + = Addition |
199 | ! = Bug Fix | 199 | ! = Bug Fix |
200 | 200 | ||
diff --git a/Prebuild/Prebuild.exe b/Prebuild/Prebuild.exe new file mode 100755 index 0000000..bdb25b6 --- /dev/null +++ b/Prebuild/Prebuild.exe | |||
Binary files differ | |||
diff --git a/Prebuild/README b/Prebuild/README index e8a2d69..2b05fb5 100644 --- a/Prebuild/README +++ b/Prebuild/README | |||
@@ -1,274 +1,274 @@ | |||
1 | Prebuild Instructions | 1 | Prebuild Instructions |
2 | 2 | ||
3 | 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. | 3 | 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. |
4 | 4 | ||
5 | _______________________________________________________________________________ | 5 | _______________________________________________________________________________ |
6 | Overview | 6 | Overview |
7 | 7 | ||
8 | Prebuild can be either be run from the command line to generate the | 8 | Prebuild can be either be run from the command line to generate the |
9 | project and make files or you can execute the included batch (*.bat) | 9 | project and make files or you can execute the included batch (*.bat) |
10 | and Unix Shell script (*.sh) files. | 10 | and Unix Shell script (*.sh) files. |
11 | 11 | ||
12 | _______________________________________________________________________________ | 12 | _______________________________________________________________________________ |
13 | The currently supported developement tools and their associated batch | 13 | The currently supported developement tools and their associated batch |
14 | and shell script files. | 14 | and shell script files. |
15 | 15 | ||
16 | Visual Studio .NET 2005 (VS2005.bat) | 16 | Visual Studio .NET 2005 (VS2005.bat) |
17 | Visual Studio .NET 2003 (VS2003.bat) | 17 | Visual Studio .NET 2003 (VS2003.bat) |
18 | Visual Studio .NET 2002 (VS2002.bat) | 18 | Visual Studio .NET 2002 (VS2002.bat) |
19 | SharpDevelop (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ | 19 | SharpDevelop (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ |
20 | SharpDevelop2 (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ | 20 | SharpDevelop2 (SharpDevelop.bat) - http://www.icsharpcode.net/OpenSource/SD/ |
21 | MonoDevelop (MonoDevelop.sh) - http://www.monodevelop.com/ | 21 | MonoDevelop (MonoDevelop.sh) - http://www.monodevelop.com/ |
22 | NAnt (nant.sh and nant.bat) - http://nant.sourceforge.net/ | 22 | NAnt (nant.sh and nant.bat) - http://nant.sourceforge.net/ |
23 | Autotools (autotools.bat and autotools.sh) - http://en.wikipedia.org/wiki/GNU_build_system | 23 | Autotools (autotools.bat and autotools.sh) - http://en.wikipedia.org/wiki/GNU_build_system |
24 | 24 | ||
25 | Notes: | 25 | Notes: |
26 | 26 | ||
27 | A Unix Shell script is provided for MonoDevelop, as it does not run on | 27 | A Unix Shell script is provided for MonoDevelop, as it does not run on |
28 | Windows at this time. | 28 | Windows at this time. |
29 | 29 | ||
30 | Visual Studio .NET 2005 and the Visual Express IDE's can import | 30 | Visual Studio .NET 2005 and the Visual Express IDE's can import |
31 | solutions from older versions of Visual Studio .NET. | 31 | solutions from older versions of Visual Studio .NET. |
32 | 32 | ||
33 | Makefiles are not currently supported. | 33 | Makefiles are not currently supported. |
34 | 34 | ||
35 | _______________________________________________________________________________ | 35 | _______________________________________________________________________________ |
36 | Command Line Syntax: | 36 | Command Line Syntax: |
37 | 37 | ||
38 | Example: | 38 | Example: |
39 | > Prebuild /target vs2003 | 39 | > Prebuild /target vs2003 |
40 | 40 | ||
41 | This will generate the project files for Visual Studio.NET 2003 and | 41 | This will generate the project files for Visual Studio.NET 2003 and |
42 | place the redirect the log to a file named PrebuildLog.txt in the | 42 | place the redirect the log to a file named PrebuildLog.txt in the |
43 | parent directory | 43 | parent directory |
44 | 44 | ||
45 | 45 | ||
46 | The syntax structure is as below, where commandParameter is optional | 46 | The syntax structure is as below, where commandParameter is optional |
47 | depending on the command and you can provide several option-value | 47 | depending on the command and you can provide several option-value |
48 | pairs. | 48 | pairs. |
49 | 49 | ||
50 | Note: The '> ' signifies the command prompt, do not enter this literally | 50 | Note: The '> ' signifies the command prompt, do not enter this literally |
51 | 51 | ||
52 | > Prebuild /<option> <commandParameter> | 52 | > Prebuild /<option> <commandParameter> |
53 | 53 | ||
54 | > Prebuild /target vs2003 /pause | 54 | > Prebuild /target vs2003 /pause |
55 | 55 | ||
56 | > Prebuild /target vs2003 /log ../Log.txt /pause /ppo /file ProjectConfig.xml | 56 | > Prebuild /target vs2003 /log ../Log.txt /pause /ppo /file ProjectConfig.xml |
57 | 57 | ||
58 | > Prebuild /target sharpdev /log | 58 | > Prebuild /target sharpdev /log |
59 | 59 | ||
60 | > Prebuild /removedir obj|bin | 60 | > Prebuild /removedir obj|bin |
61 | 61 | ||
62 | > Prebuild /target vs2003 /allowedgroups Group1|Group2 | 62 | > Prebuild /target vs2003 /allowedgroups Group1|Group2 |
63 | 63 | ||
64 | > Prebuild /clean | 64 | > Prebuild /clean |
65 | 65 | ||
66 | > Prebuild /clean /yes | 66 | > Prebuild /clean /yes |
67 | 67 | ||
68 | > Prebuild /clean vs2003 | 68 | > Prebuild /clean vs2003 |
69 | 69 | ||
70 | _______________________________________________________________________________ | 70 | _______________________________________________________________________________ |
71 | Command Line Options: | 71 | Command Line Options: |
72 | 72 | ||
73 | /usage - Shows the help information on how to use Prebuild and what | 73 | /usage - Shows the help information on how to use Prebuild and what |
74 | the different options are and what they do | 74 | the different options are and what they do |
75 | 75 | ||
76 | /clean - The project files generated for the target type specified as | 76 | /clean - The project files generated for the target type specified as |
77 | a parameter for this option will be deleted. If no value is specified | 77 | a parameter for this option will be deleted. If no value is specified |
78 | or if 'all' is specified, then project files for all the target types | 78 | or if 'all' is specified, then project files for all the target types |
79 | will be deleted. | 79 | will be deleted. |
80 | 80 | ||
81 | /target - Specified the name of the development tool for which project | 81 | /target - Specified the name of the development tool for which project |
82 | or make files will be generated. Possible parameter values include: | 82 | or make files will be generated. Possible parameter values include: |
83 | vs2003, vs2002, sharpdev | 83 | vs2003, vs2002, sharpdev |
84 | 84 | ||
85 | /file - Specifies the name of the XML which defines what files are to | 85 | /file - Specifies the name of the XML which defines what files are to |
86 | be referenced by the generated project files as well as configures the | 86 | be referenced by the generated project files as well as configures the |
87 | options for them. If not specified, prebuild.xml in the current | 87 | options for them. If not specified, prebuild.xml in the current |
88 | directory will be used as the default. | 88 | directory will be used as the default. |
89 | 89 | ||
90 | /log - Specified the log file that should be written to for build | 90 | /log - Specified the log file that should be written to for build |
91 | errors. If this option is not specified, no log file is generated, | 91 | errors. If this option is not specified, no log file is generated, |
92 | but if just no value is specified, then the defaul filename will be | 92 | but if just no value is specified, then the defaul filename will be |
93 | used for the log (Prebuild.log). | 93 | used for the log (Prebuild.log). |
94 | 94 | ||
95 | /ppo - Preprocesses the xml file to test for syntax errors or problems | 95 | /ppo - Preprocesses the xml file to test for syntax errors or problems |
96 | but doesn't generate the files | 96 | but doesn't generate the files |
97 | 97 | ||
98 | /pause - Shows the console until you press a key so that you can view | 98 | /pause - Shows the console until you press a key so that you can view |
99 | the messages written while performing the specified actions. | 99 | the messages written while performing the specified actions. |
100 | 100 | ||
101 | This allows you to check if an errors occurred and - if so - what it | 101 | This allows you to check if an errors occurred and - if so - what it |
102 | was. | 102 | was. |
103 | 103 | ||
104 | /showtargets - Shows a list of all the targets that can be specified | 104 | /showtargets - Shows a list of all the targets that can be specified |
105 | as values for the /clean and /target commands. | 105 | as values for the /clean and /target commands. |
106 | 106 | ||
107 | /allowedgroups - This is followed by a pipe-delimited list of project | 107 | /allowedgroups - This is followed by a pipe-delimited list of project |
108 | group filter flags (eg. Group1|Group2) allow optional filtering of all | 108 | group filter flags (eg. Group1|Group2) allow optional filtering of all |
109 | projects that dont have at least one of these flags | 109 | projects that dont have at least one of these flags |
110 | 110 | ||
111 | /removedir - This is followed by a pipe-delimited list of directory | 111 | /removedir - This is followed by a pipe-delimited list of directory |
112 | names that will be deleted while recursivly searching the directory of | 112 | names that will be deleted while recursivly searching the directory of |
113 | the prebuild application and its child directories (eg. use obj|bin to | 113 | the prebuild application and its child directories (eg. use obj|bin to |
114 | delete all output and temporary directories before file releases) | 114 | delete all output and temporary directories before file releases) |
115 | 115 | ||
116 | /yes - Answer yes to any warnings (e.g. when cleaning all projects). | 116 | /yes - Answer yes to any warnings (e.g. when cleaning all projects). |
117 | 117 | ||
118 | _______________________________________________________________________________ | 118 | _______________________________________________________________________________ |
119 | Example Batch Files and Shell Scripts | 119 | Example Batch Files and Shell Scripts |
120 | 120 | ||
121 | NOTE: Common batch and shell script files are included with Prebuild source and file releases. | 121 | NOTE: Common batch and shell script files are included with Prebuild source and file releases. |
122 | ______________________________ | 122 | ______________________________ |
123 | MonoDevelop | 123 | MonoDevelop |
124 | 124 | ||
125 | #!/bin/sh | 125 | #!/bin/sh |
126 | # Generates a solution (.mds) and a set of project files (.mdp) | 126 | # Generates a solution (.mds) and a set of project files (.mdp) |
127 | 127 | ||
128 | # for MonoDevelop, a Mono port of SharpDevelop | 128 | # for MonoDevelop, a Mono port of SharpDevelop |
129 | # (http://icsharpcode.net/OpenSource/SD/Default.aspx) | 129 | # (http://icsharpcode.net/OpenSource/SD/Default.aspx) |
130 | 130 | ||
131 | ./Prebuild /target monodev /pause | 131 | ./Prebuild /target monodev /pause |
132 | 132 | ||
133 | ______________________________ | 133 | ______________________________ |
134 | Visual Studio .NET 2003 | 134 | Visual Studio .NET 2003 |
135 | 135 | ||
136 | @rem Generates a solution (.sln) and a set of project files (.csproj) | 136 | @rem Generates a solution (.sln) and a set of project files (.csproj) |
137 | @rem for Microsoft Visual Studio .NET 2002 | 137 | @rem for Microsoft Visual Studio .NET 2002 |
138 | Prebuild /target vs2003 /pause | 138 | Prebuild /target vs2003 /pause |
139 | 139 | ||
140 | Notes: | 140 | Notes: |
141 | Text after lines that start with @rem are comments and are not evaluated | 141 | Text after lines that start with @rem are comments and are not evaluated |
142 | You can also place pause on the last line instead of specifing the /pause command. | 142 | You can also place pause on the last line instead of specifing the /pause command. |
143 | 143 | ||
144 | _______________________________________________________________________________ | 144 | _______________________________________________________________________________ |
145 | Example XML Configuration File | 145 | Example XML Configuration File |
146 | 146 | ||
147 | Note: | 147 | Note: |
148 | 148 | ||
149 | XML Comments (<!-- Comment -->) are used to markup the prebuild.xml | 149 | XML Comments (<!-- Comment -->) are used to markup the prebuild.xml |
150 | file with notes | 150 | file with notes |
151 | 151 | ||
152 | The below file may be out-of-date, however the RealmForge Prebuild | 152 | The below file may be out-of-date, however the RealmForge Prebuild |
153 | file serves as an up-to-date and extensive example. | 153 | file serves as an up-to-date and extensive example. |
154 | 154 | ||
155 | It can be viewed using Tigris.org's WebSVN | 155 | It can be viewed using Tigris.org's WebSVN |
156 | (http://realmforge.tigris.org/source/browse/realmforge/trunk/src/prebuild.xml) | 156 | (http://realmforge.tigris.org/source/browse/realmforge/trunk/src/prebuild.xml) |
157 | by just clicking on the "view file" link for the latest revision. | 157 | by just clicking on the "view file" link for the latest revision. |
158 | 158 | ||
159 | _________________________________ | 159 | _________________________________ |
160 | 160 | ||
161 | <?xml version="1.0" encoding="utf-8"?> | 161 | <?xml version="1.0" encoding="utf-8"?> |
162 | <!--The version of the XML schema specified in the version and xmlns attributes should match the one for which the version of Prebuild.exe used was compiled for. In this example it is the version 1.3 schema, you can find the XSD schema file at the url specified in the xmlns attribute. --> | 162 | <!--The version of the XML schema specified in the version and xmlns attributes should match the one for which the version of Prebuild.exe used was compiled for. In this example it is the version 1.3 schema, you can find the XSD schema file at the url specified in the xmlns attribute. --> |
163 | <Prebuild version="1.6" xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.6.xsd"> | 163 | <Prebuild version="1.6" xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.6.xsd"> |
164 | <Solution name="RealmForge"> <!--The title and file name for the solution, combine, workspace, or project group (depending on what development tool you are using)--> | 164 | <Solution name="RealmForge"> <!--The title and file name for the solution, combine, workspace, or project group (depending on what development tool you are using)--> |
165 | <!--Configurations found as children of Solution are used as templates for the configurations found in the project, this allows you to avoid writing the same options in each project (and maintaining each of these). You can provide defaults and then override them in the configurations defined for each project. All options are optional.--> | 165 | <!--Configurations found as children of Solution are used as templates for the configurations found in the project, this allows you to avoid writing the same options in each project (and maintaining each of these). You can provide defaults and then override them in the configurations defined for each project. All options are optional.--> |
166 | <Configuration name="Debug"> | 166 | <Configuration name="Debug"> |
167 | <Options> | 167 | <Options> |
168 | <!-- simple logically expressions can be evaluated, if, else, elseif, and endif are valid statements. Note that it is not neccisary to define POSIX or WIN32 --> | 168 | <!-- simple logically expressions can be evaluated, if, else, elseif, and endif are valid statements. Note that it is not neccisary to define POSIX or WIN32 --> |
169 | <?if OS = "Win32" ?> | 169 | <?if OS = "Win32" ?> |
170 | <CompilerDefines>DEBUG;TRACE;WIN32</CompilerDefines> | 170 | <CompilerDefines>DEBUG;TRACE;WIN32</CompilerDefines> |
171 | <?else ?> | 171 | <?else ?> |
172 | <CompilerDefines>DEBUG;TRACE;POSIX</CompilerDefines> | 172 | <CompilerDefines>DEBUG;TRACE;POSIX</CompilerDefines> |
173 | <?endif ?> | 173 | <?endif ?> |
174 | <OptimizeCode>false</OptimizeCode> | 174 | <OptimizeCode>false</OptimizeCode> |
175 | <CheckUnderflowOverflow>false</CheckUnderflowOverflow> | 175 | <CheckUnderflowOverflow>false</CheckUnderflowOverflow> |
176 | <AllowUnsafe>false</AllowUnsafe> | 176 | <AllowUnsafe>false</AllowUnsafe> |
177 | <WarningLevel>4</WarningLevel> | 177 | <WarningLevel>4</WarningLevel> |
178 | <!-The filter for the number of warnings or errors shown and the tolerance level as to what is an error. This is value from 0 to 4 where 4 is the most strict (least tolerent).--> | 178 | <!-The filter for the number of warnings or errors shown and the tolerance level as to what is an error. This is value from 0 to 4 where 4 is the most strict (least tolerent).--> |
179 | 179 | ||
180 | <WarningsAsErrors>false</WarningsAsErrors> | 180 | <WarningsAsErrors>false</WarningsAsErrors> |
181 | <SuppressWarnings>1591;219;1573;1572;168</SuppressWarnings> | 181 | <SuppressWarnings>1591;219;1573;1572;168</SuppressWarnings> |
182 | <!-- A semicolon ';' delimited list of the warnings that are filtered and not shown in the output window during compiling a project. Only include the number portion of the warning codes that are shown in output during compilation (eg CS1591, should be entered as 1591)--> | 182 | <!-- A semicolon ';' delimited list of the warnings that are filtered and not shown in the output window during compiling a project. Only include the number portion of the warning codes that are shown in output during compilation (eg CS1591, should be entered as 1591)--> |
183 | 183 | ||
184 | <OutputPath>..\bin</OutputPath> | 184 | <OutputPath>..\bin</OutputPath> |
185 | <DebugInformation>true</DebugInformation> | 185 | <DebugInformation>true</DebugInformation> |
186 | <RegisterComInterop>false</RegisterComInterop> | 186 | <RegisterComInterop>false</RegisterComInterop> |
187 | <IncrementalBuild>true</IncrementalBuild> | 187 | <IncrementalBuild>true</IncrementalBuild> |
188 | <BaseAddress>285212672</BaseAddress> | 188 | <BaseAddress>285212672</BaseAddress> |
189 | <FileAlignment>4096</FileAlignment> | 189 | <FileAlignment>4096</FileAlignment> |
190 | <NoStdLib>false</NoStdLib> | 190 | <NoStdLib>false</NoStdLib> |
191 | <XmlDocFile>Docs.xml</XmlDocFile> | 191 | <XmlDocFile>Docs.xml</XmlDocFile> |
192 | </Options> | 192 | </Options> |
193 | </Configuration> | 193 | </Configuration> |
194 | <Configuration name="Release"> <!-- You can define multple configurations that projects can have, but there is no way to define which one is selected by default as this is a part of the user preferences for a project, not the solution or project files --> | 194 | <Configuration name="Release"> <!-- You can define multple configurations that projects can have, but there is no way to define which one is selected by default as this is a part of the user preferences for a project, not the solution or project files --> |
195 | <Options> | 195 | <Options> |
196 | <CompilerDefines>TRACE</CompilerDefines> | 196 | <CompilerDefines>TRACE</CompilerDefines> |
197 | <OptimizeCode>true</OptimizeCode> | 197 | <OptimizeCode>true</OptimizeCode> |
198 | <CheckUnderflowOverflow>false</CheckUnderflowOverflow> | 198 | <CheckUnderflowOverflow>false</CheckUnderflowOverflow> |
199 | <AllowUnsafe>false</AllowUnsafe> | 199 | <AllowUnsafe>false</AllowUnsafe> |
200 | <WarningLevel>4</WarningLevel> | 200 | <WarningLevel>4</WarningLevel> |
201 | <WarningsAsErrors>false</WarningsAsErrors> | 201 | <WarningsAsErrors>false</WarningsAsErrors> |
202 | <SuppressWarnings>1591;219;1573;1572;168</SuppressWarnings> | 202 | <SuppressWarnings>1591;219;1573;1572;168</SuppressWarnings> |
203 | <OutputPath>..\bin</OutputPath> | 203 | <OutputPath>..\bin</OutputPath> |
204 | <DebugInformation>false</DebugInformation> | 204 | <DebugInformation>false</DebugInformation> |
205 | <RegisterComInterop>false</RegisterComInterop> | 205 | <RegisterComInterop>false</RegisterComInterop> |
206 | <IncrementalBuild>true</IncrementalBuild> | 206 | <IncrementalBuild>true</IncrementalBuild> |
207 | <BaseAddress>285212672</BaseAddress> | 207 | <BaseAddress>285212672</BaseAddress> |
208 | <FileAlignment>4096</FileAlignment> | 208 | <FileAlignment>4096</FileAlignment> |
209 | <NoStdLib>false</NoStdLib> | 209 | <NoStdLib>false</NoStdLib> |
210 | <GenerateXmlDocFile>true</GenerateXmlDocFile> | 210 | <GenerateXmlDocFile>true</GenerateXmlDocFile> |
211 | <XmlDocFile>Docs.xml</XmlDocFile> | 211 | <XmlDocFile>Docs.xml</XmlDocFile> |
212 | </Options> | 212 | </Options> |
213 | </Configuration> | 213 | </Configuration> |
214 | 214 | ||
215 | <!-- One of the projects that is included in the Solution --> | 215 | <!-- One of the projects that is included in the Solution --> |
216 | <Project name="RealmForge.Utility" Language="VisualBasic" path="Utility" type="Library" assemblyName="RealmForge.Utility" rootNamespace="RealmForge"> | 216 | <Project name="RealmForge.Utility" Language="VisualBasic" path="Utility" type="Library" assemblyName="RealmForge.Utility" rootNamespace="RealmForge"> |
217 | <Configuration name="Debug"> | 217 | <Configuration name="Debug"> |
218 | <Options> | 218 | <Options> |
219 | <OutputPath>..\bin\lib\Utility</OutputPath> | 219 | <OutputPath>..\bin\lib\Utility</OutputPath> |
220 | <XmlDocFile>RealmForge.Utility.xml</XmlDocFile> | 220 | <XmlDocFile>RealmForge.Utility.xml</XmlDocFile> |
221 | </Options> | 221 | </Options> |
222 | </Configuration> | 222 | </Configuration> |
223 | <Configuration name="Release"> | 223 | <Configuration name="Release"> |
224 | <Options> | 224 | <Options> |
225 | <OutputPath>..\bin\lib\Utility</OutputPath> | 225 | <OutputPath>..\bin\lib\Utility</OutputPath> |
226 | <XmlDocFile>RealmForge.Utility.xml</XmlDocFile> | 226 | <XmlDocFile>RealmForge.Utility.xml</XmlDocFile> |
227 | </Options> | 227 | </Options> |
228 | </Configuration> | 228 | </Configuration> |
229 | <ReferencePath>../bin</ReferencePath> | 229 | <ReferencePath>../bin</ReferencePath> |
230 | <Reference name="System"/> | 230 | <Reference name="System"/> |
231 | <Reference name="System.Data"/> | 231 | <Reference name="System.Data"/> |
232 | <Reference name="System.Drawing"/> | 232 | <Reference name="System.Drawing"/> |
233 | <Reference name="System.Xml"/> | 233 | <Reference name="System.Xml"/> |
234 | <Reference name="System.Runtime.Serialization.Formatters.Soap"/> | 234 | <Reference name="System.Runtime.Serialization.Formatters.Soap"/> |
235 | <Reference name="ICSharpCode.SharpZipLib"/> | 235 | <Reference name="ICSharpCode.SharpZipLib"/> |
236 | <Files> | 236 | <Files> |
237 | <Match path="." pattern="*.vb" recurse="true"/> | 237 | <Match path="." pattern="*.vb" recurse="true"/> |
238 | </Files> | 238 | </Files> |
239 | </Project> | 239 | </Project> |
240 | 240 | ||
241 | <!-- Another projects that is included in the Solution --> | 241 | <!-- Another projects that is included in the Solution --> |
242 | <Project name="DemoGame" Language="C#" path="DemoGame" type="WinExe" icon="..\bin\RealmForge.ico" assemblyName="DemoGame" rootNamespace="RealmForge"> | 242 | <Project name="DemoGame" Language="C#" path="DemoGame" type="WinExe" icon="..\bin\RealmForge.ico" assemblyName="DemoGame" rootNamespace="RealmForge"> |
243 | <!-- icon is used to define the location of the .ico file that is embeeded in the assembly when the project is compiled. This is relative to the project path --> | 243 | <!-- icon is used to define the location of the .ico file that is embeeded in the assembly when the project is compiled. This is relative to the project path --> |
244 | <!--type defines the type of project, valid types are Library (.dll), WinExe (.exe), and Exe (.exe). WinExe is not windows specific, it just defines that it is a GUI application and that no Console or Command window will show when it is started--> | 244 | <!--type defines the type of project, valid types are Library (.dll), WinExe (.exe), and Exe (.exe). WinExe is not windows specific, it just defines that it is a GUI application and that no Console or Command window will show when it is started--> |
245 | 245 | ||
246 | <Configuration name="Debug"> | 246 | <Configuration name="Debug"> |
247 | <Options> | 247 | <Options> |
248 | <OutputPath>..\bin</OutputPath> | 248 | <OutputPath>..\bin</OutputPath> |
249 | <XmlDocFile>DemoGame.xml</XmlDocFile> | 249 | <XmlDocFile>DemoGame.xml</XmlDocFile> |
250 | </Options> | 250 | </Options> |
251 | </Configuration> | 251 | </Configuration> |
252 | <Configuration name="Release"> | 252 | <Configuration name="Release"> |
253 | <Options> | 253 | <Options> |
254 | <OutputPath>..\bin</OutputPath> | 254 | <OutputPath>..\bin</OutputPath> |
255 | <XmlDocFile>DemoGame.xml</XmlDocFile> | 255 | <XmlDocFile>DemoGame.xml</XmlDocFile> |
256 | </Options> | 256 | </Options> |
257 | </Configuration> | 257 | </Configuration> |
258 | <ReferencePath>../bin</ReferencePath> | 258 | <ReferencePath>../bin</ReferencePath> |
259 | <Reference name="System"/> <!-- Assemblies that are located in the GAC (installed, global) can be referenced--> | 259 | <Reference name="System"/> <!-- Assemblies that are located in the GAC (installed, global) can be referenced--> |
260 | <Reference name="ode"/> <!-- Assemblies that are located in the output directory to which the file is built can be referenced --> | 260 | <Reference name="ode"/> <!-- Assemblies that are located in the output directory to which the file is built can be referenced --> |
261 | <Reference name="RealmForge.Utility"/> <!-- When you reference the name of another project, then that project (and it's output) will be referenced instead of looking for a pre-built assembly--> | 261 | <Reference name="RealmForge.Utility"/> <!-- When you reference the name of another project, then that project (and it's output) will be referenced instead of looking for a pre-built assembly--> |
262 | <Files> | 262 | <Files> |
263 | <Match path="." pattern="*.cs" recurse="true"/> | 263 | <Match path="." pattern="*.cs" recurse="true"/> |
264 | <Match path="." pattern="*.bmp" recurse="true" buildAction="EmbeddedResource"/> | 264 | <Match path="." pattern="*.bmp" recurse="true" buildAction="EmbeddedResource"/> |
265 | <Match path="." pattern="[^a]*\.(png|jpg)" useRegex="true" buildAction="EmbeddedResource"/> | 265 | <Match path="." pattern="[^a]*\.(png|jpg)" useRegex="true" buildAction="EmbeddedResource"/> |
266 | 266 | ||
267 | <!-- Uses a regex or regular expression to find all files that end with .png or .jpg but dont have the letter 'a' in their name and add them to the project as EmbeddedResource's. Because recurse enabled (default is false), only the values in the files in that are directly in the project directory (not child directories) are checked.--> | 267 | <!-- Uses a regex or regular expression to find all files that end with .png or .jpg but dont have the letter 'a' in their name and add them to the project as EmbeddedResource's. Because recurse enabled (default is false), only the values in the files in that are directly in the project directory (not child directories) are checked.--> |
268 | <!--EmbeddedResource, Content, and Compile are valid buildAction's--> | 268 | <!--EmbeddedResource, Content, and Compile are valid buildAction's--> |
269 | </Files> | 269 | </Files> |
270 | </Project> | 270 | </Project> |
271 | 271 | ||
272 | </Solution> | 272 | </Solution> |
273 | </Prebuild> | 273 | </Prebuild> |
274 | 274 | ||
diff --git a/Prebuild/prebuild.xml b/Prebuild/prebuild.xml index d14b94f..588d788 100644 --- a/Prebuild/prebuild.xml +++ b/Prebuild/prebuild.xml | |||
@@ -1,6 +1,6 @@ | |||
1 | <?xml version="1.0" encoding="utf-8" ?> | 1 | <?xml version="1.0" encoding="utf-8" ?> |
2 | <Prebuild xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd" version="1.9"> | 2 | <Prebuild xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd" version="1.9"> |
3 | <Solution name="Prebuild" version="2.0.4"> | 3 | <Solution name="Prebuild" version="2.0.5"> |
4 | <Configuration name="Debug"> | 4 | <Configuration name="Debug"> |
5 | <Options> | 5 | <Options> |
6 | <CompilerDefines>DEBUG;TRACE</CompilerDefines> | 6 | <CompilerDefines>DEBUG;TRACE</CompilerDefines> |
@@ -31,13 +31,15 @@ | |||
31 | type="Exe" | 31 | type="Exe" |
32 | rootNamespace="Prebuild" | 32 | rootNamespace="Prebuild" |
33 | startupObject="Prebuild.Prebuild" | 33 | startupObject="Prebuild.Prebuild" |
34 | version="2.0.3" | 34 | version="2.0.5" |
35 | frameworkVersion="v3_5" | ||
35 | > | 36 | > |
36 | <Author>Matthew Holmes (matthew@wildfiregames.com)</Author> | 37 | <Author>Matthew Holmes (matthew@wildfiregames.com)</Author> |
37 | <Author>Dan Moorehead (dan05a@gmail.com)</Author> | 38 | <Author>Dan Moorehead (dan05a@gmail.com)</Author> |
38 | <Author>Dave Hudson (jendave@yahoo.com)</Author> | 39 | <Author>Dave Hudson (jendave@yahoo.com)</Author> |
39 | <Author>Rob Loach (http://robloach.net)</Author> | 40 | <Author>Rob Loach (http://robloach.net)</Author> |
40 | <Author>C.J. Adams-Collier (cjac@colliertech.org)</Author> | 41 | <Author>C.J. Adams-Collier (cjac@colliertech.org)</Author> |
42 | <Author>John Hurliman (john.hurliman@intel.com)</Author> | ||
41 | <Description>The Prebuild project generator</Description> | 43 | <Description>The Prebuild project generator</Description> |
42 | <Configuration name="Debug"> | 44 | <Configuration name="Debug"> |
43 | <Options> | 45 | <Options> |
diff --git a/Prebuild/scripts/SharpDevelop2.bat b/Prebuild/scripts/SharpDevelop2.bat index 49120ab..4ca0272 100755 --- a/Prebuild/scripts/SharpDevelop2.bat +++ b/Prebuild/scripts/SharpDevelop2.bat | |||
@@ -1,4 +1,4 @@ | |||
1 | @rem Generates a combine (.cmbx) and a set of project files (.prjx) | 1 | @rem Generates a combine (.cmbx) and a set of project files (.prjx) |
2 | @rem for SharpDevelop (http://icsharpcode.net/OpenSource/SD/Default.aspx) | 2 | @rem for SharpDevelop (http://icsharpcode.net/OpenSource/SD/Default.aspx) |
3 | cd .. | 3 | cd .. |
4 | Prebuild.exe /target sharpdev2 /file prebuild.xml /pause | 4 | Prebuild.exe /target sharpdev2 /file prebuild.xml /pause |
diff --git a/Prebuild/scripts/VS2008.bat b/Prebuild/scripts/VS2008.bat index eb51a82..b465668 100755 --- a/Prebuild/scripts/VS2008.bat +++ b/Prebuild/scripts/VS2008.bat | |||
@@ -1,4 +1,4 @@ | |||
1 | @rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) | 1 | @rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) |
2 | @rem for Microsoft Visual Studio .NET 2008 | 2 | @rem for Microsoft Visual Studio .NET 2008 |
3 | cd .. | 3 | cd .. |
4 | Prebuild.exe /target vs2008 /file prebuild.xml /pause | 4 | Prebuild.exe /target vs2008 /file prebuild.xml /pause |
diff --git a/Prebuild/scripts/VS2010.bat b/Prebuild/scripts/VS2010.bat index 1b98818..87676ac 100644 --- a/Prebuild/scripts/VS2010.bat +++ b/Prebuild/scripts/VS2010.bat | |||
@@ -1,4 +1,4 @@ | |||
1 | @rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) | 1 | @rem Generates a solution (.sln) and a set of project files (.csproj, .vbproj, etc.) |
2 | @rem for Microsoft Visual Studio .NET 2010 | 2 | @rem for Microsoft Visual Studio .NET 2010 |
3 | cd .. | 3 | cd .. |
4 | Prebuild.exe /target vs2010 /file prebuild.xml /pause | 4 | Prebuild.exe /target vs2010 /file prebuild.xml /pause |
diff --git a/Prebuild/scripts/autotools.bat b/Prebuild/scripts/autotools.bat index 43f9a74..1fd3469 100755 --- a/Prebuild/scripts/autotools.bat +++ b/Prebuild/scripts/autotools.bat | |||
@@ -1,4 +1,4 @@ | |||
1 | @rem Generates Makefiles | 1 | @rem Generates Makefiles |
2 | @rem for autotools | 2 | @rem for autotools |
3 | cd .. | 3 | cd .. |
4 | Prebuild.exe /target autotools /file prebuild.xml /pause | 4 | Prebuild.exe /target autotools /file prebuild.xml /pause |
diff --git a/Prebuild/src/Core/Nodes/CleanFilesNode.cs b/Prebuild/src/Core/Nodes/CleanFilesNode.cs index 71405f9..dc2da9a 100644 --- a/Prebuild/src/Core/Nodes/CleanFilesNode.cs +++ b/Prebuild/src/Core/Nodes/CleanFilesNode.cs | |||
@@ -1,80 +1,80 @@ | |||
1 | #region BSD License | 1 | #region BSD License |
2 | /* | 2 | /* |
3 | Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) | 3 | Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) |
4 | 4 | ||
5 | Redistribution and use in source and binary forms, with or without modification, are permitted | 5 | Redistribution and use in source and binary forms, with or without modification, are permitted |
6 | provided that the following conditions are met: | 6 | provided that the following conditions are met: |
7 | 7 | ||
8 | * Redistributions of source code must retain the above copyright notice, this list of conditions | 8 | * Redistributions of source code must retain the above copyright notice, this list of conditions |
9 | and the following disclaimer. | 9 | and the following disclaimer. |
10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions | 10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
11 | and the following disclaimer in the documentation and/or other materials provided with the | 11 | and the following disclaimer in the documentation and/or other materials provided with the |
12 | distribution. | 12 | distribution. |
13 | * The name of the author may not be used to endorse or promote products derived from this software | 13 | * The name of the author may not be used to endorse or promote products derived from this software |
14 | without specific prior written permission. | 14 | without specific prior written permission. |
15 | 15 | ||
16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
23 | */ | 23 | */ |
24 | #endregion | 24 | #endregion |
25 | 25 | ||
26 | using System; | 26 | using System; |
27 | using System.Collections.Generic; | 27 | using System.Collections.Generic; |
28 | using System.Xml; | 28 | using System.Xml; |
29 | 29 | ||
30 | using Prebuild.Core.Attributes; | 30 | using Prebuild.Core.Attributes; |
31 | using Prebuild.Core.Interfaces; | 31 | using Prebuild.Core.Interfaces; |
32 | using Prebuild.Core.Utilities; | 32 | using Prebuild.Core.Utilities; |
33 | 33 | ||
34 | namespace Prebuild.Core.Nodes | 34 | namespace Prebuild.Core.Nodes |
35 | { | 35 | { |
36 | [DataNode("CleanFiles")] | 36 | [DataNode("CleanFiles")] |
37 | public class CleanFilesNode : DataNode | 37 | public class CleanFilesNode : DataNode |
38 | { | 38 | { |
39 | #region Fields | 39 | #region Fields |
40 | 40 | ||
41 | private string m_Pattern; | 41 | private string m_Pattern; |
42 | 42 | ||
43 | #endregion | 43 | #endregion |
44 | 44 | ||
45 | #region Properties | 45 | #region Properties |
46 | 46 | ||
47 | /// <summary> | 47 | /// <summary> |
48 | /// Gets the signature. | 48 | /// Gets the signature. |
49 | /// </summary> | 49 | /// </summary> |
50 | /// <value>The signature.</value> | 50 | /// <value>The signature.</value> |
51 | public string Pattern | 51 | public string Pattern |
52 | { | 52 | { |
53 | get | 53 | get |
54 | { | 54 | { |
55 | return m_Pattern; | 55 | return m_Pattern; |
56 | } | 56 | } |
57 | } | 57 | } |
58 | 58 | ||
59 | #endregion | 59 | #endregion |
60 | 60 | ||
61 | #region Public Methods | 61 | #region Public Methods |
62 | 62 | ||
63 | /// <summary> | 63 | /// <summary> |
64 | /// Parses the specified node. | 64 | /// Parses the specified node. |
65 | /// </summary> | 65 | /// </summary> |
66 | /// <param name="node">The node.</param> | 66 | /// <param name="node">The node.</param> |
67 | public override void Parse(XmlNode node) | 67 | public override void Parse(XmlNode node) |
68 | { | 68 | { |
69 | if (node == null) | 69 | if (node == null) |
70 | { | 70 | { |
71 | throw new ArgumentNullException("node"); | 71 | throw new ArgumentNullException("node"); |
72 | } | 72 | } |
73 | 73 | ||
74 | m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; | 74 | m_Pattern = Helper.AttributeValue(node, "pattern", String.Empty); ; |
75 | m_Pattern = m_Pattern.Trim(); | 75 | m_Pattern = m_Pattern.Trim(); |
76 | } | 76 | } |
77 | 77 | ||
78 | #endregion | 78 | #endregion |
79 | } | 79 | } |
80 | } \ No newline at end of file | 80 | } \ No newline at end of file |
diff --git a/Prebuild/src/Core/Nodes/CleanupNode.cs b/Prebuild/src/Core/Nodes/CleanupNode.cs index b8131b0..a9b77eb 100644 --- a/Prebuild/src/Core/Nodes/CleanupNode.cs +++ b/Prebuild/src/Core/Nodes/CleanupNode.cs | |||
@@ -1,85 +1,85 @@ | |||
1 | #region BSD License | 1 | #region BSD License |
2 | /* | 2 | /* |
3 | Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) | 3 | Copyright (c) 2007 C.J. Adams-Collier (cjac@colliertech.org) |
4 | 4 | ||
5 | Redistribution and use in source and binary forms, with or without modification, are permitted | 5 | Redistribution and use in source and binary forms, with or without modification, are permitted |
6 | provided that the following conditions are met: | 6 | provided that the following conditions are met: |
7 | 7 | ||
8 | * Redistributions of source code must retain the above copyright notice, this list of conditions | 8 | * Redistributions of source code must retain the above copyright notice, this list of conditions |
9 | and the following disclaimer. | 9 | and the following disclaimer. |
10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions | 10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
11 | and the following disclaimer in the documentation and/or other materials provided with the | 11 | and the following disclaimer in the documentation and/or other materials provided with the |
12 | distribution. | 12 | distribution. |
13 | * The name of the author may not be used to endorse or promote products derived from this software | 13 | * The name of the author may not be used to endorse or promote products derived from this software |
14 | without specific prior written permission. | 14 | without specific prior written permission. |
15 | 15 | ||
16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
23 | */ | 23 | */ |
24 | #endregion | 24 | #endregion |
25 | 25 | ||
26 | using System; | 26 | using System; |
27 | using System.Collections.Generic; | 27 | using System.Collections.Generic; |
28 | using System.Xml; | 28 | using System.Xml; |
29 | 29 | ||
30 | using Prebuild.Core.Attributes; | 30 | using Prebuild.Core.Attributes; |
31 | using Prebuild.Core.Interfaces; | 31 | using Prebuild.Core.Interfaces; |
32 | 32 | ||
33 | namespace Prebuild.Core.Nodes | 33 | namespace Prebuild.Core.Nodes |
34 | { | 34 | { |
35 | [DataNode("Cleanup")] | 35 | [DataNode("Cleanup")] |
36 | public class CleanupNode : DataNode | 36 | public class CleanupNode : DataNode |
37 | { | 37 | { |
38 | #region Fields | 38 | #region Fields |
39 | 39 | ||
40 | private List<CleanFilesNode> m_CleanFiles = new List<CleanFilesNode>(); | 40 | private List<CleanFilesNode> m_CleanFiles = new List<CleanFilesNode>(); |
41 | 41 | ||
42 | #endregion | 42 | #endregion |
43 | 43 | ||
44 | #region Properties | 44 | #region Properties |
45 | 45 | ||
46 | /// <summary> | 46 | /// <summary> |
47 | /// Gets the signature. | 47 | /// Gets the signature. |
48 | /// </summary> | 48 | /// </summary> |
49 | /// <value>The signature.</value> | 49 | /// <value>The signature.</value> |
50 | public List<CleanFilesNode> CleanFiles | 50 | public List<CleanFilesNode> CleanFiles |
51 | { | 51 | { |
52 | get | 52 | get |
53 | { | 53 | { |
54 | return m_CleanFiles; | 54 | return m_CleanFiles; |
55 | } | 55 | } |
56 | } | 56 | } |
57 | 57 | ||
58 | #endregion | 58 | #endregion |
59 | 59 | ||
60 | #region Public Methods | 60 | #region Public Methods |
61 | 61 | ||
62 | /// <summary> | 62 | /// <summary> |
63 | /// Parses the specified node. | 63 | /// Parses the specified node. |
64 | /// </summary> | 64 | /// </summary> |
65 | /// <param name="node">The node.</param> | 65 | /// <param name="node">The node.</param> |
66 | public override void Parse(XmlNode node) | 66 | public override void Parse(XmlNode node) |
67 | { | 67 | { |
68 | if( node == null ) | 68 | if( node == null ) |
69 | { | 69 | { |
70 | throw new ArgumentNullException("node"); | 70 | throw new ArgumentNullException("node"); |
71 | } | 71 | } |
72 | 72 | ||
73 | foreach (XmlNode child in node.ChildNodes) | 73 | foreach (XmlNode child in node.ChildNodes) |
74 | { | 74 | { |
75 | IDataNode dataNode = Kernel.Instance.ParseNode(child, this); | 75 | IDataNode dataNode = Kernel.Instance.ParseNode(child, this); |
76 | if (dataNode is CleanFilesNode) | 76 | if (dataNode is CleanFilesNode) |
77 | { | 77 | { |
78 | m_CleanFiles.Add((CleanFilesNode)dataNode); | 78 | m_CleanFiles.Add((CleanFilesNode)dataNode); |
79 | } | 79 | } |
80 | } | 80 | } |
81 | } | 81 | } |
82 | 82 | ||
83 | #endregion | 83 | #endregion |
84 | } | 84 | } |
85 | } \ No newline at end of file | 85 | } \ No newline at end of file |
diff --git a/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs index 1c38d9e..7c59ac5 100644 --- a/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs +++ b/Prebuild/src/Core/Nodes/ConfigurationNodeCollection.cs | |||
@@ -1,71 +1,71 @@ | |||
1 | #region BSD License | 1 | #region BSD License |
2 | /* | 2 | /* |
3 | Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) | 3 | Copyright (c) 2004-2005 Matthew Holmes (matthew@wildfiregames.com), Dan Moorehead (dan05a@gmail.com) |
4 | 4 | ||
5 | Redistribution and use in source and binary forms, with or without modification, are permitted | 5 | Redistribution and use in source and binary forms, with or without modification, are permitted |
6 | provided that the following conditions are met: | 6 | provided that the following conditions are met: |
7 | 7 | ||
8 | * Redistributions of source code must retain the above copyright notice, this list of conditions | 8 | * Redistributions of source code must retain the above copyright notice, this list of conditions |
9 | and the following disclaimer. | 9 | and the following disclaimer. |
10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions | 10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
11 | and the following disclaimer in the documentation and/or other materials provided with the | 11 | and the following disclaimer in the documentation and/or other materials provided with the |
12 | distribution. | 12 | distribution. |
13 | * The name of the author may not be used to endorse or promote products derived from this software | 13 | * The name of the author may not be used to endorse or promote products derived from this software |
14 | without specific prior written permission. | 14 | without specific prior written permission. |
15 | 15 | ||
16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
23 | */ | 23 | */ |
24 | #endregion | 24 | #endregion |
25 | 25 | ||
26 | using System.Collections.Generic; | 26 | using System.Collections.Generic; |
27 | 27 | ||
28 | namespace Prebuild.Core.Nodes | 28 | namespace Prebuild.Core.Nodes |
29 | { | 29 | { |
30 | /// <summary> | 30 | /// <summary> |
31 | /// Implements a specialized list of configuration nodes which allows for lookup via | 31 | /// Implements a specialized list of configuration nodes which allows for lookup via |
32 | /// configuration name and platform. | 32 | /// configuration name and platform. |
33 | /// </summary> | 33 | /// </summary> |
34 | public class ConfigurationNodeCollection : List<ConfigurationNode> | 34 | public class ConfigurationNodeCollection : List<ConfigurationNode> |
35 | { | 35 | { |
36 | #region Properties | 36 | #region Properties |
37 | 37 | ||
38 | public ConfigurationNode this[string nameAndPlatform] | 38 | public ConfigurationNode this[string nameAndPlatform] |
39 | { | 39 | { |
40 | get | 40 | get |
41 | { | 41 | { |
42 | foreach (ConfigurationNode configurationNode in this) | 42 | foreach (ConfigurationNode configurationNode in this) |
43 | { | 43 | { |
44 | if (configurationNode.NameAndPlatform == nameAndPlatform) | 44 | if (configurationNode.NameAndPlatform == nameAndPlatform) |
45 | { | 45 | { |
46 | return configurationNode; | 46 | return configurationNode; |
47 | } | 47 | } |
48 | } | 48 | } |
49 | 49 | ||
50 | return null; | 50 | return null; |
51 | } | 51 | } |
52 | 52 | ||
53 | set | 53 | set |
54 | { | 54 | { |
55 | // See if the node | 55 | // See if the node |
56 | ConfigurationNode configurationNode = this[nameAndPlatform]; | 56 | ConfigurationNode configurationNode = this[nameAndPlatform]; |
57 | 57 | ||
58 | if (configurationNode != null) | 58 | if (configurationNode != null) |
59 | { | 59 | { |
60 | this[IndexOf(configurationNode)] = value; | 60 | this[IndexOf(configurationNode)] = value; |
61 | } | 61 | } |
62 | else | 62 | else |
63 | { | 63 | { |
64 | Add(value); | 64 | Add(value); |
65 | } | 65 | } |
66 | } | 66 | } |
67 | } | 67 | } |
68 | 68 | ||
69 | #endregion | 69 | #endregion |
70 | } | 70 | } |
71 | } | 71 | } |
diff --git a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs index 278ecd8..20095c3 100644 --- a/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs +++ b/Prebuild/src/Core/Nodes/DatabaseProjectNode.cs | |||
@@ -1,93 +1,93 @@ | |||
1 | using System; | 1 | using System; |
2 | using System.Collections.Generic; | 2 | using System.Collections.Generic; |
3 | using System.Text; | 3 | using System.Text; |
4 | using System.Xml; | 4 | using System.Xml; |
5 | 5 | ||
6 | using Prebuild.Core.Attributes; | 6 | using Prebuild.Core.Attributes; |
7 | using Prebuild.Core.Interfaces; | 7 | using Prebuild.Core.Interfaces; |
8 | using Prebuild.Core.Utilities; | 8 | using Prebuild.Core.Utilities; |
9 | 9 | ||
10 | namespace Prebuild.Core.Nodes | 10 | namespace Prebuild.Core.Nodes |
11 | { | 11 | { |
12 | [DataNode("DatabaseProject")] | 12 | [DataNode("DatabaseProject")] |
13 | public class DatabaseProjectNode : DataNode | 13 | public class DatabaseProjectNode : DataNode |
14 | { | 14 | { |
15 | string name; | 15 | string name; |
16 | string path; | 16 | string path; |
17 | string fullpath; | 17 | string fullpath; |
18 | Guid guid = Guid.NewGuid(); | 18 | Guid guid = Guid.NewGuid(); |
19 | readonly List<AuthorNode> authors = new List<AuthorNode>(); | 19 | readonly List<AuthorNode> authors = new List<AuthorNode>(); |
20 | readonly List<DatabaseReferenceNode> references = new List<DatabaseReferenceNode>(); | 20 | readonly List<DatabaseReferenceNode> references = new List<DatabaseReferenceNode>(); |
21 | 21 | ||
22 | public Guid Guid | 22 | public Guid Guid |
23 | { | 23 | { |
24 | get { return guid; } | 24 | get { return guid; } |
25 | } | 25 | } |
26 | 26 | ||
27 | public string Name | 27 | public string Name |
28 | { | 28 | { |
29 | get { return name; } | 29 | get { return name; } |
30 | } | 30 | } |
31 | 31 | ||
32 | public string Path | 32 | public string Path |
33 | { | 33 | { |
34 | get { return path; } | 34 | get { return path; } |
35 | } | 35 | } |
36 | 36 | ||
37 | public string FullPath | 37 | public string FullPath |
38 | { | 38 | { |
39 | get { return fullpath; } | 39 | get { return fullpath; } |
40 | } | 40 | } |
41 | 41 | ||
42 | public IEnumerable<DatabaseReferenceNode> References | 42 | public IEnumerable<DatabaseReferenceNode> References |
43 | { | 43 | { |
44 | get { return references; } | 44 | get { return references; } |
45 | } | 45 | } |
46 | 46 | ||
47 | public override void Parse(XmlNode node) | 47 | public override void Parse(XmlNode node) |
48 | { | 48 | { |
49 | name = Helper.AttributeValue(node, "name", name); | 49 | name = Helper.AttributeValue(node, "name", name); |
50 | path = Helper.AttributeValue(node, "path", name); | 50 | path = Helper.AttributeValue(node, "path", name); |
51 | 51 | ||
52 | try | 52 | try |
53 | { | 53 | { |
54 | fullpath = Helper.ResolvePath(path); | 54 | fullpath = Helper.ResolvePath(path); |
55 | } | 55 | } |
56 | catch | 56 | catch |
57 | { | 57 | { |
58 | throw new WarningException("Could not resolve Solution path: {0}", path); | 58 | throw new WarningException("Could not resolve Solution path: {0}", path); |
59 | } | 59 | } |
60 | 60 | ||
61 | Kernel.Instance.CurrentWorkingDirectory.Push(); | 61 | Kernel.Instance.CurrentWorkingDirectory.Push(); |
62 | 62 | ||
63 | try | 63 | try |
64 | { | 64 | { |
65 | Helper.SetCurrentDir(fullpath); | 65 | Helper.SetCurrentDir(fullpath); |
66 | 66 | ||
67 | if (node == null) | 67 | if (node == null) |
68 | { | 68 | { |
69 | throw new ArgumentNullException("node"); | 69 | throw new ArgumentNullException("node"); |
70 | } | 70 | } |
71 | 71 | ||
72 | foreach (XmlNode child in node.ChildNodes) | 72 | foreach (XmlNode child in node.ChildNodes) |
73 | { | 73 | { |
74 | IDataNode dataNode = Kernel.Instance.ParseNode(child, this); | 74 | IDataNode dataNode = Kernel.Instance.ParseNode(child, this); |
75 | 75 | ||
76 | if (dataNode == null) | 76 | if (dataNode == null) |
77 | continue; | 77 | continue; |
78 | 78 | ||
79 | if (dataNode is AuthorNode) | 79 | if (dataNode is AuthorNode) |
80 | authors.Add((AuthorNode)dataNode); | 80 | authors.Add((AuthorNode)dataNode); |
81 | else if (dataNode is DatabaseReferenceNode) | 81 | else if (dataNode is DatabaseReferenceNode) |
82 | references.Add((DatabaseReferenceNode)dataNode); | 82 | references.Add((DatabaseReferenceNode)dataNode); |
83 | } | 83 | } |
84 | } | 84 | } |
85 | finally | 85 | finally |
86 | { | 86 | { |
87 | Kernel.Instance.CurrentWorkingDirectory.Pop(); | 87 | Kernel.Instance.CurrentWorkingDirectory.Pop(); |
88 | } | 88 | } |
89 | 89 | ||
90 | base.Parse(node); | 90 | base.Parse(node); |
91 | } | 91 | } |
92 | } | 92 | } |
93 | } | 93 | } |
diff --git a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs index 845db24..97c3964 100644 --- a/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs +++ b/Prebuild/src/Core/Nodes/DatabaseReferenceNode.cs | |||
@@ -1,63 +1,63 @@ | |||
1 | using System; | 1 | using System; |
2 | using Prebuild.Core.Attributes; | 2 | using Prebuild.Core.Attributes; |
3 | using Prebuild.Core.Utilities; | 3 | using Prebuild.Core.Utilities; |
4 | 4 | ||
5 | namespace Prebuild.Core.Nodes | 5 | namespace Prebuild.Core.Nodes |
6 | { | 6 | { |
7 | [DataNode("DatabaseReference")] | 7 | [DataNode("DatabaseReference")] |
8 | public class DatabaseReferenceNode : DataNode | 8 | public class DatabaseReferenceNode : DataNode |
9 | { | 9 | { |
10 | string name; | 10 | string name; |
11 | Guid providerId; | 11 | Guid providerId; |
12 | string connectionString; | 12 | string connectionString; |
13 | 13 | ||
14 | public string Name | 14 | public string Name |
15 | { | 15 | { |
16 | get { return name; } | 16 | get { return name; } |
17 | } | 17 | } |
18 | 18 | ||
19 | public Guid ProviderId | 19 | public Guid ProviderId |
20 | { | 20 | { |
21 | get { return providerId; } | 21 | get { return providerId; } |
22 | } | 22 | } |
23 | 23 | ||
24 | public string ConnectionString | 24 | public string ConnectionString |
25 | { | 25 | { |
26 | get { return connectionString; } | 26 | get { return connectionString; } |
27 | } | 27 | } |
28 | 28 | ||
29 | public override void Parse(System.Xml.XmlNode node) | 29 | public override void Parse(System.Xml.XmlNode node) |
30 | { | 30 | { |
31 | name = Helper.AttributeValue(node, "name", name); | 31 | name = Helper.AttributeValue(node, "name", name); |
32 | 32 | ||
33 | string providerName = Helper.AttributeValue(node, "providerName", string.Empty); | 33 | string providerName = Helper.AttributeValue(node, "providerName", string.Empty); |
34 | if (providerName != null) | 34 | if (providerName != null) |
35 | { | 35 | { |
36 | switch (providerName) | 36 | switch (providerName) |
37 | { | 37 | { |
38 | // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* | 38 | // digitaljeebus: pulled from HKLM\SOFTWARE\Microsoft\VisualStudio\9.0\DataProviders\* |
39 | // Not sure if these will help other operating systems, or if there's a better way. | 39 | // Not sure if these will help other operating systems, or if there's a better way. |
40 | case "Microsoft.SqlServerCe.Client.3.5": | 40 | case "Microsoft.SqlServerCe.Client.3.5": |
41 | providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; | 41 | providerId = new Guid("7C602B5B-ACCB-4acd-9DC0-CA66388C1533"); break; |
42 | case "System.Data.OleDb": | 42 | case "System.Data.OleDb": |
43 | providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; | 43 | providerId = new Guid("7F041D59-D76A-44ed-9AA2-FBF6B0548B80"); break; |
44 | case "System.Data.OracleClient": | 44 | case "System.Data.OracleClient": |
45 | providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; | 45 | providerId = new Guid("8F5C5018-AE09-42cf-B2CC-2CCCC7CFC2BB"); break; |
46 | case "System.Data.SqlClient": | 46 | case "System.Data.SqlClient": |
47 | providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; | 47 | providerId = new Guid("91510608-8809-4020-8897-FBA057E22D54"); break; |
48 | case "System.Data.Odbc": | 48 | case "System.Data.Odbc": |
49 | providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; | 49 | providerId = new Guid("C3D4F4CE-2C48-4381-B4D6-34FA50C51C86"); break; |
50 | 50 | ||
51 | default: | 51 | default: |
52 | throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); | 52 | throw new ArgumentOutOfRangeException("providerName", providerName, "Could not provider name to an id."); |
53 | } | 53 | } |
54 | } | 54 | } |
55 | else | 55 | else |
56 | providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); | 56 | providerId = new Guid(Helper.AttributeValue(node, "providerId", Guid.Empty.ToString("B"))); |
57 | 57 | ||
58 | connectionString = Helper.AttributeValue(node, "connectionString", connectionString); | 58 | connectionString = Helper.AttributeValue(node, "connectionString", connectionString); |
59 | 59 | ||
60 | base.Parse(node); | 60 | base.Parse(node); |
61 | } | 61 | } |
62 | } | 62 | } |
63 | } | 63 | } |
diff --git a/Prebuild/src/Core/Nodes/FileNode.cs b/Prebuild/src/Core/Nodes/FileNode.cs index 01cea1e..b313ffa 100644 --- a/Prebuild/src/Core/Nodes/FileNode.cs +++ b/Prebuild/src/Core/Nodes/FileNode.cs | |||
@@ -62,7 +62,11 @@ namespace Prebuild.Core.Nodes | |||
62 | /// <summary> | 62 | /// <summary> |
63 | /// | 63 | /// |
64 | /// </summary> | 64 | /// </summary> |
65 | Page | 65 | Page, |
66 | /// <summary> | ||
67 | /// | ||
68 | /// </summary> | ||
69 | Copy | ||
66 | } | 70 | } |
67 | 71 | ||
68 | /// <summary> | 72 | /// <summary> |
@@ -245,6 +249,9 @@ namespace Prebuild.Core.Nodes | |||
245 | if (subType != String.Empty) | 249 | if (subType != String.Empty) |
246 | m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); | 250 | m_SubType = (SubType)Enum.Parse(typeof(SubType), subType); |
247 | 251 | ||
252 | Console.WriteLine("[FileNode]:BuildAction is {0}", buildAction); | ||
253 | |||
254 | |||
248 | m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); | 255 | m_ResourceName = Helper.AttributeValue(node, "resourceName", m_ResourceName.ToString()); |
249 | this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); | 256 | this.m_Link = bool.Parse(Helper.AttributeValue(node, "link", bool.FalseString)); |
250 | if ( this.m_Link == true ) | 257 | if ( this.m_Link == true ) |
diff --git a/Prebuild/src/Core/Nodes/FilesNode.cs b/Prebuild/src/Core/Nodes/FilesNode.cs index 23a716c..16658f3 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 | |||
25 | 25 | ||
26 | using System; | 26 | using System; |
27 | using System.Collections.Generic; | 27 | using System.Collections.Generic; |
28 | using System.Collections.Specialized; | ||
28 | using System.Xml; | 29 | using System.Xml; |
29 | 30 | ||
30 | using Prebuild.Core.Attributes; | 31 | using Prebuild.Core.Attributes; |
@@ -49,6 +50,8 @@ namespace Prebuild.Core.Nodes | |||
49 | private readonly Dictionary<string, bool> m_Links = new Dictionary<string, bool>(); | 50 | private readonly Dictionary<string, bool> m_Links = new Dictionary<string, bool>(); |
50 | private readonly Dictionary<string, string> m_LinkPaths = new Dictionary<string, string>(); | 51 | private readonly Dictionary<string, string> m_LinkPaths = new Dictionary<string, string>(); |
51 | private readonly Dictionary<string, bool> m_PreservePaths = new Dictionary<string, bool>(); | 52 | private readonly Dictionary<string, bool> m_PreservePaths = new Dictionary<string, bool>(); |
53 | private readonly Dictionary<string, string> m_DestinationPath = new Dictionary<string, string>(); | ||
54 | private readonly NameValueCollection m_CopyFiles = new NameValueCollection(); | ||
52 | 55 | ||
53 | #endregion | 56 | #endregion |
54 | 57 | ||
@@ -62,6 +65,16 @@ namespace Prebuild.Core.Nodes | |||
62 | } | 65 | } |
63 | } | 66 | } |
64 | 67 | ||
68 | public string[] Destinations | ||
69 | { | ||
70 | get { return m_CopyFiles.AllKeys; } | ||
71 | } | ||
72 | |||
73 | public int CopyFiles | ||
74 | { | ||
75 | get { return m_CopyFiles.Count; } | ||
76 | } | ||
77 | |||
65 | #endregion | 78 | #endregion |
66 | 79 | ||
67 | #region Public Methods | 80 | #region Public Methods |
@@ -76,6 +89,20 @@ namespace Prebuild.Core.Nodes | |||
76 | return m_BuildActions[file]; | 89 | return m_BuildActions[file]; |
77 | } | 90 | } |
78 | 91 | ||
92 | public string GetDestinationPath(string file) | ||
93 | { | ||
94 | if( !m_DestinationPath.ContainsKey(file)) | ||
95 | { | ||
96 | return null; | ||
97 | } | ||
98 | return m_DestinationPath[file]; | ||
99 | } | ||
100 | |||
101 | public string[] SourceFiles(string dest) | ||
102 | { | ||
103 | return m_CopyFiles.GetValues(dest); | ||
104 | } | ||
105 | |||
79 | public CopyToOutput GetCopyToOutput(string file) | 106 | public CopyToOutput GetCopyToOutput(string file) |
80 | { | 107 | { |
81 | if (!m_CopyToOutputs.ContainsKey(file)) | 108 | if (!m_CopyToOutputs.ContainsKey(file)) |
@@ -178,6 +205,13 @@ namespace Prebuild.Core.Nodes | |||
178 | m_BuildActions[file] = GetBuildActionByFileName(file); | 205 | m_BuildActions[file] = GetBuildActionByFileName(file); |
179 | else | 206 | else |
180 | m_BuildActions[file] = matchNode.BuildAction.Value; | 207 | m_BuildActions[file] = matchNode.BuildAction.Value; |
208 | |||
209 | if (matchNode.BuildAction == BuildAction.Copy) | ||
210 | { | ||
211 | m_CopyFiles.Add(matchNode.DestinationPath, file); | ||
212 | m_DestinationPath[file] = matchNode.DestinationPath; | ||
213 | } | ||
214 | |||
181 | m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; | 215 | m_SubTypes[file] = matchNode.SubType == null ? GetSubTypeByFileName(file) : matchNode.SubType.Value; |
182 | m_ResourceNames[ file ] = matchNode.ResourceName; | 216 | m_ResourceNames[ file ] = matchNode.ResourceName; |
183 | m_PreservePaths[ file ] = matchNode.PreservePath; | 217 | m_PreservePaths[ file ] = matchNode.PreservePath; |
diff --git a/Prebuild/src/Core/Nodes/MatchNode.cs b/Prebuild/src/Core/Nodes/MatchNode.cs index 9735265..000bde9 100644 --- a/Prebuild/src/Core/Nodes/MatchNode.cs +++ b/Prebuild/src/Core/Nodes/MatchNode.cs | |||
@@ -52,6 +52,7 @@ namespace Prebuild.Core.Nodes | |||
52 | private bool m_Link; | 52 | private bool m_Link; |
53 | private string m_LinkPath; | 53 | private string m_LinkPath; |
54 | private bool m_PreservePath; | 54 | private bool m_PreservePath; |
55 | private string m_Destination = ""; | ||
55 | private readonly List<ExcludeNode> m_Exclusions = new List<ExcludeNode>(); | 56 | private readonly List<ExcludeNode> m_Exclusions = new List<ExcludeNode>(); |
56 | 57 | ||
57 | #endregion | 58 | #endregion |
@@ -80,6 +81,13 @@ namespace Prebuild.Core.Nodes | |||
80 | } | 81 | } |
81 | } | 82 | } |
82 | 83 | ||
84 | public string DestinationPath | ||
85 | { | ||
86 | get | ||
87 | { | ||
88 | return m_Destination; | ||
89 | } | ||
90 | } | ||
83 | /// <summary> | 91 | /// <summary> |
84 | /// | 92 | /// |
85 | /// </summary> | 93 | /// </summary> |
@@ -285,12 +293,14 @@ namespace Prebuild.Core.Nodes | |||
285 | } | 293 | } |
286 | string path = Helper.AttributeValue(node, "path", "."); | 294 | string path = Helper.AttributeValue(node, "path", "."); |
287 | string pattern = Helper.AttributeValue(node, "pattern", "*"); | 295 | string pattern = Helper.AttributeValue(node, "pattern", "*"); |
296 | string destination = Helper.AttributeValue(node, "destination", string.Empty); | ||
288 | bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); | 297 | bool recurse = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "recurse", "false")); |
289 | bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); | 298 | bool useRegex = (bool)Helper.TranslateValue(typeof(bool), Helper.AttributeValue(node, "useRegex", "false")); |
290 | string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); | 299 | string buildAction = Helper.AttributeValue(node, "buildAction", String.Empty); |
291 | if (buildAction != string.Empty) | 300 | if (buildAction != string.Empty) |
292 | m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); | 301 | m_BuildAction = (BuildAction)Enum.Parse(typeof(BuildAction), buildAction); |
293 | 302 | ||
303 | |||
294 | //TODO: Figure out where the subtype node is being assigned | 304 | //TODO: Figure out where the subtype node is being assigned |
295 | //string subType = Helper.AttributeValue(node, "subType", string.Empty); | 305 | //string subType = Helper.AttributeValue(node, "subType", string.Empty); |
296 | //if (subType != String.Empty) | 306 | //if (subType != String.Empty) |
@@ -304,11 +314,12 @@ namespace Prebuild.Core.Nodes | |||
304 | } | 314 | } |
305 | m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); | 315 | m_PreservePath = bool.Parse( Helper.AttributeValue( node, "preservePath", bool.FalseString ) ); |
306 | 316 | ||
317 | if ( buildAction == "Copy") | ||
318 | m_Destination = destination; | ||
307 | 319 | ||
308 | if(path != null && path.Length == 0) | 320 | if(path != null && path.Length == 0) |
309 | { | ||
310 | path = ".";//use current directory | 321 | path = ".";//use current directory |
311 | } | 322 | |
312 | //throw new WarningException("Match must have a 'path' attribute"); | 323 | //throw new WarningException("Match must have a 'path' attribute"); |
313 | 324 | ||
314 | if(pattern == null) | 325 | if(pattern == null) |
diff --git a/Prebuild/src/Core/Targets/AutotoolsTarget.cs b/Prebuild/src/Core/Targets/AutotoolsTarget.cs index 485e4dd..e46b5a5 100644 --- a/Prebuild/src/Core/Targets/AutotoolsTarget.cs +++ b/Prebuild/src/Core/Targets/AutotoolsTarget.cs | |||
@@ -1,1070 +1,1070 @@ | |||
1 | #region BSD License | 1 | #region BSD License |
2 | /* | 2 | /* |
3 | 3 | ||
4 | Copyright (c) 2004 - 2008 | 4 | Copyright (c) 2004 - 2008 |
5 | Matthew Holmes (matthew@wildfiregames.com), | 5 | Matthew Holmes (matthew@wildfiregames.com), |
6 | Dan Moorehead (dan05a@gmail.com), | 6 | Dan Moorehead (dan05a@gmail.com), |
7 | Dave Hudson (jendave@yahoo.com), | 7 | Dave Hudson (jendave@yahoo.com), |
8 | C.J. Adams-Collier (cjac@colliertech.org), | 8 | C.J. Adams-Collier (cjac@colliertech.org), |
9 | 9 | ||
10 | Redistribution and use in source and binary forms, with or without | 10 | Redistribution and use in source and binary forms, with or without |
11 | modification, are permitted provided that the following conditions are | 11 | modification, are permitted provided that the following conditions are |
12 | met: | 12 | met: |
13 | 13 | ||
14 | * Redistributions of source code must retain the above copyright | 14 | * Redistributions of source code must retain the above copyright |
15 | notice, this list of conditions and the following disclaimer. | 15 | notice, this list of conditions and the following disclaimer. |
16 | 16 | ||
17 | * Redistributions in binary form must reproduce the above copyright | 17 | * Redistributions in binary form must reproduce the above copyright |
18 | notice, this list of conditions and the following disclaimer in the | 18 | notice, this list of conditions and the following disclaimer in the |
19 | documentation and/or other materials provided with the distribution. | 19 | documentation and/or other materials provided with the distribution. |
20 | 20 | ||
21 | * The name of the author may not be used to endorse or promote | 21 | * The name of the author may not be used to endorse or promote |
22 | products derived from this software without specific prior written | 22 | products derived from this software without specific prior written |
23 | permission. | 23 | permission. |
24 | 24 | ||
25 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | 25 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
26 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 26 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
27 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 27 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
28 | DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, | 28 | DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, |
29 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 29 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
30 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 30 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
31 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 31 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
32 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | 32 | HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
33 | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 33 | STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
34 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 34 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
35 | POSSIBILITY OF SUCH DAMAGE. | 35 | POSSIBILITY OF SUCH DAMAGE. |
36 | 36 | ||
37 | */ | 37 | */ |
38 | #endregion | 38 | #endregion |
39 | 39 | ||
40 | #region MIT X11 license | 40 | #region MIT X11 license |
41 | 41 | ||
42 | /* | 42 | /* |
43 | Portions of this file authored by Lluis Sanchez Gual | 43 | Portions of this file authored by Lluis Sanchez Gual |
44 | 44 | ||
45 | Copyright (C) 2006 Novell, Inc (http://www.novell.com) | 45 | Copyright (C) 2006 Novell, Inc (http://www.novell.com) |
46 | 46 | ||
47 | Permission is hereby granted, free of charge, to any person obtaining | 47 | Permission is hereby granted, free of charge, to any person obtaining |
48 | a copy of this software and associated documentation files (the | 48 | a copy of this software and associated documentation files (the |
49 | "Software"), to deal in the Software without restriction, including | 49 | "Software"), to deal in the Software without restriction, including |
50 | without limitation the rights to use, copy, modify, merge, publish, | 50 | without limitation the rights to use, copy, modify, merge, publish, |
51 | distribute, sublicense, and/or sell copies of the Software, and to | 51 | distribute, sublicense, and/or sell copies of the Software, and to |
52 | permit persons to whom the Software is furnished to do so, subject to | 52 | permit persons to whom the Software is furnished to do so, subject to |
53 | the following conditions: | 53 | the following conditions: |
54 | 54 | ||
55 | The above copyright notice and this permission notice shall be | 55 | The above copyright notice and this permission notice shall be |
56 | included in all copies or substantial portions of the Software. | 56 | included in all copies or substantial portions of the Software. |
57 | 57 | ||
58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | 58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
59 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 59 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
60 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 60 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
61 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | 61 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
62 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | 62 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
63 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | 63 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
64 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 64 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
65 | */ | 65 | */ |
66 | 66 | ||
67 | #endregion | 67 | #endregion |
68 | using System; | 68 | using System; |
69 | using System.Collections.Generic; | 69 | using System.Collections.Generic; |
70 | using System.IO; | 70 | using System.IO; |
71 | using System.Reflection; | 71 | using System.Reflection; |
72 | using System.Text; | 72 | using System.Text; |
73 | using System.Text.RegularExpressions; | 73 | using System.Text.RegularExpressions; |
74 | using System.Xml; | 74 | using System.Xml; |
75 | using System.Xml.Xsl; | 75 | using System.Xml.Xsl; |
76 | using System.Net; | 76 | using System.Net; |
77 | using System.Diagnostics; | 77 | using System.Diagnostics; |
78 | 78 | ||
79 | using Prebuild.Core.Attributes; | 79 | using Prebuild.Core.Attributes; |
80 | using Prebuild.Core.Interfaces; | 80 | using Prebuild.Core.Interfaces; |
81 | using Prebuild.Core.Nodes; | 81 | using Prebuild.Core.Nodes; |
82 | using Prebuild.Core.Utilities; | 82 | using Prebuild.Core.Utilities; |
83 | 83 | ||
84 | namespace Prebuild.Core.Targets | 84 | namespace Prebuild.Core.Targets |
85 | { | 85 | { |
86 | public enum ClrVersion | 86 | public enum ClrVersion |
87 | { | 87 | { |
88 | Default, | 88 | Default, |
89 | Net_1_1, | 89 | Net_1_1, |
90 | Net_2_0 | 90 | Net_2_0 |
91 | } | 91 | } |
92 | 92 | ||
93 | public class SystemPackage | 93 | public class SystemPackage |
94 | { | 94 | { |
95 | string name; | 95 | string name; |
96 | string version; | 96 | string version; |
97 | string description; | 97 | string description; |
98 | string[] assemblies; | 98 | string[] assemblies; |
99 | bool isInternal; | 99 | bool isInternal; |
100 | ClrVersion targetVersion; | 100 | ClrVersion targetVersion; |
101 | 101 | ||
102 | public void Initialize(string name, | 102 | public void Initialize(string name, |
103 | string version, | 103 | string version, |
104 | string description, | 104 | string description, |
105 | string[] assemblies, | 105 | string[] assemblies, |
106 | ClrVersion targetVersion, | 106 | ClrVersion targetVersion, |
107 | bool isInternal) | 107 | bool isInternal) |
108 | { | 108 | { |
109 | this.isInternal = isInternal; | 109 | this.isInternal = isInternal; |
110 | this.name = name; | 110 | this.name = name; |
111 | this.version = version; | 111 | this.version = version; |
112 | this.assemblies = assemblies; | 112 | this.assemblies = assemblies; |
113 | this.description = description; | 113 | this.description = description; |
114 | this.targetVersion = targetVersion; | 114 | this.targetVersion = targetVersion; |
115 | } | 115 | } |
116 | 116 | ||
117 | public string Name | 117 | public string Name |
118 | { | 118 | { |
119 | get { return name; } | 119 | get { return name; } |
120 | } | 120 | } |
121 | 121 | ||
122 | public string Version | 122 | public string Version |
123 | { | 123 | { |
124 | get { return version; } | 124 | get { return version; } |
125 | } | 125 | } |
126 | 126 | ||
127 | public string Description | 127 | public string Description |
128 | { | 128 | { |
129 | get { return description; } | 129 | get { return description; } |
130 | } | 130 | } |
131 | 131 | ||
132 | public ClrVersion TargetVersion | 132 | public ClrVersion TargetVersion |
133 | { | 133 | { |
134 | get { return targetVersion; } | 134 | get { return targetVersion; } |
135 | } | 135 | } |
136 | 136 | ||
137 | // The package is part of the mono SDK | 137 | // The package is part of the mono SDK |
138 | public bool IsCorePackage | 138 | public bool IsCorePackage |
139 | { | 139 | { |
140 | get { return name == "mono"; } | 140 | get { return name == "mono"; } |
141 | } | 141 | } |
142 | 142 | ||
143 | // The package has been registered by an add-in, and is not installed | 143 | // The package has been registered by an add-in, and is not installed |
144 | // in the system. | 144 | // in the system. |
145 | public bool IsInternalPackage | 145 | public bool IsInternalPackage |
146 | { | 146 | { |
147 | get { return isInternal; } | 147 | get { return isInternal; } |
148 | } | 148 | } |
149 | 149 | ||
150 | public string[] Assemblies | 150 | public string[] Assemblies |
151 | { | 151 | { |
152 | get { return assemblies; } | 152 | get { return assemblies; } |
153 | } | 153 | } |
154 | 154 | ||
155 | } | 155 | } |
156 | 156 | ||
157 | 157 | ||
158 | /// <summary> | 158 | /// <summary> |
159 | /// | 159 | /// |
160 | /// </summary> | 160 | /// </summary> |
161 | [Target("autotools")] | 161 | [Target("autotools")] |
162 | public class AutotoolsTarget : ITarget | 162 | public class AutotoolsTarget : ITarget |
163 | { | 163 | { |
164 | #region Fields | 164 | #region Fields |
165 | 165 | ||
166 | Kernel m_Kernel; | 166 | Kernel m_Kernel; |
167 | XmlDocument autotoolsDoc; | 167 | XmlDocument autotoolsDoc; |
168 | XmlUrlResolver xr; | 168 | XmlUrlResolver xr; |
169 | System.Security.Policy.Evidence e; | 169 | System.Security.Policy.Evidence e; |
170 | readonly Dictionary<string, SystemPackage> assemblyPathToPackage = new Dictionary<string, SystemPackage>(); | 170 | readonly Dictionary<string, SystemPackage> assemblyPathToPackage = new Dictionary<string, SystemPackage>(); |
171 | readonly Dictionary<string, string> assemblyFullNameToPath = new Dictionary<string, string>(); | 171 | readonly Dictionary<string, string> assemblyFullNameToPath = new Dictionary<string, string>(); |
172 | readonly Dictionary<string, SystemPackage> packagesHash = new Dictionary<string, SystemPackage>(); | 172 | readonly Dictionary<string, SystemPackage> packagesHash = new Dictionary<string, SystemPackage>(); |
173 | readonly List<SystemPackage> packages = new List<SystemPackage>(); | 173 | readonly List<SystemPackage> packages = new List<SystemPackage>(); |
174 | 174 | ||
175 | #endregion | 175 | #endregion |
176 | 176 | ||
177 | #region Private Methods | 177 | #region Private Methods |
178 | 178 | ||
179 | private static void mkdirDashP(string dirName) | 179 | private static void mkdirDashP(string dirName) |
180 | { | 180 | { |
181 | DirectoryInfo di = new DirectoryInfo(dirName); | 181 | DirectoryInfo di = new DirectoryInfo(dirName); |
182 | if (di.Exists) | 182 | if (di.Exists) |
183 | return; | 183 | return; |
184 | 184 | ||
185 | string parentDirName = System.IO.Path.GetDirectoryName(dirName); | 185 | string parentDirName = System.IO.Path.GetDirectoryName(dirName); |
186 | DirectoryInfo parentDi = new DirectoryInfo(parentDirName); | 186 | DirectoryInfo parentDi = new DirectoryInfo(parentDirName); |
187 | if (!parentDi.Exists) | 187 | if (!parentDi.Exists) |
188 | mkdirDashP(parentDirName); | 188 | mkdirDashP(parentDirName); |
189 | 189 | ||
190 | di.Create(); | 190 | di.Create(); |
191 | } | 191 | } |
192 | 192 | ||
193 | private static void chkMkDir(string dirName) | 193 | private static void chkMkDir(string dirName) |
194 | { | 194 | { |
195 | System.IO.DirectoryInfo di = | 195 | System.IO.DirectoryInfo di = |
196 | new System.IO.DirectoryInfo(dirName); | 196 | new System.IO.DirectoryInfo(dirName); |
197 | 197 | ||
198 | if (!di.Exists) | 198 | if (!di.Exists) |
199 | di.Create(); | 199 | di.Create(); |
200 | } | 200 | } |
201 | 201 | ||
202 | private void transformToFile(string filename, XsltArgumentList argList, string nodeName) | 202 | private void transformToFile(string filename, XsltArgumentList argList, string nodeName) |
203 | { | 203 | { |
204 | // Create an XslTransform for this file | 204 | // Create an XslTransform for this file |
205 | XslTransform templateTransformer = | 205 | XslTransform templateTransformer = |
206 | new XslTransform(); | 206 | new XslTransform(); |
207 | 207 | ||
208 | // Load up the template | 208 | // Load up the template |
209 | XmlNode templateNode = | 209 | XmlNode templateNode = |
210 | autotoolsDoc.SelectSingleNode(nodeName + "/*"); | 210 | autotoolsDoc.SelectSingleNode(nodeName + "/*"); |
211 | templateTransformer.Load(templateNode.CreateNavigator(), xr, e); | 211 | templateTransformer.Load(templateNode.CreateNavigator(), xr, e); |
212 | 212 | ||
213 | // Create a writer for the transformed template | 213 | // Create a writer for the transformed template |
214 | XmlTextWriter templateWriter = | 214 | XmlTextWriter templateWriter = |
215 | new XmlTextWriter(filename, null); | 215 | new XmlTextWriter(filename, null); |
216 | 216 | ||
217 | // Perform transformation, writing the file | 217 | // Perform transformation, writing the file |
218 | templateTransformer.Transform | 218 | templateTransformer.Transform |
219 | (m_Kernel.CurrentDoc, argList, templateWriter, xr); | 219 | (m_Kernel.CurrentDoc, argList, templateWriter, xr); |
220 | } | 220 | } |
221 | 221 | ||
222 | static string NormalizeAsmName(string name) | 222 | static string NormalizeAsmName(string name) |
223 | { | 223 | { |
224 | int i = name.IndexOf(", PublicKeyToken=null"); | 224 | int i = name.IndexOf(", PublicKeyToken=null"); |
225 | if (i != -1) | 225 | if (i != -1) |
226 | return name.Substring(0, i).Trim(); | 226 | return name.Substring(0, i).Trim(); |
227 | return name; | 227 | return name; |
228 | } | 228 | } |
229 | 229 | ||
230 | private void AddAssembly(string assemblyfile, SystemPackage package) | 230 | private void AddAssembly(string assemblyfile, SystemPackage package) |
231 | { | 231 | { |
232 | if (!File.Exists(assemblyfile)) | 232 | if (!File.Exists(assemblyfile)) |
233 | return; | 233 | return; |
234 | 234 | ||
235 | try | 235 | try |
236 | { | 236 | { |
237 | System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); | 237 | System.Reflection.AssemblyName an = System.Reflection.AssemblyName.GetAssemblyName(assemblyfile); |
238 | assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; | 238 | assemblyFullNameToPath[NormalizeAsmName(an.FullName)] = assemblyfile; |
239 | assemblyPathToPackage[assemblyfile] = package; | 239 | assemblyPathToPackage[assemblyfile] = package; |
240 | } | 240 | } |
241 | catch | 241 | catch |
242 | { | 242 | { |
243 | } | 243 | } |
244 | } | 244 | } |
245 | 245 | ||
246 | private static List<string> GetAssembliesWithLibInfo(string line, string file) | 246 | private static List<string> GetAssembliesWithLibInfo(string line, string file) |
247 | { | 247 | { |
248 | List<string> references = new List<string>(); | 248 | List<string> references = new List<string>(); |
249 | List<string> libdirs = new List<string>(); | 249 | List<string> libdirs = new List<string>(); |
250 | List<string> retval = new List<string>(); | 250 | List<string> retval = new List<string>(); |
251 | foreach (string piece in line.Split(' ')) | 251 | foreach (string piece in line.Split(' ')) |
252 | { | 252 | { |
253 | if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) | 253 | if (piece.ToLower().Trim().StartsWith("/r:") || piece.ToLower().Trim().StartsWith("-r:")) |
254 | { | 254 | { |
255 | references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); | 255 | references.Add(ProcessPiece(piece.Substring(3).Trim(), file)); |
256 | } | 256 | } |
257 | else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) | 257 | else if (piece.ToLower().Trim().StartsWith("/lib:") || piece.ToLower().Trim().StartsWith("-lib:")) |
258 | { | 258 | { |
259 | libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); | 259 | libdirs.Add(ProcessPiece(piece.Substring(5).Trim(), file)); |
260 | } | 260 | } |
261 | } | 261 | } |
262 | 262 | ||
263 | foreach (string refrnc in references) | 263 | foreach (string refrnc in references) |
264 | { | 264 | { |
265 | foreach (string libdir in libdirs) | 265 | foreach (string libdir in libdirs) |
266 | { | 266 | { |
267 | if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) | 267 | if (File.Exists(libdir + Path.DirectorySeparatorChar + refrnc)) |
268 | { | 268 | { |
269 | retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); | 269 | retval.Add(libdir + Path.DirectorySeparatorChar + refrnc); |
270 | } | 270 | } |
271 | } | 271 | } |
272 | } | 272 | } |
273 | 273 | ||
274 | return retval; | 274 | return retval; |
275 | } | 275 | } |
276 | 276 | ||
277 | private static List<string> GetAssembliesWithoutLibInfo(string line, string file) | 277 | private static List<string> GetAssembliesWithoutLibInfo(string line, string file) |
278 | { | 278 | { |
279 | List<string> references = new List<string>(); | 279 | List<string> references = new List<string>(); |
280 | foreach (string reference in line.Split(' ')) | 280 | foreach (string reference in line.Split(' ')) |
281 | { | 281 | { |
282 | if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) | 282 | if (reference.ToLower().Trim().StartsWith("/r:") || reference.ToLower().Trim().StartsWith("-r:")) |
283 | { | 283 | { |
284 | string final_ref = reference.Substring(3).Trim(); | 284 | string final_ref = reference.Substring(3).Trim(); |
285 | references.Add(ProcessPiece(final_ref, file)); | 285 | references.Add(ProcessPiece(final_ref, file)); |
286 | } | 286 | } |
287 | } | 287 | } |
288 | return references; | 288 | return references; |
289 | } | 289 | } |
290 | 290 | ||
291 | private static string ProcessPiece(string piece, string pcfile) | 291 | private static string ProcessPiece(string piece, string pcfile) |
292 | { | 292 | { |
293 | int start = piece.IndexOf("${"); | 293 | int start = piece.IndexOf("${"); |
294 | if (start == -1) | 294 | if (start == -1) |
295 | return piece; | 295 | return piece; |
296 | 296 | ||
297 | int end = piece.IndexOf("}"); | 297 | int end = piece.IndexOf("}"); |
298 | if (end == -1) | 298 | if (end == -1) |
299 | return piece; | 299 | return piece; |
300 | 300 | ||
301 | string variable = piece.Substring(start + 2, end - start - 2); | 301 | string variable = piece.Substring(start + 2, end - start - 2); |
302 | string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); | 302 | string interp = GetVariableFromPkgConfig(variable, Path.GetFileNameWithoutExtension(pcfile)); |
303 | return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); | 303 | return ProcessPiece(piece.Replace("${" + variable + "}", interp), pcfile); |
304 | } | 304 | } |
305 | 305 | ||
306 | private static string GetVariableFromPkgConfig(string var, string pcfile) | 306 | private static string GetVariableFromPkgConfig(string var, string pcfile) |
307 | { | 307 | { |
308 | ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); | 308 | ProcessStartInfo psi = new ProcessStartInfo("pkg-config"); |
309 | psi.RedirectStandardOutput = true; | 309 | psi.RedirectStandardOutput = true; |
310 | psi.UseShellExecute = false; | 310 | psi.UseShellExecute = false; |
311 | psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); | 311 | psi.Arguments = String.Format("--variable={0} {1}", var, pcfile); |
312 | Process p = new Process(); | 312 | Process p = new Process(); |
313 | p.StartInfo = psi; | 313 | p.StartInfo = psi; |
314 | p.Start(); | 314 | p.Start(); |
315 | string ret = p.StandardOutput.ReadToEnd().Trim(); | 315 | string ret = p.StandardOutput.ReadToEnd().Trim(); |
316 | p.WaitForExit(); | 316 | p.WaitForExit(); |
317 | if (String.IsNullOrEmpty(ret)) | 317 | if (String.IsNullOrEmpty(ret)) |
318 | return String.Empty; | 318 | return String.Empty; |
319 | return ret; | 319 | return ret; |
320 | } | 320 | } |
321 | 321 | ||
322 | private void ParsePCFile(string pcfile) | 322 | private void ParsePCFile(string pcfile) |
323 | { | 323 | { |
324 | // Don't register the package twice | 324 | // Don't register the package twice |
325 | string pname = Path.GetFileNameWithoutExtension(pcfile); | 325 | string pname = Path.GetFileNameWithoutExtension(pcfile); |
326 | if (packagesHash.ContainsKey(pname)) | 326 | if (packagesHash.ContainsKey(pname)) |
327 | return; | 327 | return; |
328 | 328 | ||
329 | List<string> fullassemblies = null; | 329 | List<string> fullassemblies = null; |
330 | string version = ""; | 330 | string version = ""; |
331 | string desc = ""; | 331 | string desc = ""; |
332 | 332 | ||
333 | SystemPackage package = new SystemPackage(); | 333 | SystemPackage package = new SystemPackage(); |
334 | 334 | ||
335 | using (StreamReader reader = new StreamReader(pcfile)) | 335 | using (StreamReader reader = new StreamReader(pcfile)) |
336 | { | 336 | { |
337 | string line; | 337 | string line; |
338 | while ((line = reader.ReadLine()) != null) | 338 | while ((line = reader.ReadLine()) != null) |
339 | { | 339 | { |
340 | string lowerLine = line.ToLower(); | 340 | string lowerLine = line.ToLower(); |
341 | if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) | 341 | if (lowerLine.StartsWith("libs:") && lowerLine.IndexOf(".dll") != -1) |
342 | { | 342 | { |
343 | string choppedLine = line.Substring(5).Trim(); | 343 | string choppedLine = line.Substring(5).Trim(); |
344 | if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) | 344 | if (choppedLine.IndexOf("-lib:") != -1 || choppedLine.IndexOf("/lib:") != -1) |
345 | { | 345 | { |
346 | fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); | 346 | fullassemblies = GetAssembliesWithLibInfo(choppedLine, pcfile); |
347 | } | 347 | } |
348 | else | 348 | else |
349 | { | 349 | { |
350 | fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); | 350 | fullassemblies = GetAssembliesWithoutLibInfo(choppedLine, pcfile); |
351 | } | 351 | } |
352 | } | 352 | } |
353 | else if (lowerLine.StartsWith("version:")) | 353 | else if (lowerLine.StartsWith("version:")) |
354 | { | 354 | { |
355 | // "version:".Length == 8 | 355 | // "version:".Length == 8 |
356 | version = line.Substring(8).Trim(); | 356 | version = line.Substring(8).Trim(); |
357 | } | 357 | } |
358 | else if (lowerLine.StartsWith("description:")) | 358 | else if (lowerLine.StartsWith("description:")) |
359 | { | 359 | { |
360 | // "description:".Length == 12 | 360 | // "description:".Length == 12 |
361 | desc = line.Substring(12).Trim(); | 361 | desc = line.Substring(12).Trim(); |
362 | } | 362 | } |
363 | } | 363 | } |
364 | } | 364 | } |
365 | 365 | ||
366 | if (fullassemblies == null) | 366 | if (fullassemblies == null) |
367 | return; | 367 | return; |
368 | 368 | ||
369 | foreach (string assembly in fullassemblies) | 369 | foreach (string assembly in fullassemblies) |
370 | { | 370 | { |
371 | AddAssembly(assembly, package); | 371 | AddAssembly(assembly, package); |
372 | } | 372 | } |
373 | 373 | ||
374 | package.Initialize(pname, | 374 | package.Initialize(pname, |
375 | version, | 375 | version, |
376 | desc, | 376 | desc, |
377 | fullassemblies.ToArray(), | 377 | fullassemblies.ToArray(), |
378 | ClrVersion.Default, | 378 | ClrVersion.Default, |
379 | false); | 379 | false); |
380 | packages.Add(package); | 380 | packages.Add(package); |
381 | packagesHash[pname] = package; | 381 | packagesHash[pname] = package; |
382 | } | 382 | } |
383 | 383 | ||
384 | void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) | 384 | void RegisterSystemAssemblies(string prefix, string version, ClrVersion ver) |
385 | { | 385 | { |
386 | SystemPackage package = new SystemPackage(); | 386 | SystemPackage package = new SystemPackage(); |
387 | List<string> list = new List<string>(); | 387 | List<string> list = new List<string>(); |
388 | 388 | ||
389 | string dir = Path.Combine(prefix, version); | 389 | string dir = Path.Combine(prefix, version); |
390 | if (!Directory.Exists(dir)) | 390 | if (!Directory.Exists(dir)) |
391 | { | 391 | { |
392 | return; | 392 | return; |
393 | } | 393 | } |
394 | 394 | ||
395 | foreach (string assembly in Directory.GetFiles(dir, "*.dll")) | 395 | foreach (string assembly in Directory.GetFiles(dir, "*.dll")) |
396 | { | 396 | { |
397 | AddAssembly(assembly, package); | 397 | AddAssembly(assembly, package); |
398 | list.Add(assembly); | 398 | list.Add(assembly); |
399 | } | 399 | } |
400 | 400 | ||
401 | package.Initialize("mono", | 401 | package.Initialize("mono", |
402 | version, | 402 | version, |
403 | "The Mono runtime", | 403 | "The Mono runtime", |
404 | list.ToArray(), | 404 | list.ToArray(), |
405 | ver, | 405 | ver, |
406 | false); | 406 | false); |
407 | packages.Add(package); | 407 | packages.Add(package); |
408 | } | 408 | } |
409 | 409 | ||
410 | void RunInitialization() | 410 | void RunInitialization() |
411 | { | 411 | { |
412 | string versionDir; | 412 | string versionDir; |
413 | 413 | ||
414 | if (Environment.Version.Major == 1) | 414 | if (Environment.Version.Major == 1) |
415 | { | 415 | { |
416 | versionDir = "1.0"; | 416 | versionDir = "1.0"; |
417 | } | 417 | } |
418 | else | 418 | else |
419 | { | 419 | { |
420 | versionDir = "2.0"; | 420 | versionDir = "2.0"; |
421 | } | 421 | } |
422 | 422 | ||
423 | //Pull up assemblies from the installed mono system. | 423 | //Pull up assemblies from the installed mono system. |
424 | string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); | 424 | string prefix = Path.GetDirectoryName(typeof(int).Assembly.Location); |
425 | 425 | ||
426 | if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) | 426 | if (prefix.IndexOf(Path.Combine("mono", versionDir)) == -1) |
427 | prefix = Path.Combine(prefix, "mono"); | 427 | prefix = Path.Combine(prefix, "mono"); |
428 | else | 428 | else |
429 | prefix = Path.GetDirectoryName(prefix); | 429 | prefix = Path.GetDirectoryName(prefix); |
430 | 430 | ||
431 | RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); | 431 | RegisterSystemAssemblies(prefix, "1.0", ClrVersion.Net_1_1); |
432 | RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); | 432 | RegisterSystemAssemblies(prefix, "2.0", ClrVersion.Net_2_0); |
433 | 433 | ||
434 | string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); | 434 | string search_dirs = Environment.GetEnvironmentVariable("PKG_CONFIG_PATH"); |
435 | string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); | 435 | string libpath = Environment.GetEnvironmentVariable("PKG_CONFIG_LIBPATH"); |
436 | 436 | ||
437 | if (String.IsNullOrEmpty(libpath)) | 437 | if (String.IsNullOrEmpty(libpath)) |
438 | { | 438 | { |
439 | string path_dirs = Environment.GetEnvironmentVariable("PATH"); | 439 | string path_dirs = Environment.GetEnvironmentVariable("PATH"); |
440 | foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) | 440 | foreach (string pathdir in path_dirs.Split(Path.PathSeparator)) |
441 | { | 441 | { |
442 | if (pathdir == null) | 442 | if (pathdir == null) |
443 | continue; | 443 | continue; |
444 | if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) | 444 | if (File.Exists(pathdir + Path.DirectorySeparatorChar + "pkg-config")) |
445 | { | 445 | { |
446 | libpath = Path.Combine(pathdir, ".."); | 446 | libpath = Path.Combine(pathdir, ".."); |
447 | libpath = Path.Combine(libpath, "lib"); | 447 | libpath = Path.Combine(libpath, "lib"); |
448 | libpath = Path.Combine(libpath, "pkgconfig"); | 448 | libpath = Path.Combine(libpath, "pkgconfig"); |
449 | break; | 449 | break; |
450 | } | 450 | } |
451 | } | 451 | } |
452 | } | 452 | } |
453 | search_dirs += Path.PathSeparator + libpath; | 453 | search_dirs += Path.PathSeparator + libpath; |
454 | if (!string.IsNullOrEmpty(search_dirs)) | 454 | if (!string.IsNullOrEmpty(search_dirs)) |
455 | { | 455 | { |
456 | List<string> scanDirs = new List<string>(); | 456 | List<string> scanDirs = new List<string>(); |
457 | foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) | 457 | foreach (string potentialDir in search_dirs.Split(Path.PathSeparator)) |
458 | { | 458 | { |
459 | if (!scanDirs.Contains(potentialDir)) | 459 | if (!scanDirs.Contains(potentialDir)) |
460 | scanDirs.Add(potentialDir); | 460 | scanDirs.Add(potentialDir); |
461 | } | 461 | } |
462 | foreach (string pcdir in scanDirs) | 462 | foreach (string pcdir in scanDirs) |
463 | { | 463 | { |
464 | if (pcdir == null) | 464 | if (pcdir == null) |
465 | continue; | 465 | continue; |
466 | 466 | ||
467 | if (Directory.Exists(pcdir)) | 467 | if (Directory.Exists(pcdir)) |
468 | { | 468 | { |
469 | foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) | 469 | foreach (string pcfile in Directory.GetFiles(pcdir, "*.pc")) |
470 | { | 470 | { |
471 | ParsePCFile(pcfile); | 471 | ParsePCFile(pcfile); |
472 | } | 472 | } |
473 | } | 473 | } |
474 | } | 474 | } |
475 | } | 475 | } |
476 | } | 476 | } |
477 | 477 | ||
478 | private void WriteCombine(SolutionNode solution) | 478 | private void WriteCombine(SolutionNode solution) |
479 | { | 479 | { |
480 | #region "Create Solution directory if it doesn't exist" | 480 | #region "Create Solution directory if it doesn't exist" |
481 | string solutionDir = Path.Combine(solution.FullPath, | 481 | string solutionDir = Path.Combine(solution.FullPath, |
482 | Path.Combine("autotools", | 482 | Path.Combine("autotools", |
483 | solution.Name)); | 483 | solution.Name)); |
484 | chkMkDir(solutionDir); | 484 | chkMkDir(solutionDir); |
485 | #endregion | 485 | #endregion |
486 | 486 | ||
487 | #region "Write Solution-level files" | 487 | #region "Write Solution-level files" |
488 | XsltArgumentList argList = new XsltArgumentList(); | 488 | XsltArgumentList argList = new XsltArgumentList(); |
489 | argList.AddParam("solutionName", "", solution.Name); | 489 | argList.AddParam("solutionName", "", solution.Name); |
490 | // $solutionDir is $rootDir/$solutionName/ | 490 | // $solutionDir is $rootDir/$solutionName/ |
491 | transformToFile(Path.Combine(solutionDir, "configure.ac"), | 491 | transformToFile(Path.Combine(solutionDir, "configure.ac"), |
492 | argList, "/Autotools/SolutionConfigureAc"); | 492 | argList, "/Autotools/SolutionConfigureAc"); |
493 | transformToFile(Path.Combine(solutionDir, "Makefile.am"), | 493 | transformToFile(Path.Combine(solutionDir, "Makefile.am"), |
494 | argList, "/Autotools/SolutionMakefileAm"); | 494 | argList, "/Autotools/SolutionMakefileAm"); |
495 | transformToFile(Path.Combine(solutionDir, "autogen.sh"), | 495 | transformToFile(Path.Combine(solutionDir, "autogen.sh"), |
496 | argList, "/Autotools/SolutionAutogenSh"); | 496 | argList, "/Autotools/SolutionAutogenSh"); |
497 | #endregion | 497 | #endregion |
498 | 498 | ||
499 | foreach (ProjectNode project in solution.ProjectsTableOrder) | 499 | foreach (ProjectNode project in solution.ProjectsTableOrder) |
500 | { | 500 | { |
501 | m_Kernel.Log.Write(String.Format("Writing project: {0}", | 501 | m_Kernel.Log.Write(String.Format("Writing project: {0}", |
502 | project.Name)); | 502 | project.Name)); |
503 | WriteProject(solution, project); | 503 | WriteProject(solution, project); |
504 | } | 504 | } |
505 | } | 505 | } |
506 | 506 | ||
507 | private static string FindFileReference(string refName, | 507 | private static string FindFileReference(string refName, |
508 | ProjectNode project) | 508 | ProjectNode project) |
509 | { | 509 | { |
510 | foreach (ReferencePathNode refPath in project.ReferencePaths) | 510 | foreach (ReferencePathNode refPath in project.ReferencePaths) |
511 | { | 511 | { |
512 | string fullPath = | 512 | string fullPath = |
513 | Helper.MakeFilePath(refPath.Path, refName, "dll"); | 513 | Helper.MakeFilePath(refPath.Path, refName, "dll"); |
514 | 514 | ||
515 | if (File.Exists(fullPath)) { | 515 | if (File.Exists(fullPath)) { |
516 | return fullPath; | 516 | return fullPath; |
517 | } | 517 | } |
518 | } | 518 | } |
519 | 519 | ||
520 | return null; | 520 | return null; |
521 | } | 521 | } |
522 | 522 | ||
523 | /// <summary> | 523 | /// <summary> |
524 | /// Gets the XML doc file. | 524 | /// Gets the XML doc file. |
525 | /// </summary> | 525 | /// </summary> |
526 | /// <param name="project">The project.</param> | 526 | /// <param name="project">The project.</param> |
527 | /// <param name="conf">The conf.</param> | 527 | /// <param name="conf">The conf.</param> |
528 | /// <returns></returns> | 528 | /// <returns></returns> |
529 | public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) | 529 | public static string GetXmlDocFile(ProjectNode project, ConfigurationNode conf) |
530 | { | 530 | { |
531 | if (conf == null) | 531 | if (conf == null) |
532 | { | 532 | { |
533 | throw new ArgumentNullException("conf"); | 533 | throw new ArgumentNullException("conf"); |
534 | } | 534 | } |
535 | if (project == null) | 535 | if (project == null) |
536 | { | 536 | { |
537 | throw new ArgumentNullException("project"); | 537 | throw new ArgumentNullException("project"); |
538 | } | 538 | } |
539 | string docFile = (string)conf.Options["XmlDocFile"]; | 539 | string docFile = (string)conf.Options["XmlDocFile"]; |
540 | // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified | 540 | // if(docFile != null && docFile.Length == 0)//default to assembly name if not specified |
541 | // { | 541 | // { |
542 | // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; | 542 | // return Path.GetFileNameWithoutExtension(project.AssemblyName) + ".xml"; |
543 | // } | 543 | // } |
544 | return docFile; | 544 | return docFile; |
545 | } | 545 | } |
546 | 546 | ||
547 | /// <summary> | 547 | /// <summary> |
548 | /// Normalizes the path. | 548 | /// Normalizes the path. |
549 | /// </summary> | 549 | /// </summary> |
550 | /// <param name="path">The path.</param> | 550 | /// <param name="path">The path.</param> |
551 | /// <returns></returns> | 551 | /// <returns></returns> |
552 | public static string NormalizePath(string path) | 552 | public static string NormalizePath(string path) |
553 | { | 553 | { |
554 | if (path == null) | 554 | if (path == null) |
555 | { | 555 | { |
556 | return ""; | 556 | return ""; |
557 | } | 557 | } |
558 | 558 | ||
559 | StringBuilder tmpPath; | 559 | StringBuilder tmpPath; |
560 | 560 | ||
561 | if (Core.Parse.Preprocessor.GetOS() == "Win32") | 561 | if (Core.Parse.Preprocessor.GetOS() == "Win32") |
562 | { | 562 | { |
563 | tmpPath = new StringBuilder(path.Replace('\\', '/')); | 563 | tmpPath = new StringBuilder(path.Replace('\\', '/')); |
564 | tmpPath.Replace("/", @"\\"); | 564 | tmpPath.Replace("/", @"\\"); |
565 | } | 565 | } |
566 | else | 566 | else |
567 | { | 567 | { |
568 | tmpPath = new StringBuilder(path.Replace('\\', '/')); | 568 | tmpPath = new StringBuilder(path.Replace('\\', '/')); |
569 | tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); | 569 | tmpPath = tmpPath.Replace('/', Path.DirectorySeparatorChar); |
570 | } | 570 | } |
571 | return tmpPath.ToString(); | 571 | return tmpPath.ToString(); |
572 | } | 572 | } |
573 | 573 | ||
574 | private void WriteProject(SolutionNode solution, ProjectNode project) | 574 | private void WriteProject(SolutionNode solution, ProjectNode project) |
575 | { | 575 | { |
576 | string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); | 576 | string solutionDir = Path.Combine(solution.FullPath, Path.Combine("autotools", solution.Name)); |
577 | string projectDir = Path.Combine(solutionDir, project.Name); | 577 | string projectDir = Path.Combine(solutionDir, project.Name); |
578 | string projectVersion = project.Version; | 578 | string projectVersion = project.Version; |
579 | bool hasAssemblyConfig = false; | 579 | bool hasAssemblyConfig = false; |
580 | chkMkDir(projectDir); | 580 | chkMkDir(projectDir); |
581 | 581 | ||
582 | List<string> | 582 | List<string> |
583 | compiledFiles = new List<string>(), | 583 | compiledFiles = new List<string>(), |
584 | contentFiles = new List<string>(), | 584 | contentFiles = new List<string>(), |
585 | embeddedFiles = new List<string>(), | 585 | embeddedFiles = new List<string>(), |
586 | 586 | ||
587 | binaryLibs = new List<string>(), | 587 | binaryLibs = new List<string>(), |
588 | pkgLibs = new List<string>(), | 588 | pkgLibs = new List<string>(), |
589 | systemLibs = new List<string>(), | 589 | systemLibs = new List<string>(), |
590 | runtimeLibs = new List<string>(), | 590 | runtimeLibs = new List<string>(), |
591 | 591 | ||
592 | extraDistFiles = new List<string>(), | 592 | extraDistFiles = new List<string>(), |
593 | localCopyTargets = new List<string>(); | 593 | localCopyTargets = new List<string>(); |
594 | 594 | ||
595 | // If there exists a .config file for this assembly, copy | 595 | // If there exists a .config file for this assembly, copy |
596 | // it to the project folder | 596 | // it to the project folder |
597 | 597 | ||
598 | // TODO: Support copying .config.osx files | 598 | // TODO: Support copying .config.osx files |
599 | // TODO: support processing the .config file for native library deps | 599 | // TODO: support processing the .config file for native library deps |
600 | string projectAssemblyName = project.Name; | 600 | string projectAssemblyName = project.Name; |
601 | if (project.AssemblyName != null) | 601 | if (project.AssemblyName != null) |
602 | projectAssemblyName = project.AssemblyName; | 602 | projectAssemblyName = project.AssemblyName; |
603 | 603 | ||
604 | if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) | 604 | if (File.Exists(Path.Combine(project.FullPath, projectAssemblyName) + ".dll.config")) |
605 | { | 605 | { |
606 | hasAssemblyConfig = true; | 606 | hasAssemblyConfig = true; |
607 | System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); | 607 | System.IO.File.Copy(Path.Combine(project.FullPath, projectAssemblyName + ".dll.config"), Path.Combine(projectDir, projectAssemblyName + ".dll.config"), true); |
608 | extraDistFiles.Add(project.AssemblyName + ".dll.config"); | 608 | extraDistFiles.Add(project.AssemblyName + ".dll.config"); |
609 | } | 609 | } |
610 | 610 | ||
611 | foreach (ConfigurationNode conf in project.Configurations) | 611 | foreach (ConfigurationNode conf in project.Configurations) |
612 | { | 612 | { |
613 | if (conf.Options.KeyFile != string.Empty) | 613 | if (conf.Options.KeyFile != string.Empty) |
614 | { | 614 | { |
615 | // Copy snk file into the project's directory | 615 | // Copy snk file into the project's directory |
616 | // Use the snk from the project directory directly | 616 | // Use the snk from the project directory directly |
617 | string source = Path.Combine(project.FullPath, conf.Options.KeyFile); | 617 | string source = Path.Combine(project.FullPath, conf.Options.KeyFile); |
618 | string keyFile = conf.Options.KeyFile; | 618 | string keyFile = conf.Options.KeyFile; |
619 | Regex re = new Regex(".*/"); | 619 | Regex re = new Regex(".*/"); |
620 | keyFile = re.Replace(keyFile, ""); | 620 | keyFile = re.Replace(keyFile, ""); |
621 | 621 | ||
622 | string dest = Path.Combine(projectDir, keyFile); | 622 | string dest = Path.Combine(projectDir, keyFile); |
623 | // Tell the user if there's a problem copying the file | 623 | // Tell the user if there's a problem copying the file |
624 | try | 624 | try |
625 | { | 625 | { |
626 | mkdirDashP(System.IO.Path.GetDirectoryName(dest)); | 626 | mkdirDashP(System.IO.Path.GetDirectoryName(dest)); |
627 | System.IO.File.Copy(source, dest, true); | 627 | System.IO.File.Copy(source, dest, true); |
628 | } | 628 | } |
629 | catch (System.IO.IOException e) | 629 | catch (System.IO.IOException e) |
630 | { | 630 | { |
631 | Console.WriteLine(e.Message); | 631 | Console.WriteLine(e.Message); |
632 | } | 632 | } |
633 | } | 633 | } |
634 | } | 634 | } |
635 | 635 | ||
636 | // Copy compiled, embedded and content files into the project's directory | 636 | // Copy compiled, embedded and content files into the project's directory |
637 | foreach (string filename in project.Files) | 637 | foreach (string filename in project.Files) |
638 | { | 638 | { |
639 | string source = Path.Combine(project.FullPath, filename); | 639 | string source = Path.Combine(project.FullPath, filename); |
640 | string dest = Path.Combine(projectDir, filename); | 640 | string dest = Path.Combine(projectDir, filename); |
641 | 641 | ||
642 | if (filename.Contains("AssemblyInfo.cs")) | 642 | if (filename.Contains("AssemblyInfo.cs")) |
643 | { | 643 | { |
644 | // If we've got an AssemblyInfo.cs, pull the version number from it | 644 | // If we've got an AssemblyInfo.cs, pull the version number from it |
645 | string[] sources = { source }; | 645 | string[] sources = { source }; |
646 | string[] args = { "" }; | 646 | string[] args = { "" }; |
647 | Microsoft.CSharp.CSharpCodeProvider cscp = | 647 | Microsoft.CSharp.CSharpCodeProvider cscp = |
648 | new Microsoft.CSharp.CSharpCodeProvider(); | 648 | new Microsoft.CSharp.CSharpCodeProvider(); |
649 | 649 | ||
650 | string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); | 650 | string tempAssemblyFile = Path.Combine(Path.GetTempPath(), project.Name + "-temp.dll"); |
651 | System.CodeDom.Compiler.CompilerParameters cparam = | 651 | System.CodeDom.Compiler.CompilerParameters cparam = |
652 | new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); | 652 | new System.CodeDom.Compiler.CompilerParameters(args, tempAssemblyFile); |
653 | 653 | ||
654 | System.CodeDom.Compiler.CompilerResults cr = | 654 | System.CodeDom.Compiler.CompilerResults cr = |
655 | cscp.CompileAssemblyFromFile(cparam, sources); | 655 | cscp.CompileAssemblyFromFile(cparam, sources); |
656 | 656 | ||
657 | foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) | 657 | foreach (System.CodeDom.Compiler.CompilerError error in cr.Errors) |
658 | Console.WriteLine("Error! '{0}'", error.ErrorText); | 658 | Console.WriteLine("Error! '{0}'", error.ErrorText); |
659 | 659 | ||
660 | try { | 660 | try { |
661 | string projectFullName = cr.CompiledAssembly.FullName; | 661 | string projectFullName = cr.CompiledAssembly.FullName; |
662 | Regex verRegex = new Regex("Version=([\\d\\.]+)"); | 662 | Regex verRegex = new Regex("Version=([\\d\\.]+)"); |
663 | Match verMatch = verRegex.Match(projectFullName); | 663 | Match verMatch = verRegex.Match(projectFullName); |
664 | if (verMatch.Success) | 664 | if (verMatch.Success) |
665 | projectVersion = verMatch.Groups[1].Value; | 665 | projectVersion = verMatch.Groups[1].Value; |
666 | }catch{ | 666 | }catch{ |
667 | Console.WriteLine("Couldn't compile AssemblyInfo.cs"); | 667 | Console.WriteLine("Couldn't compile AssemblyInfo.cs"); |
668 | } | 668 | } |
669 | 669 | ||
670 | // Clean up the temp file | 670 | // Clean up the temp file |
671 | try | 671 | try |
672 | { | 672 | { |
673 | if (File.Exists(tempAssemblyFile)) | 673 | if (File.Exists(tempAssemblyFile)) |
674 | File.Delete(tempAssemblyFile); | 674 | File.Delete(tempAssemblyFile); |
675 | } | 675 | } |
676 | catch | 676 | catch |
677 | { | 677 | { |
678 | Console.WriteLine("Error! '{0}'", e); | 678 | Console.WriteLine("Error! '{0}'", e); |
679 | } | 679 | } |
680 | 680 | ||
681 | } | 681 | } |
682 | 682 | ||
683 | // Tell the user if there's a problem copying the file | 683 | // Tell the user if there's a problem copying the file |
684 | try | 684 | try |
685 | { | 685 | { |
686 | mkdirDashP(System.IO.Path.GetDirectoryName(dest)); | 686 | mkdirDashP(System.IO.Path.GetDirectoryName(dest)); |
687 | System.IO.File.Copy(source, dest, true); | 687 | System.IO.File.Copy(source, dest, true); |
688 | } | 688 | } |
689 | catch (System.IO.IOException e) | 689 | catch (System.IO.IOException e) |
690 | { | 690 | { |
691 | Console.WriteLine(e.Message); | 691 | Console.WriteLine(e.Message); |
692 | } | 692 | } |
693 | 693 | ||
694 | switch (project.Files.GetBuildAction(filename)) | 694 | switch (project.Files.GetBuildAction(filename)) |
695 | { | 695 | { |
696 | case BuildAction.Compile: | 696 | case BuildAction.Compile: |
697 | compiledFiles.Add(filename); | 697 | compiledFiles.Add(filename); |
698 | break; | 698 | break; |
699 | case BuildAction.Content: | 699 | case BuildAction.Content: |
700 | contentFiles.Add(filename); | 700 | contentFiles.Add(filename); |
701 | extraDistFiles.Add(filename); | 701 | extraDistFiles.Add(filename); |
702 | break; | 702 | break; |
703 | case BuildAction.EmbeddedResource: | 703 | case BuildAction.EmbeddedResource: |
704 | embeddedFiles.Add(filename); | 704 | embeddedFiles.Add(filename); |
705 | break; | 705 | break; |
706 | } | 706 | } |
707 | } | 707 | } |
708 | 708 | ||
709 | // Set up references | 709 | // Set up references |
710 | for (int refNum = 0; refNum < project.References.Count; refNum++) | 710 | for (int refNum = 0; refNum < project.References.Count; refNum++) |
711 | { | 711 | { |
712 | ReferenceNode refr = project.References[refNum]; | 712 | ReferenceNode refr = project.References[refNum]; |
713 | Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); | 713 | Assembly refAssembly = Assembly.LoadWithPartialName(refr.Name); |
714 | 714 | ||
715 | /* Determine which pkg-config (.pc) file refers to | 715 | /* Determine which pkg-config (.pc) file refers to |
716 | this assembly */ | 716 | this assembly */ |
717 | 717 | ||
718 | SystemPackage package = null; | 718 | SystemPackage package = null; |
719 | 719 | ||
720 | if (packagesHash.ContainsKey(refr.Name)) | 720 | if (packagesHash.ContainsKey(refr.Name)) |
721 | { | 721 | { |
722 | package = packagesHash[refr.Name]; | 722 | package = packagesHash[refr.Name]; |
723 | 723 | ||
724 | } | 724 | } |
725 | else | 725 | else |
726 | { | 726 | { |
727 | string assemblyFullName = string.Empty; | 727 | string assemblyFullName = string.Empty; |
728 | if (refAssembly != null) | 728 | if (refAssembly != null) |
729 | assemblyFullName = refAssembly.FullName; | 729 | assemblyFullName = refAssembly.FullName; |
730 | 730 | ||
731 | string assemblyFileName = string.Empty; | 731 | string assemblyFileName = string.Empty; |
732 | if (assemblyFullName != string.Empty && | 732 | if (assemblyFullName != string.Empty && |
733 | assemblyFullNameToPath.ContainsKey(assemblyFullName) | 733 | assemblyFullNameToPath.ContainsKey(assemblyFullName) |
734 | ) | 734 | ) |
735 | assemblyFileName = | 735 | assemblyFileName = |
736 | assemblyFullNameToPath[assemblyFullName]; | 736 | assemblyFullNameToPath[assemblyFullName]; |
737 | 737 | ||
738 | if (assemblyFileName != string.Empty && | 738 | if (assemblyFileName != string.Empty && |
739 | assemblyPathToPackage.ContainsKey(assemblyFileName) | 739 | assemblyPathToPackage.ContainsKey(assemblyFileName) |
740 | ) | 740 | ) |
741 | package = assemblyPathToPackage[assemblyFileName]; | 741 | package = assemblyPathToPackage[assemblyFileName]; |
742 | 742 | ||
743 | } | 743 | } |
744 | 744 | ||
745 | /* If we know the .pc file and it is not "mono" | 745 | /* If we know the .pc file and it is not "mono" |
746 | (already in the path), add a -pkg: argument */ | 746 | (already in the path), add a -pkg: argument */ |
747 | 747 | ||
748 | if (package != null && | 748 | if (package != null && |
749 | package.Name != "mono" && | 749 | package.Name != "mono" && |
750 | !pkgLibs.Contains(package.Name) | 750 | !pkgLibs.Contains(package.Name) |
751 | ) | 751 | ) |
752 | pkgLibs.Add(package.Name); | 752 | pkgLibs.Add(package.Name); |
753 | 753 | ||
754 | string fileRef = | 754 | string fileRef = |
755 | FindFileReference(refr.Name, (ProjectNode)refr.Parent); | 755 | FindFileReference(refr.Name, (ProjectNode)refr.Parent); |
756 | 756 | ||
757 | if (refr.LocalCopy || | 757 | if (refr.LocalCopy || |
758 | solution.ProjectsTable.ContainsKey(refr.Name) || | 758 | solution.ProjectsTable.ContainsKey(refr.Name) || |
759 | fileRef != null || | 759 | fileRef != null || |
760 | refr.Path != null | 760 | refr.Path != null |
761 | ) | 761 | ) |
762 | { | 762 | { |
763 | 763 | ||
764 | /* Attempt to copy the referenced lib to the | 764 | /* Attempt to copy the referenced lib to the |
765 | project's directory */ | 765 | project's directory */ |
766 | 766 | ||
767 | string filename = refr.Name + ".dll"; | 767 | string filename = refr.Name + ".dll"; |
768 | string source = filename; | 768 | string source = filename; |
769 | if (refr.Path != null) | 769 | if (refr.Path != null) |
770 | source = Path.Combine(refr.Path, source); | 770 | source = Path.Combine(refr.Path, source); |
771 | source = Path.Combine(project.FullPath, source); | 771 | source = Path.Combine(project.FullPath, source); |
772 | string dest = Path.Combine(projectDir, filename); | 772 | string dest = Path.Combine(projectDir, filename); |
773 | 773 | ||
774 | /* Since we depend on this binary dll to build, we | 774 | /* Since we depend on this binary dll to build, we |
775 | * will add a compile- time dependency on the | 775 | * will add a compile- time dependency on the |
776 | * copied dll, and add the dll to the list of | 776 | * copied dll, and add the dll to the list of |
777 | * files distributed with this package | 777 | * files distributed with this package |
778 | */ | 778 | */ |
779 | 779 | ||
780 | binaryLibs.Add(refr.Name + ".dll"); | 780 | binaryLibs.Add(refr.Name + ".dll"); |
781 | extraDistFiles.Add(refr.Name + ".dll"); | 781 | extraDistFiles.Add(refr.Name + ".dll"); |
782 | 782 | ||
783 | // TODO: Support copying .config.osx files | 783 | // TODO: Support copying .config.osx files |
784 | // TODO: Support for determining native dependencies | 784 | // TODO: Support for determining native dependencies |
785 | if (File.Exists(source + ".config")) | 785 | if (File.Exists(source + ".config")) |
786 | { | 786 | { |
787 | System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); | 787 | System.IO.File.Copy(source + ".config", Path.GetDirectoryName(dest), true); |
788 | extraDistFiles.Add(refr.Name + ".dll.config"); | 788 | extraDistFiles.Add(refr.Name + ".dll.config"); |
789 | } | 789 | } |
790 | 790 | ||
791 | try | 791 | try |
792 | { | 792 | { |
793 | System.IO.File.Copy(source, dest, true); | 793 | System.IO.File.Copy(source, dest, true); |
794 | } | 794 | } |
795 | catch (System.IO.IOException) | 795 | catch (System.IO.IOException) |
796 | { | 796 | { |
797 | if (solution.ProjectsTable.ContainsKey(refr.Name)){ | 797 | if (solution.ProjectsTable.ContainsKey(refr.Name)){ |
798 | 798 | ||
799 | /* If an assembly is referenced, marked for | 799 | /* If an assembly is referenced, marked for |
800 | * local copy, in the list of projects for | 800 | * local copy, in the list of projects for |
801 | * this solution, but does not exist, put a | 801 | * this solution, but does not exist, put a |
802 | * target into the Makefile.am to build the | 802 | * target into the Makefile.am to build the |
803 | * assembly and copy it to this project's | 803 | * assembly and copy it to this project's |
804 | * directory | 804 | * directory |
805 | */ | 805 | */ |
806 | 806 | ||
807 | ProjectNode sourcePrj = | 807 | ProjectNode sourcePrj = |
808 | ((solution.ProjectsTable[refr.Name])); | 808 | ((solution.ProjectsTable[refr.Name])); |
809 | 809 | ||
810 | string target = | 810 | string target = |
811 | String.Format("{0}:\n" + | 811 | String.Format("{0}:\n" + |
812 | "\t$(MAKE) -C ../{1}\n" + | 812 | "\t$(MAKE) -C ../{1}\n" + |
813 | "\tln ../{2}/$@ $@\n", | 813 | "\tln ../{2}/$@ $@\n", |
814 | filename, | 814 | filename, |
815 | sourcePrj.Name, | 815 | sourcePrj.Name, |
816 | sourcePrj.Name ); | 816 | sourcePrj.Name ); |
817 | 817 | ||
818 | localCopyTargets.Add(target); | 818 | localCopyTargets.Add(target); |
819 | } | 819 | } |
820 | } | 820 | } |
821 | } | 821 | } |
822 | else if( !pkgLibs.Contains(refr.Name) ) | 822 | else if( !pkgLibs.Contains(refr.Name) ) |
823 | { | 823 | { |
824 | // Else, let's assume it's in the GAC or the lib path | 824 | // Else, let's assume it's in the GAC or the lib path |
825 | string assemName = string.Empty; | 825 | string assemName = string.Empty; |
826 | int index = refr.Name.IndexOf(","); | 826 | int index = refr.Name.IndexOf(","); |
827 | 827 | ||
828 | if (index > 0) | 828 | if (index > 0) |
829 | assemName = refr.Name.Substring(0, index); | 829 | assemName = refr.Name.Substring(0, index); |
830 | else | 830 | else |
831 | assemName = refr.Name; | 831 | assemName = refr.Name; |
832 | 832 | ||
833 | m_Kernel.Log.Write(String.Format( | 833 | m_Kernel.Log.Write(String.Format( |
834 | "Warning: Couldn't find an appropriate assembly " + | 834 | "Warning: Couldn't find an appropriate assembly " + |
835 | "for reference:\n'{0}'", refr.Name | 835 | "for reference:\n'{0}'", refr.Name |
836 | )); | 836 | )); |
837 | systemLibs.Add(assemName); | 837 | systemLibs.Add(assemName); |
838 | } | 838 | } |
839 | } | 839 | } |
840 | 840 | ||
841 | const string lineSep = " \\\n\t"; | 841 | const string lineSep = " \\\n\t"; |
842 | string compiledFilesString = string.Empty; | 842 | string compiledFilesString = string.Empty; |
843 | if (compiledFiles.Count > 0) | 843 | if (compiledFiles.Count > 0) |
844 | compiledFilesString = | 844 | compiledFilesString = |
845 | lineSep + string.Join(lineSep, compiledFiles.ToArray()); | 845 | lineSep + string.Join(lineSep, compiledFiles.ToArray()); |
846 | 846 | ||
847 | string embeddedFilesString = ""; | 847 | string embeddedFilesString = ""; |
848 | if (embeddedFiles.Count > 0) | 848 | if (embeddedFiles.Count > 0) |
849 | embeddedFilesString = | 849 | embeddedFilesString = |
850 | lineSep + string.Join(lineSep, embeddedFiles.ToArray()); | 850 | lineSep + string.Join(lineSep, embeddedFiles.ToArray()); |
851 | 851 | ||
852 | string contentFilesString = ""; | 852 | string contentFilesString = ""; |
853 | if (contentFiles.Count > 0) | 853 | if (contentFiles.Count > 0) |
854 | contentFilesString = | 854 | contentFilesString = |
855 | lineSep + string.Join(lineSep, contentFiles.ToArray()); | 855 | lineSep + string.Join(lineSep, contentFiles.ToArray()); |
856 | 856 | ||
857 | string extraDistFilesString = ""; | 857 | string extraDistFilesString = ""; |
858 | if (extraDistFiles.Count > 0) | 858 | if (extraDistFiles.Count > 0) |
859 | extraDistFilesString = | 859 | extraDistFilesString = |
860 | lineSep + string.Join(lineSep, extraDistFiles.ToArray()); | 860 | lineSep + string.Join(lineSep, extraDistFiles.ToArray()); |
861 | 861 | ||
862 | string pkgLibsString = ""; | 862 | string pkgLibsString = ""; |
863 | if (pkgLibs.Count > 0) | 863 | if (pkgLibs.Count > 0) |
864 | pkgLibsString = | 864 | pkgLibsString = |
865 | lineSep + string.Join(lineSep, pkgLibs.ToArray()); | 865 | lineSep + string.Join(lineSep, pkgLibs.ToArray()); |
866 | 866 | ||
867 | string binaryLibsString = ""; | 867 | string binaryLibsString = ""; |
868 | if (binaryLibs.Count > 0) | 868 | if (binaryLibs.Count > 0) |
869 | binaryLibsString = | 869 | binaryLibsString = |
870 | lineSep + string.Join(lineSep, binaryLibs.ToArray()); | 870 | lineSep + string.Join(lineSep, binaryLibs.ToArray()); |
871 | 871 | ||
872 | string systemLibsString = ""; | 872 | string systemLibsString = ""; |
873 | if (systemLibs.Count > 0) | 873 | if (systemLibs.Count > 0) |
874 | systemLibsString = | 874 | systemLibsString = |
875 | lineSep + string.Join(lineSep, systemLibs.ToArray()); | 875 | lineSep + string.Join(lineSep, systemLibs.ToArray()); |
876 | 876 | ||
877 | string localCopyTargetsString = ""; | 877 | string localCopyTargetsString = ""; |
878 | if (localCopyTargets.Count > 0) | 878 | if (localCopyTargets.Count > 0) |
879 | localCopyTargetsString = | 879 | localCopyTargetsString = |
880 | string.Join("\n", localCopyTargets.ToArray()); | 880 | string.Join("\n", localCopyTargets.ToArray()); |
881 | 881 | ||
882 | string monoPath = ""; | 882 | string monoPath = ""; |
883 | foreach (string runtimeLib in runtimeLibs) | 883 | foreach (string runtimeLib in runtimeLibs) |
884 | { | 884 | { |
885 | monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; | 885 | monoPath += ":`pkg-config --variable=libdir " + runtimeLib + "`"; |
886 | } | 886 | } |
887 | 887 | ||
888 | // Add the project name to the list of transformation | 888 | // Add the project name to the list of transformation |
889 | // parameters | 889 | // parameters |
890 | XsltArgumentList argList = new XsltArgumentList(); | 890 | XsltArgumentList argList = new XsltArgumentList(); |
891 | argList.AddParam("projectName", "", project.Name); | 891 | argList.AddParam("projectName", "", project.Name); |
892 | argList.AddParam("solutionName", "", solution.Name); | 892 | argList.AddParam("solutionName", "", solution.Name); |
893 | argList.AddParam("assemblyName", "", projectAssemblyName); | 893 | argList.AddParam("assemblyName", "", projectAssemblyName); |
894 | argList.AddParam("compiledFiles", "", compiledFilesString); | 894 | argList.AddParam("compiledFiles", "", compiledFilesString); |
895 | argList.AddParam("embeddedFiles", "", embeddedFilesString); | 895 | argList.AddParam("embeddedFiles", "", embeddedFilesString); |
896 | argList.AddParam("contentFiles", "", contentFilesString); | 896 | argList.AddParam("contentFiles", "", contentFilesString); |
897 | argList.AddParam("extraDistFiles", "", extraDistFilesString); | 897 | argList.AddParam("extraDistFiles", "", extraDistFilesString); |
898 | argList.AddParam("pkgLibs", "", pkgLibsString); | 898 | argList.AddParam("pkgLibs", "", pkgLibsString); |
899 | argList.AddParam("binaryLibs", "", binaryLibsString); | 899 | argList.AddParam("binaryLibs", "", binaryLibsString); |
900 | argList.AddParam("systemLibs", "", systemLibsString); | 900 | argList.AddParam("systemLibs", "", systemLibsString); |
901 | argList.AddParam("monoPath", "", monoPath); | 901 | argList.AddParam("monoPath", "", monoPath); |
902 | argList.AddParam("localCopyTargets", "", localCopyTargetsString); | 902 | argList.AddParam("localCopyTargets", "", localCopyTargetsString); |
903 | argList.AddParam("projectVersion", "", projectVersion); | 903 | argList.AddParam("projectVersion", "", projectVersion); |
904 | argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); | 904 | argList.AddParam("hasAssemblyConfig", "", hasAssemblyConfig ? "true" : ""); |
905 | 905 | ||
906 | // Transform the templates | 906 | // Transform the templates |
907 | transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); | 907 | transformToFile(Path.Combine(projectDir, "configure.ac"), argList, "/Autotools/ProjectConfigureAc"); |
908 | transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); | 908 | transformToFile(Path.Combine(projectDir, "Makefile.am"), argList, "/Autotools/ProjectMakefileAm"); |
909 | transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); | 909 | transformToFile(Path.Combine(projectDir, "autogen.sh"), argList, "/Autotools/ProjectAutogenSh"); |
910 | 910 | ||
911 | if (project.Type == Core.Nodes.ProjectType.Library) | 911 | if (project.Type == Core.Nodes.ProjectType.Library) |
912 | transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); | 912 | transformToFile(Path.Combine(projectDir, project.Name + ".pc.in"), argList, "/Autotools/ProjectPcIn"); |
913 | if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) | 913 | if (project.Type == Core.Nodes.ProjectType.Exe || project.Type == Core.Nodes.ProjectType.WinExe) |
914 | transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); | 914 | transformToFile(Path.Combine(projectDir, project.Name.ToLower() + ".in"), argList, "/Autotools/ProjectWrapperScriptIn"); |
915 | } | 915 | } |
916 | 916 | ||
917 | private void CleanProject(ProjectNode project) | 917 | private void CleanProject(ProjectNode project) |
918 | { | 918 | { |
919 | m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); | 919 | m_Kernel.Log.Write("...Cleaning project: {0}", project.Name); |
920 | string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); | 920 | string projectFile = Helper.MakeFilePath(project.FullPath, "Include", "am"); |
921 | Helper.DeleteIfExists(projectFile); | 921 | Helper.DeleteIfExists(projectFile); |
922 | } | 922 | } |
923 | 923 | ||
924 | private void CleanSolution(SolutionNode solution) | 924 | private void CleanSolution(SolutionNode solution) |
925 | { | 925 | { |
926 | m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); | 926 | m_Kernel.Log.Write("Cleaning Autotools make files for", solution.Name); |
927 | 927 | ||
928 | string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); | 928 | string slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "am"); |
929 | Helper.DeleteIfExists(slnFile); | 929 | Helper.DeleteIfExists(slnFile); |
930 | 930 | ||
931 | slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); | 931 | slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile", "in"); |
932 | Helper.DeleteIfExists(slnFile); | 932 | Helper.DeleteIfExists(slnFile); |
933 | 933 | ||
934 | slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); | 934 | slnFile = Helper.MakeFilePath(solution.FullPath, "configure", "ac"); |
935 | Helper.DeleteIfExists(slnFile); | 935 | Helper.DeleteIfExists(slnFile); |
936 | 936 | ||
937 | slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); | 937 | slnFile = Helper.MakeFilePath(solution.FullPath, "configure"); |
938 | Helper.DeleteIfExists(slnFile); | 938 | Helper.DeleteIfExists(slnFile); |
939 | 939 | ||
940 | slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); | 940 | slnFile = Helper.MakeFilePath(solution.FullPath, "Makefile"); |
941 | Helper.DeleteIfExists(slnFile); | 941 | Helper.DeleteIfExists(slnFile); |
942 | 942 | ||
943 | foreach (ProjectNode project in solution.Projects) | 943 | foreach (ProjectNode project in solution.Projects) |
944 | { | 944 | { |
945 | CleanProject(project); | 945 | CleanProject(project); |
946 | } | 946 | } |
947 | 947 | ||
948 | m_Kernel.Log.Write(""); | 948 | m_Kernel.Log.Write(""); |
949 | } | 949 | } |
950 | 950 | ||
951 | #endregion | 951 | #endregion |
952 | 952 | ||
953 | #region ITarget Members | 953 | #region ITarget Members |
954 | 954 | ||
955 | /// <summary> | 955 | /// <summary> |
956 | /// Writes the specified kern. | 956 | /// Writes the specified kern. |
957 | /// </summary> | 957 | /// </summary> |
958 | /// <param name="kern">The kern.</param> | 958 | /// <param name="kern">The kern.</param> |
959 | public void Write(Kernel kern) | 959 | public void Write(Kernel kern) |
960 | { | 960 | { |
961 | if (kern == null) | 961 | if (kern == null) |
962 | { | 962 | { |
963 | throw new ArgumentNullException("kern"); | 963 | throw new ArgumentNullException("kern"); |
964 | } | 964 | } |
965 | m_Kernel = kern; | 965 | m_Kernel = kern; |
966 | m_Kernel.Log.Write("Parsing system pkg-config files"); | 966 | m_Kernel.Log.Write("Parsing system pkg-config files"); |
967 | RunInitialization(); | 967 | RunInitialization(); |
968 | 968 | ||
969 | const string streamName = "autotools.xml"; | 969 | const string streamName = "autotools.xml"; |
970 | string fqStreamName = String.Format("Prebuild.data.{0}", | 970 | string fqStreamName = String.Format("Prebuild.data.{0}", |
971 | streamName | 971 | streamName |
972 | ); | 972 | ); |
973 | 973 | ||
974 | // Retrieve stream for the autotools template XML | 974 | // Retrieve stream for the autotools template XML |
975 | Stream autotoolsStream = Assembly.GetExecutingAssembly() | 975 | Stream autotoolsStream = Assembly.GetExecutingAssembly() |
976 | .GetManifestResourceStream(fqStreamName); | 976 | .GetManifestResourceStream(fqStreamName); |
977 | 977 | ||
978 | if(autotoolsStream == null) { | 978 | if(autotoolsStream == null) { |
979 | 979 | ||
980 | /* | 980 | /* |
981 | * try without the default namespace prepended, in | 981 | * try without the default namespace prepended, in |
982 | * case prebuild.exe assembly was compiled with | 982 | * case prebuild.exe assembly was compiled with |
983 | * something other than Visual Studio .NET | 983 | * something other than Visual Studio .NET |
984 | */ | 984 | */ |
985 | 985 | ||
986 | autotoolsStream = Assembly.GetExecutingAssembly() | 986 | autotoolsStream = Assembly.GetExecutingAssembly() |
987 | .GetManifestResourceStream(streamName); | 987 | .GetManifestResourceStream(streamName); |
988 | if(autotoolsStream == null){ | 988 | if(autotoolsStream == null){ |
989 | string errStr = | 989 | string errStr = |
990 | String.Format("Could not find embedded resource file:\n" + | 990 | String.Format("Could not find embedded resource file:\n" + |
991 | "'{0}' or '{1}'", | 991 | "'{0}' or '{1}'", |
992 | streamName, fqStreamName | 992 | streamName, fqStreamName |
993 | ); | 993 | ); |
994 | 994 | ||
995 | m_Kernel.Log.Write(errStr); | 995 | m_Kernel.Log.Write(errStr); |
996 | 996 | ||
997 | throw new System.Reflection.TargetException(errStr); | 997 | throw new System.Reflection.TargetException(errStr); |
998 | } | 998 | } |
999 | } | 999 | } |
1000 | 1000 | ||
1001 | // Create an XML URL Resolver with default credentials | 1001 | // Create an XML URL Resolver with default credentials |
1002 | xr = new System.Xml.XmlUrlResolver(); | 1002 | xr = new System.Xml.XmlUrlResolver(); |
1003 | xr.Credentials = CredentialCache.DefaultCredentials; | 1003 | xr.Credentials = CredentialCache.DefaultCredentials; |
1004 | 1004 | ||
1005 | // Create a default evidence - no need to limit access | 1005 | // Create a default evidence - no need to limit access |
1006 | e = new System.Security.Policy.Evidence(); | 1006 | e = new System.Security.Policy.Evidence(); |
1007 | 1007 | ||
1008 | // Load the autotools XML | 1008 | // Load the autotools XML |
1009 | autotoolsDoc = new XmlDocument(); | 1009 | autotoolsDoc = new XmlDocument(); |
1010 | autotoolsDoc.Load(autotoolsStream); | 1010 | autotoolsDoc.Load(autotoolsStream); |
1011 | 1011 | ||
1012 | /* rootDir is the filesystem location where the Autotools | 1012 | /* rootDir is the filesystem location where the Autotools |
1013 | * build tree will be created - for now we'll make it | 1013 | * build tree will be created - for now we'll make it |
1014 | * $PWD/autotools | 1014 | * $PWD/autotools |
1015 | */ | 1015 | */ |
1016 | 1016 | ||
1017 | string pwd = Directory.GetCurrentDirectory(); | 1017 | string pwd = Directory.GetCurrentDirectory(); |
1018 | //string pwd = System.Environment.GetEnvironmentVariable("PWD"); | 1018 | //string pwd = System.Environment.GetEnvironmentVariable("PWD"); |
1019 | //if (pwd.Length != 0) | 1019 | //if (pwd.Length != 0) |
1020 | //{ | 1020 | //{ |
1021 | string rootDir = Path.Combine(pwd, "autotools"); | 1021 | string rootDir = Path.Combine(pwd, "autotools"); |
1022 | //} | 1022 | //} |
1023 | //else | 1023 | //else |
1024 | //{ | 1024 | //{ |
1025 | // pwd = Assembly.GetExecutingAssembly() | 1025 | // pwd = Assembly.GetExecutingAssembly() |
1026 | //} | 1026 | //} |
1027 | chkMkDir(rootDir); | 1027 | chkMkDir(rootDir); |
1028 | 1028 | ||
1029 | foreach (SolutionNode solution in kern.Solutions) | 1029 | foreach (SolutionNode solution in kern.Solutions) |
1030 | { | 1030 | { |
1031 | m_Kernel.Log.Write(String.Format("Writing solution: {0}", | 1031 | m_Kernel.Log.Write(String.Format("Writing solution: {0}", |
1032 | solution.Name)); | 1032 | solution.Name)); |
1033 | WriteCombine(solution); | 1033 | WriteCombine(solution); |
1034 | } | 1034 | } |
1035 | m_Kernel = null; | 1035 | m_Kernel = null; |
1036 | } | 1036 | } |
1037 | 1037 | ||
1038 | /// <summary> | 1038 | /// <summary> |
1039 | /// Cleans the specified kern. | 1039 | /// Cleans the specified kern. |
1040 | /// </summary> | 1040 | /// </summary> |
1041 | /// <param name="kern">The kern.</param> | 1041 | /// <param name="kern">The kern.</param> |
1042 | public virtual void Clean(Kernel kern) | 1042 | public virtual void Clean(Kernel kern) |
1043 | { | 1043 | { |
1044 | if (kern == null) | 1044 | if (kern == null) |
1045 | { | 1045 | { |
1046 | throw new ArgumentNullException("kern"); | 1046 | throw new ArgumentNullException("kern"); |
1047 | } | 1047 | } |
1048 | m_Kernel = kern; | 1048 | m_Kernel = kern; |
1049 | foreach (SolutionNode sol in kern.Solutions) | 1049 | foreach (SolutionNode sol in kern.Solutions) |
1050 | { | 1050 | { |
1051 | CleanSolution(sol); | 1051 | CleanSolution(sol); |
1052 | } | 1052 | } |
1053 | m_Kernel = null; | 1053 | m_Kernel = null; |
1054 | } | 1054 | } |
1055 | 1055 | ||
1056 | /// <summary> | 1056 | /// <summary> |
1057 | /// Gets the name. | 1057 | /// Gets the name. |
1058 | /// </summary> | 1058 | /// </summary> |
1059 | /// <value>The name.</value> | 1059 | /// <value>The name.</value> |
1060 | public string Name | 1060 | public string Name |
1061 | { | 1061 | { |
1062 | get | 1062 | get |
1063 | { | 1063 | { |
1064 | return "autotools"; | 1064 | return "autotools"; |
1065 | } | 1065 | } |
1066 | } | 1066 | } |
1067 | 1067 | ||
1068 | #endregion | 1068 | #endregion |
1069 | } | 1069 | } |
1070 | } | 1070 | } |
diff --git a/Prebuild/src/Core/Targets/DebugTarget.cs b/Prebuild/src/Core/Targets/DebugTarget.cs index 650007e..d78064f 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 | |||
27 | /* | 27 | /* |
28 | * $Source$ | 28 | * $Source$ |
29 | * $Author: jendave $ | 29 | * $Author: jendave $ |
30 | * $Date: 2006-09-20 08:42:51 +0100 (Wed, 20 Sep 2006) $ | 30 | * $Date: 2006-09-20 03:42:51 -0400 (Wed, 20 Sep 2006) $ |
31 | * $Revision: 164 $ | 31 | * $Revision: 164 $ |
32 | */ | 32 | */ |
33 | #endregion | 33 | #endregion |
diff --git a/Prebuild/src/Core/Targets/VS2010Target.cs b/Prebuild/src/Core/Targets/VS2010Target.cs index b16120c..ea9f736 100644 --- a/Prebuild/src/Core/Targets/VS2010Target.cs +++ b/Prebuild/src/Core/Targets/VS2010Target.cs | |||
@@ -1,138 +1,138 @@ | |||
1 | using System; | 1 | using System; |
2 | using System.IO; | 2 | using System.IO; |
3 | using System.Text; | 3 | using System.Text; |
4 | 4 | ||
5 | using Prebuild.Core.Attributes; | 5 | using Prebuild.Core.Attributes; |
6 | using Prebuild.Core.Interfaces; | 6 | using Prebuild.Core.Interfaces; |
7 | using Prebuild.Core.Nodes; | 7 | using Prebuild.Core.Nodes; |
8 | using Prebuild.Core.Utilities; | 8 | using Prebuild.Core.Utilities; |
9 | using System.CodeDom.Compiler; | 9 | using System.CodeDom.Compiler; |
10 | 10 | ||
11 | namespace Prebuild.Core.Targets | 11 | namespace Prebuild.Core.Targets |
12 | { | 12 | { |
13 | 13 | ||
14 | /// <summary> | 14 | /// <summary> |
15 | /// | 15 | /// |
16 | /// </summary> | 16 | /// </summary> |
17 | [Target("vs2010")] | 17 | [Target("vs2010")] |
18 | public class VS2010Target : VSGenericTarget | 18 | public class VS2010Target : VSGenericTarget |
19 | { | 19 | { |
20 | #region Fields | 20 | #region Fields |
21 | 21 | ||
22 | string solutionVersion = "11.00"; | 22 | string solutionVersion = "11.00"; |
23 | string productVersion = "9.0.30729"; | 23 | string productVersion = "9.0.30729"; |
24 | string schemaVersion = "2.0"; | 24 | string schemaVersion = "2.0"; |
25 | string versionName = "Visual Studio 2010"; | 25 | string versionName = "Visual Studio 2010"; |
26 | string name = "vs2010"; | 26 | string name = "vs2010"; |
27 | VSVersion version = VSVersion.VS10; | 27 | VSVersion version = VSVersion.VS10; |
28 | 28 | ||
29 | #endregion | 29 | #endregion |
30 | 30 | ||
31 | #region Properties | 31 | #region Properties |
32 | 32 | ||
33 | /// <summary> | 33 | /// <summary> |
34 | /// Gets or sets the solution version. | 34 | /// Gets or sets the solution version. |
35 | /// </summary> | 35 | /// </summary> |
36 | /// <value>The solution version.</value> | 36 | /// <value>The solution version.</value> |
37 | public override string SolutionVersion | 37 | public override string SolutionVersion |
38 | { | 38 | { |
39 | get | 39 | get |
40 | { | 40 | { |
41 | return solutionVersion; | 41 | return solutionVersion; |
42 | } | 42 | } |
43 | } | 43 | } |
44 | 44 | ||
45 | /// <summary> | 45 | /// <summary> |
46 | /// Gets or sets the product version. | 46 | /// Gets or sets the product version. |
47 | /// </summary> | 47 | /// </summary> |
48 | /// <value>The product version.</value> | 48 | /// <value>The product version.</value> |
49 | public override string ProductVersion | 49 | public override string ProductVersion |
50 | { | 50 | { |
51 | get | 51 | get |
52 | { | 52 | { |
53 | return productVersion; | 53 | return productVersion; |
54 | } | 54 | } |
55 | } | 55 | } |
56 | 56 | ||
57 | /// <summary> | 57 | /// <summary> |
58 | /// Gets or sets the schema version. | 58 | /// Gets or sets the schema version. |
59 | /// </summary> | 59 | /// </summary> |
60 | /// <value>The schema version.</value> | 60 | /// <value>The schema version.</value> |
61 | public override string SchemaVersion | 61 | public override string SchemaVersion |
62 | { | 62 | { |
63 | get | 63 | get |
64 | { | 64 | { |
65 | return schemaVersion; | 65 | return schemaVersion; |
66 | } | 66 | } |
67 | } | 67 | } |
68 | 68 | ||
69 | /// <summary> | 69 | /// <summary> |
70 | /// Gets or sets the name of the version. | 70 | /// Gets or sets the name of the version. |
71 | /// </summary> | 71 | /// </summary> |
72 | /// <value>The name of the version.</value> | 72 | /// <value>The name of the version.</value> |
73 | public override string VersionName | 73 | public override string VersionName |
74 | { | 74 | { |
75 | get | 75 | get |
76 | { | 76 | { |
77 | return versionName; | 77 | return versionName; |
78 | } | 78 | } |
79 | } | 79 | } |
80 | 80 | ||
81 | /// <summary> | 81 | /// <summary> |
82 | /// Gets or sets the version. | 82 | /// Gets or sets the version. |
83 | /// </summary> | 83 | /// </summary> |
84 | /// <value>The version.</value> | 84 | /// <value>The version.</value> |
85 | public override VSVersion Version | 85 | public override VSVersion Version |
86 | { | 86 | { |
87 | get | 87 | get |
88 | { | 88 | { |
89 | return version; | 89 | return version; |
90 | } | 90 | } |
91 | } | 91 | } |
92 | 92 | ||
93 | /// <summary> | 93 | /// <summary> |
94 | /// Gets the name. | 94 | /// Gets the name. |
95 | /// </summary> | 95 | /// </summary> |
96 | /// <value>The name.</value> | 96 | /// <value>The name.</value> |
97 | public override string Name | 97 | public override string Name |
98 | { | 98 | { |
99 | get | 99 | get |
100 | { | 100 | { |
101 | return name; | 101 | return name; |
102 | } | 102 | } |
103 | } | 103 | } |
104 | 104 | ||
105 | protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) | 105 | protected override string GetToolsVersionXml(FrameworkVersion frameworkVersion) |
106 | { | 106 | { |
107 | switch (frameworkVersion) | 107 | switch (frameworkVersion) |
108 | { | 108 | { |
109 | case FrameworkVersion.v4_0: | 109 | case FrameworkVersion.v4_0: |
110 | case FrameworkVersion.v3_5: | 110 | case FrameworkVersion.v3_5: |
111 | return "ToolsVersion=\"4.0\""; | 111 | return "ToolsVersion=\"4.0\""; |
112 | case FrameworkVersion.v3_0: | 112 | case FrameworkVersion.v3_0: |
113 | return "ToolsVersion=\"3.0\""; | 113 | return "ToolsVersion=\"3.0\""; |
114 | default: | 114 | default: |
115 | return "ToolsVersion=\"2.0\""; | 115 | return "ToolsVersion=\"2.0\""; |
116 | } | 116 | } |
117 | } | 117 | } |
118 | 118 | ||
119 | public override string SolutionTag | 119 | public override string SolutionTag |
120 | { | 120 | { |
121 | get { return "# Visual Studio 2010"; } | 121 | get { return "# Visual Studio 2010"; } |
122 | } | 122 | } |
123 | 123 | ||
124 | #endregion | 124 | #endregion |
125 | 125 | ||
126 | #region Constructors | 126 | #region Constructors |
127 | 127 | ||
128 | /// <summary> | 128 | /// <summary> |
129 | /// Initializes a new instance of the <see cref="VS2005Target"/> class. | 129 | /// Initializes a new instance of the <see cref="VS2005Target"/> class. |
130 | /// </summary> | 130 | /// </summary> |
131 | public VS2010Target() | 131 | public VS2010Target() |
132 | : base() | 132 | : base() |
133 | { | 133 | { |
134 | } | 134 | } |
135 | 135 | ||
136 | #endregion | 136 | #endregion |
137 | } | 137 | } |
138 | } | 138 | } |
diff --git a/Prebuild/src/Core/Targets/VSGenericTarget.cs b/Prebuild/src/Core/Targets/VSGenericTarget.cs index cd3f5bb..af61704 100644 --- a/Prebuild/src/Core/Targets/VSGenericTarget.cs +++ b/Prebuild/src/Core/Targets/VSGenericTarget.cs | |||
@@ -1,922 +1,972 @@ | |||
1 | #region BSD License | 1 | #region BSD License |
2 | /* | 2 | /* |
3 | Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) | 3 | Copyright (c) 2008 Matthew Holmes (matthew@wildfiregames.com), John Anderson (sontek@gmail.com) |
4 | 4 | ||
5 | Redistribution and use in source and binary forms, with or without modification, are permitted | 5 | Redistribution and use in source and binary forms, with or without modification, are permitted |
6 | provided that the following conditions are met: | 6 | provided that the following conditions are met: |
7 | 7 | ||
8 | * Redistributions of source code must retain the above copyright notice, this list of conditions | 8 | * Redistributions of source code must retain the above copyright notice, this list of conditions |
9 | and the following disclaimer. | 9 | and the following disclaimer. |
10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions | 10 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
11 | and the following disclaimer in the documentation and/or other materials provided with the | 11 | and the following disclaimer in the documentation and/or other materials provided with the |
12 | distribution. | 12 | distribution. |
13 | * The name of the author may not be used to endorse or promote products derived from this software | 13 | * The name of the author may not be used to endorse or promote products derived from this software |
14 | without specific prior written permission. | 14 | without specific prior written permission. |
15 | 15 | ||
16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 16 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 17 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 18 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 19 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 21 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 22 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
23 | */ | 23 | */ |
24 | #endregion | 24 | #endregion |
25 | 25 | ||
26 | using System; | 26 | using System; |
27 | using System.Collections.Generic; | 27 | using System.Collections.Generic; |
28 | using System.IO; | 28 | using System.Collections.Specialized; |
29 | using Prebuild.Core.Interfaces; | 29 | using System.IO; |
30 | using Prebuild.Core.Nodes; | 30 | using Prebuild.Core.Interfaces; |
31 | using Prebuild.Core.Utilities; | 31 | using Prebuild.Core.Nodes; |
32 | using System.CodeDom.Compiler; | 32 | using Prebuild.Core.Utilities; |
33 | 33 | using System.CodeDom.Compiler; | |
34 | namespace Prebuild.Core.Targets | 34 | |
35 | { | 35 | namespace Prebuild.Core.Targets |
36 | 36 | { | |
37 | /// <summary> | 37 | |
38 | /// | 38 | /// <summary> |
39 | /// </summary> | 39 | /// |
40 | public abstract class VSGenericTarget : ITarget | 40 | /// </summary> |
41 | { | 41 | public abstract class VSGenericTarget : ITarget |
42 | #region Fields | 42 | { |
43 | 43 | #region Fields | |
44 | readonly Dictionary<string, ToolInfo> tools = new Dictionary<string, ToolInfo>(); | 44 | |
45 | Kernel kernel; | 45 | readonly Dictionary<string, ToolInfo> tools = new Dictionary<string, ToolInfo>(); |
46 | #endregion | 46 | // NameValueCollection CopyFiles = new NameValueCollection(); |
47 | 47 | Kernel kernel; | |
48 | #region Properties | 48 | #endregion |
49 | /// <summary> | 49 | |
50 | /// Gets or sets the solution version. | 50 | #region Properties |
51 | /// </summary> | 51 | /// <summary> |
52 | /// <value>The solution version.</value> | 52 | /// Gets or sets the solution version. |
53 | public abstract string SolutionVersion { get; } | 53 | /// </summary> |
54 | /// <summary> | 54 | /// <value>The solution version.</value> |
55 | /// Gets or sets the product version. | 55 | public abstract string SolutionVersion { get; } |
56 | /// </summary> | 56 | /// <summary> |
57 | /// <value>The product version.</value> | 57 | /// Gets or sets the product version. |
58 | public abstract string ProductVersion { get; } | 58 | /// </summary> |
59 | /// <summary> | 59 | /// <value>The product version.</value> |
60 | /// Gets or sets the schema version. | 60 | public abstract string ProductVersion { get; } |
61 | /// </summary> | 61 | /// <summary> |
62 | /// <value>The schema version.</value> | 62 | /// Gets or sets the schema version. |
63 | public abstract string SchemaVersion { get; } | 63 | /// </summary> |
64 | /// <summary> | 64 | /// <value>The schema version.</value> |
65 | /// Gets or sets the name of the version. | 65 | public abstract string SchemaVersion { get; } |
66 | /// </summary> | 66 | /// <summary> |
67 | /// <value>The name of the version.</value> | 67 | /// Gets or sets the name of the version. |
68 | public abstract string VersionName { get; } | 68 | /// </summary> |
69 | /// <summary> | 69 | /// <value>The name of the version.</value> |
70 | /// Gets or sets the version. | 70 | public abstract string VersionName { get; } |
71 | /// </summary> | 71 | /// <summary> |
72 | /// <value>The version.</value> | 72 | /// Gets or sets the version. |
73 | public abstract VSVersion Version { get; } | 73 | /// </summary> |
74 | /// <summary> | 74 | /// <value>The version.</value> |
75 | /// Gets the name. | 75 | public abstract VSVersion Version { get; } |
76 | /// </summary> | 76 | /// <summary> |
77 | /// <value>The name.</value> | 77 | /// Gets the name. |
78 | public abstract string Name { get; } | 78 | /// </summary> |
79 | 79 | /// <value>The name.</value> | |
80 | protected abstract string GetToolsVersionXml(FrameworkVersion version); | 80 | public abstract string Name { get; } |
81 | public abstract string SolutionTag { get; } | 81 | |
82 | 82 | protected abstract string GetToolsVersionXml(FrameworkVersion version); | |
83 | #endregion | 83 | public abstract string SolutionTag { get; } |
84 | 84 | ||
85 | #region Constructors | 85 | #endregion |
86 | 86 | ||
87 | /// <summary> | 87 | #region Constructors |
88 | /// Initializes a new instance of the <see cref="VSGenericTarget"/> class. | 88 | |
89 | /// </summary> | 89 | /// <summary> |
90 | protected VSGenericTarget() | 90 | /// Initializes a new instance of the <see cref="VSGenericTarget"/> class. |
91 | { | 91 | /// </summary> |
92 | tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); | 92 | protected VSGenericTarget() |
93 | tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); | 93 | { |
94 | tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); | 94 | tools["C#"] = new ToolInfo("C#", "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}", "csproj", "CSHARP", "$(MSBuildBinPath)\\Microsoft.CSHARP.Targets"); |
95 | tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); | 95 | tools["Database"] = new ToolInfo("Database", "{4F174C21-8C12-11D0-8340-0000F80270F8}", "dbp", "UNKNOWN"); |
96 | tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); | 96 | tools["Boo"] = new ToolInfo("Boo", "{45CEA7DC-C2ED-48A6-ACE0-E16144C02365}", "booproj", "Boo", "$(BooBinPath)\\Boo.Microsoft.Build.targets"); |
97 | } | 97 | tools["VisualBasic"] = new ToolInfo("VisualBasic", "{F184B08F-C81C-45F6-A57F-5ABD9991F28F}", "vbproj", "VisualBasic", "$(MSBuildBinPath)\\Microsoft.VisualBasic.Targets"); |
98 | 98 | tools["Folder"] = new ToolInfo("Folder", "{2150E333-8FDC-42A3-9474-1A3956D46DE8}", null, null); | |
99 | #endregion | 99 | } |
100 | 100 | ||
101 | #region Private Methods | 101 | #endregion |
102 | 102 | ||
103 | private string MakeRefPath(ProjectNode project) | 103 | #region Private Methods |
104 | { | 104 | |
105 | string ret = ""; | 105 | private string MakeRefPath(ProjectNode project) |
106 | foreach (ReferencePathNode node in project.ReferencePaths) | 106 | { |
107 | { | 107 | string ret = ""; |
108 | try | 108 | foreach (ReferencePathNode node in project.ReferencePaths) |
109 | { | 109 | { |
110 | string fullPath = Helper.ResolvePath(node.Path); | 110 | try |
111 | if (ret.Length < 1) | 111 | { |
112 | { | 112 | string fullPath = Helper.ResolvePath(node.Path); |
113 | ret = fullPath; | 113 | if (ret.Length < 1) |
114 | } | 114 | { |
115 | else | 115 | ret = fullPath; |
116 | { | 116 | } |
117 | ret += ";" + fullPath; | 117 | else |
118 | } | 118 | { |
119 | } | 119 | ret += ";" + fullPath; |
120 | catch (ArgumentException) | 120 | } |
121 | { | 121 | } |
122 | kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); | 122 | catch (ArgumentException) |
123 | } | 123 | { |
124 | } | 124 | kernel.Log.Write(LogType.Warning, "Could not resolve reference path: {0}", node.Path); |
125 | 125 | } | |
126 | return ret; | 126 | } |
127 | } | 127 | |
128 | 128 | return ret; | |
129 | private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) | 129 | } |
130 | { | 130 | |
131 | SolutionNode node = solution; | 131 | private static ProjectNode FindProjectInSolution(string name, SolutionNode solution) |
132 | 132 | { | |
133 | while (node.Parent is SolutionNode) | 133 | SolutionNode node = solution; |
134 | node = node.Parent as SolutionNode; | 134 | |
135 | 135 | while (node.Parent is SolutionNode) | |
136 | return FindProjectInSolutionRecursively(name, node); | 136 | node = node.Parent as SolutionNode; |
137 | } | 137 | |
138 | 138 | return FindProjectInSolutionRecursively(name, node); | |
139 | private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) | 139 | } |
140 | { | 140 | |
141 | if (solution.ProjectsTable.ContainsKey(name)) | 141 | private static ProjectNode FindProjectInSolutionRecursively(string name, SolutionNode solution) |
142 | return solution.ProjectsTable[name]; | 142 | { |
143 | 143 | if (solution.ProjectsTable.ContainsKey(name)) | |
144 | foreach (SolutionNode child in solution.Solutions) | 144 | return solution.ProjectsTable[name]; |
145 | { | 145 | |
146 | ProjectNode node = FindProjectInSolutionRecursively(name, child); | 146 | foreach (SolutionNode child in solution.Solutions) |
147 | if (node != null) | 147 | { |
148 | return node; | 148 | ProjectNode node = FindProjectInSolutionRecursively(name, child); |
149 | } | 149 | if (node != null) |
150 | 150 | return node; | |
151 | return null; | 151 | } |
152 | } | 152 | |
153 | 153 | return null; | |
154 | private void WriteProject(SolutionNode solution, ProjectNode project) | 154 | } |
155 | { | 155 | |
156 | if (!tools.ContainsKey(project.Language)) | 156 | private void WriteProject(SolutionNode solution, ProjectNode project) |
157 | { | 157 | { |
158 | throw new UnknownLanguageException("Unknown .NET language: " + project.Language); | 158 | if (!tools.ContainsKey(project.Language)) |
159 | } | 159 | { |
160 | 160 | throw new UnknownLanguageException("Unknown .NET language: " + project.Language); | |
161 | ToolInfo toolInfo = tools[project.Language]; | 161 | } |
162 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); | 162 | |
163 | StreamWriter ps = new StreamWriter(projectFile); | 163 | ToolInfo toolInfo = tools[project.Language]; |
164 | 164 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); | |
165 | kernel.CurrentWorkingDirectory.Push(); | 165 | StreamWriter ps = new StreamWriter(projectFile); |
166 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); | 166 | |
167 | 167 | kernel.CurrentWorkingDirectory.Push(); | |
168 | #region Project File | 168 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); |
169 | using (ps) | 169 | |
170 | { | 170 | #region Project File |
171 | ps.WriteLine("<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {0}>", GetToolsVersionXml(project.FrameworkVersion)); | 171 | using (ps) |
172 | ps.WriteLine(" <PropertyGroup>"); | 172 | { |
173 | ps.WriteLine(" <ProjectType>Local</ProjectType>"); | 173 | string targets = ""; |
174 | ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", ProductVersion); | 174 | |
175 | ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", SchemaVersion); | 175 | if(project.Files.CopyFiles > 0) |
176 | ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper()); | 176 | targets = "Build;CopyFiles"; |
177 | 177 | else | |
178 | // Visual Studio has a hard coded guid for the project type | 178 | targets = "Build"; |
179 | if (project.Type == ProjectType.Web) | 179 | |
180 | ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>"); | 180 | ps.WriteLine("<Project DefaultTargets=\"{0}\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" {1}>", targets, GetToolsVersionXml(project.FrameworkVersion)); |
181 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); | 181 | ps.WriteLine(" <PropertyGroup>"); |
182 | ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon); | 182 | ps.WriteLine(" <ProjectType>Local</ProjectType>"); |
183 | ps.WriteLine(" <AssemblyKeyContainerName>"); | 183 | ps.WriteLine(" <ProductVersion>{0}</ProductVersion>", ProductVersion); |
184 | ps.WriteLine(" </AssemblyKeyContainerName>"); | 184 | ps.WriteLine(" <SchemaVersion>{0}</SchemaVersion>", SchemaVersion); |
185 | ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName); | 185 | ps.WriteLine(" <ProjectGuid>{{{0}}}</ProjectGuid>", project.Guid.ToString().ToUpper()); |
186 | foreach (ConfigurationNode conf in project.Configurations) | 186 | |
187 | { | 187 | // Visual Studio has a hard coded guid for the project type |
188 | if (conf.Options.KeyFile != "") | 188 | if (project.Type == ProjectType.Web) |
189 | { | 189 | ps.WriteLine(" <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>"); |
190 | ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile); | 190 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>"); |
191 | ps.WriteLine(" <SignAssembly>true</SignAssembly>"); | 191 | ps.WriteLine(" <ApplicationIcon>{0}</ApplicationIcon>", project.AppIcon); |
192 | break; | 192 | ps.WriteLine(" <AssemblyKeyContainerName>"); |
193 | } | 193 | ps.WriteLine(" </AssemblyKeyContainerName>"); |
194 | } | 194 | ps.WriteLine(" <AssemblyName>{0}</AssemblyName>", project.AssemblyName); |
195 | ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>"); | 195 | foreach (ConfigurationNode conf in project.Configurations) |
196 | ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>"); | 196 | { |
197 | ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>"); | 197 | if (conf.Options.KeyFile != "") |
198 | ps.WriteLine(" <DelaySign>false</DelaySign>"); | 198 | { |
199 | ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", ".")); | 199 | ps.WriteLine(" <AssemblyOriginatorKeyFile>{0}</AssemblyOriginatorKeyFile>", conf.Options.KeyFile); |
200 | 200 | ps.WriteLine(" <SignAssembly>true</SignAssembly>"); | |
201 | ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); | 201 | break; |
202 | ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder); | 202 | } |
203 | ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace); | 203 | } |
204 | ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject); | 204 | ps.WriteLine(" <DefaultClientScript>JScript</DefaultClientScript>"); |
205 | if (string.IsNullOrEmpty(project.DebugStartParameters)) | 205 | ps.WriteLine(" <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>"); |
206 | { | 206 | ps.WriteLine(" <DefaultTargetSchema>IE50</DefaultTargetSchema>"); |
207 | ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters); | 207 | ps.WriteLine(" <DelaySign>false</DelaySign>"); |
208 | } | 208 | ps.WriteLine(" <TargetFrameworkVersion>{0}</TargetFrameworkVersion>", project.FrameworkVersion.ToString().Replace("_", ".")); |
209 | ps.WriteLine(" <FileUpgradeFlags>"); | 209 | |
210 | ps.WriteLine(" </FileUpgradeFlags>"); | 210 | ps.WriteLine(" <OutputType>{0}</OutputType>", project.Type == ProjectType.Web ? ProjectType.Library.ToString() : project.Type.ToString()); |
211 | 211 | ps.WriteLine(" <AppDesignerFolder>{0}</AppDesignerFolder>", project.DesignerFolder); | |
212 | ps.WriteLine(" </PropertyGroup>"); | 212 | ps.WriteLine(" <RootNamespace>{0}</RootNamespace>", project.RootNamespace); |
213 | 213 | ps.WriteLine(" <StartupObject>{0}</StartupObject>", project.StartupObject); | |
214 | foreach (ConfigurationNode conf in project.Configurations) | 214 | if (string.IsNullOrEmpty(project.DebugStartParameters)) |
215 | { | 215 | { |
216 | ps.Write(" <PropertyGroup "); | 216 | ps.WriteLine(" <StartArguments>{0}</StartArguments>", project.DebugStartParameters); |
217 | ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|{1}' \">", conf.Name, conf.Platform); | 217 | } |
218 | ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]); | 218 | ps.WriteLine(" <FileUpgradeFlags>"); |
219 | ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]); | 219 | ps.WriteLine(" </FileUpgradeFlags>"); |
220 | ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]); | 220 | |
221 | ps.WriteLine(" <ConfigurationOverrideFile>"); | 221 | ps.WriteLine(" </PropertyGroup>"); |
222 | ps.WriteLine(" </ConfigurationOverrideFile>"); | 222 | |
223 | ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]); | 223 | foreach (ConfigurationNode conf in project.Configurations) |
224 | ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); | 224 | { |
225 | ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]); | 225 | ps.Write(" <PropertyGroup "); |
226 | ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]); | 226 | ps.WriteLine("Condition=\" '$(Configuration)|$(Platform)' == '{0}|{1}' \">", conf.Name, conf.Platform); |
227 | ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]); | 227 | ps.WriteLine(" <AllowUnsafeBlocks>{0}</AllowUnsafeBlocks>", conf.Options["AllowUnsafe"]); |
228 | if (project.Type != ProjectType.Web) | 228 | ps.WriteLine(" <BaseAddress>{0}</BaseAddress>", conf.Options["BaseAddress"]); |
229 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", | 229 | ps.WriteLine(" <CheckForOverflowUnderflow>{0}</CheckForOverflowUnderflow>", conf.Options["CheckUnderflowOverflow"]); |
230 | Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); | 230 | ps.WriteLine(" <ConfigurationOverrideFile>"); |
231 | else | 231 | ps.WriteLine(" </ConfigurationOverrideFile>"); |
232 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", | 232 | ps.WriteLine(" <DefineConstants>{0}</DefineConstants>", conf.Options["CompilerDefines"]); |
233 | Helper.EndPath(Helper.NormalizePath("bin\\"))); | 233 | ps.WriteLine(" <DocumentationFile>{0}</DocumentationFile>", Helper.NormalizePath(conf.Options["XmlDocFile"].ToString())); |
234 | 234 | ps.WriteLine(" <DebugSymbols>{0}</DebugSymbols>", conf.Options["DebugInformation"]); | |
235 | ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]); | 235 | ps.WriteLine(" <FileAlignment>{0}</FileAlignment>", conf.Options["FileAlignment"]); |
236 | ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]); | 236 | ps.WriteLine(" <Optimize>{0}</Optimize>", conf.Options["OptimizeCode"]); |
237 | ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]); | 237 | if (project.Type != ProjectType.Web) |
238 | ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]); | 238 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", |
239 | ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]); | 239 | Helper.EndPath(Helper.NormalizePath(conf.Options["OutputPath"].ToString()))); |
240 | ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]); | 240 | else |
241 | ps.WriteLine(" <PlatformTarget>{0}</PlatformTarget>", conf.Platform); | 241 | ps.WriteLine(" <OutputPath>{0}</OutputPath>", |
242 | ps.WriteLine(" </PropertyGroup>"); | 242 | Helper.EndPath(Helper.NormalizePath("bin\\"))); |
243 | } | 243 | |
244 | 244 | ps.WriteLine(" <RegisterForComInterop>{0}</RegisterForComInterop>", conf.Options["RegisterComInterop"]); | |
245 | //ps.WriteLine(" </Settings>"); | 245 | ps.WriteLine(" <RemoveIntegerChecks>{0}</RemoveIntegerChecks>", conf.Options["RemoveIntegerChecks"]); |
246 | 246 | ps.WriteLine(" <TreatWarningsAsErrors>{0}</TreatWarningsAsErrors>", conf.Options["WarningsAsErrors"]); | |
247 | Dictionary<ReferenceNode, ProjectNode> projectReferences = new Dictionary<ReferenceNode, ProjectNode>(); | 247 | ps.WriteLine(" <WarningLevel>{0}</WarningLevel>", conf.Options["WarningLevel"]); |
248 | List<ReferenceNode> otherReferences = new List<ReferenceNode>(); | 248 | ps.WriteLine(" <NoStdLib>{0}</NoStdLib>", conf.Options["NoStdLib"]); |
249 | 249 | ps.WriteLine(" <NoWarn>{0}</NoWarn>", conf.Options["SuppressWarnings"]); | |
250 | foreach (ReferenceNode refr in project.References) | 250 | ps.WriteLine(" <PlatformTarget>{0}</PlatformTarget>", conf.Platform); |
251 | { | 251 | ps.WriteLine(" </PropertyGroup>"); |
252 | ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); | 252 | } |
253 | 253 | ||
254 | if (projectNode == null) | 254 | //ps.WriteLine(" </Settings>"); |
255 | otherReferences.Add(refr); | 255 | |
256 | else | 256 | Dictionary<ReferenceNode, ProjectNode> projectReferences = new Dictionary<ReferenceNode, ProjectNode>(); |
257 | projectReferences.Add(refr, projectNode); | 257 | List<ReferenceNode> otherReferences = new List<ReferenceNode>(); |
258 | } | 258 | |
259 | // Assembly References | 259 | foreach (ReferenceNode refr in project.References) |
260 | ps.WriteLine(" <ItemGroup>"); | 260 | { |
261 | 261 | ProjectNode projectNode = FindProjectInSolution(refr.Name, solution); | |
262 | foreach (ReferenceNode refr in otherReferences) | 262 | |
263 | { | 263 | if (projectNode == null) |
264 | ps.Write(" <Reference"); | 264 | otherReferences.Add(refr); |
265 | ps.Write(" Include=\""); | 265 | else |
266 | ps.Write(refr.Name); | 266 | projectReferences.Add(refr, projectNode); |
267 | ps.WriteLine("\" >"); | 267 | } |
268 | ps.Write(" <Name>"); | 268 | // Assembly References |
269 | ps.Write(refr.Name); | 269 | ps.WriteLine(" <ItemGroup>"); |
270 | ps.WriteLine("</Name>"); | 270 | |
271 | 271 | foreach (ReferenceNode refr in otherReferences) | |
272 | if(!String.IsNullOrEmpty(refr.Path)) | 272 | { |
273 | { | 273 | ps.Write(" <Reference"); |
274 | // Use absolute path to assembly (for determining assembly type) | 274 | ps.Write(" Include=\""); |
275 | string absolutePath = Path.Combine(project.FullPath, refr.Path); | 275 | ps.Write(refr.Name); |
276 | if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { | 276 | ps.WriteLine("\" >"); |
277 | // Assembly is an executable (exe) | 277 | ps.Write(" <Name>"); |
278 | ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); | 278 | ps.Write(refr.Name); |
279 | } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { | 279 | ps.WriteLine("</Name>"); |
280 | // Assembly is an library (dll) | 280 | |
281 | ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); | 281 | if(!String.IsNullOrEmpty(refr.Path)) |
282 | } else { | 282 | { |
283 | string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); | 283 | // Use absolute path to assembly (for determining assembly type) |
284 | kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); | 284 | string absolutePath = Path.Combine(project.FullPath, refr.Path); |
285 | ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); | 285 | if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "exe"))) { |
286 | } | 286 | // Assembly is an executable (exe) |
287 | } | 287 | ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "exe")); |
288 | 288 | } else if(File.Exists(Helper.MakeFilePath(absolutePath, refr.Name, "dll"))) { | |
289 | ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy); | 289 | // Assembly is an library (dll) |
290 | ps.WriteLine(" </Reference>"); | 290 | ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); |
291 | } | 291 | } else { |
292 | ps.WriteLine(" </ItemGroup>"); | 292 | string referencePath = Helper.MakeFilePath(refr.Path, refr.Name, "dll"); |
293 | 293 | kernel.Log.Write(LogType.Warning, "Reference \"{0}\": The specified file doesn't exist.", referencePath); | |
294 | //Project References | 294 | ps.WriteLine(" <HintPath>{0}</HintPath>", Helper.MakeFilePath(refr.Path, refr.Name, "dll")); |
295 | ps.WriteLine(" <ItemGroup>"); | 295 | } |
296 | foreach (KeyValuePair<ReferenceNode, ProjectNode> pair in projectReferences) | 296 | } |
297 | { | 297 | |
298 | ToolInfo tool = tools[pair.Value.Language]; | 298 | ps.WriteLine(" <Private>{0}</Private>", refr.LocalCopy); |
299 | if (tools == null) | 299 | ps.WriteLine(" </Reference>"); |
300 | throw new UnknownLanguageException(); | 300 | } |
301 | 301 | ps.WriteLine(" </ItemGroup>"); | |
302 | string path = | 302 | |
303 | Helper.MakePathRelativeTo(project.FullPath, | 303 | //Project References |
304 | Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); | 304 | ps.WriteLine(" <ItemGroup>"); |
305 | ps.WriteLine(" <ProjectReference Include=\"{0}\">", path); | 305 | foreach (KeyValuePair<ReferenceNode, ProjectNode> pair in projectReferences) |
306 | 306 | { | |
307 | // TODO: Allow reference to visual basic projects | 307 | ToolInfo tool = tools[pair.Value.Language]; |
308 | ps.WriteLine(" <Name>{0}</Name>", pair.Value.Name); | 308 | if (tools == null) |
309 | ps.WriteLine(" <Project>{0}</Project>", pair.Value.Guid.ToString("B").ToUpper()); | 309 | throw new UnknownLanguageException(); |
310 | ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper()); | 310 | |
311 | 311 | string path = | |
312 | //This is the Copy Local flag in VS | 312 | Helper.MakePathRelativeTo(project.FullPath, |
313 | ps.WriteLine(" <Private>{0}</Private>", pair.Key.LocalCopy); | 313 | Helper.MakeFilePath(pair.Value.FullPath, pair.Value.Name, tool.FileExtension)); |
314 | 314 | ps.WriteLine(" <ProjectReference Include=\"{0}\">", path); | |
315 | ps.WriteLine(" </ProjectReference>"); | 315 | |
316 | } | 316 | // TODO: Allow reference to visual basic projects |
317 | ps.WriteLine(" </ItemGroup>"); | 317 | ps.WriteLine(" <Name>{0}</Name>", pair.Value.Name); |
318 | 318 | ps.WriteLine(" <Project>{0}</Project>", pair.Value.Guid.ToString("B").ToUpper()); | |
319 | // ps.WriteLine(" </Build>"); | 319 | ps.WriteLine(" <Package>{0}</Package>", tool.Guid.ToUpper()); |
320 | ps.WriteLine(" <ItemGroup>"); | 320 | |
321 | 321 | //This is the Copy Local flag in VS | |
322 | // ps.WriteLine(" <Include>"); | 322 | ps.WriteLine(" <Private>{0}</Private>", pair.Key.LocalCopy); |
323 | List<string> list = new List<string>(); | 323 | |
324 | 324 | ps.WriteLine(" </ProjectReference>"); | |
325 | foreach (string path in project.Files) | 325 | } |
326 | { | 326 | ps.WriteLine(" </ItemGroup>"); |
327 | string lower = path.ToLower(); | 327 | |
328 | if (lower.EndsWith(".resx")) | 328 | // ps.WriteLine(" </Build>"); |
329 | { | 329 | ps.WriteLine(" <ItemGroup>"); |
330 | string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); | 330 | |
331 | if (!list.Contains(codebehind)) | 331 | // ps.WriteLine(" <Include>"); |
332 | list.Add(codebehind); | 332 | List<string> list = new List<string>(); |
333 | } | 333 | |
334 | 334 | foreach (string path in project.Files) | |
335 | } | 335 | { |
336 | 336 | string lower = path.ToLower(); | |
337 | foreach (string filePath in project.Files) | 337 | if (lower.EndsWith(".resx")) |
338 | { | 338 | { |
339 | // if (file == "Properties\\Bind.Designer.cs") | 339 | string codebehind = String.Format("{0}.Designer{1}", path.Substring(0, path.LastIndexOf('.')), toolInfo.LanguageExtension); |
340 | // { | 340 | if (!list.Contains(codebehind)) |
341 | // Console.WriteLine("Wait a minute!"); | 341 | list.Add(codebehind); |
342 | // Console.WriteLine(project.Files.GetSubType(file).ToString()); | 342 | } |
343 | // } | 343 | |
344 | SubType subType = project.Files.GetSubType(filePath); | 344 | } |
345 | 345 | ||
346 | // Visual Studio chokes on file names if forward slash is used as a path separator | 346 | |
347 | // instead of backslash. So we must make sure that all file paths written to the | 347 | foreach (string filePath in project.Files) |
348 | // project file use \ as a path separator. | 348 | { |
349 | string file = filePath.Replace(@"/", @"\"); | 349 | // Add the filePath with the destination as the key |
350 | 350 | // will use it later to form the copy parameters with Include lists | |
351 | if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer | 351 | // for each destination |
352 | && subType != SubType.CodeBehind) | 352 | if (project.Files.GetBuildAction(filePath) == BuildAction.Copy) |
353 | { | 353 | continue; |
354 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); | 354 | // if (file == "Properties\\Bind.Designer.cs") |
355 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); | 355 | // { |
356 | ps.WriteLine(" <SubType>Designer</SubType>"); | 356 | // Console.WriteLine("Wait a minute!"); |
357 | ps.WriteLine(" </EmbeddedResource>"); | 357 | // Console.WriteLine(project.Files.GetSubType(file).ToString()); |
358 | // | 358 | // } |
359 | } | 359 | SubType subType = project.Files.GetSubType(filePath); |
360 | 360 | ||
361 | if (subType == SubType.Designer) | 361 | // Visual Studio chokes on file names if forward slash is used as a path separator |
362 | { | 362 | // instead of backslash. So we must make sure that all file paths written to the |
363 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file); | 363 | // project file use \ as a path separator. |
364 | 364 | string file = filePath.Replace(@"/", @"\"); | |
365 | string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; | 365 | |
366 | string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; | 366 | if (subType != SubType.Code && subType != SubType.Settings && subType != SubType.Designer |
367 | 367 | && subType != SubType.CodeBehind) | |
368 | // Check for a parent .cs file with the same name as this designer file | 368 | { |
369 | if (File.Exists(Helper.NormalizePath(dependent_name))) | 369 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file.Substring(0, file.LastIndexOf('.')) + ".resx"); |
370 | { | 370 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file)); |
371 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); | 371 | ps.WriteLine(" <SubType>Designer</SubType>"); |
372 | } | 372 | ps.WriteLine(" </EmbeddedResource>"); |
373 | else | 373 | // |
374 | { | 374 | } |
375 | ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>"); | 375 | |
376 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", Path.GetFileName(autogen_name)); | 376 | if (subType == SubType.Designer) |
377 | ps.WriteLine(" <SubType>" + subType + "</SubType>"); | 377 | { |
378 | } | 378 | ps.WriteLine(" <EmbeddedResource Include=\"{0}\">", file); |
379 | 379 | ||
380 | ps.WriteLine(" </EmbeddedResource>"); | 380 | string autogen_name = file.Substring(0, file.LastIndexOf('.')) + ".Designer.cs"; |
381 | if (File.Exists(Helper.NormalizePath(autogen_name))) | 381 | string dependent_name = filePath.Substring(0, file.LastIndexOf('.')) + ".cs"; |
382 | { | 382 | |
383 | ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name); | 383 | // Check for a parent .cs file with the same name as this designer file |
384 | //ps.WriteLine(" <DesignTime>True</DesignTime>"); | 384 | if (File.Exists(Helper.NormalizePath(dependent_name))) |
385 | 385 | { | |
386 | // If a parent .cs file exists, link this autogen file to it. Otherwise link | 386 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); |
387 | // to the designer file | 387 | } |
388 | if (File.Exists(dependent_name)) | 388 | else |
389 | { | 389 | { |
390 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); | 390 | ps.WriteLine(" <Generator>ResXFileCodeGenerator</Generator>"); |
391 | } | 391 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", Path.GetFileName(autogen_name)); |
392 | else | 392 | ps.WriteLine(" <SubType>" + subType + "</SubType>"); |
393 | { | 393 | } |
394 | ps.WriteLine(" <AutoGen>True</AutoGen>"); | 394 | |
395 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(filePath)); | 395 | ps.WriteLine(" </EmbeddedResource>"); |
396 | } | 396 | if (File.Exists(Helper.NormalizePath(autogen_name))) |
397 | 397 | { | |
398 | ps.WriteLine(" </Compile>"); | 398 | ps.WriteLine(" <Compile Include=\"{0}\">", autogen_name); |
399 | } | 399 | //ps.WriteLine(" <DesignTime>True</DesignTime>"); |
400 | list.Add(autogen_name); | 400 | |
401 | } | 401 | // If a parent .cs file exists, link this autogen file to it. Otherwise link |
402 | if (subType == SubType.Settings) | 402 | // to the designer file |
403 | { | 403 | if (File.Exists(dependent_name)) |
404 | ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); | 404 | { |
405 | ps.WriteLine("Include=\"{0}\">", file); | 405 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(dependent_name)); |
406 | string fileName = Path.GetFileName(filePath); | 406 | } |
407 | if (project.Files.GetBuildAction(filePath) == BuildAction.None) | 407 | else |
408 | { | 408 | { |
409 | ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>"); | 409 | ps.WriteLine(" <AutoGen>True</AutoGen>"); |
410 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); | 410 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(filePath)); |
411 | } | 411 | } |
412 | else | 412 | |
413 | { | 413 | ps.WriteLine(" </Compile>"); |
414 | ps.WriteLine(" <SubType>Code</SubType>"); | 414 | } |
415 | ps.WriteLine(" <AutoGen>True</AutoGen>"); | 415 | list.Add(autogen_name); |
416 | ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); | 416 | } |
417 | string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); | 417 | if (subType == SubType.Settings) |
418 | string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); | 418 | { |
419 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings")); | 419 | ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); |
420 | } | 420 | ps.WriteLine("Include=\"{0}\">", file); |
421 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath)); | 421 | string fileName = Path.GetFileName(filePath); |
422 | } | 422 | if (project.Files.GetBuildAction(filePath) == BuildAction.None) |
423 | else if (subType != SubType.Designer) | 423 | { |
424 | { | 424 | ps.WriteLine(" <Generator>SettingsSingleFileGenerator</Generator>"); |
425 | string path = Helper.NormalizePath(file); | 425 | ps.WriteLine(" <LastGenOutput>{0}</LastGenOutput>", fileName.Substring(0, fileName.LastIndexOf('.')) + ".Designer.cs"); |
426 | string path_lower = path.ToLower(); | 426 | } |
427 | 427 | else | |
428 | if (!list.Contains(filePath)) | 428 | { |
429 | { | 429 | ps.WriteLine(" <SubType>Code</SubType>"); |
430 | ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); | 430 | ps.WriteLine(" <AutoGen>True</AutoGen>"); |
431 | 431 | ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); | |
432 | int startPos = 0; | 432 | string fileNameShort = fileName.Substring(0, fileName.LastIndexOf('.')); |
433 | if (project.Files.GetPreservePath(filePath)) | 433 | string fileNameShorter = fileNameShort.Substring(0, fileNameShort.LastIndexOf('.')); |
434 | { | 434 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(fileNameShorter + ".settings")); |
435 | while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) | 435 | } |
436 | startPos++; | 436 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath)); |
437 | 437 | } | |
438 | } | 438 | else if (subType != SubType.Designer) |
439 | else | 439 | { |
440 | { | 440 | string path = Helper.NormalizePath(file); |
441 | startPos = file.LastIndexOf(Path.GetFileName(path)); | 441 | string path_lower = path.ToLower(); |
442 | } | 442 | |
443 | 443 | if (!list.Contains(filePath)) | |
444 | // be sure to write out the path with backslashes so VS recognizes | 444 | { |
445 | // the file properly. | 445 | ps.Write(" <{0} ", project.Files.GetBuildAction(filePath)); |
446 | ps.WriteLine("Include=\"{0}\">", file); | 446 | |
447 | 447 | int startPos = 0; | |
448 | int last_period_index = file.LastIndexOf('.'); | 448 | if (project.Files.GetPreservePath(filePath)) |
449 | string short_file_name = file.Substring(0, last_period_index); | 449 | { |
450 | string extension = Path.GetExtension(path); | 450 | while ((@"./\").IndexOf(file.Substring(startPos, 1)) != -1) |
451 | // make this upper case, so that when File.Exists tests for the | 451 | startPos++; |
452 | // existence of a designer file on a case-sensitive platform, | 452 | |
453 | // it is correctly identified. | 453 | } |
454 | string designer_format = string.Format(".Designer{0}", extension); | 454 | else |
455 | 455 | { | |
456 | if (path_lower.EndsWith(designer_format.ToLowerInvariant())) | 456 | startPos = file.LastIndexOf(Path.GetFileName(path)); |
457 | { | 457 | } |
458 | int designer_index = path.IndexOf(designer_format); | 458 | |
459 | string file_name = path.Substring(0, designer_index); | 459 | // be sure to write out the path with backslashes so VS recognizes |
460 | 460 | // the file properly. | |
461 | // There are two corrections to the next lines: | 461 | ps.WriteLine("Include=\"{0}\">", file); |
462 | // 1. Fix the connection between a designer file and a form | 462 | |
463 | // or usercontrol that don't have an associated resx file. | 463 | int last_period_index = file.LastIndexOf('.'); |
464 | // 2. Connect settings files to associated designer files. | 464 | string short_file_name = (last_period_index >= 0) |
465 | if (File.Exists(file_name + extension)) | 465 | ? file.Substring(0, last_period_index) |
466 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + extension)); | 466 | : file; |
467 | else if (File.Exists(file_name + ".resx")) | 467 | string extension = Path.GetExtension(path); |
468 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx")); | 468 | // make this upper case, so that when File.Exists tests for the |
469 | else if (File.Exists(file_name + ".settings")) | 469 | // existence of a designer file on a case-sensitive platform, |
470 | { | 470 | // it is correctly identified. |
471 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".settings")); | 471 | string designer_format = string.Format(".Designer{0}", extension); |
472 | ps.WriteLine(" <AutoGen>True</AutoGen>"); | 472 | |
473 | ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); | 473 | if (path_lower.EndsWith(designer_format.ToLowerInvariant())) |
474 | } | 474 | { |
475 | } | 475 | int designer_index = path.IndexOf(designer_format); |
476 | else if (subType == SubType.CodeBehind) | 476 | string file_name = path.Substring(0, designer_index); |
477 | { | 477 | |
478 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name)); | 478 | // There are two corrections to the next lines: |
479 | } | 479 | // 1. Fix the connection between a designer file and a form |
480 | if (project.Files.GetIsLink(filePath)) | 480 | // or usercontrol that don't have an associated resx file. |
481 | { | 481 | // 2. Connect settings files to associated designer files. |
482 | string alias = project.Files.GetLinkPath(filePath); | 482 | if (File.Exists(file_name + extension)) |
483 | alias += file.Substring(startPos); | 483 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + extension)); |
484 | alias = Helper.NormalizePath(alias); | 484 | else if (File.Exists(file_name + ".resx")) |
485 | ps.WriteLine(" <Link>{0}</Link>", alias); | 485 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".resx")); |
486 | } | 486 | else if (File.Exists(file_name + ".settings")) |
487 | else if (project.Files.GetBuildAction(filePath) != BuildAction.None) | 487 | { |
488 | { | 488 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(file_name + ".settings")); |
489 | if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) | 489 | ps.WriteLine(" <AutoGen>True</AutoGen>"); |
490 | { | 490 | ps.WriteLine(" <DesignTimeSharedInput>True</DesignTimeSharedInput>"); |
491 | ps.WriteLine(" <SubType>{0}</SubType>", subType); | 491 | } |
492 | } | 492 | } |
493 | } | 493 | else if (subType == SubType.CodeBehind) |
494 | 494 | { | |
495 | if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) | 495 | ps.WriteLine(" <DependentUpon>{0}</DependentUpon>", Path.GetFileName(short_file_name)); |
496 | { | 496 | } |
497 | ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(filePath)); | 497 | if (project.Files.GetIsLink(filePath)) |
498 | } | 498 | { |
499 | 499 | string alias = project.Files.GetLinkPath(filePath); | |
500 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath)); | 500 | alias += file.Substring(startPos); |
501 | } | 501 | alias = Helper.NormalizePath(alias); |
502 | } | 502 | ps.WriteLine(" <Link>{0}</Link>", alias); |
503 | } | 503 | } |
504 | 504 | else if (project.Files.GetBuildAction(filePath) != BuildAction.None) | |
505 | ps.WriteLine(" </ItemGroup>"); | 505 | { |
506 | ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />"); | 506 | if (project.Files.GetBuildAction(filePath) != BuildAction.EmbeddedResource) |
507 | ps.WriteLine(" <PropertyGroup>"); | 507 | { |
508 | ps.WriteLine(" <PreBuildEvent>"); | 508 | ps.WriteLine(" <SubType>{0}</SubType>", subType); |
509 | ps.WriteLine(" </PreBuildEvent>"); | 509 | } |
510 | ps.WriteLine(" <PostBuildEvent>"); | 510 | } |
511 | ps.WriteLine(" </PostBuildEvent>"); | 511 | |
512 | ps.WriteLine(" </PropertyGroup>"); | 512 | if (project.Files.GetCopyToOutput(filePath) != CopyToOutput.Never) |
513 | ps.WriteLine("</Project>"); | 513 | { |
514 | } | 514 | ps.WriteLine(" <CopyToOutputDirectory>{0}</CopyToOutputDirectory>", project.Files.GetCopyToOutput(filePath)); |
515 | #endregion | 515 | } |
516 | 516 | ||
517 | #region User File | 517 | ps.WriteLine(" </{0}>", project.Files.GetBuildAction(filePath)); |
518 | 518 | } | |
519 | ps = new StreamWriter(projectFile + ".user"); | 519 | } |
520 | using (ps) | 520 | } |
521 | { | 521 | ps.WriteLine(" </ItemGroup>"); |
522 | // Get the first configuration from the project. | 522 | |
523 | ConfigurationNode firstConfiguration = null; | 523 | /* |
524 | 524 | * Copy Task | |
525 | if (project.Configurations.Count > 0) | 525 | * |
526 | { | 526 | */ |
527 | firstConfiguration = project.Configurations[0]; | 527 | if ( project.Files.CopyFiles > 0 ) { |
528 | } | 528 | |
529 | 529 | Dictionary<string, string> IncludeTags = new Dictionary<string, string>(); | |
530 | ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">"); | 530 | int TagCount = 0; |
531 | //ps.WriteLine( "<VisualStudioProject>" ); | 531 | |
532 | //ps.WriteLine(" <{0}>", toolInfo.XMLTag); | 532 | // Handle Copy tasks |
533 | //ps.WriteLine(" <Build>"); | 533 | ps.WriteLine(" <ItemGroup>"); |
534 | ps.WriteLine(" <PropertyGroup>"); | 534 | foreach (string destPath in project.Files.Destinations) |
535 | //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project)); | 535 | { |
536 | 536 | string tag = "FilesToCopy_" + TagCount.ToString("0000"); | |
537 | if (firstConfiguration != null) | 537 | |
538 | { | 538 | ps.WriteLine(" <{0} Include=\"{1}\" />", tag, String.Join(";", project.Files.SourceFiles(destPath))); |
539 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">{0}</Configuration>", firstConfiguration.Name); | 539 | IncludeTags.Add(destPath, tag); |
540 | ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">{0}</Platform>", firstConfiguration.Platform); | 540 | TagCount++; |
541 | } | 541 | } |
542 | 542 | ||
543 | ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project)); | 543 | ps.WriteLine(" </ItemGroup>"); |
544 | ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", ProductVersion); | 544 | |
545 | ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>"); | 545 | ps.WriteLine(" <Target Name=\"CopyFiles\">"); |
546 | ps.WriteLine(" <ProjectTrust>0</ProjectTrust>"); | 546 | |
547 | ps.WriteLine(" </PropertyGroup>"); | 547 | foreach (string destPath in project.Files.Destinations) |
548 | foreach (ConfigurationNode conf in project.Configurations) | 548 | { |
549 | { | 549 | ps.WriteLine(" <Copy SourceFiles=\"@({0})\" DestinationFolder=\"{1}\" />", |
550 | ps.Write(" <PropertyGroup"); | 550 | IncludeTags[destPath], destPath); |
551 | ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|{1}' \"", conf.Name, conf.Platform); | 551 | } |
552 | ps.WriteLine(" />"); | 552 | |
553 | } | 553 | ps.WriteLine(" </Target>"); |
554 | ps.WriteLine("</Project>"); | 554 | } |
555 | } | 555 | |
556 | #endregion | 556 | ps.WriteLine(" <Import Project=\"" + toolInfo.ImportProject + "\" />"); |
557 | 557 | ps.WriteLine(" <PropertyGroup>"); | |
558 | kernel.CurrentWorkingDirectory.Pop(); | 558 | ps.WriteLine(" <PreBuildEvent>"); |
559 | } | 559 | ps.WriteLine(" </PreBuildEvent>"); |
560 | 560 | ps.WriteLine(" <PostBuildEvent>"); | |
561 | private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) | 561 | ps.WriteLine(" </PostBuildEvent>"); |
562 | { | 562 | ps.WriteLine(" </PropertyGroup>"); |
563 | kernel.Log.Write("Creating {0} solution and project files", VersionName); | 563 | ps.WriteLine("</Project>"); |
564 | 564 | } | |
565 | foreach (SolutionNode child in solution.Solutions) | 565 | #endregion |
566 | { | 566 | |
567 | kernel.Log.Write("...Creating folder: {0}", child.Name); | 567 | #region User File |
568 | WriteSolution(child, false); | 568 | |
569 | } | 569 | ps = new StreamWriter(projectFile + ".user"); |
570 | 570 | using (ps) | |
571 | foreach (ProjectNode project in solution.Projects) | 571 | { |
572 | { | 572 | // Get the first configuration from the project. |
573 | kernel.Log.Write("...Creating project: {0}", project.Name); | 573 | ConfigurationNode firstConfiguration = null; |
574 | WriteProject(solution, project); | 574 | |
575 | } | 575 | if (project.Configurations.Count > 0) |
576 | 576 | { | |
577 | foreach (DatabaseProjectNode project in solution.DatabaseProjects) | 577 | firstConfiguration = project.Configurations[0]; |
578 | { | 578 | } |
579 | kernel.Log.Write("...Creating database project: {0}", project.Name); | 579 | |
580 | WriteDatabaseProject(solution, project); | 580 | ps.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">"); |
581 | } | 581 | //ps.WriteLine( "<VisualStudioProject>" ); |
582 | 582 | //ps.WriteLine(" <{0}>", toolInfo.XMLTag); | |
583 | if (writeSolutionToDisk) // only write main solution | 583 | //ps.WriteLine(" <Build>"); |
584 | { | 584 | ps.WriteLine(" <PropertyGroup>"); |
585 | kernel.Log.Write(""); | 585 | //ps.WriteLine(" <Settings ReferencePath=\"{0}\">", MakeRefPath(project)); |
586 | string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); | 586 | |
587 | 587 | if (firstConfiguration != null) | |
588 | using (StreamWriter ss = new StreamWriter(solutionFile)) | 588 | { |
589 | { | 589 | ps.WriteLine(" <Configuration Condition=\" '$(Configuration)' == '' \">{0}</Configuration>", firstConfiguration.Name); |
590 | kernel.CurrentWorkingDirectory.Push(); | 590 | ps.WriteLine(" <Platform Condition=\" '$(Platform)' == '' \">{0}</Platform>", firstConfiguration.Platform); |
591 | Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); | 591 | } |
592 | 592 | ||
593 | ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); | 593 | ps.WriteLine(" <ReferencePath>{0}</ReferencePath>", MakeRefPath(project)); |
594 | ss.WriteLine(SolutionTag); | 594 | ps.WriteLine(" <LastOpenVersion>{0}</LastOpenVersion>", ProductVersion); |
595 | 595 | ps.WriteLine(" <ProjectView>ProjectFiles</ProjectView>"); | |
596 | WriteProjectDeclarations(ss, solution, solution); | 596 | ps.WriteLine(" <ProjectTrust>0</ProjectTrust>"); |
597 | 597 | ps.WriteLine(" </PropertyGroup>"); | |
598 | ss.WriteLine("Global"); | 598 | foreach (ConfigurationNode conf in project.Configurations) |
599 | 599 | { | |
600 | ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); | 600 | ps.Write(" <PropertyGroup"); |
601 | foreach (ConfigurationNode conf in solution.Configurations) | 601 | ps.Write(" Condition = \" '$(Configuration)|$(Platform)' == '{0}|{1}' \"", conf.Name, conf.Platform); |
602 | { | 602 | ps.WriteLine(" />"); |
603 | ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); | 603 | } |
604 | } | 604 | ps.WriteLine("</Project>"); |
605 | ss.WriteLine("\tEndGlobalSection"); | 605 | } |
606 | 606 | #endregion | |
607 | ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); | 607 | |
608 | WriteConfigurationLines(solution.Configurations, solution, ss); | 608 | kernel.CurrentWorkingDirectory.Pop(); |
609 | ss.WriteLine("\tEndGlobalSection"); | 609 | } |
610 | 610 | ||
611 | if (solution.Solutions.Count > 0) | 611 | private void WriteSolution(SolutionNode solution, bool writeSolutionToDisk) |
612 | { | 612 | { |
613 | ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); | 613 | kernel.Log.Write("Creating {0} solution and project files", VersionName); |
614 | foreach (SolutionNode embeddedSolution in solution.Solutions) | 614 | |
615 | { | 615 | foreach (SolutionNode child in solution.Solutions) |
616 | WriteNestedProjectMap(ss, embeddedSolution); | 616 | { |
617 | } | 617 | kernel.Log.Write("...Creating folder: {0}", child.Name); |
618 | ss.WriteLine("\tEndGlobalSection"); | 618 | WriteSolution(child, false); |
619 | } | 619 | } |
620 | 620 | ||
621 | ss.WriteLine("EndGlobal"); | 621 | foreach (ProjectNode project in solution.Projects) |
622 | } | 622 | { |
623 | 623 | kernel.Log.Write("...Creating project: {0}", project.Name); | |
624 | kernel.CurrentWorkingDirectory.Pop(); | 624 | WriteProject(solution, project); |
625 | } | 625 | } |
626 | } | 626 | |
627 | 627 | foreach (DatabaseProjectNode project in solution.DatabaseProjects) | |
628 | private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) | 628 | { |
629 | { | 629 | kernel.Log.Write("...Creating database project: {0}", project.Name); |
630 | foreach (SolutionNode childSolution in embeddedSolution.Solutions) | 630 | WriteDatabaseProject(solution, project); |
631 | { | 631 | } |
632 | WriteEmbeddedSolution(writer, childSolution); | 632 | |
633 | WriteProjectDeclarations(writer, actualSolution, childSolution); | 633 | if (writeSolutionToDisk) // only write main solution |
634 | } | 634 | { |
635 | 635 | kernel.Log.Write(""); | |
636 | foreach (ProjectNode project in embeddedSolution.Projects) | 636 | string solutionFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); |
637 | { | 637 | |
638 | WriteProject(actualSolution, writer, project); | 638 | using (StreamWriter ss = new StreamWriter(solutionFile)) |
639 | } | 639 | { |
640 | 640 | kernel.CurrentWorkingDirectory.Push(); | |
641 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) | 641 | Helper.SetCurrentDir(Path.GetDirectoryName(solutionFile)); |
642 | { | 642 | |
643 | WriteProject(actualSolution, writer, dbProject); | 643 | ss.WriteLine("Microsoft Visual Studio Solution File, Format Version {0}", SolutionVersion); |
644 | } | 644 | ss.WriteLine(SolutionTag); |
645 | 645 | ||
646 | if (actualSolution.Guid == embeddedSolution.Guid) | 646 | WriteProjectDeclarations(ss, solution, solution); |
647 | { | 647 | |
648 | WriteSolutionFiles(actualSolution, writer); | 648 | ss.WriteLine("Global"); |
649 | } | 649 | |
650 | } | 650 | ss.WriteLine("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution"); |
651 | 651 | foreach (ConfigurationNode conf in solution.Configurations) | |
652 | private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) | 652 | { |
653 | { | 653 | ss.WriteLine("\t\t{0} = {0}", conf.NameAndPlatform); |
654 | foreach (ProjectNode project in embeddedSolution.Projects) | 654 | } |
655 | { | 655 | ss.WriteLine("\tEndGlobalSection"); |
656 | WriteNestedProject(writer, embeddedSolution, project.Guid); | 656 | |
657 | } | 657 | ss.WriteLine("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"); |
658 | 658 | WriteConfigurationLines(solution.Configurations, solution, ss); | |
659 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) | 659 | ss.WriteLine("\tEndGlobalSection"); |
660 | { | 660 | |
661 | WriteNestedProject(writer, embeddedSolution, dbProject.Guid); | 661 | if (solution.Solutions.Count > 0) |
662 | } | 662 | { |
663 | 663 | ss.WriteLine("\tGlobalSection(NestedProjects) = preSolution"); | |
664 | foreach (SolutionNode child in embeddedSolution.Solutions) | 664 | foreach (SolutionNode embeddedSolution in solution.Solutions) |
665 | { | 665 | { |
666 | WriteNestedProject(writer, embeddedSolution, child.Guid); | 666 | WriteNestedProjectMap(ss, embeddedSolution); |
667 | WriteNestedProjectMap(writer, child); | 667 | } |
668 | } | 668 | ss.WriteLine("\tEndGlobalSection"); |
669 | } | 669 | } |
670 | 670 | ||
671 | private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) | 671 | ss.WriteLine("EndGlobal"); |
672 | { | 672 | } |
673 | WriteNestedFolder(writer, solution.Guid, projectGuid); | 673 | |
674 | } | 674 | kernel.CurrentWorkingDirectory.Pop(); |
675 | 675 | } | |
676 | private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) | 676 | } |
677 | { | 677 | |
678 | writer.WriteLine("\t\t{0} = {1}", | 678 | private void WriteProjectDeclarations(TextWriter writer, SolutionNode actualSolution, SolutionNode embeddedSolution) |
679 | childGuid.ToString("B").ToUpper(), | 679 | { |
680 | parentGuid.ToString("B").ToUpper()); | 680 | foreach (SolutionNode childSolution in embeddedSolution.Solutions) |
681 | } | 681 | { |
682 | 682 | WriteEmbeddedSolution(writer, childSolution); | |
683 | private static void WriteConfigurationLines(IEnumerable<ConfigurationNode> configurations, SolutionNode solution, TextWriter ss) | 683 | WriteProjectDeclarations(writer, actualSolution, childSolution); |
684 | { | 684 | } |
685 | foreach (ProjectNode project in solution.Projects) | 685 | |
686 | { | 686 | foreach (ProjectNode project in embeddedSolution.Projects) |
687 | foreach (ConfigurationNode conf in configurations) | 687 | { |
688 | { | 688 | WriteProject(actualSolution, writer, project); |
689 | ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", | 689 | } |
690 | project.Guid.ToString("B").ToUpper(), | 690 | |
691 | conf.NameAndPlatform); | 691 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) |
692 | 692 | { | |
693 | ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", | 693 | WriteProject(actualSolution, writer, dbProject); |
694 | project.Guid.ToString("B").ToUpper(), | 694 | } |
695 | conf.NameAndPlatform); | 695 | |
696 | } | 696 | if (actualSolution.Guid == embeddedSolution.Guid) |
697 | } | 697 | { |
698 | 698 | WriteSolutionFiles(actualSolution, writer); | |
699 | foreach (SolutionNode child in solution.Solutions) | 699 | } |
700 | { | 700 | } |
701 | WriteConfigurationLines(configurations, child, ss); | 701 | |
702 | } | 702 | private static void WriteNestedProjectMap(TextWriter writer, SolutionNode embeddedSolution) |
703 | } | 703 | { |
704 | 704 | foreach (ProjectNode project in embeddedSolution.Projects) | |
705 | private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) | 705 | { |
706 | { | 706 | WriteNestedProject(writer, embeddedSolution, project.Guid); |
707 | if(solution.Files != null && solution.Files.Count > 0) | 707 | } |
708 | WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); | 708 | |
709 | } | 709 | foreach (DatabaseProjectNode dbProject in embeddedSolution.DatabaseProjects) |
710 | 710 | { | |
711 | private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) | 711 | WriteNestedProject(writer, embeddedSolution, dbProject.Guid); |
712 | { | 712 | } |
713 | WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); | 713 | |
714 | } | 714 | foreach (SolutionNode child in embeddedSolution.Solutions) |
715 | 715 | { | |
716 | private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) | 716 | WriteNestedProject(writer, embeddedSolution, child.Guid); |
717 | { | 717 | WriteNestedProjectMap(writer, child); |
718 | WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); | 718 | } |
719 | } | 719 | } |
720 | 720 | ||
721 | private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) | 721 | private static void WriteNestedProject(TextWriter writer, SolutionNode solution, Guid projectGuid) |
722 | { | 722 | { |
723 | if (solution.Files != null && solution.Files.Count > 0) | 723 | WriteNestedFolder(writer, solution.Guid, projectGuid); |
724 | WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); | 724 | } |
725 | } | 725 | |
726 | 726 | private static void WriteNestedFolder(TextWriter writer, Guid parentGuid, Guid childGuid) | |
727 | const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; | 727 | { |
728 | const string ProjectDeclarationEndFormat = "EndProject"; | 728 | writer.WriteLine("\t\t{0} = {1}", |
729 | 729 | childGuid.ToString("B").ToUpper(), | |
730 | private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) | 730 | parentGuid.ToString("B").ToUpper()); |
731 | { | 731 | } |
732 | if (!tools.ContainsKey(language)) | 732 | |
733 | throw new UnknownLanguageException("Unknown .NET language: " + language); | 733 | private static void WriteConfigurationLines(IEnumerable<ConfigurationNode> configurations, SolutionNode solution, TextWriter ss) |
734 | 734 | { | |
735 | ToolInfo toolInfo = tools[language]; | 735 | foreach (ProjectNode project in solution.Projects) |
736 | 736 | { | |
737 | string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); | 737 | foreach (ConfigurationNode conf in configurations) |
738 | 738 | { | |
739 | path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); | 739 | ss.WriteLine("\t\t{0}.{1}.ActiveCfg = {1}", |
740 | 740 | project.Guid.ToString("B").ToUpper(), | |
741 | WriteProject(ss, language, guid, name, path); | 741 | conf.NameAndPlatform); |
742 | } | 742 | |
743 | 743 | ss.WriteLine("\t\t{0}.{1}.Build.0 = {1}", | |
744 | private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) | 744 | project.Guid.ToString("B").ToUpper(), |
745 | { | 745 | conf.NameAndPlatform); |
746 | WriteProject(writer, language, projectGuid, name, location, null); | 746 | } |
747 | } | 747 | } |
748 | 748 | ||
749 | private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) | 749 | foreach (SolutionNode child in solution.Solutions) |
750 | { | 750 | { |
751 | if (!tools.ContainsKey(language)) | 751 | WriteConfigurationLines(configurations, child, ss); |
752 | throw new UnknownLanguageException("Unknown .NET language: " + language); | 752 | } |
753 | 753 | } | |
754 | ToolInfo toolInfo = tools[language]; | 754 | |
755 | 755 | private void WriteSolutionFiles(SolutionNode solution, TextWriter ss) | |
756 | writer.WriteLine(ProjectDeclarationBeginFormat, | 756 | { |
757 | toolInfo.Guid, | 757 | if(solution.Files != null && solution.Files.Count > 0) |
758 | name, | 758 | WriteProject(ss, "Folder", solution.Guid, "Solution Files", "Solution Files", solution.Files); |
759 | location, | 759 | } |
760 | projectGuid.ToString("B").ToUpper()); | 760 | |
761 | 761 | private void WriteEmbeddedSolution(TextWriter writer, SolutionNode embeddedSolution) | |
762 | if (files != null) | 762 | { |
763 | { | 763 | WriteProject(writer, "Folder", embeddedSolution.Guid, embeddedSolution.Name, embeddedSolution.Name, embeddedSolution.Files); |
764 | writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); | 764 | } |
765 | 765 | ||
766 | foreach (string file in files) | 766 | private void WriteProject(SolutionNode solution, TextWriter ss, ProjectNode project) |
767 | writer.WriteLine("\t\t{0} = {0}", file); | 767 | { |
768 | 768 | WriteProject(ss, solution, project.Language, project.Guid, project.Name, project.FullPath); | |
769 | writer.WriteLine("\tEndProjectSection"); | 769 | } |
770 | } | 770 | |
771 | 771 | private void WriteProject(SolutionNode solution, TextWriter ss, DatabaseProjectNode dbProject) | |
772 | writer.WriteLine(ProjectDeclarationEndFormat); | 772 | { |
773 | } | 773 | if (solution.Files != null && solution.Files.Count > 0) |
774 | 774 | WriteProject(ss, solution, "Database", dbProject.Guid, dbProject.Name, dbProject.FullPath); | |
775 | private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) | 775 | } |
776 | { | 776 | |
777 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); | 777 | const string ProjectDeclarationBeginFormat = "Project(\"{0}\") = \"{1}\", \"{2}\", \"{3}\""; |
778 | IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); | 778 | const string ProjectDeclarationEndFormat = "EndProject"; |
779 | 779 | ||
780 | kernel.CurrentWorkingDirectory.Push(); | 780 | private void WriteProject(TextWriter ss, SolutionNode solution, string language, Guid guid, string name, string projectFullPath) |
781 | 781 | { | |
782 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); | 782 | if (!tools.ContainsKey(language)) |
783 | 783 | throw new UnknownLanguageException("Unknown .NET language: " + language); | |
784 | using (ps) | 784 | |
785 | { | 785 | ToolInfo toolInfo = tools[language]; |
786 | ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); | 786 | |
787 | ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); | 787 | string path = Helper.MakePathRelativeTo(solution.FullPath, projectFullPath); |
788 | ps.Indent++; | 788 | |
789 | ps.WriteLine("MSDTVersion = \"80\""); | 789 | path = Helper.MakeFilePath(path, name, toolInfo.FileExtension); |
790 | // TODO: Use the project.Files property | 790 | |
791 | if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) | 791 | WriteProject(ss, language, guid, name, path); |
792 | WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); | 792 | } |
793 | 793 | ||
794 | ps.WriteLine("Begin DBRefFolder = \"Database References\""); | 794 | private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location) |
795 | ps.Indent++; | 795 | { |
796 | foreach (DatabaseReferenceNode reference in project.References) | 796 | WriteProject(writer, language, projectGuid, name, location, null); |
797 | { | 797 | } |
798 | ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); | 798 | |
799 | ps.Indent++; | 799 | private void WriteProject(TextWriter writer, string language, Guid projectGuid, string name, string location, FilesNode files) |
800 | ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); | 800 | { |
801 | ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); | 801 | if (!tools.ContainsKey(language)) |
802 | //ps.WriteLine("Colorizer = 5"); | 802 | throw new UnknownLanguageException("Unknown .NET language: " + language); |
803 | ps.Indent--; | 803 | |
804 | ps.WriteLine("End"); | 804 | ToolInfo toolInfo = tools[language]; |
805 | } | 805 | |
806 | ps.Indent--; | 806 | writer.WriteLine(ProjectDeclarationBeginFormat, |
807 | ps.WriteLine("End"); | 807 | toolInfo.Guid, |
808 | ps.Indent--; | 808 | name, |
809 | ps.WriteLine("End"); | 809 | location, |
810 | 810 | projectGuid.ToString("B").ToUpper()); | |
811 | ps.Flush(); | 811 | |
812 | } | 812 | if (files != null) |
813 | 813 | { | |
814 | kernel.CurrentWorkingDirectory.Pop(); | 814 | writer.WriteLine("\tProjectSection(SolutionItems) = preProject"); |
815 | } | 815 | |
816 | 816 | foreach (string file in files) | |
817 | private static bool ContainsSqlFiles(string folder) | 817 | writer.WriteLine("\t\t{0} = {0}", file); |
818 | { | 818 | |
819 | if(Directory.GetFiles(folder, "*.sql").Length > 0) | 819 | writer.WriteLine("\tEndProjectSection"); |
820 | return true; // if the folder contains 1 .sql file, that's good enough | 820 | } |
821 | 821 | ||
822 | foreach (string child in Directory.GetDirectories(folder)) | 822 | writer.WriteLine(ProjectDeclarationEndFormat); |
823 | { | 823 | } |
824 | if (ContainsSqlFiles(child)) | 824 | |
825 | return true; // if 1 child folder contains a .sql file, still good enough | 825 | private void WriteDatabaseProject(SolutionNode solution, DatabaseProjectNode project) |
826 | } | 826 | { |
827 | 827 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, "dbp"); | |
828 | return false; | 828 | IndentedTextWriter ps = new IndentedTextWriter(new StreamWriter(projectFile), " "); |
829 | } | 829 | |
830 | 830 | kernel.CurrentWorkingDirectory.Push(); | |
831 | private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) | 831 | |
832 | { | 832 | Helper.SetCurrentDir(Path.GetDirectoryName(projectFile)); |
833 | foreach (string child in Directory.GetDirectories(folder)) | 833 | |
834 | { | 834 | using (ps) |
835 | if (ContainsSqlFiles(child)) | 835 | { |
836 | { | 836 | ps.WriteLine("# Microsoft Developer Studio Project File - Database Project"); |
837 | writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); | 837 | ps.WriteLine("Begin DataProject = \"{0}\"", project.Name); |
838 | writer.Indent++; | 838 | ps.Indent++; |
839 | WriteDatabaseFoldersAndFiles(writer, child); | 839 | ps.WriteLine("MSDTVersion = \"80\""); |
840 | writer.Indent--; | 840 | // TODO: Use the project.Files property |
841 | writer.WriteLine("End"); | 841 | if (ContainsSqlFiles(Path.GetDirectoryName(projectFile))) |
842 | } | 842 | WriteDatabaseFoldersAndFiles(ps, Path.GetDirectoryName(projectFile)); |
843 | } | 843 | |
844 | foreach (string file in Directory.GetFiles(folder, "*.sql")) | 844 | ps.WriteLine("Begin DBRefFolder = \"Database References\""); |
845 | { | 845 | ps.Indent++; |
846 | writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); | 846 | foreach (DatabaseReferenceNode reference in project.References) |
847 | } | 847 | { |
848 | } | 848 | ps.WriteLine("Begin DBRefNode = \"{0}\"", reference.Name); |
849 | 849 | ps.Indent++; | |
850 | private void CleanProject(ProjectNode project) | 850 | ps.WriteLine("ConnectStr = \"{0}\"", reference.ConnectionString); |
851 | { | 851 | ps.WriteLine("Provider = \"{0}\"", reference.ProviderId.ToString("B").ToUpper()); |
852 | kernel.Log.Write("...Cleaning project: {0}", project.Name); | 852 | //ps.WriteLine("Colorizer = 5"); |
853 | 853 | ps.Indent--; | |
854 | ToolInfo toolInfo = tools[project.Language]; | 854 | ps.WriteLine("End"); |
855 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); | 855 | } |
856 | string userFile = projectFile + ".user"; | 856 | ps.Indent--; |
857 | 857 | ps.WriteLine("End"); | |
858 | Helper.DeleteIfExists(projectFile); | 858 | ps.Indent--; |
859 | Helper.DeleteIfExists(userFile); | 859 | ps.WriteLine("End"); |
860 | } | 860 | |
861 | 861 | ps.Flush(); | |
862 | private void CleanSolution(SolutionNode solution) | 862 | } |
863 | { | 863 | |
864 | kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); | 864 | kernel.CurrentWorkingDirectory.Pop(); |
865 | 865 | } | |
866 | string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); | 866 | |
867 | string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); | 867 | private static bool ContainsSqlFiles(string folder) |
868 | 868 | { | |
869 | Helper.DeleteIfExists(slnFile); | 869 | if(Directory.GetFiles(folder, "*.sql").Length > 0) |
870 | Helper.DeleteIfExists(suoFile); | 870 | return true; // if the folder contains 1 .sql file, that's good enough |
871 | 871 | ||
872 | foreach (ProjectNode project in solution.Projects) | 872 | foreach (string child in Directory.GetDirectories(folder)) |
873 | { | 873 | { |
874 | CleanProject(project); | 874 | if (ContainsSqlFiles(child)) |
875 | } | 875 | return true; // if 1 child folder contains a .sql file, still good enough |
876 | 876 | } | |
877 | kernel.Log.Write(""); | 877 | |
878 | } | 878 | return false; |
879 | 879 | } | |
880 | #endregion | 880 | |
881 | 881 | private static void WriteDatabaseFoldersAndFiles(IndentedTextWriter writer, string folder) | |
882 | #region ITarget Members | 882 | { |
883 | 883 | foreach (string child in Directory.GetDirectories(folder)) | |
884 | /// <summary> | 884 | { |
885 | /// Writes the specified kern. | 885 | if (ContainsSqlFiles(child)) |
886 | /// </summary> | 886 | { |
887 | /// <param name="kern">The kern.</param> | 887 | writer.WriteLine("Begin Folder = \"{0}\"", Path.GetFileName(child)); |
888 | public virtual void Write(Kernel kern) | 888 | writer.Indent++; |
889 | { | 889 | WriteDatabaseFoldersAndFiles(writer, child); |
890 | if (kern == null) | 890 | writer.Indent--; |
891 | { | 891 | writer.WriteLine("End"); |
892 | throw new ArgumentNullException("kern"); | 892 | } |
893 | } | 893 | } |
894 | kernel = kern; | 894 | foreach (string file in Directory.GetFiles(folder, "*.sql")) |
895 | foreach (SolutionNode sol in kernel.Solutions) | 895 | { |
896 | { | 896 | writer.WriteLine("Script = \"{0}\"", Path.GetFileName(file)); |
897 | WriteSolution(sol, true); | 897 | } |
898 | } | 898 | } |
899 | kernel = null; | 899 | |
900 | } | 900 | private void CleanProject(ProjectNode project) |
901 | 901 | { | |
902 | /// <summary> | 902 | kernel.Log.Write("...Cleaning project: {0}", project.Name); |
903 | /// Cleans the specified kern. | 903 | |
904 | /// </summary> | 904 | ToolInfo toolInfo = tools[project.Language]; |
905 | /// <param name="kern">The kern.</param> | 905 | string projectFile = Helper.MakeFilePath(project.FullPath, project.Name, toolInfo.FileExtension); |
906 | public virtual void Clean(Kernel kern) | 906 | string userFile = projectFile + ".user"; |
907 | { | 907 | |
908 | if (kern == null) | 908 | Helper.DeleteIfExists(projectFile); |
909 | { | 909 | Helper.DeleteIfExists(userFile); |
910 | throw new ArgumentNullException("kern"); | 910 | } |
911 | } | 911 | |
912 | kernel = kern; | 912 | private void CleanSolution(SolutionNode solution) |
913 | foreach (SolutionNode sol in kernel.Solutions) | 913 | { |
914 | { | 914 | kernel.Log.Write("Cleaning {0} solution and project files", VersionName, solution.Name); |
915 | CleanSolution(sol); | 915 | |
916 | } | 916 | string slnFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "sln"); |
917 | kernel = null; | 917 | string suoFile = Helper.MakeFilePath(solution.FullPath, solution.Name, "suo"); |
918 | } | 918 | |
919 | 919 | Helper.DeleteIfExists(slnFile); | |
920 | #endregion | 920 | Helper.DeleteIfExists(suoFile); |
921 | } | 921 | |
922 | } | 922 | foreach (ProjectNode project in solution.Projects) |
923 | { | ||
924 | CleanProject(project); | ||
925 | } | ||
926 | |||
927 | kernel.Log.Write(""); | ||
928 | } | ||
929 | |||
930 | #endregion | ||
931 | |||
932 | #region ITarget Members | ||
933 | |||
934 | /// <summary> | ||
935 | /// Writes the specified kern. | ||
936 | /// </summary> | ||
937 | /// <param name="kern">The kern.</param> | ||
938 | public virtual void Write(Kernel kern) | ||
939 | { | ||
940 | if (kern == null) | ||
941 | { | ||
942 | throw new ArgumentNullException("kern"); | ||
943 | } | ||
944 | kernel = kern; | ||
945 | foreach (SolutionNode sol in kernel.Solutions) | ||
946 | { | ||
947 | WriteSolution(sol, true); | ||
948 | } | ||
949 | kernel = null; | ||
950 | } | ||
951 | |||
952 | /// <summary> | ||
953 | /// Cleans the specified kern. | ||
954 | /// </summary> | ||
955 | /// <param name="kern">The kern.</param> | ||
956 | public virtual void Clean(Kernel kern) | ||
957 | { | ||
958 | if (kern == null) | ||
959 | { | ||
960 | throw new ArgumentNullException("kern"); | ||
961 | } | ||
962 | kernel = kern; | ||
963 | foreach (SolutionNode sol in kernel.Solutions) | ||
964 | { | ||
965 | CleanSolution(sol); | ||
966 | } | ||
967 | kernel = null; | ||
968 | } | ||
969 | |||
970 | #endregion | ||
971 | } | ||
972 | } | ||
diff --git a/Prebuild/src/Prebuild.cs b/Prebuild/src/Prebuild.cs index 081c89c..35a5dfa 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 | |||
27 | /* | 27 | /* |
28 | * $Source$ | 28 | * $Source$ |
29 | * $Author: kunnis $ | 29 | * $Author: kunnis $ |
30 | * $Date: 2009-04-15 02:33:14 +0100 (Wed, 15 Apr 2009) $ | 30 | * $Date: 2009-04-14 21:33:14 -0400 (Tue, 14 Apr 2009) $ |
31 | * $Revision: 308 $ | 31 | * $Revision: 308 $ |
32 | */ | 32 | */ |
33 | #endregion | 33 | #endregion |
diff --git a/Prebuild/src/data/prebuild-1.7.xsd b/Prebuild/src/data/prebuild-1.7.xsd index 3675503..a7f5c88 100644 --- a/Prebuild/src/data/prebuild-1.7.xsd +++ b/Prebuild/src/data/prebuild-1.7.xsd | |||
@@ -1,350 +1,350 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://dnpb.sourceforge.net/schemas/prebuild-1.7.xsd" xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.7.xsd"> | 2 | <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://dnpb.sourceforge.net/schemas/prebuild-1.7.xsd" xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.7.xsd"> |
3 | <xs:annotation> | 3 | <xs:annotation> |
4 | <xs:documentation> | 4 | <xs:documentation> |
5 | Copyright (c) 2004-2007 | 5 | Copyright (c) 2004-2007 |
6 | Matthew Holmes (calefaction at houston . rr . com), | 6 | Matthew Holmes (calefaction at houston . rr . com), |
7 | Dan Moorehead (dan05a at gmail . com), | 7 | Dan Moorehead (dan05a at gmail . com), |
8 | David Hudson (jendave at yahoo dot com), | 8 | David Hudson (jendave at yahoo dot com), |
9 | C.J. Adams-Collier (cjac at colliertech dot com) | 9 | C.J. Adams-Collier (cjac at colliertech dot com) |
10 | 10 | ||
11 | .NET Prebuild is a cross-platform XML-driven pre-build tool which | 11 | .NET Prebuild is a cross-platform XML-driven pre-build tool which |
12 | allows developers to easily generate project or make files for major | 12 | allows developers to easily generate project or make files for major |
13 | IDE's and .NET development tools including: Visual Studio .NET 2002, | 13 | IDE's and .NET development tools including: Visual Studio .NET 2002, |
14 | 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. | 14 | 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. |
15 | 15 | ||
16 | BSD License: | 16 | BSD License: |
17 | 17 | ||
18 | Redistribution and use in source and binary forms, with or without modification, are permitted | 18 | Redistribution and use in source and binary forms, with or without modification, are permitted |
19 | provided that the following conditions are met: | 19 | provided that the following conditions are met: |
20 | 20 | ||
21 | * Redistributions of source code must retain the above copyright notice, this list of conditions | 21 | * Redistributions of source code must retain the above copyright notice, this list of conditions |
22 | and the following disclaimer. | 22 | and the following disclaimer. |
23 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions | 23 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
24 | and the following disclaimer in the documentation and/or other materials provided with the | 24 | and the following disclaimer in the documentation and/or other materials provided with the |
25 | distribution. | 25 | distribution. |
26 | * The name of the author may not be used to endorse or promote products derived from this software | 26 | * The name of the author may not be used to endorse or promote products derived from this software |
27 | without specific prior written permission. | 27 | without specific prior written permission. |
28 | 28 | ||
29 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 29 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
30 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 30 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
31 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 31 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
32 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 32 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
33 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 33 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
34 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 34 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
35 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 35 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
36 | </xs:documentation> | 36 | </xs:documentation> |
37 | </xs:annotation> | 37 | </xs:annotation> |
38 | 38 | ||
39 | <xs:element name="Prebuild"> | 39 | <xs:element name="Prebuild"> |
40 | <xs:complexType> | 40 | <xs:complexType> |
41 | <xs:sequence> | 41 | <xs:sequence> |
42 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> | 42 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> |
43 | <xs:element ref="Solution" minOccurs="1" maxOccurs="unbounded" /> | 43 | <xs:element ref="Solution" minOccurs="1" maxOccurs="unbounded" /> |
44 | </xs:sequence> | 44 | </xs:sequence> |
45 | <xs:attribute name="version" /> | 45 | <xs:attribute name="version" /> |
46 | <xs:attribute name="checkOsVars" /> | 46 | <xs:attribute name="checkOsVars" /> |
47 | </xs:complexType> | 47 | </xs:complexType> |
48 | </xs:element> | 48 | </xs:element> |
49 | 49 | ||
50 | <xs:element name="Process" type="xs:string" /> | 50 | <xs:element name="Process" type="xs:string" /> |
51 | 51 | ||
52 | <xs:element name="Solution"> | 52 | <xs:element name="Solution"> |
53 | <xs:complexType> | 53 | <xs:complexType> |
54 | <xs:sequence> | 54 | <xs:sequence> |
55 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> | 55 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> |
56 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> | 56 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> |
57 | <xs:element ref="Options" minOccurs="0" /> | 57 | <xs:element ref="Options" minOccurs="0" /> |
58 | <xs:element ref="Files" minOccurs="0" /> | 58 | <xs:element ref="Files" minOccurs="0" /> |
59 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> | 59 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> |
60 | <xs:element ref="Cleanup" minOccurs="0" maxOccurs="1" /> | 60 | <xs:element ref="Cleanup" minOccurs="0" maxOccurs="1" /> |
61 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> | 61 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> |
62 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> | 62 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> |
63 | </xs:sequence> | 63 | </xs:sequence> |
64 | <xs:attribute name="name" type="xs:string" use="required" /> | 64 | <xs:attribute name="name" type="xs:string" use="required" /> |
65 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> | 65 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> |
66 | <xs:attribute name="path" type="xs:string" default="" /> | 66 | <xs:attribute name="path" type="xs:string" default="" /> |
67 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> | 67 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> |
68 | </xs:complexType> | 68 | </xs:complexType> |
69 | </xs:element> | 69 | </xs:element> |
70 | 70 | ||
71 | <xs:element name="EmbeddedSolution"> | 71 | <xs:element name="EmbeddedSolution"> |
72 | <xs:complexType> | 72 | <xs:complexType> |
73 | <xs:sequence> | 73 | <xs:sequence> |
74 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> | 74 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> |
75 | <xs:element ref="Files" minOccurs="0" /> | 75 | <xs:element ref="Files" minOccurs="0" /> |
76 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> | 76 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> |
77 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> | 77 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> |
78 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> | 78 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> |
79 | </xs:sequence> | 79 | </xs:sequence> |
80 | <xs:attribute name="name" type="xs:string" use="required" /> | 80 | <xs:attribute name="name" type="xs:string" use="required" /> |
81 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> | 81 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> |
82 | <xs:attribute name="path" type="xs:string" default="" /> | 82 | <xs:attribute name="path" type="xs:string" default="" /> |
83 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> | 83 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> |
84 | </xs:complexType> | 84 | </xs:complexType> |
85 | </xs:element> | 85 | </xs:element> |
86 | 86 | ||
87 | <xs:element name="DatabaseProject"> | 87 | <xs:element name="DatabaseProject"> |
88 | <xs:complexType> | 88 | <xs:complexType> |
89 | <xs:sequence> | 89 | <xs:sequence> |
90 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> | 90 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> |
91 | <xs:element ref="DatabaseReference" minOccurs="0" maxOccurs="unbounded" /> | 91 | <xs:element ref="DatabaseReference" minOccurs="0" maxOccurs="unbounded" /> |
92 | </xs:sequence> | 92 | </xs:sequence> |
93 | <xs:attribute name="name" type="xs:string" use="required" /> | 93 | <xs:attribute name="name" type="xs:string" use="required" /> |
94 | <xs:attribute name="path" type="xs:string" /> | 94 | <xs:attribute name="path" type="xs:string" /> |
95 | </xs:complexType> | 95 | </xs:complexType> |
96 | </xs:element> | 96 | </xs:element> |
97 | 97 | ||
98 | <xs:element name="DatabaseReference"> | 98 | <xs:element name="DatabaseReference"> |
99 | <xs:complexType> | 99 | <xs:complexType> |
100 | <xs:attribute name="name" type="xs:string" use="required" /> | 100 | <xs:attribute name="name" type="xs:string" use="required" /> |
101 | <xs:attribute name="providerId" type="xs:string" /> | 101 | <xs:attribute name="providerId" type="xs:string" /> |
102 | <xs:attribute name="providerName" type="xs:string" /> | 102 | <xs:attribute name="providerName" type="xs:string" /> |
103 | <xs:attribute name="connectionString" type="xs:string" use="required" /> | 103 | <xs:attribute name="connectionString" type="xs:string" use="required" /> |
104 | </xs:complexType> | 104 | </xs:complexType> |
105 | </xs:element> | 105 | </xs:element> |
106 | 106 | ||
107 | <xs:element name="Project"> | 107 | <xs:element name="Project"> |
108 | <xs:complexType> | 108 | <xs:complexType> |
109 | <xs:sequence> | 109 | <xs:sequence> |
110 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> | 110 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> |
111 | <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" /> | 111 | <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" /> |
112 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> | 112 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> |
113 | <xs:element name="ReferencePath" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> | 113 | <xs:element name="ReferencePath" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> |
114 | <xs:element name="Reference" minOccurs="0" maxOccurs="unbounded"> | 114 | <xs:element name="Reference" minOccurs="0" maxOccurs="unbounded"> |
115 | <xs:complexType> | 115 | <xs:complexType> |
116 | <xs:attribute name="name" type="xs:string" use="required" /> | 116 | <xs:attribute name="name" type="xs:string" use="required" /> |
117 | <xs:attribute name="path" type="xs:string" /> | 117 | <xs:attribute name="path" type="xs:string" /> |
118 | <xs:attribute name="localCopy" type="xs:boolean" /> | 118 | <xs:attribute name="localCopy" type="xs:boolean" /> |
119 | <xs:attribute name="version" type="xs:string" /> | 119 | <xs:attribute name="version" type="xs:string" /> |
120 | </xs:complexType> | 120 | </xs:complexType> |
121 | </xs:element> | 121 | </xs:element> |
122 | <xs:element ref="Files" /> | 122 | <xs:element ref="Files" /> |
123 | </xs:sequence> | 123 | </xs:sequence> |
124 | <xs:attribute name="name" type="xs:string" use="required" /> | 124 | <xs:attribute name="name" type="xs:string" use="required" /> |
125 | <xs:attribute name="designerFolder" type="xs:string" default="" /> | 125 | <xs:attribute name="designerFolder" type="xs:string" default="" /> |
126 | <xs:attribute name="filterGroups" type="xs:string" default="" /> | 126 | <xs:attribute name="filterGroups" type="xs:string" default="" /> |
127 | <xs:attribute name="path" type="xs:string" default="" /> | 127 | <xs:attribute name="path" type="xs:string" default="" /> |
128 | <xs:attribute name="icon" type="xs:string" default="" /> | 128 | <xs:attribute name="icon" type="xs:string" default="" /> |
129 | <xs:attribute name="configFile" type="xs:string" default="" /> | 129 | <xs:attribute name="configFile" type="xs:string" default="" /> |
130 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> | 130 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> |
131 | <xs:attribute name="guid" type="xs:string"/> | 131 | <xs:attribute name="guid" type="xs:string"/> |
132 | <xs:attribute name="language" default="C#"> | 132 | <xs:attribute name="language" default="C#"> |
133 | <xs:simpleType> | 133 | <xs:simpleType> |
134 | <xs:restriction base="xs:string"> | 134 | <xs:restriction base="xs:string"> |
135 | <xs:enumeration value="C#" /> | 135 | <xs:enumeration value="C#" /> |
136 | <xs:enumeration value="VB.NET" /> | 136 | <xs:enumeration value="VB.NET" /> |
137 | </xs:restriction> | 137 | </xs:restriction> |
138 | </xs:simpleType> | 138 | </xs:simpleType> |
139 | </xs:attribute> | 139 | </xs:attribute> |
140 | <xs:attribute name="type" default="Exe"> | 140 | <xs:attribute name="type" default="Exe"> |
141 | <xs:simpleType> | 141 | <xs:simpleType> |
142 | <xs:restriction base="xs:string"> | 142 | <xs:restriction base="xs:string"> |
143 | <xs:enumeration value="Exe" /> | 143 | <xs:enumeration value="Exe" /> |
144 | <xs:enumeration value="WinExe" /> | 144 | <xs:enumeration value="WinExe" /> |
145 | <xs:enumeration value="Library" /> | 145 | <xs:enumeration value="Library" /> |
146 | <xs:enumeration value="Web" /> | 146 | <xs:enumeration value="Web" /> |
147 | </xs:restriction> | 147 | </xs:restriction> |
148 | </xs:simpleType> | 148 | </xs:simpleType> |
149 | </xs:attribute> | 149 | </xs:attribute> |
150 | <xs:attribute name="runtime" default="Microsoft"> | 150 | <xs:attribute name="runtime" default="Microsoft"> |
151 | <xs:simpleType> | 151 | <xs:simpleType> |
152 | <xs:restriction base="xs:string"> | 152 | <xs:restriction base="xs:string"> |
153 | <xs:enumeration value="Microsoft" /> | 153 | <xs:enumeration value="Microsoft" /> |
154 | <xs:enumeration value="Mono" /> | 154 | <xs:enumeration value="Mono" /> |
155 | </xs:restriction> | 155 | </xs:restriction> |
156 | </xs:simpleType> | 156 | </xs:simpleType> |
157 | </xs:attribute> | 157 | </xs:attribute> |
158 | <xs:attribute name="frameworkVersion" default="v2_0"> | 158 | <xs:attribute name="frameworkVersion" default="v2_0"> |
159 | <xs:simpleType> | 159 | <xs:simpleType> |
160 | <xs:restriction base="xs:string"> | 160 | <xs:restriction base="xs:string"> |
161 | <xs:enumeration value="v2_0" /> | 161 | <xs:enumeration value="v2_0" /> |
162 | <xs:enumeration value="v3_0" /> | 162 | <xs:enumeration value="v3_0" /> |
163 | <xs:enumeration value="v3_5" /> | 163 | <xs:enumeration value="v3_5" /> |
164 | </xs:restriction> | 164 | </xs:restriction> |
165 | </xs:simpleType> | 165 | </xs:simpleType> |
166 | </xs:attribute> | 166 | </xs:attribute> |
167 | <xs:attribute name="startupObject" type="xs:string" default="" /> | 167 | <xs:attribute name="startupObject" type="xs:string" default="" /> |
168 | <xs:attribute name="rootNamespace" type="xs:string" /> | 168 | <xs:attribute name="rootNamespace" type="xs:string" /> |
169 | <xs:attribute name="debugStartParameters" type="xs:string" /> | 169 | <xs:attribute name="debugStartParameters" type="xs:string" /> |
170 | <xs:attribute name="assemblyName" type="xs:string" /> | 170 | <xs:attribute name="assemblyName" type="xs:string" /> |
171 | <xs:attribute name="generateAssemblyInfoFile" type="xs:boolean" default="false" /> | 171 | <xs:attribute name="generateAssemblyInfoFile" type="xs:boolean" default="false" /> |
172 | </xs:complexType> | 172 | </xs:complexType> |
173 | </xs:element> | 173 | </xs:element> |
174 | 174 | ||
175 | <xs:element name="Configuration"> | 175 | <xs:element name="Configuration"> |
176 | <xs:complexType> | 176 | <xs:complexType> |
177 | <xs:sequence> | 177 | <xs:sequence> |
178 | <xs:element ref="Options" minOccurs="0" /> | 178 | <xs:element ref="Options" minOccurs="0" /> |
179 | </xs:sequence> | 179 | </xs:sequence> |
180 | <xs:attribute name="name" type="xs:string" use="required" /> | 180 | <xs:attribute name="name" type="xs:string" use="required" /> |
181 | </xs:complexType> | 181 | </xs:complexType> |
182 | </xs:element> | 182 | </xs:element> |
183 | <xs:element name="Options"> | 183 | <xs:element name="Options"> |
184 | <xs:complexType> | 184 | <xs:complexType> |
185 | <xs:all> | 185 | <xs:all> |
186 | <xs:element name="CompilerDefines" type="xs:string" minOccurs="0" /> | 186 | <xs:element name="CompilerDefines" type="xs:string" minOccurs="0" /> |
187 | <xs:element name="OptimizeCode" type="xs:boolean" minOccurs="0" /> | 187 | <xs:element name="OptimizeCode" type="xs:boolean" minOccurs="0" /> |
188 | <xs:element name="CheckUnderflowOverflow" type="xs:boolean" minOccurs="0" /> | 188 | <xs:element name="CheckUnderflowOverflow" type="xs:boolean" minOccurs="0" /> |
189 | <xs:element name="AllowUnsafe" type="xs:boolean" minOccurs="0" /> | 189 | <xs:element name="AllowUnsafe" type="xs:boolean" minOccurs="0" /> |
190 | <xs:element name="PreBuildEvent" type="xs:string" minOccurs="0" /> | 190 | <xs:element name="PreBuildEvent" type="xs:string" minOccurs="0" /> |
191 | <xs:element name="PostBuildEvent" type="xs:string" minOccurs="0" /> | 191 | <xs:element name="PostBuildEvent" type="xs:string" minOccurs="0" /> |
192 | <xs:element name="RunPostBuildEvent" minOccurs="0" default="OnBuildSuccess"> | 192 | <xs:element name="RunPostBuildEvent" minOccurs="0" default="OnBuildSuccess"> |
193 | <xs:simpleType> | 193 | <xs:simpleType> |
194 | <xs:restriction base="xs:string"> | 194 | <xs:restriction base="xs:string"> |
195 | <xs:enumeration value="OnBuildSuccess" /> | 195 | <xs:enumeration value="OnBuildSuccess" /> |
196 | <xs:enumeration value="Always" /> | 196 | <xs:enumeration value="Always" /> |
197 | <xs:enumeration value="OnOutputUpdated" /> | 197 | <xs:enumeration value="OnOutputUpdated" /> |
198 | </xs:restriction> | 198 | </xs:restriction> |
199 | </xs:simpleType> | 199 | </xs:simpleType> |
200 | </xs:element> | 200 | </xs:element> |
201 | <xs:element name="RunScript" type="xs:string" minOccurs="0" /> | 201 | <xs:element name="RunScript" type="xs:string" minOccurs="0" /> |
202 | <xs:element name="PreBuildEventArgs" type="xs:string" minOccurs="0" /> | 202 | <xs:element name="PreBuildEventArgs" type="xs:string" minOccurs="0" /> |
203 | <xs:element name="PostBuildEventArgs" type="xs:string" minOccurs="0" /> | 203 | <xs:element name="PostBuildEventArgs" type="xs:string" minOccurs="0" /> |
204 | <xs:element name="WarningLevel" minOccurs="0"> | 204 | <xs:element name="WarningLevel" minOccurs="0"> |
205 | <xs:simpleType> | 205 | <xs:simpleType> |
206 | <xs:restriction base="xs:integer"> | 206 | <xs:restriction base="xs:integer"> |
207 | <xs:minInclusive value="0" /> | 207 | <xs:minInclusive value="0" /> |
208 | <xs:maxInclusive value="4" /> | 208 | <xs:maxInclusive value="4" /> |
209 | </xs:restriction> | 209 | </xs:restriction> |
210 | </xs:simpleType> | 210 | </xs:simpleType> |
211 | </xs:element> | 211 | </xs:element> |
212 | <xs:element name="WarningsAsErrors" type="xs:boolean" minOccurs="0" /> | 212 | <xs:element name="WarningsAsErrors" type="xs:boolean" minOccurs="0" /> |
213 | <xs:element name="SuppressWarnings" type="xs:string" minOccurs="0" /> | 213 | <xs:element name="SuppressWarnings" type="xs:string" minOccurs="0" /> |
214 | <xs:element name="OutputPath" type="xs:string" minOccurs="0" /> | 214 | <xs:element name="OutputPath" type="xs:string" minOccurs="0" /> |
215 | <xs:element name="GenerateDocumentation" type="xs:boolean" minOccurs="0" /> | 215 | <xs:element name="GenerateDocumentation" type="xs:boolean" minOccurs="0" /> |
216 | <xs:element name="XmlDocFile" type="xs:string" minOccurs="0" /> | 216 | <xs:element name="XmlDocFile" type="xs:string" minOccurs="0" /> |
217 | <xs:element name="DebugInformation" type="xs:boolean" minOccurs="0" /> | 217 | <xs:element name="DebugInformation" type="xs:boolean" minOccurs="0" /> |
218 | <xs:element name="RegisterComInterop" type="xs:boolean" minOccurs="0" /> | 218 | <xs:element name="RegisterComInterop" type="xs:boolean" minOccurs="0" /> |
219 | <xs:element name="RemoveIntegerChecks" type="xs:boolean" minOccurs="0" /> | 219 | <xs:element name="RemoveIntegerChecks" type="xs:boolean" minOccurs="0" /> |
220 | <xs:element name="IncrementalBuild" type="xs:boolean" minOccurs="0" /> | 220 | <xs:element name="IncrementalBuild" type="xs:boolean" minOccurs="0" /> |
221 | <xs:element name="BaseAddress" type="xs:string" minOccurs="0" /> | 221 | <xs:element name="BaseAddress" type="xs:string" minOccurs="0" /> |
222 | <xs:element name="FileAlignment" type="xs:integer" minOccurs="0" /> | 222 | <xs:element name="FileAlignment" type="xs:integer" minOccurs="0" /> |
223 | <xs:element name="NoStdLib" type="xs:boolean" minOccurs="0" /> | 223 | <xs:element name="NoStdLib" type="xs:boolean" minOccurs="0" /> |
224 | <xs:element name="KeyFile" type="xs:string" minOccurs="0" /> | 224 | <xs:element name="KeyFile" type="xs:string" minOccurs="0" /> |
225 | </xs:all> | 225 | </xs:all> |
226 | </xs:complexType> | 226 | </xs:complexType> |
227 | </xs:element> | 227 | </xs:element> |
228 | 228 | ||
229 | <xs:element name="Files"> | 229 | <xs:element name="Files"> |
230 | <xs:complexType> | 230 | <xs:complexType> |
231 | <xs:sequence> | 231 | <xs:sequence> |
232 | <xs:element ref="File" minOccurs="0" maxOccurs="unbounded" /> | 232 | <xs:element ref="File" minOccurs="0" maxOccurs="unbounded" /> |
233 | <xs:element ref="Match" minOccurs="0" maxOccurs="unbounded" /> | 233 | <xs:element ref="Match" minOccurs="0" maxOccurs="unbounded" /> |
234 | </xs:sequence> | 234 | </xs:sequence> |
235 | </xs:complexType> | 235 | </xs:complexType> |
236 | </xs:element> | 236 | </xs:element> |
237 | 237 | ||
238 | <xs:element name="File"> | 238 | <xs:element name="File"> |
239 | <xs:complexType> | 239 | <xs:complexType> |
240 | <xs:simpleContent> | 240 | <xs:simpleContent> |
241 | <xs:extension base="xs:string"> | 241 | <xs:extension base="xs:string"> |
242 | <xs:attribute name="resourceName" type="xs:string" default="" /> | 242 | <xs:attribute name="resourceName" type="xs:string" default="" /> |
243 | <xs:attribute name="buildAction" default="Compile"> | 243 | <xs:attribute name="buildAction" default="Compile"> |
244 | <xs:simpleType> | 244 | <xs:simpleType> |
245 | <xs:restriction base="xs:string"> | 245 | <xs:restriction base="xs:string"> |
246 | <xs:enumeration value="None" /> | 246 | <xs:enumeration value="None" /> |
247 | <xs:enumeration value="Compile" /> | 247 | <xs:enumeration value="Compile" /> |
248 | <xs:enumeration value="Content" /> | 248 | <xs:enumeration value="Content" /> |
249 | <xs:enumeration value="EmbeddedResource" /> | 249 | <xs:enumeration value="EmbeddedResource" /> |
250 | </xs:restriction> | 250 | </xs:restriction> |
251 | </xs:simpleType> | 251 | </xs:simpleType> |
252 | </xs:attribute> | 252 | </xs:attribute> |
253 | <xs:attribute name="subType" default="Code"> | 253 | <xs:attribute name="subType" default="Code"> |
254 | <xs:simpleType> | 254 | <xs:simpleType> |
255 | <xs:restriction base="xs:string"> | 255 | <xs:restriction base="xs:string"> |
256 | <xs:enumeration value="Code" /> | 256 | <xs:enumeration value="Code" /> |
257 | <xs:enumeration value="CodeBehind" /> | 257 | <xs:enumeration value="CodeBehind" /> |
258 | <xs:enumeration value="Component" /> | 258 | <xs:enumeration value="Component" /> |
259 | <xs:enumeration value="Form" /> | 259 | <xs:enumeration value="Form" /> |
260 | <xs:enumeration value="Settings" /> | 260 | <xs:enumeration value="Settings" /> |
261 | <xs:enumeration value="UserControl" /> | 261 | <xs:enumeration value="UserControl" /> |
262 | </xs:restriction> | 262 | </xs:restriction> |
263 | </xs:simpleType> | 263 | </xs:simpleType> |
264 | </xs:attribute> | 264 | </xs:attribute> |
265 | <xs:attribute name="link" type="xs:boolean" /> | 265 | <xs:attribute name="link" type="xs:boolean" /> |
266 | <xs:attribute name="copyToOutput" default="Never"> | 266 | <xs:attribute name="copyToOutput" default="Never"> |
267 | <xs:simpleType> | 267 | <xs:simpleType> |
268 | <xs:restriction base="xs:string"> | 268 | <xs:restriction base="xs:string"> |
269 | <xs:enumeration value="Never" /> | 269 | <xs:enumeration value="Never" /> |
270 | <xs:enumeration value="Always" /> | 270 | <xs:enumeration value="Always" /> |
271 | <xs:enumeration value="PreserveNewest" /> | 271 | <xs:enumeration value="PreserveNewest" /> |
272 | </xs:restriction> | 272 | </xs:restriction> |
273 | </xs:simpleType> | 273 | </xs:simpleType> |
274 | </xs:attribute> | 274 | </xs:attribute> |
275 | <xs:attribute name="preservePath" type="xs:boolean" /> | 275 | <xs:attribute name="preservePath" type="xs:boolean" /> |
276 | <xs:attribute name="linkPath" type="xs:string" /> | 276 | <xs:attribute name="linkPath" type="xs:string" /> |
277 | </xs:extension> | 277 | </xs:extension> |
278 | </xs:simpleContent> | 278 | </xs:simpleContent> |
279 | </xs:complexType> | 279 | </xs:complexType> |
280 | </xs:element> | 280 | </xs:element> |
281 | 281 | ||
282 | <xs:element name="Match"> | 282 | <xs:element name="Match"> |
283 | <xs:complexType> | 283 | <xs:complexType> |
284 | <xs:sequence> | 284 | <xs:sequence> |
285 | <xs:element ref="Exclude" minOccurs="0" maxOccurs="unbounded" /> | 285 | <xs:element ref="Exclude" minOccurs="0" maxOccurs="unbounded" /> |
286 | </xs:sequence> | 286 | </xs:sequence> |
287 | <xs:attribute name="path" type="xs:string" /> | 287 | <xs:attribute name="path" type="xs:string" /> |
288 | <xs:attribute name="pattern" type="xs:string" use="required" /> | 288 | <xs:attribute name="pattern" type="xs:string" use="required" /> |
289 | <xs:attribute name="recurse" type="xs:boolean" default="false" /> | 289 | <xs:attribute name="recurse" type="xs:boolean" default="false" /> |
290 | <xs:attribute name="useRegex" type="xs:boolean" default="false" /> | 290 | <xs:attribute name="useRegex" type="xs:boolean" default="false" /> |
291 | <xs:attribute name="buildAction" default="Compile"> | 291 | <xs:attribute name="buildAction" default="Compile"> |
292 | <xs:simpleType> | 292 | <xs:simpleType> |
293 | <xs:restriction base="xs:string"> | 293 | <xs:restriction base="xs:string"> |
294 | <xs:enumeration value="None" /> | 294 | <xs:enumeration value="None" /> |
295 | <xs:enumeration value="Compile" /> | 295 | <xs:enumeration value="Compile" /> |
296 | <xs:enumeration value="Content" /> | 296 | <xs:enumeration value="Content" /> |
297 | <xs:enumeration value="EmbeddedResource" /> | 297 | <xs:enumeration value="EmbeddedResource" /> |
298 | </xs:restriction> | 298 | </xs:restriction> |
299 | </xs:simpleType> | 299 | </xs:simpleType> |
300 | </xs:attribute> | 300 | </xs:attribute> |
301 | <xs:attribute name="resourceName" type="xs:string" default="" /> | 301 | <xs:attribute name="resourceName" type="xs:string" default="" /> |
302 | <xs:attribute name="subType" default="Code"> | 302 | <xs:attribute name="subType" default="Code"> |
303 | <xs:simpleType> | 303 | <xs:simpleType> |
304 | <xs:restriction base="xs:string"> | 304 | <xs:restriction base="xs:string"> |
305 | <xs:enumeration value="Code" /> | 305 | <xs:enumeration value="Code" /> |
306 | <xs:enumeration value="CodeBehind" /> | 306 | <xs:enumeration value="CodeBehind" /> |
307 | <xs:enumeration value="Component" /> | 307 | <xs:enumeration value="Component" /> |
308 | <xs:enumeration value="Designer" /> | 308 | <xs:enumeration value="Designer" /> |
309 | <xs:enumeration value="Form" /> | 309 | <xs:enumeration value="Form" /> |
310 | <xs:enumeration value="Settings" /> | 310 | <xs:enumeration value="Settings" /> |
311 | <xs:enumeration value="UserControl" /> | 311 | <xs:enumeration value="UserControl" /> |
312 | </xs:restriction> | 312 | </xs:restriction> |
313 | </xs:simpleType> | 313 | </xs:simpleType> |
314 | </xs:attribute> | 314 | </xs:attribute> |
315 | <xs:attribute name="link" type="xs:boolean" /> | 315 | <xs:attribute name="link" type="xs:boolean" /> |
316 | <xs:attribute name="copyToOutput" default="Never"> | 316 | <xs:attribute name="copyToOutput" default="Never"> |
317 | <xs:simpleType> | 317 | <xs:simpleType> |
318 | <xs:restriction base="xs:string"> | 318 | <xs:restriction base="xs:string"> |
319 | <xs:enumeration value="Never" /> | 319 | <xs:enumeration value="Never" /> |
320 | <xs:enumeration value="Always" /> | 320 | <xs:enumeration value="Always" /> |
321 | <xs:enumeration value="PreserveNewest" /> | 321 | <xs:enumeration value="PreserveNewest" /> |
322 | </xs:restriction> | 322 | </xs:restriction> |
323 | </xs:simpleType> | 323 | </xs:simpleType> |
324 | </xs:attribute> | 324 | </xs:attribute> |
325 | <xs:attribute name="preservePath" type="xs:boolean" /> | 325 | <xs:attribute name="preservePath" type="xs:boolean" /> |
326 | <xs:attribute name="linkPath" type="xs:string" /> | 326 | <xs:attribute name="linkPath" type="xs:string" /> |
327 | </xs:complexType> | 327 | </xs:complexType> |
328 | </xs:element> | 328 | </xs:element> |
329 | 329 | ||
330 | <xs:element name="Exclude"> | 330 | <xs:element name="Exclude"> |
331 | <xs:complexType> | 331 | <xs:complexType> |
332 | <xs:attribute name="name" type="xs:string" /> | 332 | <xs:attribute name="name" type="xs:string" /> |
333 | <xs:attribute name="pattern" type="xs:string" /> | 333 | <xs:attribute name="pattern" type="xs:string" /> |
334 | </xs:complexType> | 334 | </xs:complexType> |
335 | </xs:element> | 335 | </xs:element> |
336 | 336 | ||
337 | <xs:element name="Cleanup"> | 337 | <xs:element name="Cleanup"> |
338 | <xs:complexType> | 338 | <xs:complexType> |
339 | <xs:sequence> | 339 | <xs:sequence> |
340 | <xs:element ref="CleanFiles" minOccurs="1" maxOccurs="unbounded" /> | 340 | <xs:element ref="CleanFiles" minOccurs="1" maxOccurs="unbounded" /> |
341 | </xs:sequence> | 341 | </xs:sequence> |
342 | </xs:complexType> | 342 | </xs:complexType> |
343 | </xs:element> | 343 | </xs:element> |
344 | 344 | ||
345 | <xs:element name="CleanFiles"> | 345 | <xs:element name="CleanFiles"> |
346 | <xs:complexType> | 346 | <xs:complexType> |
347 | <xs:attribute name="pattern" type="xs:string" /> | 347 | <xs:attribute name="pattern" type="xs:string" /> |
348 | </xs:complexType> | 348 | </xs:complexType> |
349 | </xs:element> | 349 | </xs:element> |
350 | </xs:schema> | 350 | </xs:schema> |
diff --git a/Prebuild/src/data/prebuild-1.9.xsd b/Prebuild/src/data/prebuild-1.9.xsd index fbca556..d647e08 100644 --- a/Prebuild/src/data/prebuild-1.9.xsd +++ b/Prebuild/src/data/prebuild-1.9.xsd | |||
@@ -1,336 +1,336 @@ | |||
1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
2 | <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd" xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd"> | 2 | <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd" xmlns="http://dnpb.sourceforge.net/schemas/prebuild-1.9.xsd"> |
3 | <xs:annotation> | 3 | <xs:annotation> |
4 | <xs:documentation> | 4 | <xs:documentation> |
5 | Copyright (c) 2004-2007 | 5 | Copyright (c) 2004-2007 |
6 | Matthew Holmes (calefaction at houston . rr . com), | 6 | Matthew Holmes (calefaction at houston . rr . com), |
7 | Dan Moorehead (dan05a at gmail . com), | 7 | Dan Moorehead (dan05a at gmail . com), |
8 | David Hudson (jendave at yahoo dot com), | 8 | David Hudson (jendave at yahoo dot com), |
9 | C.J. Adams-Collier (cjac at colliertech dot com) | 9 | C.J. Adams-Collier (cjac at colliertech dot com) |
10 | 10 | ||
11 | .NET Prebuild is a cross-platform XML-driven pre-build tool which | 11 | .NET Prebuild is a cross-platform XML-driven pre-build tool which |
12 | allows developers to easily generate project or make files for major | 12 | allows developers to easily generate project or make files for major |
13 | IDE's and .NET development tools including: Visual Studio .NET 2002, | 13 | IDE's and .NET development tools including: Visual Studio .NET 2002, |
14 | 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. | 14 | 2003, and 2005, SharpDevelop, MonoDevelop, NAnt, Xcode and the GNU Autotools. |
15 | 15 | ||
16 | BSD License: | 16 | BSD License: |
17 | 17 | ||
18 | Redistribution and use in source and binary forms, with or without modification, are permitted | 18 | Redistribution and use in source and binary forms, with or without modification, are permitted |
19 | provided that the following conditions are met: | 19 | provided that the following conditions are met: |
20 | 20 | ||
21 | * Redistributions of source code must retain the above copyright notice, this list of conditions | 21 | * Redistributions of source code must retain the above copyright notice, this list of conditions |
22 | and the following disclaimer. | 22 | and the following disclaimer. |
23 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions | 23 | * Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
24 | and the following disclaimer in the documentation and/or other materials provided with the | 24 | and the following disclaimer in the documentation and/or other materials provided with the |
25 | distribution. | 25 | distribution. |
26 | * The name of the author may not be used to endorse or promote products derived from this software | 26 | * The name of the author may not be used to endorse or promote products derived from this software |
27 | without specific prior written permission. | 27 | without specific prior written permission. |
28 | 28 | ||
29 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, | 29 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, |
30 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 30 | BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
31 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 31 | ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
32 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 32 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
33 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 33 | OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
34 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | 34 | OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
35 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 35 | IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
36 | </xs:documentation> | 36 | </xs:documentation> |
37 | </xs:annotation> | 37 | </xs:annotation> |
38 | 38 | ||
39 | <xs:element name="Prebuild"> | 39 | <xs:element name="Prebuild"> |
40 | <xs:complexType> | 40 | <xs:complexType> |
41 | <xs:sequence> | 41 | <xs:sequence> |
42 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> | 42 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> |
43 | <xs:element ref="Solution" minOccurs="1" maxOccurs="1" /> | 43 | <xs:element ref="Solution" minOccurs="1" maxOccurs="1" /> |
44 | </xs:sequence> | 44 | </xs:sequence> |
45 | <xs:attribute name="version" /> | 45 | <xs:attribute name="version" /> |
46 | <xs:attribute name="checkOsVars" /> | 46 | <xs:attribute name="checkOsVars" /> |
47 | </xs:complexType> | 47 | </xs:complexType> |
48 | </xs:element> | 48 | </xs:element> |
49 | 49 | ||
50 | <xs:element name="Process" type="xs:string" /> | 50 | <xs:element name="Process" type="xs:string" /> |
51 | 51 | ||
52 | <xs:element name="Solution"> | 52 | <xs:element name="Solution"> |
53 | <xs:complexType> | 53 | <xs:complexType> |
54 | <xs:sequence> | 54 | <xs:sequence> |
55 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> | 55 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> |
56 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> | 56 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> |
57 | <xs:element ref="Options" minOccurs="0" /> | 57 | <xs:element ref="Options" minOccurs="0" /> |
58 | <xs:element ref="Files" minOccurs="0" /> | 58 | <xs:element ref="Files" minOccurs="0" /> |
59 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> | 59 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> |
60 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> | 60 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> |
61 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> | 61 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> |
62 | </xs:sequence> | 62 | </xs:sequence> |
63 | <xs:attribute name="name" type="xs:string" use="required" /> | 63 | <xs:attribute name="name" type="xs:string" use="required" /> |
64 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> | 64 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> |
65 | <xs:attribute name="path" type="xs:string" default="" /> | 65 | <xs:attribute name="path" type="xs:string" default="" /> |
66 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> | 66 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> |
67 | </xs:complexType> | 67 | </xs:complexType> |
68 | </xs:element> | 68 | </xs:element> |
69 | 69 | ||
70 | <xs:element name="EmbeddedSolution"> | 70 | <xs:element name="EmbeddedSolution"> |
71 | <xs:complexType> | 71 | <xs:complexType> |
72 | <xs:sequence> | 72 | <xs:sequence> |
73 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> | 73 | <xs:element ref="Process" minOccurs="0" maxOccurs="unbounded" /> |
74 | <xs:element ref="Files" minOccurs="0" /> | 74 | <xs:element ref="Files" minOccurs="0" /> |
75 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> | 75 | <xs:element ref="Project" minOccurs="0" maxOccurs="unbounded" /> |
76 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> | 76 | <xs:element ref="DatabaseProject" minOccurs="0" maxOccurs="unbounded" /> |
77 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> | 77 | <xs:element ref="EmbeddedSolution" minOccurs="0" maxOccurs="unbounded" /> |
78 | </xs:sequence> | 78 | </xs:sequence> |
79 | <xs:attribute name="name" type="xs:string" use="required" /> | 79 | <xs:attribute name="name" type="xs:string" use="required" /> |
80 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> | 80 | <xs:attribute name="activeConfig" type="xs:string" default="Debug" /> |
81 | <xs:attribute name="path" type="xs:string" default="" /> | 81 | <xs:attribute name="path" type="xs:string" default="" /> |
82 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> | 82 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> |
83 | </xs:complexType> | 83 | </xs:complexType> |
84 | </xs:element> | 84 | </xs:element> |
85 | 85 | ||
86 | <xs:element name="DatabaseProject"> | 86 | <xs:element name="DatabaseProject"> |
87 | <xs:complexType> | 87 | <xs:complexType> |
88 | <xs:sequence> | 88 | <xs:sequence> |
89 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> | 89 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> |
90 | <xs:element ref="DatabaseReference" minOccurs="0" maxOccurs="unbounded" /> | 90 | <xs:element ref="DatabaseReference" minOccurs="0" maxOccurs="unbounded" /> |
91 | </xs:sequence> | 91 | </xs:sequence> |
92 | <xs:attribute name="name" type="xs:string" use="required" /> | 92 | <xs:attribute name="name" type="xs:string" use="required" /> |
93 | <xs:attribute name="path" type="xs:string" /> | 93 | <xs:attribute name="path" type="xs:string" /> |
94 | </xs:complexType> | 94 | </xs:complexType> |
95 | </xs:element> | 95 | </xs:element> |
96 | 96 | ||
97 | <xs:element name="DatabaseReference"> | 97 | <xs:element name="DatabaseReference"> |
98 | <xs:complexType> | 98 | <xs:complexType> |
99 | <xs:attribute name="name" type="xs:string" use="required" /> | 99 | <xs:attribute name="name" type="xs:string" use="required" /> |
100 | <xs:attribute name="providerId" type="xs:string" /> | 100 | <xs:attribute name="providerId" type="xs:string" /> |
101 | <xs:attribute name="providerName" type="xs:string" /> | 101 | <xs:attribute name="providerName" type="xs:string" /> |
102 | <xs:attribute name="connectionString" type="xs:string" use="required" /> | 102 | <xs:attribute name="connectionString" type="xs:string" use="required" /> |
103 | </xs:complexType> | 103 | </xs:complexType> |
104 | </xs:element> | 104 | </xs:element> |
105 | 105 | ||
106 | <xs:element name="Project"> | 106 | <xs:element name="Project"> |
107 | <xs:complexType> | 107 | <xs:complexType> |
108 | <xs:sequence> | 108 | <xs:sequence> |
109 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> | 109 | <xs:element name="Author" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> |
110 | <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" /> | 110 | <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1" /> |
111 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> | 111 | <xs:element ref="Configuration" minOccurs="1" maxOccurs="unbounded" /> |
112 | <xs:element name="ReferencePath" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> | 112 | <xs:element name="ReferencePath" type="xs:string" minOccurs="0" maxOccurs="unbounded" /> |
113 | <xs:element name="Reference" minOccurs="0" maxOccurs="unbounded"> | 113 | <xs:element name="Reference" minOccurs="0" maxOccurs="unbounded"> |
114 | <xs:complexType> | 114 | <xs:complexType> |
115 | <xs:attribute name="name" type="xs:string" use="required" /> | 115 | <xs:attribute name="name" type="xs:string" use="required" /> |
116 | <xs:attribute name="path" type="xs:string" /> | 116 | <xs:attribute name="path" type="xs:string" /> |
117 | <xs:attribute name="localCopy" type="xs:boolean" /> | 117 | <xs:attribute name="localCopy" type="xs:boolean" /> |
118 | <xs:attribute name="version" type="xs:string" /> | 118 | <xs:attribute name="version" type="xs:string" /> |
119 | </xs:complexType> | 119 | </xs:complexType> |
120 | </xs:element> | 120 | </xs:element> |
121 | <xs:element ref="Files" /> | 121 | <xs:element ref="Files" /> |
122 | </xs:sequence> | 122 | </xs:sequence> |
123 | <xs:attribute name="name" type="xs:string" use="required" /> | 123 | <xs:attribute name="name" type="xs:string" use="required" /> |
124 | <xs:attribute name="designerFolder" type="xs:string" default="" /> | 124 | <xs:attribute name="designerFolder" type="xs:string" default="" /> |
125 | <xs:attribute name="filterGroups" type="xs:string" default="" /> | 125 | <xs:attribute name="filterGroups" type="xs:string" default="" /> |
126 | <xs:attribute name="path" type="xs:string" default="" /> | 126 | <xs:attribute name="path" type="xs:string" default="" /> |
127 | <xs:attribute name="icon" type="xs:string" default="" /> | 127 | <xs:attribute name="icon" type="xs:string" default="" /> |
128 | <xs:attribute name="configFile" type="xs:string" default="" /> | 128 | <xs:attribute name="configFile" type="xs:string" default="" /> |
129 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> | 129 | <xs:attribute name="version" type="xs:string" default="1.0.0" /> |
130 | <xs:attribute name="guid" type="xs:string"/> | 130 | <xs:attribute name="guid" type="xs:string"/> |
131 | <xs:attribute name="language" default="C#"> | 131 | <xs:attribute name="language" default="C#"> |
132 | <xs:simpleType> | 132 | <xs:simpleType> |
133 | <xs:restriction base="xs:string"> | 133 | <xs:restriction base="xs:string"> |
134 | <xs:enumeration value="C#" /> | 134 | <xs:enumeration value="C#" /> |
135 | <xs:enumeration value="VB.NET" /> | 135 | <xs:enumeration value="VB.NET" /> |
136 | </xs:restriction> | 136 | </xs:restriction> |
137 | </xs:simpleType> | 137 | </xs:simpleType> |
138 | </xs:attribute> | 138 | </xs:attribute> |
139 | <xs:attribute name="type" default="Exe"> | 139 | <xs:attribute name="type" default="Exe"> |
140 | <xs:simpleType> | 140 | <xs:simpleType> |
141 | <xs:restriction base="xs:string"> | 141 | <xs:restriction base="xs:string"> |
142 | <xs:enumeration value="Exe" /> | 142 | <xs:enumeration value="Exe" /> |
143 | <xs:enumeration value="WinExe" /> | 143 | <xs:enumeration value="WinExe" /> |
144 | <xs:enumeration value="Library" /> | 144 | <xs:enumeration value="Library" /> |
145 | <xs:enumeration value="Web" /> | 145 | <xs:enumeration value="Web" /> |
146 | </xs:restriction> | 146 | </xs:restriction> |
147 | </xs:simpleType> | 147 | </xs:simpleType> |
148 | </xs:attribute> | 148 | </xs:attribute> |
149 | <xs:attribute name="runtime" default="Microsoft"> | 149 | <xs:attribute name="runtime" default="Microsoft"> |
150 | <xs:simpleType> | 150 | <xs:simpleType> |
151 | <xs:restriction base="xs:string"> | 151 | <xs:restriction base="xs:string"> |
152 | <xs:enumeration value="Microsoft" /> | 152 | <xs:enumeration value="Microsoft" /> |
153 | <xs:enumeration value="Mono" /> | 153 | <xs:enumeration value="Mono" /> |
154 | </xs:restriction> | 154 | </xs:restriction> |
155 | </xs:simpleType> | 155 | </xs:simpleType> |
156 | </xs:attribute> | 156 | </xs:attribute> |
157 | <xs:attribute name="frameworkVersion" default="v2_0"> | 157 | <xs:attribute name="frameworkVersion" default="v2_0"> |
158 | <xs:simpleType> | 158 | <xs:simpleType> |
159 | <xs:restriction base="xs:string"> | 159 | <xs:restriction base="xs:string"> |
160 | <xs:enumeration value="v2_0" /> | 160 | <xs:enumeration value="v2_0" /> |
161 | <xs:enumeration value="v3_0" /> | 161 | <xs:enumeration value="v3_0" /> |
162 | <xs:enumeration value="v3_5" /> | 162 | <xs:enumeration value="v3_5" /> |
163 | <xs:enumeration value="v4_0" /> | 163 | <xs:enumeration value="v4_0" /> |
164 | </xs:restriction> | 164 | </xs:restriction> |
165 | </xs:simpleType> | 165 | </xs:simpleType> |
166 | </xs:attribute> | 166 | </xs:attribute> |
167 | <xs:attribute name="startupObject" type="xs:string" default="" /> | 167 | <xs:attribute name="startupObject" type="xs:string" default="" /> |
168 | <xs:attribute name="rootNamespace" type="xs:string" /> | 168 | <xs:attribute name="rootNamespace" type="xs:string" /> |
169 | <xs:attribute name="assemblyName" type="xs:string" /> | 169 | <xs:attribute name="assemblyName" type="xs:string" /> |
170 | <xs:attribute name="generateAssemblyInfoFile" type="xs:boolean" default="false" /> | 170 | <xs:attribute name="generateAssemblyInfoFile" type="xs:boolean" default="false" /> |
171 | </xs:complexType> | 171 | </xs:complexType> |
172 | </xs:element> | 172 | </xs:element> |
173 | 173 | ||
174 | <xs:element name="Configuration"> | 174 | <xs:element name="Configuration"> |
175 | <xs:complexType> | 175 | <xs:complexType> |
176 | <xs:sequence> | 176 | <xs:sequence> |
177 | <xs:element ref="Options" minOccurs="0" /> | 177 | <xs:element ref="Options" minOccurs="0" /> |
178 | </xs:sequence> | 178 | </xs:sequence> |
179 | <xs:attribute name="name" type="xs:string" use="required" /> | 179 | <xs:attribute name="name" type="xs:string" use="required" /> |
180 | <xs:attribute name="platform" type="xs:string" use="required" /> | 180 | <xs:attribute name="platform" type="xs:string" use="required" /> |
181 | </xs:complexType> | 181 | </xs:complexType> |
182 | </xs:element> | 182 | </xs:element> |
183 | <xs:element name="Options"> | 183 | <xs:element name="Options"> |
184 | <xs:complexType> | 184 | <xs:complexType> |
185 | <xs:all> | 185 | <xs:all> |
186 | <xs:element name="CompilerDefines" type="xs:string" minOccurs="0" /> | 186 | <xs:element name="CompilerDefines" type="xs:string" minOccurs="0" /> |
187 | <xs:element name="OptimizeCode" type="xs:boolean" minOccurs="0" /> | 187 | <xs:element name="OptimizeCode" type="xs:boolean" minOccurs="0" /> |
188 | <xs:element name="CheckUnderflowOverflow" type="xs:boolean" minOccurs="0" /> | 188 | <xs:element name="CheckUnderflowOverflow" type="xs:boolean" minOccurs="0" /> |
189 | <xs:element name="AllowUnsafe" type="xs:boolean" minOccurs="0" /> | 189 | <xs:element name="AllowUnsafe" type="xs:boolean" minOccurs="0" /> |
190 | <xs:element name="PreBuildEvent" type="xs:string" minOccurs="0" /> | 190 | <xs:element name="PreBuildEvent" type="xs:string" minOccurs="0" /> |
191 | <xs:element name="PostBuildEvent" type="xs:string" minOccurs="0" /> | 191 | <xs:element name="PostBuildEvent" type="xs:string" minOccurs="0" /> |
192 | <xs:element name="RunPostBuildEvent" minOccurs="0" default="OnBuildSuccess"> | 192 | <xs:element name="RunPostBuildEvent" minOccurs="0" default="OnBuildSuccess"> |
193 | <xs:simpleType> | 193 | <xs:simpleType> |
194 | <xs:restriction base="xs:string"> | 194 | <xs:restriction base="xs:string"> |
195 | <xs:enumeration value="OnBuildSuccess" /> | 195 | <xs:enumeration value="OnBuildSuccess" /> |
196 | <xs:enumeration value="Always" /> | 196 | <xs:enumeration value="Always" /> |
197 | <xs:enumeration value="OnOutputUpdated" /> | 197 | <xs:enumeration value="OnOutputUpdated" /> |
198 | </xs:restriction> | 198 | </xs:restriction> |
199 | </xs:simpleType> | 199 | </xs:simpleType> |
200 | </xs:element> | 200 | </xs:element> |
201 | <xs:element name="RunScript" type="xs:string" minOccurs="0" /> | 201 | <xs:element name="RunScript" type="xs:string" minOccurs="0" /> |
202 | <xs:element name="PreBuildEventArgs" type="xs:string" minOccurs="0" /> | 202 | <xs:element name="PreBuildEventArgs" type="xs:string" minOccurs="0" /> |
203 | <xs:element name="PostBuildEventArgs" type="xs:string" minOccurs="0" /> | 203 | <xs:element name="PostBuildEventArgs" type="xs:string" minOccurs="0" /> |
204 | <xs:element name="WarningLevel" minOccurs="0"> | 204 | <xs:element name="WarningLevel" minOccurs="0"> |
205 | <xs:simpleType> | 205 | <xs:simpleType> |
206 | <xs:restriction base="xs:integer"> | 206 | <xs:restriction base="xs:integer"> |
207 | <xs:minInclusive value="0" /> | 207 | <xs:minInclusive value="0" /> |
208 | <xs:maxInclusive value="4" /> | 208 | <xs:maxInclusive value="4" /> |
209 | </xs:restriction> | 209 | </xs:restriction> |
210 | </xs:simpleType> | 210 | </xs:simpleType> |
211 | </xs:element> | 211 | </xs:element> |
212 | <xs:element name="WarningsAsErrors" type="xs:boolean" minOccurs="0" /> | 212 | <xs:element name="WarningsAsErrors" type="xs:boolean" minOccurs="0" /> |
213 | <xs:element name="SuppressWarnings" type="xs:string" minOccurs="0" /> | 213 | <xs:element name="SuppressWarnings" type="xs:string" minOccurs="0" /> |
214 | <xs:element name="OutputPath" type="xs:string" minOccurs="0" /> | 214 | <xs:element name="OutputPath" type="xs:string" minOccurs="0" /> |
215 | <xs:element name="GenerateDocumentation" type="xs:boolean" minOccurs="0" /> | 215 | <xs:element name="GenerateDocumentation" type="xs:boolean" minOccurs="0" /> |
216 | <xs:element name="XmlDocFile" type="xs:string" minOccurs="0" /> | 216 | <xs:element name="XmlDocFile" type="xs:string" minOccurs="0" /> |
217 | <xs:element name="DebugInformation" type="xs:boolean" minOccurs="0" /> | 217 | <xs:element name="DebugInformation" type="xs:boolean" minOccurs="0" /> |
218 | <xs:element name="RegisterComInterop" type="xs:boolean" minOccurs="0" /> | 218 | <xs:element name="RegisterComInterop" type="xs:boolean" minOccurs="0" /> |
219 | <xs:element name="RemoveIntegerChecks" type="xs:boolean" minOccurs="0" /> | 219 | <xs:element name="RemoveIntegerChecks" type="xs:boolean" minOccurs="0" /> |
220 | <xs:element name="IncrementalBuild" type="xs:boolean" minOccurs="0" /> | 220 | <xs:element name="IncrementalBuild" type="xs:boolean" minOccurs="0" /> |
221 | <xs:element name="BaseAddress" type="xs:string" minOccurs="0" /> | 221 | <xs:element name="BaseAddress" type="xs:string" minOccurs="0" /> |
222 | <xs:element name="FileAlignment" type="xs:integer" minOccurs="0" /> | 222 | <xs:element name="FileAlignment" type="xs:integer" minOccurs="0" /> |
223 | <xs:element name="NoStdLib" type="xs:boolean" minOccurs="0" /> | 223 | <xs:element name="NoStdLib" type="xs:boolean" minOccurs="0" /> |
224 | <xs:element name="KeyFile" type="xs:string" minOccurs="0" /> | 224 | <xs:element name="KeyFile" type="xs:string" minOccurs="0" /> |
225 | </xs:all> | 225 | </xs:all> |
226 | </xs:complexType> | 226 | </xs:complexType> |
227 | </xs:element> | 227 | </xs:element> |
228 | <xs:element name="Files"> | 228 | <xs:element name="Files"> |
229 | <xs:complexType> | 229 | <xs:complexType> |
230 | <xs:sequence> | 230 | <xs:sequence> |
231 | <xs:element ref="File" minOccurs="0" maxOccurs="unbounded" /> | 231 | <xs:element ref="File" minOccurs="0" maxOccurs="unbounded" /> |
232 | <xs:element ref="Match" minOccurs="0" maxOccurs="unbounded" /> | 232 | <xs:element ref="Match" minOccurs="0" maxOccurs="unbounded" /> |
233 | </xs:sequence> | 233 | </xs:sequence> |
234 | </xs:complexType> | 234 | </xs:complexType> |
235 | </xs:element> | 235 | </xs:element> |
236 | <xs:element name="File"> | 236 | <xs:element name="File"> |
237 | <xs:complexType> | 237 | <xs:complexType> |
238 | <xs:simpleContent> | 238 | <xs:simpleContent> |
239 | <xs:extension base="xs:string"> | 239 | <xs:extension base="xs:string"> |
240 | <xs:attribute name="resourceName" type="xs:string" default="" /> | 240 | <xs:attribute name="resourceName" type="xs:string" default="" /> |
241 | <xs:attribute name="buildAction" default="Compile"> | 241 | <xs:attribute name="buildAction" default="Compile"> |
242 | <xs:simpleType> | 242 | <xs:simpleType> |
243 | <xs:restriction base="xs:string"> | 243 | <xs:restriction base="xs:string"> |
244 | <xs:enumeration value="None" /> | 244 | <xs:enumeration value="None" /> |
245 | <xs:enumeration value="Compile" /> | 245 | <xs:enumeration value="Compile" /> |
246 | <xs:enumeration value="Content" /> | 246 | <xs:enumeration value="Content" /> |
247 | <xs:enumeration value="EmbeddedResource" /> | 247 | <xs:enumeration value="EmbeddedResource" /> |
248 | <xs:enumeration value="ApplicationDefinition" /> | 248 | <xs:enumeration value="ApplicationDefinition" /> |
249 | <xs:enumeration value="Page" /> | 249 | <xs:enumeration value="Page" /> |
250 | </xs:restriction> | 250 | </xs:restriction> |
251 | </xs:simpleType> | 251 | </xs:simpleType> |
252 | </xs:attribute> | 252 | </xs:attribute> |
253 | <xs:attribute name="subType" default="Code"> | 253 | <xs:attribute name="subType" default="Code"> |
254 | <xs:simpleType> | 254 | <xs:simpleType> |
255 | <xs:restriction base="xs:string"> | 255 | <xs:restriction base="xs:string"> |
256 | <xs:enumeration value="Code" /> | 256 | <xs:enumeration value="Code" /> |
257 | <xs:enumeration value="CodeBehind" /> | 257 | <xs:enumeration value="CodeBehind" /> |
258 | <xs:enumeration value="Component" /> | 258 | <xs:enumeration value="Component" /> |
259 | <xs:enumeration value="Form" /> | 259 | <xs:enumeration value="Form" /> |
260 | <xs:enumeration value="Settings" /> | 260 | <xs:enumeration value="Settings" /> |
261 | <xs:enumeration value="UserControl" /> | 261 | <xs:enumeration value="UserControl" /> |
262 | </xs:restriction> | 262 | </xs:restriction> |
263 | </xs:simpleType> | 263 | </xs:simpleType> |
264 | </xs:attribute> | 264 | </xs:attribute> |
265 | <xs:attribute name="link" type="xs:boolean" /> | 265 | <xs:attribute name="link" type="xs:boolean" /> |
266 | <xs:attribute name="copyToOutput" default="Never"> | 266 | <xs:attribute name="copyToOutput" default="Never"> |
267 | <xs:simpleType> | 267 | <xs:simpleType> |
268 | <xs:restriction base="xs:string"> | 268 | <xs:restriction base="xs:string"> |
269 | <xs:enumeration value="Never" /> | 269 | <xs:enumeration value="Never" /> |
270 | <xs:enumeration value="Always" /> | 270 | <xs:enumeration value="Always" /> |
271 | <xs:enumeration value="PreserveNewest" /> | 271 | <xs:enumeration value="PreserveNewest" /> |
272 | </xs:restriction> | 272 | </xs:restriction> |
273 | </xs:simpleType> | 273 | </xs:simpleType> |
274 | </xs:attribute> | 274 | </xs:attribute> |
275 | <xs:attribute name="preservePath" type="xs:boolean" /> | 275 | <xs:attribute name="preservePath" type="xs:boolean" /> |
276 | <xs:attribute name="linkPath" type="xs:string" /> | 276 | <xs:attribute name="linkPath" type="xs:string" /> |
277 | </xs:extension> | 277 | </xs:extension> |
278 | </xs:simpleContent> | 278 | </xs:simpleContent> |
279 | </xs:complexType> | 279 | </xs:complexType> |
280 | </xs:element> | 280 | </xs:element> |
281 | <xs:element name="Match"> | 281 | <xs:element name="Match"> |
282 | <xs:complexType> | 282 | <xs:complexType> |
283 | <xs:sequence> | 283 | <xs:sequence> |
284 | <xs:element ref="Exclude" minOccurs="0" maxOccurs="unbounded" /> | 284 | <xs:element ref="Exclude" minOccurs="0" maxOccurs="unbounded" /> |
285 | </xs:sequence> | 285 | </xs:sequence> |
286 | <xs:attribute name="path" type="xs:string" /> | 286 | <xs:attribute name="path" type="xs:string" /> |
287 | <xs:attribute name="pattern" type="xs:string" use="required" /> | 287 | <xs:attribute name="pattern" type="xs:string" use="required" /> |
288 | <xs:attribute name="recurse" type="xs:boolean" default="false" /> | 288 | <xs:attribute name="recurse" type="xs:boolean" default="false" /> |
289 | <xs:attribute name="useRegex" type="xs:boolean" default="false" /> | 289 | <xs:attribute name="useRegex" type="xs:boolean" default="false" /> |
290 | <xs:attribute name="buildAction" default="Compile"> | 290 | <xs:attribute name="buildAction" default="Compile"> |
291 | <xs:simpleType> | 291 | <xs:simpleType> |
292 | <xs:restriction base="xs:string"> | 292 | <xs:restriction base="xs:string"> |
293 | <xs:enumeration value="None" /> | 293 | <xs:enumeration value="None" /> |
294 | <xs:enumeration value="Compile" /> | 294 | <xs:enumeration value="Compile" /> |
295 | <xs:enumeration value="Content" /> | 295 | <xs:enumeration value="Content" /> |
296 | <xs:enumeration value="EmbeddedResource" /> | 296 | <xs:enumeration value="EmbeddedResource" /> |
297 | <xs:enumeration value="ApplicationDefinition" /> | 297 | <xs:enumeration value="ApplicationDefinition" /> |
298 | <xs:enumeration value="Page" /> | 298 | <xs:enumeration value="Page" /> |
299 | </xs:restriction> | 299 | </xs:restriction> |
300 | </xs:simpleType> | 300 | </xs:simpleType> |
301 | </xs:attribute> | 301 | </xs:attribute> |
302 | <xs:attribute name="resourceName" type="xs:string" default="" /> | 302 | <xs:attribute name="resourceName" type="xs:string" default="" /> |
303 | <xs:attribute name="subType" default="Code"> | 303 | <xs:attribute name="subType" default="Code"> |
304 | <xs:simpleType> | 304 | <xs:simpleType> |
305 | <xs:restriction base="xs:string"> | 305 | <xs:restriction base="xs:string"> |
306 | <xs:enumeration value="Code" /> | 306 | <xs:enumeration value="Code" /> |
307 | <xs:enumeration value="CodeBehind" /> | 307 | <xs:enumeration value="CodeBehind" /> |
308 | <xs:enumeration value="Component" /> | 308 | <xs:enumeration value="Component" /> |
309 | <xs:enumeration value="Designer" /> | 309 | <xs:enumeration value="Designer" /> |
310 | <xs:enumeration value="Form" /> | 310 | <xs:enumeration value="Form" /> |
311 | <xs:enumeration value="Settings" /> | 311 | <xs:enumeration value="Settings" /> |
312 | <xs:enumeration value="UserControl" /> | 312 | <xs:enumeration value="UserControl" /> |
313 | </xs:restriction> | 313 | </xs:restriction> |
314 | </xs:simpleType> | 314 | </xs:simpleType> |
315 | </xs:attribute> | 315 | </xs:attribute> |
316 | <xs:attribute name="link" type="xs:boolean" /> | 316 | <xs:attribute name="link" type="xs:boolean" /> |
317 | <xs:attribute name="copyToOutput" default="Never"> | 317 | <xs:attribute name="copyToOutput" default="Never"> |
318 | <xs:simpleType> | 318 | <xs:simpleType> |
319 | <xs:restriction base="xs:string"> | 319 | <xs:restriction base="xs:string"> |
320 | <xs:enumeration value="Never" /> | 320 | <xs:enumeration value="Never" /> |
321 | <xs:enumeration value="Always" /> | 321 | <xs:enumeration value="Always" /> |
322 | <xs:enumeration value="PreserveNewest" /> | 322 | <xs:enumeration value="PreserveNewest" /> |
323 | </xs:restriction> | 323 | </xs:restriction> |
324 | </xs:simpleType> | 324 | </xs:simpleType> |
325 | </xs:attribute> | 325 | </xs:attribute> |
326 | <xs:attribute name="preservePath" type="xs:boolean" /> | 326 | <xs:attribute name="preservePath" type="xs:boolean" /> |
327 | <xs:attribute name="linkPath" type="xs:string" /> | 327 | <xs:attribute name="linkPath" type="xs:string" /> |
328 | </xs:complexType> | 328 | </xs:complexType> |
329 | </xs:element> | 329 | </xs:element> |
330 | <xs:element name="Exclude"> | 330 | <xs:element name="Exclude"> |
331 | <xs:complexType> | 331 | <xs:complexType> |
332 | <xs:attribute name="name" type="xs:string" /> | 332 | <xs:attribute name="name" type="xs:string" /> |
333 | <xs:attribute name="pattern" type="xs:string" /> | 333 | <xs:attribute name="pattern" type="xs:string" /> |
334 | </xs:complexType> | 334 | </xs:complexType> |
335 | </xs:element> | 335 | </xs:element> |
336 | </xs:schema> | 336 | </xs:schema> |
Binary files differ | |||
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 972efe4..3e7f8a6 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini | |||
@@ -181,6 +181,11 @@ | |||
181 | ; ## PHYSICS | 181 | ; ## PHYSICS |
182 | ; ## | 182 | ; ## |
183 | 183 | ||
184 | ; If true then prims can be collided with by avatars, other prims, etc. | ||
185 | ; If false then all prims are phantom, no matter whether their phantom flag is checked or unchecked. | ||
186 | ; Also, no prims are subject to physics. | ||
187 | collidable_prim = true | ||
188 | |||
184 | ; If true then prims can be made subject to physics (gravity, pushing, etc.). | 189 | ; If true then prims can be made subject to physics (gravity, pushing, etc.). |
185 | ; If false then physics flag can be set but it is not honoured. However, prims are still solid for the purposes of collision direction | 190 | ; If false then physics flag can be set but it is not honoured. However, prims are still solid for the purposes of collision direction |
186 | physical_prim = true | 191 | physical_prim = true |
diff --git a/bin/Prebuild.exe b/bin/Prebuild.exe index ead3c6b..bdb25b6 100755 --- a/bin/Prebuild.exe +++ b/bin/Prebuild.exe | |||
Binary files differ | |||
diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index eee7dc8..49ee41a 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 | |||
82 | ; * | 82 | ; * |
83 | [GridService] | 83 | [GridService] |
84 | LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" | 84 | LocalServiceModule = "OpenSim.Services.GridService.dll:GridService" |
85 | HypergridLinker = true | ||
86 | |||
85 | ; Realm = "regions" | 87 | ; Realm = "regions" |
86 | ; AllowDuplicateNames = "True" | 88 | ; AllowDuplicateNames = "True" |
87 | 89 | ||
diff --git a/bin/config-include/GridHypergrid.ini b/bin/config-include/GridHypergrid.ini index 4c32498..5f0ba37 100644 --- a/bin/config-include/GridHypergrid.ini +++ b/bin/config-include/GridHypergrid.ini | |||
@@ -26,7 +26,6 @@ | |||
26 | LandServices = "RemoteLandServicesConnector" | 26 | LandServices = "RemoteLandServicesConnector" |
27 | FriendsModule = "HGFriendsModule" | 27 | FriendsModule = "HGFriendsModule" |
28 | MapImageService = "MapImageServiceModule" | 28 | MapImageService = "MapImageServiceModule" |
29 | HypergridLinker = "HypergridLinker" | ||
30 | 29 | ||
31 | LandServiceInConnector = true | 30 | LandServiceInConnector = true |
32 | NeighbourServiceInConnector = true | 31 | NeighbourServiceInConnector = true |
@@ -60,6 +59,7 @@ | |||
60 | ; Needed to display non-default map tile images for linked regions | 59 | ; Needed to display non-default map tile images for linked regions |
61 | AssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector" | 60 | AssetService = "OpenSim.Services.Connectors.dll:AssetServicesConnector" |
62 | 61 | ||
62 | HypergridLinker = true | ||
63 | AllowHypergridMapSearch = true | 63 | AllowHypergridMapSearch = true |
64 | 64 | ||
65 | [LibraryService] | 65 | [LibraryService] |
diff --git a/bin/config-include/HyperSimianGrid.ini b/bin/config-include/HyperSimianGrid.ini index ec4efc0..99a589c 100644 --- a/bin/config-include/HyperSimianGrid.ini +++ b/bin/config-include/HyperSimianGrid.ini | |||
@@ -40,7 +40,6 @@ | |||
40 | LibraryModule = false | 40 | LibraryModule = false |
41 | 41 | ||
42 | AssetCaching = "FlotsamAssetCache" | 42 | AssetCaching = "FlotsamAssetCache" |
43 | HypergridLinker = "HypergridLinker" | ||
44 | 43 | ||
45 | [SimulationDataStore] | 44 | [SimulationDataStore] |
46 | LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" | 45 | LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService" |
@@ -56,6 +55,7 @@ | |||
56 | StorageProvider = "OpenSim.Data.Null.dll:NullRegionData" | 55 | StorageProvider = "OpenSim.Data.Null.dll:NullRegionData" |
57 | NetworkConnector = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector" | 56 | NetworkConnector = "OpenSim.Services.Connectors.dll:SimianGridServiceConnector" |
58 | 57 | ||
58 | HypergridLinker = true | ||
59 | AllowHypergridMapSearch = true | 59 | AllowHypergridMapSearch = true |
60 | 60 | ||
61 | [LibraryService] | 61 | [LibraryService] |
diff --git a/bin/config-include/StandaloneHypergrid.ini b/bin/config-include/StandaloneHypergrid.ini index f8c258a..00beb31 100644 --- a/bin/config-include/StandaloneHypergrid.ini +++ b/bin/config-include/StandaloneHypergrid.ini | |||
@@ -22,7 +22,6 @@ | |||
22 | EntityTransferModule = "HGEntityTransferModule" | 22 | EntityTransferModule = "HGEntityTransferModule" |
23 | InventoryAccessModule = "HGInventoryAccessModule" | 23 | InventoryAccessModule = "HGInventoryAccessModule" |
24 | FriendsModule = "HGFriendsModule" | 24 | FriendsModule = "HGFriendsModule" |
25 | HypergridLinker = "HypergridLinker" | ||
26 | 25 | ||
27 | InventoryServiceInConnector = true | 26 | InventoryServiceInConnector = true |
28 | AssetServiceInConnector = true | 27 | AssetServiceInConnector = true |
@@ -84,6 +83,7 @@ | |||
84 | ; Needed to display non-default map tile images for remote regions | 83 | ; Needed to display non-default map tile images for remote regions |
85 | AssetService = "OpenSim.Services.AssetService.dll:AssetService" | 84 | AssetService = "OpenSim.Services.AssetService.dll:AssetService" |
86 | 85 | ||
86 | HypergridLinker = true | ||
87 | AllowHypergridMapSearch = true | 87 | AllowHypergridMapSearch = true |
88 | 88 | ||
89 | [PresenceService] | 89 | [PresenceService] |
diff --git a/prebuild.xml b/prebuild.xml index e951187..4ea4708 100644 --- a/prebuild.xml +++ b/prebuild.xml | |||
@@ -926,6 +926,7 @@ | |||
926 | <ReferencePath>../../../bin/</ReferencePath> | 926 | <ReferencePath>../../../bin/</ReferencePath> |
927 | <Reference name="System"/> | 927 | <Reference name="System"/> |
928 | <Reference name="System.Core"/> | 928 | <Reference name="System.Core"/> |
929 | <Reference name="System.Web"/> | ||
929 | <Reference name="System.Xml"/> | 930 | <Reference name="System.Xml"/> |
930 | <Reference name="System.Drawing"/> | 931 | <Reference name="System.Drawing"/> |
931 | <Reference name="OpenMetaverseTypes" path="../../../bin/"/> | 932 | <Reference name="OpenMetaverseTypes" path="../../../bin/"/> |