Ticket #1605: socket1.diff
File socket1.diff, 5.2 KB (added by , 18 years ago) |
---|
-
libs/libmyth/util.cpp
125 125 */ 126 126 bool WriteStringList(QSocketDevice *socket, QStringList &list) 127 127 { 128 if (!socket->isOpen() || socket->error())128 if (!socket->isOpen() || !socket->isValid() || socket->error()) 129 129 { 130 130 VERBOSE(VB_IMPORTANT, "WriteStringList: Bad socket"); 131 131 return false; … … 185 185 socket->close(); 186 186 return false; 187 187 } 188 else if (!socket->isValid()) 189 { 190 VERBOSE(VB_IMPORTANT,"WriteStringList: Socket became invalid"); 191 return false; 192 } 188 193 else 189 194 { 190 195 if (timer.elapsed() > 100000) … … 207 212 { 208 213 list.clear(); 209 214 210 if (!socket->isOpen() || socket->error())215 if (!socket->isOpen() || !socket->isValid() || socket->error()) 211 216 { 212 217 VERBOSE(VB_IMPORTANT, "ReadStringList: Bad socket"); 213 218 return false; … … 284 289 socket->close(); 285 290 return false; 286 291 } 292 else if (!socket->isValid()) 293 { 294 VERBOSE(VB_IMPORTANT, "ReadStringList: Socket went invalid"); 295 return false; 296 } 287 297 else 288 298 { 289 299 elapsed = timer.elapsed(); … … 339 349 bool WriteBlock(QSocketDevice *socket, void *data, uint len) 340 350 { 341 351 342 if (!socket->isOpen() || socket->error())352 if (!socket->isOpen() || !socket->isValid() || socket->error()) 343 353 { 344 354 VERBOSE(VB_IMPORTANT, "WriteBlock: Bad socket"); 345 355 return false; … … 372 382 socket->close(); 373 383 return false; 374 384 } 385 else if (!socket->isValid()) 386 { 387 VERBOSE(VB_IMPORTANT,"WriteBlock: Socket went invalid"); 388 return false; 389 } 375 390 else 376 391 { 377 392 if (++zerocnt > 200) -
programs/mythbackend/mainserver.cpp
880 880 fileTransferList.push_back(ft); 881 881 882 882 retlist << QString::number(socket->socket()); 883 ft->UpRef(); 883 884 encodeLongLong(retlist, ft->GetFileSize()); 885 ft->DownRef(); 884 886 } 885 887 886 888 WriteStringList(socket, retlist); … … 899 901 } 900 902 else 901 903 { 902 cerr << "Unable to write to client socket, as it's no longer there\n"; 904 VERBOSE(VB_IMPORTANT, "SendResponse: Unable to write to client socket," 905 " as it's no longer there"); 903 906 } 904 907 } 905 908 … … 2982 2985 QString command = slist[1]; 2983 2986 2984 2987 QStringList retlist; 2988 ft->UpRef(); 2985 2989 2986 2990 if (command == "IS_OPEN") 2987 2991 { … … 3021 3025 retlist << "ok"; 3022 3026 } 3023 3027 3028 ft->DownRef(); 3024 3029 SendResponse(pbssock, retlist); 3025 3030 } 3026 3031 … … 3430 3435 QSocket *sock = (*ft)->getSocket(); 3431 3436 if (sock == socket) 3432 3437 { 3433 socket->DownRef(); 3434 delete (*ft); 3438 (*ft)->DownRef(); 3435 3439 fileTransferList.erase(ft); 3436 3440 return; 3437 3441 } 3438 3442 } -
programs/mythbackend/filetransfer.cpp
10 10 #include "filetransfer.h" 11 11 12 12 #include "RingBuffer.h" 13 #include "server.h" 13 14 #include "libmyth/util.h" 14 15 15 FileTransfer::FileTransfer(QString &filename, QSocket *remote)16 FileTransfer::FileTransfer(QString &filename, RefSocket *remote) 16 17 { 17 18 rbuffer = new RingBuffer(filename, false); 18 19 sock = remote; 19 20 readthreadlive = true; 20 21 ateof = false; 22 refCount = 0; 21 23 } 22 24 23 25 FileTransfer::~FileTransfer() 24 26 { 25 Stop(); 27 sock->DownRef(); 28 } 26 29 27 if (rbuffer) 28 delete rbuffer; 30 void FileTransfer::UpRef(void) 31 { 32 refCount++; 33 } 29 34 30 readthreadLock.unlock(); 35 bool FileTransfer::DownRef(void) 36 { 37 refCount--; 38 39 if (refCount < 0) 40 { 41 Stop(); 42 43 if (rbuffer) 44 delete rbuffer; 45 46 readthreadLock.unlock(); 47 delete(this); 48 return true; 49 } 50 return false; 31 51 } 32 52 33 53 bool FileTransfer::isOpen(void) -
programs/mythbackend/filetransfer.h
13 13 #include <qmutex.h> 14 14 15 15 class RingBuffer; 16 class QSocket;16 class RefSocket; 17 17 18 18 class FileTransfer 19 19 { 20 20 public: 21 FileTransfer(QString &filename, QSocket *remote);21 FileTransfer(QString &filename, RefSocket *remote); 22 22 ~FileTransfer(); 23 23 24 QSocket *getSocket() { return sock; }24 RefSocket *getSocket() { return sock; } 25 25 26 26 bool isOpen(void); 27 27 28 28 void Stop(void); 29 29 30 void UpRef(void); 31 bool DownRef(void); 32 30 33 void Pause(void); 31 34 void Unpause(void); 32 35 int RequestBlock(int size); … … 42 45 QMutex readthreadLock; 43 46 44 47 RingBuffer *rbuffer; 45 QSocket *sock;48 RefSocket *sock; 46 49 bool ateof; 47 50 int refCount; 51 48 52 vector<char> requestBuffer; 49 53 }; 50 54