ReactOS 0.4.17-dev-357-ga8f14ff
vbarray.c
Go to the documentation of this file.
1/*
2 * Copyright 2010 Piotr Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "jscript.h"
20
21#include "wine/debug.h"
22
24
25typedef struct {
27
30
32{
33 return CONTAINING_RECORD(jsdisp, VBArrayInstance, dispex);
34}
35
37{
38 jsdisp_t *jsdisp = is_object_instance(vthis) ? to_jsdisp(get_object(vthis)) : NULL;
39 return (jsdisp && is_class(jsdisp, JSCLASS_VBARRAY)) ? vbarray_from_jsdisp(jsdisp) : NULL;
40}
41
43 jsval_t *r)
44{
45 VBArrayInstance *vbarray;
46
47 TRACE("\n");
48
49 vbarray = vbarray_this(vthis);
50 if(!vbarray)
52
53 if(r)
55 return S_OK;
56}
57
59 jsval_t *r)
60{
61 VBArrayInstance *vbarray;
62 unsigned i;
63 LONG *indexes;
66
67 TRACE("\n");
68
69 vbarray = vbarray_this(vthis);
70 if(!vbarray)
72
73 if(argc < SafeArrayGetDim(vbarray->safearray))
75
76 indexes = malloc(sizeof(indexes[0])*argc);
77 if(!indexes)
78 return E_OUTOFMEMORY;
79
80 for(i=0; i<argc; i++) {
81 hres = to_long(ctx, argv[i], indexes + i);
82 if(FAILED(hres)) {
83 free(indexes);
84 return hres;
85 }
86 }
87
88 hres = SafeArrayGetElement(vbarray->safearray, indexes, (void*)&out);
89 free(indexes);
92 else if(FAILED(hres))
93 return hres;
94
95 if(r) {
98 }
99 return hres;
100}
101
103 jsval_t *r)
104{
105 VBArrayInstance *vbarray;
106 LONG dim;
108
109 TRACE("\n");
110
111 vbarray = vbarray_this(vthis);
112 if(!vbarray)
114
115 if(argc) {
116 hres = to_long(ctx, argv[0], &dim);
117 if(FAILED(hres))
118 return hres;
119 } else
120 dim = 1;
121
122 hres = SafeArrayGetLBound(vbarray->safearray, dim, &dim);
123 if(hres == DISP_E_BADINDEX)
125 else if(FAILED(hres))
126 return hres;
127
128 if(r)
129 *r = jsval_number(dim);
130 return S_OK;
131}
132
134 jsval_t *r)
135{
136 VBArrayInstance *vbarray;
138 jsval_t val;
139 VARIANT *v;
140 LONG i, size = 1, ubound, lbound;
142
143 TRACE("\n");
144
145 vbarray = vbarray_this(vthis);
146 if(!vbarray)
148
149 for(i=1; i<=SafeArrayGetDim(vbarray->safearray); i++) {
150 SafeArrayGetLBound(vbarray->safearray, i, &lbound);
151 SafeArrayGetUBound(vbarray->safearray, i, &ubound);
152 size *= ubound-lbound+1;
153 }
154
155 hres = SafeArrayAccessData(vbarray->safearray, (void**)&v);
156 if(FAILED(hres))
157 return hres;
158
159 hres = create_array(ctx, 0, &array);
160 if(FAILED(hres)) {
162 return hres;
163 }
164
165 for(i=0; i<size; i++) {
167 if(SUCCEEDED(hres)) {
170 }
171 if(FAILED(hres)) {
174 return hres;
175 }
176 v++;
177 }
178
180
181 if(r)
182 *r = jsval_obj(array);
183 else
185 return S_OK;
186}
187
189 jsval_t *r)
190{
191 VBArrayInstance *vbarray;
192 LONG dim;
194
195 TRACE("\n");
196
197 vbarray = vbarray_this(vthis);
198 if(!vbarray)
200
201 if(argc) {
202 hres = to_long(ctx, argv[0], &dim);
203 if(FAILED(hres))
204 return hres;
205 } else
206 dim = 1;
207
208 hres = SafeArrayGetUBound(vbarray->safearray, dim, &dim);
209 if(hres == DISP_E_BADINDEX)
211 else if(FAILED(hres))
212 return hres;
213
214 if(r)
215 *r = jsval_number(dim);
216 return S_OK;
217}
218
220 jsval_t *r)
221{
222 FIXME("\n");
223
224 switch(flags) {
225 default:
226 FIXME("unimplemented flags %x\n", flags);
227 return E_NOTIMPL;
228 }
229
230 return S_OK;
231}
232
233static void VBArray_destructor(jsdisp_t *dispex)
234{
235 VBArrayInstance *vbarray = vbarray_from_jsdisp(dispex);
236
237 SafeArrayDestroy(vbarray->safearray);
238}
239
241 {L"dimensions", VBArray_dimensions, PROPF_METHOD},
242 {L"getItem", VBArray_getItem, PROPF_METHOD|1},
243 {L"lbound", VBArray_lbound, PROPF_METHOD},
244 {L"toArray", VBArray_toArray, PROPF_METHOD},
245 {L"ubound", VBArray_ubound, PROPF_METHOD}
246};
247
250 .call = VBArray_value,
251 .props_cnt = ARRAY_SIZE(VBArray_props),
252 .props = VBArray_props,
253 .destructor = VBArray_destructor,
254};
255
257{
258 VBArrayInstance *vbarray;
260
261 vbarray = calloc(1, sizeof(VBArrayInstance));
262 if(!vbarray)
263 return E_OUTOFMEMORY;
264
265 if(object_prototype)
266 hres = init_dispex(&vbarray->dispex, ctx, &VBArray_info, object_prototype);
267 else
268 hres = init_dispex_from_constr(&vbarray->dispex, ctx, &VBArray_info, ctx->vbarray_constr);
269
270 if(FAILED(hres)) {
271 free(vbarray);
272 return hres;
273 }
274
275 *ret = vbarray;
276 return S_OK;
277}
278
280 jsval_t *r)
281{
282 VBArrayInstance *vbarray;
284
285 TRACE("\n");
286
287 switch(flags) {
288 case DISPATCH_METHOD:
289 if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
291
292 return r ? jsval_copy(argv[0], r) : S_OK;
293
294 case DISPATCH_CONSTRUCT:
295 if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
297 if(!r)
298 return S_OK;
299
300 hres = alloc_vbarray(ctx, NULL, &vbarray);
301 if(FAILED(hres))
302 return hres;
303
305 if(FAILED(hres)) {
306 jsdisp_release(&vbarray->dispex);
307 return hres;
308 }
309
310 *r = jsval_obj(&vbarray->dispex);
311 break;
312
313 default:
314 FIXME("unimplemented flags: %x\n", flags);
315 return E_NOTIMPL;
316 }
317
318 return S_OK;
319}
320
322{
323 VBArrayInstance *vbarray;
325
326 hres = alloc_vbarray(ctx, object_prototype, &vbarray);
327 if(FAILED(hres))
328 return hres;
329
331
332 jsdisp_release(&vbarray->dispex);
333 return hres;
334}
335
337{
338 VBArrayInstance *vbarray;
340
341 hres = alloc_vbarray(ctx, NULL, &vbarray);
342 if(FAILED(hres))
343 return hres;
344
345 hres = SafeArrayCopy(sa, &vbarray->safearray);
346 if(FAILED(hres)) {
347 jsdisp_release(&vbarray->dispex);
348 return hres;
349 }
350
351 *ret = &vbarray->dispex;
352 return S_OK;
353}
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
HRESULT create_array(script_ctx_t *ctx, DWORD length, jsdisp_t **ret)
Definition: array.c:1780
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
@ VT_ARRAY
Definition: compat.h:2341
@ VT_VARIANT
Definition: compat.h:2307
HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, jsdisp_t *prototype, jsdisp_t **ret)
Definition: function.c:809
MonoAssembly int argc
Definition: metahost.c:107
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:947
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1137
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1168
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
Definition: safearray.c:1379
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1094
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
const GLdouble * v
Definition: gl.h:2040
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLbitfield flags
Definition: glext.h:7161
GLuint GLfloat * val
Definition: glext.h:7180
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *constr)
Definition: dispex.c:2512
ULONG jsdisp_release(jsdisp_t *obj)
Definition: dispex.c:1911
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:2454
HRESULT jsdisp_propput_idx(jsdisp_t *obj, DWORD idx, jsval_t val)
Definition: dispex.c:2864
jsdisp_t * to_jsdisp(IDispatch *disp)
Definition: dispex.c:2447
HRESULT to_long(script_ctx_t *, jsval_t, LONG *)
Definition: jsutils.c:748
#define JS_E_SUBSCRIPT_OUT_OF_RANGE
Definition: jscript.h:528
#define JS_E_VBARRAY_EXPECTED
Definition: jscript.h:559
@ JSCLASS_VBARRAY
Definition: jscript.h:117
static BOOL is_class(jsdisp_t *jsdisp, jsclass_t class)
Definition: jscript.h:503
const unsigned int PROPF_METHOD
Definition: jsdisp.idl:33
const unsigned int PROPF_CONSTR
Definition: jsdisp.idl:34
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:225
HRESULT variant_to_jsval(script_ctx_t *ctx, VARIANT *var, jsval_t *r)
Definition: jsutils.c:251
void jsval_release(jsval_t val)
Definition: jsutils.c:186
static VARIANT * get_variant(jsval_t v)
Definition: jsval.h:243
static BOOL is_variant(jsval_t v)
Definition: jsval.h:209
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
static IDispatch * get_object(jsval_t v)
Definition: jsval.h:228
static BOOL is_object_instance(jsval_t v)
Definition: jsval.h:175
static jsval_t jsval_number(double n)
Definition: jsval.h:153
HRESULT hres
Definition: protocol.c:465
#define argv
Definition: mplay32.c:18
#define V_ARRAY(A)
Definition: oleauto.h:222
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define V_VT(A)
Definition: oleauto.h:211
long LONG
Definition: pedump.c:60
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
jsdisp_t dispex
Definition: vbarray.c:26
SAFEARRAY * safearray
Definition: vbarray.c:28
Definition: jsval.h:54
Definition: undname.c:54
jsclass_t class
Definition: jscript.h:183
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
HRESULT create_vbarray_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
Definition: vbarray.c:321
static HRESULT VBArray_lbound(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:102
static void VBArray_destructor(jsdisp_t *dispex)
Definition: vbarray.c:233
static HRESULT VBArray_toArray(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:133
static HRESULT VBArray_dimensions(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:42
static HRESULT VBArrayConstr_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:279
static const builtin_prop_t VBArray_props[]
Definition: vbarray.c:240
static HRESULT VBArray_value(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:219
static HRESULT alloc_vbarray(script_ctx_t *ctx, jsdisp_t *object_prototype, VBArrayInstance **ret)
Definition: vbarray.c:256
HRESULT create_vbarray(script_ctx_t *ctx, SAFEARRAY *sa, jsdisp_t **ret)
Definition: vbarray.c:336
static VBArrayInstance * vbarray_this(jsval_t vthis)
Definition: vbarray.c:36
static VBArrayInstance * vbarray_from_jsdisp(jsdisp_t *jsdisp)
Definition: vbarray.c:31
static HRESULT VBArray_ubound(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:188
static const builtin_info_t VBArray_info
Definition: vbarray.c:248
static HRESULT VBArray_getItem(script_ctx_t *ctx, jsval_t vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:58
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define DISP_E_BADINDEX
Definition: winerror.h:3623