andrew@0: /* andrew@0: * ofxFileDialogOSX.cpp andrew@0: * andrew@0: * Created by timknapen on 07/05/10. andrew@0: * www.wereldderindianen.be andrew@0: * code stolen from 'mantissa' over here: andrew@0: * http://www.openframeworks.cc/forum/viewtopic.php?p=5028#p5028 andrew@0: * andrew@0: */ andrew@0: andrew@0: #include "ofxFileDialogOSX.h" andrew@0: andrew@0: andrew@0: //--------------------------------------------------------------------------------- andrew@0: int ofxFileDialogOSX::saveFile(string& URL, string& fileURL){ andrew@0: andrew@0: short fRefNumOut; andrew@0: FSRef output_file; andrew@0: OSStatus err; andrew@0: andrew@0: NavDialogCreationOptions options; andrew@0: NavGetDefaultDialogCreationOptions( &options ); andrew@0: options.modality = kWindowModalityAppModal; andrew@0: andrew@0: NavDialogRef dialog; andrew@0: err = NavCreatePutFileDialog(&options, '.mov', 'Moov', NULL, NULL, &dialog); andrew@0: err = NavDialogRun(dialog); andrew@0: andrew@0: NavUserAction action; andrew@0: action = NavDialogGetUserAction( dialog ); andrew@0: if (action == kNavUserActionNone || action == kNavUserActionCancel) return 0; andrew@0: andrew@0: NavReplyRecord reply; andrew@0: err = NavDialogGetReply(dialog, &reply); andrew@0: if ( err != noErr ) return 0; andrew@0: andrew@0: if ( reply.replacing ) andrew@0: { andrew@0: printf("need to replace\n"); andrew@0: } andrew@0: andrew@0: AEKeyword keyword; andrew@0: DescType actual_type; andrew@0: Size actual_size; andrew@0: FSRef output_dir; andrew@0: err = AEGetNthPtr(&(reply.selection), 1, typeFSRef, &keyword, &actual_type, andrew@0: &output_dir, sizeof(output_file), &actual_size); andrew@0: andrew@0: andrew@0: andrew@0: CFURLRef cfUrl = CFURLCreateFromFSRef( kCFAllocatorDefault, &output_dir ); andrew@0: CFStringRef cfString = NULL; andrew@0: if ( cfUrl != NULL ) andrew@0: { andrew@0: cfString = CFURLCopyFileSystemPath( cfUrl, kCFURLPOSIXPathStyle ); // LEAK? andrew@0: CFRelease( cfUrl ); andrew@0: } andrew@0: andrew@0: // copy from a CFString into a local c string (http://www.carbondev.com/site/?page=CStrings+) andrew@0: const int kBufferSize = 255; andrew@0: andrew@0: char folderURL[kBufferSize]; andrew@0: Boolean bool1 = CFStringGetCString(cfString,folderURL,kBufferSize,kCFStringEncodingMacRoman); andrew@0: andrew@0: char fileName[kBufferSize]; andrew@0: Boolean bool2 = CFStringGetCString(reply.saveFileName,fileName,kBufferSize,kCFStringEncodingMacRoman); andrew@0: andrew@0: URL = folderURL; andrew@0: fileURL = fileName; andrew@0: // cleanup dialog andrew@0: NavDialogDispose(dialog); andrew@0: // dispose of reply: andrew@0: NavDisposeReply(&reply); andrew@0: // dispose of cfString andrew@0: CFRelease( cfString ); andrew@0: andrew@0: andrew@0: return 1; andrew@0: } andrew@0: andrew@0: andrew@0: //--------------------------------------------------------------------------------- andrew@0: int ofxFileDialogOSX::openFile(string& URL){ andrew@0: andrew@0: short fRefNumOut; andrew@0: FSRef output_file; andrew@0: OSStatus err; andrew@0: andrew@0: NavDialogCreationOptions options; andrew@0: NavGetDefaultDialogCreationOptions( &options ); andrew@0: options.modality = kWindowModalityAppModal; andrew@0: // adding a banner andrew@0: // options.message = CFStringCreateWithCString(kCFAllocatorDefault, "hello world", kCFStringEncodingMacRoman); andrew@0: NavDialogRef dialog; andrew@0: andrew@0: err = NavCreateGetFileDialog(&options, NULL, NULL ,NULL, NULL, NULL, &dialog); andrew@0: err = NavDialogRun(dialog); andrew@0: andrew@0: NavUserAction action; andrew@0: action = NavDialogGetUserAction( dialog ); andrew@0: andrew@0: if (action == kNavUserActionNone || action == kNavUserActionCancel) { andrew@0: cout << "no action or action cancel" << endl; andrew@0: return 0; andrew@0: } andrew@0: andrew@0: // get dialog reply andrew@0: NavReplyRecord reply; andrew@0: err = NavDialogGetReply(dialog, &reply); andrew@0: if ( err != noErr ){ andrew@0: cout << "error getting DialogReply" << endl; andrew@0: return 0; andrew@0: } andrew@0: if ( reply.replacing ) andrew@0: { andrew@0: cout << (" need to replace\n ") << endl; andrew@0: } andrew@0: andrew@0: AEKeyword keyword; andrew@0: DescType actual_type; andrew@0: Size actual_size; andrew@0: FSRef output_dir; andrew@0: err = AEGetNthPtr(&(reply.selection), 1, typeFSRef, &keyword, &actual_type, andrew@0: &output_dir, sizeof(output_file), &actual_size); andrew@0: andrew@0: CFURLRef cfUrl = CFURLCreateFromFSRef( kCFAllocatorDefault, &output_dir ); andrew@0: CFStringRef cfString = NULL; andrew@0: if ( cfUrl != NULL ) andrew@0: { andrew@0: cfString = CFURLCopyFileSystemPath( cfUrl, kCFURLPOSIXPathStyle ); andrew@0: CFRelease( cfUrl ); andrew@0: } andrew@0: andrew@0: // copy from a CFString into a local c string (http://www.carbondev.com/site/?page=CStrings+) andrew@0: const int kBufferSize = 255; andrew@0: andrew@0: char fileURL[kBufferSize]; andrew@0: Boolean bool1 = CFStringGetCString(cfString,fileURL,kBufferSize,kCFStringEncodingMacRoman); andrew@0: URL = fileURL; andrew@0: // cleanup dialog andrew@0: NavDialogDispose(dialog); andrew@0: // dispose of reply: andrew@0: NavDisposeReply(&reply); andrew@0: // dispose of cfString andrew@0: CFRelease( cfString ); andrew@0: return 1; andrew@0: }