/*
Copyright © 2009 Jim Porter
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "common.h"
#include "ui.h"
#include
#include
#include "proto.h"
#include "twitter.h"
static const TCHAR *sites[] = {
_T("https://twitter.com/"),
_T("https://identi.ca/api/")
};
INT_PTR CALLBACK first_run_dialog(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
TwitterProto *proto;
switch(msg)
{
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
proto = reinterpret_cast(lParam);
SetWindowLong(hwndDlg, GWL_USERDATA, lParam);
DBVARIANT dbv;
if ( !DBGetContactSettingTString(0, proto->ModuleName(), TWITTER_KEY_UN, &dbv)) {
SetDlgItemText(hwndDlg, IDC_UN, dbv.ptszVal);
DBFreeVariant(&dbv);
}
if ( !DBGetContactSettingString(0, proto->ModuleName(), TWITTER_KEY_PASS, &dbv)) {
CallService(MS_DB_CRYPT_DECODESTRING, strlen(dbv.pszVal)+1,
reinterpret_cast(dbv.pszVal));
SetDlgItemTextA(hwndDlg, IDC_PW, dbv.pszVal);
DBFreeVariant(&dbv);
}
for(size_t i=0; i(sites[i]));
}
if ( !DBGetContactSettingString(0, proto->ModuleName(), TWITTER_KEY_BASEURL, &dbv))
{
SetDlgItemTextA(hwndDlg, IDC_SERVER, dbv.pszVal);
DBFreeVariant(&dbv);
}
else
{
SendDlgItemMessage(hwndDlg, IDC_SERVER, CB_SETCURSEL, 0, 0);
}
return true;
case WM_COMMAND:
if (LOWORD(wParam) == IDC_NEWACCOUNTLINK)
{
CallService(MS_UTILS_OPENURL, 1, reinterpret_cast
("http://twitter.com/signup"));
return true;
}
if (GetWindowLong(hwndDlg, GWL_USERDATA)) // Window is done initializing
{
switch(HIWORD(wParam))
{
case EN_CHANGE:
case CBN_EDITCHANGE:
case CBN_SELCHANGE:
SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
}
}
break;
case WM_NOTIFY:
if (reinterpret_cast(lParam)->code == PSN_APPLY)
{
proto = reinterpret_cast(GetWindowLong(hwndDlg, GWL_USERDATA));
char str[128];
GetDlgItemTextA(hwndDlg, IDC_UN, str, sizeof(str));
DBWriteContactSettingString(0, proto->ModuleName(), TWITTER_KEY_UN, str);
GetDlgItemTextA(hwndDlg, IDC_PW, str, sizeof(str));
CallService(MS_DB_CRYPT_ENCODESTRING, sizeof(str), reinterpret_cast(str));
DBWriteContactSettingString(0, proto->ModuleName(), TWITTER_KEY_PASS, str);
GetDlgItemTextA(hwndDlg, IDC_SERVER, str, sizeof(str)-1);
if (str[strlen(str)-1] != '/')
strncat(str, "/", sizeof(str));
DBWriteContactSettingString(0, proto->ModuleName(), TWITTER_KEY_BASEURL, str);
return true;
}
break;
}
return false;
}
INT_PTR CALLBACK tweet_proc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
TwitterProto *proto;
switch(msg)
{
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
proto = reinterpret_cast(lParam);
SetWindowLong(hwndDlg, GWL_USERDATA, lParam);
SendDlgItemMessage(hwndDlg, IDC_TWEETMSG, EM_LIMITTEXT, 140, 0);
SetDlgItemText(hwndDlg, IDC_CHARACTERS, _T("140"));
// Set window title
TCHAR title[512];
mir_sntprintf(title, SIZEOF(title), _T("Send Tweet for %s"), proto->m_tszUserName);
SendMessage(hwndDlg, WM_SETTEXT, 0, (LPARAM)title);
return true;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
TCHAR msg[141];
proto = reinterpret_cast(GetWindowLong(hwndDlg, GWL_USERDATA));
GetDlgItemText(hwndDlg, IDC_TWEETMSG, msg, SIZEOF(msg));
ShowWindow(hwndDlg, SW_HIDE);
char *narrow = mir_t2a_cp(msg, CP_UTF8);
ForkThread(&TwitterProto::SendTweetWorker, proto, narrow);
EndDialog(hwndDlg, wParam);
return true;
}
else if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hwndDlg, wParam);
return true;
}
else if (LOWORD(wParam) == IDC_TWEETMSG && HIWORD(wParam) == EN_CHANGE)
{
size_t len = SendDlgItemMessage(hwndDlg, IDC_TWEETMSG, WM_GETTEXTLENGTH, 0, 0);
char str[4];
_snprintf(str, sizeof(str), "%d", 140-len);
SetDlgItemTextA(hwndDlg, IDC_CHARACTERS, str);
return true;
}
break;
case WM_SETREPLY:
{
char foo[512];
_snprintf(foo, sizeof(foo), "@%s ", (char*)wParam);
size_t len = strlen(foo);
SetDlgItemTextA(hwndDlg, IDC_TWEETMSG, foo);
SendDlgItemMessage(hwndDlg, IDC_TWEETMSG, EM_SETSEL, len, len);
char str[4];
_snprintf(str, sizeof(str), "%d", 140-len);
SetDlgItemTextA(hwndDlg, IDC_CHARACTERS, str);
return true;
}
break;
}
return false;
}
INT_PTR CALLBACK options_proc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
TwitterProto *proto;
switch(msg)
{
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
proto = reinterpret_cast(lParam);
DBVARIANT dbv;
if ( !DBGetContactSettingString(0, proto->ModuleName(), TWITTER_KEY_UN, &dbv))
{
SetDlgItemTextA(hwndDlg, IDC_UN, dbv.pszVal);
DBFreeVariant(&dbv);
}
if ( !DBGetContactSettingString(0, proto->ModuleName(), TWITTER_KEY_PASS, &dbv))
{
CallService(MS_DB_CRYPT_DECODESTRING, strlen(dbv.pszVal)+1,
reinterpret_cast(dbv.pszVal));
SetDlgItemTextA(hwndDlg, IDC_PW, dbv.pszVal);
DBFreeVariant(&dbv);
}
CheckDlgButton(hwndDlg, IDC_CHATFEED, DBGetContactSettingByte(0,
proto->ModuleName(), TWITTER_KEY_CHATFEED, 0));
for(size_t i=0; i(sites[i]));
}
if ( !DBGetContactSettingString(0, proto->ModuleName(), TWITTER_KEY_BASEURL, &dbv))
{
SetDlgItemTextA(hwndDlg, IDC_BASEURL, dbv.pszVal);
DBFreeVariant(&dbv);
}
else
{
SendDlgItemMessage(hwndDlg, IDC_BASEURL, CB_SETCURSEL, 0, 0);
}
char pollrate_str[32];
mir_snprintf(pollrate_str, sizeof(pollrate_str), "%d",
DBGetContactSettingDword(0, proto->ModuleName(), TWITTER_KEY_POLLRATE, 80));
SetDlgItemTextA(hwndDlg, IDC_POLLRATE, pollrate_str);
// Do this last so that any events propagated by pre-filling the form don't
// instigate a PSM_CHANGED message
SetWindowLong(hwndDlg, GWL_USERDATA, lParam);
break;
case WM_COMMAND:
if (GetWindowLong(hwndDlg, GWL_USERDATA)) // Window is done initializing
{
switch(HIWORD(wParam))
{
case EN_CHANGE:
case BN_CLICKED:
case CBN_EDITCHANGE:
case CBN_SELCHANGE:
switch(LOWORD(wParam))
{
case IDC_UN:
case IDC_PW:
case IDC_BASEURL:
ShowWindow(GetDlgItem(hwndDlg, IDC_RECONNECT), SW_SHOW);
}
SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
}
}
break;
case WM_NOTIFY:
if (reinterpret_cast(lParam)->code == PSN_APPLY)
{
proto = reinterpret_cast(GetWindowLong(hwndDlg, GWL_USERDATA));
char str[128];
GetDlgItemTextA(hwndDlg, IDC_UN, str, sizeof(str));
DBWriteContactSettingString(0, proto->ModuleName(), TWITTER_KEY_UN, str);
GetDlgItemTextA(hwndDlg, IDC_PW, str, sizeof(str));
CallService(MS_DB_CRYPT_ENCODESTRING, sizeof(str), reinterpret_cast(str));
DBWriteContactSettingString(0, proto->ModuleName(), TWITTER_KEY_PASS, str);
GetDlgItemTextA(hwndDlg, IDC_BASEURL, str, sizeof(str)-1);
if (str[strlen(str)-1] != '/')
strncat(str, "/", sizeof(str));
DBWriteContactSettingString(0, proto->ModuleName(), TWITTER_KEY_BASEURL, str);
DBWriteContactSettingByte(0, proto->ModuleName(), TWITTER_KEY_CHATFEED,
IsDlgButtonChecked(hwndDlg, IDC_CHATFEED));
GetDlgItemTextA(hwndDlg, IDC_POLLRATE, str, sizeof(str));
int rate = atoi(str);
if (rate == 0)
rate = 80;
DBWriteContactSettingDword(0, proto->ModuleName(), TWITTER_KEY_POLLRATE, rate);
proto->UpdateSettings();
return true;
}
}
return false;
}
namespace popup_options
{
static int get_timeout(HWND hwndDlg)
{
if (IsDlgButtonChecked(hwndDlg, IDC_TIMEOUT_PERMANENT))
return -1;
else if (IsDlgButtonChecked(hwndDlg, IDC_TIMEOUT_CUSTOM))
{
char str[32];
GetDlgItemTextA(hwndDlg, IDC_TIMEOUT, str, sizeof(str));
return atoi(str);
}
else // Default checked (probably)
return 0;
}
static COLORREF get_text_color(HWND hwndDlg, bool for_db)
{
if (IsDlgButtonChecked(hwndDlg, IDC_COL_WINDOWS))
{
if (for_db)
return -1;
else
return GetSysColor(COLOR_WINDOWTEXT);
}
else if (IsDlgButtonChecked(hwndDlg, IDC_COL_CUSTOM))
return SendDlgItemMessage(hwndDlg, IDC_COLTEXT, CPM_GETCOLOUR, 0, 0);
else // Default checked (probably)
return 0;
}
static COLORREF get_back_color(HWND hwndDlg, bool for_db)
{
if (IsDlgButtonChecked(hwndDlg, IDC_COL_WINDOWS))
{
if (for_db)
return -1;
else
return GetSysColor(COLOR_WINDOW);
}
else if (IsDlgButtonChecked(hwndDlg, IDC_COL_CUSTOM))
return SendDlgItemMessage(hwndDlg, IDC_COLBACK, CPM_GETCOLOUR, 0, 0);
else // Default checked (probably)
return 0;
}
struct
{
TCHAR *name;
TCHAR *text;
} const quotes[] = {
{ _T("Dorothy Parker"), _T("If, with the literate, I am\n")
_T("Impelled to try an epigram, \n")
_T("I never seek to take the credit;\n")
_T("We all assume that Oscar said it.") },
{ _T("Steve Ballmer"), _T("I have never, honestly, thrown a chair in my life.") },
{ _T("James Joyce"), _T("I think I would know Nora's fart anywhere. I think ")
_T("I could pick hers out in a roomful of farting women.") },
{ _T("Brooke Shields"), _T("Smoking kills. If you're killed, you've lost a very ")
_T("important part of your life.") },
{ _T("Yogi Berra"), _T("Always go to other peoples' funerals, otherwise ")
_T("they won't go to yours.") },
};
static void preview(HWND hwndDlg)
{
POPUPDATAT popup = {};
// Pick a random contact
HANDLE hContact = 0;
int n_contacts = CallService(MS_DB_CONTACT_GETCOUNT, 0, 0);
if (n_contacts != 0)
{
int contact = rand() % n_contacts;
hContact = (HANDLE)CallService(MS_DB_CONTACT_FINDFIRST, 0, 0);
for(int i=0; i(&popup), 0);
}
}
void CheckAndUpdateDlgButton(HWND hWnd, int button, BOOL check)
{
CheckDlgButton(hWnd, button, check);
SendMessage(hWnd, WM_COMMAND, MAKELONG(button, BN_CLICKED),
(LPARAM)GetDlgItem(hWnd, button));
}
INT_PTR CALLBACK popup_options_proc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
using namespace popup_options;
TwitterProto *proto;
int text_color, back_color, timeout;
switch(msg)
{
case WM_INITDIALOG:
TranslateDialogDefault(hwndDlg);
proto = reinterpret_cast(lParam);
CheckAndUpdateDlgButton(hwndDlg, IDC_SHOWPOPUPS,
db_byte_get(0, proto->ModuleName(), TWITTER_KEY_POPUP_SHOW, 0));
CheckDlgButton(hwndDlg, IDC_NOSIGNONPOPUPS,
!db_byte_get(0, proto->ModuleName(), TWITTER_KEY_POPUP_SIGNON, 0));
// ***** Get color information
back_color = db_dword_get(0, proto->ModuleName(), TWITTER_KEY_POPUP_COLBACK, 0);
text_color = db_dword_get(0, proto->ModuleName(), TWITTER_KEY_POPUP_COLTEXT, 0);
SendDlgItemMessage(hwndDlg, IDC_COLBACK, CPM_SETCOLOUR, 0, RGB(255, 255, 255));
SendDlgItemMessage(hwndDlg, IDC_COLTEXT, CPM_SETCOLOUR, 0, RGB( 0, 0, 0));
if (back_color == -1 && text_color == -1) // Windows defaults
CheckAndUpdateDlgButton(hwndDlg, IDC_COL_WINDOWS, true);
else if (back_color == 0 && text_color == 0) // Popup defaults
CheckAndUpdateDlgButton(hwndDlg, IDC_COL_POPUP, true);
else // Custom colors
{
CheckAndUpdateDlgButton(hwndDlg, IDC_COL_CUSTOM, true);
SendDlgItemMessage(hwndDlg, IDC_COLBACK, CPM_SETCOLOUR, 0, back_color);
SendDlgItemMessage(hwndDlg, IDC_COLTEXT, CPM_SETCOLOUR, 0, text_color);
}
// ***** Get timeout information
timeout = db_dword_get(0, proto->ModuleName(), TWITTER_KEY_POPUP_TIMEOUT, 0);
SetDlgItemTextA(hwndDlg, IDC_TIMEOUT, "5");
if (timeout == 0)
CheckAndUpdateDlgButton(hwndDlg, IDC_TIMEOUT_DEFAULT, true);
else if (timeout < 0)
CheckAndUpdateDlgButton(hwndDlg, IDC_TIMEOUT_PERMANENT, true);
else
{
char str[32];
_snprintf(str, sizeof(str), "%d", timeout);
SetDlgItemTextA(hwndDlg, IDC_TIMEOUT, str);
CheckAndUpdateDlgButton(hwndDlg, IDC_TIMEOUT_CUSTOM, true);
}
SendDlgItemMessage(hwndDlg, IDC_TIMEOUT_SPIN, UDM_SETRANGE32, 1, INT_MAX);
SetWindowLong(hwndDlg, GWL_USERDATA, lParam);
return true;
case WM_COMMAND:
switch(HIWORD(wParam))
{
case BN_CLICKED:
switch(LOWORD(wParam))
{
case IDC_SHOWPOPUPS:
EnableWindow(GetDlgItem(hwndDlg, IDC_NOSIGNONPOPUPS),
IsDlgButtonChecked(hwndDlg, IDC_SHOWPOPUPS));
break;
case IDC_COL_CUSTOM:
EnableWindow(GetDlgItem(hwndDlg, IDC_COLBACK), true);
EnableWindow(GetDlgItem(hwndDlg, IDC_COLTEXT), true);
break;
case IDC_COL_WINDOWS:
case IDC_COL_POPUP:
EnableWindow(GetDlgItem(hwndDlg, IDC_COLBACK), false);
EnableWindow(GetDlgItem(hwndDlg, IDC_COLTEXT), false);
break;
case IDC_TIMEOUT_CUSTOM:
EnableWindow(GetDlgItem(hwndDlg, IDC_TIMEOUT), true);
EnableWindow(GetDlgItem(hwndDlg, IDC_TIMEOUT_SPIN), true);
break;
case IDC_TIMEOUT_DEFAULT:
case IDC_TIMEOUT_PERMANENT:
EnableWindow(GetDlgItem(hwndDlg, IDC_TIMEOUT), false);
EnableWindow(GetDlgItem(hwndDlg, IDC_TIMEOUT_SPIN), false);
break;
case IDC_PREVIEW:
preview(hwndDlg);
break;
}
case EN_CHANGE:
if (GetWindowLong(hwndDlg, GWL_USERDATA)) // Window is done initializing
SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
}
break;
case WM_NOTIFY:
if (reinterpret_cast(lParam)->code == PSN_APPLY)
{
proto = reinterpret_cast(GetWindowLong(hwndDlg, GWL_USERDATA));
DBWriteContactSettingByte(0, proto->ModuleName(), TWITTER_KEY_POPUP_SHOW,
IsDlgButtonChecked(hwndDlg, IDC_SHOWPOPUPS));
DBWriteContactSettingByte(0, proto->ModuleName(), TWITTER_KEY_POPUP_SIGNON,
!IsDlgButtonChecked(hwndDlg, IDC_NOSIGNONPOPUPS));
// ***** Write color settings
DBWriteContactSettingDword(0, proto->ModuleName(), TWITTER_KEY_POPUP_COLBACK,
get_back_color(hwndDlg, true));
DBWriteContactSettingDword(0, proto->ModuleName(), TWITTER_KEY_POPUP_COLTEXT,
get_text_color(hwndDlg, true));
// ***** Write timeout setting
DBWriteContactSettingDword(0, proto->ModuleName(), TWITTER_KEY_POPUP_TIMEOUT,
get_timeout(hwndDlg));
return true;
}
break;
}
return false;
}