Программная установка шрифтов - PullRequest
1 голос
/ 16 марта 2010

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

1 Ответ

3 голосов
/ 17 марта 2010

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


По запросу, вот несколько документов API:

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

Это старый код, который я обновлял под Carbon (отсюда и строки паскаля). Он был основан на примере кода, который, вероятно, где-то в приведенном выше 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;
}
...