I am very happy to release very first tSim class to manage smartphone Sim cards.
This class just read/write/delete phone book entries from smartphone sim.
I do not have time to make a complete demo... But here are some guidelines...
* You need to include "#include sim.ch" at beginning of your prg.
* You have to initialize sim before using any method of this class. So code should be something like this:
Code: Select all
LOCAL o
o := tSim():New()
o:lInitialize()
// your code here
o:End() // Make an implicit Deinitialize
Code: Select all
LOCAL o, nTotal, nUsed
o := tSim():New()
o:lInitialize()
IF !o:lNumberOfPhoneBookEntries(SIM_PBSTORAGE_SIM, @nTotal, @nUsed)
MsgInfo("Error accessing SIM ("+STR(o:nLastError)+")","Error")
RETURN NIL
ENDIF
MsgInfo("There are "+Str(nTotal)+" entries and "+STR(nUsed)+" are used.".)
o:End()
* The phonebook entry are four fields plus 1. Methods which read entries always return it in a multidimensional array. For example, for reading entry number 5 you do the following.
Code: Select all
LOCAL o, a
o := tSim():New()
o:lInitialize()
IF !o:lGetSimPhoneEntry( 110, SIM_PBSTORAGE_SIM, @a )
MsgInfo("Pos 110 error ("+STR(o:nLastError))
ELSE
Aeval(a, {| n, m | MsgInfo("Phone: "+n[1]+CRLF+"Name: "+n[2]+CRLF+"Adr. Type: "+STR( n[3])+CRLF+"Plan Type: "+STR( n[4]),"pos 110") })
ENDIF
o:End()
{ { _PHONE_NUMBER_, _TEXT_, _ADR_TYPE_, _PLAN_TYPE_}, {...}, ... }
First Element is (normally) number, the seconds is the name. Third and four element should be investigated by you
There are 2 files. First is 'TestTapi.prg' which contain tSim class. Second file is sim.ch.
In bat file you have to include these two libs.
echo %vcdir%\lib\arm\sms.lib >> msvc.tmp
echo %vcdir%\lib\arm\cellcore.lib >> msvc.tmp
Well, here is testtapi.prg (It has Harbour Licence)
Code: Select all
/*
* Harbour Project source code:
* Quick Clipper Browse()
*
* Copyright 2009 José Luis Capel <jlcapel@hotmail.com>
* 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.
*
*/
#include "sim.ch"
//----------------------------------------------------------------------------//
/*
function Main()
LOCAL o
LOCAL l
LOCAL nTotal, nUsed
LOCAL a
o := tSim():New()
l := o:lInitialize()
IF l
MsgInfo("Api Sim initialized!!"+STR( o:nLastError))
Else
MsgInfo("Api Sim NOT initialized!!. Error "+STR(o:nLastError))
ENDIF
IF !o:lGetSimPhoneEntry( 1, SIM_PBSTORAGE_SIM, @a )
MsgInfo("Pos 1 error")
ELSE
MsgInfo("VALTYPE-> "+VALTYPE(a)+" LEN -> "+STR(LEN(a)),a[1][1])
Aeval(a, {| n, m | MsgInfo("Phone: "+n[1]+CRLF+"Name: "+n[2]+CRLF+"Adr. Type: "+STR( n[3])+CRLF+"Plan Type: "+STR( n[4]),"pos 1") })
ENDIF
IF !o:lGetSimPhoneEntry( 110, SIM_PBSTORAGE_SIM, @a )
MsgInfo("Pos 123 error")
ELSE
Aeval(a, {| n, m | MsgInfo("Phone: "+n[1]+CRLF+"Name: "+n[2]+CRLF+"Adr. Type: "+STR( n[3])+CRLF+"Plan Type: "+STR( n[4]),"pos 110") })
ENDIF
IF !o:lSetSimPhoneEntry( 80, SIM_PBSTORAGE_SIM, "660099696", "pepeluis", SIM_NUMPLAN_UNKNOWN, SIM_ADDRTYPE_NATIONAL )
MsgInfo("Error writing pos 80 Errpr=>"+STR(o:nLastError))
ENDIF
IF !o:lDelSimPhoneEntry(80,SIM_PBSTORAGE_SIM)
MsgInfo("Error deletein pos 80 Errpr=>"+STR(o:nLastError))
ENDIF
l := o:lDeInitialize()
IF !l
MsgInfo("Not De-Initialized SIM api. Error :"+STR(o:nLastError))
ELSE
MsgInfo("Api Sim Deinitialized!!!")
ENDIF
o:End()
return nil
*/
CLASS tsim FROM xSim
ENDCLASS
CLASS xSim
DATA lInitialized
DATA hSim
DATA nLastError
METHOD New() CONSTRUCTOR
METHOD End()
METHOD lInitialize() // Must be initialized before any other method
METHOD lDeInitialize() // Must be deinitialized....
METHOD lNumberOfPhoneBookEntries( nType, nTotal , nUsed ) // nTotal nUsed both by reference
METHOD aGetAllPhoneBookEntries( nType ) // --> array with PhoneBookEntries of nType storage
METHOD lGetSimPhoneEntry( nPos, nType, aEntry ) // --> aEntry by refence contais phonebookentry
METHOD lSetSimPhoneEntry( nPos, nType, cNumber, cName, nPlan, nAddrType ) // .T. / .F. if phonebookentry written
METHOD lDelSimPhoneEntry( nPos, nType ) //// .T. / .F. if phonebookentry deleted
ENDCLASS
METHOD New() CLASS xSim
::lInitialized := .F.
::hSim := 0
RETURN Self
METHOD lInitialize() CLASS xSim
LOCAL nResult
nResult := Sim_Initialize( @::hSim ) // hSim by reference!!
::lInitialized := nResult == SIM_E_OK
::nLastError := nResult
RETURN ::lInitialized
METHOD lDeInitialize() CLASS xSim
LOCAL nResult
IF !::lInitialized
::nLastError := SIM_E_NOTINITIALIZED
RETURN .F.
ENDIF
nResult := Sim_DeInitialize( ::hSim )
::lInitialized := !( nResult == SIM_E_OK)
::nLastError := nResult
RETURN nResult == SIM_E_OK
METHOD lNumberOfPhoneBookEntries( nType, nTotal , nUsed ) CLASS xSim // nTotal and nUsed by reference
LOCAL nResult
IF !::lInitialized
::nLastError := SIM_E_NOTINITIALIZED
RETURN .F.
ENDIF
DEFAULT nType := SIM_PBSTORAGE_SIM
nResult := Sim_PhoneBookEntries(::hSim, nType, @nTotal, @nUsed )
::nLastError := nResult
RETURN nResult == SIM_E_OK
METHOD aGetAllPhoneBookEntries( nType ) CLASS xSim
LOCAL nResult
LOCAL nTotal
LOCAL nUsed
LOCAL aEntry
LOCAL aEntries
LOCAL nPos
IF !::lInitialized
::nLastError := SIM_E_NOTINITIALIZED
RETURN .F.
ENDIF
DEFAULT nType := SIM_PBSTORAGE_SIM
DEFAULT aEntries := {}
IF !::lNumberOfPhoneBookEntries( nType, @nTotal, @nUsed )
RETURN {}
ENDIF
FOR nPos := 1 TO nUsed
aEntry := {}
nResult := Sim_ReadPhoneBookEntry(::hSim, nType, nPos, @aEntry)
IF nResult != SIM_E_OK
::nLastError := nResult
EXIT
ELSE
AADD(aEntries, aEntry)
ENDIF
NEXT
::nLastError := nResult
RETURN aEntries
METHOD lGetSimPhoneEntry( nPos, nType, aEntry ) CLASS xSim
LOCAL nResult
LOCAL a
IF !::lInitialized
::nLastError := SIM_E_NOTINITIALIZED
RETURN .F.
ENDIF
DEFAULT nType := SIM_PBSTORAGE_SIM
nResult := Sim_ReadPhoneBookEntry(::hSim, nType, nPos, @a)
aEntry := {}
AADD(aEntry,a)
::nLastError := nResult
RETURN nResult == SIM_E_OK
METHOD lSetSimPhoneEntry( nPos, nType, cNumber, cName, nPlan, nAddrType ) CLASS xSim
LOCAL nResult
IF !::lInitialized
::nLastError := SIM_E_NOTINITIALIZED
RETURN .F.
ENDIF
DEFAULT nPos := SIM_PBINDEX_FIRSTAVAILABLE
DEFAULT nType := SIM_PBSTORAGE_SIM
nResult := Sim_WritePhoneBookEntry(::hSim, nType, nPos, cNumber, cName, nPlan, nAddrType)
::nLastError := nResult
RETURN nResult == SIM_E_OK
METHOD lDelSimPhoneEntry( nPos, nType ) CLASS xSim
LOCAL nResult
IF !::lInitialized
::nLastError := SIM_E_NOTINITIALIZED
RETURN .F.
ENDIF
DEFAULT nType := SIM_PBSTORAGE_SIM
nResult := Sim_DeletePhoneBookEntry(::hSim, nType, nPos)
::nLastError := nResult
RETURN nResult == SIM_E_OK
METHOD End() CLASS xSim
IF ::lInitialized
::lDeInitialize()
ENDIF
RETURN NIL
#pragma BEGINDUMP
#include <hbapi.h>
#include <windows.h>
#include <sms.h>
HB_FUNC( SEND_SMS ) // cMessage, cNumber
{
SMS_HANDLE smshHandle;
SMS_ADDRESS smsaDestination;
TEXT_PROVIDER_SPECIFIC_DATA tpsd;
SMS_MESSAGE_ID smsmidMessageID = 0;
wchar_t * sztMessage = HB_TCHAR_CONVTO( hb_parc(1) );
wchar_t * sztPhoneNumber = HB_TCHAR_CONVTO( hb_parc(2) );
BOOL bInternational = *sztPhoneNumber == '+' ? TRUE : FALSE ;
// try to open an SMS Handle
HRESULT hr = SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL);
if (hr != ERROR_SUCCESS) {
HB_TCHAR_FREE(sztMessage);
HB_TCHAR_FREE(sztPhoneNumber);
hb_retc("ERROR - Can't open Sms system");
return ;
}
// Create the destination address
memset (&smsaDestination, 0, sizeof (smsaDestination) );
smsaDestination.smsatAddressType = bInternational ? SMSAT_INTERNATIONAL : SMSAT_NATIONAL;
lstrcpy(smsaDestination.ptsAddress, sztPhoneNumber);
// Set up provider specific data
tpsd.dwMessageOptions = PS_MESSAGE_OPTION_NONE;
tpsd.psMessageClass = PS_MESSAGE_CLASS0;
tpsd.psReplaceOption = PSRO_NONE;
// Send the message, indicating success or failure
hr = SmsSendMessage (smshHandle, NULL, &smsaDestination, NULL,
(PBYTE) sztMessage, _tcslen(sztMessage) * sizeof(wchar_t),
(PBYTE) &tpsd,12, SMSDE_OPTIMAL,
SMS_OPTION_DELIVERY_NONE, &smsmidMessageID);
switch( hr )
{
case S_OK :
hb_retc("OK");
break;
case E_FAIL :
hb_retc("ERROR - E_FAIL");
break;
case E_INVALIDARG :
hb_retc("ERROR - E_INVALIDARG");
break;
case E_OUTOFMEMORY :
hb_retc("ERROR - E_OUTOFMEMORY");
break;
case E_UNEXPECTED :
hb_retc("ERROR - E_UNEXPECTED");
break;
case SMS_E_TOOMUCHDATA :
hb_retc("ERROR - SMS_E_TOOMUCHDATA");
break;
case SMS_E_INVALIDDATA :
hb_retc("ERROR - SMS_E_INVALIDDATA");
break;
case SMS_E_BUFFERTOOSMALL :
hb_retc("ERROR - SMS_E_BUFFERTOOSMALL");
break;
case SMS_E_PROVIDERSPECIFICBUFFERWRONGSIZE :
hb_retc("ERROR - SMS_E_PROVIDERSPECIFICBUFFERWRONGSIZE");
break;
case SMS_E_TIMEUNAVAILABLE :
hb_retc("ERROR - SMS_E_TIMEUNAVAILABLE");
break;
case SMS_E_UNKNOWNSCADDRESS :
hb_retc("ERROR - SMS_E_UNKNOWNSCADDRESS");
break;
case SMS_E_RECEIVEHANDLEALREADYOPEN :
hb_retc("ERROR - SMS_E_RECEIVEHANDLEALREADYOPEN");
break;
case SMS_E_DESTINATIONOUTOFSVC :
hb_retc("ERROR - SMS_E_DESTINATIONOUTOFSVC");
break;
case SMS_E_INVALIDADDRESS :
hb_retc("ERROR - SMS_E_INVALIDADDRESS");
break;
case SMS_E_MSGBARREDBYOPERATOR :
hb_retc("ERROR - SMS_E_MSGBARREDBYOPERATOR");
break;
case SMS_E_MSGCALLBARRED :
hb_retc("ERROR - SMS_E_MSGCALLBARRED");
break;
case SMS_E_NOSCSUBSCRIPTION :
hb_retc("ERROR - SMS_E_NOSCSUBSCRIPTION");
break;
case SMS_E_SCBUSY :
hb_retc("ERROR - SMS_E_SCBUSY");
break;
case SMS_E_SVCNOTSUBSCRIBED :
hb_retc("ERROR - SMS_E_SVCNOTSUBSCRIBED");
break;
case SMS_E_UNASSIGNEDNUMBER :
hb_retc("ERROR - SMS_E_UNASSIGNEDNUMBER");
break;
case SMS_E_UNIDENTIFIEDSUBCRIBER :
hb_retc("ERROR - SMS_E_UNIDENTIFIEDSUBCRIBER");
break;
default :
hb_retc("ERROR - NO ERROR CODE");
break;
}
SmsClose (smshHandle);
HB_TCHAR_FREE(sztMessage);
HB_TCHAR_FREE(sztPhoneNumber);
return;
}
#pragma ENDDUMP
#pragma BEGINDUMP
#include <hbapi.h>
#include <windows.h>
#include <simmgr.h>
#include <hbapiitm.h>
LONG Sim_ErrCode( HRESULT hResult);
HB_FUNC( SIM_INITIALIZE ) // lNotifications, hSim by reference
{
HSIM hSim = 0;
/////////////BOOL bNotifications = HB_IS_NIL(1) ? FALSE : hb_parl(1); This gpf's!!!
HRESULT hResult;
hResult = SimInitialize(0 , NULL, 0 , &hSim);
hb_stornl( hResult == S_OK ? (LONG) hSim : 0, 1 ); // Passing hSim to first param by ref
hb_retnl(Sim_ErrCode( hResult ) );
return;
}
HB_FUNC( SIM_DEINITIALIZE ) // hSim
{
HSIM hSim = (HSIM) hb_parnl(1) ;
HRESULT hResult;
hResult = SimDeinitialize(hSim) ;
hb_retnl(Sim_ErrCode(hResult)); // Check SIM Manager Error Constants S_OK --> Success , any other error
return;
}
HB_FUNC( SIM_PHONEBOOKENTRIES ) // hSim, nLocation, @nTotal, @nUsed
{
HSIM hSim = (HSIM) hb_parnl(1);
DWORD dwLocation = (DWORD) hb_parni(2);
DWORD dwUsed = 0, dwTotal = 0;
HRESULT hResult ;
hResult = SimGetPhonebookStatus ( hSim, dwLocation, &dwUsed, &dwTotal);
hb_stornl( hResult == S_OK ? (LONG) dwTotal : 0, 3 ) ;
hb_stornl( hResult == S_OK ? (LONG) dwUsed : 0, 4 ) ;
hb_retnl(Sim_ErrCode(hResult)); // Check SIM Manager Error Constants S_OK --> Success , any other error
return;
}
HB_FUNC( SIM_READPHONEBOOKENTRY ) // hSim, nLocation, nPos, @aEntry
{
HSIM hSim = (HSIM) hb_parnl(1);
DWORD dwLocation = (DWORD) hb_parni(2);
DWORD dwIndex = (DWORD) hb_parni(3);
HRESULT hResult ;
SIMPHONEBOOKENTRY PhoneEntry;
PHB_ITEM pArray = hb_itemNew( NULL );
char * lpszAddress;
char * lpszText;
PhoneEntry.cbSize = sizeof(SIMPHONEBOOKENTRY);
hResult = SimReadPhonebookEntry ( hSim, dwLocation ,dwIndex, &PhoneEntry);
lpszAddress = HB_TCHAR_CONVFROM(PhoneEntry.lpszAddress);
lpszText = HB_TCHAR_CONVFROM(PhoneEntry.lpszText);
hb_arrayNew( pArray, 5 ); // 5 elements
hb_arraySetC( pArray, 1, lpszAddress ); // a string
hb_arraySetC( pArray, 2, lpszText ); // a string
hb_arraySetNL( pArray, 3, PhoneEntry.dwAddressType ); // a number
hb_arraySetNL( pArray, 4, PhoneEntry.dwNumPlan ); // a number
hb_arraySetNI( pArray, 5, dwIndex ); // index
hb_itemCopy( hb_param( 4, HB_IT_ANY ), pArray );
hb_itemRelease( pArray );
HB_TCHAR_FREE( lpszAddress );
HB_TCHAR_FREE( lpszText );
hb_retnl(Sim_ErrCode(hResult)); // Check SIM Manager Error Constants S_OK --> Success , any other error
return;
}
HB_FUNC( SIM_WRITEPHONEBOOKENTRY ) // hSim, nLocation, nPos, cNumber, cName, nPlan, nAddrType
{
HRESULT hResult ;
SIMPHONEBOOKENTRY PhoneEntry;
wchar_t * lpwszAddress;
wchar_t * lpwszText;
lpwszAddress = HB_TCHAR_CONVTO( hb_parc(4) );
lpwszText = HB_TCHAR_CONVTO( hb_parc(5) );
PhoneEntry.cbSize = sizeof(SIMPHONEBOOKENTRY);
PhoneEntry.dwParams = SIM_PARAM_PBE_ALL;
wcsncpy(PhoneEntry.lpszAddress, lpwszAddress, MAX_LENGTH_ADDRESS);
wcsncpy(PhoneEntry.lpszText, lpwszText, MAX_LENGTH_PHONEBOOKENTRYTEXT);
PhoneEntry.dwAddressType = (DWORD) hb_parnl(7);
PhoneEntry.dwNumPlan = (DWORD) hb_parnl(6);
hResult = SimWritePhonebookEntry ( (HSIM) hb_parnl(1), (DWORD) hb_parni(2) ,(DWORD) hb_parni(3), &PhoneEntry);
HB_TCHAR_FREE( lpwszAddress );
HB_TCHAR_FREE( lpwszText );
hb_retnl(Sim_ErrCode(hResult)); // Check SIM Manager Error Constants S_OK --> Success , any other error
return;
}
HB_FUNC( SIM_DELETEPHONEBOOKENTRY ) // hSim, nLocation, nPos
{
HRESULT hResult ;
hResult = SimDeletePhonebookEntry ( (HSIM) hb_parnl(1), (DWORD) hb_parni(2) ,(DWORD) hb_parni(3) );
hb_retnl(Sim_ErrCode(hResult)); // Check SIM Manager Error Constants S_OK --> Success , any other error
return;
}
LONG Sim_ErrCode( HRESULT hResult )
{
switch( hResult)
{
case S_OK :
return(0);
case SIM_E_SIMFAILURE :
return(-100);
case SIM_E_SIMBUSY :
return(-200);
case SIM_E_SIMWRONG :
return(-300);
case SIM_E_NOSIMMSGSTORAGE :
return(-400);
case SIM_E_SIMTOOLKITBUSY :
return(-500);
case SIM_E_SIMDOWNLOADERROR :
return(-600);
case SIM_E_SIMNOTINSERTED :
return(-700);
case SIM_E_PHSIMPINREQUIRED :
return(-800);
case SIM_E_PHFSIMPINREQUIRED :
return(-900);
case SIM_E_PHFSIMPUKREQUIRED :
return(-1000);
case SIM_E_SIMPINREQUIRED :
return(-1100);
case SIM_E_SIMPUKREQUIRED :
return(-1200);
case SIM_E_INCORRECTPASSWORD :
return(-1300);
case SIM_E_SIMPIN2REQUIRED :
return(-1400);
case SIM_E_SIMPUK2REQUIRED :
return(-1500);
case SIM_E_NETWKPINREQUIRED :
return(-1600);
case SIM_E_NETWKPUKREQUIRED :
return(-1700);
case SIM_E_SUBSETPINREQUIRED :
return(-1800);
case SIM_E_SUBSETPUKREQUIRED :
return(-1900);
case SIM_E_SVCPINREQUIRED :
return(-2000);
case SIM_E_SVCPUKREQUIRED :
return(-2100);
case SIM_E_CORPPINREQUIRED :
return(-2200);
case SIM_E_CORPPUKREQUIRED :
return(-2300);
case SIM_E_MEMORYFULL :
return(-2400);
case SIM_E_INVALIDINDEX :
return(-2500);
case SIM_E_NOTFOUND :
return(-2600);
case SIM_E_MEMORYFAILURE :
return(-2700);
case SIM_E_SIMMSGSTORAGEFULL :
return(-2800);
case SIM_E_EMPTYINDEX :
return(-2900);
case SIM_E_NOTREADY :
return(-3000);
case SIM_E_SECURITYFAILURE :
return(-3100);
case SIM_E_BUFFERTOOSMALL :
return(-3200);
case SIM_E_NOTTEXTMESSAGE :
return(-3300);
case SIM_E_NOSIM :
return(-3400);
case SIM_E_NETWORKERROR :
return(-3500);
case SIM_E_MOBILEERROR :
return(-3600);
case SIM_E_UNSUPPORTED :
return(-3700);
case SIM_E_BADPARAM :
return(-3800);
case SIM_E_UNDETERMINED :
return(-3900);
case SIM_E_RADIONOTPRESENT :
return(-4000);
case SIM_E_RADIOOFF :
return(-4100);
}
return (-9999) ;
}
#pragma ENDDUMP
And here sim.ch
Code: Select all
/*
* Harbour Project source code:
* Quick Clipper Browse()
*
* Copyright 2009 José Luis Capel <jlcapel@hotmail.com>
* Some parts Copyright MicroSoft Corp.
* 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.
*
*/
// Error Codes for SIM api
#define SIM_E_OK 0 // This is non standard...
#define SIM_E_NOTINITIALIZED -10 // This is non standard (class tsim not initialized sim)
#define SIM_E_UNESPECTEDERROR -9999 // This error means that an error catched but not in list bellow...
#define SIM_E_SIMFAILURE -100 // @constdefine SIM failure was detected
#define SIM_E_SIMBUSY -200 // @constdefine SIM is busy
#define SIM_E_SIMWRONG -300 // @constdefine Inorrect SIM was inserted
#define SIM_E_NOSIMMSGSTORAGE -400 // @constdefine SIM isn't capable of storing messages
#define SIM_E_SIMTOOLKITBUSY -500 // @constdefine SIM Application Toolkit is busy
#define SIM_E_SIMDOWNLOADERROR -600 // @constdefine SIM data download error
#define SIM_E_SIMNOTINSERTED -700 // @constdefine SIM isn't inserted into the phone
#define SIM_E_PHSIMPINREQUIRED -800// @constdefine PH-SIM PIN is required to perform this operation
#define SIM_E_PHFSIMPINREQUIRED -900 // @constdefine PH-FSIM PIN is required to perform this operation
#define SIM_E_PHFSIMPUKREQUIRED -1000 // @constdefine PH-FSIM PUK is required to perform this operation
#define SIM_E_SIMPINREQUIRED -1100 // @constdefine SIM PIN is required to perform this operation
#define SIM_E_SIMPUKREQUIRED -1200 // @constdefine SIM PUK is required to perform this operation
#define SIM_E_INCORRECTPASSWORD -1300 // @constdefine Incorrect password was supplied
#define SIM_E_SIMPIN2REQUIRED -1400 // @constdefine SIM PIN2 is required to perform this operation
#define SIM_E_SIMPUK2REQUIRED -1500 // @constdefine SIM PUK2 is required to perform this operation
#define SIM_E_NETWKPINREQUIRED -1600 // @constdefine Network Personalization PIN is required to perform this operation
#define SIM_E_NETWKPUKREQUIRED -1700 // @constdefine Network Personalization PUK is required to perform this operation
#define SIM_E_SUBSETPINREQUIRED -1800 // @constdefine Network Subset Personalization PIN is required to perform this operation
#define SIM_E_SUBSETPUKREQUIRED -1900 // @constdefine Network Subset Personalization PUK is required to perform this operation
#define SIM_E_SVCPINREQUIRED -2000 // @constdefine Service Provider Personalization PIN is required to perform this operation
#define SIM_E_SVCPUKREQUIRED -2100 // @constdefine Service Provider Personalization PUK is required to perform this operation
#define SIM_E_CORPPINREQUIRED -2200 // @constdefine Corporate Personalization PIN is required to perform this operation
#define SIM_E_CORPPUKREQUIRED -2300 // @constdefine Corporate Personalization PUK is required to perform this operation
#define SIM_E_MEMORYFULL -2400 // @constdefine Storage memory is full
#define SIM_E_INVALIDINDEX -2500 // @constdefine Invalid storage index was supplied
#define SIM_E_NOTFOUND -2600 // @constdefine A requested storage entry was not found
#define SIM_E_MEMORYFAILURE -2700 // @constdefine Storage memory failure
#define SIM_E_SIMMSGSTORAGEFULL -2800 // @constdefine Message storage on the SIM is full
#define SIM_E_EMPTYINDEX -2900 // @constdefine Storage location is empty
#define SIM_E_NOTREADY -3100 // @constdefine SIM isn't yet ready to perform the requested operation
#define SIM_E_SECURITYFAILURE -3200 // @constdefine SIM isn't yet ready to perform the requested operation
#define SIM_E_BUFFERTOOSMALL -3300 // @constdefine Buffer too small
#define SIM_E_NOTTEXTMESSAGE -3400 // @constdefine Requested SMS message is not a text message
#define SIM_E_NOSIM -3500 // @constdefine Device doesn't have a SIM
#define SIM_E_NETWORKERROR -3600 // @constdefine There was a network error
#define SIM_E_MOBILEERROR -3700 // @constdefine Mobile error
#define SIM_E_UNSUPPORTED -3800 // @constdefine The command is unsupported
#define SIM_E_BADPARAM -3900 // @constdefine Bad parameter
#define SIM_E_UNDETERMINED -4000 // @constdefine Undetermined error
#define SIM_E_RADIONOTPRESENT -4100 // @constdefine The Radio is not present
#define SIM_E_RADIOOFF -4200 // @constdefine The Radio is off
// Phone book storage locations
#define SIM_PBSTORAGE_EMERGENCY (0x00000001) // @constdefine Emergency dial list
#define SIM_PBSTORAGE_FIXEDDIALING (0x00000002) // @constdefine SIM fixed dialing list
#define SIM_PBSTORAGE_LASTDIALING (0x00000004) // @constdefine SIM last dialing list
#define SIM_PBSTORAGE_OWNNUMBERS (0x00000008) // @constdefine SIM ownnumbers lists
#define SIM_PBSTORAGE_SIM (0x00000010) // @constdefine General SIM Storage
#define SIM_NUMPBSTORAGES 5 // @constdefine Number of phonebook storages
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
// @doc EXTERNAL
//
// @constants Phonebook Misc | Special phonebook constants
//
// @comm None
//
// -----------------------------------------------------------------------------
#define SIM_PBINDEX_FIRSTAVAILABLE (0xffffffff) // @constdefine Use first phonebook storage entry available
// -----------------------------------------------------------------------------
//
// @doc EXTERNAL
//
// @constants Numbering Plan | Defines different numbering plans for SIM_ADDRTYPE_UNKNOWN,
// SIM_ADDRTYPE_INTERNATIONAL, and SIM_ADDRTYPE_NATIONAL
//
// @comm None
//
// -----------------------------------------------------------------------------
#define SIM_NUMPLAN_UNKNOWN (0x00000000) // @constdefine Unknown
#define SIM_NUMPLAN_TELEPHONE (0x00000001) // @constdefine ISDN/telephone numbering plan (E.164/E.163)
#define SIM_NUMPLAN_DATA (0x00000002) // @constdefine Data numbering plan (X.121)
#define SIM_NUMPLAN_TELEX (0x00000003) // @constdefine Telex numbering plan
#define SIM_NUMPLAN_NATIONAL (0x00000004) // @constdefine National numbering plan
#define SIM_NUMPLAN_PRIVATE (0x00000005) // @constdefine Private numbering plan
#define SIM_NUMPLAN_ERMES (0x00000006) // @constdefine ERMES numbering plan (ETSI DE/PS 3 01-3)
// -----------------------------------------------------------------------------
//
// @doc EXTERNAL
//
// @constants Address Type | Defines different address types
//
// @comm None
//
// -----------------------------------------------------------------------------
#define SIM_ADDRTYPE_UNKNOWN (0x00000000) // @constdefine Unknown
#define SIM_ADDRTYPE_INTERNATIONAL (0x00000001) // @constdefine International number
#define SIM_ADDRTYPE_NATIONAL (0x00000002) // @constdefine National number
#define SIM_ADDRTYPE_NETWKSPECIFIC (0x00000003) // @constdefine Network specific number
#define SIM_ADDRTYPE_SUBSCRIBER (0x00000004) // @constdefine Subscriber number (protocol-specific)
#define SIM_ADDRTYPE_ALPHANUM (0x00000005) // @constdefine Alphanumeric address
#define SIM_ADDRTYPE_ABBREV (0x00000006) // @constdefine Abbreviated number
#xcommand DEFAULT <uVar1> := <uVal1> ;
[, <uVarN> := <uValN> ] => ;
<uVar1> := If( <uVar1> == nil, <uVal1>, <uVar1> ) ;;
[ <uVarN> := If( <uVarN> == nil, <uValN>, <uVarN> ); ]