This is cServices.m in view mode; [Download] [Up]
/*
* This sourcecode is part of FileSpy, a logfile observing utility.
* Copyright (C) 1996 Felix Rauch
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Notice that this program may not be possessed, used, copied,
* distributed or modified by people having to do with nuclear
* weapons. See the file CONDITIONS for details.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* To contact the original author, try:
* e-mail: Felix.Rauch@nice.ch
* Traditional mail: Felix Rauch
* Sempacherstrasse 33
* 8032 Zurich
* Switzerland
*/
#import "Controller.h"
@implementation Controller(Services)
- registerServices:sender
{
const char *sendTypes[2];
const char *returnTypes[1];
sendTypes[0] = NXFilenamePboardType;
sendTypes[1] = NULL;
returnTypes[0] = NULL;
[NXApp registerServicesMenuSendTypes:sendTypes andReturnTypes:returnTypes];
return self;
}
- validRequestorForSendType:(NXAtom)typeSent andReturnType:(NXAtom)typeReturned
{
if ((typeSent == NXFilenamePboardType || typeSent == NULL) && (typeReturned == NULL)) {
List *cellList;
if(!tmpList)
tmpList = [[List alloc] init];
cellList = [tmpList empty];
[myMatrix getSelectedCells:cellList];
if (([cellList count] > 0 || typeSent == NULL) && (typeReturned == NULL))
return self;
}
return nil;
}
- (BOOL)writeSelectionToPasteboard:(Pasteboard *)pboard types:(NXAtom *)types
{
while (types && *types) {
if (*types == NXFilenamePboardType)
break;
types++;
}
if(types && *types)
{
const char *types[2] = {NXFilenamePboardType, ""};
List *cellList = [tmpList empty];
unsigned int i, max, len = 0;
char *string, *orig;
const char *filename;
[myMatrix getSelectedCells:cellList];
max = [cellList count];
for(i = 0; i < max; i++)
len += strlen([[cellList objectAt:i] stringValue]) + 1;
string = orig = (char *)malloc(len*sizeof(char));
*string = '\000';
for(i = 0; i < max; i++) {
filename = [[cellList objectAt:i] stringValue];
strcat(string, filename);
strcat(string, "\t");
string += strlen(filename) + 1;
}
if(max > 0)
string[-1] = '\000';
[pboard declareTypes:types num:1 owner:nil];
[pboard writeType:NXFilenamePboardType data:orig length:len];
return YES;
} else {
return NO;
}
}
- spyFileFromService:pasteboard userData:(const char *)userData error:(char **)msg
{
char *buffer, *data, c, *p, *q;
int length;
[pasteboard types]; // pretend to check the pasteboard types
if ([pasteboard readType:NXFilenamePboardType data:&data length:&length])
{
buffer = malloc(length+1);
p = buffer;
strncpy(buffer, data, length);
buffer[length] = '\000';
while(*p != '\000') {
q = p;
while((*q != '\000') && (*q != '\t')) // search end of current filename
q++;
c = *q; // remember tab or \0
if(c == '\t') // if it's just a tab..
*q = '\000'; // .. then terminate string temporarily
[self addFileWithName:p];
if(c == '\t')
p = q + 1;
else
p = q;
}
free(buffer);
[pasteboard deallocatePasteboardData:data length:length];
}
else
*msg = "Error: couldn't spy file."; // eventually improve this
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.