Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/FileIO/src/FileIO.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 119 - (show annotations) (download) (as text)
Fri Oct 8 15:41:45 2010 UTC (13 years, 7 months ago) by kamoya
File MIME type: text/x-c++src
File size: 11904 byte(s)
avoid ARRAYSIZE macro
1 #include "FileIO.h"
2
3 #include <algorithm>
4
5 #include <shobjidl.h>
6 #include <shlwapi.h>
7 #if defined(_MSC_VER)
8 #pragma comment(lib, "shlwapi.lib")
9 #endif
10
11 #include "../../Common/dummy.h"
12 #include "../../Common/StrResource.h"
13 #include "../../Common/NsmInfoUtility.h"
14
15 #include "OptionDlg.h"
16 #include "FileIOConsts.h"
17
18 HINSTANCE g_hInstance;
19
20 namespace Regnessem
21 {
22 namespace AddIn
23 {
24 namespace FileIO
25 {
26 FileIOMain g_fileIOMain;
27
28 // NsmFileIO::FindByHandle -----------------------------------------------------
29
30 NsmFileIO::FindByHandle::FindByHandle(const NsmFileIO* s)
31 :x(s)
32 {}
33
34 bool NsmFileIO::FindByHandle::operator ()(const NsmFileIOListSub &v) const
35 {
36 return v.get() == x;
37 }
38
39 // NsmFileIO -------------------------------------------------------------------
40
41 NsmFileIO::NsmFileIO(const tstring &filePath, bool readOnly)
42 :HandlePath(Open(filePath, readOnly))
43 ,IsReadOnly(readOnly)
44 {}
45
46 NsmFileIO::~NsmFileIO()
47 {
48 if(HandlePath.first == INVALID_HANDLE_VALUE)
49 return;
50
51 CloseHandle(HandlePath.first);
52
53 if(!IsReadOnly)
54 {
55 if(FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
56 return;
57
58 IAttachmentExecute *attachExec;
59
60 if(SUCCEEDED(CoCreateInstance(CLSID_AttachmentServices, NULL, CLSCTX_ALL,
61 IID_IAttachmentExecute, reinterpret_cast<void**>(&attachExec))))
62 {
63 if(SUCCEEDED(attachExec->SetLocalPath(t2w(HandlePath.second).c_str())))
64 attachExec->Save();
65
66 attachExec->Release();
67 }
68
69 CoUninitialize();
70 }
71 }
72
73 NsmFileIO::HandlePathPair NsmFileIO::ReadOpen(const tstring &filePath)
74 {
75 return HandlePathPair(
76 CreateFile(filePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL), filePath);
77 }
78
79 NsmFileIO::HandlePathPair NsmFileIO::WriteOpen(const tstring &filePath)
80 {
81 if(filePath.empty())
82 return HandlePathPair(INVALID_HANDLE_VALUE, filePath);
83
84 tstring newPath = filePath;
85
86 LPCTSTR ext = PathFindExtension(filePath.c_str());
87
88 std::vector<TCHAR> buff(filePath.size() + 1);
89
90 #ifdef _MSC_VER
91 filePath._Copy_s(&buff[0], buff.size(), filePath.size());
92 #else
93 filePath.copy(&buff[0], filePath.size());
94 #endif
95
96 PathRemoveExtension(&buff[0]);
97
98 for(int count = 1; PathFileExists(newPath.c_str()); ++count)
99 {
100 newPath = tstring(buff.data()) + TEXT('(') + ToString(count) + TEXT(')') + ext;
101 }
102
103 return HandlePathPair(
104 CreateFile(newPath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL), newPath);
105 }
106
107 NsmFileIO::HandlePathPair NsmFileIO::Open(const tstring &filePath, bool readOnly)
108 {
109 if(readOnly)
110 return ReadOpen(filePath);
111
112 return WriteOpen(filePath);
113 }
114
115 bool NsmFileIO::IsOpened() const
116 {
117 return HandlePath.first != INVALID_HANDLE_VALUE;
118 }
119
120 int NsmFileIO::ReadData(NsmFileIOData &data) const
121 {
122 if(!IsOpened())
123 return 0;
124
125 DWORD trans = 0;
126 if(!ReadFile(HandlePath.first, data.lpData, data.nDataLen, &trans, NULL))
127 return 0;
128
129 return trans;
130 }
131
132 int NsmFileIO::AppendData(const NsmFileIOData& data) const
133 {
134 if(!IsOpened() || IsReadOnly)
135 return 0;
136
137 DWORD trans = 0;
138 WriteFile(HandlePath.first, data.lpData, data.nDataLen, &trans, NULL);
139
140 return trans;
141 }
142
143 bool NsmFileIO::GetInfo(NsmFileIOInfo &info) const
144 {
145 if(!IsOpened())
146 return false;
147
148 LARGE_INTEGER fSize;
149 GetFileSizeEx(HandlePath.first, &fSize);
150 info.nFileSize = fSize.QuadPart;
151
152 return true;
153 }
154
155 // FileIOMain --------------------------------------------------------------
156
157 FileIOMain::FileIOMain()
158 {
159 SetPluginInfo(NMPI_APIVER , NMP_INFO_APIVER);
160 SetPluginInfo(NMPI_MODULENAME , NMP_INFO_MODULENAME);
161 SetPluginInfo(NMPI_TITLE , NMP_INFO_TITLE);
162 SetPluginInfo(NMPI_DESCRIPTION , NMP_INFO_DESCRIPTION);
163 SetPluginInfo(NMPI_AUTHOR , NMP_INFO_AUTHOR);
164 SetPluginInfo(NMPI_COPYRIGHT , NMP_INFO_COPYRIGHT);
165 SetPluginInfo(NMPI_PLUGINVER , NMP_INFO_PLUGINVER);
166 }
167
168 // ����������
169 void FileIOMain::DoInitialize()
170 {
171 StrRsc::g_StrResource.reset(new StrRsc::StrResource(InitInfo));
172 Config.FileDir = GetWorkDir();
173 Config.LoadFromFile(GetIniFileName());
174
175 // �����T�[�r�X���o�^
176 CreateNsmService(NMS_ADDIN_FILEIO_OPEN , FileIOService::DoOpenFile);
177 CreateNsmService(NMS_ADDIN_FILEIO_CREATE , FileIOService::DoCreateFile);
178 CreateNsmService(NMS_ADDIN_FILEIO_READ , FileIOService::DoReadFile);
179 CreateNsmService(NMS_ADDIN_FILEIO_APPEND , FileIOService::DoAppendFile);
180 CreateNsmService(NMS_ADDIN_FILEIO_CLOSE , FileIOService::DoCloseFile);
181 CreateNsmService(NMS_ADDIN_FILEIO_GETINFO , FileIOService::DoFileGetInfo);
182
183 // UI�T�[�r�X
184 CreateNsmService(NMS_ADDIN_FILEIO_UISERVICE_MAIN_OPENDIR, FileIOService::UIOpenFileDir);
185 CreateNsmService(NMS_ADDIN_FILEIO_UISERVICE_FILESESSION_MAIN_OPENDIR, FileIOService::UIOpenFileDir);
186
187 // �I�v�V����
188 CreateNsmService(NMS_ADDIN_FILEIO_SHOWOPTIONDIALOG, FileIOService::DoShowOptionDialog);
189 }
190
191 // �t�@�C�����J��
192 LONG_PTR FileIOMain::DoOpenFile(const tstring &filePath)
193 {
194 NsmThreadFileIOList::AutoLock lock(Files);
195 NsmFileIOList &p = lock.List();
196
197 NsmFileIOListSub newIO(new NsmFileIO(filePath, true));
198
199 if(!newIO->IsOpened())
200 return 0;
201
202 p.push_back(newIO);
203
204 return reinterpret_cast<LONG_PTR>(newIO.get());
205 }
206
207 // �t�@�C��������
208 LONG_PTR FileIOMain::DoCreateFile(const tstring &filename)
209 {
210 const tstring newPath = Config.FileDir
211 + ((*Config.FileDir.rbegin() == TEXT('\\'))?(filename):(TEXT("\\") + filename));
212
213 NsmThreadFileIOList::AutoLock lock(Files);
214 NsmFileIOList &p = lock.List();
215
216 NsmFileIOListSub newIO(new NsmFileIO(filename, false));
217
218 if(!newIO->IsOpened())
219 return 0;
220
221 p.push_back(newIO);
222
223 return reinterpret_cast<LONG_PTR>(newIO.get());
224 }
225
226 LONG_PTR FileIOMain::DoReadFile(const NsmFileIO* fileIO, NsmFileIOData &data) const
227 {
228 NsmThreadFileIOList::ConstAutoLock lock(Files);
229 const NsmFileIOList &p = lock.List();
230
231 if(std::find_if(p.begin(),p.end(),NsmFileIO::FindByHandle(fileIO)) == p.end())
232 return 0;
233
234 return fileIO->ReadData(data);
235 }
236
237 LONG_PTR FileIOMain::DoAppendFile(const NsmFileIO* fileIO, const NsmFileIOData &data) const
238 {
239 NsmThreadFileIOList::ConstAutoLock lock(Files);
240 const NsmFileIOList &p = lock.List();
241
242 if(std::find_if(p.begin(), p.end(), NsmFileIO::FindByHandle(fileIO)) == p.end())
243 return 0;
244
245 return fileIO->AppendData(data);
246 }
247
248 LONG_PTR FileIOMain::DoCloseFile(const NsmFileIO* fileIO)
249 {
250 NsmThreadFileIOList::AutoLock lock(Files);
251 NsmFileIOList &p = lock.List();
252
253 NsmFileIOList::const_iterator it = std::find_if(p.begin(), p.end(), NsmFileIO::FindByHandle(fileIO));
254
255 if(it == p.end())
256 return 0;
257
258 p.erase(it);
259
260 return 1;
261 }
262
263 LONG_PTR FileIOMain::DoFileGetInfo(const NsmFileIO* fileIO, NsmFileIOInfo &info) const
264 {
265 NsmThreadFileIOList::ConstAutoLock lock(Files);
266 const NsmFileIOList &p = lock.List();
267
268 if(std::find_if(p.begin(), p.end(), NsmFileIO::FindByHandle(fileIO)) == p.end())
269 return 0;
270
271 return fileIO->GetInfo(info) ? 1 : 0;
272 }
273
274 LONG_PTR FileIOMain::UIOpenFileDir(TNsmUIServiceInfo &info) const
275 {
276 switch(info.nInfoKey)
277 {
278 case NMUI_GETCAPTION:
279 {
280 std::wstring caption
281 = t2w(StrRsc::g_StrResource->GetLocalStr(TEXT("UI"), TEXT("RS_FILEIO_UISERVICE")));
282
283 Common::NsmInfoUtility::StrToNsmInfo(info.lpInfo, caption);
284 }
285 break;
286 case NMUI_ONCLICK:
287 ShellExecute(NULL, NULL, Config.FileDir.c_str(), NULL, NULL, SW_SHOW);
288 break;
289 }
290
291 return 1;
292 }
293
294 LONG_PTR FileIOMain::DoShowOptionDialog(HWND parent)
295 {
296 OptionDlg dlg;
297 dlg.FileDir = Config.FileDir;
298
299 INT_PTR result = dlg.ShowOptionDialog(parent);
300
301 if(result == IDOK && dlg.FileDir != Config.FileDir)
302 {
303 Config.FileDir = dlg.FileDir;
304 Config.SaveToFile(GetIniFileName());
305 }
306
307 return result;
308 }
309
310 // -----------------------------------------------------------------------------
311
312 // �T�[�r�X����
313 LONG_PTR __stdcall FileIOService::DoOpenFile(WPARAM wParam, LPARAM /* lParam */)
314 {
315 if(!wParam)
316 return 0;
317
318 return g_fileIOMain.DoOpenFile(c2t(reinterpret_cast<char*>(wParam)));
319 }
320
321 LONG_PTR __stdcall FileIOService::DoCreateFile(WPARAM wParam, LPARAM /* lParam */)
322 {
323 if(!wParam)
324 return 0;
325
326 return g_fileIOMain.DoCreateFile(c2t(reinterpret_cast<char*>(wParam)));
327 }
328
329 LONG_PTR __stdcall FileIOService::DoReadFile(WPARAM wParam, LPARAM lParam)
330 {
331 if(!lParam)
332 return 0;
333
334 return g_fileIOMain.DoReadFile(reinterpret_cast<NsmFileIO*>(wParam), *reinterpret_cast<NsmFileIOData*>(lParam));
335 }
336
337 LONG_PTR __stdcall FileIOService::DoAppendFile(WPARAM wParam, LPARAM lParam)
338 {
339 if(!lParam)
340 return 0;
341
342 return g_fileIOMain.DoAppendFile(reinterpret_cast<NsmFileIO*>(wParam), *reinterpret_cast<NsmFileIOData*>(lParam));
343 }
344
345 LONG_PTR __stdcall FileIOService::DoCloseFile(WPARAM wParam, LPARAM /* lParam */)
346 {
347 return g_fileIOMain.DoCloseFile(reinterpret_cast<NsmFileIO*>(wParam));
348 }
349
350 LONG_PTR __stdcall FileIOService::DoFileGetInfo(WPARAM wParam, LPARAM lParam)
351 {
352 if(!lParam)
353 return 0;
354
355 return g_fileIOMain.DoFileGetInfo(reinterpret_cast<NsmFileIO*>(wParam), *reinterpret_cast<NsmFileIOInfo*>(lParam));
356 }
357
358 // UI�T�[�r�X
359 LONG_PTR __stdcall FileIOService::UIOpenFileDir(WPARAM /* wParam */, LPARAM lParam)
360 {
361 if(!lParam)
362 return 0;
363
364 return g_fileIOMain.UIOpenFileDir(*reinterpret_cast<TNsmUIServiceInfo*>(lParam));
365 }
366
367 // �I�v�V�����_�C�A���O
368 LONG_PTR __stdcall FileIOService::DoShowOptionDialog(WPARAM wParam, LPARAM /* lParam */)
369 {
370 return g_fileIOMain.DoShowOptionDialog(reinterpret_cast<HWND>(wParam));
371 }
372 }
373 }
374 }
375
376 BOOL APIENTRY DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID /*lpvReserved*/)
377 {
378 g_hInstance = hinstDLL;
379
380 switch(fdwReason)
381 {
382 case DLL_PROCESS_ATTACH:
383 break;
384 case DLL_PROCESS_DETACH:
385 break;
386 case DLL_THREAD_ATTACH:
387 break;
388 case DLL_THREAD_DETACH:
389 break;
390 }
391
392 return TRUE;
393 }
394
395 extern "C"
396 {
397 // �v���O�C��������������������
398 //
399 // nInfoNo : ��������������������
400 // lpBuffer : �������i�[�����o�b�t�@
401 // nSize : �o�b�t�@���T�C�Y
402 //
403 // Return : �����������������������T�C�Y
404 // nInfoNo ���������� 0
405 int WINAPI GetPluginInfo(const int nInfNo, LPSTR lpBuffer,const int nSize)
406 {
407 if(!lpBuffer)
408 return 0;
409
410 if(nSize < 1)
411 return 0;
412
413 std::string result = t2c(Regnessem::AddIn::FileIO::g_fileIOMain.GetPluginInfo(nInfNo));
414
415 if(result.empty())
416 return 0;
417
418 std::string::size_type len = std::min<std::string::size_type>(nSize-1,result.size());
419
420 result.resize(len);
421 strcpy_s(lpBuffer,nSize,result.c_str());
422
423 return static_cast<int>(len);
424 }
425
426 // �v���O�C��������������
427 //
428 // lpPluginInitInfo : �v���O�C������������
429 //
430 // Return : �G���[�R�[�h
431 int WINAPI Initialize(const Regnessem::PNsmPluginInitInfo lpNsmInitInfo)
432 {
433 if(!lpNsmInitInfo)
434 return Regnessem::NsmPluginState::InternalError;
435
436 Regnessem::AddIn::FileIO::g_fileIOMain.Initialize(*lpNsmInitInfo);
437
438 return Regnessem::NsmPluginState::AllRight;
439 }
440
441 // �v���O�C�����I������
442 //
443 // Return : �G���[�R�[�h
444 int WINAPI Terminate()
445 {
446 Regnessem::AddIn::FileIO::g_fileIOMain.Terminate();
447
448 return Regnessem::NsmPluginState::AllRight;
449 }
450 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26