2010-03-16 6 views
1

Comment installer une police sur la plate-forme Mac (Snow Leopard) par programme? Quelles étapes dois-je suivre? Je voudrais que l'utilisateur saisisse un fichier de police, puis mon logiciel l'installe.Installation de polices par programme

Répondre

3

Les polices appartiennent à ~ user/Library/Fonts/pour un seul utilisateur ou/Library/Fonts/pour être accessible à tous les utilisateurs. Vous devez obtenir la permission pour écrire dans/Library/Fonts /, bien qu'il y ait une API pour cela, ce qui le rend relativement facile. (. J'ai le code quelque part et peut regarder vers le haut si personne ne sait Morisque)


Comme demandé, voici quelques API docs:

http://developer.apple.com/mac/library/documentation/Security/Reference/authorization_ref/Reference/reference.html

C'est ancien code Je qui a fait la mise à jour sous Carbon (d'où les chaînes pascal). Il était basé sur un exemple de code qui se trouve probablement quelque part dans l'URL ci-dessus. Je n'ai pas cherché à faire cela sous Cocoa, et c'est une version éditée du code (encore un peu brouillon), donc YMMV.

int main() 
{ 
    OSStatus myStatus = -1; 
    char path[1024]; 
    char myToolPath[2048]; 
    getUpdateAppPath(myToolPath); 
    getFilePath(path); 

    if (path[0] != 0) 
    { 
     char temp[2048]; 
     FILE *f; 
     printf("Attempting to open \'%s\'\n", path); 
     f = fopen(path, "w+"); 
     if (f != 0) // we seem to have write permission 
     { 
      fclose(f); 
      SInt16 res; 
      sprintf(temp, "\'%s\' \'%s\'", myToolPath, path); 
      system(temp); 
      StandardAlert(kAlertNoteAlert, "\pUpdate Complete", "\pSuccessfully updated.", 0, &res); 
      return 0; 
     } 

     AuthorizationFlags myFlags = kAuthorizationFlagDefaults; 
     AuthorizationRef myAuthorizationRef; 
     myStatus = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, 
             myFlags, &myAuthorizationRef); 
     if (myStatus != errAuthorizationSuccess) 
     { 
      SInt16 res; 
      StandardAlert(kAlertNoteAlert, "\pAuthorization Error", "\pCould not authorize application to update.", 0, &res); 
      return myStatus; 
     } 

     AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0}; 

     AuthorizationRights myRights = {1, &myItems}; 
     myFlags = kAuthorizationFlagDefaults | 
     kAuthorizationFlagInteractionAllowed | 
     kAuthorizationFlagPreAuthorize | 
     kAuthorizationFlagExtendRights; 

     myStatus = AuthorizationCopyRights (myAuthorizationRef, &myRights, NULL, myFlags, NULL); 

     if (myStatus != errAuthorizationSuccess) 
      break; 

     char *myArguments[] = { path, NULL }; 
     FILE *myCommunicationsPipe = NULL; 
     char myReadBuffer[128]; 


     myFlags = kAuthorizationFlagDefaults; 
     myStatus = AuthorizationExecuteWithPrivileges(myAuthorizationRef, myToolPath, myFlags, myArguments, 
                 &myCommunicationsPipe); 

     if (myStatus == errAuthorizationSuccess) 
      for(;;) 
      { 
       int bytesRead = read (fileno (myCommunicationsPipe), 
             myReadBuffer, sizeof (myReadBuffer)); 
       if (bytesRead < 1) break; 
       write (fileno (stdout), myReadBuffer, bytesRead); 
      } 

     AuthorizationFree (myAuthorizationRef, kAuthorizationFlagDefaults); // 17 
    } 
    if (myStatus) 
    { 
     printf("Status: %ld\n", myStatus); 
     SInt16 res; 
     StandardAlert(kAlertNoteAlert, "\pUpdater Error", "\pMay not have updated properly.", 0, &res); 
    } 
    else { 
     SInt16 res; 
     StandardAlert(kAlertNoteAlert, "\pUpdate Complete", "\pSuccessfully updated.", 0, &res); 
    } 
    return myStatus; 
} 
+1

oui s'il vous plaît, api! :) – Avram

+0

Ajouté plus de détails. J'espère que cela t'aides; Cela fait quelques années que je l'ai utilisé, donc les choses ont peut-être changé, mais cela devrait vous aider à avancer dans la bonne direction. –

Questions connexes