bittorrent: Fix mojibake introduced in parsing arai2c progress output.

hGetSomeString reads one byte at a time, so unicode bytes are not composed.
The problem comes when outputting that to the console with hPut; that
tried to apply the handle's encoding, and so we get mojibake.

Instead, use ByteStrings, and only convert it to a string for parsing, not
for display.

Note that there are a couple of other things that use hGetSomeString,
which I've left as-is for now.
This commit is contained in:
Joey Hess 2015-02-10 12:34:34 -04:00
parent b80a434685
commit a787cead35
4 changed files with 23 additions and 4 deletions

View file

@ -1,6 +1,6 @@
{- Metered IO
-
- Copyright 2012, 2013 Joey Hess <id@joeyh.name>
- Copyright 2012-2105 Joey Hess <id@joeyh.name>
-
- License: BSD-2-clause
-}
@ -17,6 +17,7 @@ import System.IO.Unsafe
import Foreign.Storable (Storable(sizeOf))
import System.Posix.Types
import Data.Int
import Data.Bits.Utils
{- An action that can be run repeatedly, updating it on the bytes processed.
-
@ -163,12 +164,13 @@ commandMeter progressparser meterupdate cmd params = liftIO $ catchBoolIO $
p = proc cmd (toCommand params)
feedprogress prev buf h = do
s <- hGetSomeString h 80
if null s
b <- S.hGetSome h 80
if S.null b
then return True
else do
putStr s
S.hPut stdout b
hFlush stdout
let s = w82s (S.unpack b)
let (mbytes, buf') = progressparser (buf++s)
case mbytes of
Nothing -> feedprogress prev buf' h