Rewrote -[SocketWrapper receive] so that we do not get any more partial/broken packet...
authorRobert Sesek <rsesek@bluestatic.org>
Sun, 17 May 2009 14:07:33 +0000 (10:07 -0400)
committerRobert Sesek <rsesek@bluestatic.org>
Sun, 17 May 2009 14:07:33 +0000 (10:07 -0400)
* Source/SocketWrapper.m:
(receive)

CHANGES
Source/SocketWrapper.m

diff --git a/CHANGES b/CHANGES
index b403731932521e075cf0a41f9d4825bbdaa6eaf3..472323b1ed10d69f24f99004b42f69244fa1be21 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -15,6 +15,7 @@ script a subsequent time
 - Fix: After using the run command, the stack will now be properly updated
 - New: A preference has been added to disable automatic stepping into the
 first line of execution
+- Fix: MacGDBp should no longer throw incomplete packet error messages
 
 
 1.2.1
index bb91fcfde3c01eef6ba8753fcd451478a2df73ea..f93d2f13d886f7c4d248f0aae6581fe405e6dcaa 100644 (file)
  */
 - (NSString*)receive
 {
-       // create a buffer
-       char buffer[1024];
-       
-       // do our initial recv() call to get (hopefully) all the data and the lengh of the packet
-       int recvd = recv(sock, &buffer, sizeof(buffer), 0);
-       
-       // take the received data and put it into an NSData
-       NSMutableString* str = [NSMutableString string];
-       
-       if (recvd == -1)
-               return nil;
-       
-       // strip the length from the packet, and clear the null byte then add it to the NSData
+       // Read the first part of the response, the length of the packet.
        char packetLength[8];
-       memset(packetLength, '\0', sizeof(packetLength));
+       memset(&packetLength, 0x0, 8);
+       char c;
        int i = 0;
-       while (buffer[i] != '\0')
-       {
-               packetLength[i] = buffer[i];
-               i++;
-       }
-       
-       // we also want the null byte, so move us up 1
-       i++;
-       
-       // the total length of the full transmission
+       while (recv(sock, &c, 1, 0) == 1 && c != 0x0)
+               packetLength[i++] = c;
        int length = atoi(packetLength);
        
-       // move the packet part of the received data into it's own char[]
-       char packet[sizeof(buffer)];
-       memset(packet, '\0', sizeof(packet));
-       memmove(packet, &buffer[i], recvd - i);
+       // Our final output.
+       NSMutableString* string = [[NSMutableString alloc] initWithCapacity:length];
+       
+       // Create a buffer that we will move data from the network into.
+       char buffer[1024];
        
-       // convert bytes to NSString
-       [str appendString:[NSString stringWithCString:packet length:recvd - i]];
+       // The total amount of data we have currently read.
+       int received = 0;
        
-       // check if we have a partial packet
-       if (length + i > sizeof(buffer))
+       // Loop until we have the entire packet.
+       while (received < length)
        {
-               while (recvd < length + i)
+               int size = recv(sock, &buffer, sizeof(buffer), 0);
+               if (size < 1)
                {
-                       int latest = recv(sock, &buffer, sizeof(buffer), 0);
-                       if (latest < 1)
-                       {
-                               [self error:@"Socket closed or could not be read"];
-                               return nil;
-                       }
-                       [str appendString:[NSString stringWithCString:buffer length:latest]];
-                       recvd += latest;
+                       [self error:@"Socket closed or could not be read"];
+                       return nil;
                }
+               NSString* temp = [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding];
+               [string appendString:temp];
+               received += [temp length];
        }
        
-       NSString* tmp = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // strip whitespace
-       tmp = [tmp substringToIndex:[tmp length] - 1]; // don't want the null byte
-       
-       NSAssert([tmp UTF8String][[tmp length] - 1] == '>', @"-[SocketWrapper receive] buffer is incomplete");
-       
-       return tmp;
+       return [string autorelease];
 }
 
 /**