File attribute renames: std:: -> standard:: fs:: -> filesystem:: id::fs ->
[platform/upstream/glib.git] / gio / glocalfileinfo.c
index dac9f93..a633fd1 100644 (file)
@@ -57,6 +57,7 @@
 
 #include <glib/gstdio.h>
 #include <glib/gchecksum.h>
+#include <gfileattribute-priv.h>
 
 #include "glibintl.h"
 
@@ -184,7 +185,7 @@ get_selinux_context (const char            *path,
 #ifdef HAVE_SELINUX
   char *context;
 
-  if (!g_file_attribute_matcher_matches (attribute_matcher, "selinux:context"))
+  if (!g_file_attribute_matcher_matches (attribute_matcher, "selinux::context"))
     return;
   
   if (is_selinux_enabled ())
@@ -202,7 +203,7 @@ get_selinux_context (const char            *path,
 
       if (context)
        {
-         g_file_info_set_attribute_string (info, "selinux:context", context);
+         g_file_info_set_attribute_string (info, "selinux::context", context);
          freecon(context);
        }
     }
@@ -483,12 +484,12 @@ get_xattrs (const char            *path,
              if (user)
                {
                  escaped_attr = hex_escape_string (attr + 5, &free_escaped_attr);
-                 gio_attr = g_strconcat ("xattr:", escaped_attr, NULL);
+                 gio_attr = g_strconcat ("xattr::", escaped_attr, NULL);
                }
              else
                {
                  escaped_attr = hex_escape_string (attr, &free_escaped_attr);
-                 gio_attr = g_strconcat ("xattr_sys:", escaped_attr, NULL);
+                 gio_attr = g_strconcat ("xattr-sys::", escaped_attr, NULL);
                }
              
              if (free_escaped_attr)
@@ -597,7 +598,7 @@ get_xattrs_from_fd (int                    fd,
   if (user)
     all = g_file_attribute_matcher_enumerate_namespace (matcher, "xattr");
   else
-    all = g_file_attribute_matcher_enumerate_namespace (matcher, "xattr_sys");
+    all = g_file_attribute_matcher_enumerate_namespace (matcher, "xattr-sys");
 
   if (all)
     {
@@ -636,12 +637,12 @@ get_xattrs_from_fd (int                    fd,
              if (user)
                {
                  escaped_attr = hex_escape_string (attr + 5, &free_escaped_attr);
-                 gio_attr = g_strconcat ("xattr:", escaped_attr, NULL);
+                 gio_attr = g_strconcat ("xattr::", escaped_attr, NULL);
                }
              else
                {
                  escaped_attr = hex_escape_string (attr, &free_escaped_attr);
-                 gio_attr = g_strconcat ("xattr_sys:", escaped_attr, NULL);
+                 gio_attr = g_strconcat ("xattr-sys::", escaped_attr, NULL);
                }
              
              if (free_escaped_attr)
@@ -721,14 +722,14 @@ set_xattr (char                       *filename,
       return FALSE;
     }
 
-  if (g_str_has_prefix (escaped_attribute, "xattr:"))
+  if (g_str_has_prefix (escaped_attribute, "xattr::"))
     {
       escaped_attribute += 6;
       is_user = TRUE;
     }
   else
     {
-      g_assert (g_str_has_prefix (escaped_attribute, "xattr_sys:"));
+      g_warn_if_fail (g_str_has_prefix (escaped_attribute, "xattr-sys::"));
       escaped_attribute += 10;
       is_user = FALSE;
     }
@@ -950,10 +951,10 @@ set_info_from_stat (GFileInfo             *info,
     }
 
   if (g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_ID_FS))
+                                       G_FILE_ATTRIBUTE_ID_FILESYSTEM))
     {
       char *id = _g_local_file_info_create_fs_id (statbuf);
-      g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_ID_FS, id);
+      g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_ID_FILESYSTEM, id);
       g_free (id);
     }
 }
@@ -991,7 +992,7 @@ make_valid_utf8 (const char *name)
   
   g_string_append (string, remainder);
 
-  g_assert (g_utf8_validate (string->str, -1, NULL));
+  g_warn_if_fail (g_utf8_validate (string->str, -1, NULL));
   
   return g_string_free (string, FALSE);
 }
@@ -1238,7 +1239,7 @@ get_thumbnail_attributes (const char *path,
   uri = g_filename_to_uri (path, NULL, NULL);
 
   checksum = g_checksum_new (G_CHECKSUM_MD5);
-  g_checksum_update (checksum, (const gchar *) uri, strlen (uri));
+  g_checksum_update (checksum, (const guchar *) uri, strlen (uri));
 
   basename = g_strconcat (g_checksum_get_string (checksum), ".png", NULL);
   g_checksum_free (checksum);
@@ -1266,14 +1267,14 @@ get_thumbnail_attributes (const char *path,
 }
 
 #ifdef G_OS_WIN32
-void
+static void
 win32_get_file_user_info (const gchar* filename,
                          gchar **group_name, 
                          gchar **user_name, 
                          gchar **real_name)
 {
   PSECURITY_DESCRIPTOR psd = NULL;
-  DWORD sd_size = 0; /* first call calculates the size rewuired */
+  DWORD sd_size = 0; /* first call calculates the size required */
   
   wchar_t *wfilename = g_utf8_to_utf16 (filename, -1, NULL, NULL, NULL);
   if ((GetFileSecurityW (wfilename, 
@@ -1283,31 +1284,74 @@ win32_get_file_user_info (const gchar* filename,
                        &sd_size) || (ERROR_INSUFFICIENT_BUFFER == GetLastError())) &&
      (psd = g_try_malloc (sd_size)) != NULL &&
      GetFileSecurityW (wfilename, 
-                        GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION,
-                       psd,
-                       sd_size,
-                       &sd_size))
+                       GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION,
+                      psd,
+                      sd_size,
+                      &sd_size))
     {
       PSID psid = 0;
-      SID_NAME_USE name_use; /* don't care? */
-      char *name = NULL;
+      BOOL defaulted;
+      SID_NAME_USE name_use = 0; /* don't care? */
+      wchar_t *name = NULL;
+      wchar_t *domain = NULL;
       DWORD name_len = 0;
-      if (user_name && 
-          GetSecurityDescriptorOwner (psd, &psid, NULL) &&
-          (LookupAccountSid (NULL, /* local machine */
-                             psid, 
-                            name, &name_len,
-                            NULL, NULL, /* no domain info yet */
-                            &name_use)  || (ERROR_INSUFFICIENT_BUFFER == GetLastError())) &&
-         (name = g_try_malloc (name_len)) != NULL &&
-          LookupAccountSid (NULL, /* local machine */
-                            psid, 
-                           name, &name_len,
-                           NULL, NULL, /* no domain info yet */
-                           &name_use))
-       {
-         *user_name = name;
-       }                                
+      DWORD domain_len = 0;
+      /* get the user name */
+      do {
+        if (!user_name)
+         break;
+       if (!GetSecurityDescriptorOwner (psd, &psid, &defaulted))
+         break;
+       if (!LookupAccountSidW (NULL, /* local machine */
+                                psid, 
+                               name, &name_len,
+                               domain, &domain_len, /* no domain info yet */
+                               &name_use)  && (ERROR_INSUFFICIENT_BUFFER != GetLastError()))
+         break;
+       name = g_try_malloc (name_len*sizeof(wchar_t));
+       domain = g_try_malloc (domain_len*sizeof(wchar_t));
+       if (name && domain &&
+            LookupAccountSidW (NULL, /* local machine */
+                               psid, 
+                              name, &name_len,
+                              domain, &domain_len, /* no domain info yet */
+                              &name_use))
+         {
+           *user_name = g_utf16_to_utf8 (name, -1, NULL, NULL, NULL);
+         }
+       g_free (name);
+       g_free (domain);
+      } while (FALSE);
+
+      /* get the group name */
+      do {
+        if (!group_name)
+         break;
+       if (!GetSecurityDescriptorGroup (psd, &psid, &defaulted))
+         break;
+       if (!LookupAccountSidW (NULL, /* local machine */
+                                psid, 
+                               name, &name_len,
+                               domain, &domain_len, /* no domain info yet */
+                               &name_use)  && (ERROR_INSUFFICIENT_BUFFER != GetLastError()))
+         break;
+       name = g_try_malloc (name_len*sizeof(wchar_t));
+       domain = g_try_malloc (domain_len*sizeof(wchar_t));
+       if (name && domain &&
+            LookupAccountSidW (NULL, /* local machine */
+                               psid, 
+                              name, &name_len,
+                              domain, &domain_len, /* no domain info yet */
+                              &name_use))
+         {
+           *group_name = g_utf16_to_utf8 (name, -1, NULL, NULL, NULL);
+         }
+       g_free (name);
+       g_free (domain);
+      } while (FALSE);
+
+      /* TODO: get real name */
+
       g_free (psd);
     }
   g_free (wfilename);
@@ -1380,11 +1424,11 @@ _g_local_file_info_get (const char             *basename,
     g_file_info_set_is_hidden (info, TRUE);
 
   if (basename != NULL && basename[strlen (basename) -1] == '~')
-    g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_STD_IS_BACKUP, TRUE);
+    g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP, TRUE);
 
   if (is_symlink &&
       g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_STD_SYMLINK_TARGET))
+                                       G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET))
     {
       char *link = read_link (path);
       g_file_info_set_symlink_target (info, link);
@@ -1392,7 +1436,7 @@ _g_local_file_info_get (const char             *basename,
     }
 
   if (g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_STD_DISPLAY_NAME))
+                                       G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME))
     {
       char *display_name = g_filename_display_basename (path);
       
@@ -1407,7 +1451,7 @@ _g_local_file_info_get (const char             *basename,
     }
   
   if (g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_STD_EDIT_NAME))
+                                       G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME))
     {
       char *edit_name = g_filename_display_basename (path);
       g_file_info_set_edit_name (info, edit_name);
@@ -1416,18 +1460,18 @@ _g_local_file_info_get (const char             *basename,
 
   
   if (g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_STD_COPY_NAME))
+                                       G_FILE_ATTRIBUTE_STANDARD_COPY_NAME))
     {
       char *copy_name = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
       if (copy_name)
-       g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_STD_COPY_NAME, copy_name);
+       g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_COPY_NAME, copy_name);
       g_free (copy_name);
     }
 
   if (g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_STD_CONTENT_TYPE) ||
+                                       G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE) ||
       g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_STD_ICON))
+                                       G_FILE_ATTRIBUTE_STANDARD_ICON))
     {
       char *content_type = get_content_type (basename, path, &statbuf, is_symlink, symlink_broken, flags, FALSE);
 
@@ -1436,7 +1480,7 @@ _g_local_file_info_get (const char             *basename,
          g_file_info_set_content_type (info, content_type);
 
          if (g_file_attribute_matcher_matches (attribute_matcher,
-                                               G_FILE_ATTRIBUTE_STD_ICON))
+                                               G_FILE_ATTRIBUTE_STANDARD_ICON))
            {
              char *mimetype_icon, *generic_mimetype_icon, *type_icon, *p;
              char *icon_names[3];
@@ -1487,13 +1531,13 @@ _g_local_file_info_get (const char             *basename,
     }
 
   if (g_file_attribute_matcher_matches (attribute_matcher,
-                                       G_FILE_ATTRIBUTE_STD_FAST_CONTENT_TYPE))
+                                       G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE))
     {
       char *content_type = get_content_type (basename, path, &statbuf, is_symlink, symlink_broken, flags, TRUE);
       
       if (content_type)
        {
-         g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_STD_FAST_CONTENT_TYPE, content_type);
+         g_file_info_set_attribute_string (info, G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE, content_type);
          g_free (content_type);
        }
     }
@@ -1896,42 +1940,47 @@ set_mtime_atime (char                       *filename,
 gboolean
 _g_local_file_info_set_attribute (char                       *filename,
                                  const char                 *attribute,
-                                 const GFileAttributeValue  *value,
+                                 GFileAttributeType          type,
+                                 gpointer                    value_p,
                                  GFileQueryInfoFlags         flags,
                                  GCancellable               *cancellable,
                                  GError                    **error)
 {
+  GFileAttributeValue value = { 0 };
+
+  _g_file_attribute_value_set_from_pointer (&value, type, value_p, FALSE);
+  
   if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_MODE) == 0)
-    return set_unix_mode (filename, value, error);
+    return set_unix_mode (filename, &value, error);
   
 #ifdef HAVE_CHOWN
   else if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_UID) == 0)
-    return set_unix_uid_gid (filename, value, NULL, flags, error);
+    return set_unix_uid_gid (filename, &value, NULL, flags, error);
   else if (strcmp (attribute, G_FILE_ATTRIBUTE_UNIX_GID) == 0)
-    return set_unix_uid_gid (filename, NULL, value, flags, error);
+    return set_unix_uid_gid (filename, NULL, &value, flags, error);
 #endif
   
 #ifdef HAVE_SYMLINK
-  else if (strcmp (attribute, G_FILE_ATTRIBUTE_STD_SYMLINK_TARGET) == 0)
-    return set_symlink (filename, value, error);
+  else if (strcmp (attribute, G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET) == 0)
+    return set_symlink (filename, &value, error);
 #endif
 
 #ifdef HAVE_UTIMES
   else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_MODIFIED) == 0)
-    return set_mtime_atime (filename, value, NULL, NULL, NULL, error);
+    return set_mtime_atime (filename, &value, NULL, NULL, NULL, error);
   else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC) == 0)
-    return set_mtime_atime (filename, NULL, value, NULL, NULL, error);
+    return set_mtime_atime (filename, NULL, &value, NULL, NULL, error);
   else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_ACCESS) == 0)
-    return set_mtime_atime (filename, NULL, NULL, value, NULL, error);
+    return set_mtime_atime (filename, NULL, NULL, &value, NULL, error);
   else if (strcmp (attribute, G_FILE_ATTRIBUTE_TIME_ACCESS_USEC) == 0)
-    return set_mtime_atime (filename, NULL, NULL, NULL, value, error);
+    return set_mtime_atime (filename, NULL, NULL, NULL, &value, error);
 #endif
 
 #ifdef HAVE_XATTR
-  else if (g_str_has_prefix (attribute, "xattr:"))
-    return set_xattr (filename, attribute, value, error);
-  else if (g_str_has_prefix (attribute, "xattr_sys:"))
-    return set_xattr (filename, attribute, value, error);
+  else if (g_str_has_prefix (attribute, "xattr::"))
+    return set_xattr (filename, attribute, &value, error);
+  else if (g_str_has_prefix (attribute, "xattr-sys::"))
+    return set_xattr (filename, attribute, &value, error);
 #endif
   
   g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
@@ -1958,7 +2007,7 @@ _g_local_file_info_set_attributes  (char                 *filename,
 
   /* Set symlink first, since this recreates the file */
 #ifdef HAVE_SYMLINK
-  value = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_STD_SYMLINK_TARGET);
+  value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET);
   if (value)
     {
       if (!set_symlink (filename, value, error))
@@ -1979,8 +2028,8 @@ _g_local_file_info_set_attributes  (char                 *filename,
    * Change ownership before permissions, since ownership changes can
      change permissions (e.g. setuid)
    */
-  uid = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_UNIX_UID);
-  gid = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_UNIX_GID);
+  uid = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_UNIX_UID);
+  gid = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_UNIX_GID);
   
   if (uid || gid)
     {
@@ -2000,7 +2049,7 @@ _g_local_file_info_set_attributes  (char                 *filename,
     }
 #endif
   
-  value = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_UNIX_MODE);
+  value = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_UNIX_MODE);
   if (value)
     {
       if (!set_unix_mode (filename, value, error))
@@ -2020,10 +2069,10 @@ _g_local_file_info_set_attributes  (char                 *filename,
    * Change times as the last thing to avoid it changing due to metadata changes
    */
   
-  mtime = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
-  mtime_usec = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC);
-  atime = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_TIME_ACCESS);
-  atime_usec = g_file_info_get_attribute (info, G_FILE_ATTRIBUTE_TIME_ACCESS_USEC);
+  mtime = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
+  mtime_usec = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC);
+  atime = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_ACCESS);
+  atime_usec = _g_file_info_get_attribute_value (info, G_FILE_ATTRIBUTE_TIME_ACCESS_USEC);
 
   if (mtime || mtime_usec || atime || atime_usec)
     {