[Bug 34681] Prime World launcher usually stops downloading (Update failed)
wine-bugs at winehq.org
wine-bugs at winehq.org
Sun Nov 10 13:00:56 CST 2013
http://bugs.winehq.org/show_bug.cgi?id=34681
Anastasius Focht <focht at gmx.net> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |download
Status|UNCONFIRMED |NEW
URL| |http://updates.playpw.com/P
| |WSetup.exe
CC| |focht at gmx.net
Ever Confirmed|0 |1
--- Comment #4 from Anastasius Focht <focht at gmx.net> 2013-11-10 13:00:56 CST ---
Hello folks,
confirming.
The game launcher makes heavy use of QT 4.8.x Network library and Boost C++
library (threading, signals, ...).
Fortunately the game is very verbose in what it does, write log files and uses
OutputDebugString().
Launcher output when the problem occurs:
--- snip ---
.\Net\Detail\HttpImpl.cpp(274): Throw in function void __thiscall
Net::Detail::HttpImpl::OnFinished(class QNetworkReply *)
Dynamic exception type: class boost::exception_detail::clone_impl<class
Net::HttpError>
std::exception::what: HTTP Error: #2, Connection closed (200), url:
http://cdn.en.playpw.com/updates/PC/en-US/Client/Client/patches/00000_00010/00000_00010.patch.001
--- snip ---
Relevant part of trace log with +winsock:
--- snip ---
...
003a:trace:winsock:WS2_recv_base socket 06a8, wsabuf 0xa56c4fc, nbufs 1, flags
0, from (nil), fromlen -1, ovl (nil), func (nil)
003a:trace:winsock:WS2_recv_base fd=54, options=0
003a:trace:winsock:WS2_recv_base -> 1001 bytes
003a:trace:winsock:WSAAsyncSelect 6a8, hWnd 0x30086, uMsg 00000400, event
00000029
003a:trace:winsock:WSAIoctl 1704, 0x4004667f, 0xa56c59c, 4, 0xa56c594, 4,
0xa56c598, (nil), (nil)
003a:trace:winsock:WSAAsyncSelect 6a8, hWnd 0x30086, uMsg 00000000, event
00000000
003a:trace:winsock:WSAIoctl 1704, 0x4004667f, 0xa56c620, 4, 0xa56c618, 4,
0xa56c61c, (nil), (nil)
003a:trace:winsock:WSAIoctl 1704, 0x4004667f, 0xa56c580, 4, 0xa56c578, 4,
0xa56c57c, (nil), (nil)
003a:trace:winsock:WSAAsyncSelect 6a8, hWnd 0x30086, uMsg 00000400, event
00000029
003a:trace:winsock:WS2_recv_base socket 06a8, wsabuf 0xa56c554, nbufs 1, flags
0, from (nil), fromlen -1, ovl (nil), func (nil)
003a:trace:winsock:WS2_recv_base fd=54, options=0
003a:trace:winsock:WS2_recv_base -> 0 bytes
003a:trace:winsock:WSAAsyncSelect 6a8, hWnd 0x30086, uMsg 00000000, event
00000000
003a:trace:winsock:WS_closesocket socket 06a8
(http_impl) 13:18:14.687 W: HTTP error: #2: Connection closed, url:
http://cdn.en.playpw.com/updates/PC/en-US/Client/Client/patches/00000_00010/00000_00010.patch.003
0035:warn:debugstr:OutputDebugStringA "(http_impl) 13:18:14.687 W: HTTP error:
#2: Connection closed, url:
http://cdn.en.playpw.com/updates/PC/en-US/Client/Client/patches/00000_00010/00000_00010.patch.003\n"
(http_impl) 13:18:14.687 d: HttpImpl Finished. err: #2, code: 200, url:
http://cdn.en.playpw.com/updates/PC/en-US/Client/Client/patches/00000_00010/00000_00010.patch.003
0035:warn:debugstr:OutputDebugStringA "(http_impl) 13:18:14.687 d: HttpImpl
Finished. err: #2, code: 200, url:
http://cdn.en.playpw.com/updates/PC/en-US/Client/Client/patches/00000_00010/00000_00010.patch.003\n"
--- snip ---
The problem occurs when the connection was closed by server -> bytes read = 0
(not a socket error).
There is a bug entry on QT bugtracker which explains a similar problem for QT's
own QHttpSocketEngine in detail:
https://bugreports.qt-project.org/browse/qtbug-21351
The game implements HTTP protocol handling on its own, on top of Boost C++
classes.
QT C++ network classes are used for low level socket handling.
"HTTP error: #2" is "RemoteHostClosedError":
--- snip ---
class QNetworkReplyPrivate;
class Q_NETWORK_EXPORT QNetworkReply: public QIODevice
{
Q_OBJECT
Q_ENUMS(NetworkError)
public:
enum NetworkError {
NoError = 0,
// network layer errors [relating to the destination server] (1-99):
ConnectionRefusedError = 1,
RemoteHostClosedError,
HostNotFoundError,
TimeoutError,
OperationCanceledError,
SslHandshakeFailedError,
TemporaryNetworkFailureError,
UnknownNetworkError = 99,
--- snip ---
Small launcher code snippet that seems to be responsible for error handling
(annotated):
--- snip ---
...
004ADE68 mov ecx, edi
004ADE6A call ebp ; QNetworkReply::error(void)
004ADE6C test eax, eax
004ADE6E jz loc_4AE00C
004ADE74 mov ecx, edi
004ADE76 call ebp ; QNetworkReply::error(void)
004ADE78 cmp eax, 5 ; OperationCanceledError
004ADE7B jnz 004ADF01
004ADE81 push ... ; "User has aborted the request"
...
004ADFD7 mov ... ; "void __thiscall Net::Detail::HttpImpl::"
004ADFE2 mov ... ; ".\\Net\\Detail\\HttpImpl.cpp"
004ADFED mov ..., 112h ; line number 274
004ADFF8 call throw_cpp_exc ; .\Net\Detail\HttpImpl.cpp(274): Throw in
function void __thiscall Net::Detail::HttpImpl::OnFinished(class QNetworkReply
*)
--- snip ---
Lower layer error codes 0 and 5 are explicitly handled while all others are
generically handled as error (C++ exception thrown).
Anyway, "remote closed" might be a legitimate case and could be handled as
such.
I patched the executable to handle RemoteHostClosedError (#2) more gracefully.
It reduced the error frequency but still encountered situations where some
data/files were too short/corrupted.
Reducing the concurrency by modifying "app.config.xml" in "app" directory
didn't really help, there were still failures.
"Proceed download queue: 0 [max=1]"
--- snip ---
<MaxNumOfSimultaneousDownloads>1</MaxNumOfSimultaneousDownloads>
--- snip ---
One thing to investigate is why "remote closed connection" (bytes read = 0)
doesn't happen with the launcher on Windows (otherwise people would see similar
failure/error propagation).
If this situation could be prevented the launcher might actually succeed at all
downloads.
QT Network code for reference (just to see lower layer socket API usage):
--- snip ---
$ git clone git://gitorious.org/qt/qt.git -b v4.8.3
--- snip ---
$ sha1sum PWSetup.exe
4678e218e4c3d095c9f8075303f6c507e5fd59fd PWSetup.exe
$ du -sh PWSetup.exe
12M PWSetup.exe
$ wine --version
wine-1.7.6-109-g917d303
Regards
--
Configure bugmail: http://bugs.winehq.org/userprefs.cgi?tab=email
Do not reply to this email, post in Bugzilla using the
above URL to reply.
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the wine-bugs
mailing list