/* * Copyright (c) Likewise Software. All rights Reserved. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the license, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. You should have received a copy * of the GNU Lesser General Public License along with this program. If * not, see . * * LIKEWISE SOFTWARE MAKES THIS SOFTWARE AVAILABLE UNDER OTHER LICENSING * TERMS AS WELL. IF YOU HAVE ENTERED INTO A SEPARATE LICENSE AGREEMENT * WITH LIKEWISE SOFTWARE, THEN YOU MAY ELECT TO USE THE SOFTWARE UNDER THE * TERMS OF THAT SOFTWARE LICENSE AGREEMENT INSTEAD OF THE TERMS OF THE GNU * LESSER GENERAL PUBLIC LICENSE, NOTWITHSTANDING THE ABOVE NOTICE. IF YOU * HAVE QUESTIONS, OR WISH TO REQUEST A COPY OF THE ALTERNATE LICENSING * TERMS OFFERED BY LIKEWISE SOFTWARE, PLEASE CONTACT LIKEWISE SOFTWARE AT * license@likewisesoftware.com */ /* * Module Name: * * assoc-private.h * * Abstract: * * Association API (private header) * * Authors: Brian Koropoff (bkoropoff@likewisesoftware.com) * */ #ifndef __LWMSG_ASSOC_PRIVATE_H__ #define __LWMSG_ASSOC_PRIVATE_H__ #include #include "session-private.h" #include "context-private.h" #include "call-private.h" /** * @ingroup assoc_impl * @brief Assocation implementation structure * * Describes the concrete implementation of an association. */ typedef struct LWMsgAssocClass { /** * @ingroup assoc_impl * @brief Constructor method * * This method performs initialization of implementation-specific state for a newly-created association. * * @param[in] assoc the association being constructed * @lwmsg_status * @lwmsg_success * @lwmsg_memory * @lwmsg_endstatus */ LWMsgStatus (*construct)(LWMsgAssoc* assoc); /** * @ingroup assoc_impl * @brief Destructor * * This method performs teardown of private state for an association which is being deleted. * * @param[in] assoc the association being deleted */ void (*destruct)(LWMsgAssoc* assoc); /** * @ingroup assoc_impl * @brief Message send method * * This method performs a message send operation. * * @param[in] assoc the association * @param[in] message the message to send * @lwmsg_status * @lwmsg_success * @lwmsg_code{TIMEOUT, operation timed out} * @lwmsg_etc{implementation-specific failure} * @lwmsg_endstatus */ LWMsgStatus (*send_msg)(LWMsgAssoc* assoc, LWMsgMessage* message); /** * @ingroup assoc_impl * @brief Message receive method * * This method performs a message receive operation. * * @param[in] assoc the association * @param[out] message the received message * @lwmsg_status * @lwmsg_success * @lwmsg_code{TIMEOUT, operation timed out} * @lwmsg_etc{implementation-specific failure} * @lwmsg_endstatus */ LWMsgStatus (*recv_msg)(LWMsgAssoc* assoc, LWMsgMessage* message); /** * @ingroup assoc_impl * @brief Association close method * * This method performs logic to shut down an association, e.g. * notifying the remote peer. As opposed to the destructor, this method may * fail or time out without successfully completing. * * @param[in] assoc the association * @lwmsg_status * @lwmsg_success * @lwmsg_code{TIMEOUT, operation timed out} * @lwmsg_etc{implementation-specific failure} * @lwmsg_endstatus */ LWMsgStatus (*close)(LWMsgAssoc* assoc); /** * @ingroup assoc_impl * @brief Association reset method * * This method performs logic to reset an association, e.g. * notifying the remote peer and resetting internal state. * * @param[in] assoc the association * @lwmsg_status * @lwmsg_success * @lwmsg_code{TIMEOUT, operation timed out} * @lwmsg_etc{implementation-specific failure} * @lwmsg_endstatus */ LWMsgStatus (*reset)(LWMsgAssoc* assoc); LWMsgStatus (*finish)(LWMsgAssoc* assoc, LWMsgMessage** message); LWMsgStatus (*set_nonblock)(LWMsgAssoc* assoc, LWMsgBool nonblock); /** * @ingroup assoc_impl * @brief Peer security token access method * * This method retrieves a security information token for the peer. * * @param[in] assoc the association * @param[out] token the security token * @lwmsg_status * @lwmsg_success * @lwmsg_code{INVALID_STATE, the security token is not available in the current state} * @lwmsg_etc{implementation-specific failure} * @lwmsg_endstatus */ LWMsgStatus (*get_peer_security_token)(LWMsgAssoc* assoc, LWMsgSecurityToken** token); /** * @ingroup assoc_impl * @brief Peer session manager ID access method * * This method retrieves the session handle for the association. * * @param[in] assoc the association * @param[out] session the retrieved session handle * @lwmsg_status * @lwmsg_success * @lwmsg_code{INVALID_STATE, the session handle in not available in the current state} * @lwmsg_etc{implementation-specific failure} * @lwmsg_endstatus */ LWMsgStatus (*get_session)(LWMsgAssoc* assoc, LWMsgSession** session); /** * @ingroup assoc_impl * @brief Get association state * * This method returns the current state of the association. * * @param[in] assoc the association * @return the current state */ LWMsgAssocState (*get_state)(LWMsgAssoc* assoc); /** * @ingroup assoc_impl * @brief Set timeout * * This method sets a timeout that should be used for subsequent operations * * @param[in] assoc the association * @param[in] type the type of timeout * @param[in] value the value of the timeout, or NULL for no timeout * @lwmsg_status * @lwmsg_success * @lwmsg_code{UNSUPPORTED, the association does not support the specified timeout type} * @lwmsg_etc{implementation-specific error} * @lwmsg_endstatus */ LWMsgStatus (*set_timeout)( LWMsgAssoc* assoc, LWMsgTimeout type, LWMsgTime* value ); /** * @ingroup assoc_impl * @brief Establish session with peer * * This method causes the association to establish a session with * its peer if it has not already. * * @param[in] assoc the association * @param[in] construct session constructor function * @param[in] destruct session destructor function * @param[in] data user data pointer to pass to the session constructor * @lwmsg_status * @lwmsg_success * @lwmsg_code{TIMEOUT, the operation timed out} * @lwmsg_code{INVALID_STATE, the association cannot establish a session from its current state} * @lwmsg_etc{implementation-specific error} * @lwmsg_endstatus */ LWMsgStatus (*establish)( LWMsgAssoc* assoc, LWMsgSessionConstructFunction construct, LWMsgSessionDestructFunction destruct, void* data ); } LWMsgAssocClass; typedef struct AssocCall { LWMsgCall base; LWMsgBool in_use; } AssocCall; struct LWMsgAssoc { LWMsgContext context; LWMsgAssocClass* aclass; LWMsgProtocol* prot; LWMsgSessionManager* manager; LWMsgSessionConstructFunction construct; LWMsgSessionDestructFunction destruct; void* construct_data; AssocCall call; unsigned manager_is_private:1; }; #define ASSOC_RAISE_ERROR(_assoc_, ...) RAISE_ERROR(&(_assoc_)->context, __VA_ARGS__) /** * @ingroup assoc_impl * @brief Create a new association * * Creates a new association with the specified implementation and protocol. * * @param[in] context an optional context * @param[in] prot the protocol understood by the association * @param[in] aclass the implementation structure for the new association * @param[out] assoc the created association * @lwmsg_status * @lwmsg_success * @lwmsg_memory * @lwmsg_etc{implementation-specific failure} * @lwmsg_endstatus */ LWMsgStatus lwmsg_assoc_new( const LWMsgContext* context, LWMsgProtocol* prot, LWMsgAssocClass* aclass, size_t size, LWMsgAssoc** assoc ); LWMsgStatus lwmsg_assoc_call_init( AssocCall* call ); LWMsgStatus lwmsg_assoc_get_session_manager( LWMsgAssoc* assoc, LWMsgSessionManager** manager ); #endif