Bug 846: Document the private data in each SMJS class.
[elinks.git] / src / scripting / smjs / bookmarks.c
blob4c76a33d334a0ddf23389baf97bb9cb489ededd8
1 /* "elinks.bookmarks" */
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
7 #include "elinks.h"
9 #include "bookmarks/bookmarks.h"
10 #include "ecmascript/spidermonkey/util.h"
11 #include "main/event.h"
12 #include "scripting/smjs/core.h"
13 #include "scripting/smjs/elinks_object.h"
14 #include "util/memory.h"
17 /*** common code ***/
19 static JSObject *
20 smjs_get_bookmark_generic_object(struct bookmark *bookmark, JSClass *clasp)
22 JSObject *jsobj;
24 jsobj = JS_NewObject(smjs_ctx, clasp, NULL, NULL);
25 if (!jsobj) return NULL;
27 if (!bookmark) return jsobj;
29 if (JS_TRUE == JS_SetPrivate(smjs_ctx, jsobj, bookmark)) {
30 object_lock(bookmark);
32 return jsobj;
35 return NULL;
38 static void
39 bookmark_finalize(JSContext *ctx, JSObject *obj)
41 struct bookmark *bookmark = JS_GetPrivate(ctx, obj);
43 if (bookmark) object_unlock(bookmark);
47 /*** bookmark object ***/
49 enum bookmark_prop {
50 BOOKMARK_TITLE,
51 BOOKMARK_URL,
52 BOOKMARK_CHILDREN,
55 static const JSPropertySpec bookmark_props[] = {
56 { "title", BOOKMARK_TITLE, JSPROP_ENUMERATE },
57 { "url", BOOKMARK_URL, JSPROP_ENUMERATE },
58 { "children", BOOKMARK_CHILDREN, JSPROP_ENUMERATE | JSPROP_READONLY },
59 { NULL }
62 static JSObject *smjs_get_bookmark_folder_object(struct bookmark *bookmark);
64 static JSBool
65 bookmark_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
67 struct bookmark *bookmark = JS_GetPrivate(ctx, obj);
69 if (!bookmark) return JS_FALSE;
71 undef_to_jsval(ctx, vp);
73 if (!JSVAL_IS_INT(id))
74 return JS_FALSE;
76 switch (JSVAL_TO_INT(id)) {
77 case BOOKMARK_TITLE:
78 *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx,
79 bookmark->title));
81 return JS_TRUE;
82 case BOOKMARK_URL:
83 *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(smjs_ctx,
84 bookmark->url));
86 return JS_TRUE;
87 case BOOKMARK_CHILDREN:
88 *vp = OBJECT_TO_JSVAL(smjs_get_bookmark_folder_object(bookmark));
90 return JS_TRUE;
91 default:
92 INTERNAL("Invalid ID %d in bookmark_get_property().",
93 JSVAL_TO_INT(id));
96 return JS_FALSE;
99 static JSBool
100 bookmark_set_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
102 struct bookmark *bookmark = JS_GetPrivate(ctx, obj);
104 if (!bookmark) return JS_FALSE;
106 if (!JSVAL_IS_INT(id))
107 return JS_FALSE;
109 switch (JSVAL_TO_INT(id)) {
110 case BOOKMARK_TITLE: {
111 JSString *jsstr = JS_ValueToString(smjs_ctx, *vp);
112 unsigned char *str = JS_GetStringBytes(jsstr);
114 mem_free_set(&bookmark->title, stracpy(str));
116 return JS_TRUE;
118 case BOOKMARK_URL: {
119 JSString *jsstr = JS_ValueToString(smjs_ctx, *vp);
120 unsigned char *str = JS_GetStringBytes(jsstr);
122 mem_free_set(&bookmark->url, stracpy(str));
124 return JS_TRUE;
126 default:
127 INTERNAL("Invalid ID %d in bookmark_set_property().",
128 JSVAL_TO_INT(id));
131 return JS_FALSE;
134 static const JSClass bookmark_class = {
135 "bookmark",
136 JSCLASS_HAS_PRIVATE, /* struct bookmark * */
137 JS_PropertyStub, JS_PropertyStub,
138 bookmark_get_property, bookmark_set_property,
139 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, bookmark_finalize,
142 static JSObject *
143 smjs_get_bookmark_object(struct bookmark *bookmark)
145 JSObject *jsobj;
147 jsobj = smjs_get_bookmark_generic_object(bookmark,
148 (JSClass *) &bookmark_class);
150 if (jsobj
151 && JS_TRUE == JS_DefineProperties(smjs_ctx, jsobj,
152 (JSPropertySpec *) bookmark_props))
153 return jsobj;
155 return NULL;
159 /*** bookmark folder object ***/
161 static JSBool
162 bookmark_folder_get_property(JSContext *ctx, JSObject *obj, jsval id, jsval *vp)
164 struct bookmark *bookmark;
165 struct bookmark *folder = JS_GetPrivate(ctx, obj);
166 unsigned char *title;
168 *vp = JSVAL_NULL;
170 title = JS_GetStringBytes(JS_ValueToString(ctx, id));
171 if (!title) return JS_TRUE;
173 bookmark = get_bookmark_by_name(folder, title);
174 if (bookmark) {
175 *vp = OBJECT_TO_JSVAL(smjs_get_bookmark_object(bookmark));
178 return JS_TRUE;
181 static const JSClass bookmark_folder_class = {
182 "bookmark_folder",
183 JSCLASS_HAS_PRIVATE, /* struct bookmark * */
184 JS_PropertyStub, JS_PropertyStub,
185 bookmark_folder_get_property, JS_PropertyStub,
186 JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, bookmark_finalize,
189 static JSObject *
190 smjs_get_bookmark_folder_object(struct bookmark *bookmark)
192 return smjs_get_bookmark_generic_object(bookmark,
193 (JSClass *) &bookmark_folder_class);
196 void
197 smjs_init_bookmarks_interface(void)
199 jsval val;
200 struct JSObject *bookmarks_object;
202 if (!smjs_ctx || !smjs_elinks_object)
203 return;
205 bookmarks_object = smjs_get_bookmark_folder_object(NULL);
206 if (!bookmarks_object) return;
208 val = OBJECT_TO_JSVAL(bookmarks_object);
210 JS_SetProperty(smjs_ctx, smjs_elinks_object, "bookmarks", &val);