|
|
1.1 ! root 1: /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- ! 2: * ! 3: * ***** BEGIN LICENSE BLOCK ***** ! 4: * Version: MPL 1.1/GPL 2.0/LGPL 2.1 ! 5: * ! 6: * The contents of this file are subject to the Mozilla Public License Version ! 7: * 1.1 (the "License"); you may not use this file except in compliance with ! 8: * the License. You may obtain a copy of the License at ! 9: * http://www.mozilla.org/MPL/ ! 10: * ! 11: * Software distributed under the License is distributed on an "AS IS" basis, ! 12: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License ! 13: * for the specific language governing rights and limitations under the ! 14: * License. ! 15: * ! 16: * The Original Code is Mozilla Communicator client code, released ! 17: * March 31, 1998. ! 18: * ! 19: * The Initial Developer of the Original Code is ! 20: * Netscape Communications Corporation. ! 21: * Portions created by the Initial Developer are Copyright (C) 1998 ! 22: * the Initial Developer. All Rights Reserved. ! 23: * ! 24: * Contributor(s): ! 25: * ! 26: * Alternatively, the contents of this file may be used under the terms of ! 27: * either of the GNU General Public License Version 2 or later (the "GPL"), ! 28: * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), ! 29: * in which case the provisions of the GPL or the LGPL are applicable instead ! 30: * of those above. If you wish to allow use of your version of this file only ! 31: * under the terms of either the GPL or the LGPL, and not to allow others to ! 32: * use your version of this file under the terms of the MPL, indicate your ! 33: * decision by deleting the provisions above and replace them with the notice ! 34: * and other provisions required by the GPL or the LGPL. If you do not delete ! 35: * the provisions above, a recipient may use your version of this file under ! 36: * the terms of any one of the MPL, the GPL or the LGPL. ! 37: * ! 38: * ***** END LICENSE BLOCK ***** */ ! 39: ! 40: #ifndef jsxdrapi_h___ ! 41: #define jsxdrapi_h___ ! 42: ! 43: /* ! 44: * JS external data representation interface API. ! 45: * ! 46: * The XDR system is comprised of three major parts: ! 47: * ! 48: * - the state serialization/deserialization APIs, which allow consumers ! 49: * of the API to serialize JS runtime state (script bytecodes, atom maps, ! 50: * object graphs, etc.) for later restoration. These portions ! 51: * are implemented in various appropriate files, such as jsscript.c ! 52: * for the script portions and jsobj.c for object state. ! 53: * - the callback APIs through which the runtime requests an opaque ! 54: * representation of a native object, and through which the runtime ! 55: * constructs a live native object from an opaque representation. These ! 56: * portions are the responsibility of the native object implementor. ! 57: * - utility functions for en/decoding of primitive types, such as ! 58: * JSStrings. This portion is implemented in jsxdrapi.c. ! 59: * ! 60: * Spiritually guided by Sun's XDR, where appropriate. ! 61: */ ! 62: ! 63: #include "jspubtd.h" ! 64: #include "jsprvtd.h" ! 65: ! 66: JS_BEGIN_EXTERN_C ! 67: ! 68: /* We use little-endian byteorder for all encoded data */ ! 69: ! 70: #if defined IS_LITTLE_ENDIAN ! 71: #define JSXDR_SWAB32(x) x ! 72: #define JSXDR_SWAB16(x) x ! 73: #elif defined IS_BIG_ENDIAN ! 74: #define JSXDR_SWAB32(x) (((uint32)(x) >> 24) | \ ! 75: (((uint32)(x) >> 8) & 0xff00) | \ ! 76: (((uint32)(x) << 8) & 0xff0000) | \ ! 77: ((uint32)(x) << 24)) ! 78: #define JSXDR_SWAB16(x) (((uint16)(x) >> 8) | ((uint16)(x) << 8)) ! 79: #else ! 80: #error "unknown byte order" ! 81: #endif ! 82: ! 83: #define JSXDR_ALIGN 4 ! 84: ! 85: typedef enum JSXDRMode { ! 86: JSXDR_ENCODE, ! 87: JSXDR_DECODE, ! 88: JSXDR_FREE ! 89: } JSXDRMode; ! 90: ! 91: typedef enum JSXDRWhence { ! 92: JSXDR_SEEK_SET, ! 93: JSXDR_SEEK_CUR, ! 94: JSXDR_SEEK_END ! 95: } JSXDRWhence; ! 96: ! 97: typedef struct JSXDROps { ! 98: JSBool (*get32)(JSXDRState *, uint32 *); ! 99: JSBool (*set32)(JSXDRState *, uint32 *); ! 100: JSBool (*getbytes)(JSXDRState *, char *, uint32); ! 101: JSBool (*setbytes)(JSXDRState *, char *, uint32); ! 102: void * (*raw)(JSXDRState *, uint32); ! 103: JSBool (*seek)(JSXDRState *, int32, JSXDRWhence); ! 104: uint32 (*tell)(JSXDRState *); ! 105: void (*finalize)(JSXDRState *); ! 106: } JSXDROps; ! 107: ! 108: struct JSXDRState { ! 109: JSXDRMode mode; ! 110: JSXDROps *ops; ! 111: JSContext *cx; ! 112: JSClass **registry; ! 113: uintN numclasses; ! 114: uintN maxclasses; ! 115: void *reghash; ! 116: void *userdata; ! 117: }; ! 118: ! 119: extern JS_PUBLIC_API(void) ! 120: JS_XDRInitBase(JSXDRState *xdr, JSXDRMode mode, JSContext *cx); ! 121: ! 122: extern JS_PUBLIC_API(JSXDRState *) ! 123: JS_XDRNewMem(JSContext *cx, JSXDRMode mode); ! 124: ! 125: extern JS_PUBLIC_API(void *) ! 126: JS_XDRMemGetData(JSXDRState *xdr, uint32 *lp); ! 127: ! 128: extern JS_PUBLIC_API(void) ! 129: JS_XDRMemSetData(JSXDRState *xdr, void *data, uint32 len); ! 130: ! 131: extern JS_PUBLIC_API(uint32) ! 132: JS_XDRMemDataLeft(JSXDRState *xdr); ! 133: ! 134: extern JS_PUBLIC_API(void) ! 135: JS_XDRMemResetData(JSXDRState *xdr); ! 136: ! 137: extern JS_PUBLIC_API(void) ! 138: JS_XDRDestroy(JSXDRState *xdr); ! 139: ! 140: extern JS_PUBLIC_API(JSBool) ! 141: JS_XDRUint8(JSXDRState *xdr, uint8 *b); ! 142: ! 143: extern JS_PUBLIC_API(JSBool) ! 144: JS_XDRUint16(JSXDRState *xdr, uint16 *s); ! 145: ! 146: extern JS_PUBLIC_API(JSBool) ! 147: JS_XDRUint32(JSXDRState *xdr, uint32 *lp); ! 148: ! 149: extern JS_PUBLIC_API(JSBool) ! 150: JS_XDRBytes(JSXDRState *xdr, char *bytes, uint32 len); ! 151: ! 152: extern JS_PUBLIC_API(JSBool) ! 153: JS_XDRCString(JSXDRState *xdr, char **sp); ! 154: ! 155: extern JS_PUBLIC_API(JSBool) ! 156: JS_XDRCStringOrNull(JSXDRState *xdr, char **sp); ! 157: ! 158: extern JS_PUBLIC_API(JSBool) ! 159: JS_XDRString(JSXDRState *xdr, JSString **strp); ! 160: ! 161: extern JS_PUBLIC_API(JSBool) ! 162: JS_XDRStringOrNull(JSXDRState *xdr, JSString **strp); ! 163: ! 164: extern JS_PUBLIC_API(JSBool) ! 165: JS_XDRDouble(JSXDRState *xdr, jsdouble **dp); ! 166: ! 167: extern JS_PUBLIC_API(JSBool) ! 168: JS_XDRValue(JSXDRState *xdr, jsval *vp); ! 169: ! 170: extern JS_PUBLIC_API(JSBool) ! 171: JS_XDRScript(JSXDRState *xdr, JSScript **scriptp); ! 172: ! 173: extern JS_PUBLIC_API(JSBool) ! 174: JS_XDRRegisterClass(JSXDRState *xdr, JSClass *clasp, uint32 *lp); ! 175: ! 176: extern JS_PUBLIC_API(uint32) ! 177: JS_XDRFindClassIdByName(JSXDRState *xdr, const char *name); ! 178: ! 179: extern JS_PUBLIC_API(JSClass *) ! 180: JS_XDRFindClassById(JSXDRState *xdr, uint32 id); ! 181: ! 182: /* ! 183: * Magic numbers. ! 184: */ ! 185: #define JSXDR_MAGIC_SCRIPT_1 0xdead0001 ! 186: #define JSXDR_MAGIC_SCRIPT_2 0xdead0002 ! 187: #define JSXDR_MAGIC_SCRIPT_3 0xdead0003 ! 188: #define JSXDR_MAGIC_SCRIPT_4 0xdead0004 ! 189: #define JSXDR_MAGIC_SCRIPT_CURRENT JSXDR_MAGIC_SCRIPT_4 ! 190: ! 191: JS_END_EXTERN_C ! 192: ! 193: #endif /* ! jsxdrapi_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.