#ifndef _SMLIBINT_H_
#define _SMLIBINT_H_
#include <X11/Xos.h>
#include <X11/Xfuncs.h>
#include <X11/Xmd.h>
#include <X11/ICE/ICEmsg.h>
#include <X11/ICE/ICEproto.h>
#include <X11/SM/SMproto.h>
#include <stdlib.h>
#ifndef NULL
#include <stddef.h>
#endif
#define SmVendorString "MIT"
#define SmReleaseString "1.0"
#define PAD64(_bytes) ((8 - ((unsigned int) (_bytes) % 8)) % 8)
#define PADDED_BYTES64(_bytes) (_bytes + PAD64 (_bytes))
#define PAD32(_bytes) ((4 - ((unsigned int) (_bytes) % 4)) % 4)
#define PADDED_BYTES32(_bytes) (_bytes + PAD32 (_bytes))
#define WORD64COUNT(_bytes) (((unsigned int) ((_bytes) + 7)) >> 3)
#define ARRAY8_BYTES(_len) (4 + _len + PAD64 (4 + _len))
#define lswapl(_val) ((((_val) & 0xff) << 24) |\
(((_val) & 0xff00) << 8) |\
(((_val) & 0xff0000) >> 8) |\
(((_val) >> 24) & 0xff))
#define lswaps(_val) ((((_val) & 0xff) << 8) | (((_val) >> 8) & 0xff))
#ifndef WORD64
#define STORE_CARD32(_pBuf, _val) \
{ \
*((CARD32 *) _pBuf) = _val; \
_pBuf += 4; \
}
#else
#define STORE_CARD32(_pBuf, _val) \
{ \
struct { \
int value :32; \
} _d; \
_d.value = _val; \
memcpy (_pBuf, &_d, 4); \
_pBuf += 4; \
}
#endif
#ifndef WORD64
#define EXTRACT_CARD16(_pBuf, _swap, _val) \
{ \
_val = *((CARD16 *) _pBuf); \
_pBuf += 2; \
if (_swap) \
_val = lswaps (_val); \
}
#define EXTRACT_CARD32(_pBuf, _swap, _val) \
{ \
_val = *((CARD32 *) _pBuf); \
_pBuf += 4; \
if (_swap) \
_val = lswapl (_val); \
}
#else
#define EXTRACT_CARD16(_pBuf, _swap, _val) \
{ \
_val = *(_pBuf + 0) & 0xff; \
_val <<= 8; \
_val |= *(_pBuf + 1) & 0xff;\
_pBuf += 2; \
if (_swap) \
_val = lswaps (_val); \
}
#define EXTRACT_CARD32(_pBuf, _swap, _val) \
{ \
_val = *(_pBuf + 0) & 0xff; \
_val <<= 8; \
_val |= *(_pBuf + 1) & 0xff;\
_val <<= 8; \
_val |= *(_pBuf + 2) & 0xff;\
_val <<= 8; \
_val |= *(_pBuf + 3) & 0xff;\
_pBuf += 4; \
if (_swap) \
_val = lswapl (_val); \
}
#endif
#define LISTOF_PROP_BYTES(_numProps, _props, _bytes) \
{ \
int _i, _j; \
_bytes = 8; \
for (_i = 0; _i < _numProps; _i++) \
{ \
_bytes += (8 + ARRAY8_BYTES (strlen (_props[_i]->name)) + \
ARRAY8_BYTES (strlen (_props[_i]->type))); \
\
for (_j = 0; _j < _props[_i]->num_vals; _j++) \
_bytes += ARRAY8_BYTES (_props[_i]->vals[_j].length); \
} \
}
#define STORE_ARRAY8(_pBuf, _len, _array8) \
{ \
STORE_CARD32 (_pBuf, _len); \
memcpy (_pBuf, _array8, _len); \
_pBuf += _len; \
if (PAD64 (4 + _len)) \
_pBuf += PAD64 (4 + _len); \
}
#define STORE_LISTOF_PROPERTY(_pBuf, _count, _props) \
{ \
int _i, _j; \
STORE_CARD32 (_pBuf, _count); \
_pBuf += 4; \
for (_i = 0; _i < _count; _i++) \
{ \
STORE_ARRAY8 (_pBuf, strlen (_props[_i]->name), _props[_i]->name); \
STORE_ARRAY8 (_pBuf, strlen (_props[_i]->type), _props[_i]->type); \
STORE_CARD32 (_pBuf, _props[_i]->num_vals); \
_pBuf += 4; \
for (_j = 0; _j < _props[_i]->num_vals; _j++) \
{ \
STORE_ARRAY8 (_pBuf, _props[_i]->vals[_j].length, \
(char *) _props[_i]->vals[_j].value); \
} \
} \
}
#define EXTRACT_ARRAY8(_pBuf, _swap, _len, _array8) \
{ \
EXTRACT_CARD32 (_pBuf, _swap, _len); \
_array8 = (char *) malloc (_len + 1); \
memcpy (_array8, _pBuf, _len); \
_array8[_len] = '\0'; \
_pBuf += _len; \
if (PAD64 (4 + _len)) \
_pBuf += PAD64 (4 + _len); \
}
#define EXTRACT_ARRAY8_AS_STRING(_pBuf, _swap, _string) \
{ \
CARD32 _len; \
EXTRACT_CARD32 (_pBuf, _swap, _len); \
_string = (char *) malloc (_len + 1); \
memcpy (_string, _pBuf, _len); \
_string[_len] = '\0'; \
_pBuf += _len; \
if (PAD64 (4 + _len)) \
_pBuf += PAD64 (4 + _len); \
}
#define EXTRACT_LISTOF_PROPERTY(_pBuf, _swap, _count, _props) \
{ \
int _i, _j; \
EXTRACT_CARD32 (_pBuf, _swap, _count); \
_pBuf += 4; \
_props = (SmProp **) malloc (_count * sizeof (SmProp *)); \
for (_i = 0; _i < _count; _i++) \
{ \
_props[_i] = (SmProp *) malloc (sizeof (SmProp)); \
EXTRACT_ARRAY8_AS_STRING (_pBuf, _swap, _props[_i]->name); \
EXTRACT_ARRAY8_AS_STRING (_pBuf, _swap, _props[_i]->type); \
EXTRACT_CARD32 (_pBuf, _swap, _props[_i]->num_vals); \
_pBuf += 4; \
_props[_i]->vals = (SmPropValue *) malloc ( \
_props[_i]->num_vals * sizeof (SmPropValue)); \
for (_j = 0; _j < _props[_i]->num_vals; _j++) \
{ \
char *_temp; \
EXTRACT_ARRAY8 (_pBuf, _swap, _props[_i]->vals[_j].length, _temp);\
_props[_i]->vals[_j].value = (SmPointer) _temp; \
} \
} \
}
#define SKIP_ARRAY8(_pBuf, _swap) \
{ \
CARD32 _len; \
EXTRACT_CARD32 (_pBuf, _swap, _len); \
_pBuf += _len; \
if (PAD64 (4 + _len)) \
_pBuf += PAD64 (4 + _len); \
}
#define SKIP_LISTOF_PROPERTY(_pBuf, _swap) \
{ \
int _i, _j; \
CARD32 _count; \
EXTRACT_CARD32 (_pBuf, _swap, _count); \
_pBuf += 4; \
for (_i = 0; _i < _count; _i++) \
{ \
CARD32 _numvals; \
SKIP_ARRAY8 (_pBuf, _swap); \
SKIP_ARRAY8 (_pBuf, _swap); \
EXTRACT_CARD32 (_pBuf, _swap, _numvals); \
_pBuf += 4; \
for (_j = 0; _j < _numvals; _j++) \
SKIP_ARRAY8 (_pBuf, _swap);\
} \
}
typedef struct {
Status status;
char *client_id;
} _SmcRegisterClientReply;
typedef struct _SmcInteractWait {
SmcInteractProc interact_proc;
SmPointer client_data;
struct _SmcInteractWait *next;
} _SmcInteractWait;
typedef struct _SmcPhase2Wait {
SmcSaveYourselfPhase2Proc phase2_proc;
SmPointer client_data;
} _SmcPhase2Wait;
typedef struct _SmcPropReplyWait {
SmcPropReplyProc prop_reply_proc;
SmPointer client_data;
struct _SmcPropReplyWait *next;
} _SmcPropReplyWait;
struct _SmcConn {
unsigned int save_yourself_in_progress : 1;
unsigned int shutdown_in_progress : 1;
unsigned int unused1 : 6;
unsigned int unused2 : 8;
IceConn iceConn;
int proto_major_version;
int proto_minor_version;
char *vendor;
char *release;
char *client_id;
SmcCallbacks callbacks;
_SmcInteractWait *interact_waits;
_SmcPhase2Wait *phase2_wait;
_SmcPropReplyWait *prop_reply_waits;
};
struct _SmsConn {
unsigned int save_yourself_in_progress : 1;
unsigned int can_cancel_shutdown : 1;
unsigned int interact_in_progress : 1;
unsigned int unused1 : 5;
unsigned int unused2 : 8;
IceConn iceConn;
int proto_major_version;
int proto_minor_version;
char *client_id;
SmsCallbacks callbacks;
char interaction_allowed;
};
extern int _SmcOpcode;
extern int _SmsOpcode;
extern int _SmVersionCount;
extern IcePoVersionRec _SmcVersions[];
extern IcePaVersionRec _SmsVersions[];
extern int _SmAuthCount;
extern char *_SmAuthNames[];
extern IcePoAuthProc _SmcAuthProcs[];
extern IcePaAuthProc _SmsAuthProcs[];
extern SmsNewClientProc _SmsNewClientProc;
extern SmPointer _SmsNewClientData;
extern SmcErrorHandler _SmcErrorHandler;
extern SmsErrorHandler _SmsErrorHandler;
#endif