plist 2.0.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,203 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>Application Version</key>
6
+ <string>5.0.4 (263)</string>
7
+ <key>Archive Path</key>
8
+ <string>/Users/username/Pictures/iPhoto Library</string>
9
+ <key>List of Albums</key>
10
+ <array>
11
+ <dict>
12
+ <key>AlbumId</key>
13
+ <integer>999000</integer>
14
+ <key>AlbumName</key>
15
+ <string>Library</string>
16
+ <key>KeyList</key>
17
+ <array>
18
+ <string>7</string>
19
+ </array>
20
+ <key>Master</key>
21
+ <true/>
22
+ <key>PhotoCount</key>
23
+ <integer>1</integer>
24
+ <key>PlayMusic</key>
25
+ <string>YES</string>
26
+ <key>RepeatSlideShow</key>
27
+ <string>YES</string>
28
+ <key>SecondsPerSlide</key>
29
+ <integer>3</integer>
30
+ <key>SlideShowUseTitles</key>
31
+ <false/>
32
+ <key>SongPath</key>
33
+ <string></string>
34
+ <key>TransitionDirection</key>
35
+ <integer>0</integer>
36
+ <key>TransitionName</key>
37
+ <string>Dissolve</string>
38
+ <key>TransitionSpeed</key>
39
+ <real>1</real>
40
+ </dict>
41
+ <dict>
42
+ <key>Album Type</key>
43
+ <string>Special Roll</string>
44
+ <key>AlbumId</key>
45
+ <integer>999001</integer>
46
+ <key>AlbumName</key>
47
+ <string>Last Roll</string>
48
+ <key>Filter Mode</key>
49
+ <string>All</string>
50
+ <key>Filters</key>
51
+ <array>
52
+ <dict>
53
+ <key>Count</key>
54
+ <integer>1</integer>
55
+ <key>Operation</key>
56
+ <string>In Last</string>
57
+ <key>Type</key>
58
+ <string>Roll</string>
59
+ </dict>
60
+ </array>
61
+ <key>KeyList</key>
62
+ <array>
63
+ <string>7</string>
64
+ </array>
65
+ <key>PhotoCount</key>
66
+ <integer>1</integer>
67
+ <key>PlayMusic</key>
68
+ <string>YES</string>
69
+ <key>RepeatSlideShow</key>
70
+ <string>YES</string>
71
+ <key>SecondsPerSlide</key>
72
+ <integer>3</integer>
73
+ <key>SlideShowUseTitles</key>
74
+ <false/>
75
+ <key>SongPath</key>
76
+ <string></string>
77
+ <key>TransitionDirection</key>
78
+ <integer>0</integer>
79
+ <key>TransitionName</key>
80
+ <string>Dissolve</string>
81
+ <key>TransitionSpeed</key>
82
+ <real>1</real>
83
+ </dict>
84
+ <dict>
85
+ <key>Album Type</key>
86
+ <string>Special Month</string>
87
+ <key>AlbumId</key>
88
+ <integer>999002</integer>
89
+ <key>AlbumName</key>
90
+ <string>Last 12 Months</string>
91
+ <key>Filter Mode</key>
92
+ <string>All</string>
93
+ <key>Filters</key>
94
+ <array/>
95
+ <key>KeyList</key>
96
+ <array>
97
+ <string>7</string>
98
+ </array>
99
+ <key>PhotoCount</key>
100
+ <integer>1</integer>
101
+ <key>PlayMusic</key>
102
+ <string>YES</string>
103
+ <key>RepeatSlideShow</key>
104
+ <string>YES</string>
105
+ <key>SecondsPerSlide</key>
106
+ <integer>3</integer>
107
+ <key>SlideShowUseTitles</key>
108
+ <false/>
109
+ <key>SongPath</key>
110
+ <string></string>
111
+ <key>TransitionDirection</key>
112
+ <integer>0</integer>
113
+ <key>TransitionName</key>
114
+ <string>Dissolve</string>
115
+ <key>TransitionSpeed</key>
116
+ <real>1</real>
117
+ </dict>
118
+ <dict>
119
+ <key>Album Type</key>
120
+ <string>Regular</string>
121
+ <key>AlbumId</key>
122
+ <integer>9</integer>
123
+ <key>AlbumName</key>
124
+ <string>An Album</string>
125
+ <key>KeyList</key>
126
+ <array>
127
+ <string>7</string>
128
+ </array>
129
+ <key>PhotoCount</key>
130
+ <integer>1</integer>
131
+ <key>PlayMusic</key>
132
+ <string>YES</string>
133
+ <key>RepeatSlideShow</key>
134
+ <string>YES</string>
135
+ <key>SecondsPerSlide</key>
136
+ <integer>3</integer>
137
+ <key>SlideShowUseTitles</key>
138
+ <false/>
139
+ <key>SongPath</key>
140
+ <string></string>
141
+ <key>TransitionDirection</key>
142
+ <integer>0</integer>
143
+ <key>TransitionName</key>
144
+ <string>Dissolve</string>
145
+ <key>TransitionSpeed</key>
146
+ <real>1</real>
147
+ </dict>
148
+ </array>
149
+ <key>List of Keywords</key>
150
+ <dict/>
151
+ <key>List of Rolls</key>
152
+ <array>
153
+ <dict>
154
+ <key>Album Type</key>
155
+ <string>Regular</string>
156
+ <key>AlbumId</key>
157
+ <integer>6</integer>
158
+ <key>AlbumName</key>
159
+ <string>Roll 1</string>
160
+ <key>KeyList</key>
161
+ <array>
162
+ <string>7</string>
163
+ </array>
164
+ <key>Parent</key>
165
+ <integer>999000</integer>
166
+ <key>PhotoCount</key>
167
+ <integer>1</integer>
168
+ </dict>
169
+ </array>
170
+ <key>Major Version</key>
171
+ <integer>2</integer>
172
+ <key>Master Image List</key>
173
+ <dict>
174
+ <key>7</key>
175
+ <dict>
176
+ <key>Aspect Ratio</key>
177
+ <real>1</real>
178
+ <key>Caption</key>
179
+ <string>fallow_keep.png.450x450.2005-12-04</string>
180
+ <key>Comment</key>
181
+ <string>a comment</string>
182
+ <key>DateAsTimerInterval</key>
183
+ <real>158341389</real>
184
+ <key>ImagePath</key>
185
+ <string>/Users/username/Pictures/iPhoto Library/2006/01/07/fallow_keep.png.450x450.2005-12-04.jpg</string>
186
+ <key>MediaType</key>
187
+ <string>Image</string>
188
+ <key>MetaModDateAsTimerInterval</key>
189
+ <real>158341439.728129</real>
190
+ <key>ModDateAsTimerInterval</key>
191
+ <real>158341389</real>
192
+ <key>Rating</key>
193
+ <integer>0</integer>
194
+ <key>Roll</key>
195
+ <integer>6</integer>
196
+ <key>ThumbPath</key>
197
+ <string>/Users/username/Pictures/iPhoto Library/2006/01/07/Thumbs/7.jpg</string>
198
+ </dict>
199
+ </dict>
200
+ <key>Minor Version</key>
201
+ <integer>0</integer>
202
+ </dict>
203
+ </plist>
@@ -0,0 +1,104 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <array>
5
+ <dict>
6
+ <key>Created</key>
7
+ <real>151936595.697543</real>
8
+ <key>Domain</key>
9
+ <string>.cleveland.com</string>
10
+ <key>Expires</key>
11
+ <date>2007-10-25T12:36:35Z</date>
12
+ <key>Name</key>
13
+ <string>CTC</string>
14
+ <key>Path</key>
15
+ <string>/</string>
16
+ <key>Value</key>
17
+ <string>:broadband:</string>
18
+ </dict>
19
+ <dict>
20
+ <key>Created</key>
21
+ <real>151778895.063041</real>
22
+ <key>Domain</key>
23
+ <string>.gamefaqs.com</string>
24
+ <key>Expires</key>
25
+ <date>2006-04-21T16:47:58Z</date>
26
+ <key>Name</key>
27
+ <string>ctk</string>
28
+ <key>Path</key>
29
+ <string>/</string>
30
+ <key>Value</key>
31
+ <string>NDM1YmJlYmU0NjZiOGYxZjc1NjgxODg0YmRkMA%3D%3D</string>
32
+ </dict>
33
+ <dict>
34
+ <key>Created</key>
35
+ <real>183530456</real>
36
+ <key>Domain</key>
37
+ <string>arstechnica.com</string>
38
+ <key>Expires</key>
39
+ <date>2006-10-26T13:56:36Z</date>
40
+ <key>Name</key>
41
+ <string>fontFace</string>
42
+ <key>Path</key>
43
+ <string>/</string>
44
+ <key>Value</key>
45
+ <string>1</string>
46
+ </dict>
47
+ <dict>
48
+ <key>Created</key>
49
+ <real>183004526</real>
50
+ <key>Domain</key>
51
+ <string>.sourceforge.net</string>
52
+ <key>Expires</key>
53
+ <date>2006-10-20T02:35:26Z</date>
54
+ <key>Name</key>
55
+ <string>FRQSTR</string>
56
+ <key>Path</key>
57
+ <string>/</string>
58
+ <key>Value</key>
59
+ <string>18829595x86799:1:1440x87033:1:1440x86799:1:1440x87248:1:1440|18829595|18829595|18829595|18829595</string>
60
+ </dict>
61
+ <dict>
62
+ <key>Created</key>
63
+ <real>151053128.640531</real>
64
+ <key>Domain</key>
65
+ <string>.tvguide.com</string>
66
+ <key>Expires</key>
67
+ <date>2025-10-10T07:12:17Z</date>
68
+ <key>Name</key>
69
+ <string>DMSEG</string>
70
+ <key>Path</key>
71
+ <string>/</string>
72
+ <key>Value</key>
73
+ <string>1BDF3D1CC07FC70F&amp;D04451&amp;434EC763&amp;4351FD51&amp;0&amp;</string>
74
+ </dict>
75
+ <dict>
76
+ <key>Created</key>
77
+ <real>151304125.760261</real>
78
+ <key>Domain</key>
79
+ <string>.code.blogspot.com</string>
80
+ <key>Expires</key>
81
+ <date>2038-01-18T00:00:00Z</date>
82
+ <key>Name</key>
83
+ <string>__utma</string>
84
+ <key>Path</key>
85
+ <string>/</string>
86
+ <key>Value</key>
87
+ <string>11680422.1172819419.1129611326.1129611326.1129611326.1</string>
88
+ </dict>
89
+ <dict>
90
+ <key>Created</key>
91
+ <real>599529600</real>
92
+ <key>Domain</key>
93
+ <string>.tvguide.com</string>
94
+ <key>Expires</key>
95
+ <date>2020-01-01T00:00:00Z</date>
96
+ <key>Name</key>
97
+ <string>gfm</string>
98
+ <key>Path</key>
99
+ <string>/</string>
100
+ <key>Value</key>
101
+ <string>0</string>
102
+ </dict>
103
+ </array>
104
+ </plist>
Binary file
@@ -0,0 +1,259 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>IMs</key>
6
+ <array>
7
+ <string>com.apple.syncservices:9583BE42-EC1A-4B3F-B248-7904BA60634B</string>
8
+ <string>com.apple.syncservices:2A222E96-4CC6-4320-BE0C-61D5F08C2E64</string>
9
+ <string>com.apple.syncservices:64DAA772-4558-49F8-9B87-C4A32D5E05C1</string>
10
+ <string>com.apple.syncservices:AF7C6884-B760-4E55-A4D5-B1B114C8A7DC</string>
11
+ <string>com.apple.syncservices:ECC7FAED-47D6-4DB9-8120-2F029C7D64C8</string>
12
+ <string>com.apple.syncservices:D704F079-F869-4613-9CFC-697C1976E8F4</string>
13
+ </array>
14
+ <key>URLs</key>
15
+ <array>
16
+ <string>com.apple.syncservices:5BA97109-F8E3-46A9-AF0B-5F8C093F49EA</string>
17
+ </array>
18
+ <key>com.apple.syncservices.RecordEntityName</key>
19
+ <string>com.apple.contacts.Contact</string>
20
+ <key>display as company</key>
21
+ <string>person</string>
22
+ <key>email addresses</key>
23
+ <array>
24
+ <string>com.apple.syncservices:B97DCC9C-5B00-4D38-AB06-4B7A5D6BC369</string>
25
+ <string>com.apple.syncservices:E508D679-43E1-49E2-B5D7-F14A8E48C067</string>
26
+ <string>com.apple.syncservices:C6478063-34A5-4CCB-BD41-1F131D56F7BD</string>
27
+ <string>com.apple.syncservices:2B3E352C-7831-4349-9A87-0FA4BD290515</string>
28
+ </array>
29
+ <key>first name</key>
30
+ <string>Mat</string>
31
+ <key>image</key>
32
+ <data>
33
+ /9j/4AAQSkZJRgABAQAAAQABAAD/7QAcUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAD/
34
+ 4g9ASUNDX1BST0ZJTEUAAQEAAA8wYXBwbAIAAABtbnRyUkdCIFhZWiAH1gAFABUAFAAg
35
+ AAZhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWFwcGxx
36
+ EHyAeZ4fvAacU+DW7cbVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5yWFla
37
+ AAABLAAAABRnWFlaAAABQAAAABRiWFlaAAABVAAAABR3dHB0AAABaAAAABRjaGFkAAAB
38
+ fAAAACxyVFJDAAABqAAAAA5nVFJDAAABuAAAAA5iVFJDAAAByAAAAA52Y2d0AAAB2AAA
39
+ BhJuZGluAAAH7AAABj5kZXNjAAAOLAAAAGRkc2NtAAAOkAAAAEhtbW9kAAAO2AAAAChj
40
+ cHJ0AAAPAAAAAC1YWVogAAAAAAAAZwIAADyoAAAJjlhZWiAAAAAAAABowAAAq7QAAB5o
41
+ WFlaIAAAAAAAACcUAAAXvwAAqy9YWVogAAAAAAAA81IAAQAAAAEWz3NmMzIAAAAAAAEM
42
+ QgAABd7///MmAAAHkgAA/ZH///ui///9owAAA9wAAMBsY3VydgAAAAAAAAABAc0AAGN1
43
+ cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAdmNndAAAAAAAAAAAAAMBAAACAAAA
44
+ JwCJARYBsAJsA0kESAV0BsgIPAnXC5YNcA9oEX0ToxXSGAwaJRvMHW4fDSCbIi8jtSUy
45
+ JqooFil9KuEsOS2MLtwwLTF1Mr80CDVINmQ3cjh8OYs6nTuuPL890j7lP/hBCUIUQxtE
46
+ H0UdRhhHDkf9SOhJ30r0TBxNQE5iT4NQo1HEUudUDVUxVlZXhFizWeRbGlxSXY9e0mAU
47
+ YVtin2PhZSBmWmeWaMtp/WsybGJtkm7Gb/hxKnJhc5502HYYd1d4mHmyerx7wHzFfc9+
48
+ 1n/egOmB94MHhBiFLIZCh1uIdomViraL2Yz+jiKPRZBokY+SrpPMlOWV/ZcVmCmZOJpG
49
+ m1ScX51onnCfdqB8oYGiiqORpJmlo6asp7yozancqumr9q0ArgWvBK/8sO+x2bK/s5q0
50
+ bLU7thK2/7f8uPu5+Lr0u+68573bvtS/0MDKwcnCzMPUxN/F88cLyCPJQMpFyyHL5cyq
51
+ zXHOOM79z8XQkdFe0izS/dPP1KbVf9Za1zjYF9j42dnamNtD2+TchN0i3cDeWt7z34zg
52
+ JuC/4Vjh8OKL4yfjxeRi5QHlouZN5wDnwOh76TPp5eqP6zPr0exj7PLtce3w7l/uzu8z
53
+ 75Pv9PBK8KDw+/GN8iny2fOD9Cn0yfVp9gj2qfdM9/H4ovla+hr66vvN/MD9yf7Q//8A
54
+ AAAUAEYAkQD0AYQCNQMQBA0FPAaSCA8Jtgt1DUoPNBEtEy0VNhcUGJ0aIhujHRsekB/+
55
+ IWIixCQgJWwmuyf8KTcqcCumLNUuAy8vME0xXjJoM200cjV3Nnk3ejh6OXg6dDtwPGc9
56
+ Wz5NPzxAKEEUQf1C5EPRRM9F1kbcR+JI50nsSvBL9kz+TgNPB1ANURNSF1MdVCJVJ1Yv
57
+ VzNYOVk/WkZbTlxTXV9ebF95YIxhomK9Y+BlBWYuZ15ol2nQaw5sTG2NbqdvsXC1cbpy
58
+ xHPLdNN13nbsd/x5DXohezd8UH1rfop/q4DOgfODF4Q6hV2GhIejiMGJ2oryjAqNHo4t
59
+ jzuQSZFUkl2TZZRrlXGWdpd/mIWZi5qQm5Gcl52dnp6fnKCdoZiilaOMpICldKZjp1Go
60
+ PKkkqg2q9KvarL6tqK6Rr4Cwb7FgslOzSbRDtT+2PLc8uD25QLpFu0m8Tb1Qvk2/O8Ah
61
+ wQrB9sLiw83EusWrxprHich5yWjKVctDzC/NGs4DzurPz9DE0cPSvNOx1J/VhtZm10HY
62
+ F9jp2brahttT3CHc8N3F3prfdOBR4Svh+uLA44XkSeUO5dPml+db6B/o4+mm6mrrLuvz
63
+ 7Lbteu4+7wPvx/CM8VDyFPLX8530YfUk9er2rfdx+DX4+vm9+oH7RfwK/M79kv5W/x7/
64
+ /wAAAAkAIABDAHAApwDoAVAB1gJ8Az4EHAUcBjUHXwiaCecLPAyVDekPExA2EVgSdBON
65
+ FKEVrxa6F7sYtRmoGpMbdxxWHTAeAh7QH5kgZCE6Ih8i/yPgJL0llyZvJ0UoGijpKbgq
66
+ hCtPLBcs3S2jLmgvLS/xMLQxdzI6MvYzrzRmNRo1yzZ8Ny432jiJOTk56jqdO1I8CjzF
67
+ PYQ+RD8IP8xAkUFVQhZC2UOZRFhFFkXQRopHQ0f0SKRJVEoBSqxLVUv5TJVNJ02tTjBO
68
+ tE85T75QRFDMUVZR41JyUwNTl1QtVMZVYVYAVqBXQlgDWO1Z81r7XANdCl4QXxpgKGE1
69
+ YkNjVGRqZYJmm2e4aNdp92sabEFtaW6Nb69wzXHrcwh0H3UwdkB3SXhQeVB6SntDfDV9
70
+ JX4Rfvp/44DPgciCx4PFhMCFuoauh5+IiYlyilqLPowfjQCN4I7Aj6GQg5FikkSTHpPt
71
+ lLWVgZZTlyeX/JjWmbaal5t6nGKdSZ4ynxygBqDvodeivqOjpJill6aSp4eoeKlkqkur
72
+ L6wTrPet3a7Gr7GwqLGgsqazr7S/tdu2+rgeuUS6aLuJvKu9yb7owATBIMI6w1TEb8WM
73
+ xqrHx8jpygjLLMxSzYHOxtAm0YvS/9SF1hTXstlr2zXdFt8M4SjjZOXI6G7rae7F8ur4
74
+ 1P//AABuZGluAAAAAAAABjYAAJQXAABYjQAAUbUAAI5iAAAoWwAAFqgAAFANAABUOQAC
75
+ o9cAAkAAAAFKPQADAQAAAgAAABQALQBGAF8AdwCOAKUAvADTAOkA/wEWASwBQwFZAXAB
76
+ hgGdAbQBywHjAfsCEwIsAkcCYgKGAqoC0AL3Ax8DSgN1A6EDzwP/BDEEZASZBNEFCgVF
77
+ BYEFwQYCBkYGigbQBxkHYweuB/sISwimCQgJbwnVCjwKpQsQC3wL6gxZDMsNPw24DjQO
78
+ tA85D8EQTxDjEXwSChKIEwUThxQKFI8VFxWfFikWsxc9F8oYWBjjGW8Z/BqJGxUbohwu
79
+ HLkdRR3SHl4e7R99IBAgpSE+IdYiciMSI7MkVCT5JaAmRCbsJ5UoPyjnKY0qNyrfK4cs
80
+ MizZLZkuaS8/MBgw7jHGMqIzfDRWNS82CDbjN7w4ljluOkc7Hjv1PMw9pD58P1dAM0ER
81
+ QexCz0O0RJ9FjEZ5R2tIYkleSlxLW0xfTWdOcE99UIxRnVKsU75U0VXjVvhYCFkXWipb
82
+ QVxYXXRelV++YPNiLmN6ZM1mNmewaTVqkmvTbQ9uUm+WcOByLHOBdNJ2IHdyeL96CXtO
83
+ fJF9zH8CgDuBb4KjhBWF2oehiWOLLYz1jrSQdpIwk+yVnZdOmPiaopxKnfOf66JEpKen
84
+ FqmZrCGurbFCs8+2V7jhu2C9qr/JwfzESsa7yV/MRs+Y02vX2tzd39riV+T157bqg+1L
85
+ 8AjykvT69yr5LfsI/L3+g///AAAAJwBHAGQAgACaALMAzADkAPwBEwErAUMBWwF0AYwB
86
+ pQG+AdgB8gIMAicCRQJkAooCsgLbAwUDMQNfA44DvgPxBCYEXASUBM4FDAVKBYsF0AYX
87
+ BmAGqgb4B0gHmgfuCEcIpgkKCXIJ3ApICrcLKQudDBQMjw0LDYwOEQ6ZDyYPthBJEOER
88
+ fBISEp4TLBO8FE8U4xV6FhMWrBdGF+UYhRklGcgabhsUG70caB0SHcEecB8hH9MghiE9
89
+ IfEipiNdJBEkxSV5Jikm2CeIKDYo4imKKjUq3iuHLDIs2S2ZLmkvPzAYMO4xxjKiM3w0
90
+ VjUvNgg24ze8OJY5bjpHOx479TzMPaQ+fD9XQDNBEUHsQs9DtESfRYxGeUdrSGJJXkpc
91
+ S1tMX01nTnBPfVCMUZ1SrFO/VNRV7FcKWCNZP1phW4hcrl3cXwpgQWF+YrxkBWVOZqFn
92
+ 92lPaqxsD21qbslwIHF5ctB0KHV5dsl4GXloerV8An1Pfpp/6oE8go6D9IV1hveIc4nw
93
+ i3OM8o5tj+2Rb5LxlHmWApePmR+atpxRnfOffKD2onukCqWmp1GpEKrbrLSulLCBsmu0
94
+ WbY3uBe57bu7va2/vMHSw+nGBMghykHMZ86P0LfS4dUP1z/Zctum3dvgFuJV5I7m1ekU
95
+ 617tqu/x8kT0lPbm+Tr7k/3w//8AAABVAIoAtwDhAQgBLgFUAXoBoAHGAe0CFQI+AmoC
96
+ ngLUAwwDRwOFA8UECQRQBJoE6gU+BZcF9wZcBscHOQexCDEIrAkhCZsKFwqZCyALqww6
97
+ DNANag4KDq8PWRAHELkRbxIqEugTsBSAFVoWOhcfGA0Y/BnsGtwbyxy3HaMejR96IGoh
98
+ YSJZI1skYCVvJoInpSjPKgArPSyHLf8vqzFXMwc0sTZUN/E5hjsVPJ4+JD9kQFtBUUJG
99
+ Qz9EOUU2Ri9HJ0giSR5KGEsPTAVM/U3zTuhP3lDUUclSu1OvVKdVoVaiV6NYpVmsWrtb
100
+ z1zlXgVfKGBVYYtixGQJZVBmomf3aU9qlWvTbRBuVW+ccOxyQ3OndQ52eXfveWl65nxo
101
+ feh/aYDxgnWEE4XQh4eJMIrbjICOGY+wkUaS1ZRolfiXipkdmrWcUZ3zn3yg9qJ5pAal
102
+ nac+qO2qoKxWrgmvubFlsv+0mbYct5+5GbqEu++9U761wBnBgcLvxFrFzMc+yLTKLMuo
103
+ zSbOpNAh0Z/TG9Sa1hTXlNkQ2oncAd1q3rvf+eE24m/jneTA5eDm/egT6STqJ+sm7CHt
104
+ E+4B7unv0PCp8X/yTfMZ8930m/VX9gT2svdW9+/4ifkZ+aL6K/qv+x37jPv6/Gj8tv0E
105
+ /VL9oP3v/jz+gf7G/wz/Uf+X/9z//wAAZGVzYwAAAAAAAAAKQ29sb3IgTENEAAAAAAAA
106
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
107
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1sdWMAAAAAAAAAAgAAAAxlblVTAAAAEgAAAChq
108
+ YUpQAAAADgAAADoAQwBvAGwAbwByACAATABDAEQwqzDpMPwAIABMAEMARG1tb2QAAAAA
109
+ AAAGEAAAnF4AAAAAwEuKAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAAAENvcHlyaWdodCBB
110
+ cHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEB
111
+ AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBD
112
+ AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
113
+ AQEBAQEBAQEBAQEBAQH/wAARCAAwADADAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
114
+ AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1Fh
115
+ ByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpT
116
+ VFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKz
117
+ tLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
118
+ AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC
119
+ AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2
120
+ Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaX
121
+ mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP0
122
+ 9fb3+Pn6/9oADAMBAAIRAxEAPwDd+Bfxs/4J+ftC/EFPhp4M+LXjLQtVl8P6pr9trvxE
123
+ 8L2/gfwldRaU9tHPYw6/rU6WZ1OcXJms7F3R7tLe5WItKio3+XePyHPcBh3icwwjwNNT
124
+ VOVarjcsqSVacJTUZ4bB47FV4RajJzqTgqaulKXPKKf9XVcGklKhWpYyV1y0cHDGynGH
125
+ M06inVwdOnJKTimoTlJ/yuKcl+c/7cf7TXw68GfEbWvg38B/HWtXuv8AgbxrbC88aeCN
126
+ O8KeNtJ8W+HU0e2uJrRxr+lR6Vosa63Pc6Zd3Ed3dfakshcWN7FHPiT6nhzheq8PLM8f
127
+ gMFjcur4R0qOIzXHV8DQp4uT9+pg/wCzpvE4yrQWigoToXlKUoylGy+SzDGqVaOFpYzE
128
+ 4XE066nUw+Hw1PE1p0opcsayxEVRw8KjbV5WqWS5XGMtfCfCn/BSS1vtOvLddC0uw1zR
129
+ TJDqGha0ltZ6zfmFTvNlOHjsGuCzRiWAWjqpwkZLudmmZ+GWd4KeGcatOvgsYlKlmWFo
130
+ 1MVhKdOcrpVoPmqqPLGVqlRqLSTUVq3WD4jybEQrc/to4jDc6q4OtVp0a8pRi1aml7sr
131
+ N/BHmaejfb6p/ZM/bi+E3x2+I+g/CT4qG0+HHijxfr9h4X8K6tpkU2peHZ9Z1G4e2tLb
132
+ Wr28Nt9iW6uHtrRLq2t3t47uRvPEUTKEMdwRnmXU54jDqOIwMaEcR7edOFOpHl1nCph4
133
+ 1pzpxkmpU5pybjuklFvKnm+V4m0I1qlPFKrKnKjJ80XHRwdOr7OPPKLUlOL5UmlZ6tH7
134
+ LaX+wnruj+JtYQ6v4bg8O3TtdQX1tNfXGtz3S+X5Zvra4shbxoN9wD5NwTH8hwQ7AfNu
135
+ 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
219
+ zSptxk21dX5pWbuo3SS//9k=
220
+ </data>
221
+ <key>last name</key>
222
+ <string>Schaffer</string>
223
+ <key>phone numbers</key>
224
+ <array>
225
+ <string>com.apple.syncservices:64ED42EB-109B-43A9-BEFC-3463D944251A</string>
226
+ <string>com.apple.syncservices:FB7585EB-A3DE-46D5-920C-DF8028689BC5</string>
227
+ <string>com.apple.syncservices:020036FD-22B3-41C9-BC3D-CDA6083582C6</string>
228
+ <string>com.apple.syncservices:C6661518-90CA-45C7-A988-02F73B958951</string>
229
+ </array>
230
+ <key>primary URL</key>
231
+ <array>
232
+ <string>com.apple.syncservices:5BA97109-F8E3-46A9-AF0B-5F8C093F49EA</string>
233
+ </array>
234
+ <key>primary email address</key>
235
+ <array>
236
+ <string>com.apple.syncservices:B97DCC9C-5B00-4D38-AB06-4B7A5D6BC369</string>
237
+ </array>
238
+ <key>primary phone number</key>
239
+ <array>
240
+ <string>com.apple.syncservices:64ED42EB-109B-43A9-BEFC-3463D944251A</string>
241
+ </array>
242
+ <key>primary related name</key>
243
+ <array>
244
+ <string>com.apple.syncservices:CD0B7021-0228-4770-8FB0-3739479E9788</string>
245
+ </array>
246
+ <key>primary street address</key>
247
+ <array>
248
+ <string>com.apple.syncservices:377B9105-9D15-4F69-BCD6-B01E587F7760</string>
249
+ </array>
250
+ <key>related names</key>
251
+ <array>
252
+ <string>com.apple.syncservices:CD0B7021-0228-4770-8FB0-3739479E9788</string>
253
+ </array>
254
+ <key>street addresses</key>
255
+ <array>
256
+ <string>com.apple.syncservices:377B9105-9D15-4F69-BCD6-B01E587F7760</string>
257
+ </array>
258
+ </dict>
259
+ </plist>
data/plist.rb CHANGED
@@ -28,8 +28,13 @@
28
28
  # Array
29
29
  # Hash
30
30
  #
31
- # Note that Array and Hash are recursive -- the elements of an Array and the values of a Hash
32
- # must convert to a plist. Also note that the keys of the Hash must be strings.
31
+ # Notes:
32
+ #
33
+ # + Array and Hash are recursive -- the elements of an Array and the values of a Hash
34
+ # must convert to a plist.
35
+ # + The keys of the Hash must be strings.
36
+ # + The contents of data elements are returned as a Tempfile.
37
+ # + Data elements can be set with to an open IO or a StringIO
33
38
  #
34
39
  # If you have suggestions for mapping other Ruby types to the plist types, send a note to:
35
40
  #
@@ -45,6 +50,9 @@
45
50
  # especially those in "~/Library/Cookies/Cookies.plist"
46
51
  #
47
52
  # + Chuck Remes, who pushed me towards implementing #to_plist
53
+ #
54
+ # + Mat Schaffer, who supplied code and test cases for <data> elements
55
+ #
48
56
  class Plist
49
57
 
50
58
  TEMPLATE = <<-XML
@@ -61,7 +69,8 @@ XML
61
69
  # Note that I don't use these two elements much:
62
70
  #
63
71
  # + Date elements are returned as DateTime objects.
64
- # + Data elements are not yet implemented.
72
+ # + Data elements are implemented as a subcase of strings:
73
+ # http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/31933
65
74
  #
66
75
  # Plist::parse_xml will blow up if it encounters a data element.
67
76
  # If you encounter such an error, or if you have a Date element which
@@ -244,6 +253,19 @@ XML
244
253
  end
245
254
  end
246
255
 
256
+ require 'base64'
257
+ require 'tempfile'
258
+ class PData < PTag
259
+ def to_ruby
260
+ tf = Tempfile.new("plist.tmp")
261
+ tf.write Base64.decode64(text.gsub(/\s+/,''))
262
+ tf.close
263
+ # is this a good idea?
264
+ tf.open
265
+ tf
266
+ end
267
+ end
268
+
247
269
  module Emit
248
270
  def save_plist(filename)
249
271
  File.open(filename, 'wb') do |f|
@@ -311,7 +333,7 @@ class Array
311
333
  self.each do |e|
312
334
  element_plist = e.to_plist_fragment
313
335
  element_plist.each do |l|
314
- fragment += " #{l}\n"
336
+ fragment += "\t#{l.chomp}\n"
315
337
  end
316
338
  end
317
339
  fragment += "</array>"
@@ -324,13 +346,30 @@ class Hash
324
346
  def to_plist_fragment
325
347
  fragment = "<dict>\n"
326
348
  self.keys.sort.each do |k|
327
- fragment += " <key>#{k}</key>\n"
349
+ fragment += "\t<key>#{k}</key>\n"
328
350
  element_plist = self[k].to_plist_fragment
329
351
  element_plist.each do |l|
330
- fragment += " #{l}\n"
352
+ fragment += "\t#{l.chomp}\n"
331
353
  end
332
354
  end
333
355
  fragment += "</dict>"
334
356
  fragment
335
357
  end
336
358
  end
359
+
360
+ require 'stringio'
361
+ [ IO, StringIO ].each do |io_class|
362
+ io_class.module_eval do
363
+ include Plist::Emit
364
+ def to_plist_fragment
365
+ self.rewind
366
+ data = self.read
367
+
368
+ output = "<data>\n"
369
+ Base64::encode64(data).gsub(/\s+/, '').scan(/.{1,68}/o) { output << $& << "\n" }
370
+ output << "</data>"
371
+
372
+ output
373
+ end
374
+ end
375
+ end
@@ -51,6 +51,8 @@ class TestPlist < Test::Unit::TestCase
51
51
  # plist = Plist::parse_xml( "~/Pictures/iPhoto Library/AlbumData.xml" )
52
52
  #end
53
53
 
54
+
55
+ # date fields are credited to
54
56
  def test_date_fields
55
57
  result = Plist::parse_xml("Cookies.plist")
56
58
  assert_kind_of( DateTime, result.first['Expires'] )
@@ -65,10 +67,10 @@ class TestPlist < Test::Unit::TestCase
65
67
  assert_equal( Plist::_xml("<false/>"), false.to_plist )
66
68
  assert_equal( Plist::_xml("<true/>"), true.to_plist )
67
69
 
68
- assert_equal( Plist::_xml("<array>\n <true/>\n <false/>\n</array>"),
70
+ assert_equal( Plist::_xml("<array>\n\t<true/>\n\t<false/>\n</array>"),
69
71
  [ true, false ].to_plist )
70
72
 
71
- assert_equal( Plist::_xml("<dict>\n <key>False</key>\n <false/>\n <key>True</key>\n <true/>\n</dict>"),
73
+ assert_equal( Plist::_xml("<dict>\n\t<key>False</key>\n\t<false/>\n\t<key>True</key>\n\t<true/>\n</dict>"),
72
74
  { 'True' => true, 'False' => false }.to_plist )
73
75
 
74
76
  source = File.open("AlbumData.xml") { |f| f.read }
@@ -83,6 +85,21 @@ class TestPlist < Test::Unit::TestCase
83
85
  File.open('hello.plist') {|f| f.read } )
84
86
  end
85
87
 
88
+ # this functionality is credited to Mat Schaffer,
89
+ # who discovered the plist with the data tag
90
+ # supplied the test data, and provided the parsing code.
91
+ def test_data
92
+ data = Plist::parse_xml("example_data.plist");
93
+ assert_equal( File.open("example_data.jpg"){|f| f.read }, data['image'].read )
94
+ assert_equal( File.open("example_data.plist"){|f| f.read }, data.to_plist )
95
+
96
+ data['image'] = StringIO.new( File.open("example_data.jpg"){ |f| f.read } )
97
+ File.open('temp.plist', 'w'){|f| f.write data.to_plist }
98
+ assert_equal( File.open("example_data.plist"){|f| f.read }, data.to_plist )
99
+
100
+
101
+ end
102
+
86
103
  end
87
104
 
88
105
  __END__
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11.3
3
3
  specification_version: 1
4
4
  name: plist
5
5
  version: !ruby/object:Gem::Version
6
- version: 2.0.0
7
- date: 2006-07-04 00:00:00 -04:00
6
+ version: 2.1.0
7
+ date: 2006-07-29 00:00:00 -04:00
8
8
  summary: plist parses Mac OS X plist files into ruby data types.
9
9
  require_paths:
10
10
  - "."
@@ -31,6 +31,10 @@ authors:
31
31
  files:
32
32
  - plist.rb
33
33
  - test_plist.rb
34
+ - AlbumData.xml
35
+ - Cookies.plist
36
+ - example_data.jpg
37
+ - example_data.plist
34
38
  test_files:
35
39
  - test_plist.rb
36
40
  rdoc_options: []