| 227 | |
| 228 | |
| 229 | void NetConnection::chunkReceived(U8 *chunkData, U32 chunkLen) |
| 230 | { |
| 231 | if(chunkLen == 0) |
| 232 | { |
| 233 | // the server didn't have the file... apparently it's one we don't need... |
| 234 | dFree(mCurrentFileBuffer); |
| 235 | mCurrentFileBuffer = NULL; |
| 236 | dFree(mMissingFileList[0]); |
| 237 | mMissingFileList.pop_front(); |
| 238 | return; |
| 239 | } |
| 240 | if(chunkLen + mCurrentFileBufferOffset > mCurrentFileBufferSize) |
| 241 | { |
| 242 | setLastError("Invalid file chunk from server."); |
| 243 | return; |
| 244 | } |
| 245 | dMemcpy(((U8 *) mCurrentFileBuffer) + mCurrentFileBufferOffset, chunkData, chunkLen); |
| 246 | mCurrentFileBufferOffset += chunkLen; |
| 247 | if(mCurrentFileBufferOffset == mCurrentFileBufferSize) |
| 248 | { |
| 249 | // this file's done... |
| 250 | // save it to disk: |
| 251 | FileStream *stream; |
| 252 | |
| 253 | Con::printf("Saving file %s.", mMissingFileList[0]); |
| 254 | if((stream = FileStream::createAndOpen( mMissingFileList[0], Torque::FS::File::Write )) == NULL) |
| 255 | { |
| 256 | setLastError("Couldn't open file downloaded by server."); |
| 257 | return; |
| 258 | } |
| 259 | |
| 260 | dFree(mMissingFileList[0]); |
| 261 | mMissingFileList.pop_front(); |
| 262 | stream->write(mCurrentFileBufferSize, mCurrentFileBuffer); |
| 263 | delete stream; |
| 264 | mNumDownloadedFiles++; |
| 265 | dFree(mCurrentFileBuffer); |
| 266 | mCurrentFileBuffer = NULL; |
| 267 | sendNextFileDownloadRequest(); |
| 268 | } |
| 269 | else |
| 270 | { |
| 271 | Con::executef("onFileChunkReceived", mMissingFileList[0], Con::getIntArg(mCurrentFileBufferOffset), Con::getIntArg(mCurrentFileBufferSize)); |
| 272 | } |
| 273 | } |
| 274 | |