//=============================================================================
/**
 *  @file    CCS.idl
 *
 *  $Id: CCS.idl 93677 2011-03-29 12:36:41Z johnnyw $
 *
 *  @author Source code used in TAO has been modified and adapted from the codeprovided in the book
 *  @author "Advanced CORBA Programming with C++" by MichiHenning and Steve Vinoski. Copyright 1999. Addison-Wesley
 *  @author Reading
 *  @author MA.Modified for TAO by Mike Moran <mm4@cs.wustl.edu>
 */
//=============================================================================





#pragma prefix "acme.com"

module CCS {
    typedef unsigned long   AssetType;
    typedef string          ModelType;
    typedef short           TempType;
    typedef string          LocType;

    interface Thermometer {
        readonly attribute ModelType    model;
        readonly attribute AssetType    asset_num;
        readonly attribute TempType     temperature;
                 attribute LocType      location;

        void                            remove();
    };

    interface Thermostat : Thermometer {
        struct BtData {
            TempType    requested;
            TempType    min_permitted;
            TempType    max_permitted;
            string      error_msg;
        };
        exception BadTemp { BtData details; };

        TempType    get_nominal();
        TempType    set_nominal(in TempType new_temp)
                        raises(BadTemp);
    };

    interface Controller {
        exception DuplicateAsset {};

        Thermometer create_thermometer(
                        in AssetType    anum,
                        in LocType      loc
                    ) raises(DuplicateAsset);
        Thermostat  create_thermostat(
                        in AssetType    anum,
                        in LocType      loc,
                        in TempType     temp
                    ) raises(DuplicateAsset, Thermostat::BadTemp);

        typedef sequence<Thermometer>   ThermometerSeq;
        typedef sequence<Thermostat>    ThermostatSeq;

        enum SearchCriterion { ASSET, LOCATION, MODEL };

        union KeyType switch(SearchCriterion) {
        case ASSET:
            AssetType   asset_num;
        case LOCATION:
            LocType     loc;
        case MODEL:
            ModelType   model_desc;
        };

        struct SearchType {
            KeyType     key;
            Thermometer device;
        };
        typedef sequence<SearchType>    SearchSeq;

        struct ErrorDetails {
            Thermostat          tmstat_ref;
            Thermostat::BtData  info;
        };
        typedef sequence<ErrorDetails>  ErrSeq;

        exception EChange {
            ErrSeq  errors;
        };

        ThermometerSeq  list();
        void            find(inout SearchSeq slist);
        void            change(
                            in ThermostatSeq tlist, in short delta
                        ) raises(EChange);

    };
};
