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.