}           //    end ProcessCommandLine

        public void Terminate()
        {
            // disconnect all the connected objects
            if (m_aeSubscription.CurrentState != EnumObjectState.DISCONNECTED)
            {
                m_aeSubscription.Disconnect(new ExecutionOptions());
            }

            if (m_aeSession.CurrentState != EnumObjectState.DISCONNECTED)
            {
                m_aeSession.Disconnect(new ExecutionOptions());
            }

            // remove subscription from session
            m_aeSession.RemoveAeSubscription(m_aeSubscription);

            // remove session from application
            GetApplication().RemoveAeSession(m_aeSession);

            // terminate the application
            GetApplication().Terminate();
            m_aeSession        = null;
            m_aeSubscription   = null;
            m_executionOptions = null;
        }           //    end Terminate
        }        //end GetConditionState

        public int InitializeAeObjects()
        {
            int connectResult = (int)EnumResultCode.E_FAIL;

            m_executionOptions = new ExecutionOptions();
            m_executionOptions.ExecutionType    = EnumExecutionType.ASYNCHRONOUS;
            m_executionOptions.ExecutionContext = 0;

            try
            {
                m_aeSession      = new MyAeSession("opcae:///Softing.OPCToolboxDemo_ServerAE.1/{2E565243-B238-11D3-842D-0008C779D775}");
                m_aeSubscription = new MyAeSubscription(m_aeSession);

                connectResult = m_aeSession.Connect(true, false, new ExecutionOptions());

                //define the event areas that will be used to filter events
                //TODO replace the array below with your own areas
                // NOTE: Areas excluded from this filter will not send events/conditions to the AE client.
                //       If no filter is set, all areas will fire events.
                string[] areas = new string[] { "computer.mouse", "computer.clock" };

                //set the previously defined areas for filtering
                m_aeSubscription.FilterAreas = areas;

                //define the event sources that will be used to filter events
                //TODO replace the array below with your own sources
                // NOTE: Sources excluded from this filter will not send events/conditions to the AE client.
                //       If no filter is set, all sources will fire events.
                string[] sources = new string[] { "computer.mouse.right button", "computer.mouse.middle button", "computer.clock.timer", "computer.clock.time slot 1", "computer.clock.time slot 2" };

                //set the previously defined sources for filtering
                m_aeSubscription.FilterSources = sources;

                //define the categories that will be used to filter events ("time tick" category is used)
                //TODO replace the array below with your own category ids
                // NOTE: Category IDs excluded from this filter will not send events/conditions to the AE client.
                //       If no filter is set, all categories will fire events.
                uint[] categoryIds = new uint[] { 1, 2, 3 };

                //set the previously defines categoryIds for filtering
                m_aeSubscription.FilterCategories = categoryIds;

                // NOTE: Event/conditions property IDs not included in this filter will not be displayed.
                //       If no property filter is set, NO PROPERTIES WILL BE SENT WITH EACH EVENT/CONDITION (except for standard AE event/condition properties).
                AeReturnedAttributes[] returnedAttributes = new AeReturnedAttributes[3];

                // category ID: 1 (time tick)
                // attribute IDs: 1 (second)
                uint[] attributeIds = new uint[1];
                attributeIds[0]       = 1;
                returnedAttributes[0] = new AeReturnedAttributes();
                returnedAttributes[0].AttributeIds = attributeIds;
                returnedAttributes[0].CategoryId   = 1;

                // category ID: 2 (time slot)
                // attribute IDs: 2 (second), 3 (start second), 4 (end second)
                attributeIds          = new uint[3];
                attributeIds[0]       = 2;
                attributeIds[1]       = 3;
                attributeIds[2]       = 4;
                returnedAttributes[1] = new AeReturnedAttributes();
                returnedAttributes[1].AttributeIds = attributeIds;
                returnedAttributes[1].CategoryId   = 2;

                // category ID: 3 (mouse click)
                // attribute IDs: 5 (x position), 6 (y position)
                attributeIds          = new uint[2];
                attributeIds[0]       = 5;
                attributeIds[1]       = 6;
                returnedAttributes[2] = new AeReturnedAttributes();
                returnedAttributes[2].AttributeIds = attributeIds;
                returnedAttributes[2].CategoryId   = 3;

                m_aeSubscription.ReturnedAttributes = returnedAttributes;
            }
            catch (Exception exc)
            {
                GetApplication().Trace(
                    EnumTraceLevel.ERR,
                    EnumTraceGroup.USER,
                    "OpcClient::InitializeAeObjects",
                    exc.ToString());
            }               //    end try...catch

            return(connectResult);
        }           //    end InitializeAeObjects