mirror of
https://github.com/fadden/ciderpress.git
synced 2024-11-23 11:33:58 +00:00
b97584eeb6
Fix some %ld message in log messages, and update the Linux sample code to match recent changes in NufxLib and DiskImgLib. Also, bump MDC version to 3.0.0 to match Windows version.
192 lines
4.9 KiB
C++
192 lines
4.9 KiB
C++
/*
|
|
* CiderPress
|
|
* Copyright (C) 2007 by faddenSoft, LLC. All Rights Reserved.
|
|
* See the file LICENSE for distribution terms.
|
|
*/
|
|
/*
|
|
* Implementation of DiskImgLib globals.
|
|
*/
|
|
#include "StdAfx.h"
|
|
#include "DiskImgPriv.h"
|
|
#include "ASPI.h"
|
|
|
|
/*static*/ bool Global::fAppInitCalled = false;
|
|
|
|
/*static*/ ASPI* Global::fpASPI = NULL;
|
|
|
|
/* global constant */
|
|
const char* DiskImgLib::kASPIDev = "ASPI:";
|
|
|
|
|
|
/*
|
|
* Perform one-time DLL initialization.
|
|
*/
|
|
/*static*/ DIError Global::AppInit(void)
|
|
{
|
|
NuError nerr;
|
|
int32_t major, minor, bug;
|
|
|
|
if (fAppInitCalled) {
|
|
LOGW("DiskImg AppInit already called");
|
|
return kDIErrNone;
|
|
}
|
|
|
|
LOGI("Initializing DiskImg library v%d.%d.%d",
|
|
kDiskImgVersionMajor, kDiskImgVersionMinor, kDiskImgVersionBug);
|
|
|
|
#ifdef _WIN32
|
|
HMODULE hModule;
|
|
WCHAR fileNameBuf[256];
|
|
hModule = ::GetModuleHandle(L"DiskImg4.dll");
|
|
if (hModule != NULL &&
|
|
::GetModuleFileName(hModule, fileNameBuf,
|
|
sizeof(fileNameBuf) / sizeof(WCHAR)) != 0)
|
|
{
|
|
// GetModuleHandle does not increase ref count, so no need to release
|
|
LOGD("DiskImg DLL loaded from '%ls'", fileNameBuf);
|
|
} else {
|
|
LOGW("Unable to get DiskImg DLL filename");
|
|
}
|
|
#endif
|
|
|
|
/*
|
|
* Make sure we're linked against a compatible version of NufxLib.
|
|
*/
|
|
nerr = NuGetVersion(&major, &minor, &bug, NULL, NULL);
|
|
if (nerr != kNuErrNone) {
|
|
LOGE("Unable to get version number from NufxLib.");
|
|
return kDIErrNufxLibInitFailed;
|
|
}
|
|
|
|
if (major != kNuVersionMajor || minor < kNuVersionMinor) {
|
|
LOGE("Unexpected NufxLib version %d.%d.%d",
|
|
major, minor, bug);
|
|
return kDIErrNufxLibInitFailed;
|
|
}
|
|
|
|
/*
|
|
* Do one-time init over in the DiskImg class.
|
|
*/
|
|
DiskImg::CalcNibbleInvTables();
|
|
|
|
#if defined(HAVE_WINDOWS_CDROM) && defined(WANT_ASPI)
|
|
if (kAlwaysTryASPI || IsWin9x()) {
|
|
fpASPI = new ASPI;
|
|
if (fpASPI->Init() != kDIErrNone) {
|
|
delete fpASPI;
|
|
fpASPI = NULL;
|
|
}
|
|
}
|
|
#endif
|
|
LOGD("DiskImg HasSPTI=%d HasASPI=%d", GetHasSPTI(), GetHasASPI());
|
|
|
|
fAppInitCalled = true;
|
|
|
|
return kDIErrNone;
|
|
}
|
|
|
|
/*
|
|
* Perform cleanup at application shutdown time.
|
|
*/
|
|
/*static*/ DIError Global::AppCleanup(void)
|
|
{
|
|
LOGI("DiskImgLib cleanup");
|
|
delete fpASPI;
|
|
return kDIErrNone;
|
|
}
|
|
|
|
/*
|
|
* Simple getters.
|
|
*
|
|
* SPTI is enabled if we're in Win2K *and* ASPI isn't loaded. If ASPI is
|
|
* loaded, it can interfere with SPTI, so we want to stick with one or
|
|
* the other.
|
|
*/
|
|
#ifdef _WIN32
|
|
/*static*/ bool Global::GetHasSPTI(void) { return !IsWin9x() && fpASPI == NULL; }
|
|
/*static*/ bool Global::GetHasASPI(void) { return fpASPI != NULL; }
|
|
/*static*/ unsigned long Global::GetASPIVersion(void) {
|
|
assert(fpASPI != NULL);
|
|
#ifdef WANT_ASPI
|
|
return fpASPI->GetVersion();
|
|
#else
|
|
return 123456789;
|
|
#endif
|
|
}
|
|
#else
|
|
/*static*/ bool Global::GetHasSPTI(void) { return false; }
|
|
/*static*/ bool Global::GetHasASPI(void) { return false; }
|
|
/*static*/ unsigned long Global::GetASPIVersion(void) { assert(false); return 0; }
|
|
#endif
|
|
|
|
|
|
/*
|
|
* Return current library versions.
|
|
*/
|
|
/*static*/ void Global::GetVersion(int32_t* pMajor, int32_t* pMinor,
|
|
int32_t* pBug)
|
|
{
|
|
if (pMajor != NULL)
|
|
*pMajor = kDiskImgVersionMajor;
|
|
if (pMinor != NULL)
|
|
*pMinor = kDiskImgVersionMinor;
|
|
if (pBug != NULL)
|
|
*pBug = kDiskImgVersionBug;
|
|
}
|
|
|
|
|
|
/*
|
|
* Pointer to debug message handler function.
|
|
*/
|
|
/*static*/ Global::DebugMsgHandler Global::gDebugMsgHandler = NULL;
|
|
|
|
/*
|
|
* Change the debug message handler. The previous handler is returned.
|
|
*/
|
|
Global::DebugMsgHandler Global::SetDebugMsgHandler(DebugMsgHandler handler)
|
|
{
|
|
DebugMsgHandler oldHandler;
|
|
|
|
oldHandler = gDebugMsgHandler;
|
|
gDebugMsgHandler = handler;
|
|
return oldHandler;
|
|
}
|
|
|
|
/*
|
|
* Send a debug message to the debug message handler.
|
|
*
|
|
* Even if _DEBUG_MSGS is disabled we can still get here from the NuFX error
|
|
* handler.
|
|
*/
|
|
/*static*/ void Global::PrintDebugMsg(const char* file, int line, const char* fmt, ...)
|
|
{
|
|
if (gDebugMsgHandler == NULL) {
|
|
/*
|
|
* This can happen if the app decides to bail with an exit()
|
|
* call. I'm not sure what's zapping the pointer.
|
|
*
|
|
* We get here on "-install" or "-uninstall", which really
|
|
* should be using a more Windows-friendly exit strategy.
|
|
*/
|
|
DebugBreak();
|
|
return;
|
|
}
|
|
|
|
char buf[512];
|
|
va_list args;
|
|
|
|
va_start(args, fmt);
|
|
#if defined(HAVE_VSNPRINTF)
|
|
(void) vsnprintf(buf, sizeof(buf), fmt, args);
|
|
#elif defined(HAVE__VSNPRINTF)
|
|
(void) _vsnprintf(buf, sizeof(buf), fmt, args);
|
|
#else
|
|
# error "hosed"
|
|
#endif
|
|
va_end(args);
|
|
|
|
buf[sizeof(buf)-1] = '\0';
|
|
|
|
(*gDebugMsgHandler)(file, line, buf);
|
|
}
|