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
81d25164
Commit
81d25164
authored
May 16, 2014
by
Nikolay Sivov
Committed by
Alexandre Julliard
May 16, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
xmllite/writer: Fix Flush() behaviour on partial writes.
parent
f54e8527
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
93 additions
and
18 deletions
+93
-18
writer.c
dlls/xmllite/tests/writer.c
+78
-0
writer.c
dlls/xmllite/writer.c
+15
-18
No files found.
dlls/xmllite/tests/writer.c
View file @
81d25164
...
@@ -67,6 +67,53 @@ static const IUnknownVtbl testoutputvtbl = {
...
@@ -67,6 +67,53 @@ static const IUnknownVtbl testoutputvtbl = {
static
IUnknown
testoutput
=
{
&
testoutputvtbl
};
static
IUnknown
testoutput
=
{
&
testoutputvtbl
};
static
HRESULT
WINAPI
teststream_QueryInterface
(
ISequentialStream
*
iface
,
REFIID
riid
,
void
**
obj
)
{
if
(
IsEqualIID
(
riid
,
&
IID_IUnknown
)
||
IsEqualIID
(
riid
,
&
IID_ISequentialStream
))
{
*
obj
=
iface
;
return
S_OK
;
}
*
obj
=
NULL
;
return
E_NOINTERFACE
;
}
static
ULONG
WINAPI
teststream_AddRef
(
ISequentialStream
*
iface
)
{
return
2
;
}
static
ULONG
WINAPI
teststream_Release
(
ISequentialStream
*
iface
)
{
return
1
;
}
static
HRESULT
WINAPI
teststream_Read
(
ISequentialStream
*
iface
,
void
*
pv
,
ULONG
cb
,
ULONG
*
pread
)
{
ok
(
0
,
"unexpected call
\n
"
);
return
E_NOTIMPL
;
}
static
ULONG
g_write_len
;
static
HRESULT
WINAPI
teststream_Write
(
ISequentialStream
*
iface
,
const
void
*
pv
,
ULONG
cb
,
ULONG
*
written
)
{
g_write_len
=
cb
;
*
written
=
cb
;
return
S_OK
;
}
static
const
ISequentialStreamVtbl
teststreamvtbl
=
{
teststream_QueryInterface
,
teststream_AddRef
,
teststream_Release
,
teststream_Read
,
teststream_Write
};
static
ISequentialStream
teststream
=
{
&
teststreamvtbl
};
static
void
test_writer_create
(
void
)
static
void
test_writer_create
(
void
)
{
{
HRESULT
hr
;
HRESULT
hr
;
...
@@ -235,6 +282,36 @@ static void test_writestartdocument(void)
...
@@ -235,6 +282,36 @@ static void test_writestartdocument(void)
IXmlWriter_Release
(
writer
);
IXmlWriter_Release
(
writer
);
}
}
static
void
test_flush
(
void
)
{
IXmlWriter
*
writer
;
HRESULT
hr
;
hr
=
pCreateXmlWriter
(
&
IID_IXmlWriter
,
(
void
**
)
&
writer
,
NULL
);
ok
(
hr
==
S_OK
,
"Expected S_OK, got %08x
\n
"
,
hr
);
hr
=
IXmlWriter_SetOutput
(
writer
,
(
IUnknown
*
)
&
teststream
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
hr
=
IXmlWriter_WriteStartDocument
(
writer
,
XmlStandalone_Yes
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
g_write_len
=
0
;
hr
=
IXmlWriter_Flush
(
writer
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
ok
(
g_write_len
>
0
,
"got %d
\n
"
,
g_write_len
);
g_write_len
=
1
;
hr
=
IXmlWriter_Flush
(
writer
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
ok
(
g_write_len
==
0
,
"got %d
\n
"
,
g_write_len
);
/* Release() flushes too */
g_write_len
=
1
;
IXmlWriter_Release
(
writer
);
ok
(
g_write_len
==
0
,
"got %d
\n
"
,
g_write_len
);
}
START_TEST
(
writer
)
START_TEST
(
writer
)
{
{
if
(
!
init_pointers
())
if
(
!
init_pointers
())
...
@@ -243,4 +320,5 @@ START_TEST(writer)
...
@@ -243,4 +320,5 @@ START_TEST(writer)
test_writer_create
();
test_writer_create
();
test_writeroutput
();
test_writeroutput
();
test_writestartdocument
();
test_writestartdocument
();
test_flush
();
}
}
dlls/xmllite/writer.c
View file @
81d25164
...
@@ -63,7 +63,6 @@ typedef struct
...
@@ -63,7 +63,6 @@ typedef struct
IMalloc
*
imalloc
;
IMalloc
*
imalloc
;
xml_encoding
encoding
;
xml_encoding
encoding
;
struct
output_buffer
buffer
;
struct
output_buffer
buffer
;
ULONG
stream_written
;
}
xmlwriteroutput
;
}
xmlwriteroutput
;
static
const
struct
IUnknownVtbl
xmlwriteroutputvtbl
;
static
const
struct
IUnknownVtbl
xmlwriteroutputvtbl
;
...
@@ -225,11 +224,6 @@ static HRESULT write_output_buffer_quoted(xmlwriteroutput *output, const WCHAR *
...
@@ -225,11 +224,6 @@ static HRESULT write_output_buffer_quoted(xmlwriteroutput *output, const WCHAR *
return
S_OK
;
return
S_OK
;
}
}
static
inline
void
reset_output_buffer
(
xmlwriteroutput
*
output
)
{
output
->
stream_written
=
0
;
}
static
void
writeroutput_release_stream
(
xmlwriteroutput
*
writeroutput
)
static
void
writeroutput_release_stream
(
xmlwriteroutput
*
writeroutput
)
{
{
if
(
writeroutput
->
stream
)
{
if
(
writeroutput
->
stream
)
{
...
@@ -253,7 +247,7 @@ static inline HRESULT writeroutput_query_for_stream(xmlwriteroutput *writeroutpu
...
@@ -253,7 +247,7 @@ static inline HRESULT writeroutput_query_for_stream(xmlwriteroutput *writeroutpu
static
HRESULT
writeroutput_flush_stream
(
xmlwriteroutput
*
output
)
static
HRESULT
writeroutput_flush_stream
(
xmlwriteroutput
*
output
)
{
{
struct
output_buffer
*
buffer
;
struct
output_buffer
*
buffer
;
ULONG
written
=
0
,
len
;
ULONG
written
,
offset
=
0
;
HRESULT
hr
;
HRESULT
hr
;
if
(
!
output
||
!
output
->
stream
)
if
(
!
output
||
!
output
->
stream
)
...
@@ -261,17 +255,20 @@ static HRESULT writeroutput_flush_stream(xmlwriteroutput *output)
...
@@ -261,17 +255,20 @@ static HRESULT writeroutput_flush_stream(xmlwriteroutput *output)
buffer
=
&
output
->
buffer
;
buffer
=
&
output
->
buffer
;
len
=
buffer
->
written
-
output
->
stream_written
;
/* It will loop forever until everything is written or an error occured. */
if
(
!
len
)
do
{
return
S_OK
;
written
=
0
;
hr
=
ISequentialStream_Write
(
output
->
stream
,
buffer
->
data
+
offset
,
buffer
->
written
,
&
written
);
if
(
FAILED
(
hr
))
{
WARN
(
"write to stream failed (0x%08x)
\n
"
,
hr
);
buffer
->
written
=
0
;
return
hr
;
}
hr
=
ISequentialStream_Write
(
output
->
stream
,
buffer
->
data
+
output
->
stream_written
,
len
,
&
written
);
offset
+=
written
;
if
(
FAILED
(
hr
))
{
buffer
->
written
-=
written
;
WARN
(
"write to stream failed (0x%08x)
\n
"
,
hr
);
}
while
(
buffer
->
written
>
0
);
return
hr
;
}
output
->
stream_written
+=
written
;
return
S_OK
;
return
S_OK
;
}
}
...
@@ -309,6 +306,8 @@ static ULONG WINAPI xmlwriter_Release(IXmlWriter *iface)
...
@@ -309,6 +306,8 @@ static ULONG WINAPI xmlwriter_Release(IXmlWriter *iface)
ref
=
InterlockedDecrement
(
&
This
->
ref
);
ref
=
InterlockedDecrement
(
&
This
->
ref
);
if
(
ref
==
0
)
{
if
(
ref
==
0
)
{
IMalloc
*
imalloc
=
This
->
imalloc
;
IMalloc
*
imalloc
=
This
->
imalloc
;
IXmlWriter_Flush
(
iface
);
if
(
This
->
output
)
IUnknown_Release
(
&
This
->
output
->
IXmlWriterOutput_iface
);
if
(
This
->
output
)
IUnknown_Release
(
&
This
->
output
->
IXmlWriterOutput_iface
);
writer_free
(
This
,
This
);
writer_free
(
This
,
This
);
if
(
imalloc
)
IMalloc_Release
(
imalloc
);
if
(
imalloc
)
IMalloc_Release
(
imalloc
);
...
@@ -327,7 +326,6 @@ static HRESULT WINAPI xmlwriter_SetOutput(IXmlWriter *iface, IUnknown *output)
...
@@ -327,7 +326,6 @@ static HRESULT WINAPI xmlwriter_SetOutput(IXmlWriter *iface, IUnknown *output)
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
output
);
TRACE
(
"(%p)->(%p)
\n
"
,
This
,
output
);
if
(
This
->
output
)
{
if
(
This
->
output
)
{
reset_output_buffer
(
This
->
output
);
writeroutput_release_stream
(
This
->
output
);
writeroutput_release_stream
(
This
->
output
);
IUnknown_Release
(
&
This
->
output
->
IXmlWriterOutput_iface
);
IUnknown_Release
(
&
This
->
output
->
IXmlWriterOutput_iface
);
This
->
output
=
NULL
;
This
->
output
=
NULL
;
...
@@ -858,7 +856,6 @@ HRESULT WINAPI CreateXmlWriterOutputWithEncodingName(IUnknown *stream,
...
@@ -858,7 +856,6 @@ HRESULT WINAPI CreateXmlWriterOutputWithEncodingName(IUnknown *stream,
if
(
imalloc
)
IMalloc_AddRef
(
imalloc
);
if
(
imalloc
)
IMalloc_AddRef
(
imalloc
);
writeroutput
->
encoding
=
parse_encoding_name
(
encoding
?
encoding
:
utf8W
,
-
1
);
writeroutput
->
encoding
=
parse_encoding_name
(
encoding
?
encoding
:
utf8W
,
-
1
);
writeroutput
->
stream
=
NULL
;
writeroutput
->
stream
=
NULL
;
writeroutput
->
stream_written
=
0
;
hr
=
init_output_buffer
(
writeroutput
);
hr
=
init_output_buffer
(
writeroutput
);
if
(
FAILED
(
hr
))
{
if
(
FAILED
(
hr
))
{
IUnknown_Release
(
&
writeroutput
->
IXmlWriterOutput_iface
);
IUnknown_Release
(
&
writeroutput
->
IXmlWriterOutput_iface
);
...
...
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