// Sends abort from lister to locking process
void lister_send_abort(Lister *lister)
{
	// Do we have a known locker?
	if (lister->locker_ipc)
	{
		// Send abort command
		if ((IPC_SafeCommand(lister->locker_ipc,IPC_ABORT,0,lister,0,0,&GUI->function_list))!=(ULONG)-1)
		{
			// Also signal control C to break MatchFirst/MatchNext
			if (lister->locker_ipc->proc)
			{
				Signal((struct Task *)lister->locker_ipc->proc,(SIGBREAKF_CTRL_C|IPCSIG_QUIT));
			}
		}
	}

	// Set abort flag
	lister->flags|=LISTERF_ABORTED;

	// Custom lister handler?
	if (lister->cur_buffer->buf_CustomHandler[0])
	{
		char port_name[40];

		// Abort trap installed?
		if (FindFunctionTrap("abort",lister->cur_buffer->buf_CustomHandler,port_name))
		{
			// Send abort message
			rexx_handler_msg(
				port_name,
				lister->cur_buffer,
				0,
				HA_String,0,"abort",
				HA_Value,1,lister,
				TAG_END);
		}
	}
}
Exemple #2
0
// Notify people we're quitting
BOOL quit_notify(void)
{
	APTR trap;
	char port[40];

	// Lock trap list
	trap=LockTrapList();

	// Look for quit traps
	while ((trap=FindTrapEntry(trap,"quit",port)))
	{
		// Send abort message
		rexx_handler_msg(port,0,0,HA_String,0,"quit",TAG_END);
	}

	// Unlock trap list
	UnlockTrapList();

	// Broadcast notify message
	SendNotifyMsg(DN_OPUS_QUIT,GUI->dopus_copy,0,0,GUI->rexx_port_name,0);

	return 1;
}
function_internal_command(
	CommandList *command,
	char *args,
	FunctionHandle *handle,
	InstructionParsed *instruction)
{
	short ret=1;
	Lister *lister;
	DirBuffer *cust_buffer=0;
	Lister *source_lister=0,*dest_lister=0;
	char custom_port[40];
	PathNode *source_n=0,*dest_n=0;

	// Clear instruction flags
	if (handle) handle->instruction_flags=0;

	// Valid command?
	if (!command || !command->name) return 1;

	// Initialise custom port
	custom_port[0]=0;

	// Got a handle?
	if (handle)
	{
		// Get source and dest nodes
		source_n=function_path_current(&handle->source_paths);
		dest_n=function_path_current(&handle->dest_paths);

		// Get current source lister
		if (lister=function_lister_current(&handle->source_paths))
		{
			// Custom handler installed?
			if (lister->cur_buffer->buf_CustomHandler[0])
			{
				// If there's a NEW flag, we won't be using this lister
				if (instruction && !instruction->new_arg)
				{
					// Look for trap handler
					if (FindFunctionTrap(command->name,lister->cur_buffer->buf_CustomHandler,custom_port))
					{
						source_lister=lister;
						dest_lister=function_lister_current(&handle->dest_paths);
						cust_buffer=lister->cur_buffer;
					}
				}
			}
		}

		// If no custom handler, try destination
		if (!cust_buffer &&
			(command->flags&FUNCF_NEED_DEST) &&
			(lister=function_lister_current(&handle->dest_paths)))
		{
			// Custom handler installed?
			if (lister->cur_buffer->buf_CustomHandler[0])
			{
				// Look for trap handler
				if (FindFunctionTrap(command->name,lister->cur_buffer->buf_CustomHandler,custom_port))
				{
					source_lister=function_lister_current(&handle->source_paths);
					dest_lister=lister;
					cust_buffer=lister->cur_buffer;
				}
			}
		}
	}

	// Custom handler?
	if (cust_buffer)
	{
		char *files=0;
		ULONG flags;

		// Need files?
		if (command->flags&FUNCF_NEED_ENTRIES)
		{
			// Build file string
			files=function_build_file_string(
				handle,
				cust_buffer->cust_flags&CUSTF_WANT_QUOTES);
		}

		// Get flags
		flags=RXMF_WARN;
		if (cust_buffer->cust_flags&CUSTF_SYNCTRAPS) flags|=RXMF_SYNC;

		// Send command message
		ret=rexx_handler_msg(
			custom_port,
			cust_buffer,
			flags,
			HA_String,0,command->name,
			HA_Value,1,source_lister,
			HA_String,2,files,
			HA_Value,3,dest_lister,
			HA_String,4,(source_n)?source_n->path:0,
			HA_String,5,args,
			HA_String,7,(dest_n)?dest_n->path:0,
			HA_Value,8,(flags&RXMF_SYNC)?handle:0,
			TAG_END);

		// Free file string
		FreeVec(files);
		return ret;
	}

	// External command?
	if (command->flags&FUNCF_EXTERNAL_FUNCTION)
	{
		struct Library *ModuleBase;
		char *work_buf=0,*buffer;

		// Need to allocate buffer?
		if (!handle)
		{
			work_buf=AllocVec(512,MEMF_CLEAR);
			buffer=work_buf;
		}
		else buffer=handle->work_buffer;

		// No buffer?
		if (!buffer || strcmp(command->stuff.module_name,"!")==0)
		{
		}

		// User command?
		else
		if (strnicmp(command->stuff.module_name,"dopus5:commands/",16)==0)
		{
			// Shouldn't be able to get here!
		}

		// Rexx script?
		else
		if (sufcmp(command->stuff.module_name,".dopus5"))
		{
			// Get rexx function to run
			lsprintf(buffer,
				"dopus5:modules/%s %s %s %ld %ld %s",
				command->stuff.module_name,
				GUI->rexx_port_name,
				command->name,
				(source_n)?source_n->lister:0,
				(dest_n)?dest_n->lister:0,
				args);

			// Run rexx thing
			rexx_send_command(buffer,TRUE);
		}

		// Open module
		else
		if (ModuleBase=OpenModule(command->stuff.module_name))
		{
			// Copy arguments
			strcpy(buffer,args);

			// Add a newline
			if (*buffer) strcat(buffer,"\n");

			// Call module
			ret=Module_Entry(
				(command->flags&FUNCF_NO_ARGS)?0:(struct List *)buffer,
				GUI->screen_pointer,
				(handle)?handle->ipc:0,
				&main_ipc,
				command->function,
				(ULONG)function_external_hook);

			// Close module
			CloseLibrary(ModuleBase);
		}

		// Free buffer
		FreeVec(work_buf);
	}

	// Valid code?
	else
	if (command->stuff.code)
		ret=(int)((int (*)())(command->stuff.code)(command,handle,args,instruction));

	return ret;
}
UWORD lister_listerpopup(Lister *lister,UWORD code)
{
	short a,num=0;
	UWORD res;
	PopUpHandle *menu;
	PopUpItem *item;
	PopUpExt *ext;

	// Allocate menu handle
	if (!(menu=PopUpNewHandle((ULONG)lister,lister->backdrop_info->callback,&locale)))
		return (UWORD)-1;

	// Build default lister popup
	for (a=0;lister_popup_data[a];a+=2)
	{
		if (lister_popup_data[a]==(UWORD)-1)
			PopUpSeparator(menu);
		else
		if ((item=PopUpNewItem(menu,lister_popup_data[a],lister_popup_data[a+1],0)))
		{
			// Kludge for 'lock position'
			if (item->id==MENU_LISTER_LOCK_POS)
				item->flags|=POPUPF_CHECKIT|((lister->flags&LISTERF_LOCK_POS)?POPUPF_CHECKED:0);
		}
	}

	// Clear 'separator' flag
	menu->ph_Flags&=~POPHF_SEP;

	// Lock extension list
	lock_listlock(&GUI->popupext_list,FALSE);

	// Go through list
	for (ext=(PopUpExt *)GUI->popupext_list.list.lh_Head;
		ext->pe_Node.ln_Succ;
		ext=(PopUpExt *)ext->pe_Node.ln_Succ)
	{
		// Lister?
		if (ext->pe_Type==POPUP_LISTER2)
		{
			// Check custom handler
			if (!(ext->pe_Flags&POPUPEXTF_HANDLER) ||
				strcmp(ext->pe_Command,lister->cur_buffer->buf_CustomHandler)==0)
			{
				// Add a separator if needed
				if (!(menu->ph_Flags&POPHF_SEP))
					PopUpSeparator(menu);

				// Allocate item
				if ((item=PopUpNewItem(
					menu,
					(ULONG)ext->pe_Menu,
					MENU_EXTENSION+num,
					POPUPF_STRING)))
				{
					// Set data pointer
					item->data=ext;
					++num;
				}
			}
		}
	}

	// Do popup menu
	item=0;
	if ((res=DoPopUpMenu(lister->window,&menu->ph_Menu,&item,code))!=(UWORD)-1 &&
		res>=MENU_EXTENSION)
	{
		// Got valid pointer?
		if (item && item->data)
		{
			PopUpExt *ext=(PopUpExt *)item->data;

			// Custom handler in lister?
			if (strcmp(lister->cur_buffer->buf_CustomHandler,ext->pe_Command)==0)
			{
				// Send message
				rexx_handler_msg(
					0,
					lister->cur_buffer,
					RXMF_WARN,
					HA_String,0,ext->pe_Menu,
					HA_Value,1,lister,
					TAG_END);
			}

			// Normal extension
			else
			{
				// Call popup function
				popup_run_func(item->data,0,0,lister);
			}

			// Clear result code
			res=(UWORD)-1;
		}
	}

	// Unlock extension list
	unlock_listlock(&GUI->popupext_list);

	// Free menu data
	PopUpFreeHandle(menu);
	return res;
}
// Send a message for an AppThing
BOOL rexx_send_appmsg(RexxAppThing *app,short type,struct AppMessage *msg)
{
	char buf[40];
	char *files=0,*entry=0;
	ULONG lister=0;
	BOOL ret;

	// Snapshot?
	if (type==REXXAPPCMD_SNAPSHOT)
	{
		struct AppSnapshotMsg *sm;

		// Get snapshot pointer
		sm=(struct AppSnapshotMsg *)msg;

		// Unsnapshot?
		if (sm->flags&APPSNAPF_UNSNAPSHOT) type=REXXAPPCMD_UNSNAPSHOT;

		// Snapshot
		else
		{
			// Build coordinate string
			lsprintf(buf,"%ld,%ld",sm->position_x,sm->position_y);
			entry=buf;
		}
	}

	// Menu?
	else
	if (type==REXXAPPCMD_MENU)
	{
		struct AppSnapshotMsg *sm;

		// Get message pointer
		sm=(struct AppSnapshotMsg *)msg;

		// ID string
		lsprintf(buf,"%ld",sm->id);
		entry=buf;

		// Help?
		if (sm->flags&APPSNAPF_HELP) type=REXXAPPCMD_MENUHELP;
	}

	// Something with files?
	else
	if (msg && msg->am_NumArgs>0)
	{
		// Build string of files
		if ((files=rexx_build_filestring((DOpusAppMessage *)msg,&lister,(app->flags&RATF_QUOTES)?CUSTF_WANT_QUOTES:0)))
			entry=files;
	}

	// Send message
	ret=rexx_handler_msg(
		app->port_name,
		0,
		(type!=REXXAPPCMD_QUIT)?RXMF_WARN:0,
		HA_String,0,app_commands[type],
		HA_Value,1,app->id,
		HA_String,2,entry,
		HA_Value,3,lister,
		HA_String,4,"icon",
		TAG_END);

	// Free files string
	FreeVec(files);

	return ret;
}