水無瀬の部屋 > Programming > sample > tools > susie > susie.cpp |
---|
1: //*********************************************************
2: // プロジェクト: susie
3: // ファイル名: susie.cpp
4: //*********************************************************
5: #include <susie/susie.h> //
6: #include <header/tooldbg.h> // ASSERT(), VERIFY(),
7: #include <header/toolbase.h> //
8: #include <header/toolsys.h>
9: #include <limits.h> // INT_MAX,
10:
11:
12: //---------------------------------------------------------
13: // マクロ の 定義
14: //---------------------------------------------------------
15: #define REGPATH_SUSIEPLUGIN "Software\\Takechin\\Susie\\Plug-in"
16: #define REGSUBKEY_SUSIEPLUGINPATH "Path"
17:
18:
19: //---------------------------------------------------------
20: // ファイルスコープ関数 の 宣言
21: //---------------------------------------------------------
22: static int PASCAL Susie_DummyProgressCallback( int, int, long );
23: static bool OpenRegKeySusiePluginPath( HKEY *phKey, REGSAM samDesired );
24:
25:
26: //*********************************************************
27: // GetSusiePluginPath
28: // 既に Susie がインストールされている場合に
29: // Susie が参照しているプラグイン・フォルダを得る
30: //*********************************************************
31: bool
32: GetSusiePluginPath
33: (
34: char *buf,
35: int bufsize
36: )
37: {
38: // パラメタの仮定
39: ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
40: ASSERT( IsValidStringBufferPtr( buf, bufsize ) );
41: DESTROY_TEXT_BUFFER( buf, bufsize ); // [破壊]
42:
43: HKEY hkeySusiePlugin;
44: if ( !OpenRegKeySusiePluginPath( &hkeySusiePlugin, KEY_READ ) )
45: {
46: return false;
47: }
48:
49: buf[ 0 ] = '\0';
50: VERIFY( GetRegKeyString( hkeySusiePlugin, REGSUBKEY_SUSIEPLUGINPATH, buf, bufsize ) );
51: VERIFY( CloseRegKey( hkeySusiePlugin ) );
52:
53: ASSERT( IsValidLocalPathString( buf ) );
54: return true;
55: }//GetSusiePluginPath
56:
57: //*********************************************************
58: // Susie_GetPluginInfo
59: // プラグインの種類を得る
60: //*********************************************************
61: bool
62: Susie_GetPluginInfo
63: (
64: GetPluginInfo_t GetPluginInfo,
65: int *pType
66: )
67: {
68: // パラメタの仮定
69: ASSERT( IsValidPtr( pType, sizeof( *pType ) ) );
70: ASSERT( IsValidCodePtr( GetPluginInfo ) );
71:
72: //
73: char buf[ 16 ]; //
74: memzero( buf, sizeof(buf) );
75: const int len = GetPluginInfo( 0, buf, 4 );
76: if ( (len < 3) || (sizeof(buf) < len) || ('0' != buf[0]) || ('0' != buf[1]) )
77: {
78: return false;
79: }
80:
81: //
82: int type = 0;
83: ASSERT( (3 <= len) && (len <= 4) && ('0' == buf[0]) && ('0' == buf[1]) );
84: {for( int i = 0; (i < min(4, len) ) && ('\0' != buf[i]); ++i )
85: {
86: if ( 'I' == buf[i] ) type |= SPI_TYPE_IMPORT;
87: if ( 'X' == buf[i] ) type |= SPI_TYPE_EXPORT;
88: if ( 'A' == buf[i] ) type |= SPI_TYPE_ARCHIVE;
89: if ( 'C' == buf[i] ) type |= SPI_TYPE_COLOR;
90: if ( 'E' == buf[i] ) type |= SPI_TYPE_EFFECT;
91: if ( 'M' == buf[i] ) type |= SPI_TYPE_MULTI;
92: }}
93:
94: //
95: *pType = type;
96: return true;
97: }//Susie_GetPluginInfo
98:
99: //*********************************************************
100: // Susie_IsSupported
101: //*********************************************************
102: bool
103: Susie_IsSupported
104: (
105: IsSupported_t IsSupported,
106: const char *filename,
107: const BYTE *head,
108: int length
109: )
110: {
111: // パラメタの仮定
112: ASSERT( IsPathFile( filename ) );
113: ASSERT( (0 <= length) && (length <= 2048) );
114: ASSERT( IsValidReadPtr( head, length ) );
115: ASSERT( IsValidCodePtr( IsSupported ) );
116:
117: //
118: // head を破壊する plugin があるので head を直接は渡せない!
119: BYTE buffer[ 2048 ];
120: memzero( buffer, sizeof(buffer) );
121: memmove( buffer, head, length );
122:
123: // filename を破壊する plugin があるので filename を直接は渡せない!
124: char copyname[ MAX_PATH_BUF ];
125: strcopy( copyname, numof(copyname), filename );
126:
127: //
128: return 0 != IsSupported
129: (
130: copyname,
131: _w64_static_cast<DWORD>( reinterpret_cast<DWORD_PTR>( buffer ) ) // _W64
132: );
133: }//Susie_IsSupported
134:
135: //*********************************************************
136: // Susie_GetArchiveInfo
137: //*********************************************************
138: HLOCAL
139: Susie_GetArchiveInfo
140: (
141: GetArchiveInfo_t GetArchiveInfo,
142: const char *filename
143: )
144: {
145: // パラメタの仮定
146: ASSERT( IsPathFile( filename ) );
147: ASSERT( IsValidCodePtr( GetArchiveInfo ) );
148:
149: //
150: HLOCAL hArchiveInfo = null;
151:
152: // filename を破壊する plugin があるので filename を直接は渡せない!
153: char copyname[ MAX_PATH_BUF ];
154: strcopy( copyname, numof(copyname), filename );
155: if ( ERR_NoError != GetArchiveInfo( copyname, 0, 0, &hArchiveInfo ) )
156: {
157: return null;
158: }
159:
160: // 失敗しても ERR_NoError を返す plugin があるので hArchiveInfo は信用できない!
161: if ( !IsValidLocalMemoryEx( hArchiveInfo, sizeof(fileinfo_t), INT_MAX ) )
162: {
163: return null;
164: }
165:
166: ASSERT( IsValidLocalMemoryEx( hArchiveInfo, sizeof(fileinfo_t), INT_MAX ) );
167: return hArchiveInfo;
168: }//Susie_GetArchiveInfo
169:
170: //*********************************************************
171: // Susie_GetFile
172: //*********************************************************
173: HLOCAL
174: Susie_GetFile
175: (
176: GetFile_t GetFile,
177: const char *filename,
178: ULONG offset,
179: int filesize
180: )
181: {
182: // パラメタの仮定
183: ASSERT( 0 < filesize );
184: ASSERT( IsPathFile( filename ) );
185: ASSERT( IsValidCodePtr( GetFile ) );
186:
187: //
188: HLOCAL hData = null;
189:
190: // filename を破壊する plugin があるので filename を直接は渡せない!
191: char copyname[ MAX_PATH_BUF ];
192: strcopy( copyname, numof(copyname), filename );
193: if ( ERR_NoError != GetFile( copyname, offset, (LPSTR)&hData, 0x0100, (FARPROC)Susie_DummyProgressCallback, 0 ) )
194: {
195: return null;
196: }
197:
198: // 失敗しても ERR_NoError を返す plugin があるので hData は信用できない!
199: if ( !IsValidLocalMemoryEx( hData, filesize, INT_MAX ) )
200: {
201: return null;
202: }
203:
204: //
205: ASSERT( IsValidLocalMemoryEx( hData, filesize, INT_MAX ) );
206: return hData;
207: }//Susie_GetFile
208:
209: //*********************************************************
210: // Susie_GetPicture
211: //*********************************************************
212: bool
213: Susie_GetPicture
214: (
215: GetPicture_t GetPicture,
216: const char *filename,
217: HLOCAL *phBmpInfo,
218: HLOCAL *phImage
219: )
220: {
221: // パラメタの仮定
222: ASSERT( IsValidCodePtr( GetPicture ) );
223: ASSERT( IsValidPtr( phBmpInfo, sizeof( *phBmpInfo ) ) );
224: ASSERT( IsValidPtr( phImage, sizeof( *phImage ) ) );
225: ASSERT( IsPathFile( filename ) );
226:
227: //
228: HLOCAL hImage = null;
229: HLOCAL hBmpInfo = null;
230:
231: // filename を破壊する plugin があるので filename を直接は渡せない!
232: char copyname[ MAX_PATH_BUF ];
233: strcopy( copyname, numof(copyname), filename );
234: if ( ERR_NoError != GetPicture( copyname, 0, 0, &hBmpInfo, &hImage, (FARPROC)Susie_DummyProgressCallback, 0 ) )
235: {
236: return false;
237: }
238:
239: // 失敗しても ERR_NoError を返す plugin があるので hImage は信用できない!
240: if ( ! IsValidLocalMemory( hImage ) )
241: {
242: return false;
243: }
244:
245: // 失敗しても ERR_NoError を返す plugin があるので hBmpInfo は信用できない!
246: if ( ! IsValidLocalMemoryEx( hBmpInfo, sizeof(BITMAPINFOHEADER), INT_MAX ) )
247: {
248: return false;
249: }
250:
251: *phImage = hImage;
252: *phBmpInfo = hBmpInfo;
253:
254: ASSERT( IsValidLocalMemoryEx( *phBmpInfo, sizeof(BITMAPINFOHEADER), INT_MAX ) );
255: ASSERT( IsValidLocalMemoryEx( *phImage, 1, INT_MAX ) );
256: return true;
257: }//Susie_GetPicture
258:
259:
260: //******************************************************************************************************************
261: // private
262: //******************************************************************************************************************
263: //*********************************************************
264: // OpenRegKeySusiePluginPath
265: //*********************************************************
266: static
267: bool
268: OpenRegKeySusiePluginPath
269: (
270: HKEY *phKey,
271: REGSAM samDesired
272: )
273: {
274: // パラメタの仮定
275: ASSERT( IsValidPtr( phKey, sizeof( *phKey ) ) );
276:
277: return OpenRegKey
278: (
279: HKEY_CURRENT_USER,
280: REGPATH_SUSIEPLUGIN,
281: samDesired,
282: phKey
283: );
284: }//OpenRegKeySusiePluginPath
285:
286:
287: //******************************************************************************************************************
288: // private
289: //******************************************************************************************************************
290: //*********************************************************
291: // Susie_DummyProgressCallback
292: // 仕様では省略できるはずだが実際には無いと落ちる plugin がある。
293: //*********************************************************
294: static
295: int
296: PASCAL
297: Susie_DummyProgressCallback
298: (
299: int,
300: int,
301: long
302: )
303: {
304: return 0;
305: }//Susie_DummyProgressCallback
306:
307:
308: //** end **
309:
参照:
水無瀬の部屋 > sample > tools > susie > susie.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/susie/susie_cpp.shtml
>> Amazon.co.jp 『たまゆら童子』 へ
>> 楽天ブックス 『たまゆら童子』 へ