2010-03-16 3 views
1

Как я могу программно установить шрифт на платформе Mac (Snow Leopard)? Какие шаги мне нужно будет выполнить? Я хотел бы, чтобы пользователь вводил файл шрифта, тогда мое программное обеспечение устанавливает его.Программная установка шрифтов

ответ

3

Шрифты принадлежат ~ пользователю/Библиотеке/Шрифтам/для одного пользователя или/Library/Fonts/должны быть доступны для всех пользователей. Вам нужно получить разрешение на запись в/Library/Fonts /, хотя для этого есть API, что делает его относительно простым. (. У меня есть код, где-то и можете посмотреть его, если никто не знает, экспромтом)


В соответствии с просьбой, вот некоторые API Docs:

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

Это старый код у меня есть который сделал обновление под Carbon (следовательно, строки pascal). Он был основан на примере кода, который, вероятно, находится где-то в указанном выше URL-адресе. Я не рассматривал это под какао, и это отредактированная версия кода (все еще немного грязная), поэтому 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

Да, пожалуйста, api! :) – Avram

+0

Добавлено больше деталей. Надеюсь это поможет; прошло несколько лет с тех пор, как я использовал это, поэтому все могло измениться, но это должно заставить вас двигаться в правильном направлении. –

Смежные вопросы