This is FaceView.m in view mode; [Download] [Up]
//////////////////////////////////////////////////////////////////////////// // NEXTTOYOU-Patch-Version; verÙndert von uli@nexttoyou.de //////////////////////////////////////////////////////////////////////////// // Dieser Patch sorgt daför, daû Alexandra Mail-TIFFs mit Namen des Formats // name@host.domain.de // auswertet und in der Datei // /LocalLibrary/Images/People/aliases // gegebenenfalls nach Aliases för die Adresse sucht // // Die Originaldatei im Alexandra-Quellcode (Version 0.82) einfach gegen // diese Datei ersetzen und mit dem ProjectBuilder neu kompilieren. #import "FaceView.h" #import <c.h> #import <ctype.h> @implementation FaceView //----------------------------------------------------------------------- // PRIVATE METHODS //----------------------------------------------------------------------- // In Ermangelung der passenden RFC eine einfache Heuristik. Vom '@' ausgehend // wird der Anfang und das Ende des Logins gesucht. // Fuer eine "richtige" Loesung: Was gibt's fuer Formate? // 1) login // 2) login (real name) // 3) "real name" <login> // 4) real name <login> // ... #define islogin(c) (isalnum(c) || (c)=='.' || (c)=='_' || (c)=='%' || (c)=='-') - (char *)loginForName:(const char *)userName; { char login[300],*at,*p; int n; at=strchr(userName,'@'); if(at) { n=1; for(p=at+1;islogin(*p);p++) n++; for(p=at-1;p>=userName && islogin(*p);p--) n++; strncpy(login,p+1,MIN(n,300)); login[MIN(n,300)]='\0'; ////////////////////////////////////////////////////////////////////////////// // NEXTTOYOU-Patch-Version: Konversionsroutinen deaktiviert, so daû der Name // för das Mail-TIFF wie bei Mail.app exakt in der Form der Internet-Adresse // gesucht wird ////////////////////////////////////////////////////////////////////////////// // for(p=login;*p;p++) // if(*p=='!' || *p=='@') // *p='.'; // else // *p=NXToLower(*p); at=NXCopyStringBufferFromZone(login,[self zone]); } return at; } // NewsGrazer Methode. Mail ist cleverer und sieht noch in der Aliases-Datei nach // und testet auf lokalen Benutzer... ////////////////////////////////////////////////////////////////////////////// // NEXTTOYOU-Patch-Version: Aliases-Datei wird ausgewertet; lokale Benutzer // mössen nicht ausgewertet werden, da PersonalINN stets volllstÙndige // Adressen generiert ////////////////////////////////////////////////////////////////////////////// - (char *)filenameForLogin:(const char *)login { char buf[MAXPATHLEN+1]; ////////////////////////////////////////////////////////////////////////////// // NEXTTOYOU-Patch-Version: zusÙtzliche Variablen-Deklarationen ////////////////////////////////////////////////////////////////////////////// char alias[2*(MAXPATHLEN+2)]; char *al; char aliasbuf[MAXPATHLEN+2]; char *ab; FILE *aliases; FILE *test; ////////////////////////////////////////////////////////////////////////////// sprintf(buf,"/LocalLibrary/Images/People/%s.tiff",login); ////////////////////////////////////////////////////////////////////////////// // NEXTTOYOU-Patch-Version: // Gibt es diese Datei? // Falls nein, ist der Name in der Aliases-Datei enthalten? ////////////////////////////////////////////////////////////////////////////// if((test=fopen(buf,"r"))==NULL) { aliases=fopen("/LocalLibrary/Images/People/aliases","r"); if(aliases==NULL) return NXCopyStringBufferFromZone(buf,[self zone]); strcpy(aliasbuf,login); strcat(aliasbuf,":"); do { al=fgets(alias,2*(MAXPATHLEN+2),aliases); if(strstr(alias,aliasbuf)!=NULL && alias[0]!='#') { strcpy(aliasbuf,strchr(alias,':')+1); ab=strtok(aliasbuf," ,\n"); fclose(aliases); sprintf(buf,"/LocalLibrary/Images/People/%s.tiff",ab); return NXCopyStringBufferFromZone(buf,[self zone]); } } while(al==alias); fclose(aliases); } else fclose(test); ////////////////////////////////////////////////////////////////////////////// return NXCopyStringBufferFromZone(buf,[self zone]); } //----------------------------------------------------------------------- // INSTANCE VAR //----------------------------------------------------------------------- - setImage:(NXImage *)anImage; { myImage=anImage; return self; } - (NXImage *)image; { return myImage; } //----------------------------------------------------------------------- // SET IMAGE FROM LOGIN NAME //----------------------------------------------------------------------- - (BOOL)showFaceForName:(const char *)name; { NXImage *image=nil; char *imageFile,*login; if(name && (login=[self loginForName:name])!=NULL) { image=[NXImage findImageNamed:login]; if(!image) { imageFile=[self filenameForLogin:login]; image=[[NXImage allocFromZone:[self zone]] initFromFile:imageFile]; NXZoneFree([self zone],imageFile); if(image && [image lockFocus]) { NXSize size, newsize={64,64}; [image unlockFocus]; // [TRH] Don't scale image if it isn't necessary, // and keep size/width proportions intact if it is. [image getSize:&size]; if (size.height > newsize.height || size.width > newsize.width) { if (size.height > size.width) newsize.width=newsize.width*size.width/size.height; else if (size.height < size.width) newsize.height = newsize.height*size.height/size.width; [image setScalable:YES]; [image setSize:&newsize]; } [image setName:login]; } else image=[image free]; } NXZoneFree([self zone],login); } [self setImage:image]; [self display]; return image? TRUE : FALSE; } //----------------------------------------------------------------------- // DRAWING //----------------------------------------------------------------------- - drawSelf:(const NXRect *)rects :(int)rectCount { [super drawSelf:rects:rectCount]; PSsetgray(NX_LTGRAY); NXRectFill(&bounds); if(myImage) { NXRect frects[5]; float fgrays[5]={NX_DKGRAY,NX_DKGRAY,NX_DKGRAY,NX_BLACK,NX_BLACK}; NXPoint imgorigin={1,2}; NXSize size; // [TRH] Shrinkwrap rects around image. [myImage getSize:&size]; NXSetRect(&frects[0],3,0,size.width+1,size.height+1); NXSetRect(&frects[1],0,1,1,size.height+2); NXSetRect(&frects[2],0,size.height+2,size.width+2,1); NXSetRect(&frects[3],0,1,size.width+1,1); NXSetRect(&frects[4],size.width+1,1,1,size.height+2); NXRectFillListWithGrays(frects,fgrays,5); [myImage composite:NX_SOVER toPoint:&imgorigin]; } else { NXPoint imgorigin={0,2}; [[NXImage findImageNamed:"of"] composite:NX_SOVER toPoint:&imgorigin]; } return self; } //----------------------------------------------------------------------- // THAT'S IT //----------------------------------------------------------------------- @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.