Skip to content
This repository was archived by the owner on Sep 2, 2021. It is now read-only.

Windows changes for File IO, File dialog and getElapsedMilliseconds. #2

Merged
merged 5 commits into from
Jun 14, 2012
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 58 additions & 5 deletions appshell/appshell_extensions_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,16 @@
#include <algorithm>
#include <CommDlg.h>
#include <ShlObj.h>
#include <Shlwapi.h>
#include <stdio.h>
#include <sys/stat.h>

// The global ClientHandler reference.
extern CefRefPtr<ClientHandler> g_handler;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I got this accidently checked in. I need this for QuitApplication().


// Forward declarations for functions at the bottom of this file
void FixFilename(ExtensionString& filename);
void EscapeJSONString(const std::wstring& str, std::wstring& finalResult);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This declaration can be removed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops... I missed that in cleanup.

int ConvertErrnoCode(int errorCode, bool isReading = true);
int ConvertWinErrorCode(int errorCode, bool isReading = true);

Expand All @@ -49,6 +56,7 @@ int32 ShowOpenDialog(bool allowMulitpleSelection,
ExtensionString fileTypes,
CefRefPtr<CefListValue>& selectedFiles)
{
std::wstring results = L"[";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the new implementation, we are not building a JSON string. Instead, each selected file should be added to the selectedFiles list. Please see the mac implementation for details.

This really simplifies the implementation since we don't need to build up JSON strings, and we no longer need to include the EscapeJSONString function.

wchar_t szFile[MAX_PATH];
szFile[0] = 0;

Expand Down Expand Up @@ -103,7 +111,7 @@ int32 ShowOpenDialog(bool allowMulitpleSelection,
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;

allowMulitpleSelection = false; // TODO: Raymond, please implement.
allowMulitpleSelection = false;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line should be removed (I forced a single selection since multiple selection wasn't implemented).


// TODO (issue #65) - Use passed in file types. Note, when fileTypesStr is null, all files should be shown
/* findAndReplaceString( fileTypesStr, std::string(" "), std::string(";*."));
Expand All @@ -119,7 +127,7 @@ int32 ShowOpenDialog(bool allowMulitpleSelection,
if (GetOpenFileName(&ofn)) {
if (allowMulitpleSelection) {
// Multiple selection encodes the files differently
/*

// If multiple files are selected, the first null terminator
// signals end of directory that the files are all in
std::wstring dir(szFile);
Expand Down Expand Up @@ -163,7 +171,7 @@ int32 ShowOpenDialog(bool allowMulitpleSelection,
i += file.length() + 1;
}
}
*/

} else {
// If multiple files are not allowed, add the single file
selectedFiles->SetString(0, szFile);
Expand Down Expand Up @@ -306,13 +314,34 @@ int32 WriteFile(ExtensionString filename, std::string contents, ExtensionString

int32 SetPosixPermissions(ExtensionString filename, int32 mode)
{
// TODO: Raymond, please implement
FixFilename(filename);

DWORD dwAttr = GetFileAttributes(filename.c_str());

if (dwAttr == INVALID_FILE_ATTRIBUTES)
return ERR_NOT_FOUND;

if ((dwAttr & FILE_ATTRIBUTE_DIRECTORY) != 0)
return NO_ERROR;

bool write = (mode & 0200) != 0;
bool read = (mode & 0400) != 0;
int mask = (write ? _S_IWRITE : 0) | (read ? _S_IREAD : 0);

if (_wchmod(filename.c_str(), mask) == -1) {
return ConvertErrnoCode(errno);
}

return NO_ERROR;
}

int32 DeleteFileOrDirectory(ExtensionString filename)
{
// TODO: Raymond, please implement
FixFilename(filename);

if (!DeleteFile(filename.c_str()))
return ConvertWinErrorCode(GetLastError());

return NO_ERROR;
}

Expand All @@ -322,6 +351,30 @@ void FixFilename(ExtensionString& filename)
replace(filename.begin(), filename.end(), '/', '\\');
}

// Escapes characters that have special meaning in JSON
void EscapeJSONString(const std::wstring& str, std::wstring& finalResult) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As mentioned above, this function should not be needed.

std::wstring result;

for(size_t pos = 0; pos != str.size(); ++pos) {
switch(str[pos]) {
case '\a': result.append(L"\\a"); break;
case '\b': result.append(L"\\b"); break;
case '\f': result.append(L"\\f"); break;
case '\n': result.append(L"\\n"); break;
case '\r': result.append(L"\\r"); break;
case '\t': result.append(L"\\t"); break;
case '\v': result.append(L"\\v"); break;
// Note: single quotes are OK for JSON
case '\"': result.append(L"\\\""); break; // double quote
case '\\': result.append(L"/"); break; // backslash

default: result.append(1, str[pos]); break;
}
}

finalResult = result;
}

// Maps errors from errno.h to the brackets error codes
// found in brackets_extensions.js
int ConvertErrnoCode(int errorCode, bool isReading)
Expand Down
4 changes: 4 additions & 0 deletions appshell/cefclient_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <commdlg.h>
#include <shellapi.h>
#include <direct.h>
#include <MMSystem.h>
#include <sstream>
#include <string>
#include "include/cef_app.h"
Expand All @@ -28,6 +29,7 @@
#endif // SHOW_TOOLBAR_UI

// Global Variables:
DWORD g_appStartupTime;
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
Expand Down Expand Up @@ -56,6 +58,8 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

g_appStartupTime = timeGetTime();

CefMainArgs main_args(hInstance);
CefRefPtr<ClientApp> app(new ClientApp);

Expand Down
7 changes: 5 additions & 2 deletions appshell/client_app_win.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@
#include "client_app.h"
#include "resource.h"

#include <MMSystem.h>
#include <string>

extern DWORD g_appStartupTime;

std::string ClientApp::GetExtensionJSSource()
{
extern HINSTANCE hInst;
Expand Down Expand Up @@ -54,6 +57,6 @@ std::string ClientApp::GetExtensionJSSource()

double ClientApp::GetElapsedMilliseconds()
{
// TODO: Raymond, please implement
return 0;
return (timeGetTime() - g_appStartupTime);
}