| 314 | } |
| 315 | |
| 316 | Handle createPointerDataRefWithExtensions( void *data, size_t dataSize, const string &fileName, const string &mimeType ) |
| 317 | { |
| 318 | OSStatus err = noErr; |
| 319 | Handle dataRef = NULL; |
| 320 | ComponentInstance dataRefHandler = NULL; |
| 321 | |
| 322 | // First create a data reference handle for our data |
| 323 | dataRef = createPointerReferenceHandle( data, dataSize ); |
| 324 | if( ! dataRef ) |
| 325 | goto bail; |
| 326 | |
| 327 | // Get a data handler for our data reference |
| 328 | err = OpenADataHandler( |
| 329 | dataRef, /* data reference */ |
| 330 | PointerDataHandlerSubType, /* data ref. type */ |
| 331 | NULL, /* anchor data ref. */ |
| 332 | (OSType)0, /* anchor data ref. type */ |
| 333 | NULL, /* time base for data handler */ |
| 334 | kDataHCanRead, /* flag for data handler usage */ |
| 335 | &dataRefHandler); /* returns the data handler */ |
| 336 | if( err ) goto bail; |
| 337 | |
| 338 | // We can add the filename to the data ref to help |
| 339 | // importer finding process. Find uses the extension. |
| 340 | // If we add a filetype or mimetype we must add a |
| 341 | // filename -- even if it is an empty string |
| 342 | if( ( ! fileName.empty() ) || ( ! mimeType.empty() ) ) { |
| 343 | err = ptrDataRefAddFileNameExtension( dataRefHandler, fileName ); |
| 344 | if( err ) goto bail; |
| 345 | } |
| 346 | |
| 347 | // to add MIME type information, add a classic atom followed by |
| 348 | // a Pascal string holding the MIME type |
| 349 | if ( ! mimeType.empty() ) { |
| 350 | err = ptrDataRefAddMIMETypeExtension( dataRefHandler, mimeType ); |
| 351 | if( err ) goto bail; |
| 352 | } |
| 353 | |
| 354 | // dispose old data ref handle because it does not contain our new changes |
| 355 | ::DisposeHandle( dataRef ); |
| 356 | dataRef = NULL; |
| 357 | |
| 358 | // re-acquire data reference from the data handler to get the new changes |
| 359 | err = ::DataHGetDataRef( dataRefHandler, &dataRef ); |
| 360 | if( err ) goto bail; |
| 361 | |
| 362 | ::CloseComponent( dataRefHandler ); |
| 363 | |
| 364 | return dataRef; |
| 365 | bail: |
| 366 | if( dataRefHandler ) { |
| 367 | ::CloseComponent(dataRefHandler); |
| 368 | } |
| 369 | |
| 370 | if( dataRef ) { // make sure and dispose the data reference handle once we are done with it |
| 371 | ::DisposeHandle( dataRef ); |
| 372 | } |
| 373 |
no test coverage detected