www.pudn.com > MP3CORD.rar > win32impl.cpp


#include  
#include  
#include  
#include  
#include  
 
#include "win32impl.h" 
 
class FindData 
{ 
public: 
	DIR *pDir; 
	char *dir; // points to directory name of search 
	char *rest; // points to remainder of the filename, which we should match against 
	~FindData(); 
	FindData(); 
}; 
 
FindData::FindData() 
{ 
	dir = NULL; 
	rest = NULL; 
	pDir = NULL; 
} 
 
FindData::~FindData() 
{ 
	if (dir) delete dir; 
	if (rest) delete rest; 
} 
 
bool Match(char *,char *); 
void FillWin32FindData(char *,WIN32_FIND_DATA *); 
 
HANDLE 
FindFirstFile(char *lpFileName, WIN32_FIND_DATA *lpFindFileData) 
{ 
	// cout << "FindFirstFile: begin" << endl; 
	// cout << "file = " << lpFileName << endl; 
	if (!lpFileName || !lpFindFileData) return INVALID_HANDLE_VALUE; 
 
	FindData *pFD = new FindData(); 
	// 1) find earliest wildcard, chop up to directory marker 
	char *ps = strchr(lpFileName,'*'); 
	char *pQ = strchr(lpFileName,'?'); 
	char *chopChar = '\0'; 
	if (!ps && !pQ) { 
		// no wildcards... fill in the win32_find_data structure 
		FillWin32FindData(lpFileName,lpFindFileData); 
		// no more files... 
		pFD->pDir = NULL; 
		pFD->dir = NULL; 
		pFD->rest = NULL; 
		return (HANDLE)pFD; 
	} else if (!ps && pQ) { 
		chopChar = pQ; 
	} else if (ps && !pQ) { 
		chopChar = ps; 
	} else { 
		chopChar = (ps > pQ) ? pQ : ps; 
	} 
 
	char holdChar = *chopChar; 
	*chopChar = '\0'; 
	char *lastSlash = strrchr(lpFileName,'/'); 
	*chopChar = holdChar; 
	char *pDir, *pRest; 
	if (lastSlash) { 
		pDir = lpFileName; 
		pRest = lastSlash + sizeof(char); 
		*lastSlash = '\0'; 
		pFD->dir = new char[strlen(pDir)+1]; 
		pFD->rest = new char[strlen(pRest)+1]; 
		strcpy(pFD->dir,pDir); 
		strcpy(pFD->rest,pRest); 
		*lastSlash = '/'; 
	} else { 
		pDir = NULL; 
		pRest = lpFileName; 
		pFD->rest = new char[strlen(pRest)+1]; 
		strcpy(pFD->rest,pRest); 
	} 
 
	if (pFD->dir) { 
		pFD->pDir = opendir(pFD->dir); 
		if (pFD->pDir) { 
			struct dirent *pdirent = readdir(pFD->pDir); 
			while (pdirent) { 
				//cout << "FindFirstFile: matching " << pFD->rest << " to " << pdirent->d_name << endl; 
				if (Match(pFD->rest,pdirent->d_name)) { 
					FillWin32FindData(pdirent->d_name,lpFindFileData); 
					return (HANDLE)pFD; 
				} 
				pdirent = readdir(pFD->pDir); 
			} 
			// no matching directory entries... 
			return INVALID_HANDLE_VALUE; 
		} else { 
			// dir open failed, so no matches 
			return INVALID_HANDLE_VALUE; 
		} 
	} else { 
		// no directory, just see if file exists... 
	} 
 
	return INVALID_HANDLE_VALUE; 
} 
 
bool 
Match(char *pattern,char *string) 
{ 
	// cout << "Comparing " << pattern << " to " << string << endl; 
	if (!pattern || !string) return false; 
	char *ps1 = pattern; 
	char *ps2 = string; 
 
	while ((*ps1 != '\0') && (ps2 != '\0')) { 
		switch (*ps1) { 
		case '?': 
			ps1++; 
			ps2++; 
			break; 
		case '*': { 
			// find existance of next block 
			ps1++; 
			char *pS = strchr(ps1,'*'); 
			char *pQ = strchr(ps1,'?'); 
			if (pS) {*pS = '\0';}  if (pQ) {*pQ = '\0';} 
			char *pStr = strstr(ps2,ps1); 
			if (pS) {*pS = '*';} if (pQ) {*pQ = '?';} 
			if (pStr) { 
				ps2 = pStr; 
				return Match(ps1,ps2); 
			} 
			return false; 
			break; } 
		default: 
			if (*ps1 != *ps2) return false; 
			ps1++; 
			ps2++; 
			break; 
		} 
	} 
	if ((*ps1 == '\0') && (*ps2 == '\0')) 
		return true; 
	else 
		return false; 
} 
 
 
void 
FillWin32FindData(char *pF,WIN32_FIND_DATA *wfd) 
{ 
	// cout << "FillWin32FindData: Entering: " << pF << endl; 
	strcpy(wfd->cFileName,pF); 
} 
 
 
bool 
FindNextFile(HANDLE hFindHandle, WIN32_FIND_DATA *lpFindFileData) 
{ 
	// cout << "FindNext: begin" << endl; 
	if (!hFindHandle || !lpFindFileData) return false; 
	FindData *pFD = (FindData *)hFindHandle; 
	if (!pFD->pDir) { 
		// no dir, that means only one match, which we already did 
		return false; 
	} 
	struct dirent *pdirent = readdir(pFD->pDir); 
	while (pdirent) { 
		if (Match(pFD->rest,pdirent->d_name)) { 
			FillWin32FindData(pdirent->d_name,lpFindFileData); 
			return true; 
		} 
		pdirent = readdir(pFD->pDir); 
	} 
	// no matches, or dir empty... 
	return false; 
} 
 
 
bool 
FindClose(HANDLE hFindFile) 
{ 
	if (!hFindFile) return false; 
	FindData *pFD = (FindData *)hFindFile; 
	closedir(pFD->pDir); 
	return true; 
} 
 
HINSTANCE 
LoadLibrary(char *lpLibFileName) 
{ 
	image_id	addon_image; 
	addon_image = load_add_on( lpLibFileName ); 
	if ( addon_image > 0 ) 
	{ 
		PRINT(( "Add-on loaded successfully\n" )); 
		return (HINSTANCE)addon_image; 
	} 
	else 
	{ 
		PRINT(( "error loading add-on\n" )); 
		return (HINSTANCE)NULL; 
	} 
} 
 
 
 
bool FreeLibrary(HMODULE hLibModule) 
{ 
	// cout << "FreeLibrary" << endl; 
	if ( unload_add_on( (image_id)hLibModule ) < B_NO_ERROR ) 
	{ 
		PRINT(( "error unloading addon\n" )); 
		return false; 
	} 
	else 
	{ 
		PRINT(( "addon unloaded successfully\n" )); 
		return true; 
	} 
} 
 
 
FARPROC 
GetProcAddress( HMODULE hModule, char * lpProcName ) 
{ 
	// cout << "GetProcAddress: " << lpProcName << endl; 
	void	(*exportedFunc)(); 
	status_t err; 
	err = get_image_symbol( 
						(image_id)hModule, 
						lpProcName, 
						B_SYMBOL_TYPE_TEXT, 
						(void**)&exportedFunc 
						); 
	if ( err < B_NO_ERROR ) 
	{ 
		PRINT(( "couldn't get symbol %s\n", lpProcName )); 
		return NULL; 
	} 
	else 
	{ 
		PRINT(( "obtained symbol %s successfully\n", lpProcName )); 
		return (FARPROC)exportedFunc; 
	} 
} 
 
// vim:ts=4