ReactOS  0.4.14-dev-342-gdc047f9
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 
25 typedef struct {
27 
30 
31 static const WCHAR dimensionsW[] = {'d','i','m','e','n','s','i','o','n','s',0};
32 static const WCHAR getItemW[] = {'g','e','t','I','t','e','m',0};
33 static const WCHAR lboundW[] = {'l','b','o','u','n','d',0};
34 static const WCHAR toArrayW[] = {'t','o','A','r','r','a','y',0};
35 static const WCHAR uboundW[] = {'u','b','o','u','n','d',0};
36 
38 {
39  return CONTAINING_RECORD(jsdisp, VBArrayInstance, dispex);
40 }
41 
43 {
44  return vbarray_from_jsdisp(vdisp->u.jsdisp);
45 }
46 
47 static inline VBArrayInstance *vbarray_this(vdisp_t *jsthis)
48 {
49  return is_vclass(jsthis, JSCLASS_VBARRAY) ? vbarray_from_vdisp(jsthis) : NULL;
50 }
51 
53  jsval_t *r)
54 {
55  VBArrayInstance *vbarray;
56 
57  TRACE("\n");
58 
59  vbarray = vbarray_this(vthis);
60  if(!vbarray)
62 
63  if(r)
65  return S_OK;
66 }
67 
69  jsval_t *r)
70 {
71  VBArrayInstance *vbarray;
72  int i, *indexes;
73  VARIANT out;
74  HRESULT hres;
75 
76  TRACE("\n");
77 
78  vbarray = vbarray_this(vthis);
79  if(!vbarray)
81 
82  if(argc < SafeArrayGetDim(vbarray->safearray))
84 
85  indexes = heap_alloc(sizeof(int)*argc);
86  if(!indexes)
87  return E_OUTOFMEMORY;
88 
89  for(i=0; i<argc; i++) {
90  hres = to_int32(ctx, argv[i], indexes+i);
91  if(FAILED(hres)) {
92  heap_free(indexes);
93  return hres;
94  }
95  }
96 
97  hres = SafeArrayGetElement(vbarray->safearray, indexes, (void*)&out);
98  heap_free(indexes);
99  if(hres == DISP_E_BADINDEX)
101  else if(FAILED(hres))
102  return hres;
103 
104  if(r) {
105  hres = variant_to_jsval(&out, r);
106  VariantClear(&out);
107  }
108  return hres;
109 }
110 
112  jsval_t *r)
113 {
114  VBArrayInstance *vbarray;
115  int dim;
116  HRESULT hres;
117 
118  TRACE("\n");
119 
120  vbarray = vbarray_this(vthis);
121  if(!vbarray)
123 
124  if(argc) {
125  hres = to_int32(ctx, argv[0], &dim);
126  if(FAILED(hres))
127  return hres;
128  } else
129  dim = 1;
130 
131  hres = SafeArrayGetLBound(vbarray->safearray, dim, &dim);
132  if(hres == DISP_E_BADINDEX)
134  else if(FAILED(hres))
135  return hres;
136 
137  if(r)
138  *r = jsval_number(dim);
139  return S_OK;
140 }
141 
143  jsval_t *r)
144 {
145  VBArrayInstance *vbarray;
146  jsdisp_t *array;
147  jsval_t val;
148  VARIANT *v;
149  int i, size = 1, ubound, lbound;
150  HRESULT hres;
151 
152  TRACE("\n");
153 
154  vbarray = vbarray_this(vthis);
155  if(!vbarray)
157 
158  for(i=1; i<=SafeArrayGetDim(vbarray->safearray); i++) {
159  SafeArrayGetLBound(vbarray->safearray, i, &lbound);
160  SafeArrayGetUBound(vbarray->safearray, i, &ubound);
161  size *= ubound-lbound+1;
162  }
163 
164  hres = SafeArrayAccessData(vbarray->safearray, (void**)&v);
165  if(FAILED(hres))
166  return hres;
167 
168  hres = create_array(ctx, 0, &array);
169  if(FAILED(hres)) {
171  return hres;
172  }
173 
174  for(i=0; i<size; i++) {
175  hres = variant_to_jsval(v, &val);
176  if(SUCCEEDED(hres)) {
179  }
180  if(FAILED(hres)) {
183  return hres;
184  }
185  v++;
186  }
187 
189 
190  if(r)
191  *r = jsval_obj(array);
192  else
194  return S_OK;
195 }
196 
198  jsval_t *r)
199 {
200  VBArrayInstance *vbarray;
201  int dim;
202  HRESULT hres;
203 
204  TRACE("\n");
205 
206  vbarray = vbarray_this(vthis);
207  if(!vbarray)
209 
210  if(argc) {
211  hres = to_int32(ctx, argv[0], &dim);
212  if(FAILED(hres))
213  return hres;
214  } else
215  dim = 1;
216 
217  hres = SafeArrayGetUBound(vbarray->safearray, dim, &dim);
218  if(hres == DISP_E_BADINDEX)
220  else if(FAILED(hres))
221  return hres;
222 
223  if(r)
224  *r = jsval_number(dim);
225  return S_OK;
226 }
227 
228 static HRESULT VBArray_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
229  jsval_t *r)
230 {
231  FIXME("\n");
232 
233  switch(flags) {
234  default:
235  FIXME("unimplemented flags %x\n", flags);
236  return E_NOTIMPL;
237  }
238 
239  return S_OK;
240 }
241 
242 static void VBArray_destructor(jsdisp_t *dispex)
243 {
244  VBArrayInstance *vbarray = vbarray_from_jsdisp(dispex);
245 
246  SafeArrayDestroy(vbarray->safearray);
247  heap_free(vbarray);
248 }
249 
250 static const builtin_prop_t VBArray_props[] = {
256 };
257 
258 static const builtin_info_t VBArray_info = {
260  {NULL, VBArray_value, 0},
264  NULL
265 };
266 
267 static HRESULT alloc_vbarray(script_ctx_t *ctx, jsdisp_t *object_prototype, VBArrayInstance **ret)
268 {
269  VBArrayInstance *vbarray;
270  HRESULT hres;
271 
272  vbarray = heap_alloc_zero(sizeof(VBArrayInstance));
273  if(!vbarray)
274  return E_OUTOFMEMORY;
275 
276  if(object_prototype)
277  hres = init_dispex(&vbarray->dispex, ctx, &VBArray_info, object_prototype);
278  else
280 
281  if(FAILED(hres)) {
282  heap_free(vbarray);
283  return hres;
284  }
285 
286  *ret = vbarray;
287  return S_OK;
288 }
289 
291  jsval_t *r)
292 {
293  VBArrayInstance *vbarray;
294  HRESULT hres;
295 
296  TRACE("\n");
297 
298  switch(flags) {
299  case DISPATCH_METHOD:
300  if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
302 
303  return jsval_copy(argv[0], r);
304 
305  case DISPATCH_CONSTRUCT:
306  if(argc<1 || !is_variant(argv[0]) || V_VT(get_variant(argv[0])) != (VT_ARRAY|VT_VARIANT))
308 
309  hres = alloc_vbarray(ctx, NULL, &vbarray);
310  if(FAILED(hres))
311  return hres;
312 
313  hres = SafeArrayCopy(V_ARRAY(get_variant(argv[0])), &vbarray->safearray);
314  if(FAILED(hres)) {
315  jsdisp_release(&vbarray->dispex);
316  return hres;
317  }
318 
319  *r = jsval_obj(&vbarray->dispex);
320  break;
321 
322  default:
323  FIXME("unimplemented flags: %x\n", flags);
324  return E_NOTIMPL;
325  }
326 
327  return S_OK;
328 }
329 
331 {
332  VBArrayInstance *vbarray;
333  HRESULT hres;
334 
335  static const WCHAR VBArrayW[] = {'V','B','A','r','r','a','y',0};
336 
337  hres = alloc_vbarray(ctx, object_prototype, &vbarray);
338  if(FAILED(hres))
339  return hres;
340 
342 
343  jsdisp_release(&vbarray->dispex);
344  return hres;
345 }
346 
348 {
349  VBArrayInstance *vbarray;
350  HRESULT hres;
351 
352  hres = alloc_vbarray(ctx, NULL, &vbarray);
353  if(FAILED(hres))
354  return hres;
355 
356  hres = SafeArrayCopy(sa, &vbarray->safearray);
357  if(FAILED(hres)) {
358  jsdisp_release(&vbarray->dispex);
359  return hres;
360  }
361 
362  *ret = &vbarray->dispex;
363  return S_OK;
364 }
Definition: jsval.h:54
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1096
static int argc
Definition: ServiceArgs.c:12
void jsval_release(jsval_t val)
Definition: jsutils.c:191
jsdisp_t * vbarray_constr
Definition: jscript.h:459
SAFEARRAY * safearray
Definition: vbarray.c:28
static HRESULT VBArray_dimensions(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:52
HRESULT throw_range_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
Definition: error.c:420
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
#define V_ARRAY(A)
Definition: oleauto.h:222
static const builtin_prop_t VBArray_props[]
Definition: vbarray.c:250
#define PROPF_CONSTR
Definition: jscript.h:98
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:686
HRESULT create_vbarray_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret)
Definition: vbarray.c:330
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:949
#define argv
Definition: mplay32.c:18
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
#define DISPATCH_METHOD
Definition: oleauto.h:1006
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
static HRESULT VBArrayConstr_value(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:290
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static BOOL is_variant(jsval_t v)
Definition: jsval.h:200
HRESULT WINAPI SafeArrayAccessData(SAFEARRAY *psa, void **ppvData)
Definition: safearray.c:1139
HRESULT jsval_copy(jsval_t v, jsval_t *r)
Definition: jsutils.c:231
static const WCHAR lboundW[]
Definition: vbarray.c:33
#define FIXME(fmt,...)
Definition: debug.h:110
WINE_DEFAULT_DEBUG_CHANNEL(jscript)
smooth NULL
Definition: ftsmooth.c:416
static HRESULT VBArray_getItem(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:68
HRESULT to_int32(script_ctx_t *, jsval_t, INT *) DECLSPEC_HIDDEN
Definition: jsutils.c:665
jsdisp_t * jsdisp
Definition: jscript.h:144
HRESULT variant_to_jsval(VARIANT *var, jsval_t *r)
Definition: jsutils.c:258
union vdisp_t::@425 u
static HRESULT alloc_vbarray(script_ctx_t *ctx, jsdisp_t *object_prototype, VBArrayInstance **ret)
Definition: vbarray.c:267
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static void VBArray_destructor(jsdisp_t *dispex)
Definition: vbarray.c:242
GLuint GLfloat * val
Definition: glext.h:7180
static const WCHAR getItemW[]
Definition: vbarray.c:32
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
HRESULT hres
Definition: protocol.c:465
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static BOOL is_vclass(vdisp_t *vdisp, jsclass_t class)
Definition: jscript.h:509
HRESULT WINAPI SafeArrayCopy(SAFEARRAY *psa, SAFEARRAY **ppsaOut)
Definition: safearray.c:1381
static HRESULT VBArray_lbound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:111
unsigned short WORD
Definition: ntddk_ex.h:93
static FILE * out
Definition: regtests2xml.c:44
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1068
HRESULT create_vbarray(script_ctx_t *ctx, SAFEARRAY *sa, jsdisp_t **ret)
Definition: vbarray.c:347
static const WCHAR dimensionsW[]
Definition: vbarray.c:31
#define JS_E_VBARRAY_EXPECTED
Definition: jscript.h:559
static const WCHAR toArrayW[]
Definition: vbarray.c:34
static VBArrayInstance * vbarray_from_jsdisp(jsdisp_t *jsdisp)
Definition: vbarray.c:37
GLbitfield flags
Definition: glext.h:7161
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1349
static VARIANT * get_variant(jsval_t v)
Definition: jsval.h:234
static const WCHAR VBArrayW[]
Definition: global.c:53
int ret
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:651
static const builtin_info_t VBArray_info
Definition: vbarray.c:258
static VBArrayInstance * vbarray_from_vdisp(vdisp_t *vdisp)
Definition: vbarray.c:42
#define V_VT(A)
Definition: oleauto.h:211
static const WCHAR uboundW[]
Definition: vbarray.c:35
static HRESULT VBArray_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:228
HRESULT jsdisp_propput_idx(jsdisp_t *obj, DWORD idx, jsval_t val)
Definition: dispex.c:1349
#define S_OK
Definition: intsafe.h:59
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1035
static HRESULT VBArray_ubound(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:197
#define JS_E_SUBSCRIPT_OUT_OF_RANGE
Definition: jscript.h:530
const GLdouble * v
Definition: gl.h:2040
#define PROPF_METHOD
Definition: jscript.h:97
#define ARRAY_SIZE(a)
Definition: main.h:24
static HRESULT VBArray_toArray(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
Definition: vbarray.c:142
#define E_NOTIMPL
Definition: ddrawi.h:99
HRESULT create_array(script_ctx_t *ctx, DWORD length, jsdisp_t **ret)
Definition: array.c:1381
static void jsdisp_release(jsdisp_t *jsdisp)
Definition: jscript.h:268
HRESULT init_dispex(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *prototype)
Definition: dispex.c:919
static jsval_t jsval_obj(jsdisp_t *obj)
Definition: jsval.h:125
HRESULT throw_type_error(script_ctx_t *ctx, HRESULT error, const WCHAR *str)
Definition: error.c:440
#define DISP_E_BADINDEX
Definition: winerror.h:2520
HRESULT init_dispex_from_constr(jsdisp_t *dispex, script_ctx_t *ctx, const builtin_info_t *builtin_info, jsdisp_t *constr)
Definition: dispex.c:1030
static VBArrayInstance * vbarray_this(vdisp_t *jsthis)
Definition: vbarray.c:47
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
HRESULT WINAPI SafeArrayUnaccessData(SAFEARRAY *psa)
Definition: safearray.c:1170
#define SUCCEEDED(hr)
Definition: intsafe.h:57
jsdisp_t dispex
Definition: vbarray.c:26
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 GLint GLint GLenum GLenum GLenum GLint GLuint GLenum GLenum GLfloat GLenum GLfloat GLenum GLint const GLfloat GLenum GLint const GLushort GLint GLint GLsizei GLsizei GLenum GLsizei GLsizei GLenum GLenum const GLvoid GLenum GLdouble GLenum GLint GLenum GLenum GLint GLenum GLenum GLfloat GLenum GLenum GLfloat GLenum GLfloat GLenum GLushort const GLubyte GLenum GLenum GLenum GLint GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLvoid GLenum GLenum GLint GLenum GLint GLenum GLint GLuint GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble const GLfloat GLenum const GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLdouble GLint GLint GLsizei GLsizei GLenum GLuint GLenum array
Definition: glfuncs.h:320
static jsval_t jsval_number(double n)
Definition: jsval.h:144
static BOOL heap_free(void *mem)
Definition: appwiz.h:75