送信/受信バッファサイズを考慮して送信するようにした
@@ -63,10 +63,6 @@ | ||
63 | 63 | // |
64 | 64 | PComVar cv_; |
65 | 65 | BOOL pause; |
66 | - const BYTE *send_out_retry_ptr; | |
67 | - size_t send_out_retry_len; | |
68 | - const BYTE *send_echo_retry_ptr; | |
69 | - size_t send_echo_retry_len; | |
70 | 66 | } SendMem; |
71 | 67 | |
72 | 68 | typedef SendMem sendmem_work_t; |
@@ -146,9 +142,6 @@ | ||
146 | 142 | |
147 | 143 | p->send_left = p->send_len; |
148 | 144 | p->send_index = 0; |
149 | - p->send_out_retry_ptr = NULL; | |
150 | - p->send_echo_retry_ptr = NULL; | |
151 | - | |
152 | 145 | p->waited = FALSE; |
153 | 146 | p->pause = FALSE; |
154 | 147 |
@@ -172,6 +165,26 @@ | ||
172 | 165 | EnableWindow(HVTWin, FALSE); |
173 | 166 | } |
174 | 167 | |
168 | +static void GetOutBuffInfo(const TComVar *cv_, size_t *use, size_t *free) | |
169 | +{ | |
170 | + if (use != NULL) { | |
171 | + *use = cv_->OutBuffCount; | |
172 | + } | |
173 | + if (free != NULL) { | |
174 | + *free = OutBuffSize - cv_->InBuffCount; | |
175 | + } | |
176 | +} | |
177 | + | |
178 | +static void GetInBuffInfo(const TComVar *cv_, size_t *use, size_t *free) | |
179 | +{ | |
180 | + if (use != NULL) { | |
181 | + *use = cv_->InBuffCount; | |
182 | + } | |
183 | + if (free != NULL) { | |
184 | + *free = InBuffSize - cv_->InBuffCount; | |
185 | + } | |
186 | +} | |
187 | + | |
175 | 188 | /** |
176 | 189 | * 送信 |
177 | 190 | */ |
@@ -196,144 +209,118 @@ | ||
196 | 209 | } |
197 | 210 | } |
198 | 211 | |
199 | - // 送信バッファ(echo)できなかった分を再送 | |
200 | - int r; | |
201 | - size_t sended_size = 0; | |
202 | - if (p->send_out_retry_ptr != NULL) { | |
203 | - if (p->type == SendMemTypeBinary) { | |
204 | - r = CommBinaryBuffOut(p->cv_, (PCHAR)p->send_out_retry_ptr, (int)p->send_out_retry_len); | |
212 | + // 終端? | |
213 | + if (p->send_left == 0) { | |
214 | + // 終了, 送信バッファが空になるまで待つ | |
215 | + size_t out_buff_use; | |
216 | + GetOutBuffInfo(p->cv_, &out_buff_use, NULL); | |
217 | + | |
218 | + if (p->dlg != NULL) { | |
219 | + p->dlg->RefreshNum(p->send_index, p->send_len - out_buff_use); | |
205 | 220 | } |
206 | - else { | |
207 | - // text (not binary) | |
208 | - r = CommTextOutW(p->cv_, (wchar_t *)p->send_out_retry_ptr, (int)(p->send_out_retry_len / sizeof(wchar_t))); | |
209 | - r *= sizeof(wchar_t); | |
221 | + | |
222 | + if (out_buff_use == 0) { | |
223 | + // 送信バッファも空になった | |
224 | + EndPaste(); | |
225 | + return; | |
210 | 226 | } |
211 | - sended_size = r; | |
212 | - p->send_out_retry_len -= r; | |
213 | - if (p->send_out_retry_len == 0) { | |
214 | - p->send_out_retry_ptr = NULL; | |
215 | - } | |
216 | - else { | |
217 | - p->send_out_retry_ptr += r; | |
218 | - } | |
219 | 227 | } |
220 | - if (p->send_echo_retry_ptr != NULL) { | |
221 | - size_t echo_size = sended_size < p->send_echo_retry_len ? sended_size : p->send_echo_retry_len; | |
222 | - if (p->type == SendMemTypeBinary) { | |
223 | - r = CommTextEcho(p->cv_, (PCHAR)p->send_echo_retry_ptr, (int)echo_size); | |
228 | + | |
229 | + // 送信できるバッファサイズ | |
230 | + size_t buff_len; | |
231 | + { | |
232 | + size_t out_buff_free; | |
233 | + GetOutBuffInfo(p->cv_, NULL, &out_buff_free); | |
234 | + buff_len = out_buff_free; | |
235 | + if (p->local_echo_enable) { | |
236 | + // ローカルエコーが必要な場合は、入力バッファも考慮 | |
237 | + size_t in_buff_free; | |
238 | + GetInBuffInfo(p->cv_, NULL, &in_buff_free); | |
239 | + if (buff_len > in_buff_free) { | |
240 | + buff_len = in_buff_free; | |
241 | + } | |
224 | 242 | } |
225 | - else { | |
226 | - r = CommTextEchoW(p->cv_, (wchar_t *)p->send_echo_retry_ptr, (int)(echo_size / sizeof(wchar_t))); | |
227 | - r *= sizeof(wchar_t); | |
228 | - } | |
229 | - p->send_echo_retry_len -= r; | |
230 | - if (p->send_echo_retry_len == 0) { | |
231 | - p->send_echo_retry_ptr = NULL; | |
232 | - } | |
233 | - else { | |
234 | - p->send_echo_retry_ptr += r; | |
235 | - } | |
236 | 243 | } |
237 | - if (p->send_out_retry_ptr != NULL || p->send_echo_retry_ptr != NULL) { | |
238 | - // まだ全部送信できていない | |
244 | + if (buff_len == 0) { | |
245 | + // バッファに空きがない | |
239 | 246 | return; |
240 | 247 | } |
241 | 248 | |
242 | - // 送信 | |
243 | - for (;;) { | |
244 | - // 終端? | |
245 | - if (p->send_left == 0) { | |
246 | - // 終了 | |
247 | - EndPaste(); | |
248 | - return; | |
249 | + // 送信長 | |
250 | + BOOL need_delay = FALSE; | |
251 | + size_t send_len; | |
252 | + if (p->delay_per_char > 0) { | |
253 | + // 1キャラクタ送信 | |
254 | + need_delay = TRUE; | |
255 | + if (p->type == SendMemTypeBinary) { | |
256 | + send_len = 1; | |
249 | 257 | } |
250 | - | |
251 | - // 送信長 | |
252 | - BOOL need_delay = FALSE; | |
253 | - size_t send_len; | |
254 | - if (p->delay_per_char > 0) { | |
255 | - // 1キャラクタ送信 | |
256 | - need_delay = TRUE; | |
257 | - if (p->type == SendMemTypeBinary) { | |
258 | - send_len = 1; | |
259 | - } | |
260 | - else { | |
261 | - send_len = sizeof(wchar_t); | |
262 | - } | |
258 | + else { | |
259 | + send_len = sizeof(wchar_t); | |
263 | 260 | } |
264 | - else if (p->delay_per_line > 0) { | |
265 | - // 1ライン送信 | |
266 | - need_delay = TRUE; | |
261 | + } | |
262 | + else if (p->delay_per_line > 0) { | |
263 | + // 1ライン送信 | |
264 | + need_delay = TRUE; | |
267 | 265 | |
268 | - // 1行取り出し(改行コードは 0x0a に正規化されている) | |
269 | - const wchar_t *line_top = (wchar_t *)&p->send_ptr[p->send_index]; | |
270 | - const wchar_t *line_end = wcschr(line_top, 0x0a); | |
271 | - if (line_end != NULL) { | |
272 | - // 0x0a まで送信 | |
273 | - send_len = ((line_end - line_top) + 1) * sizeof(wchar_t); | |
274 | - } | |
275 | - else { | |
276 | - // 改行見つからず、最後まで送信 | |
277 | - send_len = p->send_left; | |
278 | - } | |
266 | + // 1行取り出し(改行コードは 0x0a に正規化されている) | |
267 | + const wchar_t *line_top = (wchar_t *)&p->send_ptr[p->send_index]; | |
268 | + const wchar_t *line_end = wcschr(line_top, 0x0a); | |
269 | + if (line_end != NULL) { | |
270 | + // 0x0a まで送信 | |
271 | + send_len = ((line_end - line_top) + 1) * sizeof(wchar_t); | |
279 | 272 | } |
280 | 273 | else { |
281 | - // 全力送信 | |
274 | + // 改行見つからず、最後まで送信 | |
282 | 275 | send_len = p->send_left; |
283 | 276 | } |
284 | 277 | |
285 | - // 送信する | |
286 | - const BYTE *send_ptr = (BYTE *)&p->send_ptr[p->send_index]; | |
287 | - p->send_index += send_len; | |
288 | - p->send_left -= send_len; | |
289 | - size_t sended_len; | |
290 | - if (p->type == SendMemTypeBinary) { | |
291 | - sended_len = CommBinaryBuffOut(p->cv_, (PCHAR)send_ptr, (int)send_len); | |
278 | + // 送信できない | |
279 | + if (buff_len < send_len) { | |
280 | + return; | |
292 | 281 | } |
293 | - else { | |
294 | - sended_len = CommTextOutW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t))); | |
295 | - sended_len *= sizeof(wchar_t); | |
282 | + } | |
283 | + else { | |
284 | + // 全力送信 | |
285 | + send_len = p->send_left; | |
286 | + if (buff_len < send_len) { | |
287 | + send_len = buff_len; | |
296 | 288 | } |
297 | - if ((sended_len != 0) && (p->local_echo_enable)) { | |
298 | - // 送信できた分echoする | |
299 | - size_t echo_len = sended_len; | |
300 | - size_t echoed_len; | |
301 | - if (p->type == SendMemTypeBinary) { | |
302 | - echoed_len = CommTextEcho(p->cv_, (PCHAR)send_ptr, (int)echo_len); | |
303 | - } | |
304 | - else { | |
305 | - echoed_len = CommTextEchoW(p->cv_, (wchar_t *)send_ptr, (int)(echo_len / sizeof(wchar_t))); | |
306 | - sended_len *= sizeof(wchar_t); | |
307 | - } | |
308 | - if (echoed_len != echo_len) { | |
309 | - p->send_out_retry_ptr = send_ptr + echoed_len; | |
310 | - p->send_out_retry_len = echo_len - echoed_len; | |
311 | - } | |
289 | + } | |
290 | + | |
291 | + // 送信する | |
292 | + const BYTE *send_ptr = (BYTE *)&p->send_ptr[p->send_index]; | |
293 | + p->send_index += send_len; | |
294 | + p->send_left -= send_len; | |
295 | + size_t sended_len; | |
296 | + if (p->type == SendMemTypeBinary) { | |
297 | + sended_len = CommBinaryBuffOut(p->cv_, (PCHAR)send_ptr, (int)send_len); | |
298 | + if (p->local_echo_enable) { | |
299 | + CommTextEcho(p->cv_, (PCHAR)send_ptr, (int)send_len); | |
312 | 300 | } |
313 | - if (sended_len < send_len) { | |
314 | - // すべて送信できなかった | |
315 | - p->send_out_retry_ptr = send_ptr + sended_len; | |
316 | - p->send_out_retry_len = send_len - sended_len; | |
301 | + } | |
302 | + else { | |
303 | + sended_len = CommTextOutW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t))); | |
304 | + if (p->local_echo_enable) { | |
305 | + CommTextEchoW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t))); | |
317 | 306 | } |
318 | - if (p->send_out_retry_ptr != NULL || p->send_echo_retry_ptr != NULL) { | |
319 | - // 出力できなくなった(出力バッファがいっぱい?) | |
320 | - return; | |
321 | - } | |
307 | + sended_len *= sizeof(wchar_t); | |
308 | + } | |
322 | 309 | |
323 | - // ダイアログ更新 | |
324 | - if (p->dlg != NULL) { | |
325 | - p->dlg->RefreshNum(p->send_index, p->send_len); | |
326 | - } | |
310 | + // ダイアログ更新 | |
311 | + if (p->dlg != NULL) { | |
312 | + size_t out_buff_use; | |
313 | + GetOutBuffInfo(p->cv_, &out_buff_use, NULL); | |
314 | + p->dlg->RefreshNum(p->send_index - out_buff_use, p->send_len); | |
315 | + } | |
327 | 316 | |
328 | - if (need_delay) { | |
329 | - // waitに入る | |
330 | - p->waited = TRUE; | |
331 | - p->last_send_tick = GetTickCount(); | |
332 | - // タイマーはidleを動作させるために使用している | |
333 | - const DWORD delay = p->delay_per_line > 0 ? p->delay_per_line : p->delay_per_char; | |
334 | - SetTimer(p->hWnd, p->timer_id, delay, NULL); | |
335 | - break; | |
336 | - } | |
317 | + if (need_delay) { | |
318 | + // waitに入る | |
319 | + p->waited = TRUE; | |
320 | + p->last_send_tick = GetTickCount(); | |
321 | + // タイマーはidleを動作させるために使用している | |
322 | + const DWORD delay = p->delay_per_line > 0 ? p->delay_per_line : p->delay_per_char; | |
323 | + SetTimer(p->hWnd, p->timer_id, delay, NULL); | |
337 | 324 | } |
338 | 325 | } |
339 | 326 |