Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
9cffed2c
Commit
9cffed2c
authored
Nov 15, 2009
by
Rob Shearman
Committed by
Alexandre Julliard
Nov 16, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
oleaut32: Make BSTR and VARIANT marshalling for typelibs use the user marshalling functions.
Remove now redundant cases in serialize_param and deserialize_param.
parent
8bd2d539
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
36 additions
and
157 deletions
+36
-157
tmarshal.c
dlls/oleaut32/tmarshal.c
+36
-157
No files found.
dlls/oleaut32/tmarshal.c
View file @
9cffed2c
...
...
@@ -615,8 +615,6 @@ serialize_param(
vartype
=
VT_SAFEARRAY
;
switch
(
vartype
)
{
case
VT_EMPTY
:
/* nothing. empty variant for instance */
return
S_OK
;
case
VT_I8
:
case
VT_UI8
:
case
VT_R8
:
...
...
@@ -652,56 +650,23 @@ serialize_param(
if
(
writeit
)
hres
=
xbuf_add
(
buf
,(
LPBYTE
)
arg
,
sizeof
(
DWORD
));
return
hres
;
case
VT_I4
|
VT_BYREF
:
hres
=
S_OK
;
if
(
debugout
)
TRACE_
(
olerelay
)(
"&0x%x
\n
"
,
*
arg
);
if
(
writeit
)
hres
=
xbuf_add
(
buf
,(
LPBYTE
)(
DWORD
*
)
*
arg
,
sizeof
(
DWORD
));
/* do not dealloc at this time */
return
hres
;
case
VT_VARIANT
:
{
TYPEDESC
tdesc2
;
VARIANT
*
vt
=
(
VARIANT
*
)
arg
;
DWORD
vttype
=
V_VT
(
vt
);
if
(
debugout
)
TRACE_
(
olerelay
)(
"Vt(%s%s)("
,
debugstr_vt
(
vttype
),
debugstr_vf
(
vttype
));
tdesc2
.
vt
=
vttype
;
if
(
writeit
)
{
hres
=
xbuf_add
(
buf
,(
LPBYTE
)
&
vttype
,
sizeof
(
vttype
));
if
(
hres
)
return
hres
;
}
/* need to recurse since we need to free the stuff */
hres
=
serialize_param
(
tinfo
,
writeit
,
debugout
,
dealloc
,
&
tdesc2
,(
DWORD
*
)
&
(
V_I4
(
vt
)),
buf
);
if
(
debugout
)
TRACE_
(
olerelay
)(
")"
);
return
hres
;
}
case
VT_BSTR
|
VT_BYREF
:
{
if
(
debugout
)
TRACE_
(
olerelay
)(
"[byref]'%s'"
,
*
(
BSTR
*
)
*
arg
?
relaystr
(
*
((
BSTR
*
)
*
arg
))
:
"<bstr NULL>"
);
if
(
writeit
)
{
/* ptr to ptr to magic widestring, basically */
BSTR
*
bstr
=
(
BSTR
*
)
*
arg
;
DWORD
len
;
if
(
!*
bstr
)
{
/* -1 means "null string" which is equivalent to empty string */
len
=
-
1
;
hres
=
xbuf_add
(
buf
,
(
LPBYTE
)
&
len
,
sizeof
(
DWORD
));
if
(
hres
)
return
hres
;
}
else
{
len
=
*
((
DWORD
*
)
*
bstr
-
1
)
/
sizeof
(
WCHAR
);
hres
=
xbuf_add
(
buf
,(
LPBYTE
)
&
len
,
sizeof
(
DWORD
));
if
(
hres
)
return
hres
;
hres
=
xbuf_add
(
buf
,(
LPBYTE
)
*
bstr
,
len
*
sizeof
(
WCHAR
));
if
(
hres
)
return
hres
;
}
if
(
debugout
)
TRACE_
(
olerelay
)(
"Vt(%s%s)("
,
debugstr_vt
(
V_VT
((
VARIANT
*
)
arg
)),
debugstr_vf
(
V_VT
((
VARIANT
*
)
arg
)));
if
(
writeit
)
{
ULONG
flags
=
MAKELONG
(
MSHCTX_DIFFERENTMACHINE
,
NDR_LOCAL_DATA_REPRESENTATION
);
ULONG
size
=
VARIANT_UserSize
(
&
flags
,
buf
->
curoff
,
(
VARIANT
*
)
arg
);
xbuf_resize
(
buf
,
size
);
VARIANT_UserMarshal
(
&
flags
,
buf
->
base
+
buf
->
curoff
,
(
VARIANT
*
)
arg
);
buf
->
curoff
=
size
;
}
if
(
dealloc
&&
arg
)
{
BSTR
*
str
=
*
((
BSTR
**
)
arg
);
SysFreeString
(
*
str
);
if
(
dealloc
)
{
ULONG
flags
=
MAKELONG
(
MSHCTX_DIFFERENTMACHINE
,
NDR_LOCAL_DATA_REPRESENTATION
);
VARIANT_UserFree
(
&
flags
,
(
VARIANT
*
)
arg
);
}
return
S_OK
;
}
case
VT_BSTR
:
{
if
(
debugout
)
{
if
(
*
arg
)
...
...
@@ -709,24 +674,19 @@ serialize_param(
else
TRACE_
(
olerelay
)(
"<bstr NULL>"
);
}
if
(
writeit
)
{
BSTR
bstr
=
(
BSTR
)
*
arg
;
DWORD
len
;
if
(
!
bstr
)
{
len
=
-
1
;
hres
=
xbuf_add
(
buf
,(
LPBYTE
)
&
len
,
sizeof
(
DWORD
));
if
(
hres
)
return
hres
;
}
else
{
len
=
*
((
DWORD
*
)
bstr
-
1
)
/
sizeof
(
WCHAR
);
hres
=
xbuf_add
(
buf
,(
LPBYTE
)
&
len
,
sizeof
(
DWORD
));
if
(
hres
)
return
hres
;
hres
=
xbuf_add
(
buf
,(
LPBYTE
)
bstr
,
len
*
sizeof
(
WCHAR
));
if
(
hres
)
return
hres
;
if
(
writeit
)
{
ULONG
flags
=
MAKELONG
(
MSHCTX_DIFFERENTMACHINE
,
NDR_LOCAL_DATA_REPRESENTATION
);
ULONG
size
=
BSTR_UserSize
(
&
flags
,
buf
->
curoff
,
(
BSTR
*
)
arg
);
xbuf_resize
(
buf
,
size
);
BSTR_UserMarshal
(
&
flags
,
buf
->
base
+
buf
->
curoff
,
(
BSTR
*
)
arg
);
buf
->
curoff
=
size
;
}
if
(
dealloc
)
{
ULONG
flags
=
MAKELONG
(
MSHCTX_DIFFERENTMACHINE
,
NDR_LOCAL_DATA_REPRESENTATION
);
BSTR_UserFree
(
&
flags
,
(
BSTR
*
)
arg
);
}
if
(
dealloc
&&
arg
)
SysFreeString
((
BSTR
)
*
arg
);
return
S_OK
;
}
case
VT_PTR
:
{
...
...
@@ -941,35 +901,16 @@ deserialize_param(
while
(
1
)
{
switch
(
vartype
)
{
case
VT_EMPTY
:
if
(
debugout
)
TRACE_
(
olerelay
)(
"<empty>
\n
"
);
return
S_OK
;
case
VT_NULL
:
if
(
debugout
)
TRACE_
(
olerelay
)(
"<null>
\n
"
);
return
S_OK
;
case
VT_VARIANT
:
{
VARIANT
*
vt
=
(
VARIANT
*
)
arg
;
if
(
readit
)
{
DWORD
vttype
;
TYPEDESC
tdesc2
;
hres
=
xbuf_get
(
buf
,(
LPBYTE
)
&
vttype
,
sizeof
(
vttype
));
if
(
hres
)
{
FIXME
(
"vt type not read?
\n
"
);
return
hres
;
if
(
readit
)
{
ULONG
flags
=
MAKELONG
(
MSHCTX_DIFFERENTMACHINE
,
NDR_LOCAL_DATA_REPRESENTATION
);
unsigned
char
*
buffer
;
buffer
=
VARIANT_UserUnmarshal
(
&
flags
,
buf
->
base
+
buf
->
curoff
,
(
VARIANT
*
)
arg
);
buf
->
curoff
=
buffer
-
buf
->
base
;
}
memset
(
&
tdesc2
,
0
,
sizeof
(
tdesc2
));
tdesc2
.
vt
=
vttype
;
V_VT
(
vt
)
=
vttype
;
if
(
debugout
)
TRACE_
(
olerelay
)(
"Vt(%s%s)("
,
debugstr_vt
(
vttype
),
debugstr_vf
(
vttype
));
hres
=
deserialize_param
(
tinfo
,
readit
,
debugout
,
alloc
,
&
tdesc2
,
(
DWORD
*
)
&
(
V_I4
(
vt
)),
buf
);
TRACE_
(
olerelay
)(
")"
);
return
hres
;
}
else
{
VariantInit
(
vt
);
return
S_OK
;
}
}
case
VT_I8
:
case
VT_UI8
:
case
VT_R8
:
...
...
@@ -1013,76 +954,14 @@ deserialize_param(
}
if
(
debugout
)
TRACE_
(
olerelay
)(
"%02x"
,
*
arg
&
0xff
);
return
hres
;
case
VT_I4
|
VT_BYREF
:
hres
=
S_OK
;
if
(
alloc
)
*
arg
=
(
DWORD
)
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
DWORD
));
if
(
readit
)
{
hres
=
xbuf_get
(
buf
,(
LPBYTE
)
*
arg
,
sizeof
(
DWORD
));
if
(
hres
)
ERR
(
"Failed to read integer 4 byte
\n
"
);
}
if
(
debugout
)
TRACE_
(
olerelay
)(
"&0x%x"
,
*
(
DWORD
*
)
*
arg
);
return
hres
;
case
VT_BSTR
|
VT_BYREF
:
{
BSTR
**
bstr
=
(
BSTR
**
)
arg
;
WCHAR
*
str
;
DWORD
len
;
if
(
readit
)
{
hres
=
xbuf_get
(
buf
,(
LPBYTE
)
&
len
,
sizeof
(
DWORD
));
if
(
hres
)
{
ERR
(
"failed to read bstr klen
\n
"
);
return
hres
;
}
if
(
len
==
-
1
)
{
*
bstr
=
CoTaskMemAlloc
(
sizeof
(
BSTR
*
));
**
bstr
=
NULL
;
if
(
debugout
)
TRACE_
(
olerelay
)(
"<bstr NULL>"
);
}
else
{
str
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,(
len
+
1
)
*
sizeof
(
WCHAR
));
hres
=
xbuf_get
(
buf
,(
LPBYTE
)
str
,
len
*
sizeof
(
WCHAR
));
if
(
hres
)
{
ERR
(
"Failed to read BSTR.
\n
"
);
HeapFree
(
GetProcessHeap
(),
0
,
str
);
return
hres
;
}
*
bstr
=
CoTaskMemAlloc
(
sizeof
(
BSTR
*
));
**
bstr
=
SysAllocStringLen
(
str
,
len
);
if
(
debugout
)
TRACE_
(
olerelay
)(
"%s"
,
relaystr
(
str
));
HeapFree
(
GetProcessHeap
(),
0
,
str
);
}
}
else
{
*
bstr
=
NULL
;
}
return
S_OK
;
}
case
VT_BSTR
:
{
WCHAR
*
str
;
DWORD
len
;
if
(
readit
)
{
hres
=
xbuf_get
(
buf
,(
LPBYTE
)
&
len
,
sizeof
(
DWORD
));
if
(
hres
)
{
ERR
(
"failed to read bstr klen
\n
"
);
return
hres
;
}
if
(
len
==
-
1
)
{
*
arg
=
0
;
if
(
debugout
)
TRACE_
(
olerelay
)(
"<bstr NULL>"
);
}
else
{
str
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,(
len
+
1
)
*
sizeof
(
WCHAR
));
hres
=
xbuf_get
(
buf
,(
LPBYTE
)
str
,
len
*
sizeof
(
WCHAR
));
if
(
hres
)
{
ERR
(
"Failed to read BSTR.
\n
"
);
HeapFree
(
GetProcessHeap
(),
0
,
str
);
return
hres
;
}
*
arg
=
(
DWORD
)
SysAllocStringLen
(
str
,
len
);
if
(
debugout
)
TRACE_
(
olerelay
)(
"%s"
,
relaystr
(
str
));
HeapFree
(
GetProcessHeap
(),
0
,
str
);
}
}
else
{
*
arg
=
0
;
if
(
readit
)
{
ULONG
flags
=
MAKELONG
(
MSHCTX_DIFFERENTMACHINE
,
NDR_LOCAL_DATA_REPRESENTATION
);
unsigned
char
*
buffer
;
buffer
=
BSTR_UserUnmarshal
(
&
flags
,
buf
->
base
+
buf
->
curoff
,
(
BSTR
*
)
arg
);
buf
->
curoff
=
buffer
-
buf
->
base
;
if
(
debugout
)
TRACE_
(
olerelay
)(
"%s"
,
relaystr
(
*
(
BSTR
*
)
arg
));
}
return
S_OK
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment