blob: 3cc4806e1d1e41105b3437d4fc7c18cac3850306 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef GUAC_ARGV_H
#define GUAC_ARGV_H
/**
* Convenience functions for processing parameter values that are submitted
* dynamically using "argv" instructions.
*
* @file argv.h
*/
#include "argv-constants.h"
#include "argv-fntypes.h"
#include "stream-types.h"
#include "user-fntypes.h"
/**
* Registers the given callback such that it is automatically invoked when an
* "argv" stream for an argument having the given name is processed using
* guac_argv_received(). The maximum number of arguments that may be registered
* in this way is limited by GUAC_ARGV_MAX_REGISTERED. The maximum length of
* any provided argument name is limited by GUAC_ARGV_MAX_NAME_LENGTH.
*
* @see GUAC_ARGV_MAX_NAME_LENGTH
* @see GUAC_ARGV_MAX_REGISTERED
*
* @see GUAC_ARGV_OPTION_ONCE
* @see GUAC_ARGV_OPTION_ECHO
*
* @param name
* The name of the argument that should be handled by the given callback.
*
* @param callback
* The callback to invoke when the value of an argument having the given
* name has finished being received.
*
* @param data
* Arbitrary data to be passed to the given callback when a value is
* received for the given argument.
*
* @param options
* Bitwise OR of all option flags that should affect processing of this
* argument.
*
* @return
* Zero if the callback was successfully registered, non-zero if the
* maximum number of registered callbacks has already been reached.
*/
int guac_argv_register(const char* name, guac_argv_callback* callback, void* data, int options);
/**
* Waits for receipt of each of the given arguments via guac_argv_received().
* This function will block until either ALL of the given arguments have been
* received via guac_argv_received() or until automatic processing of received
* arguments is stopped with guac_argv_stop().
*
* @param args
* A NULL-terminated array of the names of all arguments that this function
* should wait for.
*
* @return
* Zero if all of the specified arguments were received, non-zero if
* guac_argv_stop() was called before all arguments were received.
*/
int guac_argv_await(const char** args);
/**
* Hands off management of the given guac_stream, automatically processing data
* received over that stream as the value of the argument having the given
* name. The argument must have already been registered with
* guac_argv_register(). The blob_handler and end_handler of the given stream,
* if already set, will be overridden without regard to their current value.
*
* It is the responsibility of the caller to properly send any required "ack"
* instructions to accept or reject the received stream.
*
* @param stream
* The guac_stream that will receive the value of the argument having the
* given name.
*
* @param mimetype
* The mimetype of the data that will be received over the stream.
*
* @param name
* The name of the argument being received.
*
* @return
* Zero if handling of the guac_stream has been successfully handed off,
* non-zero if the provided argument has not yet been registered with
* guac_argv_register().
*/
int guac_argv_received(guac_stream* stream, const char* mimetype, const char* name);
/**
* Stops further automatic processing of received "argv" streams. Any call to
* guac_argv_await() that is currently blocking will return, and any future
* calls to guac_argv_await() will return immediately without blocking.
*/
void guac_argv_stop();
/**
* Convenience implementation of the "argv" instruction handler which
* automatically sends any required "ack" instructions and invokes
* guac_argv_received(). Only arguments that are registered with
* guac_argv_register() will be processed.
*/
guac_user_argv_handler guac_argv_handler;
#endif