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