summaryrefslogtreecommitdiffstats
path: root/third_party/libjingle/files/talk/base/win32filesystem.cc
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-03 01:19:53 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-03 01:19:53 +0000
commit97f2db27a730693ac0711894dcff741c1b1451a3 (patch)
treef0190c3eceeb38ade4856272b50c6d195f1ffe1d /third_party/libjingle/files/talk/base/win32filesystem.cc
parentde5834cf1962af5607b459731f8960cfd3baa4c2 (diff)
downloadchromium_src-97f2db27a730693ac0711894dcff741c1b1451a3.zip
chromium_src-97f2db27a730693ac0711894dcff741c1b1451a3.tar.gz
chromium_src-97f2db27a730693ac0711894dcff741c1b1451a3.tar.bz2
Revert 48798 - New libjingle integrated to chrome.
BUG=none TEST=Chrome Sync works Review URL: http://codereview.chromium.org/2255007 TBR=sergeyu@chromium.org git-svn-id: svn://svn.chromium.org/chrome/trunk/src@48800 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'third_party/libjingle/files/talk/base/win32filesystem.cc')
-rw-r--r--third_party/libjingle/files/talk/base/win32filesystem.cc194
1 files changed, 194 insertions, 0 deletions
diff --git a/third_party/libjingle/files/talk/base/win32filesystem.cc b/third_party/libjingle/files/talk/base/win32filesystem.cc
new file mode 100644
index 0000000..5b8b023
--- /dev/null
+++ b/third_party/libjingle/files/talk/base/win32filesystem.cc
@@ -0,0 +1,194 @@
+/*
+ * libjingle
+ * Copyright 2004--2006, Google Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <errno.h>
+#include <cassert>
+
+#include "talk/base/basicdefs.h"
+#include "talk/base/convert.h"
+#include "talk/base/pathutils.h"
+#include "talk/base/fileutils.h"
+#include "talk/base/stringutils.h"
+#include "talk/base/stream.h"
+
+#include "talk/base/win32filesystem.h"
+
+namespace talk_base {
+
+bool Win32Filesystem::CreateFolderI(const Pathname &pathname) {
+ int len = pathname.pathname().length();
+
+ if ((len <= 0) || (pathname.pathname().c_str()[len-1] != '\\')) {
+ return false;
+ }
+
+ DWORD res = ::GetFileAttributes(Utf16(pathname.pathname()).AsWz());
+ if (res != INVALID_FILE_ATTRIBUTES) {
+ // Something exists at this location, check if it is a directory
+ return ((res & FILE_ATTRIBUTE_DIRECTORY) != 0);
+ } else if ((GetLastError() != ERROR_FILE_NOT_FOUND)
+ && (GetLastError() != ERROR_PATH_NOT_FOUND)) {
+ // Unexpected error
+ return false;
+ }
+ // Directory doesn't exist, look up one directory level
+ do {
+ --len;
+ } while ((len > 0) && (pathname.pathname().c_str()[len-1] != '\\'));
+
+ if (!CreateFolder(std::string(pathname.pathname().c_str(),len)))
+ return false;
+
+ if (pathname.pathname().c_str()[0] != '\\') {
+ std::string long_path = std::string("\\\\?\\") + pathname.pathname();
+ return (::CreateDirectory(Utf16(long_path).AsWz(), NULL) != 0);
+ } else {
+ return (::CreateDirectory(Utf16(pathname.pathname()).AsWz(), NULL) != 0);
+ }
+}
+
+FileStream *Win32Filesystem::OpenFileI(const Pathname &filename,
+ const std::string &mode) {
+ talk_base::FileStream *fs = new talk_base::FileStream();
+ if (fs)
+ fs->Open(filename.pathname().c_str(), mode.c_str());
+ return fs;
+}
+
+bool Win32Filesystem::DeleteFileI(const Pathname &filename) {
+ LOG(LS_INFO) << "Deleting " << filename.pathname();
+
+ if (IsFolder(filename)) {
+ Pathname dir;
+ dir.SetFolder(filename.pathname());
+ DirectoryIterator di;
+ di.Iterate(dir.pathname());
+ while(di.Next()) {
+ if (di.Name() == "." || di.Name() == "..")
+ continue;
+ Pathname subdir;
+ subdir.SetFolder(filename.pathname());
+ subdir.SetFilename(di.Name());
+
+ if (!DeleteFile(subdir.pathname()))
+ return false;
+ }
+ std::string no_slash(filename.pathname(), 0, filename.pathname().length()-1);
+ return ::RemoveDirectory(Utf16(no_slash).AsWz()) == 0;
+ }
+ return ::DeleteFile(Utf16(filename.pathname()).AsWz()) == 0;
+}
+
+bool Win32Filesystem::GetTemporaryFolderI(Pathname &pathname, bool create,
+ const std::string *append) {
+ ASSERT(!g_application_name_.empty());
+ wchar_t buffer[MAX_PATH + 1];
+ if (!::GetTempPath(ARRAY_SIZE(buffer), buffer))
+ return false;
+ if (!::GetLongPathName(buffer, buffer, ARRAY_SIZE(buffer)))
+ return false;
+ size_t len = strlen(buffer);
+ if ((len > 0) && (buffer[len-1] != '\\')) {
+ len += talk_base::strcpyn(buffer + len, ARRAY_SIZE(buffer) - len,
+ L"\\");
+ }
+ if ((len > 0) && (buffer[len-1] != '\\')) {
+ len += talk_base::strcpyn(buffer + len, ARRAY_SIZE(buffer) - len,
+ L"\\");
+ }
+ if (len >= ARRAY_SIZE(buffer) - 1)
+ return false;
+ pathname.clear();
+ pathname.SetFolder(Utf8(buffer).AsSz());
+ if (append != NULL)
+ pathname.AppendFolder(*append);
+ if (create)
+ CreateFolderI(pathname);
+ return true;
+}
+
+std::string Win32Filesystem::TempFilenameI(const Pathname &dir, const std::string &prefix) {
+ wchar_t filename[MAX_PATH];
+ if (::GetTempFileName(Utf16(dir.pathname()).AsWz(), Utf16(prefix).AsWz(), 0, filename) == 0)
+ return Utf8(filename).AsString();
+ return "";
+}
+
+bool Win32Filesystem::MoveFileI(const Pathname &old_path, const Pathname &new_path)
+{
+ LOG(LS_INFO) << "Moving " << old_path.pathname() << " to " << new_path.pathname();
+ if (_wrename(Utf16(old_path.pathname()).AsWz(), Utf16(new_path.pathname()).AsWz()) != 0) {
+ if (errno != EXDEV) {
+ printf("errno: %d\n", errno);
+ return false;
+ }
+ if (!CopyFile(old_path, new_path))
+ return false;
+ if (!DeleteFile(old_path))
+ return false;
+ }
+ return true;
+}
+
+bool Win32Filesystem::IsFolderI(const Pathname &path)
+{
+ WIN32_FILE_ATTRIBUTE_DATA data = {0};
+ if (0 == ::GetFileAttributesEx(Utf16(path.pathname()).AsWz(), GetFileExInfoStandard, &data))
+ return false;
+ return (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY;
+}
+
+bool Win32Filesystem::FileExistsI(const Pathname &path)
+{
+ DWORD res = ::GetFileAttributes(Utf16(path.pathname()).AsWz());
+ return res != INVALID_FILE_ATTRIBUTES;
+}
+
+bool Win32Filesystem::CopyFileI(const Pathname &old_path, const Pathname &new_path)
+{
+ return ::CopyFile(Utf16(old_path.pathname()).AsWz(), Utf16(new_path.pathname()).AsWz(), TRUE) == 0;
+}
+
+bool Win32Filesystem::IsTemporaryPathI(const Pathname& pathname)
+{
+ TCHAR buffer[MAX_PATH + 1];
+ if (!::GetTempPath(ARRAY_SIZE(buffer), buffer))
+ return false;
+ if (!::GetLongPathName(buffer, buffer, ARRAY_SIZE(buffer)))
+ return false;
+ return (::strnicmp(Utf16(pathname.pathname()).AsWz(), buffer, strlen(buffer)) == 0);
+}
+
+bool Win32Filesystem::GetFileSizeI(const Pathname &pathname, size_t *size)
+{
+ WIN32_FILE_ATTRIBUTE_DATA data = {0};
+ if (::GetFileAttributesEx(Utf16(pathname.pathname()).AsWz(), GetFileExInfoStandard, &data) == 0)
+ return false;
+ *size = data.nFileSizeLow;
+ return true;
+}
+
+}