850 lines
30 KiB
C
850 lines
30 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they 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 these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/* $XConsortium: ActionP.h /main/3 1995/10/26 14:59:56 rswiston $ */
|
|
/************************************<+>*************************************
|
|
****************************************************************************
|
|
**
|
|
** File: ActionP.h
|
|
**
|
|
** Project: DT
|
|
**
|
|
** Description: Private include file for the Action Library.
|
|
**
|
|
**
|
|
** (c) Copyright 1993, 1994 Hewlett-Packard Company
|
|
** (c) Copyright 1993, 1994 International Business Machines Corp.
|
|
** (c) Copyright 1993, 1994 Sun Microsystems, Inc.
|
|
** (c) Copyright 1993, 1994 Novell, Inc.
|
|
****************************************************************************
|
|
************************************<+>*************************************/
|
|
|
|
#ifndef _ActionP_h
|
|
#define _ActionP_h
|
|
|
|
#include <Dt/DtP.h>
|
|
#include <Dt/DbReader.h>
|
|
#include <Dt/ActionDb.h>
|
|
#include <Dt/Action.h>
|
|
#include <Tt/tttk.h>
|
|
#include <Dt/DtShmDb.h>
|
|
/*
|
|
* Environment Variable Names
|
|
*/
|
|
#define ENV_SESSION_SVR "SESSION_SVR"
|
|
/*
|
|
* Define maximum static buffer size for action code.
|
|
*/
|
|
#define _DtAct_MAX_BUF_SIZE 1024
|
|
|
|
/*
|
|
* Data-type field which contains the template for producing filenames
|
|
* of a given type.
|
|
*/
|
|
#define _DtActNAME_TEMPLATE "NAME_TEMPLATE"
|
|
#define _DtActIS_EXECUTABLE "IS_EXECUTABLE"
|
|
|
|
/******************************************************************************
|
|
*
|
|
* MASK LAYOUT:
|
|
*
|
|
* The same layout is used for all the masks (defined herein);, independent of
|
|
* the data structure in which they are defined. That is, all bit fields for
|
|
* all masks are non-overlapping. In general, the mask in any given structure
|
|
* should ONLY contain information in the field appropriate for that structure.
|
|
*
|
|
* The action bit mask is broken into the following fields
|
|
*
|
|
* --------------------------------------------------------------------------
|
|
* |act'n |arg |arg |arg | win |args| request | object |treat| not |
|
|
* |type |class|count|typ | type | | status | status | as | |
|
|
* |bits |bits |bits |bit | bits |used| bits | bits |file |used |
|
|
* --------------------------------------------------------------------------
|
|
* 0 - 4,5 - 8,9 - 12, 13 ,14 - 17,18-19,20 ------- 22,23 ---- 28, 29 ,30-31
|
|
* | | | | | |
|
|
* |<-- action mask -->| |<- request->|<- obj. ->|< - >|
|
|
* mask data |
|
|
* mask msgCcomp.
|
|
* mask
|
|
******************************************************************************/
|
|
|
|
/*
|
|
* generic bit manipulation macros
|
|
*/
|
|
#define SET_ANY_BITS(mask,bits) ( mask |= (bits) )
|
|
#define RESET_ANY_BITS(mask,bits) ( mask &= ~(bits) )
|
|
#define TST_ANY_BITS(mask,bits) ( mask & (bits) )
|
|
|
|
/*
|
|
* Action type bits
|
|
*/
|
|
#define _DtAct_CMD_BIT (1<<0)
|
|
#define _DtAct_MAP_BIT (1<<1)
|
|
#define _DtAct_TT_MSG_BIT (1<<2)
|
|
|
|
#ifdef _DT_ALLOW_DT_MSGS
|
|
#define _DtAct_DT_REQ_MSG_BIT (1<<3)
|
|
#define _DtAct_DT_NTFY_MSG_BIT (1<<4)
|
|
#endif /* _DT_ALLOW_DT_MSGS */
|
|
|
|
/*
|
|
* Action structure mask bits
|
|
*/
|
|
#define _DtAct_ARG_CLASS_FILE_BIT (1<<5)
|
|
#define _DtAct_ARG_CLASS_STRING_BIT (1<<6)
|
|
#define _DtAct_ARG_CLASS_BUFFER_BIT (1<<7)
|
|
#define _DtAct_ARG_CLASS_WILD_BIT (1<<8)
|
|
|
|
#define _DtAct_ARG_COUNT_LT_BIT (1<<9)
|
|
#define _DtAct_ARG_COUNT_GT_BIT (1<<10)
|
|
#define _DtAct_ARG_COUNT_EQ_BIT (1<<11)
|
|
#define _DtAct_ARG_COUNT_WILD_BIT (1<<12)
|
|
|
|
#define _DtAct_ARG_TYPE_WILD_BIT (1<<13)
|
|
|
|
#define _DtAct_NO_STDIO_BIT (1<<14)
|
|
#define _DtAct_TERMINAL_BIT (1<<15)
|
|
#define _DtAct_PERM_TERM_BIT (1<<16)
|
|
|
|
/*
|
|
* Defines which reflect the actual number
|
|
* of %ARGn% instances found in the action definition
|
|
* NOTE: Is this JUST in the EXEC_STRING? or the total number of %ARGn%'s
|
|
* referenced in all parssed definitions?
|
|
*
|
|
*/
|
|
#define _DtAct_SINGLE_ARG_BIT (1<<18)
|
|
#define _DtAct_MULTI_ARG_BIT (1<<19)
|
|
|
|
|
|
#ifdef _DT_ALLOW_DT_MSGS
|
|
#define _DtAct_ACTION_TYPE_BITS ( _DtAct_CMD_BIT \
|
|
| _DtAct_MAP_BIT \
|
|
| _DtAct_DT_NTFY_MSG_BIT \
|
|
| _DtAct_DT_REQ_MSG_BIT \
|
|
| _DtAct_TT_MSG_BIT )
|
|
#else
|
|
#define _DtAct_ACTION_TYPE_BITS ( _DtAct_CMD_BIT \
|
|
| _DtAct_MAP_BIT \
|
|
| _DtAct_TT_MSG_BIT )
|
|
#endif /* _DT_ALLOW_DT_MSGS */
|
|
#define _DtAct_ARG_CLASS_BITS ( _DtAct_ARG_CLASS_FILE_BIT \
|
|
| _DtAct_ARG_CLASS_STRING_BIT\
|
|
| _DtAct_ARG_CLASS_BUFFER_BIT \
|
|
| _DtAct_ARG_CLASS_WILD_BIT )
|
|
#define _DtAct_ARG_TYPE_BITS ( _DtAct_ARG_TYPE_WILD_BIT )
|
|
#define _DtAct_ARG_COUNT_BITS ( _DtAct_ARG_COUNT_LT_BIT \
|
|
| _DtAct_ARG_COUNT_GT_BIT \
|
|
| _DtAct_ARG_COUNT_EQ_BIT \
|
|
| _DtAct_ARG_COUNT_WILD_BIT )
|
|
#define _DtAct_WINTYPE_BITS ( _DtAct_NO_STDIO_BIT \
|
|
| _DtAct_TERMINAL_BIT \
|
|
| _DtAct_PERM_TERM_BIT )
|
|
#define _DtAct_ARGS_USED_BITS ( _DtAct_SINGLE_ARG \
|
|
| _DtAct_MULTI_ARG )
|
|
|
|
#define _DtAct_ACTION_BITS ( _DtAct_ACTION_TYPE_BITS \
|
|
| _DtAct_ARG_CLASS_BITS \
|
|
| _DtAct_ARG_TYPE_BITS \
|
|
| _DtAct_ARG_COUNT_BITS \
|
|
| _DtAct_WINTYPE_BITS \
|
|
| _DtAct_ARGS_USED_BITS )
|
|
|
|
#define IS_CMD(mask) ( mask & _DtAct_CMD_BIT )
|
|
#define IS_MAP(mask) ( mask & _DtAct_MAP_BIT )
|
|
#define IS_TT_MSG(mask) ( mask & _DtAct_TT_MSG_BIT )
|
|
|
|
#ifdef _DT_ALLOW_DT_MSGS
|
|
#define IS_DT_REQ_MSG(mask) ( mask & _DtAct_DT_REQ_MSG_BIT )
|
|
#define IS_DT_NOTIFY_MSG(mask) ( mask & _DtAct_DT_NTFY_MSG_BIT )
|
|
#endif /* _DT_ALLOW_DT_MSGS */
|
|
|
|
#define SET_CMD_ACTION(mask) ( mask |= _DtAct_CMD_BIT )
|
|
#define SET_MAP_ACTION(mask) ( mask |= _DtAct_MAP_BIT )
|
|
#define SET_TT_MSG(mask) ( mask |= _DtAct_TT_MSG_BIT )
|
|
#ifdef _DT_ALLOW_DT_MSGS
|
|
#define SET_DT_REQUEST_MSG(mask) ( mask |= _DtAct_DT_REQ_MSG_BIT)
|
|
#define SET_DT_NOTIFY_MSG(mask) ( mask |= _DtAct_DT_NTFY_MSG_BIT)
|
|
#endif /* _DT_ALLOW_DT_MSGS */
|
|
|
|
#define RESET_CMD_ACTION(mask) ( mask &= ~(_DtAct_CMD_BIT))
|
|
#define RESET_MAP_ACTION(mask) ( mask &= ~(_DtAct_MAP_BIT))
|
|
#define RESET_TT_MSG(mask) ( mask &= ~(_DtAct_TT_MSG_BIT))
|
|
#ifdef _DT_ALLOW_DT_MSGS
|
|
#define RESET_DT_REQ_MSG(mask) ( mask &= ~(_DtAct_DT_REQ_MSG_BIT))
|
|
#define RESET_DT_NOTIFY_MSG(mask) ( mask &= ~(_DtAct_DT_NTFY_MSG_BIT))
|
|
#endif /* _DT_ALLOW_DT_MSGS */
|
|
|
|
#define IS_NO_STDIO(mask) ( mask & _DtAct_NO_STDIO_BIT )
|
|
#define IS_TERMINAL(mask) ( mask & _DtAct_TERMINAL_BIT )
|
|
#define IS_PERM_TERM(mask) ( mask & _DtAct_PERM_TERM_BIT)
|
|
|
|
#define SET_NO_STDIO(mask) ( mask |= _DtAct_NO_STDIO_BIT )
|
|
#define SET_TERMINAL(mask) ( mask |= _DtAct_TERMINAL_BIT )
|
|
#define SET_PERM_TERM(mask) ( mask |= _DtAct_PERM_TERM_BIT )
|
|
|
|
#define RESET_NO_STDIO(mask) ( mask &= ~(_DtAct_NO_STDIO_BIT ))
|
|
#define RESET_TERMINAL(mask) ( mask &= ~(_DtAct_TERMINAL_BIT ))
|
|
#define RESET_PERM_TERM(mask) ( mask &= ~(_DtAct_PERM_TERM_BIT ))
|
|
|
|
#define IS_ARG_CLASS_FILE(mask) ( mask & _DtAct_ARG_CLASS_FILE_BIT )
|
|
#define IS_ARG_CLASS_STRING(mask) ( mask & _DtAct_ARG_CLASS_STRING_BIT )
|
|
#define IS_ARG_CLASS_BUFFER(mask) ( mask & _DtAct_ARG_CLASS_BUFFER_BIT )
|
|
#define IS_ARG_CLASS_WILD(mask) ( mask & _DtAct_ARG_CLASS_WILD_BIT )
|
|
|
|
#define SET_ARG_CLASS_FILE(mask) ( mask |= _DtAct_ARG_CLASS_FILE_BIT )
|
|
#define SET_ARG_CLASS_STRING(mask) ( mask |= _DtAct_ARG_CLASS_STRING_BIT)
|
|
#define SET_ARG_CLASS_BUFFER(mask) ( mask |= _DtAct_ARG_CLASS_BUFFER_BIT)
|
|
#define SET_ARG_CLASS_WILD(mask) ( mask |= _DtAct_ARG_CLASS_WILD_BIT )
|
|
|
|
#define RESET_ARG_CLASS_FILE(mask) (mask &= ~(_DtAct_ARG_CLASS_FILE_BIT))
|
|
#define RESET_ARG_CLASS_STRING(mask) (mask &= ~(_DtAct_ARG_CLASS_STRING_BIT))
|
|
#define RESET_ARG_CLASS_BUFFER(mask) (mask &= ~(_DtAct_ARG_CLASS_BUFFER_BIT))
|
|
#define RESET_ARG_CLASS_WILD(mask) (mask &= ~(_DtAct_ARG_CLASS_WILD_BIT))
|
|
|
|
|
|
#define IS_ARG_TYPE_WILD(mask) ( mask & _DtAct_ARG_TYPE_WILD_BIT )
|
|
|
|
#define SET_ARG_TYPE_WILD(mask) ( mask |= _DtAct_ARG_TYPE_WILD_BIT )
|
|
|
|
#define RESET_ARG_TYPE_WILD(mask) ( mask &= ~(_DtAct_ARG_TYPE_WILD_BIT))
|
|
|
|
#define IS_ARG_COUNT_GT(mask) ( mask & _DtAct_ARG_COUNT_GT_BIT )
|
|
#define IS_ARG_COUNT_LT(mask) ( mask & _DtAct_ARG_COUNT_LT_BIT )
|
|
#define IS_ARG_COUNT_EQ(mask) ( mask & _DtAct_ARG_COUNT_EQ_BIT )
|
|
#define IS_ARG_COUNT_WILD(mask) ( mask & _DtAct_ARG_COUNT_WILD_BIT )
|
|
|
|
#define SET_ARG_COUNT_GT(mask) ( mask |= _DtAct_ARG_COUNT_GT_BIT )
|
|
#define SET_ARG_COUNT_LT(mask) ( mask |= _DtAct_ARG_COUNT_LT_BIT )
|
|
#define SET_ARG_COUNT_EQ(mask) ( mask |= _DtAct_ARG_COUNT_EQ_BIT )
|
|
#define SET_ARG_COUNT_WILD(mask) ( mask |= _DtAct_ARG_COUNT_WILD_BIT )
|
|
|
|
#define RESET_ARG_COUNT_GT(mask) ( mask &= ~(_DtAct_ARG_COUNT_GT_BIT ))
|
|
#define RESET_ARG_COUNT_LT(mask) ( mask &= ~(_DtAct_ARG_COUNT_LT_BIT ))
|
|
#define RESET_ARG_COUNT_EQ(mask) ( mask &= ~(_DtAct_ARG_COUNT_EQ_BIT ))
|
|
#define RESET_ARG_COUNT_WILD(mask) ( mask &= ~(_DtAct_ARG_COUNT_WILD_BIT ))
|
|
|
|
/*
|
|
* Use of the logical "NOT" operator(!) instead of the bitwise negation
|
|
* operator(~) is intentional in IS_ARG_NONE_FOUND.
|
|
*/
|
|
#define IS_ARG_NONE_FOUND(mask) !( mask & ( _DtAct_SINGLE_ARG_BIT \
|
|
| _DtAct_MULTI_ARG_BIT ))
|
|
#define IS_ARG_SINGLE_ARG(mask) ( mask & _DtAct_SINGLE_ARG_BIT )
|
|
#define IS_ARG_MULTI_ARG(mask) ( mask & _DtAct_MULTI_ARG_BIT )
|
|
|
|
#define SET_ARG_NONE_FOUND(mask) ( mask &= ~( _DtAct_SINGLE_ARG_BIT \
|
|
| _DtAct_MULTI_ARG_BIT ))
|
|
#define SET_ARG_SINGLE_ARG(mask) ((mask |= _DtAct_SINGLE_ARG_BIT), \
|
|
( mask &= ~(_DtAct_MULTI_ARG_BIT)))
|
|
#define SET_ARG_MULTI_ARG(mask) ((mask |= _DtAct_MULTI_ARG_BIT), \
|
|
( mask &= ~(_DtAct_SINGLE_ARG_BIT)))
|
|
|
|
#define RESET_ARG_SINGLE_ARG(mask) ( mask &= ~(_DtAct_SINGLE_ARG_BIT))
|
|
#define RESET_ARG_MULTI_ARG(mask) ( mask &= ~(_DtAct_MULTI_ARG_BIT))
|
|
|
|
/*
|
|
* ActionRequest structure mask bits
|
|
*/
|
|
|
|
#define _DtAct_REPROCESSING_BIT (1<<20)
|
|
#define _DtAct_TOO_MANY_MAPS_BIT (1<<21)
|
|
#define _DtAct_CLONED_REQUEST_BIT (1<<22)
|
|
|
|
#define _DtAct_ACTION_REQUEST_BITS ( _DtAct_REPROCESSING_BIT \
|
|
| _DtAct_TOO_MANY_MAPS_BIT \
|
|
| _DtAct_CLONED_REQUEST_BIT )
|
|
|
|
#define IS_REPROCESSING(mask) ( mask & _DtAct_REPROCESSING_BIT )
|
|
#define IS_TOO_MANY_MAPS(mask) ( mask & _DtAct_TOO_MANY_MAPS_BIT )
|
|
#define IS_CLONED_REQUEST(mask) ( mask & _DtAct_CLONED_REQUEST_BIT )
|
|
|
|
#define SET_REPROCESSING(mask) ( mask |= _DtAct_REPROCESSING_BIT )
|
|
#define SET_TOO_MANY_MAPS(mask) ( mask |= _DtAct_TOO_MANY_MAPS_BIT )
|
|
#define SET_CLONED_REQUEST(mask) ( mask |= _DtAct_CLONED_REQUEST_BIT )
|
|
|
|
#define RESET_REPROCESSING(mask) ( mask &= ~(_DtAct_REPROCESSING_BIT))
|
|
#define RESET_TOO_MANY_MAPS(mask) ( mask &= ~(_DtAct_TOO_MANY_MAPS_BIT))
|
|
#define RESET_CLONED_REQUEST(mask) ( mask &= ~(_DtAct_CLONED_REQUEST_BIT))
|
|
|
|
|
|
/*
|
|
* ObjectData structure mask bits
|
|
*
|
|
*/
|
|
|
|
#define _DtAct_WRITE_OBJ_BIT (1<<23)
|
|
#define _DtAct_FILE_OBJ_BIT (1<<24)
|
|
#define _DtAct_BUFFER_OBJ_BIT (1<<25)
|
|
#define _DtAct_STRING_OBJ_BIT (1<<26)
|
|
#define _DtAct_DIR_OBJ_BIT (1<<27)
|
|
#define _DtAct_UNKNOWN_IF_DIR_BIT (1<<28)
|
|
|
|
#define _DtAct_OBJ_DATA_BITS ( _DtAct_WRITE_OBJ_BIT \
|
|
| _DtAct_FILE_OBJ_BIT \
|
|
| _DtAct_DIR_OBJ_BIT \
|
|
| _DtAct_BUFFER_OBJ_BIT \
|
|
| _DtAct_STRING_OBJ_BIT \
|
|
| _DtAct_UNKNOWN_IF_DIR_BIT )
|
|
|
|
#define IS_WRITE_OBJ(mask) ( mask & _DtAct_WRITE_OBJ_BIT )
|
|
#define IS_FILE_OBJ(mask) ( mask & _DtAct_FILE_OBJ_BIT )
|
|
#define IS_BUFFER_OBJ(mask) ( mask & _DtAct_BUFFER_OBJ_BIT )
|
|
#define IS_STRING_OBJ(mask) ( mask & _DtAct_STRING_OBJ_BIT )
|
|
#define IS_UNKNOWN_IF_DIR(mask) ( mask & _DtAct_UNKNOWN_IF_DIR_BIT )
|
|
#define IS_DIR_OBJ(mask) ( mask & \
|
|
( _DtAct_UNKNOWN_IF_DIR_BIT \
|
|
| _DtAct_DIR_OBJ_BIT ) \
|
|
== _DtAct_DIR_OBJ_BIT)
|
|
|
|
#define SET_WRITE_OBJ(mask) ( mask |= _DtAct_WRITE_OBJ_BIT )
|
|
#define SET_FILE_OBJ(mask) ( mask |= _DtAct_FILE_OBJ_BIT )
|
|
#define SET_BUFFER_OBJ(mask) ( mask |= _DtAct_BUFFER_OBJ_BIT )
|
|
#define SET_STRING_OBJ(mask) ( mask |= _DtAct_STRING_OBJ_BIT )
|
|
#define SET_DIR_OBJ(mask) ( mask |= _DtAct_DIR_OBJ_BIT )
|
|
#define SET_UNKNOWN_IF_DIR(mask) ( mask |= _DtAct_UNKNOWN_IF_DIR_BIT)
|
|
|
|
#define RESET_WRITE_OBJ(mask) ( mask &= ~(_DtAct_WRITE_OBJ_BIT))
|
|
#define RESET_FILE_OBJ(mask) ( mask &= ~(_DtAct_FILE_OBJ_BIT))
|
|
#define RESET_BUFFER_OBJ(mask) ( mask &= ~(_DtAct_BUFFER_OBJ_BIT))
|
|
#define RESET_STRING_OBJ(mask) ( mask &= ~(_DtAct_STRING_OBJ_BIT))
|
|
#define RESET_DIR_OBJ(mask) ( mask &= ~(_DtAct_DIR_OBJ_BIT))
|
|
#define RESET_UNKNOWN_IF_DIR(mask) ( mask &= ~(_DtAct_UNKNOWN_IF_DIR_BIT))
|
|
|
|
|
|
/*
|
|
* MsgComponent structure mask bits (shared with Object Data?)
|
|
*/
|
|
|
|
#define _DtAct_TREAT_AS_FILE_BIT (1<<29)
|
|
|
|
#define _DtAct_MSG_COMP_BITS ( _DtAct_TREAT_AS_FILE_BIT )
|
|
|
|
#define IS_TREAT_AS_FILE(mask) ( mask & _DtAct_TREAT_AS_FILE_BIT )
|
|
#define SET_TREAT_AS_FILE(mask) ( mask |= _DtAct_TREAT_AS_FILE_BIT)
|
|
#define RESET_TREAT_AS_FILE(mask) ( mask &= ~(_DtAct_TREAT_AS_FILE_BIT))
|
|
|
|
|
|
/* Keyword defines */
|
|
|
|
#define NO_KEYWORD -1
|
|
#define LOCAL_HOST 0
|
|
#define DATA_HOST 1
|
|
#define DATABASE_HOST 2
|
|
#define ARG 3
|
|
#define DISPLAY_HOST 4
|
|
#define LABEL 5
|
|
#define SESSION_HOST 6
|
|
|
|
/* Special argNum values */
|
|
|
|
#define NO_ARG -1
|
|
#define ALL_ARGS 0
|
|
|
|
/*
|
|
* ToolTalk base representation type ( tt_argn_rep_type ) values
|
|
*/
|
|
#define DtACT_TT_REP_UNDEFINED 0
|
|
#define DtACT_TT_REP_INT 1
|
|
#define DtACT_TT_REP_BUFFER 2
|
|
#define DtACT_TT_REP_STRING 3
|
|
|
|
/*
|
|
* Resource name and class for the EXEC-HOST resource.
|
|
*/
|
|
#define DtEXEC_HOSTS_NAME "executionHosts"
|
|
#define DtEXEC_HOSTS_CLASS "ExecutionHosts"
|
|
#define DtEXEC_HOSTS_DEFAULT _DtACT_EXEC_HOST_DFLT
|
|
|
|
/* Flags to force special processing of filenames */
|
|
#define _DTAct_TT_VTYPE 1 << 0
|
|
#define _DTAct_TT_ARG 1 << 1
|
|
|
|
/* Structure used to hold the components of a message */
|
|
|
|
typedef struct {
|
|
char *precedingText;
|
|
char *prompt;
|
|
int keyword;
|
|
int argNum;
|
|
unsigned long mask; /* replaces isFile, isBuffer, isString boolean */
|
|
} MsgComponent;
|
|
|
|
|
|
typedef struct {
|
|
MsgComponent *parsedMessage;
|
|
int numMsgParts;
|
|
char *compiledMessage;
|
|
int msgLen;
|
|
} parsedMsg;
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Structs used during the invocation of an action. Once DtActionInvoke()
|
|
* exits, these structs are generally freed.
|
|
*
|
|
*****************************************************************************/
|
|
typedef struct {
|
|
/*int winMask; ---> moved into the action mask*/
|
|
parsedMsg execString;
|
|
parsedMsg termOpts;
|
|
char *contextDir;
|
|
char *contextHost;
|
|
parsedMsg execHosts;
|
|
char **execHostArray;
|
|
int execHostCount;
|
|
} cmdAttr;
|
|
|
|
typedef struct {
|
|
DtShmBoson map_action;
|
|
} mapAttr;
|
|
|
|
typedef struct {
|
|
int tt_class;
|
|
int tt_scope;
|
|
parsedMsg tt_op;
|
|
parsedMsg tt_file; /* must be a single file name */
|
|
int *tt_argn_mode;
|
|
int mode_count;
|
|
parsedMsg *tt_argn_vtype;
|
|
int vtype_count;
|
|
parsedMsg *tt_argn_value;
|
|
int value_count;
|
|
int *tt_argn_rep_type; /* INT, STRING, BUFFER or UNDEFINED */
|
|
int rep_type_count;
|
|
} tt_msgAttr;
|
|
|
|
#ifdef _DT_ALLOW_DT_MSGS
|
|
typedef struct {
|
|
parsedMsg service; /* ICCCM service name */
|
|
parsedMsg request; /* request name string */
|
|
parsedMsg *argn_value;
|
|
int value_count;
|
|
|
|
} dt_reqAttr;
|
|
|
|
typedef struct {
|
|
parsedMsg ngroup; /* ICCCM notification group */
|
|
parsedMsg notify; /* notification to be sent */
|
|
parsedMsg *argn_value;
|
|
int value_count;
|
|
} dt_notifyAttr;
|
|
#endif /* _DT_ALLOW_DT_MSGS */
|
|
|
|
|
|
typedef struct {
|
|
DtShmBoson action; /* Might just use a char * here? */
|
|
DtDbPathId file_name_id; /* id of file wherein the action is defined */
|
|
char *label; /* localizable action label string */
|
|
char *description;
|
|
DtShmBoson *arg_types;
|
|
int type_count;
|
|
int arg_count; /* Number of arguments accepted by the action */
|
|
unsigned long mask; /* action mask -- class/type/arg info */
|
|
union { /* attributes for the different action kinds */
|
|
cmdAttr cmd;
|
|
mapAttr map;
|
|
tt_msgAttr tt_msg;
|
|
#ifdef _DT_ALLOW_DT_MSGS
|
|
dt_reqAttr dt_req;
|
|
dt_notifyAttr dt_notify;
|
|
#endif /* _DT_ALLOW_DT_MSGS */
|
|
} u;
|
|
} Action, *ActionPtr; /* new action structure and pointer */
|
|
|
|
|
|
/* Structure used to hold each of the object components */
|
|
|
|
typedef struct {
|
|
char * origFilename;
|
|
char * baseFilename;
|
|
char * origHostname;
|
|
int hostIndex;
|
|
int dirIndex;
|
|
void * bp; /* pointer to original buffer -- tmp files only */
|
|
int sizebp; /* size of original buf -- for tmp files only */
|
|
} fileAttr;
|
|
|
|
typedef struct {
|
|
char * string;
|
|
} stringAttr;
|
|
|
|
typedef struct {
|
|
int size;
|
|
void *bp;
|
|
} bufferAttr;
|
|
|
|
|
|
typedef struct {
|
|
DtShmBoson type;
|
|
unsigned long mask;
|
|
union {
|
|
fileAttr file;
|
|
stringAttr string;
|
|
bufferAttr buffer;
|
|
} u;
|
|
} ObjectData;
|
|
|
|
|
|
/*
|
|
* Structure attached to the button callbacks in the
|
|
* dialog used to collect missing parameters.
|
|
*
|
|
*/
|
|
|
|
typedef struct {
|
|
char *actionName;
|
|
int objOffset;
|
|
int objsUsed;
|
|
int numObjects;
|
|
ObjectData *objects;
|
|
int numPromptInputs;
|
|
char **promptInputs;
|
|
int numHostNames;
|
|
char **hostNames;
|
|
int numDirNames;
|
|
char **dirNames;
|
|
char *termOpts;
|
|
char *cwdHost;
|
|
char *cwdDir;
|
|
ActionPtr clonedAction;
|
|
unsigned long mask;
|
|
char *badHostList;
|
|
char *currentHost;
|
|
int hostIndex;
|
|
char *execHost;
|
|
DtActionInvocationID invocId;
|
|
unsigned long childId;
|
|
} ActionRequest;
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Structs used to maintain information on invoked actions until they
|
|
* exit. A few select elements of the ActionRequest and Action structs
|
|
* will be copied into these strcuts.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/******************************************************************************
|
|
******************************************************************************
|
|
**
|
|
** Major data-structure diagram for the DtAction invocation layer:
|
|
**
|
|
** _DtActInvRec <=== _DtActInvRecArray[ actInvRecArraySize ]
|
|
** ------------------
|
|
** | info per |
|
|
** | DtActionInvoke |
|
|
** |----------------|
|
|
** | numChildren |
|
|
** |----------------|
|
|
** | childRecs[] | ===> _DtActChildRec
|
|
** ------------------ ------------------
|
|
** | info per |
|
|
** | child request |
|
|
** |----------------|
|
|
** | *request | ===> ActionRequest
|
|
** ------------------ ------------------
|
|
** | info on users |
|
|
** | action request |
|
|
** |----------------|
|
|
** Action <=== | *clonedAction |
|
|
** ------------------ ------------------
|
|
** |info on matching|
|
|
** | actionDB entry |
|
|
** |----------------|
|
|
** | cmd/map/tt/dt |
|
|
** | attributes of |
|
|
** | resulting msg |
|
|
** ------------------
|
|
**
|
|
** "ActionRequest" and "Action" were present in VUE 3.0, and have a
|
|
** scratch-pad like function within DtActionInvoke() to get actions
|
|
** started. They are not good long-term retainers of information.
|
|
** Action and ActionRequest are in fact freed when DtActionInvoke()
|
|
** exits.
|
|
**
|
|
** "_DtActInvRec" and "_DtActChildRec" have been introduced to retain
|
|
** information for the entire life of the actions. Some of the
|
|
** information from ActionRequest and Action will be copied (mirrored)
|
|
** up to these structures.
|
|
**
|
|
******************************************************************************
|
|
*****************************************************************************/
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Child Status Macro Definitions -- These values are used in
|
|
* the status word of the _DtActChildRec child record.
|
|
*
|
|
* ****** IMPORTANT NOTE *** IMPORTANT NOTE *** IMPORTANT NOTE ******
|
|
*
|
|
* The _DtActCHILD_ macros are also used in cde1/dtexec/Main.c
|
|
* in the _DtActDtexecDone(Request) message, so in effect they
|
|
* are also protocol constants that should *never* be changed.
|
|
* If changed, libDtSvc and dtexec may mis-communicate status.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#define _DtActCHILD_UNKNOWN (1<<0) /* 1 - child status unknown */
|
|
#define _DtActCHILD_PENDING_START (1<<1) /* 2 - child start pending */
|
|
#define _DtActCHILD_ALIVE_UNKNOWN (1<<2) /* 4 - child alive but unknown*/
|
|
#define _DtActCHILD_ALIVE (1<<3) /* 8 - child alive and well */
|
|
#define _DtActCHILD_DONE (1<<4) /* 16 - child done */
|
|
#define _DtActCHILD_FAILED (1<<5) /* 32 - child failed */
|
|
#define _DtActCHILD_CANCELED (1<<6) /* 64 - child canceled */
|
|
|
|
#define _DtActCHILD_DONE_BITS ( (_DtActCHILD_DONE) | \
|
|
(_DtActCHILD_FAILED) | \
|
|
(_DtActCHILD_CANCELED) )
|
|
|
|
/*** IMPORTANT NOTE ABOVE *** IMPORTANT NOTE ABOVE *** IMPORTANT NOTE ABOVE ***/
|
|
|
|
|
|
#define ARE_CHILDREN_DONE(mask) ( (mask) & _DtActCHILD_DONE_BITS )
|
|
|
|
#define IS_CHILD_UNKNOWN(mask) ( (mask) == _DtActCHILD_UNKNOWN )
|
|
#define IS_CHILD_PENDING_START(mask) ( (mask) & _DtActCHILD_PENDING_START )
|
|
#define IS_CHILD_DONE(mask) ( (mask) & _DtActCHILD_DONE)
|
|
#define IS_CHILD_FAILED(mask) ( (mask) & _DtActCHILD_FAILED)
|
|
#define IS_CHILD_CANCELED(mask) ( (mask) & _DtActCHILD_CANCELED)
|
|
#define IS_CHILD_ALIVE(mask) ( (mask) & _DtActCHILD_ALIVE)
|
|
#define IS_CHILD_ALIVE_UNKOWN(mask) ( (mask) & _DtActCHILD_ALIVE_UNKNOWN)
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Information per child of DtActionInvoke()
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/*
|
|
* Structure useed to map returnable arguments to the child argument list.
|
|
*/
|
|
|
|
typedef struct {
|
|
int argN; /* Nth returned value (0 based for tooltalk) */
|
|
int argIdx; /* Nth child argument */
|
|
} _DtActArgMap;
|
|
|
|
typedef struct {
|
|
unsigned long childId; /* serial # with DtActInvId */
|
|
unsigned long childState; /* child state */
|
|
|
|
/*
|
|
* Information cloned from "ActionRequest *req"
|
|
*/
|
|
int numObjects; /* number of child args */
|
|
_DtActArgMap *argMap; /* map of returnable args to chd args */
|
|
|
|
/*
|
|
* Information cloned from "ActionPtr clonedAction"
|
|
*/
|
|
unsigned long mask; /* action type - IS_xxx() */
|
|
|
|
/* a list of tmp file names 5/11/94 --tomg */
|
|
|
|
union {
|
|
struct { /* COMMAND elements */
|
|
char *TTProcId; /* TT procID handle to child */
|
|
Tt_message reqMessage; /* Initiator TT Request */
|
|
Tt_pattern magic_cookie; /* dtexec to libDtSvc cookie */
|
|
} cmd;
|
|
struct { /* TT_MSG elements */
|
|
char *TTProcId; /* TT procID handle to child */
|
|
Tt_message reqMessage; /* Initiator TT Request */
|
|
int isTtMedia; /* handled by ttmedia_load ? */
|
|
Tttk_op TtMediaOp; /* if ttmedia_load, the op */
|
|
Tt_pattern *subConPats; /* for subcontract_manage */
|
|
} tt;
|
|
} u;
|
|
|
|
} _DtActChildRecT;
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Invocation Status Macro Definitions -- These values are used in
|
|
* the state word of the _DtActInvRec invocation record.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
#define _DtActINV_UNKNOWN 0 /* unknown invocation status */
|
|
#define _DtActINV_ERROR (1<<0) /* invocation error detected */
|
|
#define _DtActINV_CANCEL (1<<1) /* trying to cancel invocation*/
|
|
#define _DtActINV_PENDING (1<<2) /* invocation pending */
|
|
#define _DtActINV_WORKING (1<<3) /* invocation in process */
|
|
#define _DtActINV_DONE (1<<4) /* invocation step done */
|
|
#define _DtActINV_COMPLETE (1<<5) /* invocation steps all done */
|
|
#define _DtActINV_CB_CALLED (1<<6) /* invocation callback called */
|
|
#define _DtActINV_ID_RETURNED (1<<7) /* invocation id has returned */
|
|
#define _DtActINV_CMD_QUEUED (1<<8) /* command has been queued */
|
|
#define _DtActINV_INDICATOR_ON (1<<9) /* busy indicator active bit */
|
|
|
|
#define SET_INV_UNKNOWN(mask) (mask = 0)
|
|
|
|
#define SET_INV_ERROR(mask) (mask |= _DtActINV_ERROR)
|
|
#define SET_INV_CANCEL(mask) (mask |= _DtActINV_CANCEL)
|
|
#define SET_INV_PENDING(mask) (mask |= _DtActINV_PENDING)
|
|
#define SET_INV_WORKING(mask) (mask |= _DtActINV_WORKING)
|
|
#define SET_INV_DONE(mask) (mask |= _DtActINV_DONE)
|
|
#define SET_INV_COMPLETE(mask) (mask |= _DtActINV_COMPLETE)
|
|
#define SET_INV_CB_CALLED(mask) (mask |= _DtActINV_CB_CALLED)
|
|
#define SET_INV_ID_RETURNED(mask) (mask |= _DtActINV_ID_RETURNED)
|
|
#define SET_INV_CMD_QUEUED(mask) (mask |= _DtActINV_CMD_QUEUED)
|
|
#define SET_INV_INDICATOR_ON(mask) (mask |= _DtActINV_INDICATOR_ON)
|
|
|
|
#define RESET_INV_ERROR(mask) (mask &= ~(_DtActINV_ERROR))
|
|
#define RESET_INV_CANCEL(mask) (mask &= ~(_DtActINV_CANCEL))
|
|
#define RESET_INV_PENDING(mask) (mask &= ~(_DtActINV_PENDING))
|
|
#define RESET_INV_WORKING(mask) (mask &= ~(_DtActINV_WORKING))
|
|
#define RESET_INV_COMPLETE(mask) (mask &= ~(_DtActINV_COMPLETE))
|
|
#define RESET_INV_DONE(mask) (mask &= ~(_DtActINV_DONE))
|
|
#define RESET_INV_CB_CALLED(mask) (mask &= ~(_DtActINV_CB_CALLED))
|
|
#define RESET_INV_ID_RETURNED(mask) (mask &= ~(_DtActINV_ID_RETURNED))
|
|
#define RESET_INV_CMD_QUEUED(mask) (mask &= ~(_DtActINV_CMD_QUEUED))
|
|
#define RESET_INV_INDICATOR_ON(mask) (mask &= ~(_DtActINV_INDICATOR_ON))
|
|
|
|
#define IS_INV_FINISHED(mask) ( !((mask) & _DtActINV_CMD_QUEUED) \
|
|
&& ((mask) & (_DtActINV_COMPLETE \
|
|
| _DtActINV_CANCEL)) )
|
|
#define IS_INV_UNKNOWN(mask) ( (mask) == _DtActINV_UNKNOWN )
|
|
|
|
#define IS_INV_ERROR(mask) ((mask) & _DtActINV_ERROR )
|
|
#define IS_INV_CANCEL(mask) ((mask) & _DtActINV_CANCEL )
|
|
#define IS_INV_PENDING(mask) ((mask) & _DtActINV_PENDING )
|
|
#define IS_INV_WORKING(mask) ((mask) & _DtActINV_WORKING )
|
|
#define IS_INV_DONE(mask) ((mask) & _DtActINV_DONE )
|
|
#define IS_INV_COMPLETE(mask) ((mask) & _DtActINV_COMPLETE )
|
|
#define IS_INV_CB_CALLED(mask) ((mask) & _DtActINV_CB_CALLED )
|
|
#define IS_INV_ID_RETURNED(mask) ((mask) & _DtActINV_ID_RETURNED )
|
|
#define IS_INV_CMD_QUEUED(mask) ((mask) & _DtActINV_CMD_QUEUED )
|
|
#define IS_INV_INDICATOR_ON(mask) ((mask) & _DtActINV_INDICATOR_ON )
|
|
|
|
#define CALL_INV_CB(mask) ((IS_INV_FINISHED(mask)) && \
|
|
(IS_INV_ID_RETURNED(mask)) && \
|
|
!(IS_INV_CB_CALLED(mask)))
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Information per DtActionInvoke()
|
|
*
|
|
* Note: For TT_MSG(NOTICE)'s during CDE 1.0, this struct will disappear
|
|
* immediately after the NOTICEs are sent.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
|
|
typedef struct {
|
|
unsigned long mask; /* encodes object class and writable flag */
|
|
int size; /* original size (buffers only) */
|
|
char *type; /* original type (buffers only) */
|
|
char *name; /* encodes (tmp) file name associated with the
|
|
object (if any) */
|
|
} _DtActArgInfo;
|
|
|
|
typedef struct {
|
|
DtActionStatus userStatus;
|
|
DtActionArg *newArgp;
|
|
int newArgc;
|
|
} _DtActUpdateCache;
|
|
|
|
typedef struct _DtActInvRec {
|
|
unsigned long state; /* invocation state */
|
|
DtActionInvocationID id; /* identifying invocation ID */
|
|
Widget w; /* users widget id */
|
|
DtActionCallbackProc cb; /* users callback */
|
|
XtPointer client_data; /* users client data for cb */
|
|
_DtActArgInfo *info; /* template w/ .argClass info */
|
|
int ac; /* original # of arguments */
|
|
int numChildren; /* number of childRec's. */
|
|
_DtActChildRecT **childRec; /* array of child Rec's */
|
|
int cachedUploadCnt;/* cached callback updates */
|
|
_DtActUpdateCache *cachedUploads; /* data for */
|
|
} _DtActInvRecT;
|
|
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Structs for dialogs/prompts
|
|
*
|
|
*****************************************************************************/
|
|
|
|
/* Structure used to hold a prompt string destined for a dialog */
|
|
|
|
typedef struct {
|
|
int argIndex;
|
|
char *prompt;
|
|
} PromptEntry;
|
|
|
|
|
|
/* Structure used to contain prompt dialog information */
|
|
|
|
typedef struct {
|
|
int argIndex;
|
|
Widget promptWidget;
|
|
} DialogPromptEntry;
|
|
|
|
typedef struct {
|
|
ActionRequest * request;
|
|
Widget topLevel;
|
|
Widget associatedWidget;
|
|
int numPrompts;
|
|
DialogPromptEntry * prompts;
|
|
} PromptDialog;
|
|
|
|
|
|
/* Structure used to contain abort/continue dialog information */
|
|
|
|
typedef struct {
|
|
ActionRequest * request;
|
|
Widget topLevel;
|
|
Widget associatedWidget;
|
|
int numPrompts;
|
|
PromptEntry * prompts;
|
|
} ContinueDialog;
|
|
|
|
|
|
/* Structure passed to request passed/failed callbacks */
|
|
|
|
typedef struct {
|
|
Widget associatedWidget;
|
|
char *actionLabel;
|
|
int offset;
|
|
ActionPtr actionPtr; /* Ptr to the action that
|
|
was invoked. */
|
|
ActionRequest *requestPtr;
|
|
DtActionInvocationID actInvId; /* A standard invocation id */
|
|
unsigned long childId; /* An id to further identify
|
|
children of actInvId */
|
|
} CallbackData;
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Private External Function Declarations -- not for public consumption
|
|
*
|
|
******************************************************************************/
|
|
|
|
extern void _DtFreeActionStruct( ActionPtr action) ;
|
|
|
|
#endif /* _ActionP_h */
|
|
/* DON'T ADD ANYTHING AFTER THIS #endif */
|