590 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			590 lines
		
	
	
	
		
			17 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/******************************************************************
 | 
						|
* $Id$
 | 
						|
*
 | 
						|
* $Log$
 | 
						|
*
 | 
						|
* Copyright © 2005 David Cullen, All rights reserved
 | 
						|
*
 | 
						|
******************************************************************/
 | 
						|
#include "stdafx.h"
 | 
						|
#include "xchat-plugin.h"
 | 
						|
#include <windows.h>
 | 
						|
#include <tchar.h>
 | 
						|
#include "wmpa.h"
 | 
						|
#include "WMPADialog.h"
 | 
						|
 | 
						|
#define XMMS_SESSION 0
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* Globalss
 | 
						|
******************************************************************/
 | 
						|
xchat_plugin *ph = NULL;
 | 
						|
CWMPPlayer4 *wmp;
 | 
						|
static const char subKey[] = "Software\\FlowerSoft\\WMPA";
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* xchat_plugin_init
 | 
						|
******************************************************************/
 | 
						|
int xchat_plugin_init(xchat_plugin *plugin_handle,
 | 
						|
                      char **plugin_name,
 | 
						|
                      char **plugin_desc,
 | 
						|
                      char **plugin_version,
 | 
						|
                      char *arg)
 | 
						|
{
 | 
						|
   BOOL success;
 | 
						|
 | 
						|
   ph = plugin_handle;
 | 
						|
 | 
						|
   *plugin_name = "WMPA";
 | 
						|
   *plugin_desc = "Announce the current song from Windows Media Player.";
 | 
						|
   *plugin_version = VER_STRING;
 | 
						|
 | 
						|
   // Show the song browser
 | 
						|
   success = StartWindowsMediaPlayer();
 | 
						|
   if (!success) {
 | 
						|
      xchat_printf(ph, "WMPA: Failed to show the song browser.");
 | 
						|
      xchat_printf(ph, "WMPA: Could not load plug-in version %s.", VER_STRING);
 | 
						|
      return(E_FAIL);
 | 
						|
   }
 | 
						|
 | 
						|
   // Get a pointer to the Windows Media Player control
 | 
						|
   wmp = GetWindowsMediaPlayer();
 | 
						|
   if (wmp == NULL) {
 | 
						|
      xchat_printf(ph, "WMPA: Failed to get a pointer to the Windows Media Player interface.");
 | 
						|
      xchat_printf(ph, "WMPA: Could not load plug-in version %s.", VER_STRING);
 | 
						|
      return(E_POINTER);
 | 
						|
   }
 | 
						|
 | 
						|
   // Restore the settings (need wmp first)
 | 
						|
   success = wmpaRestoreSettings();
 | 
						|
   if (!success) {
 | 
						|
      xchat_printf(ph, "WMPA: Failed to restore the settings.");
 | 
						|
   }
 | 
						|
 | 
						|
   xchat_hook_command(ph, "auto", XCHAT_PRI_NORM, wmpaAuto, 0, 0);
 | 
						|
   xchat_hook_command(ph, "curr", XCHAT_PRI_NORM, wmpaCurr, 0, 0);
 | 
						|
   xchat_hook_command(ph, "find", XCHAT_PRI_NORM, wmpaFind, 0, 0);
 | 
						|
   xchat_hook_command(ph, "slist", XCHAT_PRI_NORM, wmpaList, 0, 0);
 | 
						|
   xchat_hook_command(ph, "next", XCHAT_PRI_NORM, wmpaNext, 0, 0);
 | 
						|
   xchat_hook_command(ph, "play", XCHAT_PRI_NORM, wmpaPlay, 0, 0);
 | 
						|
   xchat_hook_command(ph, "pause", XCHAT_PRI_NORM, wmpaPause, 0, 0);
 | 
						|
   xchat_hook_command(ph, "prev", XCHAT_PRI_NORM, wmpaPrev, 0, 0);
 | 
						|
   xchat_hook_command(ph, "song", XCHAT_PRI_NORM, wmpaSong, 0, 0);
 | 
						|
   xchat_hook_command(ph, "stop", XCHAT_PRI_NORM, wmpaStop, 0, 0);
 | 
						|
   xchat_hook_command(ph, "volume", XCHAT_PRI_NORM, wmpaVolume, 0, 0);
 | 
						|
   xchat_hook_command(ph, "wmpahelp", XCHAT_PRI_NORM, wmpaHelp, 0, 0);
 | 
						|
 | 
						|
   xchat_printf(ph, "WMPA %s successfully loaded.", VER_STRING);
 | 
						|
   wmpaCommands();
 | 
						|
   xchat_printf(ph, "WMPA: e-mail me if you find any bugs: dcullen@intergate.com");
 | 
						|
 | 
						|
   return 1;
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* xchat_plugin_deinit
 | 
						|
******************************************************************/
 | 
						|
int xchat_plugin_deinit(void)
 | 
						|
{
 | 
						|
   BOOL success;
 | 
						|
 | 
						|
   xchat_printf(ph, "WMPA %s is unloading.", VER_STRING);
 | 
						|
 | 
						|
   // Save the settings
 | 
						|
   success = wmpaSaveSettings();
 | 
						|
   if (!success) {
 | 
						|
      xchat_printf(ph, "WMPA: Failed to save the settings.");
 | 
						|
   }
 | 
						|
 | 
						|
   wmp = NULL;
 | 
						|
 | 
						|
   BOOL result = StopWindowsMediaPlayer();
 | 
						|
   if (!result) {
 | 
						|
      xchat_printf(ph, "WMPA could not shut down Windows Media Player.");
 | 
						|
   }
 | 
						|
 | 
						|
   xchat_printf(ph, "WMPA %s has unloaded.", VER_STRING);
 | 
						|
   return 1;
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* xchat_plugin_get_info
 | 
						|
******************************************************************/
 | 
						|
void xchat_plugin_get_info(char **name, char **desc, char **version, void **reserved)
 | 
						|
{
 | 
						|
   *name = "WMPA";
 | 
						|
   *desc = "Announce the current song from Windows Media Player.";
 | 
						|
   *version = VER_STRING;
 | 
						|
   if (reserved) *reserved = NULL;
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaCommands
 | 
						|
******************************************************************/
 | 
						|
void wmpaCommands(void)
 | 
						|
{
 | 
						|
   xchat_printf(ph, "WMPA: /auto [on/off]   : Turn on/off auto announce of the current song or display the current setting");
 | 
						|
   xchat_printf(ph, "WMPA: /curr            : Tell what song is currently playing");
 | 
						|
   xchat_printf(ph, "WMPA: /find [word]     : Find songs with \"word\" in their title, create a new playlist, and play it");
 | 
						|
   xchat_printf(ph, "WMPA: /slist [word]    : List songs with \"word\" in their title");
 | 
						|
   xchat_printf(ph, "WMPA: /next            : Play the next song");
 | 
						|
   xchat_printf(ph, "WMPA: /play            : Play the current song");
 | 
						|
   xchat_printf(ph, "WMPA: /pause           : Pause the current song");
 | 
						|
   xchat_printf(ph, "WMPA: /prev            : Play the previous song");
 | 
						|
   xchat_printf(ph, "WMPA: /song            : Announce the current song from Windows Media Player in xchat");
 | 
						|
   xchat_printf(ph, "WMPA: /stop            : Stop the current song");
 | 
						|
   xchat_printf(ph, "WMPA: /volume [volume] : Set the volume (0 to 100) or display the current volume");
 | 
						|
   xchat_printf(ph, "WMPA: /wmpahelp        : Display this help.");
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaAuto
 | 
						|
******************************************************************/
 | 
						|
int wmpaAuto(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   CWMPADialog *pDialog;
 | 
						|
   char *state;
 | 
						|
 | 
						|
   pDialog = GetWMPADialog();
 | 
						|
   if (pDialog == NULL) return(XCHAT_EAT_ALL);
 | 
						|
 | 
						|
   if (CString(word[2]).IsEmpty()) {
 | 
						|
      if (pDialog->autoAnnounce) {
 | 
						|
         state = "on";
 | 
						|
      }
 | 
						|
      else {
 | 
						|
         state = "off";
 | 
						|
      }
 | 
						|
   }
 | 
						|
   else {
 | 
						|
      state = word[2];
 | 
						|
      if (CString(state) == "on") {
 | 
						|
         pDialog->autoAnnounce = TRUE;
 | 
						|
      }
 | 
						|
      if (CString(state) == "off") {
 | 
						|
         pDialog->autoAnnounce = FALSE;
 | 
						|
      }
 | 
						|
      wmpaSaveSettings();
 | 
						|
   }
 | 
						|
 | 
						|
   xchat_printf(ph, "WMPA: auto is %s", state);
 | 
						|
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaCurr
 | 
						|
******************************************************************/
 | 
						|
int wmpaCurr(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   xchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
 | 
						|
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaFind
 | 
						|
******************************************************************/
 | 
						|
int wmpaFind(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   long index;
 | 
						|
   long count;
 | 
						|
   long found;
 | 
						|
 | 
						|
   if (wmp != NULL) {
 | 
						|
      CWMPMediaCollection mc = wmp->GetMediaCollection();
 | 
						|
      CWMPPlaylist all = mc.getAll();
 | 
						|
      CWMPPlaylistCollection pc = wmp->GetPlaylistCollection();
 | 
						|
      CWMPPlaylistArray pa = pc.getAll();
 | 
						|
      CWMPPlaylist playlist;
 | 
						|
      CWMPMedia media;
 | 
						|
 | 
						|
      for (index = 0; index < pc.getAll().GetCount(); index++) {
 | 
						|
         if (pc.getAll().Item(index).GetName() == CString(word_eol[2])) {
 | 
						|
            playlist = pc.getAll().Item(index);
 | 
						|
            pc.remove(playlist);
 | 
						|
         }
 | 
						|
      }
 | 
						|
 | 
						|
      playlist = pc.newPlaylist(word_eol[2]);
 | 
						|
 | 
						|
      count = all.GetCount();
 | 
						|
      found = 0;
 | 
						|
      for (index = 0; index < count; index++) {
 | 
						|
         media = all.GetItem(index);
 | 
						|
         CString artist = media.getItemInfo("Artist");
 | 
						|
         CString title  = media.getItemInfo("Title");
 | 
						|
         CString album  = media.getItemInfo("Album");
 | 
						|
         if ( (artist.Find(word_eol[2]) != -1) ||
 | 
						|
              (title.Find(word_eol[2])  != -1) ||
 | 
						|
              (album.Find(word_eol[2])  != -1) ) {
 | 
						|
            playlist.appendItem(media);
 | 
						|
            found++;
 | 
						|
         }
 | 
						|
      }
 | 
						|
 | 
						|
      if (found > 0) {
 | 
						|
         xchat_printf(ph, "WMPA: Found %d songs with \"%s\" in them", found, word_eol[2]);
 | 
						|
         wmp->SetCurrentPlaylist(playlist);
 | 
						|
         wmp->GetControls().play();
 | 
						|
         xchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
 | 
						|
 | 
						|
         CWMPADialog *dialog = GetWMPADialog();
 | 
						|
         if (dialog != NULL) {
 | 
						|
            dialog->UpdateSongList();
 | 
						|
            dialog->SelectCurrentSong();
 | 
						|
            dialog->UpdatePlayLists();
 | 
						|
         }
 | 
						|
 | 
						|
      }
 | 
						|
      else {
 | 
						|
         xchat_printf(ph, "WMPA: Could not find %s", word_eol[2]);
 | 
						|
      }
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaList
 | 
						|
******************************************************************/
 | 
						|
int wmpaList(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   long index;
 | 
						|
   long count;
 | 
						|
   long found;
 | 
						|
 | 
						|
   if (wmp != NULL) {
 | 
						|
      xchat_printf(ph, "WMPA: Listing songs with \"%s\" in them", word_eol[2]);
 | 
						|
 | 
						|
      CWMPMediaCollection mc = wmp->GetMediaCollection();
 | 
						|
      CWMPPlaylist all = mc.getAll();
 | 
						|
      CWMPMedia media;
 | 
						|
 | 
						|
      count = all.GetCount();
 | 
						|
      found = 0;
 | 
						|
      for (index = 0; index < count; index++) {
 | 
						|
         media = all.GetItem(index);
 | 
						|
         CString artist = media.getItemInfo("Artist");
 | 
						|
         CString title  = media.getItemInfo("Title");
 | 
						|
         CString album  = media.getItemInfo("Album");
 | 
						|
         if ( (artist.Find(word_eol[2]) != -1) ||
 | 
						|
              (title.Find(word_eol[2])  != -1) ||
 | 
						|
              (album.Find(word_eol[2])  != -1) ) {
 | 
						|
            xchat_printf(ph, "WMPA: Found \"%s - %s (%s)\"", artist, title, album);
 | 
						|
            found++;
 | 
						|
         }
 | 
						|
      }
 | 
						|
 | 
						|
      if (found > 0) {
 | 
						|
         if (found == 1)
 | 
						|
            xchat_printf(ph, "WMPA: Found %d song with \"%s\" in it", found, word_eol[2]);
 | 
						|
         else
 | 
						|
            xchat_printf(ph, "WMPA: Found %d songs with \"%s\" in them", found, word_eol[2]);
 | 
						|
      }
 | 
						|
      else {
 | 
						|
         xchat_printf(ph, "WMPA: Could not find any songs with \"%s\" in them", word_eol[2]);
 | 
						|
      }
 | 
						|
 | 
						|
   }
 | 
						|
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaNext
 | 
						|
******************************************************************/
 | 
						|
int wmpaNext(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   if (wmp != NULL) {
 | 
						|
      wmp->GetControls().next();
 | 
						|
      xchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
 | 
						|
   }
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaPlay
 | 
						|
******************************************************************/
 | 
						|
int wmpaPlay(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   if (wmp != NULL) {
 | 
						|
      wmp->GetControls().play();
 | 
						|
      xchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
 | 
						|
   }
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaPause
 | 
						|
******************************************************************/
 | 
						|
int wmpaPause(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   if (wmp != NULL) {
 | 
						|
      wmp->GetControls().pause();
 | 
						|
      xchat_printf(ph, "WMPA: Pausing %s", (LPCTSTR) wmpaGetSongTitle());
 | 
						|
   }
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaPrev
 | 
						|
******************************************************************/
 | 
						|
int wmpaPrev(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   if (wmp != NULL) {
 | 
						|
      wmp->GetControls().previous();
 | 
						|
      xchat_printf(ph, "WMPA: Playing %s", (LPCTSTR) wmpaGetSongTitle());
 | 
						|
   }
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaSong
 | 
						|
******************************************************************/
 | 
						|
int wmpaSong(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   CString songTitle = wmpaGetSongTitle();
 | 
						|
 | 
						|
   xchat_commandf(ph, "me is playing %s", (LPCTSTR) songTitle);
 | 
						|
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaStop
 | 
						|
******************************************************************/
 | 
						|
int wmpaStop(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   if (wmp != NULL) {
 | 
						|
      wmp->GetControls().stop();
 | 
						|
      xchat_printf(ph, "WMPA: Stopping %s", (LPCTSTR) wmpaGetSongTitle());
 | 
						|
   }
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaHelp
 | 
						|
******************************************************************/
 | 
						|
int wmpaHelp(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   xchat_printf(ph, "\n");
 | 
						|
   xchat_printf(ph, "WMPA %s Help", VER_STRING);
 | 
						|
   wmpaCommands();
 | 
						|
   xchat_printf(ph, "\n");
 | 
						|
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaVolume
 | 
						|
******************************************************************/
 | 
						|
int wmpaVolume(char *word[], char *word_eol[], void *user_data)
 | 
						|
{
 | 
						|
   char *endPtr;
 | 
						|
   long volume;
 | 
						|
 | 
						|
   if (CString(word[2]).IsEmpty()) {
 | 
						|
      volume = wmp->GetSettings().GetVolume();
 | 
						|
   }
 | 
						|
   else {
 | 
						|
      volume = strtol(word[2], &endPtr, 10);
 | 
						|
 | 
						|
      if ((wmp != NULL) && (volume >= 0) && (volume <= 100)) {
 | 
						|
         wmp->GetSettings().SetVolume(volume);
 | 
						|
         wmpaSaveSettings();
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   xchat_printf(ph, "WMPA: volume is %d", volume);
 | 
						|
 | 
						|
   return(XCHAT_EAT_ALL);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaRestoreSettings
 | 
						|
******************************************************************/
 | 
						|
BOOL wmpaRestoreSettings(void)
 | 
						|
{
 | 
						|
   CWMPADialog *pDialog;
 | 
						|
   DWORD type;
 | 
						|
   int volume;
 | 
						|
   BOOL autoAnnounce;
 | 
						|
   DWORD size;
 | 
						|
   BOOL result;
 | 
						|
 | 
						|
   if (wmp == NULL) return(FALSE);
 | 
						|
 | 
						|
   volume = 50;
 | 
						|
   result = GetSetting("Volume", &type, (LPBYTE) &volume, &size);
 | 
						|
   wmp->GetSettings().SetVolume(volume);
 | 
						|
 | 
						|
   autoAnnounce = FALSE;
 | 
						|
   pDialog = GetWMPADialog();
 | 
						|
   if (pDialog != NULL) {
 | 
						|
      result = result && GetSetting("Auto", &type, (LPBYTE) &autoAnnounce, &size);
 | 
						|
      pDialog->autoAnnounce = autoAnnounce;
 | 
						|
   }
 | 
						|
   else {
 | 
						|
      result = FALSE;
 | 
						|
   }
 | 
						|
 | 
						|
   return(result);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaSaveSettings
 | 
						|
******************************************************************/
 | 
						|
BOOL wmpaSaveSettings(void)
 | 
						|
{
 | 
						|
   CWMPADialog *pDialog;
 | 
						|
   int volume;
 | 
						|
   BOOL autoAnnounce;
 | 
						|
   BOOL result;
 | 
						|
 | 
						|
   if (wmp == NULL) return(FALSE);
 | 
						|
 | 
						|
   volume = wmp->GetSettings().GetVolume();
 | 
						|
   result = SaveSetting("Volume", REG_DWORD, (CONST BYTE *) &volume, sizeof(volume));
 | 
						|
 | 
						|
   pDialog = GetWMPADialog();
 | 
						|
   if (pDialog != NULL) {
 | 
						|
      autoAnnounce = pDialog->autoAnnounce;
 | 
						|
      result = result && SaveSetting("Auto", REG_DWORD, (CONST BYTE *) &autoAnnounce, sizeof(autoAnnounce));
 | 
						|
   }
 | 
						|
   else {
 | 
						|
      result = FALSE;
 | 
						|
   }
 | 
						|
 | 
						|
   return(result);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* wmpaGetSongTitle
 | 
						|
******************************************************************/
 | 
						|
CString wmpaGetSongTitle(void)
 | 
						|
{
 | 
						|
   char buffer[32];
 | 
						|
 | 
						|
   if (wmp == NULL) return(CString());
 | 
						|
 | 
						|
   CWMPMedia media      = wmp->GetCurrentMedia();
 | 
						|
   if (media == NULL) {
 | 
						|
      xchat_printf(ph, "WMPA: Could not get current media");
 | 
						|
      return(XCHAT_EAT_ALL);
 | 
						|
   }
 | 
						|
 | 
						|
   CString artist       = media.getItemInfo("Artist");
 | 
						|
   CString title        = media.getItemInfo("Title");
 | 
						|
   CString album        = media.getItemInfo("Album");
 | 
						|
   CString bitrate      = media.getItemInfo("Bitrate");
 | 
						|
   CString duration     = media.GetDurationString();
 | 
						|
 | 
						|
   long krate = strtoul((LPCTSTR) bitrate, NULL, 10) / 1000;
 | 
						|
   _ultoa(krate, buffer, 10);
 | 
						|
   bitrate = CString(buffer);
 | 
						|
 | 
						|
   // Creatte the song title
 | 
						|
   CString songTitle("");
 | 
						|
   songTitle += artist;
 | 
						|
   if (songTitle.IsEmpty()) songTitle += "Various";
 | 
						|
   songTitle += " - ";
 | 
						|
   songTitle += title;
 | 
						|
   songTitle += " (";
 | 
						|
   songTitle += album;
 | 
						|
   songTitle += ") [";
 | 
						|
   songTitle += duration;
 | 
						|
   songTitle += "/";
 | 
						|
   songTitle += bitrate;
 | 
						|
   songTitle += "Kbps]";
 | 
						|
 | 
						|
   return(songTitle);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* SaveSetting
 | 
						|
******************************************************************/
 | 
						|
BOOL SaveSetting(LPCTSTR name, DWORD type, CONST BYTE *value, DWORD size)
 | 
						|
{
 | 
						|
   HKEY hKey;
 | 
						|
   DWORD disposition;
 | 
						|
   LONG result;
 | 
						|
 | 
						|
   if (wmp == NULL) return(FALSE);
 | 
						|
   if (name == NULL) return(FALSE);
 | 
						|
 | 
						|
   result = RegOpenKeyEx(HKEY_CURRENT_USER,
 | 
						|
                         subKey,
 | 
						|
                         0,
 | 
						|
                         KEY_WRITE,
 | 
						|
                         &hKey);
 | 
						|
 | 
						|
   if (result != ERROR_SUCCESS) {
 | 
						|
      result = RegCreateKeyEx(HKEY_CURRENT_USER,
 | 
						|
                              subKey,
 | 
						|
                              0,
 | 
						|
                              NULL,
 | 
						|
                              REG_OPTION_NON_VOLATILE,
 | 
						|
                              KEY_WRITE,
 | 
						|
                              NULL,
 | 
						|
                              &hKey,
 | 
						|
                              &disposition);
 | 
						|
 | 
						|
      if (result != ERROR_SUCCESS) return(FALSE);
 | 
						|
   }
 | 
						|
 | 
						|
   result = RegSetValueEx(hKey,
 | 
						|
                          name,
 | 
						|
                          0,
 | 
						|
                          type,
 | 
						|
                          value,
 | 
						|
                          size);
 | 
						|
 | 
						|
   if (result == ERROR_SUCCESS) {
 | 
						|
      RegCloseKey(hKey);
 | 
						|
      return(TRUE);
 | 
						|
   }
 | 
						|
 | 
						|
   RegCloseKey(hKey);
 | 
						|
   return(FALSE);
 | 
						|
}
 | 
						|
 | 
						|
/******************************************************************
 | 
						|
* GetSetting
 | 
						|
******************************************************************/
 | 
						|
BOOL GetSetting(LPCTSTR name, DWORD *type, LPBYTE value, DWORD *size)
 | 
						|
{
 | 
						|
   HKEY hKey;
 | 
						|
   LONG result;
 | 
						|
 | 
						|
   if (wmp == NULL) return(FALSE);
 | 
						|
   if (type == NULL) return(FALSE);
 | 
						|
   if (value == NULL) return(FALSE);
 | 
						|
   if (size == NULL) return(FALSE);
 | 
						|
 | 
						|
   result = RegOpenKeyEx(HKEY_CURRENT_USER,
 | 
						|
                         subKey,
 | 
						|
                         0,
 | 
						|
                         KEY_READ,
 | 
						|
                         &hKey);
 | 
						|
 | 
						|
   if (result != ERROR_SUCCESS) return(FALSE);
 | 
						|
 | 
						|
   result = RegQueryValueEx(hKey,
 | 
						|
                            name,
 | 
						|
                            0,
 | 
						|
                            type,
 | 
						|
                            value,
 | 
						|
                            size);
 | 
						|
 | 
						|
   RegCloseKey(hKey);
 | 
						|
 | 
						|
   if (result == ERROR_SUCCESS) {
 | 
						|
      return(TRUE);
 | 
						|
   }
 | 
						|
 | 
						|
   RegCloseKey(hKey);
 | 
						|
   return(FALSE);
 | 
						|
}
 | 
						|
 |