W Mac OX X Coca, NeXTSTEP i GNUstep frameworkach, property list (lista właściwości) są to pliki, które przechowują zserializowane obiekty. Pliki property list używają rozszerzenia .plist.
Pliki property list są często używane do przechowywania ustawień użytkownika. Są również używane do przechowywania informacji o pakietach/powiązaniach (bundles) i aplikacji.
Cappuccino 0.7 ma zaimplementowane dwa sposoby generowania list:
Nie zaimplementowane (jeszcze):
@import <Foundation/CPObject.j> @implementation AppController : CPObject { CPWebView webView; CPWebView _webView; CPProgressIndicator theProgressIndicator; } - (void)applicationDidFinishLaunching:(CPNotification)aNotification { var keys, objects; // Wskazówka: Konstrukcja przekazywania parametrow po przecinku - jest zaimplementowana w metodzie! keys = [CPArray arrayWithObjects:@"Key1", @"Key2", @"Key3", Nil]; objects = [CPArray arrayWithObjects:@"Dowidzenia", [CPNumber numberWithBool:NO], [CPNumber numberWithDouble:9.9], Nil]; var dict1 = [CPDictionary dictionaryWithObjects:objects forKeys:keys]; keys = [CPArray arrayWithObjects:@"key1", @"key2", @"key3", @"key4"]; objects = [CPArray arrayWithObjects:@"Dzień dobry po polsku!", [CPNumber numberWithBool:NO], [CPNumber numberWithDouble:9.9], dict1]; var dict2 = [CPDictionary dictionaryWithObjects:objects forKeys:keys]; var errorString; // @var CPData var dataOpenStepFormat = [CPPropertyListSerialization dataFromPropertyList:dict2 format:CPPropertyListOpenStepFormat errorDescription:errorString]; console.log(@"dataOpenStepFormat: " + [dataOpenStepFormat string]); // RETURNS: dataOpenStepFormat: null // @var CPData var dataListXMLFormat_v1_0 = [CPPropertyListSerialization dataFromPropertyList:dict2 format:CPPropertyListXMLFormat_v1_0 errorDescription:errorString]; console.log(@"dataListXMLFormat_v1_0: " + [dataListXMLFormat_v1_0 string]); // RETURNS: dataListXMLFormat_v1_0: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version = "1.0"><dict><key>key4</key><dict><key>Key3</key><real>9.9</real><key>Key2</key><false/><key>Key1</key><string>Dowidzenia</string></dict><key>key3</key><real>9.9</real><key>key2</key><false/><key>key1</key><string>Dzień dobry po polsku!</string></dict></plist> // @var CPData var dataCPPropertyListBinaryFormat_v1_0 = [CPPropertyListSerialization dataFromPropertyList:dict2 format:CPPropertyListBinaryFormat_v1_0 errorDescription:errorString]; console.log(@"dataCPPropertyListBinaryFormat_v1_0: " + [dataCPPropertyListBinaryFormat_v1_0 string]); // RETURNS: dataCPPropertyListBinaryFormat_v1_0: null // @var CPData var dataCPPropertyList280NorthFormat_v1_0 = [CPPropertyListSerialization dataFromPropertyList:dict2 format:CPPropertyList280NorthFormat_v1_0 errorDescription:errorString]; console.log(@"dataCPPropertyList280NorthFormat_v1_0: " + [dataCPPropertyList280NorthFormat_v1_0 string]); // RETURNS: dataCPPropertyList280NorthFormat_v1_0: 280NPLIST;1.0;D;K;4;key4D;K;4;Key3f;3;9.9K;4;Key2F;K;4;Key1S;10;DowidzeniaE;K;4;key3f;3;9.9K;4;key2F;K;4;key1S;22;Dzień dobry po polsku!E; console.log(@"errorString: " + errorString); // RETURNS: errorString: undefined } @end
@import <Foundation/CPObject.j> @implementation AppController : CPObject { CPWebView webView; CPWebView _webView; CPProgressIndicator theProgressIndicator; } - (void)applicationDidFinishLaunching:(CPNotification)aNotification { // @var data CPData var data = dataListXMLFormat_v1_0; // @var dict2 CPDictionary var dict2 = [CPPropertyListSerialization propertyListFromData:data format:CPPropertyListXMLFormat_v1_0 errorDescription:errorString]; console.log(@"dict2: " + [dict2 description]); /* RETURNS: dict2: CPDictionary { key1:Dzień dobry po polsku! key2:false key3:9.9 key4:CPDictionary { Key1:Dowidzenia Key2:false Key3:9.9 } } */ var value1 = [dict2 objectForKey:@"key1"]; console.log(@"value1:" + value1); // RETURNS: value1:Dzień dobry po polsku! console.log(@"errorString: " + errorString); // RETURNS: errorString: undefined } @end
Podczas uruchamiania Cappuccino Framework wykonuje działania inicjujące, w efekcie których wczytywany jest plik Info.plist.
W procesie rozruchowym wyszukiwane są następujące klucze:
(na chwilę obecną takie znalazłem)
Fragment funkcji inicjującej start aplikacji (zobacz index.html):
// PLIK: CPApplication.j function CPApplicationMain(args, namedArgs) { // Generowane żądanie o listę "Info.plist" var mainBundle = [CPBundle mainBundle], // Metoda zwraca nazwę klasy "CPApplication" // (nazwa pobierana jest z Info.plist i wartości klucza "CPPrincipalClass" ) principalClass = [mainBundle principalClass];
W trakcie procedury rozruchowej poszukiwana jest Klasa do której będą delegowane powiadomienia (więcej w dokumentacji):
// PLIK: CPApplication.j - (void)finishLaunching { // (...) // Pobierana jest nazwa klasy. Obiekt tej że klasy (domyślnie "AppController") będzie odbierał wydelegowane powiadomienia: var delegateClassName = [bundle objectForInfoDictionaryKey:@"CPApplicationDelegateClass"]; // (...)
Podstawowy plik listy właściwości (property list), z którego są czerpane odpowiednie wartości.
// Info.plist <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>CPApplicationDelegateClass</key> <string>AppController</string> <key>CPBundleName</key> <string>NewApplication</string> <key>CPPrincipalClass</key> <string>CPApplication</string> </dict> </plist>
Mockingbird jest to bardzo potężna aplikacja internetowa to tworzenia szkiców projektów.
Na podstawie jej można wyróżnić dodatkowe klucze wykorzystywane podczas rozruchu Cappuccino:







<plist version="1.0"> − <dict> <key>CPApplicationDelegateClass</key> <string>AppController</string> <key>CPBundleName</key> <string>Mockingbird</string> <key>CPPrincipalClass</key> <string>CPApplication</string> <key>JSONCallback</key> <string>jsoncallback</string> <key>CPBundleDocumentTypes</key> <array> <!-- Element: 0 --> <dict> <key>CPBundleTypeName</key> <string>MockingbirdDocument</string> <key>CFBundleTypeExtensions</key> <array> <string>mbd</string> </array> <key>CPDocumentClass</key> <string>MBDocument</string> </dict> <!-- Element: 1 --> <dict> <key>CPBundleTypeName</key> <string>OpenDocumentFormatDocument</string> <key>CFBundleTypeExtensions</key> <array> <string>odf</string> </array> <key>CPDocumentClass</key> <string>ODFDocument</string> </dict> </array> <key>CPBundleInfoDictionaryVersion</key> <integer>6</integer> <key>CPBundleIdentifier</key> <string>com.mockingbird.mockingbird</string> <key>CPBundleVersion</key> <string>1.0</string> <key>CPBundlePackageType</key> <string>APPL</string> <key>CPBundleEnvironments</key> <array> <string>W3C</string> <string>IE7</string> <string>IE8</string> <string>CommonJS</string> </array> <key>CPBundleExecutable</key> <string>Mockingbird.sj</string> <key>CPBundleReplacedFiles</key> <dict> <key>W3C</key> <array> <string>AllWidgets.j</string> <string>AppController.j</string> <!-- (...) -->