home *** CD-ROM | disk | FTP | other *** search
/ Big Green CD 8 / BGCD_8_Dev.iso / NEXTSTEP / Networking / Alexandra.TiffPatch / FaceView.m < prev   
Encoding:
Text File  |  1997-03-22  |  6.6 KB  |  232 lines

  1. ////////////////////////////////////////////////////////////////////////////
  2. // NEXTTOYOU-Patch-Version; verändert von uli@nexttoyou.de
  3. ////////////////////////////////////////////////////////////////////////////
  4.  
  5. // Dieser Patch sorgt dafür, daß Alexandra Mail-TIFFs mit Namen des Formats
  6. // name@host.domain.de
  7. // auswertet und in der Datei
  8. // /LocalLibrary/Images/People/aliases
  9. // gegebenenfalls nach Aliases für die Adresse sucht
  10. //
  11. // Die Originaldatei im Alexandra-Quellcode (Version 0.82) einfach gegen
  12. // diese Datei ersetzen und mit dem ProjectBuilder neu kompilieren.
  13.  
  14.  
  15.  
  16. #import "FaceView.h"
  17. #import <c.h>
  18. #import <ctype.h>
  19.  
  20. @implementation FaceView
  21.  
  22. //-----------------------------------------------------------------------
  23. // PRIVATE METHODS
  24. //-----------------------------------------------------------------------
  25.  
  26. // In Ermangelung der passenden RFC eine einfache Heuristik. Vom '@' ausgehend
  27. // wird der Anfang und das Ende des Logins gesucht.
  28. // Fuer eine "richtige" Loesung: Was gibt's fuer Formate?
  29. //   1) login 
  30. //   2) login (real name)
  31. //   3) "real name" <login>
  32. //   4) real name <login>
  33. //   ...
  34.  
  35. #define islogin(c) (isalnum(c) || (c)=='.' || (c)=='_' || (c)=='%' || (c)=='-')
  36.  
  37. - (char *)loginForName:(const char *)userName;
  38.     {
  39.     char        login[300],*at,*p;
  40.     int            n;
  41.     
  42.     at=strchr(userName,'@');
  43.     if(at)
  44.         {
  45.         n=1;
  46.         for(p=at+1;islogin(*p);p++)
  47.             n++;
  48.         for(p=at-1;p>=userName && islogin(*p);p--)
  49.             n++;
  50.         strncpy(login,p+1,MIN(n,300));
  51.         login[MIN(n,300)]='\0';
  52.                 
  53. //////////////////////////////////////////////////////////////////////////////
  54. // NEXTTOYOU-Patch-Version: Konversionsroutinen deaktiviert, so daß der Name
  55. // für das Mail-TIFF wie bei Mail.app exakt in der Form der Internet-Adresse
  56. // gesucht wird
  57. //////////////////////////////////////////////////////////////////////////////        
  58. //        for(p=login;*p;p++)        
  59. //            if(*p=='!' || *p=='@')
  60. //                *p='.';
  61. //            else
  62. //                *p=NXToLower(*p);
  63.         at=NXCopyStringBufferFromZone(login,[self zone]);
  64.         }
  65.     return at;
  66.     }
  67.  
  68.  
  69. // NewsGrazer Methode. Mail ist cleverer und sieht noch in der Aliases-Datei nach
  70. // und testet auf lokalen Benutzer...
  71. //////////////////////////////////////////////////////////////////////////////
  72. // NEXTTOYOU-Patch-Version: Aliases-Datei wird ausgewertet; lokale Benutzer
  73. // müssen nicht ausgewertet werden, da PersonalINN stets volllständige
  74. // Adressen generiert
  75. //////////////////////////////////////////////////////////////////////////////
  76.  
  77.  
  78. - (char *)filenameForLogin:(const char *)login
  79.     {
  80.     char buf[MAXPATHLEN+1];
  81.     
  82. //////////////////////////////////////////////////////////////////////////////
  83. // NEXTTOYOU-Patch-Version: zusätzliche Variablen-Deklarationen
  84. //////////////////////////////////////////////////////////////////////////////
  85.     char alias[2*(MAXPATHLEN+2)];
  86.     char *al;
  87.     char aliasbuf[MAXPATHLEN+2];
  88.     char *ab;
  89.     FILE *aliases;
  90.     FILE *test;
  91. //////////////////////////////////////////////////////////////////////////////
  92.     
  93.     sprintf(buf,"/LocalLibrary/Images/People/%s.tiff",login);
  94.     
  95. //////////////////////////////////////////////////////////////////////////////
  96. // NEXTTOYOU-Patch-Version: 
  97. // Gibt es diese Datei?
  98. // Falls nein, ist der Name in der Aliases-Datei enthalten?
  99. //////////////////////////////////////////////////////////////////////////////
  100.     if((test=fopen(buf,"r"))==NULL)
  101.         {
  102.         aliases=fopen("/LocalLibrary/Images/People/aliases","r");
  103.         if(aliases==NULL) return NXCopyStringBufferFromZone(buf,[self zone]);
  104.         strcpy(aliasbuf,login);
  105.         strcat(aliasbuf,":");
  106.         do
  107.             {
  108.             al=fgets(alias,2*(MAXPATHLEN+2),aliases);
  109.             if(strstr(alias,aliasbuf)!=NULL && alias[0]!='#')
  110.                 {
  111.                 strcpy(aliasbuf,strchr(alias,':')+1);
  112.                 ab=strtok(aliasbuf," ,\n");
  113.                 fclose(aliases);
  114.                 sprintf(buf,"/LocalLibrary/Images/People/%s.tiff",ab);
  115.                 return NXCopyStringBufferFromZone(buf,[self zone]);
  116.                 }
  117.             }
  118.         while(al==alias);
  119.         fclose(aliases);
  120.         }
  121.     else fclose(test);
  122. //////////////////////////////////////////////////////////////////////////////
  123.     
  124.     return NXCopyStringBufferFromZone(buf,[self zone]);    
  125.     }
  126.  
  127.  
  128. //-----------------------------------------------------------------------
  129. // INSTANCE VAR
  130. //-----------------------------------------------------------------------
  131.  
  132. - setImage:(NXImage *)anImage;
  133.     {
  134.     myImage=anImage;
  135.     return self;
  136.     }
  137.  
  138.  
  139. - (NXImage *)image;
  140.     {
  141.     return myImage;
  142.     }
  143.  
  144.  
  145. //-----------------------------------------------------------------------
  146. // SET IMAGE FROM LOGIN NAME
  147. //-----------------------------------------------------------------------
  148. - (BOOL)showFaceForName:(const char *)name;
  149.     {
  150.     NXImage        *image=nil;
  151.     char        *imageFile,*login;
  152.  
  153.     if(name && (login=[self loginForName:name])!=NULL)
  154.         {
  155.         image=[NXImage findImageNamed:login];
  156.         if(!image)
  157.             {
  158.             imageFile=[self filenameForLogin:login];
  159.             image=[[NXImage allocFromZone:[self zone]] initFromFile:imageFile];
  160.             NXZoneFree([self zone],imageFile);
  161.             if(image && [image lockFocus])
  162.                 {
  163.                 NXSize size, newsize={64,64};
  164.  
  165.                 [image unlockFocus];
  166.                 // [TRH] Don't scale image if it isn't necessary,
  167.                 // and keep size/width proportions intact if it is.
  168.                 [image getSize:&size];
  169.                 if (size.height > newsize.height || size.width > newsize.width)
  170.                     {
  171.                     if (size.height > size.width)
  172.                         newsize.width=newsize.width*size.width/size.height;
  173.                     else if (size.height < size.width)
  174.                         newsize.height = newsize.height*size.height/size.width;
  175.                     [image setScalable:YES];
  176.                     [image setSize:&newsize];
  177.                     }
  178.                 [image setName:login];
  179.                 }
  180.             else
  181.                 image=[image free];
  182.             }
  183.         NXZoneFree([self zone],login);
  184.         }
  185.     [self setImage:image];
  186.     [self display];
  187.     return image? TRUE : FALSE;
  188.     }
  189.  
  190.  
  191. //-----------------------------------------------------------------------
  192. // DRAWING
  193. //-----------------------------------------------------------------------
  194.  
  195. - drawSelf:(const NXRect *)rects :(int)rectCount
  196.     {
  197.     [super drawSelf:rects:rectCount];
  198.     PSsetgray(NX_LTGRAY);
  199.     NXRectFill(&bounds);
  200.     if(myImage)
  201.         {
  202.         NXRect frects[5];
  203.         float    fgrays[5]={NX_DKGRAY,NX_DKGRAY,NX_DKGRAY,NX_BLACK,NX_BLACK};
  204.         NXPoint imgorigin={1,2};
  205.         NXSize size;
  206.         
  207.         // [TRH] Shrinkwrap rects around image.
  208.         [myImage getSize:&size];
  209.         NXSetRect(&frects[0],3,0,size.width+1,size.height+1);
  210.         NXSetRect(&frects[1],0,1,1,size.height+2);
  211.         NXSetRect(&frects[2],0,size.height+2,size.width+2,1);
  212.         NXSetRect(&frects[3],0,1,size.width+1,1);
  213.         NXSetRect(&frects[4],size.width+1,1,1,size.height+2);
  214.         NXRectFillListWithGrays(frects,fgrays,5);
  215.         [myImage composite:NX_SOVER toPoint:&imgorigin];
  216.  
  217.         }
  218.     else
  219.         {
  220.         NXPoint imgorigin={0,2};
  221.         [[NXImage findImageNamed:"of"] composite:NX_SOVER toPoint:&imgorigin];
  222.         }
  223.     return self;
  224.     }
  225.     
  226.  
  227. //-----------------------------------------------------------------------
  228. // THAT'S IT
  229. //-----------------------------------------------------------------------
  230.  
  231. @end
  232.