home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 2 / MacMania 2.toast / Demo's / Tools&Utilities / Programming / QT MovieToolBox / ImportExportMovie.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-15  |  8.1 KB  |  300 lines  |  [TEXT/KAHL]

  1. /*
  2.     File:        ImportExportMovie.c
  3.  
  4.     Written by:    Peter Hoddie
  5.  
  6.     Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  7.  
  8.  
  9.     Modified by R. Mark Fleming to merge into PictMovier example code.
  10. */
  11.  
  12. #include "gGlobals.h"
  13.  
  14. /*
  15. //
  16. // IMPORT MOVIE
  17. //
  18.     The import file filter checks the given file to see if there is a
  19.         Movie Import Component available which could translate it into a
  20.         movie. If one is available, the file is allowed to be shown.
  21. */
  22. pascal Boolean  myImportFileFilter(ParmBlkPtr PB)
  23. {
  24.     ComponentDescription cd;
  25.     Boolean result = true;            /* true means we don't want it */
  26.  
  27.     cd.componentType = MovieImportType;
  28.     cd.componentSubType = PB->fileParam.ioFlFndrInfo.fdType;
  29.     cd.componentManufacturer = 0;
  30.     cd.componentFlags = canMovieImportFiles;
  31.     cd.componentFlagsMask = canMovieImportFiles;
  32.  
  33.     if (FindNextComponent(0, &cd))    /* search for component to do the work */
  34.         result = false;
  35.  
  36.     return result;
  37. }    /* () */
  38.  
  39. void importMovie(void)
  40. {
  41.     OSErr err;
  42.     StandardFileReply reply;
  43.     SFReply putFile;
  44.     FSSpec newFile;
  45.     Str255 newName;
  46.     Point where = {100,100};
  47.     Component c;
  48.     ComponentDescription cd;
  49.  
  50.     StandardGetFilePreview((FileFilterProcPtr)myImportFileFilter, 0, nil, &reply);
  51.     if (!reply.sfGood) return;
  52.  
  53.     BlockMove(reply.sfFile.name, newName, sizeof(reply.sfFile.name));
  54.     newName[++newName[0]] = '!';
  55.     
  56.     SFPutFile(where, "\pName imported movie:", newName, nil, &putFile);
  57.     if (!putFile.good) return;
  58.  
  59.     FSMakeFSSpec(putFile.vRefNum, 0, putFile.fName, &newFile);
  60.  
  61.     cd.componentType = MovieImportType;
  62.     cd.componentSubType = reply.sfType;
  63.     cd.componentManufacturer = 0;
  64.     cd.componentFlags = canMovieImportFiles;
  65.     cd.componentFlagsMask = canMovieImportFiles;
  66.     
  67.     c = FindNextComponent(nil, &cd);
  68.     if (!c) return;                        // too weird. no import component exists
  69.     
  70.     GetComponentInfo(c, &cd, nil, nil, nil);
  71.     if (cd.componentFlags & hasMovieImportUserInterface) {
  72.         MovieImportComponent importer;
  73.         Boolean canceled = false;
  74.  
  75.         importer = OpenComponent(c);
  76.         err = MovieImportDoUserDialog(importer, &reply.sfFile, nil, &canceled);
  77.         if (err || canceled) {
  78.             CloseComponent(importer);
  79.             return;
  80.         }
  81.         err = ConvertFileToMovieFile(&reply.sfFile, &newFile, 'TVOD', reply.sfScript, nil,
  82.             createMovieFileDeleteCurFile, importer, (MovieProgressProcPtr)-1, 0);
  83.         CloseComponent(importer);
  84.         
  85.     } else {
  86.         // no import user interface option, so let the toolbox open the component
  87.         err = ConvertFileToMovieFile(&reply.sfFile, &newFile, 'TVOD', reply.sfScript, nil,
  88.             createMovieFileDeleteCurFile, nil, (MovieProgressProcPtr)-1, 0);
  89.     }
  90.     if (err) {
  91.         SysBeep(1);
  92.         DeleteMovieFile(&newFile);
  93.     }
  94. }
  95.  
  96.  
  97. /*
  98. //
  99. // EXPORT MOVIE
  100. //
  101.     This file filter is particularly slimey. Standard File Preview automatically tries
  102.         to show all non-movie files that it could convert to movies. In a dialog to select
  103.         a movie to export, we only want to see movies. So what we do here is refetch the
  104.         file type for the selected file via the File System to see if Standard File
  105.         Preview is lying to us about the file type. If the file is indeed a movie, we
  106.         let it be shown. 
  107. */
  108. pascal Boolean myExportFileFilter(ParmBlkPtr PB)
  109. {
  110.     FSSpec fss;
  111.     FInfo info;
  112.  
  113.     FSMakeFSSpec(-*(short *)SFSaveDisk, *(long *)CurDirStore, PB->fileParam.ioNamePtr, &fss);
  114.     FSpGetFInfo(&fss, &info);
  115.     if (info.fdType == MovieFileType)
  116.         return false;
  117.     else
  118.         return true;
  119. }
  120.  
  121. /*
  122.     This skanky hook just constantly (and stupidly) watches the value of the export
  123.         types menu and jams it back into our local variable below.
  124. */
  125. pascal short myDlgHook(short item, DialogPtr theDialog, short *whichConverter)
  126. {
  127.     short kind;
  128.     Handle h;
  129.     Rect r;
  130.  
  131.     if (GetWRefCon(theDialog) != sfMainDialogRefCon)
  132.         return item;
  133.  
  134.     GetDItem(theDialog, sfItemNewFolderUser+1, &kind, &h, &r); // first custom item
  135.     *whichConverter = GetCtlValue((ControlHandle)h);
  136.  
  137.     return item;
  138. }
  139.  
  140. void exportMovie(void)
  141. {
  142.     OSErr err;
  143.     StandardFileReply reply, putFile;
  144.     OSType movieType = MovieFileType;
  145.     MenuHandle mh = GetMenu(kExportMenu);
  146.     ComponentDescription cd;
  147.     Component c = 0;
  148.     Point where = {0,0};
  149.     Str255 newName;
  150.     short convertItem = 1;
  151.     Component **exportComponents;
  152.     Movie theMovie = nil;
  153.     short resRef;
  154.     OSType creator;
  155.  
  156.     StandardGetFilePreview((FileFilterProcPtr)myExportFileFilter, 1, &movieType, &reply);
  157.     if (!reply.sfGood) return;
  158.  
  159.     // get the movie.
  160.     OpenMovieFile(&reply.sfFile, &resRef, fsRdPerm);
  161.     NewMovieFromFile(&theMovie, resRef, nil, nil, 0, nil);
  162.     CloseMovieFile(resRef);
  163.     if (!theMovie) return;
  164.     
  165.     SetMovieProgressProc(theMovie, (MovieProgressProcPtr)-1, 0);
  166.  
  167.     // build a list of all export components which are applicable to this movie
  168.     exportComponents = (Component **)NewHandle(0);
  169.  
  170.     cd.componentType = MovieExportType;
  171.     cd.componentSubType = 0;
  172.     cd.componentManufacturer = 0;
  173.     cd.componentFlags = canMovieExportFiles;
  174.     cd.componentFlagsMask = canMovieExportFiles;
  175.     while (c = FindNextComponent(c, &cd)) {
  176.         Handle h = NewHandle(4);
  177.         ComponentDescription exportCD;
  178.  
  179.         if (h && GetComponentInfo(c, &exportCD, h, nil, nil) == noErr) {
  180.             Str255 s;
  181.             Handle h2 = NewHandle(4);
  182.             ComponentDescription mhcd;
  183.             Component mediaHandler;
  184.  
  185.             mhcd.componentType = MediaHandlerType;
  186.             mhcd.componentSubType = exportCD.componentManufacturer;
  187.             mhcd.componentManufacturer = 0;
  188.             mhcd.componentFlags = 0;
  189.             mhcd.componentFlagsMask = 0;
  190.             
  191.             if (mediaHandler = FindNextComponent(0, &mhcd)) {
  192.             
  193.                 long trackCount = GetMovieTrackCount(theMovie);
  194.                 long i;
  195.                 Boolean foundMedia = true;
  196.  
  197.                 // make sure the media type the component can export is in the movie
  198.                 if (exportCD.componentManufacturer) {
  199.                     foundMedia = false;
  200.                     for (i=1; i<=trackCount; i++) {
  201.                         Track t = GetMovieIndTrack(theMovie, i);
  202.                         OSType mediaType;
  203.     
  204.                         GetMediaHandlerDescription(GetTrackMedia(t), &mediaType, nil, nil);
  205.                         foundMedia = (mediaType == exportCD.componentManufacturer);
  206.                         if (foundMedia) break;
  207.                     }
  208.                 }
  209.  
  210.                 if (foundMedia && (GetComponentInfo(mediaHandler, nil, h2, nil, nil) == noErr)) {
  211.                     Str255 s;
  212.  
  213.                     // build menu name in un-international friendly way
  214.                     if (exportCD.componentManufacturer) {
  215.                         BlockMove(*h2, s, sizeof(s));
  216.                         s[++s[0]] = ' ';
  217.                         s[++s[0]] = 't';
  218.                         s[++s[0]] = 'o';
  219.                         s[++s[0]] = ' ';
  220.                     } else
  221.                         s[0] = 0;
  222.                     BlockMove(*h + 1, &s[s[0] + 1], **h);
  223.                     s[0] += **h;
  224.  
  225.                     AppendMenu(mh, s);
  226.                     PtrAndHand((Ptr)&c, (Handle)exportComponents, sizeof(c));
  227.                     DisposHandle(h);
  228.                     h = nil;
  229.                 }
  230.             }
  231.         }
  232.  
  233.         if (h) DisposHandle(h);
  234.     }
  235.     InsertMenu(mh, -1);
  236.  
  237.     if (GetHandleSize((Handle)exportComponents) == 0) {
  238.         // no export components for this movie are available
  239.         SysBeep(1);
  240.         goto bail;
  241.     }
  242.  
  243.     BlockMove(reply.sfFile.name, newName, 255);
  244.     newName[++newName[0]] = '!';
  245.     CustomPutFile("\pExport a file", newName, &putFile,
  246.                     kMyCustomSaveDialog, where, (DlgHookYDProcPtr)myDlgHook, 
  247.                     nil, nil, nil, (void *)&convertItem);
  248.     if (!putFile.sfGood) goto bail;
  249.  
  250.     GetComponentInfo((*exportComponents)[convertItem - 1], &cd, nil, nil, nil);
  251.  
  252.     // cheap map in the application to allow us to chose the file creator
  253.     {
  254.     Handle h = GetResource('fMap', 128);
  255.     short count = GetHandleSize(h) / (sizeof(OSType) * 2);
  256.     OSType *creators = *(OSType **)h;
  257.  
  258.     creator = '????';
  259.     while (count-- > 0) {
  260.         if (*creators++ == cd.componentSubType) {
  261.             creator = *creators;
  262.             break;
  263.         }
  264.         creators++;
  265.     }
  266.     }
  267.  
  268.     if (cd.componentFlags & hasMovieExportUserInterface) {
  269.         MovieExportComponent exporter;
  270.         Boolean canceled = false;
  271.  
  272.         exporter = OpenComponent((*exportComponents)[convertItem - 1]);
  273.         err = MovieExportDoUserDialog(exporter, &reply.sfFile, nil, &canceled);
  274.         if (err || canceled) {
  275.             CloseComponent(exporter);
  276.             return;
  277.         }
  278.         err = ConvertMovieToFile(theMovie, nil, &putFile.sfFile,
  279.             cd.componentSubType, creator, putFile.sfScript, nil, createMovieFileDeleteCurFile,
  280.             exporter);
  281.         CloseComponent(exporter);
  282.     }
  283.     else {
  284.         // no user interface available. let the movie toolbox do the hard part
  285.         err = ConvertMovieToFile(theMovie, nil, &putFile.sfFile,
  286.             cd.componentSubType, creator, putFile.sfScript, nil, createMovieFileDeleteCurFile,
  287.             (ComponentInstance)(*exportComponents)[convertItem - 1]);
  288.     }
  289.  
  290.     if (err)    SysBeep(1);
  291.  
  292. bail:
  293.     DeleteMenu(kExportMenu);
  294.     DisposeMenu(mh);
  295.     DisposeMovie(theMovie);
  296.     DisposHandle((Handle)exportComponents);
  297. }
  298.  
  299.  
  300.