summaryrefslogtreecommitdiff
path: root/plugins/!NotAdopted/WinterSpeak/speak/config
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/!NotAdopted/WinterSpeak/speak/config')
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/config_database.cpp174
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/config_database.h91
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.cpp234
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.h56
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.cpp289
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.h59
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.cpp170
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.h59
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.cpp91
-rw-r--r--plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.h48
10 files changed, 1271 insertions, 0 deletions
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/config_database.cpp b/plugins/!NotAdopted/WinterSpeak/speak/config/config_database.cpp
new file mode 100644
index 0000000000..d634e44824
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/config_database.cpp
@@ -0,0 +1,174 @@
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#pragma warning(disable:4786)
+
+#include "config_database.h"
+
+#include "speak.h"
+
+#include <general/debug/debug.h>
+
+//------------------------------------------------------------------------------
+namespace
+{
+ const char *SPEAK = "speak_config";
+ const char *ACTIVE_FLAGS = "active_flags";
+ const char *ACTIVE_STATE = "active_state";
+ const char *WELCOME_MSG = "welcome_msg";
+ const char *ENGINE = "engine";
+ const char *VOICE = "voice";
+ const char *VOLUME = "volume";
+ const char *RATE = "rate";
+ const char *PITCH = "pitch";
+}
+
+//------------------------------------------------------------------------------
+// public:
+//------------------------------------------------------------------------------
+ConfigDatabase::ConfigDatabase()
+ :
+ m_voice_desc(),
+ m_active_flags(0),
+ m_welcome_msg(""),
+ m_active_users()
+{
+ CLASSCERR("ConfigDatabase::ConfigDatabase");
+
+ // load the database from miranda
+ load();
+}
+
+//------------------------------------------------------------------------------
+ConfigDatabase::~ConfigDatabase()
+{
+ CLASSCERR("ConfigDatabase::~ConfigDatabase");
+}
+
+//------------------------------------------------------------------------------
+bool
+ConfigDatabase::getActiveFlag(ActiveFlag flag) const
+{
+ return ((m_active_flags & (1 << flag)) != 0);
+}
+
+//------------------------------------------------------------------------------
+void
+ConfigDatabase::setActiveFlag(ActiveFlag flag, bool state)
+{
+ if (state)
+ {
+ m_active_flags |= (1 << flag);
+ }
+ else
+ {
+ m_active_flags &= ~(1 << flag);
+ }
+}
+
+//------------------------------------------------------------------------------
+bool
+ConfigDatabase::getActiveUser(HANDLE user) const
+{
+ ActiveUsersMap::const_iterator iter = m_active_users.find(user);
+
+ if (iter == m_active_users.end())
+ {
+ // get the unknown user status
+ iter = m_active_users.find(0);
+
+ if (iter == m_active_users.end())
+ {
+ CLASSCERR("ConfigDatabase::getActiveUser user error");
+ return false;
+ }
+ }
+
+ return iter->second;
+}
+
+//------------------------------------------------------------------------------
+void
+ConfigDatabase::setActiveUser(HANDLE user, bool state)
+{
+ m_active_users[user] = state;
+}
+
+//------------------------------------------------------------------------------
+void
+ConfigDatabase::load()
+{
+ CLASSCERR("ConfigDatabase::load");
+
+ m_voice_desc.engine = DBGetContactSettingString(SPEAK, ENGINE, "");
+ m_voice_desc.voice = DBGetContactSettingString(SPEAK, VOICE, "");
+ m_voice_desc.volume = DBGetContactSettingDword(NULL, SPEAK, VOLUME, 50);
+ m_voice_desc.pitch = DBGetContactSettingDword(NULL, SPEAK, PITCH, 50);
+ m_voice_desc.rate = DBGetContactSettingDword(NULL, SPEAK, RATE, 50);
+
+ m_active_flags = DBGetContactSettingDword(NULL, SPEAK, ACTIVE_FLAGS, 0xffff);
+
+ m_welcome_msg = DBGetContactSettingString(SPEAK, WELCOME_MSG,
+ "welcome to i c q");
+
+ // iterate through all the users and add them to the list if active
+ HANDLE contact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
+
+ while (NULL != contact)
+ {
+ m_active_users[contact]
+ = DBGetContactSettingByte(contact, SPEAK, ACTIVE_STATE, true);
+
+ contact = (HANDLE)CallService(MS_DB_CONTACT_FINDNEXT, (WPARAM)contact, 0);
+ }
+
+ // load unknown users setting
+ m_active_users[0] = DBGetContactSettingByte(NULL, SPEAK, ACTIVE_STATE, true);
+}
+
+//------------------------------------------------------------------------------
+void
+ConfigDatabase::save()
+{
+ CLASSCERR("ConfigDatabase::save");
+
+ DBWriteContactSettingString(NULL, SPEAK, ENGINE, m_voice_desc.engine.c_str());
+ DBWriteContactSettingString(NULL, SPEAK, VOICE, m_voice_desc.voice.c_str());
+ DBWriteContactSettingDword(NULL, SPEAK, VOLUME, m_voice_desc.volume);
+ DBWriteContactSettingDword(NULL, SPEAK, PITCH, m_voice_desc.pitch);
+ DBWriteContactSettingDword(NULL, SPEAK, RATE, m_voice_desc.rate);
+
+ DBWriteContactSettingDword(NULL, SPEAK, ACTIVE_FLAGS, m_active_flags);
+
+ DBWriteContactSettingString(NULL, SPEAK, WELCOME_MSG, m_welcome_msg.c_str());
+
+ for (ActiveUsersMap::iterator i = m_active_users.begin();
+ i != m_active_users.end(); ++i)
+ {
+ DBWriteContactSettingByte(i->first, SPEAK, ACTIVE_STATE, i->second);
+ }
+
+ // notify the subjects that things have changed
+ notify();
+}
+
+//------------------------------------------------------------------------------
+// private:
+//------------------------------------------------------------------------------
+std::string
+ConfigDatabase::DBGetContactSettingString(const char *szModule,
+ const char *szSetting, const char *def)
+{
+ std::string ret = def;
+ DBVARIANT dbv;
+
+ if (!DBGetContactSetting(NULL, szModule, szSetting, &dbv))
+ {
+ ret = dbv.pszVal;
+ }
+
+ return ret;
+}
+
+//==============================================================================
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/config_database.h b/plugins/!NotAdopted/WinterSpeak/speak/config/config_database.h
new file mode 100644
index 0000000000..716745a3ce
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/config_database.h
@@ -0,0 +1,91 @@
+#ifndef guard_speak_config_config_database_h
+#define guard_speak_config_config_database_h
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#include "defs/voice_desc.h"
+
+#include <general/observer/subject.h>
+
+#include <windows.h>
+#include <string>
+#include <map>
+
+class ConfigDatabase : public Subject
+{
+ public:
+ ConfigDatabase();
+ ~ConfigDatabase();
+
+ enum ActiveFlag
+ {
+ ActiveFlag_Online = 1,
+ ActiveFlag_Away,
+ ActiveFlag_Dnd,
+ ActiveFlag_Na,
+ ActiveFlag_Occupied,
+ ActiveFlag_FreeForChat,
+ ActiveFlag_Invisible
+ };
+
+ typedef std::map<HANDLE, bool> ActiveUsersMap;
+
+ //--------------------------------------------------------------------------
+ // Description : get/set the voice description
+ //--------------------------------------------------------------------------
+ VoiceDesc getVoiceDesc() const { return m_voice_desc; }
+ void setVoiceDesc(const VoiceDesc &desc) { m_voice_desc = desc; }
+
+ //--------------------------------------------------------------------------
+ // Description : get/set the welcome message
+ //--------------------------------------------------------------------------
+ const std::string & getWelcomeMessage() const { return m_welcome_msg; }
+ void setWelcomeMessage(const std::string &msg) { m_welcome_msg = msg; }
+
+ //--------------------------------------------------------------------------
+ // Description : get/set an status flags
+ //--------------------------------------------------------------------------
+ bool getActiveFlag(ActiveFlag flag) const;
+ void setActiveFlag(ActiveFlag flag, bool state);
+
+ //--------------------------------------------------------------------------
+ // Description : get/set the user active flag
+ //--------------------------------------------------------------------------
+ bool getActiveUser(HANDLE user) const;
+ void setActiveUser(HANDLE user, bool state);
+ ActiveUsersMap getActiveUsers() const { return m_active_users; }
+
+ //--------------------------------------------------------------------------
+ // Description : load/save the settings from the miranda database
+ //--------------------------------------------------------------------------
+ void load();
+ void save();
+
+ private:
+ //--------------------------------------------------------------------------
+ // Description : For some reason this isn't implemented in miranda yet
+ // Just get a string from the db
+ // Parameters : szModule - the entrys' module
+ // szSetting - the entrys' setting
+ // def - default string if entry doesn't exist
+ //--------------------------------------------------------------------------
+ static std::string DBGetContactSettingString(const char *szModule,
+ const char *szSetting, const char *def);
+
+ VoiceDesc m_voice_desc;
+ unsigned int m_active_flags;
+ std::string m_welcome_msg;
+ ActiveUsersMap m_active_users;
+};
+
+//==============================================================================
+//
+// Summary : encapsulate the access to the miranda database
+//
+// Description : Provide a subject that allows clients to know when changes
+// are made to the miranda database.
+//
+//==============================================================================
+
+#endif \ No newline at end of file
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.cpp b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.cpp
new file mode 100644
index 0000000000..9d261adc24
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.cpp
@@ -0,0 +1,234 @@
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#pragma warning(disable:4786)
+
+#include "dialog_config_active.h"
+
+#include "speak.h"
+#include "resource.h"
+
+#include <general/debug/debug.h>
+
+#include <windows.h>
+#include <commctrl.h>
+
+//------------------------------------------------------------------------------
+DialogConfigActive *DialogConfigActive::m_instance = 0;
+
+//------------------------------------------------------------------------------
+// public:
+//------------------------------------------------------------------------------
+DialogConfigActive::DialogConfigActive(ConfigDatabase &db)
+ :
+ m_db(db)
+{
+ CLASSCERR("DialogConfigActive::DialogConfigActive");
+
+ m_instance = this;
+}
+
+//------------------------------------------------------------------------------
+DialogConfigActive::~DialogConfigActive()
+{
+ CLASSCERR("DialogConfigActive::~DialogConfigActive");
+
+ m_instance = 0;
+}
+
+//------------------------------------------------------------------------------
+int CALLBACK
+DialogConfigActive::process(HWND window, UINT message, WPARAM wparam,
+ LPARAM lparam)
+{
+ if (!m_instance)
+ {
+ return 1;
+ }
+
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ m_instance->load(window);
+ break;
+
+ case WM_NOTIFY:
+ switch (reinterpret_cast<LPNMHDR>(lparam)->code)
+ {
+ case PSN_APPLY:
+ m_instance->save(window);
+ break;
+
+ case LVN_ITEMCHANGED:
+ m_instance->changed(window);
+ break;
+ }
+ break;
+
+ case WM_COMMAND:
+ switch (LOWORD(wparam))
+ {
+ case IDC_ACTIVE_OFFLINE:
+ case IDC_ACTIVE_ONLINE:
+ case IDC_ACTIVE_AWAY:
+ case IDC_ACTIVE_DND:
+ case IDC_ACTIVE_NA:
+ case IDC_ACTIVE_OCCUPIED:
+ case IDC_ACTIVE_FREEFORCHAT:
+ case IDC_ACTIVE_INVISIBLE:
+ m_instance->changed(window);
+ break;
+
+ case IDC_ACTIVE_ALL:
+ m_instance->selectAllUsers(window, true);
+ break;
+
+ case IDC_ACTIVE_NONE:
+ m_instance->selectAllUsers(window, false);
+ break;
+
+ case IDC_ACTIVE_USERS:
+ m_instance->changed(window);
+ break;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+// private:
+//------------------------------------------------------------------------------
+void
+DialogConfigActive::load(HWND window)
+{
+ CLASSCERR("DialogConfigActive::load");
+
+ TranslateDialogDefault(window);
+
+ // initialise the checkboxes
+ CheckDlgButton(window, IDC_ACTIVE_ONLINE,
+ m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Online));
+ CheckDlgButton(window, IDC_ACTIVE_AWAY,
+ m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Away));
+ CheckDlgButton(window, IDC_ACTIVE_DND,
+ m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Dnd));
+ CheckDlgButton(window, IDC_ACTIVE_NA,
+ m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Na));
+ CheckDlgButton(window, IDC_ACTIVE_OCCUPIED,
+ m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Occupied));
+ CheckDlgButton(window, IDC_ACTIVE_FREEFORCHAT,
+ m_db.getActiveFlag(ConfigDatabase::ActiveFlag_FreeForChat));
+ CheckDlgButton(window, IDC_ACTIVE_INVISIBLE,
+ m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Invisible));
+
+ // add all the users active states
+ ConfigDatabase::ActiveUsersMap active_users = m_db.getActiveUsers();
+
+ HWND listview = GetDlgItem(window, IDC_ACTIVE_USERS);
+
+ // add checkboxes
+ ListView_SetExtendedListViewStyle(listview, LVS_EX_CHECKBOXES);
+
+ LV_ITEM lv_item;
+ lv_item.mask = LVIF_TEXT | LVIF_PARAM;
+ lv_item.iSubItem = 0;
+
+ int index = 0;
+ ConfigDatabase::ActiveUsersMap::const_iterator iter;
+ for (iter = active_users.begin(); iter != active_users.end(); ++iter)
+ {
+ lv_item.lParam = (LPARAM)iter->first;
+ std::string str = "";
+
+ // if its index 0, the use its the unknown user
+ if (0 == lv_item.lParam)
+ {
+ lv_item.pszText = "Unknown";
+ }
+ else
+ {
+ char *protocol = reinterpret_cast<char *>(
+ CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)iter->first,0));
+
+ if (protocol)
+ {
+ str += protocol;
+ str += ": ";
+ }
+
+ str += reinterpret_cast<char *>(
+ CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)iter->first, 0));
+
+ lv_item.pszText = const_cast<char *>(str.c_str());
+ }
+ lv_item.iItem = index++;
+
+ int it = ListView_InsertItem(listview, &lv_item);
+ ListView_SetCheckState(listview, it, iter->second);
+ }
+}
+
+//------------------------------------------------------------------------------
+void
+DialogConfigActive::save(HWND window)
+{
+ CLASSCERR("DialogConfigActive::save");
+
+ // store the checkboxes
+ m_db.setActiveFlag(ConfigDatabase::ActiveFlag_Online,
+ (IsDlgButtonChecked(window, IDC_ACTIVE_ONLINE) != 0));
+ m_db.setActiveFlag(ConfigDatabase::ActiveFlag_Away,
+ (IsDlgButtonChecked(window, IDC_ACTIVE_AWAY) != 0));
+ m_db.setActiveFlag(ConfigDatabase::ActiveFlag_Dnd,
+ (IsDlgButtonChecked(window, IDC_ACTIVE_DND) != 0));
+ m_db.setActiveFlag(ConfigDatabase::ActiveFlag_Na,
+ (IsDlgButtonChecked(window, IDC_ACTIVE_NA) != 0));
+ m_db.setActiveFlag(ConfigDatabase::ActiveFlag_Occupied,
+ (IsDlgButtonChecked(window, IDC_ACTIVE_OCCUPIED) != 0));
+ m_db.setActiveFlag(ConfigDatabase::ActiveFlag_FreeForChat,
+ (IsDlgButtonChecked(window, IDC_ACTIVE_FREEFORCHAT) != 0));
+ m_db.setActiveFlag(ConfigDatabase::ActiveFlag_Invisible,
+ (IsDlgButtonChecked(window, IDC_ACTIVE_INVISIBLE) != 0));
+
+ // look through the listview an extract the active users
+ HWND listview = GetDlgItem(window, IDC_ACTIVE_USERS);
+
+ LV_ITEM lv_item;
+ lv_item.mask = LVIF_PARAM;
+ lv_item.iSubItem = 0;
+
+ for (int i = 0; i < ListView_GetItemCount(listview); ++i)
+ {
+ lv_item.iItem = i;
+
+ if (TRUE == ListView_GetItem(listview, &lv_item))
+ {
+ m_db.setActiveUser((HANDLE)lv_item.lParam,
+ ListView_GetCheckState(listview, i));
+ }
+ }
+
+ m_db.save();
+}
+
+//------------------------------------------------------------------------------
+void
+DialogConfigActive::selectAllUsers(HWND window, bool state)
+{
+ CLASSCERR("DialogConfigActive::selectAllUsers");
+ // look through the listview an extract the active users
+
+ HWND listview = GetDlgItem(window, IDC_ACTIVE_USERS);
+
+ for (int i = 0; i < ListView_GetItemCount(listview); ++i)
+ {
+ ListView_SetCheckState(listview, i, state);
+ }
+
+ changed(window);
+}
+
+//==============================================================================
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.h b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.h
new file mode 100644
index 0000000000..5e0c0e2403
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_active.h
@@ -0,0 +1,56 @@
+#ifndef guard_speak_config_dialog_config_active_h
+#define guard_speak_config_dialog_config_active_h
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#include "dialog/miranda_dialog.h"
+#include "config/config_database.h"
+
+#include <wtypes.h>
+
+class DialogConfigActive : public MirandaDialog
+{
+ public:
+ //--------------------------------------------------------------------------
+ // Description : Initialise
+ // Parameters : db - reference to the database to initalise and save
+ // control to and from
+ //--------------------------------------------------------------------------
+ DialogConfigActive(ConfigDatabase &db);
+ virtual ~DialogConfigActive();
+
+ //--------------------------------------------------------------------------
+ // Description : process a dialog message
+ // Return : 0 - process ok
+ // 1 - error
+ //--------------------------------------------------------------------------
+ static int CALLBACK process(HWND window, UINT message, WPARAM wparam,
+ LPARAM lparam);
+
+ private:
+ //--------------------------------------------------------------------------
+ // Description : load/save setting to the miranda database
+ //--------------------------------------------------------------------------
+ void load(HWND window);
+ void save(HWND window);
+
+ //--------------------------------------------------------------------------
+ // Description : select/unselect all the active status checkboxes
+ // Parameters : state - the state to apply to the checkboxes
+ //--------------------------------------------------------------------------
+ void selectAllUsers(HWND window, bool state);
+
+ static DialogConfigActive *m_instance;
+ ConfigDatabase &m_db;
+};
+
+//==============================================================================
+//
+// Summary : Configuration Engine Dialog box
+//
+// Description : Set up the configuration dialog box and process its input
+//
+//==============================================================================
+
+#endif \ No newline at end of file
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.cpp b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.cpp
new file mode 100644
index 0000000000..d95e610916
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.cpp
@@ -0,0 +1,289 @@
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#pragma warning(disable:4786)
+
+#include "dialog_config_engine.h"
+
+#include "speak.h"
+#include "resource.h"
+#include "config/speech_interface.h"
+
+#include <general/debug/debug.h>
+#include <general/text_to_speech/text_to_speech/text_to_speech.h>
+
+#include <windows.h>
+#include <commctrl.h>
+
+//------------------------------------------------------------------------------
+DialogConfigEngine *DialogConfigEngine::m_instance = 0;
+
+//------------------------------------------------------------------------------
+// public:
+//------------------------------------------------------------------------------
+DialogConfigEngine::DialogConfigEngine(ConfigDatabase &db)
+ :
+ m_db(db),
+ m_test_tts(0)
+{
+ CLASSCERR("DialogConfigEngine::DialogConfigEngine");
+
+ m_instance = this;
+}
+
+//------------------------------------------------------------------------------
+DialogConfigEngine::~DialogConfigEngine()
+{
+ CLASSCERR("DialogConfigEngine::~DialogConfigEngine");
+
+ m_instance = 0;
+}
+
+//------------------------------------------------------------------------------
+int CALLBACK
+DialogConfigEngine::process(HWND window, UINT message, WPARAM wparam,
+ LPARAM lparam)
+{
+ if (!m_instance)
+ {
+ return 1;
+ }
+
+ switch (message)
+ {
+ case WM_INITDIALOG:
+ m_instance->load(window);
+ break;
+
+ case WM_NOTIFY:
+ if (PSN_APPLY == reinterpret_cast<LPNMHDR>(lparam)->code)
+ {
+ m_instance->save(window);
+ m_instance->m_db.save();
+ }
+ break;
+
+ case WM_HSCROLL:
+ m_instance->changed(window);
+ break;
+
+ case WM_COMMAND:
+ m_instance->command(window, wparam);
+ break;
+ }
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+// private:
+//------------------------------------------------------------------------------
+void
+DialogConfigEngine::command(HWND window, int control)
+{
+ switch (LOWORD(control))
+ {
+ case IDC_WELCOME_MSG:
+ if (EN_CHANGE == HIWORD(control))
+ {
+ changed(window);
+ }
+ break;
+
+ case IDC_SELECT_VOICE:
+ if (CBN_SELCHANGE == HIWORD(control))
+ {
+ changed(window);
+ }
+ break;
+
+ case IDC_SELECT_ENGINE:
+ if (CBN_SELCHANGE == HIWORD(control))
+ {
+ updateVoices(window);
+ changed(window);
+ }
+ break;
+
+ case IDC_CONFIG_LEXICON:
+ if (createTts(window))
+ {
+ if (!m_test_tts->lexiconDialog(window))
+ {
+ MessageBox(window, "Lexicon for this engine is not supported",
+ "Speak", MB_OK | MB_ICONEXCLAMATION);
+ }
+ }
+ break;
+
+ case IDC_BUTTON_TEST:
+ if (createTts(window))
+ {
+ m_test_tts->say(Translate("testing testing 1 2 3"));
+ }
+ break;
+ }
+}
+
+//------------------------------------------------------------------------------
+void
+DialogConfigEngine::load(HWND window)
+{
+ CLASSCERR("DialogConfigEngine::load()");
+
+ TranslateDialogDefault(window);
+
+ // add the available engines to the combo box
+ SpeechInterface si;
+ std::vector<std::string> engines = si.getAvailableEngines();
+ for (unsigned int i = 0; i < engines.size(); ++i)
+ {
+ CLASSCERR("DialogConfigEngine::load adding " << engines[i].c_str());
+
+ SendDlgItemMessage(window, IDC_SELECT_ENGINE, CB_ADDSTRING, 0,
+ (long)engines[i].c_str());
+ }
+
+ VoiceDesc desc = m_db.getVoiceDesc();
+
+ // initialise the sliders
+ SendDlgItemMessage(window, IDC_SLIDER_VOLUME, TBM_SETPOS, TRUE,
+ desc.volume);
+ SendDlgItemMessage(window, IDC_SLIDER_PITCH, TBM_SETPOS, TRUE,
+ desc.pitch);
+ SendDlgItemMessage(window, IDC_SLIDER_RATE, TBM_SETPOS, TRUE,
+ desc.rate);
+
+ // select the speech engine
+ SendDlgItemMessage(window, IDC_SELECT_ENGINE, CB_SELECTSTRING, 0,
+ reinterpret_cast<long>(desc.engine.c_str()));
+
+ // initialise the welcome message box
+ SetDlgItemText(window, IDC_WELCOME_MSG, m_db.getWelcomeMessage().c_str());
+
+ updateVoices(window);
+}
+
+//------------------------------------------------------------------------------
+void
+DialogConfigEngine::save(HWND window)
+{
+ CLASSCERR("DialogConfigEngine::save()");
+
+ VoiceDesc desc;
+ getVoiceDesc(window, desc);
+ m_db.setVoiceDesc(desc);
+
+ // store the welcome message
+ char text[512];
+ GetDlgItemText(window, IDC_WELCOME_MSG, text, sizeof(text));
+ m_db.setWelcomeMessage(std::string(text));
+}
+
+//------------------------------------------------------------------------------
+void
+DialogConfigEngine::updateVoices(HWND window)
+{
+ CLASSCERR("DialogConfigEngine::updateVoices()");
+
+ SpeechInterface si;
+ m_test_tts = std::auto_ptr<TextToSpeech>(si.createTts(getEngine(window)));
+
+ if (!m_test_tts.get())
+ {
+ // we couldnt open the text to speech engine
+ CLASSCERR("DialogConfigEngine::updateVoices invalid tts");
+ return;
+ }
+
+ // add the voices onto the list
+ std::vector<std::string> voices = m_test_tts->getVoices();
+
+ SendDlgItemMessage(window, IDC_SELECT_VOICE, CB_RESETCONTENT, 0, 0);
+ for (unsigned int i = 0; i < voices.size(); ++i)
+ {
+ SendDlgItemMessage(window, IDC_SELECT_VOICE, CB_ADDSTRING, 0,
+ (long)voices[i].c_str());
+ }
+
+ // get the voice saved in the database
+ std::string voice = m_db.getVoiceDesc().voice;
+
+ if (FAILED(SendDlgItemMessage(window, IDC_SELECT_VOICE,
+ CB_FINDSTRINGEXACT, 0, (long)voice.c_str())))
+ {
+ // select the first one
+ SendDlgItemMessage(window, IDC_SELECT_VOICE, CB_SETCURSEL , 0, 0);
+ }
+ else
+ {
+ // select the saved voice
+ SendDlgItemMessage(window, IDC_SELECT_VOICE, CB_SELECTSTRING, 0,
+ (long)voice.c_str());
+ }
+}
+
+//------------------------------------------------------------------------------
+void
+DialogConfigEngine::getVoiceDesc(HWND window, VoiceDesc &desc)
+{
+ CLASSCERR("DialogConfigEngine::getVoiceDesc(,)");
+
+ // get the engine
+ char text[100];
+ GetDlgItemText(window, IDC_SELECT_ENGINE, text, sizeof(text));
+ desc.engine = std::string(text);
+
+ // get the voice
+ std::auto_ptr<char> voice(new char[50]);
+ SendDlgItemMessage(window, IDC_SELECT_VOICE, CB_GETLBTEXT,
+ SendDlgItemMessage(window, IDC_SELECT_VOICE, CB_GETCURSEL, 0, 0),
+ reinterpret_cast<long>(voice.get()));
+ desc.voice = voice.get();
+
+ // get the voice setting sliders
+ desc.volume
+ = SendDlgItemMessage(window, IDC_SLIDER_VOLUME, TBM_GETPOS, 0, 0);
+ desc.pitch
+ = SendDlgItemMessage(window, IDC_SLIDER_PITCH, TBM_GETPOS, 0, 0);
+ desc.rate
+ = SendDlgItemMessage(window, IDC_SLIDER_RATE, TBM_GETPOS, 0, 0);
+}
+
+//------------------------------------------------------------------------------
+std::string
+DialogConfigEngine::getEngine(HWND window)
+{
+ CLASSCERR("DialogConfigEngine::getEngine()");
+
+ // store the engine
+ char text[100];
+ GetDlgItemText(window, IDC_SELECT_ENGINE, text, sizeof(text));
+
+ CLASSCERR("DialogConfigEngine::getEngine() return " << text);
+ return text;
+}
+
+//------------------------------------------------------------------------------
+bool
+DialogConfigEngine::createTts(HWND window)
+{
+ CLASSCERR("DialogConfigEngine::createTts()");
+
+ VoiceDesc desc;
+ getVoiceDesc(window, desc);
+
+ SpeechInterface si;
+ m_test_tts = std::auto_ptr<TextToSpeech>(si.createTts(desc.engine));
+
+ if (!m_test_tts.get())
+ {
+ return false;
+ }
+
+ si.configureTts(m_test_tts.get(), desc);
+ return true;
+}
+
+//==============================================================================
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.h b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.h
new file mode 100644
index 0000000000..9aed91aa9b
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/dialog_config_engine.h
@@ -0,0 +1,59 @@
+#ifndef guard_speak_config_dialog_config_engine_h
+#define guard_speak_config_dialog_config_engine_h
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#include "dialog/miranda_dialog.h"
+#include "config/config_database.h"
+
+#include <wtypes.h>
+#include <memory>
+
+class TextToSpeech;
+
+class DialogConfigEngine : public MirandaDialog
+{
+ public:
+ DialogConfigEngine(ConfigDatabase &db);
+ virtual ~DialogConfigEngine();
+
+ //--------------------------------------------------------------------------
+ // Description : process a dialog message
+ // Return : 0 - process ok
+ // 1 - error
+ //--------------------------------------------------------------------------
+ static int CALLBACK process(HWND window, UINT message, WPARAM wparam,
+ LPARAM lparam);
+
+ private:
+ void command(HWND window, int control);
+
+ //--------------------------------------------------------------------------
+ // Description : load/save setting to the miranda database
+ //--------------------------------------------------------------------------
+ void load(HWND window);
+ void save(HWND window);
+
+ //--------------------------------------------------------------------------
+ // Description : update the voices combo box
+ //--------------------------------------------------------------------------
+ void updateVoices(HWND window);
+ void getVoiceDesc(HWND window, VoiceDesc &desc);
+ std::string getEngine(HWND window);
+ bool createTts(HWND window);
+
+ static DialogConfigEngine *m_instance;
+ ConfigDatabase &m_db;
+ std::auto_ptr<TextToSpeech> m_test_tts;
+};
+
+//==============================================================================
+//
+// Summary : Configuration Engine Dialog box
+//
+// Description : Set up the configuration dialog box and process its input
+//
+//==============================================================================
+
+#endif \ No newline at end of file
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.cpp b/plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.cpp
new file mode 100644
index 0000000000..c9f6bfdbde
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.cpp
@@ -0,0 +1,170 @@
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#pragma warning(disable:4786)
+
+#include "speak_config.h"
+
+#include "defs/voice_desc.h"
+#include "config/speech_interface.h"
+#include "config/dialog_config_engine.h"
+#include "config/dialog_config_active.h"
+
+#include <general/debug/debug.h>
+#include <general/text_to_speech/text_to_speech/text_to_speech.h>
+//#include <general/multimedia/winamp_2/winamp_2.h>
+
+#include <sstream>
+
+//------------------------------------------------------------------------------
+// public:
+//------------------------------------------------------------------------------
+SpeakConfig::SpeakConfig(HINSTANCE instance)
+ :
+ m_instance(instance),
+ m_db(),
+ m_tts(0),
+ m_dialog_engine(m_db),
+ m_dialog_active(m_db)
+{
+ CLASSCERR("SpeakConfig::SpeakConfig");
+
+ // create and configure the tts
+ SpeechInterface si;
+ VoiceDesc desc = m_db.getVoiceDesc();
+ m_tts = std::auto_ptr<TextToSpeech>(si.createTts(desc.engine));
+ si.configureTts(m_tts.get(), desc);
+
+ // observer the database for changes
+ m_db.attach(*this);
+
+ say(m_db.getWelcomeMessage());
+}
+
+//------------------------------------------------------------------------------
+SpeakConfig::~SpeakConfig()
+{
+ CLASSCERR("SpeakConfig::~SpeakConfig");
+}
+
+//------------------------------------------------------------------------------
+void
+SpeakConfig::update(Subject &subject)
+{
+ CLASSCERR("SpeakConfig::update(" << &subject << ")");
+
+ ConfigDatabase &db = static_cast<ConfigDatabase &>(subject);
+
+ SpeechInterface si;
+ VoiceDesc desc = db.getVoiceDesc();
+ m_tts = std::auto_ptr<TextToSpeech>(si.createTts(desc.engine));
+ si.configureTts(m_tts.get(), desc);
+}
+
+//------------------------------------------------------------------------------
+bool
+SpeakConfig::say(const std::string &sentence, HANDLE user)
+{
+ CLASSCERR("SpeakConfig::say(" << sentence << ")");
+
+ if (!m_tts.get())
+ {
+ return false;
+ }
+
+ bool active = true;
+
+ if (NULL != user)
+ {
+ // get the status of the protocol of this user
+ const char *protocol = (char *)CallService(MS_PROTO_GETCONTACTBASEPROTO,
+ (WPARAM)user, 0);
+
+ if (ID_STATUS_OFFLINE == CallProtoService(protocol, PS_GETSTATUS, 0, 0))
+ {
+ // if we are offline for this protocol, then don't speak the
+ // sentence this is so we don't announce users offline status if
+ // we are disconnected.
+ active = false;
+ }
+ else
+ {
+ switch (CallService(MS_CLIST_GETSTATUSMODE, 0, 0))
+ {
+ case ID_STATUS_ONLINE:
+ active = m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Online);
+ break;
+ case ID_STATUS_AWAY:
+ active = m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Away);
+ break;
+ case ID_STATUS_DND:
+ active = m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Dnd);
+ break;
+ case ID_STATUS_NA:
+ active = m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Na);
+ break;
+ case ID_STATUS_OCCUPIED:
+ active = m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Occupied);
+ break;
+ case ID_STATUS_FREECHAT:
+ active = m_db.getActiveFlag(ConfigDatabase::ActiveFlag_FreeForChat);
+ break;
+ case ID_STATUS_INVISIBLE:
+ active = m_db.getActiveFlag(ConfigDatabase::ActiveFlag_Invisible);
+ break;
+ default:
+ active = false;
+ break;
+ }
+ }
+
+ // if its a user say, then check the users status
+ if (active && (NULL != user))
+ {
+ active = m_db.getActiveUser(user);
+ }
+ }
+
+ if (!active)
+ {
+ return false;
+ }
+
+ bool ret = m_tts->say(sentence);
+
+ return ret;
+}
+
+//------------------------------------------------------------------------------
+/*int
+SpeakConfig::dialogEngine(HWND window, unsigned int message, WPARAM wparam,
+ LPARAM lparam)
+{
+ if (WM_INITDIALOG == message)
+ {
+ m_dialog_engine = std::auto_ptr<DialogConfigEngine>
+ (new DialogConfigEngine(window, m_db));
+ }
+ else if (WM_DESTROY == message)
+ {
+ m_dialog_engine = std::auto_ptr<DialogConfigEngine>(0);
+ }
+
+ if (!m_dialog_engine.get())
+ {
+ return 1;
+ }
+
+ // process the message and if settings are changed, reload the tts
+ if (m_dialog_engine->process(message, wparam, lparam))
+ {
+ m_db.load();
+ SpeechInterface si;
+ m_tts = std::auto_ptr<TextToSpeech>(si.createTts(m_db.getVoiceDesc()));
+ }
+
+ return 0;
+}*/
+
+//==============================================================================
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.h b/plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.h
new file mode 100644
index 0000000000..c664c9d9d8
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/speak_config.h
@@ -0,0 +1,59 @@
+#ifndef guard_speak_config_speak_config_h
+#define guard_speak_config_speak_config_h
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#include "speak.h"
+#include "config/config_database.h"
+#include "config/dialog_config_active.h"
+#include "config/dialog_config_engine.h"
+
+#include <general/observer/observer.h>
+
+#include <wtypes.h>
+#include <memory>
+
+class TextToSpeech;
+
+class SpeakConfig : public Observer
+{
+ public:
+ SpeakConfig(HINSTANCE instance);
+ virtual ~SpeakConfig();
+
+ //--------------------------------------------------------------------------
+ // Description : Called by a subject that this observer is observing
+ // to signify a change in state
+ // Parameters : subject - the subject that changed
+ //--------------------------------------------------------------------------
+ virtual void update(Subject &subject);
+
+ //--------------------------------------------------------------------------
+ // Description : speak a sentence
+ // Parameters : sentence - the sentence to speak
+ // user - the user to associate the say with
+ // NULL = ignore user
+ // Returns : true - speak successful
+ // false - speak failed
+ //--------------------------------------------------------------------------
+ bool say(const std::string &sentence, HANDLE user = NULL);
+
+ private:
+ HINSTANCE m_instance;
+
+ ConfigDatabase m_db;
+ std::auto_ptr<TextToSpeech> m_tts;
+ DialogConfigEngine m_dialog_engine;
+ DialogConfigActive m_dialog_active;
+};
+
+//==============================================================================
+//
+// Summary : The main object for the speak plugins
+//
+// Description : see summary
+//
+//==============================================================================
+
+#endif \ No newline at end of file
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.cpp b/plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.cpp
new file mode 100644
index 0000000000..c80a219165
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.cpp
@@ -0,0 +1,91 @@
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#pragma warning(disable:4786)
+
+#include "speech_interface.h"
+
+#include "config/config_database.h"
+
+#include <general/debug/debug.h>
+#include <general/text_to_speech/speech_api_40a/speech_api_40a.h>
+#include <general/text_to_speech/speech_api_51/speech_api_51.h>
+
+//------------------------------------------------------------------------------
+// public:
+//------------------------------------------------------------------------------
+SpeechInterface::SpeechInterface()
+{
+ CLASSCERR("SpeechInterface::SpeechInterface");
+}
+
+//------------------------------------------------------------------------------
+SpeechInterface::~SpeechInterface()
+{
+ CLASSCERR("SpeechInterface::~SpeechInterface");
+}
+
+//------------------------------------------------------------------------------
+TextToSpeech *
+SpeechInterface::createTts(std::string &engine) const
+{
+ CLASSCERR("SpeechInterface::createTts()");
+
+ TextToSpeech *tts = 0;
+
+ if (SpeechApi40a::getDescription() == engine)
+ {
+ tts = new SpeechApi40a();
+ }
+ else if (SpeechApi51::getDescription() == engine)
+ {
+ tts = new SpeechApi51();
+ }
+
+ CLASSCERR("SpeechInterface::createTts() return " << tts);
+ return tts;
+}
+
+//------------------------------------------------------------------------------
+void
+SpeechInterface::configureTts(TextToSpeech *tts, const VoiceDesc &desc) const
+{
+ CLASSCERR("SpeechInterface::configureTts(" << tts << ",)");
+
+ if (!tts)
+ {
+ return;
+ }
+
+ tts->setVoice(desc.voice);
+ tts->setVolume(desc.volume);
+ tts->setRate(desc.rate);
+ tts->setPitch(desc.pitch);
+ tts->load();
+}
+
+//------------------------------------------------------------------------------
+std::vector<std::string>
+SpeechInterface::getAvailableEngines()
+{
+ CLASSCERR("SpeechInterface::getAvailableEngines");
+
+ std::vector<std::string> engines;
+
+ SpeechApi40a sapi40a;
+ if (sapi40a.isAvailable())
+ {
+ engines.push_back(SpeechApi40a::getDescription());
+ }
+
+ SpeechApi51 sapi51;
+ if (sapi51.isAvailable())
+ {
+ engines.push_back(SpeechApi51::getDescription());
+ }
+
+ return engines;
+}
+
+//==============================================================================
diff --git a/plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.h b/plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.h
new file mode 100644
index 0000000000..69d2d44e14
--- /dev/null
+++ b/plugins/!NotAdopted/WinterSpeak/speak/config/speech_interface.h
@@ -0,0 +1,48 @@
+#ifndef guard_speak_config_speech_interface_h
+#define guard_speak_config_speech_interface_h
+//==============================================================================
+// Miranda Speak Plugin, © 2002 Ryan Winter
+//==============================================================================
+
+#include "defs/voice_desc.h"
+
+#include <string>
+#include <vector>
+
+class TextToSpeech;
+
+class SpeechInterface
+{
+ public:
+ SpeechInterface();
+ ~SpeechInterface();
+
+ //--------------------------------------------------------------------------
+ // Description : create the text to speech object
+ // Parameters : engine - the name of the engine to create
+ // Returns : an instance of the text to speech engine
+ //--------------------------------------------------------------------------
+ TextToSpeech * createTts(std::string &engine) const;
+
+ //--------------------------------------------------------------------------
+ // Description : configure the tts object
+ // Parameters : tts - the tts object to configure
+ // desc - the description of the voice
+ //--------------------------------------------------------------------------
+ void configureTts(TextToSpeech *tts, const VoiceDesc &desc) const;
+
+ //--------------------------------------------------------------------------
+ // Description : create a vector of available engines
+ //--------------------------------------------------------------------------
+ std::vector<std::string> getAvailableEngines();
+};
+
+//==============================================================================
+//
+// Summary : Configure a text to speech object
+//
+// Description : Encapsulate the different speech engines available
+//
+//==============================================================================
+
+#endif \ No newline at end of file