#include <WriteFiles.h>
Базовые классы:TagHandler< TagIQ >.
Открытые члены | |
| WriteFiles () | |
| void | handleTag (TagIQ &tag) |
| virtual | ~WriteFiles () |
| WriteFiles (Protocol &protocol, ServerConfig *sc, BinaryProtocol *bp) | |
Закрытые данные | |
| Protocol * | protocol |
| ServerConfig * | sc |
| BinaryProtocol * | bp |
| size_t | max_readsize |
См. определение в файле WriteFiles.h строка 20
| WriteFiles::WriteFiles | ( | ) |
См. определение в файле WriteFiles.cpp строка 220
| WriteFiles::~WriteFiles | ( | ) | [virtual] |
| WriteFiles::WriteFiles | ( | Protocol & | protocol, | |
| ServerConfig * | sc, | |||
| BinaryProtocol * | bp | |||
| ) |
| void WriteFiles::handleTag | ( | TagIQ & | tag | ) | [virtual] |
ifdef debug_output cout << "OK, sending file data" << endl; endif TODO нечать передачу по бинарному протоколу Максимальный размер который можно с диска прочитать за раз size_t max_readSize = 4096000; Размер яитаемый за раз, если он больше максимального, присвоить максимальный size_t rzize = szforread; if (rzize > max_readsize) { rzize = max_readsize; }
Выделяем буфер для чтения за раз void* buf = malloc(rzize); Перемещаем на нужное место указатель в файле lseek(fDesc, offset, SEEK_SET);
Сколько надо всего прочитать size_t rzizeall = szforread; while (rzizeall > 0) { Текущая позиция в буфере char* buf1 = (char*) buf; ssize_t sr = 0; //Результат чтения за под раз ssize_t sr1 = rzize; //сколько нужно прочесть за раз do {//Читаем по подразу пока не прочтем за раз ifdef debug_output cout << "цикл1" << endl; endif sr = read(fDesc, buf1, sr1); if (sr != -1) { sr1 -= sr; buf1 += sr; } } while ((sr1 > 0) && (sr > 0)); отправлеяем пакет который прочли за раз Сколько нужно прочесть - сколько прочесть не вышло bp->setSendBufferData(buf, rzize - sr1, pktID); rzizeall -= (rzize - sr1); ifdef debug_output cout << "sr1" << sr1 << endl; endif if (sr == -1) { cout << "ОШИБКА ЧТЕНИЯ!" << errno << endl; Если была ошибка чтения то нужно прервать чтение break; } if (sr == 0) { cout << "Конец файла!" << endl; break; } ifdef debug_output cout << "цикл2" << endl; endif } free(buf); } else { cout << "!!Нет ответа от клиента о подетверждении передачи содержимого!!!!" << endl; } } close(fDesc); ifdef debug_output cout << "STEPFINAL read" << endl; endif
Замещает TagHandler< TagIQ >.
См. определение в файле WriteFiles.cpp строка 20

BinaryProtocol* WriteFiles::bp [private] |
См. определение в файле WriteFiles.h строка 24
size_t WriteFiles::max_readsize [private] |
См. определение в файле WriteFiles.h строка 25
Protocol* WriteFiles::protocol [private] |
См. определение в файле WriteFiles.h строка 22
ServerConfig* WriteFiles::sc [private] |
См. определение в файле WriteFiles.h строка 23
1.7.1