39 |
39 |
40 fs::path currentFile; |
40 fs::path currentFile; |
41 string_t currentOwner; |
41 string_t currentOwner; |
42 string_t currentGroup; |
42 string_t currentGroup; |
43 |
43 |
44 string_t getType(const fs::path& file) { |
44 string_t getType(const fs::path& file, bool x) { |
45 // TODO: Use whole words? (letters are compatible with find -type) |
45 // TODO: Use whole words? (letters are compatible with find -type) |
46 if (fs::is_regular_file(file)) return L"f"; |
46 if (fs::is_symlink(file) && x) return L"l"; // symlinks are both symlinks and files/directories/etc. |
47 else if (fs::is_symlink(file)) return L"l"; // symlinks to directories are both symlinks and directories |
47 else if (fs::is_regular_file(file)) return L"f"; |
48 else if (fs::is_directory(file)) return L"d"; |
48 else if (fs::is_directory(file)) return L"d"; |
49 else if (fs::is_fifo(file)) return L"p"; |
49 else if (fs::is_fifo(file)) return L"p"; |
50 else if (fs::is_socket(file)) return L"s"; |
50 else if (fs::is_socket(file)) return L"s"; |
51 else if (fs::is_block_file(file)) return L"b"; |
51 else if (fs::is_block_file(file)) return L"b"; |
52 else if (fs::is_character_file(file)) return L"c"; |
52 else if (fs::is_character_file(file)) return L"c"; |
75 static const string_t FIELD_NAME; |
75 static const string_t FIELD_NAME; |
76 static const string_t FIELD_SIZE; |
76 static const string_t FIELD_SIZE; |
77 static const string_t FIELD_PATH_ABSOLUTE; |
77 static const string_t FIELD_PATH_ABSOLUTE; |
78 static const string_t FIELD_PATH_CANONICAL; |
78 static const string_t FIELD_PATH_CANONICAL; |
79 static const string_t FIELD_TYPE; |
79 static const string_t FIELD_TYPE; |
|
80 static const string_t FIELD_SYMLINK_TARGET_TYPE; |
80 static const string_t FIELD_OWNER; |
81 static const string_t FIELD_OWNER; |
81 static const string_t FIELD_GROUP; |
82 static const string_t FIELD_GROUP; |
82 |
83 |
83 virtual vector<AttributeMetadata> toMetadata(const RequestedField& field) override { |
84 virtual vector<AttributeMetadata> toMetadata(const RequestedField& field) override { |
84 if (field.group == RequestedField::GROUP_FILE) { |
85 if (field.group == RequestedField::GROUP_FILE) { |
112 } else if (field.name == FIELD_PATH_ABSOLUTE) { |
113 } else if (field.name == FIELD_PATH_ABSOLUTE) { |
113 writer->writeAttribute(fs::absolute(currentFile).wstring()); |
114 writer->writeAttribute(fs::absolute(currentFile).wstring()); |
114 } else if (field.name == FIELD_PATH_CANONICAL) { |
115 } else if (field.name == FIELD_PATH_CANONICAL) { |
115 writer->writeAttribute(fs::canonical(currentFile).wstring()); |
116 writer->writeAttribute(fs::canonical(currentFile).wstring()); |
116 } else if (field.name == FIELD_TYPE) { |
117 } else if (field.name == FIELD_TYPE) { |
117 writer->writeAttribute(getType(currentFile)); |
118 writer->writeAttribute(getType(currentFile, true)); |
|
119 } else if (field.name == FIELD_SYMLINK_TARGET_TYPE) { |
|
120 writer->writeAttribute(getType(currentFile, false)); |
118 } else if (field.name == FIELD_SIZE) { |
121 } else if (field.name == FIELD_SIZE) { |
119 integer_t size = fs::is_regular_file(currentFile) ? fs::file_size(currentFile) : 0; |
122 integer_t size = fs::is_regular_file(currentFile) ? fs::file_size(currentFile) : 0; |
120 writer->writeAttribute(&size, typeid (size)); |
123 writer->writeAttribute(&size, typeid (size)); |
121 } else if (field.name == FIELD_OWNER) { |
124 } else if (field.name == FIELD_OWNER) { |
122 if (currentOwner.empty()) fetchOwner(currentFile, currentOwner, currentGroup); |
125 if (currentOwner.empty()) fetchOwner(currentFile, currentOwner, currentGroup); |
140 const string_t FileAttributeFinder::FIELD_NAME = L"name"; |
143 const string_t FileAttributeFinder::FIELD_NAME = L"name"; |
141 const string_t FileAttributeFinder::FIELD_SIZE = L"size"; |
144 const string_t FileAttributeFinder::FIELD_SIZE = L"size"; |
142 const string_t FileAttributeFinder::FIELD_PATH_ABSOLUTE = L"path_absolute"; |
145 const string_t FileAttributeFinder::FIELD_PATH_ABSOLUTE = L"path_absolute"; |
143 const string_t FileAttributeFinder::FIELD_PATH_CANONICAL = L"path_canonical"; |
146 const string_t FileAttributeFinder::FIELD_PATH_CANONICAL = L"path_canonical"; |
144 const string_t FileAttributeFinder::FIELD_TYPE = L"type"; |
147 const string_t FileAttributeFinder::FIELD_TYPE = L"type"; |
|
148 const string_t FileAttributeFinder::FIELD_SYMLINK_TARGET_TYPE = L"symlink_target_type"; |
145 const string_t FileAttributeFinder::FIELD_OWNER = L"owner"; |
149 const string_t FileAttributeFinder::FIELD_OWNER = L"owner"; |
146 const string_t FileAttributeFinder::FIELD_GROUP = L"group"; |
150 const string_t FileAttributeFinder::FIELD_GROUP = L"group"; |
147 |
151 |
148 } |
152 } |
149 } |
153 } |