www.pudn.com > MyPlayerbylqh.rar > SkinList.cpp


/************************************************************************************** 
 *                                                                                    * 
 *                                                                                    * 
 **************************************************************************************/ 
 
#include "SkinList.h" 
#include  
#include  
#include  
 
/*  
 * 外壳信息类 
 */ 
 
SkinInfo::SkinInfo(char *directory) { 
 
	this->directory = (char *) new char[strlen(directory)+1];  
 
	this->directory = strcpy(this->directory, directory); 
	this->directory[strlen(directory)] = '\0'; 
 
	this->name      = strrchr(this->directory, '\\') + 1; 
 
	if(name == NULL) { 
 
		name = directory; 
	} 
} 
 
SkinInfo::~SkinInfo() { 
	 
	free(this->directory); 
} 
 
/*  
 * 外壳链表类 
 */ 
 
SkinList::SkinList() { 
	 
	this->totalSkins = 0; 
	this->skins      = NULL; 
	this->skinsDir   = NULL; 
 
	/* 
	 * 从注册表中得到链表路径 
	 */ 
 
	HKEY     key; 
	DWORD    created, size, type; 
	LONG     result; 
	 
 
 
	/* 
	 * 打开注册键 
	 */ 
 
	result = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\DivXNetworks\\ThePlaya", 
							0, "CONFIG", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,  
							NULL, &key, &created); 
 
	if(result != ERROR_SUCCESS) { 
 
		MessageBox(NULL, "Couldn't load skins directories", "", MB_OK); 
		return; 
	} 
 
	switch(created) { 
 
	case REG_CREATED_NEW_KEY: 
 
		/* 
		 * 第一次启动(缺省) 
		 *  
		 */ 
 
		this->skinsDir = NULL; 
		 
		break; 
 
	case REG_OPENED_EXISTING_KEY: 
		 
		/* 
		 * 读值 
 		 */ 
 
		this->skinsDir = (char *) new char[MAX_PATH]; 
 
		size = MAX_PATH; 
		result = RegQueryValueEx(key, "SkinsDir", 0, &type, (BYTE *)this->skinsDir, &size); 
 
		if(result == ERROR_MORE_DATA) { 
 
			this->skinsDir = (char *) realloc(this->skinsDir, size); 
			result = RegQueryValueEx(key, "SkinsDir", 0, &type, (BYTE *)this->skinsDir, &size); 
		} 
 
		if(result != ERROR_SUCCESS) { 
 
			free(this->skinsDir); 
			this->skinsDir = NULL; 
		} 
 
		break; 
 
	default: 
		break; 
	} 
 
	RegCloseKey(key); 
} 
 
SkinList::~SkinList() { 
 
	free(this->skinsDir); 
} 
 
void SkinList::Add(SkinInfo *skinInfo) { 
 
	skinlist_t *node; 
 
	node = (skinlist_t *) new skinlist_t; 
	node->info     = skinInfo; 
	node->next     = this->skins; 
 
	this->skins = node; 
 
	this->totalSkins++; 
} 
 
int SkinList::SetDir(char *dir) { 
 
	this->skinsDir = dir; 
 
	HKEY     key; 
	DWORD    created; 
	LONG     result; 
 
	/* 
	 * 尝试打开注册键 
	 */ 
 
	result = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\DivXNetworks\\ThePlaya", 
							0, "CONFIG", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,  
							NULL, &key, &created); 
 
	if(result != ERROR_SUCCESS) { 
 
		MessageBox(NULL, "Couldn't save skins dir", "", MB_OK); 
		return 0; 
	} 
 
	RegSetValueEx(key, "SkinsDir", 0, REG_SZ, (BYTE *) this->skinsDir, strlen(this->skinsDir)); 
 
	return 1; 
} 
 
int SkinList::Scan() { 
 
	this->totalSkins = 0; 
	this->skins      = NULL; 
 
	if(this->skinsDir != NULL && strcmp(this->skinsDir, "Default") != 0) { 
	 
		WIN32_FIND_DATA dirData; 
		HANDLE          hFind = NULL, hSkin = NULL; 
		char           *str; 
 
		str = (char *) new char[(strlen(this->skinsDir))]; 
		strcpy(str, this->skinsDir); 
		 
		hFind = FindFirstFile(strcat(str, "\\*.*"), &dirData); 
 
		if(hFind != NULL) { 
			 
			if(strcmp(dirData.cFileName, ".") != 0 && strcmp(dirData.cFileName, "..") != 0) { 
	 
				if(dirData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 
 
					this->Add(new SkinInfo(dirData.cFileName)); 
				} 
			} 
 
			while(FindNextFile(hFind, &dirData)) { 
	 
				if(strcmp(dirData.cFileName, ".") != 0 && strcmp(dirData.cFileName, "..") != 0) { 
 
					if(dirData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 
					 
						char filename[MAX_PATH]; 
						 
						strcpy(filename, this->skinsDir); 
		 
						strcat(strcat(filename, "\\"), dirData.cFileName); 
	 
						this->Add(new SkinInfo(filename)); 
					} 
				} 
			} 
 
			FindClose(hFind); 
		} 
	} 
 
	return 0; 
} 
 
int Reset() { 
 
	return 0; 
} 
 
int SkinList::getNumberOfSkins() { 
 
	return this->totalSkins; 
} 
 
SkinInfo *SkinList::getSkinInfo(int position) { 
 
	if(position >= 0 && position < this->totalSkins) { 
 
		int         i; 
		skinlist_t *node; 
 
		node = this->skins; 
 
		for(i = 0; i < position; i++) { 
 
			node = node->next; 
		} 
 
		return node->info; 
	} 
 
	return NULL; 
}