⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zip.c

📁 DC的SEGA_GG模拟器源代码
💻 C
字号:
#include "windows.h"
#include "commctrl.h"
#include "shared.h"
#include "unzip.h"
#include "main.h"
#include "resource.h"
#include "zip.h"

static char										FileToLoad[MAX_PATH];

LRESULT CALLBACK LoadZipProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static char		*pArchive;
	static int		ValidFiles;

	switch (msg)
	{
	case WM_INITDIALOG:
		{
			pArchive = (char *)lParam;
			CenterWindowInParent(hwnd);
			ValidFiles = PopulateZipDialog(GetDlgItem(hwnd, IDC_FILE_LIST), pArchive);

			switch (ValidFiles)
			{
			case 0:
				MessageBox(hwnd, "Zip file contains no games.", "Error", MB_OK | MB_ICONWARNING);
				SendMessage(hwnd, WM_CLOSE, 0, 0);
				break;

			case 1:
				EndDialog(hwnd, 1);
				break;

			default:
				ShowWindow(hwnd, SW_SHOW);
				break;
			}
		}
		break;

	case WM_COMMAND:
		{
			switch (HIWORD(wParam))
			{
			case BN_CLICKED:
				switch (LOWORD(wParam))
				{
				case IDC_OK_BUTTON:
					EndDialog(hwnd, 1);
					break;
				}
				break;
			}
		}
		break;

	case WM_NOTIFY:
		{
			LPNMHDR	 pHeader = (LPNMHDR)lParam;

			switch (pHeader->idFrom)
			{
			case IDC_FILE_LIST:
				switch (pHeader->code)
				{
				case LVN_ITEMCHANGED:
					{
						LPNMLISTVIEW	pnmlv = (LPNMLISTVIEW)lParam;
						LVITEM			Item;

						Item.mask		= LVIF_TEXT;
						Item.iItem		= pnmlv->iItem;
						Item.iSubItem	= 0;
						Item.cchTextMax = MAX_PATH;
						Item.pszText	= FileToLoad;

						ListView_GetItem(pnmlv->hdr.hwndFrom, &Item);
					}
					break;

				case NM_DBLCLK:
					EndDialog(hwnd, 1);
					break;
				}
				break;
			}
		}
		break;

	case WM_CLOSE:
		EndDialog(hwnd, 0);
		break;

    default:
		return FALSE;
	}

	return TRUE;
}

int PopulateZipDialog(HWND	hList, char *pArchive)
{
	char			Name[MAX_PATH];
	unzFile			Handle;
	unz_file_info	FileInfo;
	int				Count = 0;
	int				Error;
	LVITEM			Item;

	ListView_DeleteAllItems(hList);

	Handle = unzOpen(pArchive);

	if (!Handle) return 0;

	Error = unzGoToFirstFile(Handle);

	if (Error != UNZ_OK)
	{
		unzClose(Handle);

		return 0;
	}

	while (Error == UNZ_OK)
	{
	    unzGetCurrentFileInfo(Handle, &FileInfo, Name, MAX_PATH, NULL, 0, NULL, 0);

		if (!stricmp(&Name[strlen(Name) - 2], "gg") ||
			!stricmp(&Name[strlen(Name) - 3], "sms"))
		{
			Item.mask		= LVIF_TEXT;
			Item.pszText	= Name;
			Item.cchTextMax = strlen(Item.pszText);
			Item.iItem		= Count++;
			Item.iSubItem	= 0;

			ListView_InsertItem(hList, &Item);
		}

		Error = unzGoToNextFile(Handle);
	}

	if (Count)
	{
		ListView_SetItemState(hList, 0, LVIS_SELECTED, LVIS_SELECTED);
	
		Item.iItem		= 0;
		Item.cchTextMax = MAX_PATH;
		Item.pszText	= FileToLoad;
	
		ListView_GetItem(hList, &Item);
	}

    unzClose(Handle);

	return Count;
}

BOOL LoadSelectedFileFromZip(char *pArchive)
{	
	unzFile			Handle;
	unz_file_info	FileInfo;
	char			Name[MAX_PATH];
	int				BytesRead;

	Handle = unzOpen(pArchive);

	if (!Handle) return FALSE;

	if (unzLocateFile(Handle, FileToLoad, 2) != UNZ_OK)
	{
		unzClose(Handle);

		return FALSE;
	}

    unzGetCurrentFileInfo(Handle, &FileInfo, Name, MAX_PATH, NULL, 0, NULL, 0);

	if (FileInfo.uncompressed_size < 0x8000)
	{
		unzClose(Handle);

		return FALSE;
	}

	if (cart.rom) free(cart.rom);
	cart.rom = (char *)malloc(FileInfo.uncompressed_size);

	if (!cart.rom)
	{
		unzClose(Handle);

		return FALSE;
	}

    if (unzOpenCurrentFile(Handle) != UNZ_OK)
	{
		unzClose(Handle);

		return FALSE;
	}
    
    BytesRead = unzReadCurrentFile(Handle, cart.rom, FileInfo.uncompressed_size);

	if (BytesRead != (int)FileInfo.uncompressed_size)
	{
		free(cart.rom);
		cart.rom = NULL;
		unzClose(Handle);

		return FALSE;
	}

	if ((FileInfo.uncompressed_size / 512) & 1)
	{
		FileInfo.uncompressed_size -= 512;
		memmove(cart.rom, cart.rom + 512, FileInfo.uncompressed_size);
	}

	if (!stricmp(&Name[strlen(Name) - 2], "gg"))
	{
		cart.type  = TYPE_GG;
	}
	else
	{
		cart.type  = TYPE_SMS;
	}

	cart.pages = (unsigned char)(FileInfo.uncompressed_size / 0x4000);

    unzCloseCurrentFile(Handle);
	unzClose(Handle);

	strcpy(pArchive, Name);

	return TRUE;
}

/*
unsigned char *loadzip(char *archive, char *filename, int *filesize)
{
    char name[0x100];
    unsigned char *buffer;

    int zerror = UNZ_OK;
    unzFile zhandle;
    unz_file_info zinfo;

    zhandle = unzOpen(archive);
    if(!zhandle) return (NULL);

    zerror = unzGoToFirstFile(zhandle);
    if(zerror != UNZ_OK)
    {
        unzClose(zhandle);
        return (NULL);
    }

    unzGetCurrentFileInfo(zhandle, &zinfo, &name[0], 0xff, NULL, 0, NULL, 0);
    *filesize = zinfo.uncompressed_size;

    if(*filesize <= 0)
    {
        unzClose(zhandle);
        return (NULL);
    }

    zerror = unzOpenCurrentFile(zhandle);
    if(zerror != UNZ_OK)
    {
        unzClose(zhandle);
        return (NULL);
    }

    buffer = malloc(*filesize);
    if(!buffer) return (NULL);
    zerror = unzReadCurrentFile(zhandle, buffer, *filesize);

    if(zerror < 0 || zerror != *filesize)
    {
        free(buffer);
        buffer = NULL;
        unzCloseCurrentFile(zhandle);
        unzClose(zhandle);
        return (NULL);
    }

    unzCloseCurrentFile(zhandle);
    unzClose(zhandle);

    memcpy(filename, name, 0x100);
    return (buffer);
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -