Skip to content

Commit 1457bff

Browse files
author
bob.burrough
committed
Change the interface of the file picker API such that it doesn't work as a singleton. With this, multiple instsance of the file picker may be invoked at a time.
1 parent 9338a54 commit 1457bff

File tree

6 files changed

+102
-39
lines changed

6 files changed

+102
-39
lines changed

Natives.sdf

4 MB
Binary file not shown.

Natives.sln

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ Global
1313
Release|x86 = Release|x86
1414
EndGlobalSection
1515
GlobalSection(ProjectConfigurationPlatforms) = postSolution
16-
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Debug|x64.ActiveCfg = Debug|x64
17-
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Debug|x64.Build.0 = Debug|x64
16+
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Debug|x64.ActiveCfg = Debug|Win32
17+
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Debug|x64.Build.0 = Debug|Win32
1818
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Debug|x86.ActiveCfg = Debug|Win32
1919
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Debug|x86.Build.0 = Debug|Win32
20-
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Release|x64.ActiveCfg = Release|x64
21-
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Release|x64.Build.0 = Release|x64
20+
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Release|x64.ActiveCfg = Release|Win32
21+
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Release|x64.Build.0 = Release|Win32
2222
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Release|x86.ActiveCfg = Release|Win32
2323
{44B46E4E-C88D-493F-8FCC-6DF46C1CB4FC}.Release|x86.Build.0 = Release|Win32
2424
EndGlobalSection

Natives/Natives.vcxproj

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<ConfigurationType>DynamicLibrary</ConfigurationType>
2929
<UseDebugLibraries>true</UseDebugLibraries>
3030
<PlatformToolset>v140</PlatformToolset>
31-
<CharacterSet>MultiByte</CharacterSet>
31+
<CharacterSet>Unicode</CharacterSet>
3232
</PropertyGroup>
3333
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
3434
<ConfigurationType>Application</ConfigurationType>
@@ -68,22 +68,31 @@
6868
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
6969
</ImportGroup>
7070
<PropertyGroup Label="UserMacros" />
71-
<PropertyGroup />
71+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
72+
<TargetExt>.dll</TargetExt>
73+
</PropertyGroup>
7274
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
7375
<ClCompile>
7476
<WarningLevel>Level3</WarningLevel>
7577
<Optimization>Disabled</Optimization>
76-
<SDLCheck>true</SDLCheck>
78+
<SDLCheck>
79+
</SDLCheck>
80+
<AdditionalIncludeDirectories>$(SolutionDir)ExternalProjects\pthreads-w32\Pre-built.2\include</AdditionalIncludeDirectories>
81+
<MultiProcessorCompilation>true</MultiProcessorCompilation>
82+
<PreprocessorDefinitions>WIN32;_WINDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
7783
</ClCompile>
7884
<Link>
7985
<GenerateDebugInformation>true</GenerateDebugInformation>
86+
<AdditionalLibraryDirectories>$(SolutionDir)ExternalProjects\pthreads-w32\Pre-built.2\lib\x86</AdditionalLibraryDirectories>
87+
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);pthreadVC2.lib</AdditionalDependencies>
8088
</Link>
8189
</ItemDefinitionGroup>
8290
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
8391
<ClCompile>
8492
<WarningLevel>Level3</WarningLevel>
8593
<Optimization>Disabled</Optimization>
8694
<SDLCheck>true</SDLCheck>
95+
<AdditionalIncludeDirectories>$(ProjectDir)..\ExternalProjects\pthreads-w32\Pre-built.2\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
8796
</ClCompile>
8897
<Link>
8998
<GenerateDebugInformation>true</GenerateDebugInformation>
@@ -119,6 +128,8 @@
119128
</ItemDefinitionGroup>
120129
<ItemGroup>
121130
<ClInclude Include="natives.h" />
131+
<ClInclude Include="safelist.h" />
132+
<ClInclude Include="threadutils.h" />
122133
</ItemGroup>
123134
<ItemGroup>
124135
<ClCompile Include="natives.cpp" />

Natives/Natives.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
<ClInclude Include="natives.h">
1919
<Filter>Source Files</Filter>
2020
</ClInclude>
21+
<ClInclude Include="safelist.h">
22+
<Filter>Source Files</Filter>
23+
</ClInclude>
24+
<ClInclude Include="threadutils.h">
25+
<Filter>Source Files</Filter>
26+
</ClInclude>
2127
</ItemGroup>
2228
<ItemGroup>
2329
<ClCompile Include="natives.cpp">

Natives/natives.cpp

Lines changed: 71 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,66 @@
22
#define BLIT_IT_NATIVES_DLL_COMPILE
33

44
#include "natives.h"
5+
56
#include "threadutils.h"
67

8+
#include <list>
9+
#include <string>
10+
711
#include <Windows.h>
812

913
using namespace std;
1014

11-
ChooseFileSuccessCallback _chooseFileSuccessCallback = NULL;
12-
ChooseFileCancelledCallback _chooseFileCancelledCallback = NULL;
15+
struct ChooseFileContext
16+
{
17+
ChooseFileSuccessCallback _chooseFileSuccessCallback;
18+
ChooseFileCancelledCallback _chooseFileCancelledCallback;
19+
pthread_t file_picker_thread;
20+
list<wstring> filetype_names;
21+
list<wstring> filetype_extensions;
22+
};
1323

14-
pthread_mutex_t file_picker_mutex = PTHREAD_MUTEX_INITIALIZER;
15-
pthread_t file_picker_thread;
16-
bool file_picker_running = false;
1724

18-
void* LoadGcodeAsync(void* arg)
25+
void* FilePickerThread(void* arg)
1926
{
27+
ChooseFileContext* cfc = (ChooseFileContext*)arg;
28+
2029
const int buf_len = 260;
21-
TCHAR cwd[buf_len] = { 0 };
30+
//TCHAR cwd[buf_len] = { 0 };
2231

23-
GetCurrentDirectory(buf_len, cwd);
32+
//GetCurrentDirectory(buf_len, cwd);
2433

2534
OPENFILENAME ofn; // common dialog box structure
2635
TCHAR szFile[buf_len]; // buffer for file name
2736
//HWND hwnd; // owner window
2837
//HANDLE hf; // file handle
29-
TCHAR filter[64] = TEXT("G-code\0*.gcode\0All\0*.*\0");
38+
39+
40+
41+
//string test("G-code\0*.gcode\0All\0*.*\0");
42+
wstring filetype_filters;
43+
list<wstring>::const_iterator ext_itr = cfc->filetype_extensions.begin();
44+
for (list<wstring>::const_iterator name_itr = cfc->filetype_names.begin(); name_itr != cfc->filetype_names.end(); ++name_itr)
45+
{
46+
filetype_filters += *name_itr;
47+
filetype_filters.push_back('\0');
48+
filetype_filters += L"*.";
49+
filetype_filters += *ext_itr;
50+
filetype_filters.push_back('\0');
51+
++ext_itr;
52+
}
53+
filetype_filters += L"All";
54+
filetype_filters.push_back('\0');
55+
filetype_filters += L"*.*";
56+
filetype_filters.push_back('\0');
57+
58+
59+
//TCHAR filter[64] = TEXT(((const char*)test.c_str()));
60+
61+
TCHAR* filter = (TCHAR*)filetype_filters.c_str();
62+
63+
64+
3065

3166
// Initialize OPENFILENAME
3267
ZeroMemory(&ofn, sizeof(ofn));
@@ -44,46 +79,55 @@ void* LoadGcodeAsync(void* arg)
4479
ofn.lpstrInitialDir = NULL;
4580
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR | OFN_READONLY;
4681

47-
SetCurrentDirectory(cwd);
82+
//SetCurrentDirectory(cwd);
4883

4984
if (GetOpenFileName(&ofn))
5085
{
51-
if (_chooseFileSuccessCallback)
52-
_chooseFileSuccessCallback();
86+
pthread_testcancel();
87+
if (cfc->_chooseFileSuccessCallback)
88+
cfc->_chooseFileSuccessCallback(ofn.lpstrFile);
5389
}
5490
else
5591
{
56-
if (_chooseFileCancelledCallback)
57-
_chooseFileCancelledCallback();
92+
pthread_testcancel();
93+
if (cfc->_chooseFileCancelledCallback)
94+
cfc->_chooseFileCancelledCallback();
5895
}
5996

6097
return NULL;
6198
}
6299

63100

64-
void __stdcall RegisterChooseFileSuccessCallback(ChooseFileSuccessCallback callback)
101+
void* __stdcall CreateChooseFileContext()
65102
{
66-
_chooseFileSuccessCallback = callback;
103+
ChooseFileContext* cfc = new ChooseFileContext();
104+
cfc->_chooseFileCancelledCallback = NULL;
105+
cfc->_chooseFileSuccessCallback = NULL;
106+
return cfc;
67107
}
68108

69109

70-
void __stdcall RegisterChooseFileCancelledCallback(ChooseFileCancelledCallback callback)
110+
void __stdcall AddChooseFileType(void* context, const wchar_t* name, const wchar_t* extension)
71111
{
72-
_chooseFileCancelledCallback = callback;
112+
ChooseFileContext* cfc = (ChooseFileContext*)context;
113+
cfc->filetype_names.push_back(wstring(name));
114+
cfc->filetype_extensions.push_back(wstring(extension));
73115
}
74116

75117

76-
void __stdcall ChooseFile()
118+
void __stdcall ChooseFile(void* context, ChooseFileSuccessCallback successCallback, ChooseFileCancelledCallback cancelledCallback)
77119
{
78-
pthread_mutex_lock(&shared_machine_mutex);
79-
if (shared_machine == NULL)
80-
{
81-
shared_machine = new Machine();
82-
loading_thread_started = true;
83-
pthread_create(&loading_thread, NULL, LoadGcodeAsync, NULL);
84-
}
85-
pthread_mutex_unlock(&shared_machine_mutex);
120+
ChooseFileContext* cfc = (ChooseFileContext*)context;
121+
cfc->_chooseFileSuccessCallback = successCallback;
122+
cfc->_chooseFileCancelledCallback = cancelledCallback;
123+
pthread_create(&cfc->file_picker_thread, NULL, FilePickerThread, cfc);
86124
}
87125

88126

127+
void __stdcall DestroyChooseFileContext(void* context)
128+
{
129+
ChooseFileContext* cfc = (ChooseFileContext*)context;
130+
pthread_cancel(cfc->file_picker_thread);
131+
delete cfc;
132+
}
89133

Natives/natives.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ extern "C"
1313
#define DLLEXPORT extern __declspec(dllimport)
1414
#endif
1515

16-
typedef void(__stdcall *ChooseFileSuccessCallback)();
17-
DLLEXPORT void __stdcall RegisterChooseFileSuccessCallback(ChooseFileSuccessCallback callback);
16+
typedef void(__stdcall *ChooseFileSuccessCallback)(const wchar_t* str);
17+
typedef void(__stdcall *ChooseFileCancelledCallback)();
1818

19-
typedef void(__stdcall *ChooseFileCancelledCallback)();
20-
DLLEXPORT void __stdcall RegisterChooseFileCancelledCallback(ChooseFileCancelledCallback callback);
19+
DLLEXPORT void* __stdcall CreateChooseFileContext();
20+
DLLEXPORT void __stdcall AddChooseFileType(void* context, const wchar_t* name, const wchar_t* extension);
21+
DLLEXPORT void __stdcall ChooseFile(void* context, ChooseFileSuccessCallback successCallback, ChooseFileCancelledCallback cancelledCallback);
22+
DLLEXPORT void __stdcall DestroyChooseFileContext(void* context);
2123

22-
DLLEXPORT void __stdcall ChooseFile();
24+
//DLLEXPORT void __stdcall Teardown();
2325

2426
#ifdef __cplusplus
2527
}

0 commit comments

Comments
 (0)