summaryrefslogtreecommitdiff
path: root/source4/web_server/ejs/var.h
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-05-26 01:06:32 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:17:01 -0500
commitd70912a26af49db468af7ec88e9689b8176e0576 (patch)
treea52d8b9930fe23eaea47c40b0af34f324e45f854 /source4/web_server/ejs/var.h
parente5613a3ce9932fb76aef9f721cadabe69bd23be8 (diff)
downloadsamba-d70912a26af49db468af7ec88e9689b8176e0576.tar.gz
samba-d70912a26af49db468af7ec88e9689b8176e0576.tar.bz2
samba-d70912a26af49db468af7ec88e9689b8176e0576.zip
r6981: first version of the builtin web server for Samba4
This includes an embedded server side scripting system called 'esp' (see http://www.appwebserver.org/products/esp/esp.html) and javascript based scripting language called 'esj' (see http://www.appwebserver.org/products/ejs/ejs.html) The justification for including this scripting language is that it should make it much easier to write a high quality web interface for Samba4. The scripting language can call into any Samba4 library code (so for example it will be able to make ldb and loadparm calls), plus it provides easy support for forms, cookies, sessions etc. There is still quite a bit more work to do on the web server, but there is enough here now for people to look at and comment. I will be committing some sample web pages that test esp functionality shortly. (This used to be commit 26f0ba92c0c565ac9e4cb5a079d795d4262497dd)
Diffstat (limited to 'source4/web_server/ejs/var.h')
-rw-r--r--source4/web_server/ejs/var.h482
1 files changed, 482 insertions, 0 deletions
diff --git a/source4/web_server/ejs/var.h b/source4/web_server/ejs/var.h
new file mode 100644
index 0000000000..2e8fdf6b58
--- /dev/null
+++ b/source4/web_server/ejs/var.h
@@ -0,0 +1,482 @@
+/*
+ * @file var.h
+ * @brief MPR Universal Variable Type
+ * @copy default.m
+ *
+ * Copyright (c) Mbedthis Software LLC, 2003-2005. All Rights Reserved.
+ * Copyright (c) Michael O'Brien, 1994-1995. All Rights Reserved.
+ *
+ * This software is distributed under commercial and open source licenses.
+ * You may use the GPL open source license described below or you may acquire
+ * a commercial license from Mbedthis Software. You agree to be fully bound
+ * by the terms of either license. Consult the LICENSE.TXT distributed with
+ * this software for full details.
+ *
+ * This software is open source; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See the GNU General Public License for more
+ * details at: http://www.mbedthis.com/downloads/gplLicense.html
+ *
+ * This program is distributed WITHOUT ANY WARRANTY; without even the
+ * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * This GPL license does NOT permit incorporating this software into
+ * proprietary programs. If you are unable to comply with the GPL, you must
+ * acquire a commercial license to use this software. Commercial licenses
+ * for this software and support services are available from Mbedthis
+ * Software at http://www.mbedthis.com
+ *
+ * @end
+ */
+
+/******************************* Documentation ********************************/
+/*
+ * Variables can efficiently store primitive types and can hold references to
+ * objects. Objects can store properties which are themselves variables.
+ * Properties can be primitive data types, other objects or functions.
+ * Properties are indexed by a character name. A variable may store one of
+ * the following types:
+ *
+ * string, integer, integer-64bit, C function, C function with string args,
+ * Javascript function, Floating point number, boolean value, Undefined
+ * value and the Null value.
+ *
+ * Variables have names while objects may be referenced by multiple variables.
+ * Objects use reference counting for garbage collection.
+ *
+ * This module is not thread safe for performance and compactness. It relies
+ * on upper modules to provide thread synchronization as required. The API
+ * provides primitives to get variable/object references or to get copies of
+ * variables which will help minimize required lock times.
+ */
+
+#ifndef _h_MPR_VAR
+#define _h_MPR_VAR 1
+
+/********************************* Includes ***********************************/
+
+#include "web_server/ejs/miniMpr.h"
+
+/********************************** Defines ***********************************/
+
+/*
+ * Define VAR_DEBUG if you want to track objects. However, this code is not
+ * thread safe and you need to run the server single threaded.
+ *
+ * #define VAR_DEBUG 1
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Forward declare types
+ */
+struct MprProperties;
+struct MprVar;
+
+/*
+ * Possible variable types. Don't use enum because we need to be able to
+ * do compile time conditional compilation on BLD_FEATURE_NUM_TYPE_ID.
+ */
+typedef int MprType;
+#define MPR_TYPE_UNDEFINED 0 ///< Undefined. No value has been set.
+#define MPR_TYPE_NULL 1 ///< Value defined to be null.
+#define MPR_TYPE_BOOL 2 ///< Boolean type.
+#define MPR_TYPE_CFUNCTION 3 ///< C function or C++ method
+#define MPR_TYPE_FLOAT 4 ///< Floating point number
+#define MPR_TYPE_INT 5 ///< Integer number
+#define MPR_TYPE_INT64 6 ///< 64-bit Integer number
+#define MPR_TYPE_OBJECT 7 ///< Object reference
+#define MPR_TYPE_FUNCTION 8 ///< JavaScript function
+#define MPR_TYPE_STRING 9 ///< String (immutable)
+#define MPR_TYPE_STRING_CFUNCTION 10 ///< C/C++ function with string args
+
+/*
+ * Create a type for the default number type
+ * Config.h will define the default number type. For example:
+ *
+ * BLD_FEATURE_NUM_TYPE=int
+ * BLD_FEATURE_NUM_TYPE_ID=MPR_TYPE_INT
+ */
+
+/**
+ * Set to the type used for MPR numeric variables. Will equate to int, int64
+ * or double.
+ */
+typedef BLD_FEATURE_NUM_TYPE MprNum;
+
+/**
+ * Set to the MPR_TYPE used for MPR numeric variables. Will equate to
+ * MPR_TYPE_INT, MPR_TYPE_INT64 or MPR_TYPE_FLOAT.
+ */
+#define MPR_NUM_VAR BLD_FEATURE_NUM_TYPE_ID
+#define MPR_TYPE_NUM BLD_FEATURE_NUM_TYPE_ID
+
+/*
+ * Return TRUE if a variable is a function type
+ */
+#define mprVarIsFunction(type) \
+ (type == MPR_TYPE_FUNCTION || type == MPR_TYPE_STRING_CFUNCTION || \
+ type == MPR_TYPE_CFUNCTION)
+
+/*
+ * Return TRUE if a variable is a numeric type
+ */
+#define mprVarIsNumber(type) \
+ (type == MPR_TYPE_INT || type == MPR_TYPE_INT64 || type == MPR_TYPE_FLOAT)
+
+/*
+ * Return TRUE if a variable is a boolean
+ */
+#define mprVarIsBoolean(type) \
+ (type == MPR_TYPE_BOOL)
+#define mprVarIsString(type) \
+ (type == MPR_TYPE_STRING)
+#define mprVarIsObject(type) \
+ (type == MPR_TYPE_OBJECT)
+#define mprVarIsFloating(type) \
+ (type == MPR_TYPE_FLOAT)
+#define mprVarIsUndefined(var) \
+ ((var)->type == MPR_TYPE_UNDEFINED)
+#define mprVarIsNull(var) \
+ ((var)->type == MPR_TYPE_NULL)
+#define mprVarIsValid(var) \
+ (((var)->type != MPR_TYPE_NULL) && ((var)->type != MPR_TYPE_UNDEFINED))
+
+#define MPR_VAR_MAX_RECURSE 5 /* Max object loops */
+
+#if BLD_FEATURE_SQUEEZE
+#define MPR_MAX_VAR 64 /* Max var full name */
+#else
+#define MPR_MAX_VAR 512
+#endif
+
+#ifndef __NO_PACK
+#pragma pack(2)
+#endif /* _NO_PACK */
+
+/*
+ * Function signatures
+ */
+typedef int MprVarHandle;
+typedef int (*MprCFunction)(MprVarHandle userHandle, int argc,
+ struct MprVar **argv);
+typedef int (*MprStringCFunction)(MprVarHandle userHandle, int argc,
+ char **argv);
+
+/*
+ * Triggers
+ */
+typedef enum {
+ MPR_VAR_WRITE, /* This property is being updated */
+ MPR_VAR_READ, /* This property is being read */
+ MPR_VAR_CREATE_PROPERTY, /* A property is being created */
+ MPR_VAR_DELETE_PROPERTY, /* A property is being deleted */
+ MPR_VAR_DELETE /* This object is being deleted */
+} MprVarTriggerOp;
+
+/*
+ * Trigger function return codes.
+ */
+typedef enum {
+ MPR_TRIGGER_ABORT, /* Abort the current operation */
+ MPR_TRIGGER_USE_NEW_VALUE, /* Proceed and use the newValue */
+ MPR_TRIGGER_PROCEED /* Proceed with the operation */
+} MprVarTriggerStatus;
+
+/*
+ * The MprVarTrigger arguments have the following meaning:
+ *
+ * op The operation being performed. See MprVarTriggerOp.
+ * parentProperties Pointer to the MprProperties structure.
+ * vp Pointer to the property that registered the trigger.
+ * newValue New value (see below for more details).
+ * copyDepth Specify what data items to copy.
+ *
+ * For VAR_READ, newVar is set to a temporary variable that the trigger
+ * function may assign a value to be returned instead of the actual
+ * property value.
+ * For VAR_WRITE, newValue holds the new value. The old existing value may be
+ * accessed via vp.
+ * For DELETE_PROPERTY, vp is the property being deleted. newValue is null.
+ * For ADD_PROPERTY, vp is set to the property being added and newValue holds
+ * the new value.
+ */
+typedef MprVarTriggerStatus (*MprVarTrigger)(MprVarTriggerOp op,
+ struct MprProperties *parentProperties, struct MprVar *vp,
+ struct MprVar *newValue, int copyDepth);
+
+/*
+ * mprCreateFunctionVar flags
+ */
+/** Use the alternate handle on function callbacks */
+#define MPR_VAR_ALT_HANDLE 0x1
+
+/** Use the script handle on function callbacks */
+#define MPR_VAR_SCRIPT_HANDLE 0x2
+
+/*
+ * Useful define for the copyDepth argument
+ */
+/** Don't copy any data. Copy only the variable name */
+#define MPR_NO_COPY 0
+
+/** Copy strings. Increment object reference counts. */
+#define MPR_SHALLOW_COPY 1
+
+/** Copy strings and do complete object copies. */
+#define MPR_DEEP_COPY 2
+
+/*
+ * GetFirst / GetNext flags
+ */
+/** Step into data properties. */
+#define MPR_ENUM_DATA 0x1
+
+/** Step into functions properties. */
+#define MPR_ENUM_FUNCTIONS 0x2
+
+/*
+ * Collection type to hold properties in an object
+ */
+typedef struct MprProperties { /* Collection of properties */
+#if VAR_DEBUG
+ struct MprProperties *next; /* Linked list */
+ struct MprProperties *prev; /* Linked list */
+ char name[32]; /* Debug name */
+#endif
+ struct MprVar **buckets; /* Hash chains */
+ int numItems; /* Total count of items */
+ int numDataItems; /* Enumerable data items */
+ uint hashSize : 8; /* Size of the hash table */
+ uint refCount : 8; /* References to this property*/
+ uint deleteProtect : 8; /* Don't recursively delete */
+ uint visited : 8; /* Node has been processed */
+} MprProperties;
+
+/*
+ * Universal Variable Type
+ */
+typedef struct MprVar {
+ MprStr name; /* Property name */
+ MprStr fullName; /* Full object name */
+ MprProperties *properties; /* Pointer to properties */
+
+ /*
+ * Packed bit field
+ */
+ MprType type : 8; /* Selector into union */
+ uint bucketIndex : 8; /* Copy of bucket index */
+
+ uint flags : 5; /* Type specific flags */
+ uint allocatedData : 1; /* Data needs freeing */
+ uint readonly : 1; /* Unmodifiable */
+ uint deleteProtect : 1; /* Don't recursively delete */
+
+ uint visited : 1; /* Node has been processed */
+ uint allocatedVar : 1; /* Var needs freeing */
+ uint spare : 6; /* Unused */
+
+ struct MprVar *forw; /* Hash table linkage */
+ MprVarTrigger trigger; /* Trigger function */
+
+#if UNUSED && KEEP
+ struct MprVar *baseClass; /* Pointer to class object */
+#endif
+ MprProperties *parentProperties; /* Pointer to parent object */
+
+ /*
+ * Union of primitive types. When debugging on Linux, don't use unions
+ * as the gdb debugger can't display them.
+ */
+#if !BLD_DEBUG && !LINUX && !VXWORKS
+ union {
+#endif
+ int boolean; /* Use int for speed */
+#if BLD_FEATURE_FLOATING_POINT
+ double floating;
+#endif
+ int integer;
+#if BLD_FEATURE_INT64
+ int64 integer64;
+#endif
+ struct { /* Javascript functions */
+ MprArray *args; /* Null terminated */
+ char *body;
+ } function;
+ struct { /* Function with MprVar args */
+ MprCFunction fn;
+ void *thisPtr;
+ } cFunction;
+ struct { /* Function with string args */
+ MprStringCFunction fn;
+ void *thisPtr;
+ } cFunctionWithStrings;
+ MprStr string; /* Allocated string */
+#if !BLD_DEBUG && !LINUX && !VXWORKS
+ };
+#endif
+} MprVar;
+
+/*
+ * Define a field macro so code an use numbers in a "generic" fashion.
+ */
+#if MPR_NUM_VAR == MPR_TYPE_INT || DOXYGEN
+//* Default numeric type */
+#define mprNumber integer
+#endif
+#if MPR_NUM_VAR == MPR_TYPE_INT64
+//* Default numeric type */
+#define mprNumber integer64
+#endif
+#if MPR_NUM_VAR == MPR_TYPE_FLOAT
+//* Default numeric type */
+#define mprNumber floating
+#endif
+
+typedef BLD_FEATURE_NUM_TYPE MprNumber;
+
+
+#ifndef __NO_PACK
+#pragma pack()
+#endif /* __NO_PACK */
+
+/********************************* Prototypes *********************************/
+/*
+ * Variable constructors and destructors
+ */
+extern MprVar mprCreateObjVar(const char *name, int hashSize);
+extern MprVar mprCreateBoolVar(bool value);
+extern MprVar mprCreateCFunctionVar(MprCFunction fn, void *thisPtr,
+ int flags);
+#if BLD_FEATURE_FLOATING_POINT
+extern MprVar mprCreateFloatVar(double value);
+#endif
+extern MprVar mprCreateIntegerVar(int value);
+#if BLD_FEATURE_INT64
+extern MprVar mprCreateInteger64Var(int64 value);
+#endif
+extern MprVar mprCreateFunctionVar(char *args, char *body, int flags);
+extern MprVar mprCreateNullVar(void);
+extern MprVar mprCreateNumberVar(MprNumber value);
+extern MprVar mprCreateStringCFunctionVar(MprStringCFunction fn,
+ void *thisPtr, int flags);
+extern MprVar mprCreateStringVar(const char *value, bool allocate);
+extern MprVar mprCreateUndefinedVar(void);
+extern bool mprDestroyVar(MprVar *vp);
+extern bool mprDestroyAllVars(MprVar* vp);
+extern MprType mprGetVarType(MprVar *vp);
+
+/*
+ * Copy
+ */
+extern void mprCopyVar(MprVar *dest, MprVar *src, int copyDepth);
+extern void mprCopyVarValue(MprVar *dest, MprVar src, int copyDepth);
+extern MprVar *mprDupVar(MprVar *src, int copyDepth);
+
+/*
+ * Manage vars
+ */
+extern MprVarTrigger
+ mprAddVarTrigger(MprVar *vp, MprVarTrigger fn);
+extern int mprGetVarRefCount(MprVar *vp);
+extern void mprSetVarDeleteProtect(MprVar *vp, int deleteProtect);
+extern void mprSetVarFullName(MprVar *vp, char *name);
+extern void mprSetVarReadonly(MprVar *vp, int readonly);
+extern void mprSetVarName(MprVar *vp, char *name);
+
+/*
+ * Create properties and return a reference to the property.
+ */
+extern MprVar *mprCreateProperty(MprVar *obj, const char *property,
+ MprVar *newValue);
+extern MprVar *mprCreatePropertyValue(MprVar *obj, const char *property,
+ MprVar newValue);
+extern int mprDeleteProperty(MprVar *obj, const char *property);
+
+/*
+ * Get/Set properties. Set will update/create.
+ */
+extern MprVar *mprGetProperty(MprVar *obj, const char *property, MprVar *value);
+extern MprVar *mprSetProperty(MprVar *obj, const char *property, MprVar *value);
+extern MprVar *mprSetPropertyValue(MprVar *obj, const char *property, MprVar value);
+
+/*
+ * Directly read/write property values (the property must already exist)
+ * For mprCopyProperty, mprDestroyVar must always called on the var.
+ */
+extern int mprReadProperty(MprVar *prop, MprVar *value);
+extern int mprWriteProperty(MprVar *prop, MprVar *newValue);
+extern int mprWritePropertyValue(MprVar *prop, MprVar newValue);
+
+/*
+ * Copy a property. NOTE: reverse of most other args: (dest, src)
+ */
+extern int mprCopyProperty(MprVar *dest, MprVar *prop, int copyDepth);
+
+/*
+ * Enumerate properties
+ */
+extern MprVar *mprGetFirstProperty(MprVar *obj, int includeFlags);
+extern MprVar *mprGetNextProperty(MprVar *obj, MprVar *currentProperty,
+ int includeFlags);
+
+/*
+ * Query properties characteristics
+ */
+extern int mprGetPropertyCount(MprVar *obj, int includeFlags);
+
+/*
+ * Conversion routines
+ */
+extern MprVar mprParseVar(char *str, MprType prefType);
+extern MprNum mprVarToNumber(MprVar *vp);
+extern int mprVarToInteger(MprVar *vp);
+#if BLD_FEATURE_INT64
+extern int64 mprVarToInteger64(MprVar *vp);
+#endif
+extern bool mprVarToBool(MprVar *vp);
+#if BLD_FEATURE_FLOATING_POINT
+extern double mprVarToFloat(MprVar *vp);
+#endif
+extern void mprVarToString(char** buf, int size, char *fmt, MprVar *vp);
+
+/*
+ * Parsing and utility routines
+ */
+extern MprNum mprParseNumber(char *str);
+extern int mprParseInteger(char *str);
+
+#if BLD_FEATURE_INT64
+extern int64 mprParseInteger64(char *str);
+#endif
+
+#if BLD_FEATURE_FLOATING_POINT
+extern double mprParseFloat(char *str);
+extern bool mprIsInfinite(double f);
+extern bool mprIsNan(double f);
+#endif
+
+#if VAR_DEBUG
+extern void mprPrintObjects(char *msg);
+extern void mprPrintObjRefCount(MprVar *vp);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/*****************************************************************************/
+#endif /* _h_MPR_VAR */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim:tw=78
+ * vim600: sw=4 ts=4 fdm=marker
+ * vim<600: sw=4 ts=4
+ */