// SoundAlert.cpp: implementation of the CSoundAlert class.
//
// (C) 2004 Neil Scales. All rights reserved.
// neil.scales@bigfoot.com
//
// If you use this class, please make sure you leave these
// comments at the top, so you don't claim your sweat created
// this code.
#include "stdafx.h"
#include "SoundAlert.h"
#pragma comment(lib, "winmm")
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSoundAlert::CSoundAlert()
{
m_hGroupKey = 0;
m_GroupName[0] = '\0';
}
CSoundAlert::~CSoundAlert()
{
if(m_hGroupKey)
RegCloseKey(m_hGroupKey);
}
bool CSoundAlert::CreateGroup(LPCTSTR szGroupName, LPCTSTR szTitle)
{
bool bSuccess = false;
do
{
lstrcpy(m_GroupName, szGroupName);
const DWORD samDesired = KEY_CREATE_SUB_KEY|KEY_SET_VALUE;
DWORD dwDisposition = 0;
TCHAR groupRegKey[512];
wsprintf(groupRegKey, _T("AppEvents\\Schemes\\Apps\\%s"), m_GroupName);
if(RegCreateKeyEx(HKEY_CURRENT_USER, groupRegKey, 0, NULL, REG_OPTION_NON_VOLATILE, samDesired, NULL, &m_hGroupKey, &dwDisposition)!=ERROR_SUCCESS)
break;
if(RegSetValueEx(m_hGroupKey, _T(""), 0, REG_SZ, (LPBYTE)szTitle, lstrlen(szTitle))!=ERROR_SUCCESS)
break;
RegCloseKey(m_hGroupKey);
if(OpenGroup(szGroupName)==false)
break;
bSuccess = true;
}while(false);
return bSuccess;
}
bool CSoundAlert::DeleteGroup(LPCTSTR szGroupName)
{
bool bSuccess = false;
do
{
CSoundAlert alert;
if(alert.OpenGroup(szGroupName)==false)
break;
if(alert.DeleteGroup()==false)
break;
bSuccess = true;
}while(false);
return bSuccess;
}
bool CSoundAlert::DeleteGroup()
{
return RegDeleteKey(m_hGroupKey, _T(""))==ERROR_SUCCESS;
}
bool CSoundAlert::OpenGroup(LPCTSTR szGroupName)
{
bool bSuccess = false;
do
{
lstrcpy(m_GroupName, szGroupName);
TCHAR groupRegKey[512];
wsprintf(groupRegKey, _T("AppEvents\\Schemes\\Apps\\%s"), m_GroupName);
const DWORD samDesired = KEY_EXECUTE;
DWORD dwDisposition = 0;
if(RegOpenKeyEx(HKEY_CURRENT_USER, groupRegKey, 0, samDesired, &m_hGroupKey)!=ERROR_SUCCESS)
break;
bSuccess = true;
}while(false);
return bSuccess;
}
bool CSoundAlert::Create(LPCTSTR szName, LPCTSTR szTitle, LPCTSTR szWavPath)
{
HKEY hKey;
bool bSuccess = false;
do
{
DWORD disposition;
TCHAR longName[512];
wsprintf(longName, _T("%s_%s"), m_GroupName, szName);
if(RegCreateKeyEx(m_hGroupKey, longName, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, &disposition)!=ERROR_SUCCESS)
break;
// Set (default) value
if(RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)szTitle, lstrlen(szTitle))!=ERROR_SUCCESS)
break;
HKEY hSubKey;
// Create .current subkey
if(RegCreateKeyEx(hKey, _T(".current"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hSubKey, &disposition)!=ERROR_SUCCESS)
break;
// Set (default) value
if(RegSetValueEx(hSubKey, _T(""), 0, REG_EXPAND_SZ, (LPBYTE)szWavPath, lstrlen(szWavPath))!=ERROR_SUCCESS)
break;
if(RegCloseKey(hSubKey)!=ERROR_SUCCESS)
break;
// Create .default subkey
if(RegCreateKeyEx(hKey, _T(".default"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hSubKey, &disposition)!=ERROR_SUCCESS)
break;
// Set (default) value
if(RegSetValueEx(hSubKey, _T(""), 0, REG_EXPAND_SZ, (LPBYTE)szWavPath, lstrlen(szWavPath))!=ERROR_SUCCESS)
break;
if(RegCloseKey(hSubKey)!=ERROR_SUCCESS)
break;
TCHAR eventLabel[512];
wsprintf(eventLabel, _T("AppEvents\\EventLabels\\%s_%s"), m_GroupName, szName);
// Create .current subkey
if(RegCreateKeyEx(HKEY_CURRENT_USER, eventLabel, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hSubKey, &disposition)!=ERROR_SUCCESS)
break;
// Set (default) value
if(RegSetValueEx(hSubKey, _T(""), 0, REG_SZ, (LPBYTE)szTitle, lstrlen(szTitle))!=ERROR_SUCCESS)
break;
if(RegCloseKey(hSubKey)!=ERROR_SUCCESS)
break;
bSuccess = true;
}while(false);
return bSuccess;
}
bool CSoundAlert::Delete(LPCTSTR szName)
{
bool bSuccess = false;
do
{
TCHAR tmp[512];
// Delete event label key
wsprintf(tmp, _T("AppEvents\\EventLabels\\%s_%s"), m_GroupName, szName);
if(RegDeleteKey(HKEY_CURRENT_USER, tmp)!=ERROR_SUCCESS)
break;
// Delete .current key
wsprintf(tmp, _T("%s\\.current"), szName);
if(RegDeleteKey(m_hGroupKey, tmp)!=ERROR_SUCCESS)
break;
// Delete .default key
wsprintf(tmp, _T("%s\\.default"), szName);
if(RegDeleteKey(m_hGroupKey, tmp)!=ERROR_SUCCESS)
break;
// Delete scheme app key
if(RegDeleteKey(m_hGroupKey, szName)!=ERROR_SUCCESS)
break;
bSuccess = true;
}while(false);
return bSuccess;
}
bool CSoundAlert::Play(LPCTSTR szName, DWORD dwOptions)
{
TCHAR longName[512];
wsprintf(longName, _T("%s_%s"), m_GroupName, szName);
dwOptions |= SND_APPLICATION|SND_ALIAS;
return PlaySound(longName, NULL, dwOptions)==TRUE;
}