/*
 * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

#ifndef _CORBAX_IDL_
#define _CORBAX_IDL_

#pragma prefix "omg.org"

module CORBA {
  /**
   * Enumeration of parameter modes for Parameter.  Possible vaues:
   * <ul>
   *   <li>PARAM_IN - Represents an "in" parameter.</li>
   *   <li>PARAM_OUT - Represents an "out" parameter.</li>
   *   <li>PARAM_INOUT - Represents an "inout" parameter.</li>
   * </ul>
   */
  enum ParameterMode {PARAM_IN, PARAM_OUT, PARAM_INOUT};

  /** An array of Strings */
  typedef sequence <string> StringSeq;

  /** An array of WStrings */
  typedef sequence <wstring> WStringSeq;

  /** A byte array */
  typedef sequence <octet> OctetSeq;

  /** Repository ID, represented as a String */
  typedef string RepositoryId;

  /** 
   * Encapsulates a reason a Policy may be invalid.
   *
   * @see PolicyError
   */
  typedef short PolicyErrorCode;

  /**
   * Thrown to indicate problems with parameter values passed to the
   * <code>ORB.create_policy</code> operation.  
   */
  exception PolicyError { PolicyErrorCode reason; };
};

 
#endif // _CORBAX_IDL_
