summaryrefslogtreecommitdiff
path: root/tools/_deprecated/Yahoo/src/proto.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/_deprecated/Yahoo/src/proto.cpp')
-rw-r--r--tools/_deprecated/Yahoo/src/proto.cpp734
1 files changed, 734 insertions, 0 deletions
diff --git a/tools/_deprecated/Yahoo/src/proto.cpp b/tools/_deprecated/Yahoo/src/proto.cpp
new file mode 100644
index 0000000000..353baf3c16
--- /dev/null
+++ b/tools/_deprecated/Yahoo/src/proto.cpp
@@ -0,0 +1,734 @@
+/*
+ * $Id: proto.cpp 13497 2011-03-25 04:55:36Z borkra $
+ *
+ * myYahoo Miranda Plugin
+ *
+ * Authors: Gennady Feldman (aka Gena01)
+ * Laurent Marechal (aka Peorth)
+ *
+ * This code is under GPL and is based on AIM, MSN and Miranda source code.
+ * I want to thank Robert Rainwater and George Hazan for their code and support
+ * and for answering some of my questions during development of this plugin.
+ */
+
+#include "stdafx.h"
+
+#include <win2k.h>
+
+#include <m_options.h>
+#include <m_skin.h>
+#include <m_userinfo.h>
+
+#include "resource.h"
+#include "file_transfer.h"
+
+#pragma warning(disable:4355)
+
+CYahooProto::CYahooProto(const char *aProtoName, const wchar_t *aUserName)
+ : PROTO<CYahooProto>(aProtoName, aUserName),
+ m_bLoggedIn(FALSE),
+ poll_loop(0),
+ m_chatrooms(3, ChatRoom::compare)
+{
+ m_connections = NULL;
+ m_connection_tags = 0;
+
+ logoff_buddies();
+
+ SkinAddNewSoundExW("mail", m_tszUserName, LPGENW("New E-mail available in Inbox"));
+
+ LoadYahooServices();
+}
+
+CYahooProto::~CYahooProto()
+{
+ if (m_bLoggedIn)
+ logout();
+
+ debugLogA("Logged out");
+
+ DestroyHookableEvent(hYahooNudge);
+
+ MenuUninit();
+
+ FREE(m_startMsg);
+ FREE(m_pw_token);
+
+ Netlib_CloseHandle(m_hNetlibUser);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// OnModulesLoadedEx - performs hook registration
+
+int CYahooProto::OnModulesLoadedEx(WPARAM, LPARAM)
+{
+ HookProtoEvent(ME_USERINFO_INITIALISE, &CYahooProto::OnUserInfoInit);
+ HookProtoEvent(ME_IDLE_CHANGED, &CYahooProto::OnIdleEvent);
+ HookProtoEvent(ME_CLIST_PREBUILDCONTACTMENU, &CYahooProto::OnPrebuildContactMenu);
+
+ wchar_t tModuleDescr[100];
+ mir_snwprintf(tModuleDescr, TranslateT("%s plugin connections"), m_tszUserName);
+
+ NETLIBUSER nlu = { 0 };
+ nlu.cbSize = sizeof(nlu);
+#ifdef HTTP_GATEWAY
+ nlu.flags = NUF_OUTGOING | NUF_HTTPGATEWAY| NUF_HTTPCONNS | NUF_UNICODE;
+#else
+ nlu.flags = NUF_OUTGOING | NUF_HTTPCONNS | NUF_UNICODE;
+#endif
+ nlu.szSettingsModule = m_szModuleName;
+ nlu.ptszDescriptiveName = tModuleDescr;
+
+#ifdef HTTP_GATEWAY
+ // Here comes the Gateway Code!
+ nlu.szHttpGatewayHello = NULL;
+ nlu.szHttpGatewayUserAgent = "User-Agent: " + NETLIB_USER_AGENT;
+ nlu.pfnHttpGatewayInit = YAHOO_httpGatewayInit;
+ nlu.pfnHttpGatewayBegin = NULL;
+ nlu.pfnHttpGatewayWrapSend = YAHOO_httpGatewayWrapSend;
+ nlu.pfnHttpGatewayUnwrapRecv = YAHOO_httpGatewayUnwrapRecv;
+#endif
+
+ m_hNetlibUser = (HANDLE)CallService(MS_NETLIB_REGISTERUSER, 0, (LPARAM)&nlu);
+ MenuContactInit();
+ ChatRegister();
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// AddToList - adds a contact to the contact list
+
+MCONTACT CYahooProto::AddToList(int flags, PROTOSEARCHRESULT *psr)
+{
+ debugLogA("[YahooAddToList] Flags: %d", flags);
+
+ if (!m_bLoggedIn) {
+ debugLogA("[YahooAddToList] WARNING: WE ARE OFFLINE!");
+ return 0;
+ }
+
+ YAHOO_SEARCH_RESULT *ysr = (YAHOO_SEARCH_RESULT*)psr;
+ if (ysr == NULL || ysr->cbSize != sizeof(YAHOO_SEARCH_RESULT)) {
+ debugLogA("[YahooAddToList] Empty data passed?");
+ return 0;
+ }
+
+ char *id = psr->flags & PSR_UNICODE ? mir_utf8encodeW((wchar_t*)psr->id.w) : mir_utf8encode((char*)psr->id.w);
+ MCONTACT hContact = getbuddyH(id);
+ if (hContact != NULL) {
+ if (db_get_b(hContact, "CList", "NotOnList")) {
+ debugLogA("[YahooAddToList] Temporary Buddy:%s already on our buddy list", id);
+ //return 0;
+ }
+ else {
+ debugLogA("[YahooAddToList] Buddy:%s already on our buddy list", id);
+ mir_free(id);
+ return 0;
+ }
+ }
+ else if (flags & PALF_TEMPORARY) { /* not on our list */
+ debugLogA("[YahooAddToList] Adding Temporary Buddy:%s ", id);
+ }
+
+ int protocol = ysr->protocol;
+ debugLogA("Adding buddy:%s", id);
+ hContact = add_buddy(id, id, protocol, flags);
+ mir_free(id);
+ return hContact;
+}
+
+MCONTACT __cdecl CYahooProto::AddToListByEvent(int, int, MEVENT hDbEvent)
+{
+ debugLogA("[YahooAddToListByEvent]");
+ if (!m_bLoggedIn)
+ return 0;
+
+ DBEVENTINFO dbei = { sizeof(dbei) };
+ if ((dbei.cbBlob = db_event_getBlobSize(hDbEvent)) == -1) {
+ debugLogA("[YahooAddToListByEvent] ERROR: Can't get blob size.");
+ return 0;
+ }
+
+ debugLogA("[YahooAddToListByEvent] Got blob size: %lu", dbei.cbBlob);
+ dbei.pBlob = (PBYTE)_alloca(dbei.cbBlob);
+ if (db_event_get(hDbEvent, &dbei)) {
+ debugLogA("[YahooAddToListByEvent] ERROR: Can't get event.");
+ return 0;
+ }
+
+ if (dbei.eventType != EVENTTYPE_AUTHREQUEST) {
+ debugLogA("[YahooAddToListByEvent] ERROR: Not an authorization request.");
+ return 0;
+ }
+
+ if (mir_strcmp(dbei.szModule, m_szModuleName)) {
+ debugLogA("[YahooAddToListByEvent] ERROR: Not Yahoo protocol.");
+ return 0;
+ }
+
+ MCONTACT hContact = DbGetAuthEventContact(&dbei);
+ if (hContact != NULL)
+ debugLogA("Temp Buddy found at: %p ", hContact);
+ else
+ debugLogA("hContact NULL???");
+
+ return hContact;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// AuthAllow - processes the successful authorization
+
+int CYahooProto::Authorize(MEVENT hdbe)
+{
+ debugLogA("[YahooAuthAllow]");
+ if (!m_bLoggedIn) {
+ debugLogA("[YahooAuthAllow] Not Logged In!");
+ return 1;
+ }
+
+ DBEVENTINFO dbei = { sizeof(dbei) };
+ if ((dbei.cbBlob = db_event_getBlobSize(hdbe)) == -1)
+ return 1;
+
+ dbei.pBlob = (PBYTE)_alloca(dbei.cbBlob);
+ if (db_event_get(hdbe, &dbei))
+ return 1;
+
+ if (dbei.eventType != EVENTTYPE_AUTHREQUEST)
+ return 1;
+
+ if (mir_strcmp(dbei.szModule, m_szModuleName))
+ return 1;
+
+ /* Need to remove the buddy from our Miranda Lists */
+ MCONTACT hContact = DbGetAuthEventContact(&dbei);
+ if (hContact != NULL) {
+ ptrA who(getStringA(hContact, YAHOO_LOGINID));
+ if (who) {
+ ptrA myid(getStringA(hContact, "MyIdentity"));
+ debugLogA("Accepting buddy:%s", who);
+ accept(myid, who, getWord(hContact, "yprotoid", 0));
+ }
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// AuthDeny - handles the unsuccessful authorization
+
+int CYahooProto::AuthDeny(MEVENT hdbe, const wchar_t *reason)
+{
+ debugLogA("[YahooAuthDeny]");
+ if (!m_bLoggedIn)
+ return 1;
+
+ DBEVENTINFO dbei = { sizeof(dbei) };
+ if ((dbei.cbBlob = db_event_getBlobSize(hdbe)) == -1) {
+ debugLogA("[YahooAuthDeny] ERROR: Can't get blob size");
+ return 1;
+ }
+
+ dbei.pBlob = (PBYTE)alloca(dbei.cbBlob);
+ if (db_event_get(hdbe, &dbei)) {
+ debugLogA("YahooAuthDeny - Can't get db event!");
+ return 1;
+ }
+
+ if (dbei.eventType != EVENTTYPE_AUTHREQUEST) {
+ debugLogA("YahooAuthDeny - not Authorization event");
+ return 1;
+ }
+
+ if (mir_strcmp(dbei.szModule, m_szModuleName)) {
+ debugLogA("YahooAuthDeny - wrong module?");
+ return 1;
+ }
+
+ /* Need to remove the buddy from our Miranda Lists */
+ MCONTACT hContact = DbGetAuthEventContact(&dbei);
+ if (hContact != NULL) {
+ ptrA who(getStringA(hContact, YAHOO_LOGINID));
+ if (who) {
+ ptrA myid(getStringA(hContact, "MyIdentity"));
+ T2Utf u_reason(reason);
+
+ debugLogA("Rejecting buddy:%s msg: %s", who, u_reason);
+ reject(myid, who, getWord(hContact, "yprotoid", 0), u_reason);
+ db_delete_contact(hContact);
+ }
+ }
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PSR_AUTH
+
+int __cdecl CYahooProto::AuthRecv(MCONTACT hContact, PROTORECVEVENT* pre)
+{
+ debugLogA("[YahooRecvAuth] ");
+ db_unset(hContact, "CList", "Hidden");
+
+ Proto_AuthRecv(m_szModuleName, pre);
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PSS_AUTHREQUEST
+
+int __cdecl CYahooProto::AuthRequest(MCONTACT hContact, const wchar_t* msg)
+{
+ debugLogA("[YahooSendAuthRequest]");
+
+ if (hContact && m_bLoggedIn) {
+ AddBuddy(hContact, "miranda", msg);
+ return 0; // Success
+ }
+
+ return 1; // Failure
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// GetCaps - return protocol capabilities bits
+
+DWORD_PTR __cdecl CYahooProto::GetCaps(int type, MCONTACT)
+{
+ switch (type) {
+ case PFLAGNUM_1:
+ return PF1_IM | PF1_ADDED | PF1_AUTHREQ | PF1_MODEMSGRECV | PF1_MODEMSGSEND | PF1_BASICSEARCH |
+ PF1_EXTSEARCH | PF1_FILESEND | PF1_FILERECV | PF1_VISLIST | PF1_SERVERCLIST;
+
+ case PFLAGNUM_2:
+ return PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_ONTHEPHONE |
+ PF2_OUTTOLUNCH | PF2_INVISIBLE | PF2_LIGHTDND /*| PF2_HEAVYDND*/;
+
+ case PFLAGNUM_3:
+ return PF2_ONLINE | PF2_SHORTAWAY | PF2_LONGAWAY | PF2_ONTHEPHONE |
+ PF2_OUTTOLUNCH | PF2_LIGHTDND;
+
+ case PFLAGNUM_4:
+ return PF4_FORCEAUTH | PF4_FORCEADDED | PF4_SUPPORTTYPING | PF4_SUPPORTIDLE
+ | PF4_AVATARS | PF4_OFFLINEFILES | PF4_IMSENDOFFLINE /* for Meta plugin*/;
+ case PFLAG_UNIQUEIDTEXT:
+ return (DWORD_PTR)Translate("ID");
+ case PFLAG_UNIQUEIDSETTING:
+ return (DWORD_PTR)YAHOO_LOGINID;
+ case PFLAG_MAXLENOFMESSAGE:
+ return 800; /* STUPID YAHOO!!! */
+ default:
+ return 0;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// GetInfo - retrieves a contact info
+
+void __cdecl CYahooProto::get_info_thread(void *hContact)
+{
+ SleepEx(500, TRUE);
+ ProtoBroadcastAck((MCONTACT)hContact, ACKTYPE_GETINFO, ACKRESULT_SUCCESS, (HANDLE)1, 0);
+}
+
+int __cdecl CYahooProto::GetInfo(MCONTACT hContact, int /*infoType*/)
+{
+ ForkThread(&CYahooProto::get_info_thread, (void*)hContact);
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// RecvFile
+
+int __cdecl CYahooProto::RecvFile(MCONTACT hContact, PROTORECVFILET* evt)
+{
+ db_unset(hContact, "CList", "Hidden");
+
+ return Proto_RecvFile(hContact, evt);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SetApparentMode - sets the visibility status
+
+int __cdecl CYahooProto::SetApparentMode(MCONTACT hContact, int mode)
+{
+ if (mode && mode != ID_STATUS_OFFLINE)
+ return 1;
+
+ int oldMode = getWord(hContact, "ApparentMode", 0);
+ if (mode != oldMode)
+ setWord(hContact, "ApparentMode", mode);
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SetStatus - sets the protocol status
+
+int __cdecl CYahooProto::SetStatus(int iNewStatus)
+{
+ LOG(("[SetStatus] New status %S", pcli->pfnGetStatusModeDescription(iNewStatus, 0)));
+
+ if (iNewStatus == ID_STATUS_OFFLINE) {
+ logout();
+ }
+ else if (!m_bLoggedIn) {
+ DBVARIANT dbv;
+ int err = 0;
+ char errmsg[80];
+
+ if (m_iStatus == ID_STATUS_CONNECTING)
+ return 0;
+
+ YAHOO_utils_logversion();
+
+ /*
+ * Load Yahoo ID from the database.
+ */
+ if (!getString(YAHOO_LOGINID, &dbv)) {
+ if (mir_strlen(dbv.pszVal) > 0)
+ mir_strncpy(m_yahoo_id, dbv.pszVal, 255);
+ else
+ err++;
+ db_free(&dbv);
+ }
+ else {
+ ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_BADUSERID);
+ err++;
+ }
+
+ if (err)
+ mir_strncpy(errmsg, Translate("Please enter your Yahoo ID in Options -> Network -> Yahoo"), 80);
+ else {
+ if (!getString(YAHOO_PASSWORD, &dbv)) {
+ if (mir_strlen(dbv.pszVal) > 0)
+ mir_strncpy(m_password, dbv.pszVal, 255);
+ else
+ err++;
+
+ db_free(&dbv);
+ }
+ else {
+ ProtoBroadcastAck(NULL, ACKTYPE_LOGIN, ACKRESULT_FAILED, NULL, LOGINERR_WRONGPASSWORD);
+ err++;
+ }
+
+ if (err)
+ mir_strncpy(errmsg, Translate("Please enter your Yahoo password in Options -> Network -> Yahoo"), 80);
+ }
+
+ if (err != 0) {
+ BroadcastStatus(ID_STATUS_OFFLINE);
+
+ ShowError(TranslateT("Yahoo Login Error"), _A2T(errmsg));
+ return 0;
+ }
+
+ FREE(m_pw_token); // No Token yet.
+
+ if (!getString(YAHOO_PWTOKEN, &dbv)) {
+ if (mir_strlen(dbv.pszVal) > 0)
+ m_pw_token = strdup(dbv.pszVal);
+
+ db_free(&dbv);
+ }
+
+ m_startStatus = iNewStatus;
+
+ //reset the unread email count. We'll get a new packet since we are connecting.
+ m_unreadMessages = 0;
+
+ BroadcastStatus(ID_STATUS_CONNECTING);
+
+ iNewStatus = (iNewStatus == ID_STATUS_INVISIBLE) ? YAHOO_STATUS_INVISIBLE : YAHOO_STATUS_AVAILABLE;
+ ForkThread(&CYahooProto::server_main, (void *)iNewStatus);
+ }
+ else if (iNewStatus == ID_STATUS_INVISIBLE) { /* other normal away statuses are set via setaway */
+ BroadcastStatus(iNewStatus);
+ set_status(m_iStatus, NULL, (m_iStatus != ID_STATUS_ONLINE) ? 1 : 0);
+ }
+ else {
+ /* clear out our message just in case, STUPID AA! */
+ FREE(m_startMsg);
+
+ /* now tell miranda that we are Online, don't tell Yahoo server yet though! */
+ BroadcastStatus(iNewStatus);
+ }
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// GetAwayMsg - returns a contact's away message
+
+void __cdecl CYahooProto::get_status_thread(void *param)
+{
+ DBVARIANT dbv;
+ char *gm = NULL, *sm = NULL, *fm;
+ MCONTACT hContact = (MCONTACT)param;
+
+ Sleep(150);
+
+ /* Check Yahoo Games Message */
+ if (!getString(hContact, "YGMsg", &dbv)) {
+ gm = strdup(dbv.pszVal);
+ db_free(&dbv);
+ }
+
+ if (!db_get_s(hContact, "CList", "StatusMsg", &dbv)) {
+ if (mir_strlen(dbv.pszVal) >= 1)
+ sm = strdup(dbv.pszVal);
+
+ db_free(&dbv);
+ }
+ else {
+ int status = getDword(hContact, "YStatus", YAHOO_STATUS_OFFLINE);
+ sm = yahoo_status_code(yahoo_status(status));
+ if (sm) sm = strdup(sm); /* we need this to go global FREE later */
+ }
+
+ size_t l = 0;
+ if (gm)
+ l += mir_strlen(gm) + 3;
+
+ l += mir_strlen(sm) + 1;
+ fm = (char *)malloc(l);
+
+ fm[0] = '\0';
+ if (gm && mir_strlen(gm) > 0) {
+ /* BAH YAHOO SUCKS! WHAT A PAIN!
+ find first carriage return add status message then add the rest */
+ char *c = strchr(gm, '\r');
+
+ if (c != NULL) {
+ mir_strncpy(fm, gm, c - gm + 1);
+ fm[c - gm + 1] = '\0';
+ }
+ else
+ mir_strcpy(fm, gm);
+
+ if (sm) {
+ mir_strcat(fm, ": ");
+ mir_strcat(fm, sm);
+ }
+
+ if (c != NULL)
+ mir_strcat(fm, c);
+ }
+ else if (sm) {
+ mir_strcat(fm, sm);
+ }
+
+ FREE(sm);
+
+ ProtoBroadcastAck(hContact, ACKTYPE_AWAYMSG, ACKRESULT_SUCCESS, (HANDLE)1, _A2T(fm));
+}
+
+HANDLE __cdecl CYahooProto::GetAwayMsg(MCONTACT hContact)
+{
+ debugLogA("[YahooGetAwayMessage] ");
+
+ if (hContact && m_bLoggedIn) {
+ if (getWord(hContact, "Status", ID_STATUS_OFFLINE) == ID_STATUS_OFFLINE)
+ return 0; /* user offline, what Status message? */
+
+ ForkThread(&CYahooProto::get_status_thread, (void*)hContact);
+ return (HANDLE)1; //Success
+ }
+
+ return 0; // Failure
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// SetAwayMsg - sets the away status message
+
+int __cdecl CYahooProto::SetAwayMsg(int status, const wchar_t* msg)
+{
+ char *c = msg && msg[0] ? mir_utf8encodeW(msg) : NULL;
+
+ debugLogA("[YahooSetAwayMessage] Status: %S, Msg: %s", pcli->pfnGetStatusModeDescription(status, 0), (char*)c);
+
+ if (!m_bLoggedIn) {
+ if (m_iStatus == ID_STATUS_OFFLINE) {
+ debugLogA("[YahooSetAwayMessage] WARNING: WE ARE OFFLINE!");
+ mir_free(c);
+ return 1;
+ }
+ else {
+ if (m_startMsg) free(m_startMsg);
+
+ m_startMsg = c ? strdup(c) : NULL;
+
+ mir_free(c);
+ return 0;
+ }
+ }
+
+ /* need to tell ALL plugins that we are changing status */
+ BroadcastStatus(status);
+
+ if (m_startMsg) free(m_startMsg);
+
+ /* now decide what we tell the server */
+ if (c != 0) {
+ m_startMsg = strdup(c);
+ if (status == ID_STATUS_ONLINE) {
+ set_status(YAHOO_CUSTOM_STATUS, c, 0);
+ }
+ else if (status != ID_STATUS_INVISIBLE) {
+ set_status(YAHOO_CUSTOM_STATUS, c, 1);
+ }
+ }
+ else {
+ set_status(status, NULL, 0);
+ m_startMsg = NULL;
+ }
+
+ mir_free(c);
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// PS_GETMYAWAYMSG
+
+INT_PTR __cdecl CYahooProto::GetMyAwayMsg(WPARAM, LPARAM lParam)
+{
+ if (!m_bLoggedIn || !m_startMsg)
+ return 0;
+
+ if (lParam & SGMA_UNICODE) {
+ return (INT_PTR)mir_utf8decodeW(m_startMsg);
+ }
+ else {
+ return (INT_PTR)mir_utf8decodeA(m_startMsg);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// UserIsTyping - sends a UTN notification
+
+int __cdecl CYahooProto::UserIsTyping(MCONTACT hContact, int type)
+{
+ if (!m_bLoggedIn)
+ return 0;
+
+ char *szProto = GetContactProto(hContact);
+ if (szProto == NULL || mir_strcmp(szProto, m_szModuleName))
+ return 0;
+
+ DBVARIANT dbv;
+ if (!getString(hContact, YAHOO_LOGINID, &dbv)) {
+ if (type == PROTOTYPE_SELFTYPING_OFF || type == PROTOTYPE_SELFTYPING_ON) {
+ sendtyping(dbv.pszVal, getWord(hContact, "yprotoid", 0), type == PROTOTYPE_SELFTYPING_ON ? 1 : 0);
+ }
+ db_free(&dbv);
+ }
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// OnEvent - maintain protocol events
+
+int __cdecl CYahooProto::OnEvent(PROTOEVENTTYPE eventType, WPARAM wParam, LPARAM lParam)
+{
+ switch (eventType) {
+ case EV_PROTO_ONLOAD: return OnModulesLoadedEx(0, 0);
+ case EV_PROTO_ONOPTIONS: return OnOptionsInit(wParam, lParam);
+
+ case EV_PROTO_ONMENU:
+ MenuMainInit();
+ break;
+
+ case EV_PROTO_ONCONTACTDELETED:
+ return OnContactDeleted(wParam, lParam);
+
+ case EV_PROTO_DBSETTINGSCHANGED:
+ return OnSettingChanged(wParam, lParam);
+ }
+ return 1;
+}
+
+INT_PTR CALLBACK first_run_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ DBVARIANT dbv;
+ CYahooProto* ppro = (CYahooProto*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
+
+ switch (msg) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault(hwndDlg);
+
+ ppro = (CYahooProto*)lParam;
+ SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
+
+ if (!ppro->getString(YAHOO_LOGINID, &dbv)) {
+ SetDlgItemTextA(hwndDlg, IDC_HANDLE, dbv.pszVal);
+ db_free(&dbv);
+ }
+
+ if (!ppro->getString(YAHOO_PASSWORD, &dbv)) {
+ SetDlgItemTextA(hwndDlg, IDC_PASSWORD, dbv.pszVal);
+ db_free(&dbv);
+ }
+
+ return TRUE;
+
+ case WM_COMMAND:
+ if (LOWORD(wParam) == IDC_NEWYAHOOACCOUNTLINK) {
+ Utils_OpenUrl("http://edit.yahoo.com/config/eval_register");
+ return TRUE;
+ }
+
+ if (HIWORD(wParam) == EN_CHANGE && (HWND)lParam == GetFocus()) {
+ switch (LOWORD(wParam)) {
+ case IDC_HANDLE:
+ case IDC_PASSWORD:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ break;
+
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->code == (UINT)PSN_APPLY) {
+ char str[128];
+ bool reconnectRequired = false;
+
+ GetDlgItemTextA(hwndDlg, IDC_HANDLE, str, _countof(str));
+
+ if (ppro->getString(YAHOO_LOGINID, &dbv)) {
+ reconnectRequired = true;
+ }
+ else {
+ if (mir_strcmp(str, dbv.pszVal))
+ reconnectRequired = true;
+ db_free(&dbv);
+ }
+
+ ppro->setString(YAHOO_LOGINID, str);
+ GetDlgItemTextA(hwndDlg, IDC_PASSWORD, str, _countof(str));
+
+ if (ppro->getString(YAHOO_PASSWORD, &dbv)) {
+ reconnectRequired = true;
+ }
+ else {
+ if (mir_strcmp(str, dbv.pszVal))
+ reconnectRequired = true;
+ db_free(&dbv);
+ }
+
+ ppro->setString(YAHOO_PASSWORD, str);
+
+ if (reconnectRequired) {
+ ppro->delSetting(YAHOO_PWTOKEN);
+ if (ppro->m_bLoggedIn)
+ MessageBox(hwndDlg, TranslateT("These changes will take effect the next time you connect to the Yahoo network."), TranslateT("Yahoo options"), MB_OK);
+ }
+ return TRUE;
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+INT_PTR CYahooProto::SvcCreateAccMgrUI(WPARAM, LPARAM lParam)
+{
+ return (INT_PTR)CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_YAHOOACCOUNT),
+ (HWND)lParam, first_run_dialog, (LPARAM)this);
+}