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
5a58080a
Commit
5a58080a
authored
Oct 31, 2018
by
Hans Leidekker
Committed by
Alexandre Julliard
Oct 31, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
webservices: Implement WsRequestReply.
Signed-off-by:
Hans Leidekker
<
hans@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
57db7989
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
262 additions
and
63 deletions
+262
-63
channel.c
dlls/webservices/channel.c
+115
-0
channel.c
dlls/webservices/tests/channel.c
+143
-62
webservices.spec
dlls/webservices/webservices.spec
+1
-1
webservices.h
include/webservices.h
+3
-0
No files found.
dlls/webservices/channel.c
View file @
5a58080a
...
...
@@ -2007,6 +2007,121 @@ HRESULT WINAPI WsReceiveMessage( WS_CHANNEL *handle, WS_MESSAGE *msg, const WS_M
return
hr
;
}
static
HRESULT
request_reply
(
struct
channel
*
channel
,
WS_MESSAGE
*
request
,
const
WS_MESSAGE_DESCRIPTION
*
request_desc
,
WS_WRITE_OPTION
write_option
,
const
void
*
request_body
,
ULONG
request_size
,
WS_MESSAGE
*
reply
,
const
WS_MESSAGE_DESCRIPTION
*
reply_desc
,
WS_READ_OPTION
read_option
,
WS_HEAP
*
heap
,
void
*
value
,
ULONG
size
)
{
HRESULT
hr
;
WsInitializeMessage
(
request
,
WS_REQUEST_MESSAGE
,
NULL
,
NULL
);
if
((
hr
=
WsAddressMessage
(
request
,
&
channel
->
addr
,
NULL
))
!=
S_OK
)
return
hr
;
if
((
hr
=
message_set_action
(
request
,
request_desc
->
action
))
!=
S_OK
)
return
hr
;
if
((
hr
=
init_writer
(
channel
))
!=
S_OK
)
return
hr
;
if
((
hr
=
write_message
(
channel
,
request
,
request_desc
->
bodyElementDescription
,
write_option
,
request_body
,
request_size
))
!=
S_OK
)
return
hr
;
if
((
hr
=
send_message
(
channel
,
request
))
!=
S_OK
)
return
hr
;
return
receive_message
(
channel
,
reply
,
&
reply_desc
,
1
,
WS_RECEIVE_OPTIONAL_MESSAGE
,
read_option
,
heap
,
value
,
size
,
NULL
);
}
struct
request_reply
{
struct
task
task
;
struct
channel
*
channel
;
WS_MESSAGE
*
request
;
const
WS_MESSAGE_DESCRIPTION
*
request_desc
;
WS_WRITE_OPTION
write_option
;
const
void
*
request_body
;
ULONG
request_size
;
WS_MESSAGE
*
reply
;
const
WS_MESSAGE_DESCRIPTION
*
reply_desc
;
WS_READ_OPTION
read_option
;
WS_HEAP
*
heap
;
void
*
value
;
ULONG
size
;
WS_ASYNC_CONTEXT
ctx
;
};
static
void
request_reply_proc
(
struct
task
*
task
)
{
struct
request_reply
*
r
=
(
struct
request_reply
*
)
task
;
HRESULT
hr
;
hr
=
request_reply
(
r
->
channel
,
r
->
request
,
r
->
request_desc
,
r
->
write_option
,
r
->
request_body
,
r
->
request_size
,
r
->
reply
,
r
->
reply_desc
,
r
->
read_option
,
r
->
heap
,
r
->
value
,
r
->
size
);
TRACE
(
"calling %p(%08x)
\n
"
,
r
->
ctx
.
callback
,
hr
);
r
->
ctx
.
callback
(
hr
,
WS_LONG_CALLBACK
,
r
->
ctx
.
callbackState
);
TRACE
(
"%p returned
\n
"
,
r
->
ctx
.
callback
);
}
static
HRESULT
queue_request_reply
(
struct
channel
*
channel
,
WS_MESSAGE
*
request
,
const
WS_MESSAGE_DESCRIPTION
*
request_desc
,
WS_WRITE_OPTION
write_option
,
const
void
*
request_body
,
ULONG
request_size
,
WS_MESSAGE
*
reply
,
const
WS_MESSAGE_DESCRIPTION
*
reply_desc
,
WS_READ_OPTION
read_option
,
WS_HEAP
*
heap
,
void
*
value
,
ULONG
size
,
const
WS_ASYNC_CONTEXT
*
ctx
)
{
struct
request_reply
*
r
;
if
(
!
(
r
=
heap_alloc
(
sizeof
(
*
r
)
)))
return
E_OUTOFMEMORY
;
r
->
task
.
proc
=
request_reply_proc
;
r
->
channel
=
channel
;
r
->
request
=
request
;
r
->
request_desc
=
request_desc
;
r
->
write_option
=
write_option
;
r
->
request_body
=
request_body
;
r
->
request_size
=
request_size
;
r
->
reply
=
reply
;
r
->
reply_desc
=
reply_desc
;
r
->
read_option
=
read_option
;
r
->
heap
=
heap
;
r
->
value
=
value
;
r
->
size
=
size
;
r
->
ctx
=
*
ctx
;
return
queue_task
(
&
channel
->
recv_q
,
&
r
->
task
);
}
/**************************************************************************
* WsRequestReply [webservices.@]
*/
HRESULT
WINAPI
WsRequestReply
(
WS_CHANNEL
*
handle
,
WS_MESSAGE
*
request
,
const
WS_MESSAGE_DESCRIPTION
*
request_desc
,
WS_WRITE_OPTION
write_option
,
const
void
*
request_body
,
ULONG
request_size
,
WS_MESSAGE
*
reply
,
const
WS_MESSAGE_DESCRIPTION
*
reply_desc
,
WS_READ_OPTION
read_option
,
WS_HEAP
*
heap
,
void
*
value
,
ULONG
size
,
const
WS_ASYNC_CONTEXT
*
ctx
,
WS_ERROR
*
error
)
{
struct
channel
*
channel
=
(
struct
channel
*
)
handle
;
HRESULT
hr
;
TRACE
(
"%p %p %p %08x %p %u %p %p %08x %p %p %u %p %p
\n
"
,
handle
,
request
,
request_desc
,
write_option
,
request_body
,
request_size
,
reply
,
reply_desc
,
read_option
,
heap
,
value
,
size
,
ctx
,
error
);
if
(
error
)
FIXME
(
"ignoring error parameter
\n
"
);
if
(
ctx
)
FIXME
(
"ignoring ctx parameter
\n
"
);
if
(
!
channel
||
!
request
||
!
reply
)
return
E_INVALIDARG
;
EnterCriticalSection
(
&
channel
->
cs
);
if
(
channel
->
magic
!=
CHANNEL_MAGIC
)
{
LeaveCriticalSection
(
&
channel
->
cs
);
return
E_INVALIDARG
;
}
if
(
ctx
)
hr
=
queue_request_reply
(
channel
,
request
,
request_desc
,
write_option
,
request_body
,
request_size
,
reply
,
reply_desc
,
read_option
,
heap
,
value
,
size
,
ctx
);
else
hr
=
request_reply
(
channel
,
request
,
request_desc
,
write_option
,
request_body
,
request_size
,
reply
,
reply_desc
,
read_option
,
heap
,
value
,
size
);
LeaveCriticalSection
(
&
channel
->
cs
);
TRACE
(
"returning %08x
\n
"
,
hr
);
return
hr
;
}
/**************************************************************************
* WsReadMessageStart [webservices.@]
*/
...
...
dlls/webservices/tests/channel.c
View file @
5a58080a
...
...
@@ -433,16 +433,21 @@ static void test_WsResetListener(void)
WsFreeListener
(
listener
);
}
static
const
WCHAR
fmt_soap_udp
[]
=
{
's'
,
'o'
,
'a'
,
'p'
,
'.'
,
'u'
,
'd'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
static
const
WCHAR
fmt_net_tcp
[]
=
{
'n'
,
'e'
,
't'
,
'.'
,
't'
,
'c'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
struct
listener_info
{
int
port
;
HANDLE
wait
;
WS_CHANNEL_BINDING
binding
;
WS_CHANNEL_TYPE
type
;
void
(
*
test
_func
)(
WS_CHANNEL
*
);
void
(
*
server
_func
)(
WS_CHANNEL
*
);
};
static
void
client
_message_read_write
(
WS_CHANNEL
*
channel
)
static
void
server
_message_read_write
(
WS_CHANNEL
*
channel
)
{
WS_MESSAGE
*
msg
;
HRESULT
hr
;
...
...
@@ -476,10 +481,8 @@ static void client_message_read_write( WS_CHANNEL *channel )
WsFreeMessage
(
msg
);
}
static
void
tes
t_message_read_write
(
const
struct
listener_info
*
info
)
static
void
clien
t_message_read_write
(
const
struct
listener_info
*
info
)
{
static
const
WCHAR
fmt
[]
=
{
's'
,
'o'
,
'a'
,
'p'
,
'.'
,
'u'
,
'd'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
WS_ENDPOINT_ADDRESS
addr
;
WCHAR
buf
[
64
];
WS_CHANNEL
*
channel
;
...
...
@@ -491,7 +494,7 @@ static void test_message_read_write( const struct listener_info *info )
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
memset
(
&
addr
,
0
,
sizeof
(
addr
)
);
addr
.
url
.
length
=
wsprintfW
(
buf
,
fmt
,
info
->
port
);
addr
.
url
.
length
=
wsprintfW
(
buf
,
fmt
_soap_udp
,
info
->
port
);
addr
.
url
.
chars
=
buf
;
hr
=
WsOpenChannel
(
channel
,
&
addr
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
...
...
@@ -545,7 +548,7 @@ struct async_test
HANDLE
wait
;
};
static
void
CALLBACK
callback_duplex_session
(
HRESULT
hr
,
WS_CALLBACK_MODEL
model
,
void
*
state
)
static
void
CALLBACK
async_callback
(
HRESULT
hr
,
WS_CALLBACK_MODEL
model
,
void
*
state
)
{
struct
async_test
*
test
=
state
;
...
...
@@ -555,7 +558,7 @@ static void CALLBACK callback_duplex_session( HRESULT hr, WS_CALLBACK_MODEL mode
SetEvent
(
test
->
wait
);
}
static
void
client
_duplex_session
(
WS_CHANNEL
*
channel
)
static
void
server
_duplex_session
(
WS_CHANNEL
*
channel
)
{
WS_XML_STRING
action
=
{
6
,
(
BYTE
*
)
"action"
},
localname
=
{
9
,
(
BYTE
*
)
"localname"
},
ns
=
{
2
,
(
BYTE
*
)
"ns"
};
WS_ELEMENT_DESCRIPTION
desc_body
;
...
...
@@ -580,7 +583,7 @@ static void client_duplex_session( WS_CHANNEL *channel )
test
.
call_count
=
0
;
test
.
wait
=
CreateEventW
(
NULL
,
FALSE
,
FALSE
,
NULL
);
ctx
.
callback
=
callback_duplex_session
;
ctx
.
callback
=
async_callback
;
ctx
.
callbackState
=
&
test
;
hr
=
WsReceiveMessage
(
channel
,
msg
,
desc
,
1
,
WS_RECEIVE_OPTIONAL_MESSAGE
,
WS_READ_REQUIRED_VALUE
,
...
...
@@ -612,10 +615,8 @@ static void client_duplex_session( WS_CHANNEL *channel )
WsFreeMessage
(
msg2
);
}
static
void
tes
t_duplex_session
(
const
struct
listener_info
*
info
)
static
void
clien
t_duplex_session
(
const
struct
listener_info
*
info
)
{
static
const
WCHAR
fmt
[]
=
{
'n'
,
'e'
,
't'
,
'.'
,
't'
,
'c'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
WS_XML_STRING
action
=
{
6
,
(
BYTE
*
)
"action"
},
localname
=
{
9
,
(
BYTE
*
)
"localname"
},
ns
=
{
2
,
(
BYTE
*
)
"ns"
};
WS_ELEMENT_DESCRIPTION
desc_body
;
WS_MESSAGE_DESCRIPTION
desc
;
...
...
@@ -634,7 +635,7 @@ static void test_duplex_session( const struct listener_info *info )
ok
(
hr
==
WS_E_INVALID_OPERATION
,
"got %08x
\n
"
,
hr
);
memset
(
&
addr
,
0
,
sizeof
(
addr
)
);
addr
.
url
.
length
=
wsprintfW
(
buf
,
fmt
,
info
->
port
);
addr
.
url
.
length
=
wsprintfW
(
buf
,
fmt
_net_tcp
,
info
->
port
);
addr
.
url
.
chars
=
buf
;
hr
=
WsOpenChannel
(
channel
,
&
addr
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
...
...
@@ -675,7 +676,7 @@ static void test_duplex_session( const struct listener_info *info )
WsFreeChannel
(
channel
);
}
static
void
client
_accept_channel
(
WS_CHANNEL
*
channel
)
static
void
server
_accept_channel
(
WS_CHANNEL
*
channel
)
{
WS_XML_STRING
localname
=
{
9
,
(
BYTE
*
)
"localname"
},
ns
=
{
2
,
(
BYTE
*
)
"ns"
},
action
=
{
6
,
(
BYTE
*
)
"action"
};
WS_ELEMENT_DESCRIPTION
body
;
...
...
@@ -704,13 +705,9 @@ static void client_accept_channel( WS_CHANNEL *channel )
WsFreeMessage
(
msg
);
}
static
void
test_WsAcceptC
hannel
(
const
struct
listener_info
*
info
)
static
void
client_accept_c
hannel
(
const
struct
listener_info
*
info
)
{
static
const
WCHAR
fmt_tcp
[]
=
{
'n'
,
'e'
,
't'
,
'.'
,
't'
,
'c'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
static
const
WCHAR
fmt_udp
[]
=
{
's'
,
'o'
,
'a'
,
'p'
,
'.'
,
'u'
,
'd'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
const
WCHAR
*
fmt
=
(
info
->
binding
==
WS_TCP_CHANNEL_BINDING
)
?
fmt_tcp
:
fmt_udp
;
const
WCHAR
*
fmt
=
(
info
->
binding
==
WS_TCP_CHANNEL_BINDING
)
?
fmt_net_tcp
:
fmt_soap_udp
;
WS_XML_STRING
localname
=
{
9
,
(
BYTE
*
)
"localname"
},
ns
=
{
2
,
(
BYTE
*
)
"ns"
},
action
=
{
6
,
(
BYTE
*
)
"action"
};
WCHAR
buf
[
64
];
WS_LISTENER
*
listener
;
...
...
@@ -773,14 +770,104 @@ static void test_WsAcceptChannel( const struct listener_info *info )
WsFreeChannel
(
channel
);
}
static
void
server_request_reply
(
WS_CHANNEL
*
channel
)
{
WS_XML_STRING
localname
=
{
9
,
(
BYTE
*
)
"localname"
},
ns
=
{
2
,
(
BYTE
*
)
"ns"
};
WS_XML_STRING
req_action
=
{
7
,
(
BYTE
*
)
"request"
},
reply_action
=
{
5
,
(
BYTE
*
)
"reply"
};
WS_ELEMENT_DESCRIPTION
body
;
WS_MESSAGE_DESCRIPTION
in_desc
,
out_desc
;
const
WS_MESSAGE_DESCRIPTION
*
desc
[
1
];
WS_MESSAGE
*
msg
;
INT32
val
=
0
;
HRESULT
hr
;
hr
=
WsCreateMessageForChannel
(
channel
,
NULL
,
0
,
&
msg
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
body
.
elementLocalName
=
&
localname
;
body
.
elementNs
=
&
ns
;
body
.
type
=
WS_INT32_TYPE
;
body
.
typeDescription
=
NULL
;
in_desc
.
action
=
&
req_action
;
in_desc
.
bodyElementDescription
=
&
body
;
desc
[
0
]
=
&
in_desc
;
hr
=
WsReceiveMessage
(
channel
,
msg
,
desc
,
1
,
WS_RECEIVE_REQUIRED_MESSAGE
,
WS_READ_REQUIRED_VALUE
,
NULL
,
&
val
,
sizeof
(
val
),
NULL
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
ok
(
val
==
-
1
,
"got %d
\n
"
,
val
);
WsFreeMessage
(
msg
);
hr
=
WsCreateMessageForChannel
(
channel
,
NULL
,
0
,
&
msg
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
out_desc
.
action
=
&
reply_action
;
out_desc
.
bodyElementDescription
=
&
body
;
hr
=
WsSendMessage
(
channel
,
msg
,
&
out_desc
,
WS_WRITE_REQUIRED_VALUE
,
&
val
,
sizeof
(
val
),
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
WsFreeMessage
(
msg
);
}
static
void
client_request_reply
(
const
struct
listener_info
*
info
)
{
WS_XML_STRING
localname
=
{
9
,
(
BYTE
*
)
"localname"
},
ns
=
{
2
,
(
BYTE
*
)
"ns"
};
WS_XML_STRING
req_action
=
{
7
,
(
BYTE
*
)
"request"
},
reply_action
=
{
5
,
(
BYTE
*
)
"reply"
};
WCHAR
buf
[
64
];
WS_CHANNEL
*
channel
;
WS_MESSAGE
*
req
,
*
reply
;
WS_ENDPOINT_ADDRESS
addr
;
WS_ELEMENT_DESCRIPTION
body
;
WS_MESSAGE_DESCRIPTION
req_desc
,
reply_desc
;
INT32
val_in
=
-
1
,
val_out
=
0
;
HRESULT
hr
;
hr
=
WsCreateChannel
(
info
->
type
,
info
->
binding
,
NULL
,
0
,
NULL
,
&
channel
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
memset
(
&
addr
,
0
,
sizeof
(
addr
)
);
addr
.
url
.
length
=
wsprintfW
(
buf
,
fmt_net_tcp
,
info
->
port
);
addr
.
url
.
chars
=
buf
;
hr
=
WsOpenChannel
(
channel
,
&
addr
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
hr
=
WsCreateMessageForChannel
(
channel
,
NULL
,
0
,
&
req
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
hr
=
WsCreateMessageForChannel
(
channel
,
NULL
,
0
,
&
reply
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
hr
=
WsInitializeMessage
(
req
,
WS_BLANK_MESSAGE
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
body
.
elementLocalName
=
&
localname
;
body
.
elementNs
=
&
ns
;
body
.
type
=
WS_INT32_TYPE
;
body
.
typeDescription
=
NULL
;
req_desc
.
action
=
&
req_action
;
req_desc
.
bodyElementDescription
=
&
body
;
reply_desc
.
action
=
&
reply_action
;
reply_desc
.
bodyElementDescription
=
&
body
;
hr
=
WsRequestReply
(
channel
,
req
,
&
req_desc
,
WS_WRITE_REQUIRED_VALUE
,
&
val_in
,
sizeof
(
val_in
),
reply
,
&
reply_desc
,
WS_READ_REQUIRED_VALUE
,
NULL
,
&
val_out
,
sizeof
(
val_out
),
NULL
,
NULL
);
ok
(
val_out
==
-
1
,
"got %d
\n
"
,
val_out
);
hr
=
WsCloseChannel
(
channel
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
WsFreeMessage
(
req
);
WsFreeMessage
(
reply
);
WsFreeChannel
(
channel
);
}
static
DWORD
CALLBACK
listener_proc
(
void
*
arg
)
{
static
const
WCHAR
fmt_tcp
[]
=
{
'n'
,
'e'
,
't'
,
'.'
,
't'
,
'c'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
static
const
WCHAR
fmt_udp
[]
=
{
's'
,
'o'
,
'a'
,
'p'
,
'.'
,
'u'
,
'd'
,
'p'
,
':'
,
'/'
,
'/'
,
'l'
,
'o'
,
'c'
,
'a'
,
'l'
,
'h'
,
'o'
,
's'
,
't'
,
':'
,
'%'
,
'u'
,
0
};
struct
listener_info
*
info
=
arg
;
const
WCHAR
*
fmt
=
(
info
->
binding
==
WS_TCP_CHANNEL_BINDING
)
?
fmt_
tcp
:
fmt
_udp
;
const
WCHAR
*
fmt
=
(
info
->
binding
==
WS_TCP_CHANNEL_BINDING
)
?
fmt_
net_tcp
:
fmt_soap
_udp
;
WS_LISTENER
*
listener
;
WS_CHANNEL
*
channel
;
WCHAR
buf
[
64
];
...
...
@@ -803,7 +890,7 @@ static DWORD CALLBACK listener_proc( void *arg )
hr
=
WsAcceptChannel
(
listener
,
channel
,
NULL
,
NULL
);
ok
(
hr
==
S_OK
,
"got %08x
\n
"
,
hr
);
info
->
test
_func
(
channel
);
info
->
server
_func
(
channel
);
SetEvent
(
info
->
wait
);
...
...
@@ -956,6 +1043,22 @@ START_TEST(channel)
struct
listener_info
info
;
HANDLE
thread
;
HRESULT
hr
;
unsigned
int
i
;
static
const
struct
test
{
WS_CHANNEL_BINDING
binding
;
WS_CHANNEL_TYPE
type
;
void
(
*
server_func
)(
WS_CHANNEL
*
);
void
(
*
client_func
)(
const
struct
listener_info
*
);
}
tests
[]
=
{
{
WS_UDP_CHANNEL_BINDING
,
WS_CHANNEL_TYPE_DUPLEX
,
server_message_read_write
,
client_message_read_write
},
{
WS_TCP_CHANNEL_BINDING
,
WS_CHANNEL_TYPE_DUPLEX_SESSION
,
server_duplex_session
,
client_duplex_session
},
{
WS_UDP_CHANNEL_BINDING
,
WS_CHANNEL_TYPE_DUPLEX
,
server_accept_channel
,
client_accept_channel
},
{
WS_TCP_CHANNEL_BINDING
,
WS_CHANNEL_TYPE_DUPLEX_SESSION
,
server_accept_channel
,
client_accept_channel
},
{
WS_TCP_CHANNEL_BINDING
,
WS_CHANNEL_TYPE_DUPLEX_SESSION
,
server_request_reply
,
client_request_reply
},
};
if
(
firewall_enabled
)
{
...
...
@@ -979,42 +1082,20 @@ START_TEST(channel)
test_WsCreateChannelForListener
();
test_WsResetListener
();
info
.
port
=
7533
;
info
.
wait
=
CreateEventW
(
NULL
,
0
,
0
,
NULL
);
info
.
type
=
WS_CHANNEL_TYPE_DUPLEX
;
info
.
binding
=
WS_UDP_CHANNEL_BINDING
;
info
.
test_func
=
client_message_read_write
;
thread
=
start_listener
(
&
info
);
test_message_read_write
(
&
info
);
WaitForSingleObject
(
thread
,
3000
);
CloseHandle
(
thread
);
info
.
type
=
WS_CHANNEL_TYPE_DUPLEX_SESSION
;
info
.
binding
=
WS_TCP_CHANNEL_BINDING
;
info
.
test_func
=
client_duplex_session
;
thread
=
start_listener
(
&
info
);
test_duplex_session
(
&
info
);
WaitForSingleObject
(
thread
,
3000
);
CloseHandle
(
thread
);
info
.
type
=
WS_CHANNEL_TYPE_DUPLEX
;
info
.
binding
=
WS_UDP_CHANNEL_BINDING
;
info
.
test_func
=
client_accept_channel
;
thread
=
start_listener
(
&
info
);
test_WsAcceptChannel
(
&
info
);
WaitForSingleObject
(
thread
,
3000
);
CloseHandle
(
thread
);
info
.
type
=
WS_CHANNEL_TYPE_DUPLEX_SESSION
;
info
.
binding
=
WS_TCP_CHANNEL_BINDING
;
thread
=
start_listener
(
&
info
);
test_WsAcceptChannel
(
&
info
);
WaitForSingleObject
(
thread
,
3000
);
CloseHandle
(
thread
);
info
.
port
=
7533
;
info
.
wait
=
CreateEventW
(
NULL
,
0
,
0
,
NULL
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
tests
);
i
++
)
{
info
.
binding
=
tests
[
i
].
binding
;
info
.
type
=
tests
[
i
].
type
;
info
.
server_func
=
tests
[
i
].
server_func
;
thread
=
start_listener
(
&
info
);
tests
[
i
].
client_func
(
&
info
);
WaitForSingleObject
(
thread
,
3000
);
CloseHandle
(
thread
);
}
if
(
firewall_enabled
)
set_firewall
(
APP_REMOVE
);
}
dlls/webservices/webservices.spec
View file @
5a58080a
...
...
@@ -131,7 +131,7 @@
@ stdcall WsRemoveHeader(ptr long ptr)
@ stdcall WsRemoveMappedHeader(ptr ptr ptr)
@ stub WsRemoveNode
@ st
ub WsRequestReply
@ st
dcall WsRequestReply(ptr ptr ptr long ptr long ptr ptr long ptr ptr long ptr ptr)
@ stub WsRequestSecurityToken
@ stdcall WsResetChannel(ptr ptr)
@ stdcall WsResetError(ptr)
...
...
include/webservices.h
View file @
5a58080a
...
...
@@ -1701,6 +1701,9 @@ HRESULT WINAPI WsRemoveCustomHeader(WS_MESSAGE*, const WS_XML_STRING*, const WS_
HRESULT
WINAPI
WsRemoveHeader
(
WS_MESSAGE
*
,
WS_HEADER_TYPE
,
WS_ERROR
*
);
HRESULT
WINAPI
WsRemoveMappedHeader
(
WS_MESSAGE
*
,
const
WS_XML_STRING
*
,
WS_ERROR
*
);
HRESULT
WINAPI
WsRemoveNode
(
const
WS_XML_NODE_POSITION
*
,
WS_ERROR
*
);
HRESULT
WINAPI
WsRequestReply
(
WS_CHANNEL
*
,
WS_MESSAGE
*
,
const
WS_MESSAGE_DESCRIPTION
*
,
WS_WRITE_OPTION
,
const
void
*
,
ULONG
,
WS_MESSAGE
*
,
const
WS_MESSAGE_DESCRIPTION
*
,
WS_READ_OPTION
,
WS_HEAP
*
,
void
*
,
ULONG
,
const
WS_ASYNC_CONTEXT
*
,
WS_ERROR
*
);
HRESULT
WINAPI
WsResetChannel
(
WS_CHANNEL
*
,
WS_ERROR
*
);
HRESULT
WINAPI
WsResetMessage
(
WS_MESSAGE
*
,
WS_ERROR
*
);
HRESULT
WINAPI
WsResetError
(
WS_ERROR
*
);
...
...
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