Net-FreeDB

 view release on metacpan or  search on metacpan

lib/win32.h  view on Meta::CPAN

/********************************
FILE: win32.h
Created On: 08/04/2001
Creadted By: David Shultz
********************************/

#ifndef WIN32_H
#define WIN32_H

#include <windows.h>
#include <stdio.h>
#include <stddef.h>
#include <conio.h>
#include "toctool.h"
#include "scsidefs.h"

// Variable inits
BOOL bInit;
INTERFACE interfaces[NUM_INTERFACE];
int iActiveInterface;
int iOSVer;
DWORD (*GetASPI32SupportInfo)(void);
DWORD (*SendASPI32Command)(LPSRB);

int numDrives;
TOC toc;
DRIVELIST driveList;

HINSTANCE hDll;

struct discdata {
	unsigned long discid;
	int num_of_trks;
	int track_offsets[100];
	int seconds;
};

// Function defs
unsigned long CDDBSum(unsigned long);
static int getNumAdapters(void);
static int aspiGetNumDrives(void);
static int ntGetNumDrives(void);
int aspiReadTOC(int, TOC*);
void* genCddbQuery(TOC*);

// Funcs
unsigned long genCddbId(TOC *toc) {
  unsigned long t, n;
  TOCTRACK *t1, *t2;
  int i, numTracks;
  
  if (!toc)
    return 0;
  
  t = n = 0;
  numTracks = (int)(toc->lastTrack - toc->firstTrack + 1);
  for(i = 0; i < numTracks; i++) {
    t1 = &(toc->tracks[i]);
    n += CDDBSum(60 * t1->addr[1] + t1->addr[2]);
  }
  
  t2 = &(toc->tracks[numTracks]);
  t = 60 * t2->addr[1] + t2->addr[2];
  t2 = &(toc->tracks[0]);
  t -= (60 * t2->addr[1] + t2->addr[2]);
  
  return (unsigned long)( ((n % 0xFF) << 24) | 
                             (t << 8) | 
                             ((unsigned long)numTracks));
}

unsigned long CDDBSum(unsigned long n) {
  unsigned long retVal = 0;

  while(n > 0) {
      retVal += (n % 10);
      n /= 10;
    }

  return retVal;
}

void* genCddbQuery(TOC* toc) {
  struct discdata* cd = (struct discdata*)malloc(sizeof(struct discdata));
  int numTracks, i, ofs;
  TOCTRACK *t1;
  
  if (!toc)
    return cd;
  
  numTracks = (int)(toc->lastTrack - toc->firstTrack + 1);

  // cddbid
  cd->discid = genCddbId(toc);
  // number of tracks
  cd->num_of_trks = numTracks;

  // track offsets (not including lead-out)
  for(i = 0; i < numTracks; i++) {
    t1 = &(toc->tracks[i]);
    ofs = (((t1->addr[1] * 60) + t1->addr[2]) * 75) + t1->addr[3];
	cd->track_offsets[i] = ofs;
  }
  
  // disc length
  t1 = &toc->tracks[i];
  ofs = t1->addr[1]*60 + t1->addr[2];
  cd->seconds = ofs;

	return (void*)cd;
}

int getNumDrives(void) {
  if (!bInit)
    return 0;

	return aspiGetNumDrives();
}

void getDriveDesc(int driveNo, char *szBuf, int bufLen) {
  if (!szBuf)
    return;
  
  ZeroMemory(szBuf, bufLen);
  
  if (!bInit)
    return;
  
  if (driveNo > driveList.num)
    return;

	lstrcpyn(szBuf, driveList.drive[driveNo].a.desc, bufLen);
}

static int aspiGetNumDrives( void )
{
  SRB_HAInquiry sh;
  SRB_GDEVBlock sd;
  BYTE numAdapters, maxTgt;
  BYTE i, j, k;
  int idx = 0;
  
  // initialize the drive list;
  ZeroMemory( &driveList, sizeof(driveList) );

lib/win32.h  view on Meta::CPAN

 */
int initTool(void) {
  
  if (bInit)
    return 0;
  
  ZeroMemory(interfaces, sizeof(interfaces));
  lstrcpy(interfaces[INTERFACE_ASPI].name, "ASPI");
  
  iOSVer = getOsVersion();
  if (iOSVer == OS_UNKNOWN)
    return -1;

  // check if aspi is available
  hDll = LoadLibrary("WNASPI32.DLL");
  GetASPI32SupportInfo = 
    (DWORD(*)(void))GetProcAddress(hDll, "GetASPI32SupportInfo");
  SendASPI32Command = 
    (DWORD(*)(LPSRB))GetProcAddress(hDll, "SendASPI32Command");

  // make sure that we've got both function addresses
  if (GetASPI32SupportInfo && SendASPI32Command) {
    interfaces[INTERFACE_ASPI].avail = TRUE;
  }
  
  bInit = TRUE;
  return 0;
}

/*
 * Returns the current OS system, one of OS_WIN95, OS_WIN98,
 * OS_WINNT35, OS_WINNT4, OS_WIN2K, or if an error occurs,
 * OS_UNKNOWN
 */
int getOsVersion(void) {
  OSVERSIONINFO os;
  
  ZeroMemory(&os, sizeof(os));
  os.dwOSVersionInfoSize = sizeof(os);
  GetVersionEx(&os);

  if (os.dwPlatformId == VER_PLATFORM_WIN32_NT) {
    if (os.dwMajorVersion == 3 && os.dwMinorVersion >= 50)
      return OS_WINNT35;
    else if (os.dwMajorVersion == 4)
      return OS_WINNT4;
    else if (os.dwMajorVersion == 5)
      return OS_WIN2K;
  }
  else if (os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
    if (os.dwMinorVersion == 0)
      return OS_WIN95;
    else
      return OS_WIN98;
  }
  
  return OS_UNKNOWN;  
}

unsigned long discid(int drive) {
	struct discdata* cd;
	int i, numTracks;
	unsigned long id;

	i = initTool();
	getNumDrives();
	ZeroMemory(&toc, sizeof(toc));
	readTOC(drive, &toc);

	if (!toc.firstTrack && !toc.lastTrack)
		numTracks = 0;
	else
		numTracks = (int)(toc.lastTrack - toc.firstTrack + 1);
  
	if (numTracks > 0) {
		// calculate the cddbId
		cd = genCddbQuery(&toc);
		id = cd->discid;
		free(cd);
	}
	return id;
}

struct discdata get_disc_id(int drive) {
	struct discdata* cd;
	struct discdata data;
	int i, numTracks;
	unsigned long id;

	i = initTool();
	getNumDrives();
	ZeroMemory(&toc, sizeof(toc));
	readTOC(drive, &toc);
	if (!toc.firstTrack && !toc.lastTrack) {
		static char foo[2048];
		numTracks = 0;
	}
	else
		numTracks = (int)(toc.lastTrack - toc.firstTrack + 1);
  
	if (numTracks > 0) {
		// calculate the cddbId
		cd = genCddbQuery(&toc);
	}

	free(cd);
	data = *cd;

	return data;
}

#endif //WIN32_H














( run in 0.632 second using v1.01-cache-2.11-cpan-39bf76dae61 )