Event Models

The use of two methods ClientIfc::EventAvailable and ClientIfc:ProcessEvents by the client program dictates how data is to be delivered. For purposes of description, we will refer to the two delivery methods as the CLI versus the GUI method. The example programs provided include a CLI and a GUI program, each using the event model described here but in a slightly different manner. No matter which method is used, data delivery is through the same methods described in the API (for example, NoticeCB, UserPromptCB, etc.). The difference is essentially one where the client program asks for the latest events, versus an implementation where the events are delivered as they occur.

Different types of programs require different event models. For example, GUI programs will likely require the client program to request events when they are available. Other programs like command line or service implementations could use the model where events are delivered as they occur.

The AnyConnect API detects the model in use based on the client programs implementation of the method ClientIfc::EventAvailable(). If the client program has implemented this virtual method, then it is called when new data is available for the client program. Then, it is up to the client program to schedule an event, the firing of which calls the method ClientIfc::ProcessEvents().

A sample GUI program containing the implementation of this method can be found in the files GUIClientImpl.cpp and MainDialog.cpp. The flow can be traced from the method GUIClientImpl::EventAvailable().

The reason for offering this type of event processing is that GUI programs typically require that GUI objects be managed (created or manipulated) from the program's main thread. The assumption here is that the various callback methods (for example, UserPromptCB) are used to manipulate the GUI program. For example, with the AnyConnect GUI, widgets are created dynamically. This includes the Group selection combo box, as well as the Username and Password input fields. Because of this, the AnyConnect GUI directly uses the event model. This is in contrast to the implementation found in the CLI example CLIClientImpl.cpp. This example makes no use of the EventAvailable method and therefore is a passive user of the event model. In the CLI case, events are delivered to the program as they occur.