Ejemplo n.º 1
0
int LoadHomebrew(const char * path)
{
	filepath = path;
	u8 *buffer = NULL;
	u64 filesize = 0;
	int ret = LoadFileToMem(path, &buffer, &filesize);
	if(ret < 0)
		return ret;

	ret = CopyHomebrewMemory(buffer, 0, filesize);
	if(buffer) {
		free(buffer);
		buffer = NULL;
	}

	return ret;
}
Ejemplo n.º 2
0
bool RebootApp(void)
{
	// be sure to use current settings as arguments
	editMetaArguments();
	
#ifdef FULLCHANNEL
	ExitApp();
	WII_Initialize();
	return !(WII_LaunchTitle(TITLE_ID(0x00010001, 0x554c4e52)) < 0);
#else

	// Load meta.xml arguments
	char filepath[255];
	HomebrewXML MetaXML;
	snprintf(filepath, sizeof(filepath), "%s/meta.xml", Settings.update_path);
	MetaXML.LoadHomebrewXMLData(filepath);

	u8 *buffer = NULL;
	u32 filesize = 0;
	snprintf(filepath, sizeof(filepath), "%s/boot.dol", Settings.update_path);
	LoadFileToMem(filepath, &buffer, &filesize);
	if(!buffer)
	{
		return false;
	}
	FreeHomebrewBuffer();
	CopyHomebrewMemory(buffer, 0, filesize);

	AddBootArgument(filepath);

	for(u32 i = 0; i < MetaXML.GetArguments().size(); ++i)
	{
		AddBootArgument(MetaXML.GetArguments().at(i).c_str());
	}

	return !(BootHomebrewFromMem() <0);
#endif
}
int HomebrewReceiver::ReceiveFile()
{
	char filesizetxt[50];
	char temp[50];
	u32 filesize = 0;

	if (infilesize < MB_SIZE)
		snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fKB" ), infilesize / KB_SIZE);
	else snprintf(filesizetxt, sizeof(filesizetxt), tr( "Incoming file %0.2fMB" ), infilesize / MB_SIZE);

	snprintf(temp, sizeof(temp), tr( "Load file from: %s ?" ), GetIncommingIP());

	int choice = WindowPrompt(filesizetxt, temp, tr( "Load" ), tr( "Cancel" ));

	if (choice == 0)
		return 0;

	u32 read = 0;
	int len = NET_BLOCKSIZE;
	filesize = infilesize;
	u8 * buffer = (u8 *) malloc(infilesize);
	if(!buffer)
	{
		CloseConnection();
		WindowPrompt(tr( "Not enough memory." ), 0, tr( "OK" ));
		return 0;
	}

	bool error = false;
	while (read < infilesize)
	{
		ShowProgress(tr( "Receiving file from:" ), GetIncommingIP(), NULL, read, infilesize, true);
		
		if (infilesize - read < (u32) len)
			len = infilesize - read;
		else len = NET_BLOCKSIZE;
		
		int result = network_read(connection, buffer+read, len);
		
		if (result < 0)
		{
			CloseConnection();
			ProgressStop();
			WindowPrompt(tr( "Error while transfering data." ), 0, tr( "OK" ));
			free(buffer);
			return 0;
		}
		if (!result)
		{
			break;
		}
		
		read += result;
	}

	char filename[101];
	memset(filename, 0, sizeof(filename));
	
	network_read(connection, (u8*) filename, 100);
	
	//! Uncompress Wiiload
	if (wiiloadVersion[0] > 0 || wiiloadVersion[1] > 4)
	{
		u8 *unc = (u8 *) malloc(uncfilesize);
		if(!unc)
		{
			free(buffer);
			CloseConnection();
			ProgressStop();
			WindowPrompt(tr( "Not enough memory." ), 0, tr( "OK" ));
			return 0;
		}
		
		uLongf f = uncfilesize;
		error = uncompress(unc, &f, buffer, infilesize) != Z_OK;
		uncfilesize = f;
		filesize = uncfilesize;
		
		free(buffer);
		buffer = unc;
		free(unc);
	}

	CopyHomebrewMemory(buffer, 0, filesize);
	
	ProgressStop();

	if (error || read != infilesize)
	{
		WindowPrompt(tr( "Error:" ), tr( "No data could be read." ), tr( "OK" ));
		FreeHomebrewBuffer();
		return 0;
	}

	CloseConnection();
	
	AddBootArgument(filename);

	return BootHomebrewFromMem();
}