xvi
■CONTENTS
Designing the Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Making the Dream a Reality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Reading Binary Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Writing Binary Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Adding Inheritance and Tagged Structures. . . . . . . . . . . . . . . . . . . . . . . . 323
Keeping Track of Inherited Slots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Tagged Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Primitive Binary Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
The Current Object Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
■CHAPTER 25 Practical: An ID3 Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Structure of an ID3v2 Tag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Defining a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Integer Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
String Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
ID3 Tag Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
ID3 Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Detecting Tag Padding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Supporting Multiple Versions of ID3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Versioned Frame Base Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Versioned Concrete Frame Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
What Frames Do You Actually Need? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Text Information Frames. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Comment Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Extracting Information from an ID3 Tag . . . . . . . . . . . . . . . . . . . . . . . . . . 357
■CHAPTER 26 Practical: Web Programming with AllegroServe . . . . . . . . 363
A 30-Second Intro to Server-Side Web Programming. . . . . . . . . . . . . . . 363
AllegroServe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Generating Dynamic Content with AllegroServe. . . . . . . . . . . . . . . . . . . . 368
Generating HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
HTML Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Query Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
A Small Application Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
The Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Seibel_2395Front.fm Page xvi Thursday, March 3, 2005 2:20 PM