Fix crashing if a file no longer exists when Winamp tries to access it.
Fix crashing if a file no longer exists when Winamp tries to access it.

--- a/src/in_xsf_framework/in_xsf.cpp
+++ b/src/in_xsf_framework/in_xsf.cpp
@@ -101,7 +101,18 @@
 		xSF = xSFFile;
 	else
 	{
-		xSF = new XSFFile(file);
+		try
+		{
+			xSF = new XSFFile(file);
+		}
+		catch (const std::exception &)
+		{
+			if (title)
+				String("").CopyToString(title);
+			if (length_in_ms)
+				*length_in_ms = -1000;
+			return;
+		}
 		toFree = true;
 	}
 	if (title)
@@ -309,23 +320,30 @@
 	}
 	else
 	{
-		XSFFile file = XSFFile(fn);
-		std::string tagToGet = data;
-		if (eqstr(data, "album"))
-			tagToGet = "game";
-		if (!file.GetTagExists(tagToGet))
-		{
-			if (eqstr(tagToGet, "replaygain_track_gain"))
+		try
+		{
+			XSFFile file = XSFFile(fn);
+			std::string tagToGet = data;
+			if (eqstr(data, "album"))
+				tagToGet = "game";
+			if (!file.GetTagExists(tagToGet))
+			{
+				if (eqstr(tagToGet, "replaygain_track_gain"))
+					return 1;
+				return 0;
+			}
+			else if (eqstr(tagToGet, "length"))
+			{
+				strcpy(dest, stringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
 				return 1;
+			}
+			file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest, true);
+			return 1;
+		}
+		catch (const std::exception &)
+		{
 			return 0;
 		}
-		else if (eqstr(tagToGet, "length"))
-		{
-			strcpy(dest, stringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
-			return 1;
-		}
-		file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest, true);
-		return 1;
 	}
 }
 
@@ -343,23 +361,30 @@
 	}
 	else
 	{
-		XSFFile file = XSFFile(fn);
-		std::string tagToGet = data;
-		if (eqstr(data, "album"))
-			tagToGet = "game";
-		if (!file.GetTagExists(tagToGet))
-		{
-			if (eqstr(tagToGet, "replaygain_track_gain"))
+		try
+		{
+			XSFFile file = XSFFile(fn);
+			std::string tagToGet = data;
+			if (eqstr(data, "album"))
+				tagToGet = "game";
+			if (!file.GetTagExists(tagToGet))
+			{
+				if (eqstr(tagToGet, "replaygain_track_gain"))
+					return 1;
+				return 0;
+			}
+			else if (eqstr(tagToGet, "length"))
+			{
+				wcscpy(dest, wstringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
 				return 1;
+			}
+			file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest);
+			return 1;
+		}
+		catch (const std::exception &)
+		{
 			return 0;
 		}
-		else if (eqstr(tagToGet, "length"))
-		{
-			wcscpy(dest, wstringify(file.GetLengthMS(xSFConfig->GetDefaultLength()) + file.GetFadeMS(xSFConfig->GetDefaultFade())).c_str());
-			return 1;
-		}
-		file.GetTagValue(tagToGet).Substring(0, destlen - 1).CopyToString(dest);
-		return 1;
 	}
 }
 
@@ -373,16 +398,30 @@
 
 extern "C" __declspec(dllexport) int winampSetExtendedFileInfo(const char *fn, const char *data, const wchar_t *val)
 {
-	if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetStr() != fn)
-		extendedXSFFile.reset(new XSFFile(fn));
-	return wrapperWinampSetExtendedFileInfo(data, val);
+	try
+	{
+		if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetStr() != fn)
+			extendedXSFFile.reset(new XSFFile(fn));
+		return wrapperWinampSetExtendedFileInfo(data, val);
+	}
+	catch (const std::exception &)
+	{
+		return 0;
+	}
 }
 
 extern "C" __declspec(dllexport) int winampSetExtendedFileInfoW(const wchar_t *fn, const char *data, const wchar_t *val)
 {
-	if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetWStr() != fn)
-		extendedXSFFile.reset(new XSFFile(fn));
-	return wrapperWinampSetExtendedFileInfo(data, val);
+	try
+	{
+		if (!extendedXSFFile.get() || extendedXSFFile->GetFilename().GetWStr() != fn)
+			extendedXSFFile.reset(new XSFFile(fn));
+		return wrapperWinampSetExtendedFileInfo(data, val);
+	}
+	catch (const std::exception &)
+	{
+		return 0;
+	}
 }
 
 extern "C" __declspec(dllexport) int winampWriteExtendedFileInfo()
@@ -418,14 +457,28 @@
 
 extern "C" __declspec(dllexport) intptr_t winampGetExtendedRead_open(const char *fn, int *size, int *bps, int *nch, int *srate)
 {
-	auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
-	return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
+	try
+	{
+		auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
+		return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
+	}
+	catch (const std::exception &)
+	{
+		return 0;
+	}
 }
 
 extern "C" __declspec(dllexport) intptr_t winampGetExtendedRead_openW(const wchar_t *fn, int *size, int *bps, int *nch, int *srate)
 {
-	auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
-	return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
+	try
+	{
+		auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
+		return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
+	}
+	catch (const std::exception &)
+	{
+		return 0;
+	}
 }
 
 int extendedSeekNeeded = -1;