The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl
# $Id: o2sms4w 290 2006-08-10 22:45:00Z mackers $

use strict;
use warnings;

use Win32::GUI;
use WWW::SMS::IE::iesms;
use WWW::SMS::IE::o2sms;
use WWW::SMS::IE::vodasms;
use WWW::SMS::IE::meteorsms;
use WWW::SMS::IE::threesms;
use Getopt::Long 2.33;
use vars qw( $VERSION );
use Data::Dumper;

$VERSION = sprintf("1.%02d", q$Revision: 290 $ =~ /(\d+)/);
my $last_changed_date = $& if (q$LastChangedDate: 2006-08-11 00:45:00 +0200 (Fri, 11 Aug 2006) $ =~ /\d{4}-\d{2}-\d{2}/);

# ..

# TODO
# - callbacks
# - save username/password
# - address book

# Global Variables

my $username;
my $password;
my $debug = 0;
my $carrier;

# Process options

GetOptions("debug|verbose|d" => \$debug);
print "Starting debug mode\n" if $debug;

# MAIN Window Definition

my $mainWin = Win32::GUI::Window->new(
	-name		=> 'MainWin',
	-text		=> "o2sms",
	-width		=> 500,
	-height		=> 500,
	-hashelp	=> 0,
	-resizable	=> 0,
	-hasmaximize	=> 0,
	-dialogui	=> 1,
	);

$mainWin->AddTextfield(
	-name		=> 'NumberTxt',
	-left		=> 5,
	-top		=> 5,
	-width		=> 190,
	-height		=> 20,
	-prompt 	=> [ "Recipient:", 50 ],
	-tabstop	=> 1,
	);

$mainWin->AddTextfield(
	-name		=> 'MessageTxt',
	-left		=> 5,
	-top		=> 30,
	-width		=> 240,
	-height 	=> 80,
	-multiline	=> 1,
	-tabstop	=> 1,
	);

$mainWin->AddButton(
	-name		=> 'CloseBut',
	-cancel		=> 1,
	-tabstop	=> 0,
	-visible	=> 0,
	);

$mainWin->AddButton(
	-name		=> 'SendBut',
	-text		=> 'Send Message',
	-left		=> 75,
	-top		=> 115,
	-width		=> 100,
	-height		=> 20,
	-ok		=> 1,
	-tabstop	=> 1,
	-disabled	=> 1,
	);

$mainWin->Resize(
	250 + $mainWin->Width() - $mainWin->ScaleWidth(),
	160 + $mainWin->Height() - $mainWin->ScaleHeight(),
	);

my $sb = $mainWin->AddStatusBar(
	-text		=> "Version $VERSION ($last_changed_date) by mackers"
	);

$mainWin->Center();

# LOGIN Window Definition

my $loginWin = Win32::GUI::DialogBox->new(
	-name		=> 'LoginWin',
	-text		=> 'o2sms',
	-width		=> 110,
	-height		=> 65,
	-hashelp	=> 0,
	-parent		=> $mainWin,
	);

$loginWin->AddTextfield(
	-name		=> 'UsernameTxt',
	-left		=> 5,
	-top		=> 5,
	-width		=> 100,
	-height		=> 20,
	-prompt 	=> [ "Username:", 55 ],
	-tabstop	=> 1,
	);

$loginWin->AddTextfield(
	-name		=> 'PasswordTxt',
	-left		=> 5,
	-top		=> 30,
	-width		=> 100,
	-height		=> 20,
	-prompt 	=> [ "Password:", 55 ],
	-tabstop	=> 1,
	-password	=> 1,
	);

$loginWin->AddLabel(
	-text		=> 'Provider:',
	-left		=> 5,
	-top		=> 58,
	-width		=> 55,
	-height		=> 20,
	-align		=> 'left',
	);

$loginWin->AddCombobox(
	-name		=> 'CarrierLst',
	-left		=> 60,
	-top		=> 55,
	-width		=> 100,
	-height		=> 100,
	-tabstop	=> 1,
	-dropdown	=> 0,
	-dropdownlist	=> 1,
	 -nointegraleheight => 0,
	-hasstring	=> 0,
	-simple		=> 1,
	);

$loginWin->CarrierLst->Add('o2.ie', 'vodafone.ie', 'meteor.ie', 'three.ie');
$loginWin->CarrierLst->Select(0);

$loginWin->AddButton(
	-name		=> 'LoginBut',
	-text		=> 'Login',
	-left		=> 22,
	-top		=> 90,
	-width		=> 50,
	-height		=> 20,
	-ok		=> 1,
	-tabstop	=> 1,
	-disabled	=> 1,
	);

$loginWin->AddButton(
	-name		=> 'CancelBut',
	-text		=> 'Cancel',
	-left		=> 94,
	-top		=> 90,
	-width		=> 50,
	-height		=> 20,
	-cancel		=> 1,
	-tabstop	=> 1,
	);

$loginWin->Resize(
	165 + $loginWin->Width() - $loginWin->ScaleWidth(),
	120 + $loginWin->Height() - $loginWin->ScaleHeight(),
	);

$loginWin->Center();

# Show the login or main window

if (defined($username)) # || $carrier->is_logged_in())
{
	$mainWin->Show();
	$mainWin->NumberTxt->SetFocus();
}
else
{
	$loginWin->Show();
	$loginWin->UsernameTxt->SetFocus();
}

# GUI Loop

Win32::GUI::Dialog();
exit(0);

# MAIN Window Events

sub MainWin_Terminate
{
	return -1;
}

sub NumberTxt_Change
{
	Check_MainWin_Enablings();
	return 1;
}

sub MessageTxt_Change
{
	Check_MainWin_Enablings();
	return 1;
}

sub CloseBut_Click
{
	print "here\n";
	return -1;
}

sub SendBut_Click
{
	return Send_Message();
}

sub MessageTxt_KeyDown()
{
	# need to handle our own keyboard events in this multiline textfield for some reason.

	if ($_[1] == 27)
	{
		exit(0);
	}
	elsif ($_[1] == 13)
	{
		Send_Message();
		return 0;
	}
	elsif ($_[1] == 9)
	{
		my $key = Win32::GUI::GetKeyboardState;

		if ($key->[0x10])
		{
			$mainWin->NumberTxt->SetFocus();
			$mainWin->NumberTxt->SelectAll();
		}
		else
		{
			$mainWin->SendBut->SetFocus();
		}

		return 0;
	}

	return 1;
}

# LOGIN Window Events

sub CancelBut_Click
{
	return -1;
}

sub LoginBut_Click
{
	$username = $loginWin->UsernameTxt->Text();
	$password = $loginWin->PasswordTxt->Text();

#	if ($username eq "" || $password eq "")
#	{
#		Error_MessageBox("Please enter a username and password", $loginWin);
#		$loginWin->UsernameTxt->SetFocus();
#		return 0;
#	}

	# select carrier
	my $carrierSel = $loginWin->CarrierLst->GetCurSel();

	if ($carrierSel == 0)
	{
		$carrier = new WWW::SMS::IE::o2sms;
	}
	elsif ($carrierSel == 1)
	{
		$carrier = new WWW::SMS::IE::vodasms;
	}
	elsif ($carrierSel == 2)
	{
		$carrier = new WWW::SMS::IE::meteorsms;
	}
	elsif ($carrierSel == 3)
	{
		$carrier = new WWW::SMS::IE::threesms;
	}
		
	# set up carrier
	$carrier->debug($debug);

	# set up main window
	$loginWin->Hide();
	$mainWin->Show();
	$mainWin->NumberTxt->SetFocus();
	$mainWin->MessageTxt->MaxLength($carrier->max_length());

	return 0;
}

sub PasswordTxt_Change
{
	Check_LoginWin_Enablings();
	return 1;
}

sub UsernameTxt_Change
{
	Check_LoginWin_Enablings();
	return 1;
}

# Misc methods

sub Send_Message
{
	my $number = $mainWin->NumberTxt->Text();
	my $message = $mainWin->MessageTxt->Text();

	if (($number = $carrier->validate_number($number)) == -1)
	{
		Error_MessageBox($carrier->validate_number_error());
		return 0;
	}

#	if (length($message) > $carrier->max_length())
#	{
#		Error_MessageBox("Message is " . length($message) . " characters.\nThe maximum length for a message is " . $carrier->max_length() . ".");
#		return 0;
#	}

	$mainWin->NumberTxt->Disable();
	$mainWin->MessageTxt->Disable();
	$mainWin->CloseBut->Disable();
	$mainWin->SendBut->Disable();

	my $logged_in = $carrier->is_logged_in();

	if ($logged_in)
	{
		$sb->Text("Reusing last login for $username\@" . $carrier->domain_name() . " ...");
	}
	else
	{
		$sb->Text("Logging in to $username\@" . $carrier->domain_name() . " ...");

		if ($logged_in = $carrier->login($username, $password))
		{
			$sb->Text("Login successful");
		}
	}

	if ($logged_in)
	{
		sleep(1);
		$sb->Text("Sending message to $number ...");

		my $retval = $carrier->send($number, $message);

		if (!$retval)
		{
			print $carrier->error() . "\n";
			Error_MessageBox("Message sending failed:\n\n" . $carrier->error());
			$sb->Text("Ready");
		}
		else
		{
			$sb->Text("Message sent, " . $carrier->remaining_messages() . " remaining this month");
		}
	}
	else
	{
		Error_MessageBox("Login failed:\n\n" . $carrier->error());
		$sb->Text("Ready");
	}

	$mainWin->NumberTxt->Enable();
	$mainWin->MessageTxt->Enable();
	$mainWin->CloseBut->Enable();
	$mainWin->SendBut->Enable();
	$mainWin->NumberTxt->SetFocus();
	$mainWin->NumberTxt->SelectAll();

	return 0;
}

sub Check_LoginWin_Enablings
{
	if ($loginWin->UsernameTxt->Text() ne "" && $loginWin->PasswordTxt->Text() ne "")
	{
		$loginWin->LoginBut->Enable();
	}
	else
	{
		$loginWin->LoginBut->Disable();
	}
}

sub Check_MainWin_Enablings
{
	if ($mainWin->NumberTxt->Text() ne "" && $mainWin->MessageTxt->Text() ne "")
	{
		$mainWin->SendBut->Enable();
	}
	else
	{
		$mainWin->SendBut->Disable();
	}
}

sub Error_MessageBox
{
	my $form;

	if (defined($_[1]))
	{
		$form = $_[1];
	}
	else
	{
		$form = $mainWin;
	}
	
	Win32::GUI::MessageBox($form, $_[0], 'Error', MB_ICONHAND);
}