From 948023ab13ce7a1c22feb7119915b6b6f8bfba3d Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 15 May 2010 15:47:11 +0000 Subject: [PATCH] 2010-05-15 17:43 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * harbour.spec * contrib/Makefile + contrib/hbsms + contrib/hbsms/tests + contrib/hbsms/tests/send.prg + contrib/hbsms/tests/hbmk.hbm + contrib/hbsms/hbsms.prg + contrib/hbsms/hbsms.hbc + contrib/hbsms/Makefile * utils/hbmk2/examples/contribf.hbc + Readded hbsms lib. + Modified to use newly added core com functions via HBCT .prg level interface. (instead of hbtpathy) + Added disclaimer: EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES. The code well may be pure crap, so if you have problem with it, supply working patches. Pls note that the reader function uses locally implemented timeout functionality, which may or may not work at all, though you can fix it if you have better idea. I've only tested it using Mac OS X 10.6 + old Nokia "S40" phone and one bad SMS number to see it kicks off at all and that's also the end of my testing possibilities. --- harbour/ChangeLog | 25 ++ harbour/contrib/Makefile | 1 + harbour/contrib/hbsms/Makefile | 14 + harbour/contrib/hbsms/hbsms.hbc | 9 + harbour/contrib/hbsms/hbsms.prg | 308 ++++++++++++++++++++++ harbour/contrib/hbsms/tests/hbmk.hbm | 7 + harbour/contrib/hbsms/tests/send.prg | 24 ++ harbour/harbour.spec | 2 +- harbour/utils/hbmk2/examples/contribf.hbc | 2 +- 9 files changed, 390 insertions(+), 2 deletions(-) create mode 100644 harbour/contrib/hbsms/Makefile create mode 100644 harbour/contrib/hbsms/hbsms.hbc create mode 100644 harbour/contrib/hbsms/hbsms.prg create mode 100644 harbour/contrib/hbsms/tests/hbmk.hbm create mode 100644 harbour/contrib/hbsms/tests/send.prg diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 2778441abb..8c0019d794 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,31 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-05-15 17:43 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) + * harbour.spec + * contrib/Makefile + + contrib/hbsms + + contrib/hbsms/tests + + contrib/hbsms/tests/send.prg + + contrib/hbsms/tests/hbmk.hbm + + contrib/hbsms/hbsms.prg + + contrib/hbsms/hbsms.hbc + + contrib/hbsms/Makefile + * utils/hbmk2/examples/contribf.hbc + + Readded hbsms lib. + + Modified to use newly added core com functions + via HBCT .prg level interface. (instead of hbtpathy) + + Added disclaimer: + EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES. + The code well may be pure crap, so if you have problem + with it, supply working patches. Pls note that the + reader function uses locally implemented timeout + functionality, which may or may not work at all, + though you can fix it if you have better idea. + I've only tested it using Mac OS X 10.6 + old Nokia "S40" + phone and one bad SMS number to see it kicks off at + all and that's also the end of my testing possibilities. + 2010-05-15 15:17 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) * src/rtl/gtwvt/gtwvt.c - Deleted notifierblock/fireevent support. diff --git a/harbour/contrib/Makefile b/harbour/contrib/Makefile index 0fb1a12842..352586181e 100644 --- a/harbour/contrib/Makefile +++ b/harbour/contrib/Makefile @@ -21,6 +21,7 @@ DIRS := \ hbnetio \ hbnf \ hbodbc \ + hbsms \ hbsqlit3 \ hbtip \ hbtpathy \ diff --git a/harbour/contrib/hbsms/Makefile b/harbour/contrib/hbsms/Makefile new file mode 100644 index 0000000000..60b3f08f6d --- /dev/null +++ b/harbour/contrib/hbsms/Makefile @@ -0,0 +1,14 @@ +# +# $Id: Makefile 12881 2009-11-15 04:31:21Z vszakats $ +# + +ROOT := ../../ + +include $(TOP)$(ROOT)config/global.mk + +LIBNAME := hbsms + +PRG_SOURCES := \ + hbsms.prg \ + +include $(TOP)$(ROOT)config/lib.mk diff --git a/harbour/contrib/hbsms/hbsms.hbc b/harbour/contrib/hbsms/hbsms.hbc new file mode 100644 index 0000000000..3ec2da0ec0 --- /dev/null +++ b/harbour/contrib/hbsms/hbsms.hbc @@ -0,0 +1,9 @@ +# +# $Id: hbsms.hbc 12881 2009-11-15 04:31:21Z vszakats $ +# + +incpaths=. + +libs=hbsms + +libs=../hbct/hbct.hbc diff --git a/harbour/contrib/hbsms/hbsms.prg b/harbour/contrib/hbsms/hbsms.prg new file mode 100644 index 0000000000..9efc60cb9b --- /dev/null +++ b/harbour/contrib/hbsms/hbsms.prg @@ -0,0 +1,308 @@ +/* + * $Id: hbsms.prg 13863 2010-02-13 17:32:18Z vszakats $ + */ + +/* + * Harbour Project source code: + * SMS library. EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES. + * + * Copyright 2009-2010 Viktor Szakats (harbour.01 syenar.hu) + * www - http://www.harbour-project.org + * + * 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, 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 software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/). + * + * As a special exception, the Harbour Project gives permission for + * additional uses of the text contained in its release of Harbour. + * + * The exception is that, if you link the Harbour libraries with other + * files to produce an executable, this does not by itself cause the + * resulting executable to be covered by the GNU General Public License. + * Your use of that executable is in no way restricted on account of + * linking the Harbour library code into it. + * + * This exception does not however invalidate any other reasons why + * the executable file might be covered by the GNU General Public License. + * + * This exception applies only to the code released by the Harbour + * Project under the name Harbour. If you copy code from other + * Harbour Project or Free Software Foundation releases into a copy of + * Harbour, as the General Public License permits, the exception does + * not apply to the code that you add in this way. To avoid misleading + * anyone as to the status of such modified files, you must delete + * this exception notice from them. + * + * If you write modifications of your own for Harbour, it is your choice + * whether to permit this exception to apply to your modifications. + * If you do not wish that, delete this exception notice. + * + */ + +/* TODO: - Unicode support */ +/* TODO: - Receive support */ + +/* NOTE: Source of information: + http://www.smssolutions.net/tutorials/gsm/receivesmsat/ + http://www.developershome.com/sms/readSmsByAtCommands.asp + [vszakats] */ + +#include "common.ch" + +STATIC FUNCTION port_send( h, s ) + RETURN com_send( h, s ) + +/* NOTE: EXPERIMENTAL CODE. USE AT YOUR OWN RISK. NO GUARANTEES. */ +STATIC FUNCTION port_rece( h, n, t ) + LOCAL cString + LOCAL nEnd + + IF ! ISNUMBER( n ) + n := 64 + ENDIF + + IF ! ISNUMBER( t ) + t := 5 + ENDIF + + cString := "" + nEnd := hb_milliSeconds() + ( t * 1000 ) + DO WHILE Len( cString ) < t .AND. hb_milliSeconds() < nEnd + cString += com_read( h, n - Len( cString ) ) + hb_idleSleep( 0.01 ) + ENDDO + + RETURN cString + +FUNCTION sms_Send( cPort, cPhoneNo, cText, lNotification, cPIN ) + LOCAL smsctx + LOCAL nRetVal + + IF ! Empty( smsctx := smsctx_New( cPort ) ) + smsctx_PIN( smsctx, cPIN ) + nRetVal := smsctx_Send( smsctx, cPhoneNo, cText, lNotification ) + smsctx_Close( smsctx ) + ELSE + nRetVal := -99 + ENDIF + + RETURN nRetVal + +FUNCTION sms_ReceiveAll( cPort, cPIN ) + LOCAL smsctx + LOCAL aRetVal + + IF ! Empty( smsctx := smsctx_New( cPort ) ) + smsctx_PIN( smsctx, cPIN ) + aRetVal := smsctx_Receive( smsctx ) + smsctx_Close( smsctx ) + ELSE + aRetVal := NIL + ENDIF + + RETURN aRetVal + +/* --------------------- */ + +#define _SMSCTX_xHnd 1 +#define _SMSCTX_cPIN 2 +#define _SMSCTX_cPrevName 3 +#define _SMSCTX_MAX_ 3 + +FUNCTION smsctx_New( xPort ) + LOCAL smsctx[ _SMSCTX_MAX_ ] + + IF ISNUMBER( xPort ) + smsctx[ _SMSCTX_xHnd ] := xPort + smsctx[ _SMSCTX_cPrevName ] := NIL + ELSEIF ISCHARACTER( xPort ) + smsctx[ _SMSCTX_xHnd ] := 1 + smsctx[ _SMSCTX_cPrevName ] := com_DevName( smsctx[ _SMSCTX_xHnd ], xPort ) + ELSE + smsctx[ _SMSCTX_xHnd ] := NIL + ENDIF + + IF smsctx[ _SMSCTX_xHnd ] != NIL + IF com_Open( smsctx[ _SMSCTX_xHnd ] ) + IF com_Init( smsctx[ _SMSCTX_xHnd ], 9600, "N", 8, 1 ) + RETURN smsctx + ELSE + com_Close( smsctx[ _SMSCTX_xHnd ] ) + ENDIF + ENDIF + ENDIF + + RETURN NIL + +FUNCTION smsctx_Close( smsctx ) + + IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_ + RETURN .F. + ENDIF + + IF ! com_Close( smsctx[ _SMSCTX_xHnd ] ) + RETURN .F. + ENDIF + + /* Restore com port name */ + IF smsctx[ _SMSCTX_cPrevName ] != NIL + com_DevName( smsctx[ _SMSCTX_xHnd ], smsctx[ _SMSCTX_cPrevName ] ) + ENDIF + + RETURN .T. + +FUNCTION smsctx_Send( smsctx, cPhoneNo, cText, lNotification ) + LOCAL tmp + + IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_ + RETURN -1 + ENDIF + + port_send( smsctx[ _SMSCTX_xHnd ], "ATE0V1Q0" + Chr( 13 ) ) + IF IsOK( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) + + port_send( smsctx[ _SMSCTX_xHnd ], "AT+CMGF=1" + Chr( 13 ) ) + IF StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK" + + IF ! Empty( smsctx[ _SMSCTX_cPIN ] ) + port_send( smsctx[ _SMSCTX_xHnd ], 'AT+CPIN="' + smsctx[ _SMSCTX_cPIN ] + '"' + Chr( 13 ) ) + IF !( StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK" ) + RETURN -5 + ENDIF + ENDIF + + port_send( smsctx[ _SMSCTX_xHnd ], "AT+CMGF=1" + Chr( 13 ) ) + IF StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK" + + IF ISLOGICAL( lNotification ) + port_send( smsctx[ _SMSCTX_xHnd ], "AT+CSMP?" + Chr( 13 ) ) + tmp := GetLines( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) + IF Len( tmp ) < 2 + RETURN -6 + ENDIF + IF !( ATail( tmp ) == "OK" ) + RETURN -7 + ENDIF + IF !( Left( tmp[ 1 ], Len( "+CSMP: " ) ) == "+CSMP: " ) + RETURN -8 + ENDIF + tmp := GetList( SubStr( tmp[ 1 ], Len( "+CSMP: " ) + 1 ) ) + IF Len( tmp ) > 1 + IF lNotification + tmp[ 1 ] := hb_ntos( hb_bitSet( Val( tmp[ 1 ] ), 5 ) ) + ELSE + tmp[ 1 ] := hb_ntos( hb_bitReset( Val( tmp[ 1 ] ), 5 ) ) + ENDIF + port_send( smsctx[ _SMSCTX_xHnd ], "AT+CSMP=" + MakeList( tmp ) + Chr( 13 ) ) + IF !( StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "OK" ) + RETURN -9 + ENDIF + ENDIF + ENDIF + + port_send( smsctx[ _SMSCTX_xHnd ], 'AT+CMGS="' + cPhoneNo + '"' + Chr( 13 ) ) + IF StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) == "> " + port_send( smsctx[ _SMSCTX_xHnd ], StrTran( cText, Chr( 13 ) ) + Chr( 26 ) ) + tmp := StripCRLF( port_rece( smsctx[ _SMSCTX_xHnd ] ) ) + IF Left( tmp, Len( "+CMGS: " ) ) == "+CMGS: " + RETURN 0 + ELSE + RETURN -10 + ENDIF + ELSE + RETURN -11 + ENDIF + ELSE + RETURN -12 + ENDIF + ELSE + RETURN -4 + ENDIF + ELSE + RETURN -3 + ENDIF + + RETURN -2 + +FUNCTION smsctx_Receive( smsctx ) + + IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_ + RETURN NIL + ENDIF + + // ... + + RETURN {} + +FUNCTION smsctx_PIN( smsctx, cPIN ) + LOCAL cOldValue + + IF ! ISARRAY( smsctx ) .OR. Len( smsctx ) != _SMSCTX_MAX_ + RETURN NIL + ENDIF + + cOldValue := smsctx[ _SMSCTX_cPIN ] + IF cPIN == NIL .OR. ( ISCHARACTER( cPIN ) .AND. Len( cPIN ) == 4 ) + smsctx[ _SMSCTX_cPIN ] := cPIN + ENDIF + + RETURN cOldValue + +STATIC FUNCTION StripCR( cString ) + RETURN StrTran( cString, Chr( 13 ) ) + +STATIC FUNCTION StripCRLF( cString ) + RETURN StrTran( cString, Chr( 13 ) + Chr( 10 ) ) + +STATIC FUNCTION IsOK( cString ) + LOCAL tmp := GetLines( cString ) + + RETURN ! Empty( tmp ) .AND. ATail( tmp ) == "OK" + +STATIC FUNCTION GetLines( cString ) + LOCAL aLine := {} + LOCAL tmp + + IF Left( cString, 2 ) == Chr( 13 ) + Chr( 10 ) + cString := SubStr( cString, Len( Chr( 13 ) + Chr( 10 ) ) + 1 ) + ENDIF + IF Right( cString, 2 ) == Chr( 13 ) + Chr( 10 ) + cString := hb_StrShrink( cString, Len( Chr( 13 ) + Chr( 10 ) ) ) + ENDIF + + FOR EACH tmp IN hb_ATokens( StrTran( cString, Chr( 13 ) ), Chr( 10 ) ) + AAdd( aLine, tmp ) + NEXT + + RETURN aLine + +STATIC FUNCTION GetList( cString ) + LOCAL aList := {} + LOCAL tmp + + FOR EACH tmp IN hb_ATokens( cString, "," ) + AAdd( aList, tmp ) + NEXT + + RETURN aList + +STATIC FUNCTION MakeList( aList ) + LOCAL cString := "" + LOCAL tmp + + FOR EACH tmp IN aList + cString += tmp + "," + NEXT + + RETURN hb_StrShrink( cString, 1 ) diff --git a/harbour/contrib/hbsms/tests/hbmk.hbm b/harbour/contrib/hbsms/tests/hbmk.hbm new file mode 100644 index 0000000000..ff140d731b --- /dev/null +++ b/harbour/contrib/hbsms/tests/hbmk.hbm @@ -0,0 +1,7 @@ +# +# $Id: hbmk.hbm 12880 2009-11-15 04:22:05Z vszakats $ +# + +../hbsms.hbc + +-w3 -es2 diff --git a/harbour/contrib/hbsms/tests/send.prg b/harbour/contrib/hbsms/tests/send.prg new file mode 100644 index 0000000000..6816bd9ca8 --- /dev/null +++ b/harbour/contrib/hbsms/tests/send.prg @@ -0,0 +1,24 @@ +/* + * $Id: send.prg 12880 2009-11-15 04:22:05Z vszakats $ + */ + +/* + * Copyright 2009-2010 Viktor Szakats (harbour.01 syenar.hu) + * www - http://www.harbour-project.org + */ + +#include "common.ch" + +PROCEDURE Main( cPort ) + +#if defined( __PLATFORM__WINDOWS ) + DEFAULT cPort TO "\\.\COM22" +#elif defined( __PLATFORM__DARWIN ) + DEFAULT cPort TO "/dev/cu.myport-COM1-1" +#endif + + ? "start" + ? sms_Send( cPort, "555555555", "test msg", .T. ) + ? "end" + + RETURN diff --git a/harbour/harbour.spec b/harbour/harbour.spec index 662f6c7725..484ed1d9ef 100644 --- a/harbour/harbour.spec +++ b/harbour/harbour.spec @@ -69,7 +69,7 @@ %define hb_ldir export HB_LIB_INSTALL=%{_libdir}/%{name} %define hb_edir export HB_ETC_INSTALL=%{hb_etcdir} %define hb_cmrc export HB_BUILD_NOGPLLIB=%{?_without_gpllib:yes} -%define hb_ctrb export HB_CONTRIBLIBS="hbblink hbbtree hbclipsm hbct hbgt hbmisc hbmzip hbnetio hbtip hbtpathy hbhpdf hbziparc hbfoxpro hbfship hbxpp xhb rddbmcdx rddsql sddsqlt3 hbnf %{?_with_allegro:gtalleg} %{?_with_cairo:hbcairo} %{?_with_cups:hbcups} %{?_with_curl:hbcurl} %{?_with_firebird:hbfbird sddfb} %{?_with_freeimage:hbfimage} %{?_with_gd:hbgd} %{?_with_mysql:hbmysql sddmy} %{?_with_odbc:hbodbc sddodbc} %{?_with_pgsql:hbpgsql sddpg} %{?_with_qt:hbqt hbxbp} %{?_with_ads:rddads}" +%define hb_ctrb export HB_CONTRIBLIBS="hbblink hbbtree hbclipsm hbct hbgt hbmisc hbmzip hbnetio hbtip hbtpathy hbhpdf hbziparc hbfoxpro hbsms hbfship hbxpp xhb rddbmcdx rddsql sddsqlt3 hbnf %{?_with_allegro:gtalleg} %{?_with_cairo:hbcairo} %{?_with_cups:hbcups} %{?_with_curl:hbcurl} %{?_with_firebird:hbfbird sddfb} %{?_with_freeimage:hbfimage} %{?_with_gd:hbgd} %{?_with_mysql:hbmysql sddmy} %{?_with_odbc:hbodbc sddodbc} %{?_with_pgsql:hbpgsql sddpg} %{?_with_qt:hbqt hbxbp} %{?_with_ads:rddads}" %define hb_env %{hb_plat} ; %{hb_cc} ; %{hb_cflag} ; %{hb_lflag} ; %{hb_dflag} ; %{hb_gpm} ; %{hb_crs} ; %{hb_sln} ; %{hb_x11} ; %{hb_local} ; %{hb_bdir} ; %{hb_idir} ; %{hb_ldir} ; %{hb_edir} ; %{hb_ctrb} ; %{hb_cmrc} %define hb_host www.harbour-project.org %define readme README.RPM diff --git a/harbour/utils/hbmk2/examples/contribf.hbc b/harbour/utils/hbmk2/examples/contribf.hbc index 572e312e44..5420db70e9 100644 --- a/harbour/utils/hbmk2/examples/contribf.hbc +++ b/harbour/utils/hbmk2/examples/contribf.hbc @@ -6,7 +6,7 @@ # [ This should be kept in sync with local Makefile information. ] # contribs portable, with no external dependencies: -libs=hbblink hbbtree hbclipsm hbct hbfoxpro hbfship hbgt hbmisc hbmzip minizip hbnf hbtpathy hbxpp hbziparc rddbmcdx rddsql xhb +libs=hbblink hbbtree hbclipsm hbct hbfoxpro hbfship hbgt hbmisc hbmzip minizip hbnf hbsms hbtpathy hbxpp hbziparc rddbmcdx rddsql xhb # contribs portable, with external dependencies: libs=hbcurl hbfbird hbgd hbhpdf hbmysql hbpgsql hbqt hbtip sddfb sddmy sddpg