Property Lists - pliki .plist

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.

Generowania property lists w Cappuccino

Cappuccino 0.7 ma zaimplementowane dwa sposoby generowania list:

  • CPPropertyListXMLFormat_v1_0
  • CPPropertyList280NorthFormat_v1_0

Nie zaimplementowane (jeszcze):

  • CPPropertyListOpenStepFormat
  • CPPropertyListBinaryFormat_v1_0

Przykład konwersji danych do property list

AppController.j
@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

Przykład konwersji property list do danych

AppController.j
@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

Przykład zastosowania property lists w Cappuccino

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: FIXME (na chwilę obecną takie znalazłem)

  • CPPrincipalClass - string - domyślna nazwa głównej klasy aplikacji: CPApplication
  • CPApplicationDelegateClass - string - nazwa klasy, do której będą delegowane wiadomości z klasy głównej aplikacji CPApplication
  • CPBundleName - string - unikalna nazwa bungle

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):

  • CPApplicationWillFinishLaunchingNotification
  • CPApplicationDidFinishLaunchingNotification
// 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>

Przykład zastosowania property list w Mockingbird

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:

  • CPApplicationDelegateClass - string - opisany w rozdziale: Przykład zastosowania property lists w Cappuccino
  • CPPrincipalClass - string - opisany w rozdziale: Przykład zastosowania property lists w Cappuccino
  • CPBundleName - string - string - opisany w rozdziale: Przykład zastosowania property lists w Cappuccino
  • JSONCallback - string - FIXME
  • CPBundleDocumentTypes - array - tablica składająca się z elementów, z których każdy jest słownikiem. Zawiera informację o rodzajach dokumentów jakie nasza aplikacja obsługuje np.: OpenDocumentFormat - odt, MockingbirdDocument - mbd)
    • CPBundleTypeName - string - nazwa identyfikująca typ dokumentu (musi być unikalna) np.: „OpenDocumentFormat”
    • CFBundleTypeExtensions - array - rodzaje rozszerzeń obsługiwanych poprzez damy rodzaj dokumentu (przydatne poprzez identyfikację w URL)
    • CPDocumentClass - string - nazwa klasy, która reprezentuje nasz rodzaj dokumentu tj. dla „OpenDocumentFormat” klasa w Cappuccino to „ODFDocument”
  • CPBundleInfoDictionaryVersion - string - FIXME
  • CPBundleIdentifier - string - FIXME
  • CPBundleVersion - string - FIXME
  • CPBundlePackageType - string - FIXME
  • CPBundleEnvironments - array - zawiera informację o rodzajach interpretacji standardów a w konsekwencji wartościach w klucza CPBundleReplacedFiles daje możliwość przystosowania aplikacji do stabilnego działania pod różnymi wersjami przeglądarki internetowej.
  • CPBundleExecutable - string - FIXME
  • CPBundleReplacedFiles - array - FIXME
<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>
 
         <!-- (...) -->
cappuccino/property_lists_pliki_plist.txt · ostatnio zmienione: 2010/01/06 01:45 przez widmogrod
 
Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki