; ACTSYNC
;
; Programma per Proteus
;
; (C) 2005 Simone Zanella Productions
;
; Introduce in emulazione di tastiera i dati presenti in un file localizzato su un dispositivo connesso via
; ActiveSync.
; Questo programma può essere installato come script associato al servizio Proteus.
;
; I parametri si trovano all'inizio del programma e sono:
; - TIMEOUT = timeout in millisecondi per la risposta del dispositivo
; - KILLFILE = flag che indica se cancellare il file dopo averlo trasmesso; se 0,
; il file non viene rimosso, ma non viene più ritrasmesso finché non cambia la data/ora/dimensione;
; - TEMPFILE = nome del file temporaneo (dove scaricare i dati prima di inviarli in emulazione tastiera)
; - FILENAME = file del terminale da scaricare
; - POSTFIX = terminatore
;
; In dettaglio, il programma esegue le seguenti operazioni:
; - verifica se c'è un dispositivo collegato ed il file da scaricare;
; - se lo trova, lo scarica nel file temporaneo e lo invia in emulazione di tastiera;
; - se è richiesta la cancellazione, rimuove il file, oppure verifica la data/ora/dimensione
; e torna ad inviare il file solo quando uno di questi dati cambia.
;
; Il codice commentato più sotto permette anche in alternativa di:
; - selezionare una specifica finestra (applicativo Ultra-Edit) ed inviare il dato verbatim, seguito da Invio;
; - lanciare il blocco note (se non aperto), introdurre il dato verbatim (seguito da Invio) e tornare alla finestra
; iniziale.
#!proteus -z -j
!extern CEGetFile, PROTEXT.DLL, ProteusCEGetFile, 4, 0
!extern CEFileInfo, PROTEXT.DLL, ProteusCEFileInfo, 2, 560
!include "win32.prt"
CONST TIMEOUT = 3000
CONST KILLFILE = 0
CONST TEMPFILE = "C:\\ACTSYNC.TMP"
CONST FILENAME = "/My Documents/dati.txt"
CONST POSTFIX = "{ENTER}"
LASTCEFIND = ""
WHILE 1
; Rimuove il file temporaneo
FREMOVE(TEMPFILE)
IF KILLFILE
; Se il file viene rimosso dopo la trasmissione, lo prelevo direttamente
RESULT = CEGetFile(FILENAME, TEMPFILE, TIMEOUT, KILLFILE)
ELSE
; Verifico data/ora del file e lo scarico solo se cambiate
CEFIND = CEFileInfo(FILENAME, TIMEOUT)
; Se non è un servizio e l'utente ha premuto ESC, esce
!ifndef SERVICE
IF KBDHIT()
IF EQ(GETCH(), 27)
BREAK
FI
FI
!endif
IF ISNOTEMPTY(CEFIND)
IF STRNEQ(LEFT(CEFIND, 304), LEFT(LASTCEFIND, 304))
RESULT = CEGetFile(FILENAME, TEMPFILE, TIMEOUT, KILLFILE)
IF EQ(RESULT, 0)
CEFIND = CEFileInfo(FILENAME, TIMEOUT)
IF ISNOTEMPTY(CEFIND)
LASTCEFIND = CEFIND
FI
FI
ELSE
RESULT = -1
FI
ELSE
RESULT = -1
FI
FI
; Se non è un servizio e l'utente ha premuto ESC, esce
!ifndef SERVICE
IF KBDHIT()
IF EQ(GETCH(), 27)
BREAK
FI
FI
!endif
IF EQ(RESULT, 0)
H = FOPEN(TEMPFILE, 1)
IF EQ(H, -1)
CONTINUE
FI
WHILE NOT(FEOF(H))
Dato1 = FREADLN(H)
; >>> Codice di esempio commentato (funzionamento alternativo) <<<
;
; Seleziona una specifica finestra (che sappiamo essere sicuramente esistente) prima di
; inviare il dato in emulazione di tastiera, senza ulteriori elaborazioni, tranne l'aggiunta del postfisso.
;
; IF STRLEN(Dato1)
; W32SETFOCUS(W32FINDWINDOW("*ULTRAEDIT-32*"))
; W32SENDKEYS(KTrans(Dato1) POSTFIX)
; FI
; CONTINUE
; >>> Codice di esempio commentato (funzionamento alternativo) <<<
;
; Seleziona la finestra del Blocco note; se non esiste, lancia il programma, attende 2 secondi, quindi
; introduce il dato in emulazione di tastiera, senza ulteriori elaborazioni.
; Il fuoco (= finestra in primo piano) al termine torna all'applicazione precedentemente in evidenza.
;
; IF STRLEN(Dato1)
; Hold = W32GETFOCUS()
;
; HW = W32FINDWINDOW("*Blocco note*")
; IF EQ(HW, 0)
; W32SHELL("NOTEPAD.EXE")
; SLEEP(2)
; HW = W32FINDWINDOW("*Blocco note*")
; FI
; IF NEQ(HW, 0)
; W32SETFOCUS(HW)
; W32SENDKEYS(KTrans(Dato1) POSTFIX)
; ELSE
; CONSOLELN "Impossibile aprire blocco note!"
; FI
; W32SETFOCUS(Hold)
; FI
; CONTINUE
W32SENDKEYS(KTrans(Dato1) POSTFIX)
LOOP
FCLOSE(H)
FI
LOOP
ABORT 0
FUNCTION KTrans(s)
; Mappatura dei caratteri speciali: caratteri che non si trovano
; sulla tastiera potrebbero richiedere l'introduzione della sequenza
; con ALT + numero
l = STRLEN(s)
r = ""
FOR x = 1 TO l
c = SUBSTR(s, x, 1)
SWITCH c STREQ
ON "~"
r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD6}{ALT UP}"
ON "{"
r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD3}{ALT UP}"
ON "}"
r = r "{ALT DOWN}{NUMPAD1}{NUMPAD2}{NUMPAD5}{ALT UP}"
ON "+", "^", "%", "(", ")", "[", "]"
r = r "{" c "}"
OTHER
r = r c
OFF
NEXT
RETURN r