home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 3
/
goldfish_volume_3.bin
/
files
/
util
/
misc
/
ascsend
/
non-mui
/
ascsend-source
/
ascsend.c
next >
Wrap
C/C++ Source or Header
|
1995-06-19
|
20KB
|
687 lines
#include "ascsend.h"
/* ------------------------------------------------------------------- */
/* for cback.o startup */
/* ------------------------------------------------------------------- */
long __stack = 4096;
char *__procname = ASCSEND_VERSION;
long __priority = 0L;
long __BackGroundIO = 0;
extern BPTR _Backstdout;
/* ------------------------------------------------------------------- */
struct TagItem FRTags[] =
{
ASL_Hail,(ULONG)"ASC_Send: Datei auswählen",
ASL_FuncFlags,0L,
ASL_LeftEdge,0L,
ASL_TopEdge,0L,
ASL_Dir,0L,
ASL_Pattern,(ULONG)"~(#?.info)",
ASL_File,0L,
TAG_DONE,0L
};
struct EasyStruct InfoReq =
{
0L,0L,(UBYTE *)"ASC_Send",
(UBYTE *)ASCSEND_VERSION "\n\nFreeware By Lunqual%%MAB@wsb.freinet.de\n",
(UBYTE *)"Beenden|Weiter",
};
UBYTE *version = ASCSEND_VERSION;
struct NewBroker newbroker;
CxObj *broker;
char **tooltypes;
struct List action_list;
struct Node dummy;
ULONG verzoegerung;
ULONG v_char;
ULONG from_inside;
UBYTE reqpath[STRINGSIZE];
UBYTE reqfile[STRINGSIZE];
struct IOStdReq *s_HandlerIO;
struct MsgPort *s_InputPort;
BYTE s_device;
long __OSlibversion = 37;
ULONG filesize;
ULONG filepos;
void __stdargs main(int argc,char **argv)
{
int end = FALSE;
NewList(&action_list);
{
if(OpenBroker(argc,argv))
{
while(!end)
{
Wait(1L << newbroker.nb_Port->mp_SigBit);
if(HandleBroker() == RETURN_QUIT) end = TRUE;
}
CloseBroker();
}
}
exit(0);
}
int OpenBroker(int argc,char **argv)
{
int ret = FALSE;
UBYTE keybuffer[20];
UBYTE filebuffer[20];
if(newbroker.nb_Port = CreateMsgPort())
{
tooltypes = ArgArrayInit(argc,argv);
newbroker.nb_Version = NB_VERSION;
newbroker.nb_Name = "ASCII_SEND";
newbroker.nb_Title = "ASCII Send to Window Tool";
newbroker.nb_Descr = "Sends Textfiles as Inputevents ";
newbroker.nb_Unique = NBU_UNIQUE | NBU_NOTIFY;
newbroker.nb_Pri = (BYTE)ArgInt(tooltypes,"CX_PRIORITY",0);
verzoegerung = (ULONG)ArgInt(tooltypes,"DELAY",0);
v_char = (ULONG)ArgInt(tooltypes,"DELAYCHAR",0);
strncpy(reqpath,ArgString(tooltypes,"REQPATH",""),STRINGSIZE);
strncpy(reqfile,ArgString(tooltypes,"REQFILE",""),STRINGSIZE);
if(broker = CxBroker(&newbroker,NULL))
{
/* make keys */
long i = HOTKEY_BASE;
int end = FALSE;
{
struct a_node *node;
if(node = MakeActionNode(ArgString(tooltypes,"INFOKEY","control alt s"),NULL,
0)) AddTail(&action_list,(struct Node *)node);
}
if(ArgString(tooltypes,"REQUESTKEY","control alt i"))
{
struct a_node *node;
if(node = MakeActionNode(ArgString(tooltypes,"REQUESTKEY","control alt 2"),NULL,
1)) AddTail(&action_list,(struct Node *)node);
}
if(ArgString(tooltypes,"STOPKEY",NULL))
{
struct a_node *node;
if(node = MakeActionNode(ArgString(tooltypes,"STOPKEY","control alt 3"),NULL,
2)) AddTail(&action_list,(struct Node *)node);
}
for(;!end;i++)
{
sprintf(keybuffer,"HOTKEY%ld",i - HOTKEY_BASE);
sprintf(filebuffer,"FILE%ld",i - HOTKEY_BASE);
if(ArgString(tooltypes,keybuffer,NULL))
{
if(ArgString(tooltypes,filebuffer,NULL))
{
struct a_node *node;
if(node = MakeActionNode(ArgString(tooltypes,keybuffer,NULL),
ArgString(tooltypes,filebuffer,NULL),
i))
{
AddTail(&action_list,(struct Node *)node);
ret = TRUE;
}
}
}
else end = TRUE;
}
}
}
if(ret)ActivateCxObj(broker,1L);
return ret;
}
void CloseBroker()
{
struct a_node *n;
struct Message *msg;
if(broker)
{
if(newbroker.nb_Port)
{
while(msg = GetMsg(newbroker.nb_Port))ReplyMsg(msg);
DeletePort(newbroker.nb_Port);
}
while(n = (struct a_node *)RemHead(&action_list))RemActionNode(n);
DeleteCxObjAll(broker);
if(tooltypes)ArgArrayDone();
}
}
struct a_node *MakeActionNode(UBYTE *key,UBYTE *file,LONG ID)
{
struct a_node *node;
if(node = (struct a_node *)AllocVec(sizeof(struct a_node),MEMF_ANY | MEMF_CLEAR))
{
strncpy(node->an_action.hotkey,key,STRINGSIZE);
if(file)strncpy(node->an_action.file,file,STRINGSIZE);
node->an_action.id = ID;
if(node->an_action.key = CxFilter(node->an_action.hotkey))
{
AttachCxObj(broker,node->an_action.key);
if(node->an_action.sender = CxSender(newbroker.nb_Port,ID))
{
AttachCxObj(node->an_action.key,node->an_action.sender);
if(node->an_action.translate = (CxTranslate(NULL)))
{
AttachCxObj(node->an_action.key,node->an_action.translate);
}
}
}
}
return node;
}
void RemActionNode(struct a_node *node)
{
DeleteCxObjAll(node->an_action.key);
FreeVec(node);
}
int HandleBroker()
{
LONG id,type;
int rc = RETURN_IS_OK;
CxMsg *msg;
if(msg = (CxMsg *)GetMsg(newbroker.nb_Port))
{
id = CxMsgID(msg);
type = CxMsgType(msg);
ReplyMsg((struct Message *)msg);
switch(type)
{
case CXM_IEVENT :{
struct a_node *node;
if(node = Findentry(id))
{
if(id == 0)
{
if(EasyRequest(NULL,&InfoReq,NULL) == 1)rc = RETURN_QUIT;
}
else if(id == 1)
{
UBYTE filename[STRINGSIZE];
struct Window *active_wd;
active_wd = IntuitionBase->ActiveWindow;
if(!from_inside)
{
if(showrequest())
{
strncpy(filename,reqpath,STRINGSIZE);
AddPart(filename,reqfile,STRINGSIZE);
ScreenToFront(active_wd->WScreen);
ActivateWindow(active_wd);
rc = Sendfile(filename,GET_A_FILE);
}
}
}
else if(id == 2)
{
rc = RETURN_STOP;
}
else if(!from_inside)rc = Sendfile(node->an_action.file,GET_A_FILE);
}
}
break;
case CXM_COMMAND :
switch(id)
{
case CXCMD_DISABLE : ActivateCxObj(broker,0L);
break;
case CXCMD_ENABLE : ActivateCxObj(broker,1L);
break;
case CXCMD_KILL : if(EasyRequest(NULL,&InfoReq,NULL) == 1)rc = RETURN_QUIT;
break;
case CXCMD_UNIQUE : rc = RETURN_QUIT;
break;
default : break;
}
break;
default : break;
}
}
return rc;
}
long __regargs Sendfile(UBYTE *filename,ULONG mode)
{
int rc = TRUE;
struct InputEvent *ie;
UBYTE buffer[STRINGSIZE];
UBYTE *filebuffer;
int Ldelay = FALSE;
ULONG stop = FALSE;
ULONG v_line;
ULONG v_z;
ULONG fpm;
ULONG brk = IE_COUNT;
if(!makeIHandler())return rc;
v_line = verzoegerung;
v_z = v_char;
from_inside = TRUE;
filepos = 0;
if(filebuffer = getfilebuffer(filename,mode))
{
while((getnextchar(filebuffer,buffer)) && (!stop))
{
*(buffer + 1) = 0;
switch(*buffer)
{
case '\n' : Ldelay = TRUE;
strcpy(buffer,"\\n");
break;
case '\r' : Ldelay = TRUE;
strcpy(buffer,"\\r");
break;
case '\t' : strcpy(buffer,"\\t");
break;
case '\\' : fpm = filepos;
getnextchar(filebuffer,buffer + 1);
*(buffer + 2) = 0;
{
int end = FALSE;
int p = 2;
ULONG v;
if((*(buffer + 1)=='d')||(*(buffer + 1)=='l')||(*(buffer + 1)=='c')||
(*(buffer + 1)=='n')||(*(buffer + 1)=='r')||(*(buffer + 1)=='t'))
{
do
{
if( (*(buffer + 1)=='n')||(*(buffer + 1)=='r')||(*(buffer + 1)=='t'))
{
end = TRUE;
}
else
{
getnextchar(filebuffer,buffer + p);
if(!(isdigit(*(buffer + p))) || (p >= 6))
{
end = TRUE;
*(buffer + p + 1) = 0;
v = atol(buffer + 2);
switch(*(buffer + 1))
{
case 'd' : Delay(v);
break;
case 'l' : v_line = v;
break;
case 'c' : v_z = v;
break;
default : break;
}
*buffer = 0;
filepos -= 1;
}
p++;
if(p >= (STRINGSIZE - 2))end = TRUE;
}
}
while(!end);
}
else
{
UBYTE t[2] = {0,0};
struct InputEvent ev;
if(*(buffer + 1) == '(')
{
getnextchar(filebuffer,buffer + 2);
getnextchar(filebuffer,buffer + 3);
getnextchar(filebuffer,buffer + 4);
getnextchar(filebuffer,buffer + 5);
if((*(buffer + 3) == 'm')&&(*(buffer + 5)==':'))
{
int p = 6;
int py;
int end = FALSE;
while(!end)
{
getnextchar(filebuffer,buffer + p);
if(!(isdigit(*(buffer + p))))
{
end = TRUE;
}
p++;
}
--p;
if(*(buffer + p) == ',')
{
p++;
py = p;
end = FALSE;
while(!end)
{
getnextchar(filebuffer,buffer + p);
if(!(isdigit(*(buffer + p))))
{
end = TRUE;
}
p++;
}
--p;
if(*(buffer + p) == ')')
{
ev.ie_Class = IECLASS_POINTERPOS;
ev.ie_NextEvent = NULL;
ev.ie_Qualifier = 0;
ev.ie_SubClass = 0;
ev.ie_TimeStamp.tv_secs = 0;
ev.ie_TimeStamp.tv_micro = 0;
ev.ie_Y = (WORD)atol(buffer + py);
ev.ie_X = (WORD)atol(buffer + 6);
switch(*(buffer + 2))
{
case 'l' : if(*(buffer + 4) == 'd')
ev.ie_Code = IECODE_LBUTTON ;
else
ev.ie_Code = IECODE_LBUTTON | IECODE_UP_PREFIX;
my_AddIEvents(&ev);
break;
case 'r' : if(*(buffer + 4) == 'd')
ev.ie_Code = IECODE_RBUTTON ;
else
ev.ie_Code = IECODE_RBUTTON | IECODE_UP_PREFIX;
my_AddIEvents(&ev);
break;
case 'm' : if(*(buffer + 4) == 'd')
ev.ie_Code = IECODE_MBUTTON ;
else
ev.ie_Code = IECODE_MBUTTON | IECODE_UP_PREFIX;
my_AddIEvents(&ev);
break;
}
*buffer = 0;
}
else
{
filepos =fpm;
strcpy(buffer,"\\\\");
if(ie = InvertString(buffer,NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
*buffer = 0;
}
}
}
else
{
filepos = fpm;
strcpy(buffer,"\\\\");
if(ie = InvertString(buffer,NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
*buffer = 0;
}
}
}
else
{
filepos = fpm;
strcpy(buffer,"\\\\");
if(ie = InvertString(buffer,NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
*buffer = 0;
}
}
}
else
{
t[0] = *(buffer + 1);
strcpy(buffer,"\\\\");
if(ie = InvertString(buffer,NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
}
}
strcpy(buffer,t);
switch(*buffer)
{
case '\n' : strcpy(buffer,"\\n");
break;
case '\r' : strcpy(buffer,"\\r");
break;
case '<' : *buffer = 0;filepos -= 1;
break;
}
}
}
break;
case '<' : {
int end;
int p;
end = FALSE;
p = 1;
fpm = filepos;
do
{
getnextchar(filebuffer,buffer + p);
switch(*(buffer + p))
{
case '\r':
case '\n': if(ie = InvertString("\\<",NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
}
filepos = fpm;
*buffer = 0;
end = TRUE;
break;
case '>' : *(buffer + p + 1) = 0;
if(ie = InvertString(buffer,NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
}
else
{
if(ie = InvertString("\\<",NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
}
filepos = fpm;
}
*buffer = 0;
end = TRUE;
break;
default : break;
}
p++;
if(p >= (STRINGSIZE - 2))end = TRUE;
}
while(!end);
break;
}
case '>' : if(ie = InvertString(buffer,NULL))
{
my_AddIEvents(ie);
FreeIEvents(ie);
}
strcpy(buffer,"\\>");
break;
default : *(buffer + 1) = 0;
break;
}
if(ie = InvertString(buffer,NULL))
{
--brk;
if(v_z)Delay(v_z);
my_AddIEvents(ie);
if(Ldelay)
{
Delay(v_line);
Ldelay = FALSE;
brk = 0;
}
if(!brk)
{
brk = IE_COUNT;
{
int r = HandleBroker();
switch(r)
{
case RETURN_STOP : stop = TRUE;
break;
case RETURN_QUIT : stop = TRUE; rc = RETURN_QUIT;
break;
case RETURN_IS_OK :
default : break;
}
}
}
FreeIEvents(ie);
}
}
freefilebuffer(filebuffer,filesize);
}
from_inside=FALSE;
remIHandler();
return rc;
}
struct a_node *Findentry(LONG id)
{
struct a_node *n;
for(n = (struct a_node *)action_list.lh_Head;n->an_Node.ln_Succ;n = (struct a_node *)n->an_Node.ln_Succ)
{
if(n->an_action.id == id)return n;
}
return NULL;
}
int showrequest()
{
int ret = FALSE;
struct FileRequester *FileReq;
struct Screen *rscreen;
if(rscreen = LockPubScreen(NULL))ScreenToFront(rscreen);
FRTags[4].ti_Data = (ULONG)reqpath;
FRTags[6].ti_Data = (ULONG)reqfile;
if(FileReq = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,FRTags))
{
if(RequestFile(FileReq))
{
ret = TRUE;
strcpy(reqfile,FileReq->rf_File);
strcpy(reqpath,FileReq->rf_Dir);
}
FreeAslRequest((APTR)FileReq);
}
return ret;
}
UBYTE __regargs *makemem(ULONG size)
{
return((UBYTE *)AllocVec(size,MEMF_PUBLIC | MEMF_CLEAR));
}
void releasemem(void *mem)
{
FreeVec(mem);
}
UBYTE __regargs *getfilebuffer(UBYTE *filename,ULONG mode)
{
struct FileInfoBlock *fib;
BPTR lock,fh;
UBYTE *buffer;
switch( mode )
{
case GET_A_FILE:
if(lock = Lock(filename,ACCESS_READ))
{
if(fib = AllocDosObject(DOS_FIB,TAG_DONE))
{
Examine(lock,fib);
filesize = fib->fib_Size;
FreeDosObject(DOS_FIB,fib);
if(buffer = (UBYTE *)makemem(filesize))
{
if(fh = OpenFromLock(lock))
{
FRead(fh,buffer,filesize,1);
Close(fh);
return buffer;
}
else UnLock(lock);
}
}
}
return NULL;
break;
case GET_A_STRING :
filesize = strlen(filename + 1);
if(buffer = (UBYTE *)makemem(filesize))
{
strcpy(buffer,filename);
return buffer;
}
else return NULL;
break;
}
return NULL;
}
void __regargs freefilebuffer(UBYTE *buffer,ULONG size)
{
releasemem(buffer);
}
BOOL __regargs getnextchar(UBYTE *buffer,UBYTE *where)
{
if(filepos >= filesize)return FALSE;
*where = *(buffer + filepos);
filepos++;
return TRUE;
}
/*********************************************************************/
/* InputHandler Glump */
/*********************************************************************/
LONG makeIHandler()
{
if(s_InputPort = CreateMsgPort())
{
if(s_HandlerIO = (struct IOStdReq *)CreateExtIO(s_InputPort,sizeof(struct IOStdReq)))
{
if(!(s_device = OpenDevice("input.device",NULL,(struct IORequest *)s_HandlerIO,0L)))
{
s_HandlerIO->io_Length = sizeof(struct InputEvent);
s_HandlerIO->io_Command = IND_WRITEEVENT;
return(TRUE);
}
}
}
return (FALSE);
}
void remIHandler()
{
if(s_HandlerIO)
{
if(!s_device)CloseDevice((struct IORequest *)s_HandlerIO);
DeleteExtIO((struct IORequest *)s_HandlerIO);
s_HandlerIO = NULL;
}
if(s_InputPort)
{
DeletePort(s_InputPort);
s_InputPort = NULL;
}
}