Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
main.c
| /* | 
| File: main.c | 
| Contains: High-level code to display QuickTime MetaData for a QuickTime | 
| movie. | 
| Version: 1.0 | 
| Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple | 
| Computer, Inc. ("Apple") in consideration of your agreement to the | 
| following terms, and your use, installation, modification or | 
| redistribution of this Apple software constitutes acceptance of these | 
| terms. If you do not agree with these terms, please do not use, | 
| install, modify or redistribute this Apple software. | 
| In consideration of your agreement to abide by the following terms, and | 
| subject to these terms, Apple grants you a personal, non-exclusive | 
| license, under Apple's copyrights in this original Apple software (the | 
| "Apple Software"), to use, reproduce, modify and redistribute the Apple | 
| Software, with or without modifications, in source and/or binary forms; | 
| provided that if you redistribute the Apple Software in its entirety and | 
| without modifications, you must retain this notice and the following | 
| text and disclaimers in all such redistributions of the Apple Software. | 
| Neither the name, trademarks, service marks or logos of Apple Computer, | 
| Inc. may be used to endorse or promote products derived from the Apple | 
| Software without specific prior written permission from Apple. Except | 
| as expressly stated in this notice, no other rights or licenses, express | 
| or implied, are granted by Apple herein, including but not limited to | 
| any patent rights that may be infringed by your derivative works or by | 
| other works in which the Apple Software may be incorporated. | 
| The Apple Software is provided by Apple on an "AS IS" basis. APPLE | 
| MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION | 
| THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS | 
| FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND | 
| OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. | 
| IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL | 
| OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
| SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
| INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, | 
| MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED | 
| AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), | 
| STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE | 
| POSSIBILITY OF SUCH DAMAGE. | 
| Copyright © 2005 Apple Computer, Inc., All Rights Reserved | 
| */ | 
| #include <Carbon/Carbon.h> | 
| #include <QuickTime/QuickTime.h> | 
| #include "MetaDataUtils.h" | 
| #include "QTUtils.h" | 
| #include "DumpMetaData.h" | 
| pascal OSStatus CommandProcess(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData); | 
| void DoHITextViewFromAPIs(void); | 
| OSStatus GetHITextViewForWindow(WindowRef window, HIViewRef *outTextView); | 
| void DrawStringToFrontWindow(CFStringRef stringRef); | 
| void DrawUTF8DataAsString(QTPropertyValuePtr keyValuePtr); | 
| void CreateNewMetaDataWindow(void); | 
| enum | 
| { | 
| kMyCreator = ' DTS', | 
| kMyPropTag = 'CUST' | 
| }; | 
| struct MyWinCustomData | 
| { | 
| HIViewRef theTextView; // Text View for window | 
| }; | 
| typedef struct MyWinCustomData MyWinCustomData; | 
| ////////// | 
| // | 
| // GetTextViewForFrontWindow | 
| // | 
| // Retrieve the Text View for the frontmost window | 
| // | 
| ////////// | 
| HIViewRef GetTextViewForFrontWindow() | 
| { | 
| WindowRef frontWindow = GetFrontWindowOfClass(kDocumentWindowClass, true); | 
| require(frontWindow != nil, CantGetFrontWindow); | 
| UInt32 actualSize; | 
| MyWinCustomData winData; | 
| // get our custom structure with the text view info. | 
| GetWindowProperty(frontWindow, | 
| kMyCreator, | 
| kMyPropTag, | 
| sizeof (struct MyWinCustomData), | 
| &actualSize, /* can be NULL */ | 
| (void *)&winData); | 
| return (winData.theTextView); | 
| CantGetFrontWindow: | 
| return nil; | 
| } | 
| ////////// | 
| // | 
| // AddTextToTextView | 
| // | 
| // Set text data to the specified text view | 
| // | 
| ////////// | 
| void AddTextToTextView(HIViewRef textView, UniChar *buffer, ByteCount size) | 
| { | 
| TXNOffset oStartOffset, oEndOffset; | 
| TXNGetSelection (HITextViewGetTXNObject(textView),&oStartOffset,&oEndOffset); | 
| TXNSetData(HITextViewGetTXNObject(textView), kTXNUnicodeTextData, buffer, size, oEndOffset, oEndOffset); | 
| } | 
| ////////// | 
| // | 
| // DrawCFStringToTextView | 
| // | 
| // Draw the CFString to the specified Text View | 
| // | 
| ////////// | 
| void DrawCFStringToTextView(CFStringRef stringRef, HIViewRef textView) | 
| { | 
| CFIndex size = CFStringGetLength (stringRef); | 
| CFRange range = CFRangeMake(0, size); | 
| UniChar *buffer = (UniChar *)malloc(range.length * sizeof(UniChar)); | 
| require(buffer != nil, CantMakeBuffer); | 
| CFStringGetCharacters(stringRef, range, buffer); | 
| AddTextToTextView(textView, buffer, range.length * sizeof(UniChar)); | 
| free((void *)buffer); | 
| CantMakeBuffer: | 
| return; | 
| } | 
| ////////// | 
| // | 
| // DrawStringToFrontWindow | 
| // | 
| // Draw the CFString to the Text View for the frontmost window | 
| // | 
| ////////// | 
| void DrawStringToFrontWindow(CFStringRef stringRef) | 
| { | 
| DrawCFStringToTextView(stringRef, GetTextViewForFrontWindow()); | 
| } | 
| ////////// | 
| // | 
| // DrawStorageCountStrToWindow | 
| // | 
| // Draw our specially formatted string for the storage format containing : | 
| // - the storage format type, plus | 
| // - count of the number of metadata items for that storage format | 
| // | 
| ////////// | 
| void DrawStorageCountStrToWindow(char *storageFormatString, ItemCount outCount) | 
| { | 
| CFStringRef countStr = NULL; | 
| countStr = CFStringCreateWithFormat( kCFAllocatorDefault, | 
| NULL, | 
|                                         CFSTR("%s storage format \n    item count = %d \n"),  | 
| storageFormatString, | 
| outCount ); | 
| if (countStr) | 
|     { | 
| DrawCFStringToTextView(countStr, GetTextViewForFrontWindow()); | 
| CFRelease(countStr); | 
| } | 
| } | 
| ////////// | 
| // | 
| // CreateNewMetaDataWindow | 
| // | 
| // Create a window to display all the metadata for a given movie | 
| // | 
| ////////// | 
| void CreateNewMetaDataWindow(void) | 
| { | 
| IBNibRef nibRef; | 
| OSStatus err; | 
| // Create a Nib reference passing the name of the nib file (without the .nib extension) | 
| // CreateNibReference only searches into the application bundle. | 
|     err = CreateNibReference(CFSTR("main"), &nibRef); | 
| require_noerr(err, CantGetNibRef); | 
| WindowRef window; | 
| // Then create a window. "MainWindow" is the name of the window object. This name is set in | 
| // InterfaceBuilder when the nib is created. | 
|     err = CreateWindowFromNib(nibRef, CFSTR("MainWindow"), &window); | 
| require_noerr(err, CantCreateWindow); | 
| // We don't need the nib reference anymore. | 
| DisposeNibReference(nibRef); | 
|     ControlID id = { 'xyzt', 1 }; // set with Interface Builder in the Inspector | 
| HIViewRef theTextView = nil; | 
| err = HIViewFindByID(HIViewGetRoot(window), id, &theTextView); | 
| MyWinCustomData winData; | 
| winData.theTextView = theTextView; | 
| // save the HIView TextView for our window so we can easily access it | 
| err = SetWindowProperty ( window, | 
| kMyCreator, | 
| kMyPropTag, | 
| sizeof(struct MyWinCustomData), | 
| &winData ); | 
| // The window was created hidden so show it. | 
| ShowWindow(window); | 
| // get a movie and display its metadata | 
| CFStringRef movieName = NULL; | 
| Movie aMovie = GetMovieAndMovieName(&movieName); | 
| require(aMovie != nil, CantGetAMovie); | 
| // draw movie name for window title | 
| err = SetWindowTitleWithCFString(window, movieName); | 
| // show the movie's metadata | 
| DumpMovieMetaData(aMovie); | 
|     EventTypeSpec eventType = {kEventClassCommand, kEventCommandProcess}; | 
| InstallEventHandler(GetApplicationEventTarget(), NewEventHandlerUPP(CommandProcess), 1, &eventType, NULL, NULL); | 
| return; | 
| CantGetAMovie: | 
| DisposeWindow(window); | 
|     EventTypeSpec eventType2 = {kEventClassCommand, kEventCommandProcess}; | 
| InstallEventHandler(GetApplicationEventTarget(), NewEventHandlerUPP(CommandProcess), 1, &eventType2, NULL, NULL); | 
| CantCreateWindow: | 
| CantGetNibRef: | 
| return; | 
| } | 
| ////////// | 
| // | 
| // CommandProcess | 
| // | 
| // Standard Event Handler | 
| // | 
| ////////// | 
| pascal OSStatus CommandProcess(EventHandlerCallRef nextHandler, EventRef theEvent, void* userData) | 
| { | 
| #pragma unused (nextHandler, userData) | 
| HICommand aCommand; | 
| OSStatus status = noErr; | 
| GetEventParameter(theEvent, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &aCommand); | 
| switch (aCommand.commandID) | 
|     { | 
| case kHICommandNew: | 
| CreateNewMetaDataWindow(); // create new QT MetaData window | 
| break; | 
| default: | 
| status = eventNotHandledErr; | 
| break; | 
| } | 
| return status; | 
| } | 
| ////////// | 
| // | 
| // main | 
| // | 
| // The main function for this application. | 
| // | 
| ////////// | 
| int main(int argc, char* argv[]) | 
| { | 
| OSStatus err = noErr; | 
| // Can we run this particular demo application? | 
| long response; | 
| err = Gestalt(gestaltSystemVersion, &response); | 
| Boolean ok = ((err == noErr) && (response >= 0x00001030)); | 
| if (!ok) | 
|     { | 
| StandardAlert(kAlertStopAlert, "\pMac OS X 10.3 (minimum) is required for this application", "\p", NULL, NULL); | 
| ExitToShell(); | 
| } | 
| // Initialize QuickTime | 
| err = EnterMovies(); | 
| require_noerr(err, CantInitQuickTime); | 
| IBNibRef nibRef; | 
| // Create a Nib reference passing the name of the nib file (without the .nib extension) | 
| // CreateNibReference only searches into the application bundle. | 
|     err = CreateNibReference(CFSTR("main"), &nibRef); | 
| require_noerr(err, CantGetNibRef); | 
| // Once the nib reference is created, set the menu bar. "MainMenu" is the name of the menu bar | 
| // object. This name is set in InterfaceBuilder when the nib is created. | 
|     err = SetMenuBarFromNib(nibRef, CFSTR("MenuBar")); | 
| require_noerr(err, CantSetMenuBar); | 
| // We don't need the nib reference anymore. | 
| DisposeNibReference(nibRef); | 
| // create a new window to display metadata items for a QuickTime movie | 
| CreateNewMetaDataWindow(); | 
| // Call the event loop | 
| RunApplicationEventLoop(); | 
| return err; | 
| CantSetMenuBar: | 
| DisposeNibReference(nibRef); | 
| CantGetNibRef: | 
| CantInitQuickTime: | 
| return err; | 
| } | 
Copyright © 2009 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2009-03-16