The Apple Geek

Чему ты научился сегодня?

Откуда берутся пункты в контекстном меню Finder

Когда я не понимаю, откуда в системе берутся какие-либо вещи, мне становится неуютно, и я начинаю разбираться. Например, меня заинтересовало, почему при нажатии Secondary Click в Finder на файле появляются какие-либо нестандартные действия, например, “Send File To Rapidshare”:

Начинаю искать. Все подобные вещи обычно находятся в иерархии каталогов Library, либо в пользовательской (~/Library), либо общесистемной (/Library). Магических вещей в Mac OS X не бывает, и всё описано где-то в каталогах, обрабатываемых системой. Просматриваю сначала пользовательские каталоги.

Конечно же, за меню отвечают плагины, располагающиеся в ~/Library/Contextual Menu Items и /Library/Contextual Menu Items. В пользовательском есть только плагин Dropbox:

Теперь системный:

Да, Speed Download Contextual Menu.plugin подходит под Rapidshare, смотрим его (Secondary Click и Show Package Context):

Cmd+I (Get Info) на файле “Speed Download Contextual Menu” в Contents/MacOS показывает полный путь к нему и тип (бинарник):

Бинарным файлом нас не испугать. Заходим в Terminal.app, переходим в каталог, где находится нужный файл (путь содержит пробелы, поэтому берём его в кавычки):

$ cd "/Library/Contextual Menu Items/Speed Download Contextual Menu.plugin/Contents/MacOS"

Для того, чтобы убедиться, что это действительно бинарный файл, смотрим его тип:

$ file Speed\ Download\ Contextual\ Menu 
Speed Download Contextual Menu: Mach-O universal binary with 2 architectures
Speed Download Contextual Menu (for architecture i386): Mach-O bundle i386
Speed Download Contextual Menu (for architecture ppc):  Mach-O bundle ppc

Извлекаем строки:

$ strings Speed\ Download\ Contextual\ Menu 
com.yazsoft.SpeedDownload
com.yazsoft.speeddownload.contextprefschange
contextshowuploadmenu
advanced_mode
com.yazsoft.speeddownload.contextualmenu
kUploadNamedToRapidShare
kUploadMultipleToRapidShare
/Applications/Speed Download 5/Speed Download.app
/Applications/Speed Download/Speed Download.app
/Applications/Speed Download Lite/Speed Download Lite.app
/Applications/Speed Download 4/Speed Download.app
/Applications/Speed Download.app
last location

Жирным я выделил то, что очень похоже на пункты меню. Программы Mac OS X используют файл ресурсов для локализации строковых значений:

$ cd "/Library/Contextual Menu Items/Speed Download Contextual Menu.plugin/Contents/Resources/English.lproj"

Можно открыть ресурс в XCode (если он установлен):

$ open Localizable.strings

Но это обычный файл, поэтому можно просмотреть обычным cat:

$ cat Localizable.strings 
/* 
   Localizable.strings
   XSpeedDownload Mach-O

   Created by Frederick Cheung on 08/11/2008.
   Copyright 2008 Frederick Cheung. All rights reserved.
 */

kUploadNamedToRapidShare = "Send \"%@\" to RapidShare";
kUploadMultipleToRapidShare = "Send %ld items to RapidShare";

Вот мы и нашли, откуда взялась строка “Send File to RapidShare”.

Для пробы я решил удалить плагин и найти, где он ещё описан. При очередном запуске Speed Downloader сказал, что нужно восстановить кое-какие компоненты, имея в виду удалённый мною плагин. fseventer - очень полезная программа:

Он натолкнул меня на файл с кешем сервисов ~/Library/Caches/com.apple.nsservicescache.plist:

Теперь понятно, откуда берётся строка меню и где находится кеш сервисов.

Comments