[Gauche-devel-jp] Re: IMAP4クライアント用のモジュールを作ってみました

Back to archive index

Shiino Yuki shiin****@be*****
2006年 1月 3日 (火) 20:26:23 JST


 椎野です。

 以前投稿したコードにバグを発見したので、その修正版を再投稿します。
socket-input-port に :buffering :full を指定すれば
read-block は指定したバイト数のデータを必ず読み込んでくれる、と
勘違いしていました。
 read-blockは指定したバイト数のデータを読み込むとは限らないことを
考慮して、読み込んだデータが指定バイト数より少ない場合には、
続きのデータを読み込むように実装を修正しました。
 修正箇所は recv-literal メソッドのみです。

shell> diff -Naur  rfc/imap4.scm.old rfc/imap4.scm
--- rfc/imap4.scm.old	2005-11-19 19:28:16.000000000 +0900
+++ rfc/imap4.scm	2006-01-01 21:05:07.000000000 +0900
@@ -416,10 +416,16 @@
 	line))
 
 (define-method recv-literal ((self <imap4>) num-of-bytes)
-  (let ((literal
-		 (read-block num-of-bytes (input-port-of self :buffering :full))))
-	((imap4-input-logger self) literal)
-	literal))
+  (let ((literal (make-u8vector num-of-bytes)))
+	(let loop ((nbytes 0))
+	  (if (< nbytes num-of-bytes)
+		  (let ((n (read-block! literal (input-port-of self :buffering :full) nbytes)))
+			(when (eof-object? n)
+				  (error <imap4-error> "unexpected eof in literal."))
+			(loop (+ nbytes n)))
+		  (let ((str (u8vector->string literal)))
+			((imap4-input-logger self) str)
+			str)))))
 
 (define-method recv-resp ((self <imap4>) . expecteds)
   (define (search-match index expecteds line)

-- 
  椎野 裕樹

-------------- next part --------------
文字コード指定の無い添付文書を保管しました...
名前: imap4.scm
下載 


Gauche-devel-jp メーリングリストの案内
Back to archive index