25d3e4a82540ea8dc48fe204ba96d42c5ee88e92
[WebKit-https.git] / WebCore / platform / win / FileSystemWin.cpp
1 /*\r
2  * Copyright (C) 2007 Apple Inc. All rights reserved.\r
3  *\r
4  * Redistribution and use in source and binary forms, with or without\r
5  * modification, are permitted provided that the following conditions\r
6  * are met:\r
7  *\r
8  * 1.  Redistributions of source code must retain the above copyright\r
9  *     notice, this list of conditions and the following disclaimer. \r
10  * 2.  Redistributions in binary form must reproduce the above copyright\r
11  *     notice, this list of conditions and the following disclaimer in the\r
12  *     documentation and/or other materials provided with the distribution. \r
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of\r
14  *     its contributors may be used to endorse or promote products derived\r
15  *     from this software without specific prior written permission. \r
16  *\r
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY\r
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\r
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\r
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\r
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  */\r
28 \r
29 #include "config.h"\r
30 #include "FileSystem.h"\r
31 \r
32 #include "CString.h"\r
33 #include "NotImplemented.h"\r
34 #include "PlatformString.h"\r
35 \r
36 #include <windows.h>\r
37 #include <winbase.h>\r
38 #include <shlobj.h>\r
39 #include <shlwapi.h>\r
40 \r
41 namespace WebCore {\r
42 \r
43 bool fileSize(const String& path, long long& result)\r
44 {\r
45     struct _stat32i64 sb;\r
46     String filename = path;\r
47     int statResult = _wstat32i64(filename.charactersWithNullTermination(), &sb);\r
48     if (statResult != 0 || (sb.st_mode & S_IFMT) != S_IFREG)\r
49         return false;\r
50     result = sb.st_size;\r
51     return true;\r
52 }\r
53 \r
54 bool fileExists(const String& path) \r
55 {\r
56     struct _stat32i64 sb;\r
57     String filename = path;\r
58     return !_wstat32i64(filename.charactersWithNullTermination(), &sb);\r
59 }\r
60 \r
61 bool deleteFile(const String& path)\r
62 {\r
63     String filename = path;\r
64     return !!DeleteFileW(filename.charactersWithNullTermination());\r
65 }\r
66 \r
67 String pathByAppendingComponent(const String& path, const String& component)\r
68 {\r
69     Vector<UChar> buffer(MAX_PATH);\r
70 \r
71     if (path.length() + 1 > buffer.size())\r
72         return String();\r
73 \r
74     memcpy(buffer.data(), path.characters(), path.length() * sizeof(UChar));\r
75     buffer[path.length()] = '\0';\r
76 \r
77     String componentCopy = component;\r
78     if (!PathAppendW(buffer.data(), componentCopy.charactersWithNullTermination()))\r
79         return String();\r
80 \r
81     buffer.resize(wcslen(buffer.data()));\r
82 \r
83     return String::adopt(buffer);\r
84 }\r
85 \r
86 CString fileSystemRepresentation(const String&)\r
87 {\r
88     return "";\r
89 }\r
90 \r
91 bool makeAllDirectories(const String& path)\r
92 {\r
93     String fullPath = path;\r
94     if (!SHCreateDirectoryEx(0, fullPath.charactersWithNullTermination(), 0)) {\r
95         DWORD error = GetLastError();\r
96         if (error != ERROR_FILE_EXISTS && error != ERROR_ALREADY_EXISTS) {\r
97             LOG_ERROR("Failed to create path %s", path.ascii().data());\r
98             return false;\r
99         }\r
100     }\r
101     return true;\r
102 }\r
103 \r
104 String homeDirectoryPath()\r
105 {\r
106     notImplemented();\r
107     return "";\r
108 }\r
109 \r
110 static String bundleName()\r
111 {\r
112     static bool initialized;\r
113     static String name = "WebKit";\r
114 \r
115     if (!initialized) {\r
116         initialized = true;\r
117 \r
118         if (CFBundleRef bundle = CFBundleGetMainBundle())
119             if (CFTypeRef bundleExecutable = CFBundleGetValueForInfoDictionaryKey(bundle, kCFBundleExecutableKey))
120                 if (CFGetTypeID(bundleExecutable) == CFStringGetTypeID())
121                     name = reinterpret_cast<CFStringRef>(bundleExecutable);\r
122     }\r
123 \r
124     return name;\r
125 }\r
126 \r
127 static String storageDirectory(DWORD pathIdentifier)
128 {
129     Vector<UChar> buffer(MAX_PATH);
130     if (FAILED(SHGetFolderPathW(0, pathIdentifier | CSIDL_FLAG_CREATE, 0, 0, buffer.data())))
131         return String();
132     buffer.resize(wcslen(buffer.data()));
133     String directory = String::adopt(buffer);
134
135     static const String companyNameDirectory = "Apple Computer\\";
136     directory = pathByAppendingComponent(directory, companyNameDirectory + bundleName());
137     if (!makeAllDirectories(directory))
138         return String();
139
140     return directory;
141 }\r
142 \r
143 static String cachedStorageDirectory(DWORD pathIdentifier)\r
144 {\r
145     static HashMap<DWORD, String> directories;\r
146 \r
147     HashMap<DWORD, String>::iterator it = directories.find(pathIdentifier);\r
148     if (it != directories.end())\r
149         return it->second;\r
150 \r
151     String directory = storageDirectory(pathIdentifier);\r
152     directories.add(pathIdentifier, directory);\r
153 \r
154     return directory;\r
155 }\r
156 \r
157 String localUserSpecificStorageDirectory()
158 {
159     return cachedStorageDirectory(CSIDL_LOCAL_APPDATA);
160 }
161
162 String roamingUserSpecificStorageDirectory()
163 {
164     return cachedStorageDirectory(CSIDL_APPDATA);
165 }
166 \r
167 } // namespace WebCore\r