ClientUser - I/O for Helix Core Server commands

The ClientUser class is used for all client-side input and output. This class implements methods that return output from the server to the user after a command is invoked, and gather input from the user when needed.

Member functions in this class are used to format and display server output, invoke external programs (such as text editors, diff tools, and merge tools), gather input for processing by the server, and to handle errors.

Customized functionality in a Helix Core Server application is most typically implemented by subclassing ClientUser. To enable such customization, nearly all of ClientUser's methods are virtual. The default implementations are used in the p4 command-line client.

Subscribing to progress notifications

For the P4API to subscribe to notifications, the ClientUser class must be subclassed and several methods implemented:

Copy
class ClientUser {
public:
---snip---
    virtual ClientProgress *CreateProgress( int, P4INT64 );
    virtual ClientProgress *CreateProgress( int );
    virtual int ProgressIndicator();
    virtual int CanParallelProgress() { return 0; }
---snip---
};

ClientUser::ProgressIndicator() must return 1 to subscribe to server-side progress notification.This doesn’t affect client-side notifications.

ClientUser::CanParallelProgress() must return 1 to subscribe to process notifications from child threads during parallel sync/submit/shelve/unshelve. If this feature is enabled, the ClientProgress notifications must be handled in a thread-safe manner because the callbacks will be called from the child threads as well as the main thread. This only applies to P4APIs built with threading support.

ClientUser::CreateProgress( int, P4INT64 ) and ClientUser::CreateProgress( int ) must return the new ClientProgress object.

ClientUser::CreateProgress( int, P4INT64 ) is typically used by client-side file transfer callbacks. The P4INT64 parameter is the total size of the file, which is used to decide if a progress notification is worth the overhead. If not implemented, the default behavior is to skip progress notifications if the size is less that 1024 bytes and call ClientUser::CreateProgress( int ).

The type parameter passed to both of these methods can influence whether the progress notification is of interest or how it should be handled.

These methods should return either NULL or a subclass of ClientProgress.

See also ClientProgress - progress indicators for Helix Core Server commands and ClientSSO - P4LOGINSSO behavior.