- [searchResults removeAllObjects];
- [searchResultsUndone removeAllObjects];
-
- [self unpause];
-}
-
-- (void)handleSearch:(char const *)data size:(int)dataSize
-{
- TCtype type;
- TCsize size;
-
- char *ptr = (char *)data;
-
- [self setAction:@"Searching"];
-
- COPY_FROM_BUFFER( &type, ptr, sizeof(type) );
- COPY_FROM_BUFFER( &size, ptr, sizeof(size) );
-
- if ( ![searchResults lastObject] )
- {
- switch ( type )
- {
- case TYPE_STRING:
- {
- switch ( size )
- {
- case SIZE_8_BIT:
- {
- [self firstSearchString8bit:ptr size:(dataSize - (ptr - data))];
- }
- break;
- }
- }
- break;
-
- case TYPE_INTEGER:
- {
- switch ( size )
- {
- case SIZE_8_BIT:
- {
- int8_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self firstSearchIntegerChar:value];
- }
- break;
-
- case SIZE_16_BIT:
- {
- int16_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self firstSearchIntegerShort:value];
- }
- break;
-
- case SIZE_32_BIT:
- {
- int32_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self firstSearchIntegerLong:value];
- }
- break;
- }
- }
- break;
-
- case TYPE_DECIMAL:
- {
- switch ( size )
- {
- case SIZE_32_BIT:
- {
- float value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self firstSearchDecimalFloat:value];
- }
- break;
-
- case SIZE_64_BIT:
- {
- double value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self firstSearchDecimalDouble:value];
- }
- break;
- }
- }
- break;
- }
- }
- else
- {
- switch ( type )
- {
- case TYPE_STRING:
- {
- switch ( size )
- {
- case SIZE_8_BIT:
- {
- [self searchString8bit:ptr size:(dataSize - (ptr - data))];
-
- break;
- }
- }
- }
- break;
-
- case TYPE_INTEGER:
- {
- switch ( size )
- {
- case SIZE_8_BIT:
- {
- int8_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self searchIntegerChar:value];
-
- break;
- }
-
- case SIZE_16_BIT:
- {
- int16_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self searchIntegerShort:value];
-
- break;
- }
-
- case SIZE_32_BIT:
- {
- int32_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self searchIntegerLong:value];
-
- break;
- }
- }
- }
- break;
-
- case TYPE_DECIMAL:
- {
- switch ( size )
- {
- case SIZE_32_BIT:
- {
- float value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self searchDecimalFloat:value];
- }
- break;
-
- case SIZE_64_BIT:
- {
- double value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self searchDecimalDouble:value];
- }
- break;
- }
- }
- break;
- }
- }
-
- [self sendVariableList:[(SearchResults *)[searchResults lastObject] data] amount:[[searchResults lastObject] amount]];
- [self sendSearchFinished];
- [self sendUndoRedoStatus];
-
- [self setAction:nil];
-}
-
-- (void)handleChange:(char const *)data size:(int)dataSize
-{
- TCtype type;
- TCsize size;
-
- TCaddress *addresses = NULL;
- int count;
-
- char *ptr = (char *)data;
-
- [self setAction:@"Changing"];
-
- // read out the type and size of the variable.
- COPY_FROM_BUFFER( &type, ptr, sizeof(type) );
- COPY_FROM_BUFFER( &size, ptr, sizeof(size) );
-
- // read the amount of addresses.
- COPY_FROM_BUFFER( &count, ptr, sizeof(count) );
-
- // save the pointer to the addresses.
- addresses = (TCaddress *)ptr;
- ptr += TCAddressSize*count;
-
- switch ( type )
- {
- case TYPE_STRING:
- {
- switch ( size )
- {
- case SIZE_8_BIT:
- {
- [self changeString8bit:ptr size:(dataSize - (ptr - data)) addresses:addresses count:count];
- }
- break;
- }
- }
- break;
-
- case TYPE_INTEGER:
- {
- switch ( size )
- {
- case SIZE_8_BIT:
- {
- int8_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self changeIntegerChar:value addresses:addresses count:count];
- }
- break;
-
- case SIZE_16_BIT:
- {
- int16_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self changeIntegerShort:value addresses:addresses count:count];
- }
- break;
-
- case SIZE_32_BIT:
- {
- int32_t value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self changeIntegerLong:value addresses:addresses count:count];
- }
- break;
- }
- }
- break;
-
- case TYPE_DECIMAL:
- {
- switch ( size )
- {
- case SIZE_32_BIT:
- {
- float value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self changeDecimalFloat:value addresses:addresses count:count];
- }
- break;
-
- case SIZE_64_BIT:
- {
- double value;
-
- COPY_FROM_BUFFER( &value, ptr, sizeof(value) );
- [self changeDecimalDouble:value addresses:addresses count:count];
- }
- break;
- }
- }
- break;
- }
-
- [self sendChangeFinished];
-
- [self setAction:nil];
-}
-
-- (void)handlePauseTarget
-{
- if ( !processPaused )
- {
- int wait_status;
-
- if ( ptrace( PT_ATTACH, processID, 0, 0 ) != -1 )
- {
- if ( waitpid( processID, &wait_status, WUNTRACED ) == processID )
- {
- if ( WIFSTOPPED(wait_status) )
- {
- processPaused = YES;
- [self sendPauseFinished:YES];
- }
- else
- {
- NSLog( @"ERROR: process couldn't be paused" );
- [self sendPauseFinished:NO];
- [self sendError:@"Process couldn't be paused." fatal:NO];
- }
- }
- else
- {
- NSLog( @"ERROR: process couldn't be paused" );
- [self sendPauseFinished:NO];
- [self sendError:@"Process couldn't be paused." fatal:NO];
- }
- }
- else
- {
- NSLog( @"ERROR: process couldn't be paused" );
- [self sendPauseFinished:NO];
- [self sendError:@"Process couldn't be paused." fatal:NO];
- }
- }
- else
- {
- ptrace( PT_DETACH, processID, 0, 0 );
-
- processPaused = NO;
- [self sendPauseFinished:NO];
- }
-}
-
-- (void)handleUndo
-{
- SearchResults *results = [searchResults lastObject];
-
- if ( results )
- {
- [searchResultsUndone addObject:results];
- [searchResults removeLastObject];
- }
-
- results = [searchResults lastObject];
- if ( results )
- {
- [self sendVariableList:[results data] amount:[results amount]];
- }
- else
- {
- [self sendVariableList:NULL amount:0];
- }
-
- [self sendUndoFinished];
- [self sendUndoRedoStatus];
-}
-
-- (void)handleRedo
-{
- SearchResults *results = [searchResultsUndone lastObject];
-
- if ( results )
- {
- [searchResults addObject:results];
- [searchResultsUndone removeLastObject];
- }
-
- results = [searchResults lastObject];
- if ( results )
- {
- [self sendVariableList:[results data] amount:[results amount]];
- }
- else
- {
- [self sendVariableList:NULL amount:0];
- }
-
- [self sendRedoFinished];
- [self sendUndoRedoStatus];
-}
-
-- (void)handleSetTargetPID:(char const *)data size:(int)size
-{
- char *ptr = (char *)data;
-
- pid_t pid;
-
- COPY_FROM_BUFFER( &pid, ptr, sizeof(pid) );
-
- [self setPID:pid];
-}
-
-
-- (void)unpause
-{
- if ( processPaused )
- {
- [self handlePauseTarget];
- }
-}
-
-- (void)setPID:(pid_t)pid
-{
- kern_return_t result;
-
- [self unpause];
-
- processID = pid;
-
- if ( (result = task_for_pid( current_task(), processID, &processTask)) != KERN_SUCCESS )
- {
- NSLog( @"task_for_pid returned error: %i", result );
- }
-}
-
-
-- (void)dealloc
-{
- [self unpause];
-
- [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
-
- [searchResults release];
- [searchResultsUndone release];
-
- [super dealloc];
-}
-
-
-/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% NSWorkspaceDidLaunchApplicationNotification Notification
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
-
-
-- (void)processListChanged:(NSNotification *)note
-{
- pid_t pid = [[[note userInfo] objectForKey:@"NSApplicationProcessIdentifier"] intValue];
-
- if ( /*pid != getpid()*/ sockfd != -1 )
- {
- if ( [[note name] isEqualToString:@"NSWorkspaceDidLaunchApplicationNotification"] )
- {
- [self sendAppLaunched:[note userInfo]];
- }
- else
- {
- [self sendAppQuit:[note userInfo]];
-
- if ( pid == processID )
- {
- [self sendTargetAppQuit];
-
- // we can't set the new target here because this method is not called
- // in the server thread. the client will have to change it.
- //[self setPID:[rootProxy serverFirstProcess]];
- processPaused = NO;
- }
- }
- }