home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 February / CHIP_2_98.iso / software / pelne / optionp / iis4_07.cab / VariantEnumerator.java < prev    next >
Text File  |  1997-10-25  |  5KB  |  160 lines

  1. /*  ********************************************************************************
  2.     VariantEnumerator.java *********************************************************
  3.     ********************************************************************************  */
  4.  
  5. package aspcomp;
  6.  
  7. import com.ms.com.*;
  8. import java.util.*;
  9.  
  10. /**
  11.  * The VariantEnumerator class is an implementation of an enumeration that works with 
  12.  * variant objects.
  13.  */
  14.  
  15. public class VariantEnumerator implements Enumerator 
  16. {
  17.  
  18. /*  ********************************************************************************
  19.     * Constructors *****************************************************************
  20.     ******************************************************************************** */
  21.  
  22.     public VariantEnumerator(IEnumVariant enum) 
  23.     {
  24.         m_iev      = enum;
  25.         m_nextObj  = new Variant[1];
  26.         m_objCount = new int[1];
  27.     }
  28.  
  29.     private VariantEnumerator(IEnumVariant enum, Variant nextObj) 
  30.     {
  31.         m_iev        = enum;
  32.         m_nextObj    = new Variant[1];
  33.         m_nextObj[0] = nextObj;
  34.         m_objCount   = new int[1];
  35.     }
  36.  
  37.  
  38. /*  ********************************************************************************
  39.     Internal (Private) Variables ***************************************************
  40.     ******************************************************************************** */
  41.  
  42.     private IEnumVariant m_iev;
  43.     // The two members below need to be arrays for the IEnumVariant.Next() call
  44.     private Variant[] m_nextObj;
  45.     private int[] m_objCount;
  46.  
  47.  
  48. /*  ********************************************************************************
  49.     Package/SubClass (Protected) Methods *******************************************
  50.     ******************************************************************************** */
  51.  
  52.     /**
  53.      * This method returns the next Variant in the enumeration.
  54.      */
  55.  
  56.     protected Variant nextVariant() 
  57.         throws NoSuchElementException 
  58.     {
  59.         if (m_nextObj[0] == null) {
  60.             try {
  61.                 m_iev.Next(1, m_nextObj, m_objCount);
  62.                 if (m_objCount[0] != 1) {
  63.                     m_nextObj[0] = null;
  64.                     throw new NoSuchElementException();
  65.                 }
  66.             }
  67.             catch (ComFailException cfe){
  68.                 m_nextObj[0] = null;
  69.                 throw new NoSuchElementException();
  70.             }
  71.         }
  72.         Variant varRetVal = m_nextObj[0];
  73.         m_nextObj[0] = null;
  74.         return varRetVal;
  75.     }
  76.  
  77.  
  78. /*  ********************************************************************************
  79.     External (Public) aspcomp.Enumerator Interface Methods *************************
  80.     ******************************************************************************** */
  81.  
  82.     /**
  83.      * Overrides Enumerator
  84.      */
  85.  
  86.     public void reset() 
  87.     {
  88.         m_nextObj[0] = null;
  89.         m_iev.Reset();
  90.     }
  91.  
  92.  
  93. /*  ********************************************************************************
  94.     External (Public) java.util.Enumeration Interface Methods **********************
  95.     ******************************************************************************** */
  96.  
  97.     /**
  98.      * Test if this enumeration has more elements available.
  99.      * Returns true if there are more elements available, false otherwise.
  100.      */
  101.  
  102.     public boolean hasMoreElements() 
  103.     {
  104.         // If we have already prefetched an element, then there are more elements.
  105.         if (m_nextObj[0] != null)
  106.             return true;
  107.  
  108.         //
  109.         // Otherwise, we'll have to try to get another element.  If we succeed in 
  110.         // getting one, and there is no exception, go ahead and set it up in the 
  111.         // prefetch area, and return true.  In all other (error) cases, return false
  112.         // and make sure the prefetch area is set to null.
  113.         //
  114.         try 
  115.         {
  116.             m_iev.Next(1, m_nextObj, m_objCount);
  117.             if (m_objCount[0] != 1) 
  118.             {
  119.                 m_nextObj[0] = null;
  120.                 return false;
  121.             }
  122.             if (m_nextObj[0] != null)
  123.                 return true;
  124.         }
  125.         catch (ComFailException cfe) 
  126.         {
  127.             m_nextObj = null;
  128.             return false;
  129.         }
  130.         return false;
  131.     }
  132.  
  133.     /**
  134.      * This method returns the next element available in the enumeration.
  135.      */
  136.  
  137.     public Object nextElement() 
  138.         throws NoSuchElementException,
  139.                ClassCastException, 
  140.                AspComponentException
  141.     {
  142.         Variant v = nextVariant();
  143.         return VariantToJava.getObject(v);
  144.     }
  145.  
  146.  
  147. /*  ********************************************************************************
  148.     External (Public) java.lang.Cloneable Interface Methods ************************
  149.     ******************************************************************************** */
  150.  
  151.     /**
  152.      * Overrides Cloneable
  153.      */
  154.  
  155.     public Object clone() 
  156.     {
  157.         return new VariantEnumerator(m_iev.Clone(), m_nextObj[0]);
  158.     }
  159. }
  160.