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