Skip to content

Commit daf85e3

Browse files
committed
Merge branch 'development' of https://git01.codeplex.com/casablanca into android_locale_disable
2 parents 3d78647 + 0a26843 commit daf85e3

24 files changed

+135
-85
lines changed

Release/include/cpprest/http_listener.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ class http_listener_impl
139139

140140
http_listener_impl()
141141
: m_closed(true)
142+
, m_close_task(pplx::task_from_result())
142143
{
143144
}
144145

@@ -176,6 +177,7 @@ class http_listener_impl
176177

177178
// Used to record that the listener is closed.
178179
bool m_closed;
180+
pplx::task<void> m_close_task;
179181
};
180182

181183
} // namespace details
@@ -315,4 +317,4 @@ class http_listener
315317
} // namespace http
316318
} // namespace web
317319

318-
#endif /* _CASA_HTTP_LISTENER_H */
320+
#endif /* _CASA_HTTP_LISTENER_H */

Release/include/cpprest/interopstream.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ namespace Concurrency { namespace streams {
104104
virtual size_t buffer_size(std::ios_base::openmode direction = std::ios_base::in) const { return 0; }
105105
virtual void set_buffer_size(size_t size, std::ios_base::openmode direction = std::ios_base::in) { return; }
106106

107-
virtual pplx::task<bool> _sync() { return pplx::task_from_result(m_buffer->pubsync() != std::char_traits<_CharType>::eof()); }
107+
virtual pplx::task<bool> _sync() { return pplx::task_from_result(m_buffer->pubsync() == 0); }
108108

109109
virtual pplx::task<int_type> _putc(_CharType ch) { return pplx::task_from_result(m_buffer->sputc(ch)); }
110110
virtual pplx::task<size_t> _putn(const _CharType *ptr, size_t size) { return pplx::task_from_result((size_t)m_buffer->sputn(ptr, size)); }

Release/include/cpprest/streams.h

Lines changed: 29 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -953,18 +953,41 @@ namespace Concurrency { namespace streams
953953
if ( !target.can_write() )
954954
return pplx::task_from_exception<size_t>(std::make_exception_ptr(std::runtime_error("source buffer not set up for input of data")));
955955

956-
// Capture 'buffer' rather than 'helper' here due to VC++ 2010 limitations.
957-
auto buffer = helper()->m_buffer;
956+
auto l_buffer = helper()->m_buffer;
957+
auto l_buf_size = this->buf_size;
958+
std::shared_ptr<_read_helper> l_locals = std::make_shared<_read_helper>();
958959

959-
std::shared_ptr<_read_helper> _locals = std::make_shared<_read_helper>();
960+
auto copy_to_target = [l_locals, target, l_buffer, l_buf_size]() mutable -> pplx::task<bool>
961+
{
962+
// We need to capture these, because the object itself may go away
963+
// before we're done processing the data.
964+
//auto locs = _locals;
965+
//auto trg = target;
966+
967+
return l_buffer.getn(l_locals->outbuf, l_buf_size).then([=](size_t rd) mutable -> pplx::task<bool>
968+
{
969+
if (rd == 0)
970+
return pplx::task_from_result(false);
960971

961-
_dev10_ice_workaround wrkarnd(buffer, target, _locals, buf_size);
972+
// Must be nested to capture rd
973+
return target.putn(l_locals->outbuf, rd).then([target, l_locals, rd](size_t wr) mutable -> pplx::task<bool>
974+
{
975+
l_locals->total += wr;
962976

963-
auto loop = pplx::details::do_while(wrkarnd);
977+
if (rd != wr)
978+
// Number of bytes written is less than number of bytes received.
979+
throw std::runtime_error("failed to write all bytes");
980+
981+
return target.sync().then([]() { return true; });
982+
});
983+
});
984+
};
985+
986+
auto loop = pplx::details::do_while(copy_to_target);
964987

965988
return loop.then([=](bool) mutable -> size_t
966989
{
967-
return _locals->total;
990+
return l_locals->total;
968991
});
969992
}
970993

@@ -1104,48 +1127,6 @@ namespace Concurrency { namespace streams
11041127
}
11051128
};
11061129

1107-
// To workaround a VS 2010 internal compiler error, we have to do our own
1108-
// "lambda" here...
1109-
class _dev10_ice_workaround
1110-
{
1111-
public:
1112-
_dev10_ice_workaround(streams::streambuf<CharType> buffer,
1113-
concurrency::streams::streambuf<CharType> target,
1114-
std::shared_ptr<typename basic_istream::_read_helper> locals,
1115-
size_t buf_size)
1116-
: _buffer(buffer), _target(target), _locals(locals), _buf_size(buf_size)
1117-
{
1118-
}
1119-
pplx::task<bool> operator()()
1120-
{
1121-
// We need to capture these, because the object itself may go away
1122-
// before we're done processing the data.
1123-
auto locs = _locals;
1124-
auto trg = _target;
1125-
1126-
auto after_putn =
1127-
[=](size_t wr) mutable -> bool
1128-
{
1129-
locs->total += wr;
1130-
trg.sync().wait();
1131-
return true;
1132-
};
1133-
1134-
return _buffer.getn(locs->outbuf, buf_size).then(
1135-
[=] (size_t rd) mutable -> pplx::task<bool>
1136-
{
1137-
if ( rd == 0 )
1138-
return pplx::task_from_result(false);
1139-
return trg.putn(locs->outbuf, rd).then(after_putn);
1140-
});
1141-
}
1142-
private:
1143-
size_t _buf_size;
1144-
concurrency::streams::streambuf<CharType> _buffer;
1145-
concurrency::streams::streambuf<CharType> _target;
1146-
std::shared_ptr<typename basic_istream::_read_helper> _locals;
1147-
};
1148-
11491130
std::shared_ptr<details::basic_istream_helper<CharType>> m_helper;
11501131
};
11511132

Release/src/build/casablanca110.vcxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<AdditionalIncludeDirectories>$(CasablancaIncludeDir);$(CasablancaSrcDir)\pch;$(WebsocketppIncludeDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
4444
<PrecompiledHeader>Use</PrecompiledHeader>
4545
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
46-
<AdditionalOptions>-Zm160 %(AdditionalOptions)</AdditionalOptions>
46+
<AdditionalOptions>-Zm160 /bigobj%(AdditionalOptions)</AdditionalOptions>
4747
</ClCompile>
4848
<Link>
4949
<AdditionalDependencies>Winhttp.lib;httpapi.lib;bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>

Release/src/build/casablanca110.winrt.vcxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
<AdditionalIncludeDirectories>$(CasablancaIncludeDir);$(CasablancaSrcDir)\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
4949
<PrecompiledHeader>Use</PrecompiledHeader>
5050
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
51-
<AdditionalOptions>-Zm250 %(AdditionalOptions)</AdditionalOptions>
51+
<AdditionalOptions>-Zm250 /bigobj %(AdditionalOptions)</AdditionalOptions>
5252
</ClCompile>
5353
<Link>
5454
<AdditionalDependencies>msxml6.lib;kernel32.lib;user32.lib;%(AdditionalDependencies)</AdditionalDependencies>

Release/src/build/casablanca110.xp.vcxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<AdditionalIncludeDirectories>$(CasablancaIncludeDir);$(CasablancaSrcDir)\pch;$(WebsocketppIncludeDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
4444
<PrecompiledHeader>Use</PrecompiledHeader>
4545
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
46-
<AdditionalOptions>-Zm160 %(AdditionalOptions)</AdditionalOptions>
46+
<AdditionalOptions>-Zm160 /bigobj %(AdditionalOptions)</AdditionalOptions>
4747
</ClCompile>
4848
<Link>
4949
<AdditionalDependencies>Kernel32.lib;Winhttp.lib;httpapi.lib;bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>

Release/src/build/casablanca120.vcxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
<AdditionalIncludeDirectories>$(CasablancaIncludeDir);$(CasablancaSrcDir)\pch;$(WebsocketppIncludeDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
4343
<PrecompiledHeader>Use</PrecompiledHeader>
4444
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
45-
<AdditionalOptions>-Zm160 %(AdditionalOptions)</AdditionalOptions>
45+
<AdditionalOptions>-Zm160 /bigobj %(AdditionalOptions)</AdditionalOptions>
4646
</ClCompile>
4747
<Link>
4848
<AdditionalDependencies>Winhttp.lib;httpapi.lib;bcrypt.lib;crypt32.lib;%(AdditionalDependencies)</AdditionalDependencies>

Release/src/build/casablanca120.winrt.vcxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<AdditionalIncludeDirectories>$(CasablancaIncludeDir);$(CasablancaSrcDir)\pch;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
4444
<PrecompiledHeader>Use</PrecompiledHeader>
4545
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
46-
<AdditionalOptions>-Zm250 %(AdditionalOptions)</AdditionalOptions>
46+
<AdditionalOptions>-Zm250 /bigobj %(AdditionalOptions)</AdditionalOptions>
4747
</ClCompile>
4848
<Link>
4949
<AdditionalDependencies>msxml6.lib;kernel32.lib;user32.lib;%(AdditionalDependencies)</AdditionalDependencies>

Release/src/build/casablanca120.xp.vcxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<AdditionalIncludeDirectories>$(CasablancaIncludeDir);$(CasablancaSrcDir)\pch;$(WebsocketppIncludeDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
4141
<PrecompiledHeader>Use</PrecompiledHeader>
4242
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
43-
<AdditionalOptions>-Zm160 %(AdditionalOptions)</AdditionalOptions>
43+
<AdditionalOptions>-Zm160 /bigobj %(AdditionalOptions)</AdditionalOptions>
4444
</ClCompile>
4545
<Link>
4646
<AdditionalDependencies>Winhttp.lib;httpapi.lib;crypt32.lib;%(AdditionalDependencies)</AdditionalDependencies>

Release/src/http/listener/http_listener.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ pplx::task<void> details::http_listener_impl::close()
131131
{
132132
// Do nothing if the close operation was already attempted
133133
// Not thread safe.
134-
if (m_closed) return pplx::task_from_result();
134+
// Note: Return the previous close task
135+
if (m_closed) return m_close_task;
135136

136137
m_closed = true;
137-
return web::http::experimental::details::http_server_api::unregister_listener(this);
138+
m_close_task = web::http::experimental::details::http_server_api::unregister_listener(this);
139+
return m_close_task;
138140
}
139141

140142
void details::http_listener_impl::handle_request(http_request msg)

0 commit comments

Comments
 (0)