The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ VsaItems

  1. // ==++==
  2. //
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using System;
  19.     using System.Collections;
  20.     using Microsoft.Vsa;
  21.     using Microsoft.JScript.Vsa;
  22.     using System.Security.Permissions;
  23.    
  24.     public sealed class VsaItems : IVsaItems
  25.     {
  26.         private ArrayList items;
  27.         private bool isClosed;
  28.         private VsaEngine engine;
  29.         internal int staticCodeBlockCount;
  30.        
  31.         // === Constructor ===
  32.        
  33.         public VsaItems(VsaEngine engine)
  34.         {
  35.             this.engine = engine;
  36.             this.staticCodeBlockCount = 0;
  37.             this.items = new ArrayList(10);
  38.         }
  39.        
  40.         // === Properties ===
  41.        
  42.         public IVsaItem this[int index]
  43.         {
  44.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  45.             get {
  46.                 if (this.isClosed)
  47.                     throw new VsaException(VsaError.EngineClosed);
  48.                 if (index < 0 || index >= items.Count)
  49.                     throw new VsaException(VsaError.ItemNotFound);
  50.                 return (IVsaItem)this.items[index];
  51.             }
  52.         }
  53.        
  54.         public IVsaItem this[string itemName]
  55.         {
  56.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  57.             get {
  58.                 if (this.isClosed)
  59.                     throw new VsaException(VsaError.EngineClosed);
  60.                 if (itemName != null) {
  61.                     for (int i = 0int n = this.items.Count; i < n; i++) {
  62.                         IVsaItem item = (IVsaItem)this.items[i];
  63.                         if (item.Name.Equals(itemName))
  64.                             return item;
  65.                     }
  66.                 }
  67.                 throw new VsaException(VsaError.ItemNotFound);
  68.             }
  69.         }
  70.        
  71.         public int Count {
  72.             [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  73.             get {
  74.                 if (this.isClosed)
  75.                     throw new VsaException(VsaError.EngineClosed);
  76.                 if (null != this.items)
  77.                     return this.items.Count;
  78.                 return 0;
  79.             }
  80.         }
  81.        
  82.         // === Methods ===
  83.        
  84.         public void Close()
  85.         {
  86.             if (this.isClosed)
  87.                 throw new VsaException(VsaError.EngineClosed);
  88.             this.TryObtainLock();
  89.             try {
  90.                 // close this item container
  91.                 this.isClosed = true;
  92.                 // close individual items
  93.                 foreach (object item in this.items) {
  94.                     ((VsaItem)item).Close();
  95.                 }
  96.                 this.items = null;
  97.             }
  98.             finally {
  99.                 this.ReleaseLock();
  100.                 this.engine = null;
  101.             }
  102.         }
  103.        
  104.         [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  105.         public IVsaItem CreateItem(string name, VsaItemType itemType, VsaItemFlag itemFlag)
  106.         {
  107.             if (this.isClosed)
  108.                 throw new VsaException(VsaError.EngineClosed);
  109.             if (this.engine.IsRunning)
  110.                 throw new VsaException(VsaError.EngineRunning);
  111.             this.TryObtainLock();
  112.             try {
  113.                 // The name must be valid for all items except reference items (in which case we don't care)
  114.                 if (itemType != VsaItemType.Reference && !this.engine.IsValidIdentifier(name))
  115.                     throw new VsaException(VsaError.ItemNameInvalid);
  116.                 // Make sure the name isn't already in use
  117.                 foreach (object vsaItem in this.items) {
  118.                     if (((VsaItem)vsaItem).Name.Equals(name))
  119.                         throw new VsaException(VsaError.ItemNameInUse);
  120.                 }
  121.                 IVsaItem item = null;
  122.                 switch (itemType) {
  123.                     case VsaItemType.Reference:
  124.                         // IVsaReference
  125.                         if (itemFlag != VsaItemFlag.None)
  126.                             throw new VsaException(VsaError.ItemFlagNotSupported);
  127.                         // create a wrapper around an assembly
  128.                         item = new VsaReference((VsaEngine)this.engine, name);
  129.                         break;
  130.                     case VsaItemType.AppGlobal:
  131.                        
  132.                         //IVsaGlobalItem
  133.                         if (itemFlag != VsaItemFlag.None)
  134.                             throw new VsaException(VsaError.ItemFlagNotSupported);
  135.                         item = new VsaHostObject((VsaEngine)this.engine, name, VsaItemType.AppGlobal);
  136.                         ((VsaHostObject)item).isVisible = true;
  137.                         break;
  138.                     case VsaItemType.Code:
  139.                        
  140.                         // IVsaCodeItem
  141.                         if (itemFlag == VsaItemFlag.Class)
  142.                             throw new VsaException(VsaError.ItemFlagNotSupported);
  143.                         item = new VsaStaticCode((VsaEngine)this.engine, name, itemFlag);
  144.                         this.staticCodeBlockCount++;
  145.                         break;
  146.                 }
  147.                 if (item != null) {
  148.                     this.items.Add(item);
  149.                 }
  150.                 else {
  151.                     throw new VsaException(VsaError.ItemTypeNotSupported);
  152.                 }
  153.                 ((VsaEngine)this.engine).IsDirty = true;
  154.                 return item;
  155.             }
  156.             finally {
  157.                 this.ReleaseLock();
  158.             }
  159.         }
  160.        
  161.         public IEnumerator GetEnumerator()
  162.         {
  163.             if (this.isClosed)
  164.                 throw new VsaException(VsaError.EngineClosed);
  165.             return this.items.GetEnumerator();
  166.         }
  167.        
  168.         [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  169.         public void Remove(string itemName)
  170.         {
  171.             if (this.isClosed)
  172.                 throw new VsaException(VsaError.EngineClosed);
  173.             this.TryObtainLock();
  174.             try {
  175.                 if (itemName == null)
  176.                     throw new System.ArgumentNullException("itemName");
  177.                 for (int i = 0int n = this.items.Count; i < n; i++) {
  178.                     IVsaItem item = (IVsaItem)this.items[i];
  179.                     if (item.Name.Equals(itemName)) {
  180.                         ((VsaItem)item).Remove();
  181.                         this.items.RemoveAt(i);
  182.                         ((VsaEngine)this.engine).IsDirty = true;
  183.                         if (item is VsaStaticCode)
  184.                             this.staticCodeBlockCount--;
  185.                         return;
  186.                     }
  187.                 }
  188.                 throw new VsaException(VsaError.ItemNotFound);
  189.             }
  190.             finally {
  191.                 this.ReleaseLock();
  192.             }
  193.         }
  194.        
  195.         [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
  196.         public void Remove(int itemIndex)
  197.         {
  198.             if (this.isClosed)
  199.                 throw new VsaException(VsaError.EngineClosed);
  200.             this.TryObtainLock();
  201.             try {
  202.                 if (0 <= itemIndex && itemIndex < items.Count) {
  203.                     VsaItem item = (VsaItem)this.items[itemIndex];
  204.                     item.Remove();
  205.                     this.items.RemoveAt(itemIndex);
  206.                     if (item is VsaStaticCode)
  207.                         this.staticCodeBlockCount--;
  208.                     return;
  209.                 }
  210.                 throw new VsaException(VsaError.ItemNotFound);
  211.             }
  212.             finally {
  213.                 this.ReleaseLock();
  214.             }
  215.         }
  216.        
  217.         // Helper methods
  218.        
  219.         private void TryObtainLock()
  220.         {
  221.             ((VsaEngine)this.engine).TryObtainLock();
  222.         }
  223.        
  224.         private void ReleaseLock()
  225.         {
  226.             ((VsaEngine)this.engine).ReleaseLock();
  227.         }
  228.     }
  229. }

Developer Fusion