Back to index

lightning-sunbird  0.9+nobinonly
GetMetadataForFile.c
Go to the documentation of this file.
00001 /* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004 *
00005 * The contents of this file are subject to the Mozilla Public License Version
00006 * 1.1 (the "License"); you may not use this file except in compliance with
00007 * the License. You may obtain a copy of the License at
00008 * http://www.mozilla.org/MPL/
00009 *
00010 * Software distributed under the License is distributed on an "AS IS" basis,
00011 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012 * for the specific language governing rights and limitations under the
00013 * License.
00014 *
00015 * The Original Code is mozilla.org code.
00016 *
00017 * The Initial Developer of the Original Code is
00018 * Netscape Communications Corporation.
00019 * Portions created by the Initial Developer are Copyright (C) 2007
00020 * the Initial Developer. All Rights Reserved.
00021 *
00022 * Contributor(s):
00023 *   David Bienvenu <bienvenu@nventure.com>
00024 *
00025 * Alternatively, the contents of this file may be used under the terms of
00026 * either of the GNU General Public License Version 2 or later (the "GPL"),
00027 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028 * in which case the provisions of the GPL or the LGPL are applicable instead
00029 * of those above. If you wish to allow use of your version of this file only
00030 * under the terms of either the GPL or the LGPL, and not to allow others to
00031 * use your version of this file under the terms of the MPL, indicate your
00032 * decision by deleting the provisions above and replace them with the notice
00033 * and other provisions required by the GPL or the LGPL. If you do not delete
00034 * the provisions above, a recipient may use your version of this file under
00035 * the terms of any one of the MPL, the GPL or the LGPL.
00036 *
00037 * ***** END LICENSE BLOCK ***** */
00038 
00039 
00040 #include <CoreFoundation/CoreFoundation.h>
00041 #include <CoreServices/CoreServices.h> 
00042 
00043 
00044 /* -----------------------------------------------------------------------------
00045     Get metadata attributes from file
00046    
00047    This function's job is to extract useful information from the .mozeml file
00048    and return it as a dictionary
00049    ----------------------------------------------------------------------------- */
00050 
00051 Boolean GetMetadataForFile(void* thisInterface, 
00052                         CFMutableDictionaryRef attributes, 
00053                         CFStringRef contentTypeUTI,
00054                         CFStringRef pathToFile)
00055 {
00056     /* Pull any available metadata from the file at the specified path */
00057     /* Return the attribute keys and attribute values in the dict */
00058     /* Return TRUE if successful, FALSE if there was no data provided */
00059   Boolean success;
00060   CFURLRef fileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, pathToFile, kCFURLPOSIXPathStyle, false);
00061   CFReadStreamRef stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, fileURL);
00062   CFReadStreamOpen(stream);
00063 
00064   CFPropertyListFormat format;
00065   CFStringRef errorString = NULL;
00066   CFPropertyListRef ticket = CFPropertyListCreateFromStream(kCFAllocatorDefault,
00067                              stream,
00068                              /*streamLength*/ 0,
00069                              kCFPropertyListImmutable,
00070                               &format,
00071                              &errorString
00072                              );
00073   if (errorString)
00074   {
00075     printf("failed creating property list from stream\n");
00076     printf("error = %s\n", (const char*) errorString);
00077     success = FALSE;
00078   } 
00079   else
00080   {
00081     CFTypeRef value;
00082     value = CFDictionaryGetValue(ticket, kMDItemTitle);
00083      if (value)
00084      {
00085        CFDictionarySetValue(attributes, kMDItemTitle, value);
00086      }
00087      value = CFDictionaryGetValue(ticket, kMDItemTextContent);
00088      if (value)
00089      {
00090        CFDictionarySetValue(attributes, kMDItemTextContent, value);
00091        
00092      }
00093      value = CFDictionaryGetValue(ticket, kMDItemDisplayName);
00094      if (value)
00095        CFDictionarySetValue(attributes, kMDItemDisplayName, value);
00096         
00097      CFDateFormatterRef dateFormatter = CFDateFormatterCreate(NULL, NULL, kCFDateFormatterLongStyle, kCFDateFormatterLongStyle);
00098                                               
00099      value = CFDictionaryGetValue(ticket, kMDItemLastUsedDate);
00100 
00101      if (value && dateFormatter)
00102      {
00103        printf("trying to parse date \n");
00104        CFDateRef curDate = CFDateFormatterCreateDateFromString(NULL, dateFormatter, value, NULL);
00105        printf("got cur date\n");
00106        if (curDate)
00107          CFDictionarySetValue(attributes, kMDItemLastUsedDate, curDate);
00108      }
00109                                                    
00110      success = TRUE;
00111   }
00112   // contents are kMDItemTextContent
00113   
00114   CFReadStreamClose(stream);
00115   CFRelease(stream);
00116   CFRelease(fileURL);
00117   return success;    
00118 }