#!/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); }