// Decompile function string into list of functions void funced_decompile(FuncEdData *data) { FunctionEntry *entry; Cfg_Instruction *ins; // Clear list Att_RemList(data->function_list,REMLIST_SAVELIST|REMLIST_FREEDATA); // Copy to function entry list for (ins=(Cfg_Instruction *)data->function->instructions.mlh_Head; ins->node.mln_Succ; ins=(Cfg_Instruction *)ins->node.mln_Succ) { // Label? if (ins->type==INST_LABEL) { // Store label stccpy(data->label,ins->string,79); continue; } // Allocate function entry if ((entry=AllocVec(sizeof(FunctionEntry),MEMF_CLEAR))) { // Store function data entry->type=ins->type; if (ins->string) strcpy(entry->buffer,ins->string); // Add entry to list if (!(entry->node=Att_NewNode(data->function_list,0,(ULONG)entry,0))) FreeVec(entry); } } }
// Build display entry for a function void funced_build_entrydisplay( FuncEdData *data, Att_Node *node, FunctionEntry *entry) { // If node is 0, create a new one if (!node) node=Att_NewNode(data->func_display_list,0,(ULONG)entry,0); // Check valid node and data if (!node || !node->node.ln_Succ || !entry) return; // If node has a name, free it FreeMemH(node->node.ln_Name); // Get new name if ((node->node.ln_Name=AllocMemH(data->func_display_list->memory,strlen(entry->buffer)+32))) { // Build new name strcpy(node->node.ln_Name,GetString(data->locale,data->startup->func_labels[entry->type])); if (entry->buffer[0]) { strcat(node->node.ln_Name,"\a\xc"); strcat(node->node.ln_Name,entry->buffer); } } }
// Add an entry to the filetype list Att_Node *filetype_add_entry( config_filetypes_data *data, Cfg_Filetype *type) { char buf[44]; FiletypeNode *node; Att_Node *new_node; // Allocate new node if ((node=AllocVec(sizeof(FiletypeNode),MEMF_CLEAR))) { // Fill out node node->type=type; // Build display entry lsprintf(buf,"%s\t%s",type->type.name,type->type.id); // Add entry to list for this filetype if ((new_node=Att_NewNode(data->filetype_list,buf,(ULONG)node,ADDNODE_SORT))) return new_node; FreeVec(node); } return 0; }
// Show list of status bar options void _config_env_status_list(ObjectList *objlist,ULONG id,long first,long last) { Att_List *list; short a,b; char name[80]; // Build list if (!(list=Att_NewList(0))) return; for (a=first;a<=((last)?last:32767);a++) { stccpy(name,GetString(locale,a),sizeof(name)); if (name[0]=='-' && name[1]==0) break; for (b=0;name[b] && name[b]!='\t';b++) if (name[b]=='*') name[b]='%'; Att_NewNode(list,name,0,0); } // Make window busy SetWindowBusy(objlist->window); // Display selection list a=SelectionList(list,objlist->window,0, GetString(locale,MSG_ENVIRONMENT_LISTER_SELECT_STATUS), -1, 0, 0, GetString(locale,MSG_OKAY), GetString(locale,MSG_CANCEL),0,0); // Clear busy ClearWindowBusy(objlist->window); // Selection? if (a!=-1) { Att_Node *node; // Get node if ((node=Att_FindNode(list,a))) { char *ptr,buf[10]; // Get string pointer ptr=strchr(node->node.ln_Name,'\t'); if (ptr) stccpy(buf,node->node.ln_Name,(ptr-node->node.ln_Name)+1); else stccpy(buf,node->node.ln_Name,sizeof(buf)); // Insert into gadget funced_edit_insertstring(objlist,id,buf,DOpusBase,(struct Library *)IntuitionBase); } } // Free list Att_RemList(list,0); }
IPC_StartupCode(_filetypeed_init, filetype_ed_data *, data) #endif { short a; // Store IPC pointer data->ipc=ipc; // Fill in new window data->new_win.title=data->type->type.name; data->new_win.flags=WINDOW_VISITOR|WINDOW_REQ_FILL|WINDOW_AUTO_KEYS; // Create timer if (!(data->drag.timer=AllocTimer(UNIT_VBLANK,0))) return 0; // Open window, create action list if (!(data->window=OpenConfigWindow(&data->new_win)) || !(data->objlist=AddObjectList(data->window,data->obj_def)) || !(data->action_list=Att_NewList(0))) { CloseConfigWindow(data->window); FreeTimer(data->drag.timer); return 0; } // Store window for drag data->drag.window=data->window; // Set window ID SetWindowID(data->window,0,WINDOW_BUTTON_CONFIG,(struct MsgPort *)data->ipc); // Build action list for (a=0;data->action_lookup[a];a+=2) { Att_NewNode( data->action_list, GetString(Locale,data->action_lookup[a]), data->action_lookup[a+1], 0); } // Disable edit and delete buttons DisableObject(data->objlist,GAD_FILETYPES_EDIT_ACTION,TRUE); // Update action and icon list filetypeed_update_actions(data); filetypeed_update_iconmenu(data); // Initialise process list InitListLock(&data->proc_list,0); return 1; }
// Build list of flags void funced_build_flaglist(FuncEdData *data) { short flag; // Go through flag list for (flag=0;data->startup->flag_list[flag];flag+=2) { // Add flag to the list Att_NewNode( data->flag_list, GetString(data->locale,data->startup->flag_list[flag+1]), data->startup->flag_list[flag], ADDNODE_SORT); } }
// Build theme list Att_List *theme_build_list(char *path) { Att_List *list; // Create list if ((list=Att_NewList(LISTF_POOL))) { long err; char buf[280]; #ifdef __amigaos4__ struct AnchorPath *anchor; if (!(anchor = AllocDosObjectTags( DOS_ANCHORPATH, ADO_Strlen, 0, ADO_Flags, APF_DOWILD, ADO_Mask, 0, TAG_DONE))) { return NULL; } #else D_S(struct AnchorPath,anchor) anchor->ap_BreakBits=0; anchor->ap_Flags=APF_DOWILD; anchor->ap_Strlen=0; #endif strcpy(buf,path); AddPart(buf,"#?.theme",280); err=MatchFirst(buf,anchor); while (!err) { char *ptr; if (anchor->ap_Info.fib_DirEntryType>0) { anchor->ap_Flags&=~APF_DODIR; continue; } anchor->ap_Info.fib_FileName[strlen(anchor->ap_Info.fib_FileName)-6]=0; for (ptr=anchor->ap_Info.fib_FileName;*ptr;ptr++) if (*ptr=='_') *ptr=' '; Att_NewNode(list,anchor->ap_Info.fib_FileName,0,ADDNODE_SORT); err=MatchNext(anchor); } MatchEnd(anchor); #ifdef __amigaos4__ FreeDosObject(DOS_ANCHORPATH,anchor); #endif }
// Build path list void config_paths_build_list(config_path_data *data) { position_rec *pos; // Go through position list for (pos=(position_rec *)data->paths->lh_Head; pos->node.ln_Succ; pos=(position_rec *)pos->node.ln_Succ) { // User-edited path? if (pos->node.ln_Type==PTYPE_POSITION && pos->flags&POSITIONF_USER) { // Add to our list Att_NewNode(data->path_list,pos->node.ln_Name,(ULONG)pos,ADDNODE_SORT); } } }
// Add an entry void config_paths_add(config_path_data *data,BOOL activate) { position_rec *pos; Att_Node *node; // Create a new entry if ((pos=(position_rec *)AllocMemH(data->memory,sizeof(position_rec)+256))) { // Initialise entry pos->node.ln_Type=PTYPE_POSITION; pos->node.ln_Name=pos->name; pos->flags|=POSITIONF_USER|POSITIONF_NEW; if (data->def_format) CopyMem((char *)data->def_format,(char *)&pos->format,sizeof(ListFormatStorage)); // Initialise key pos->code=0xffff; // Add to list path list AddTail(data->paths,(struct Node *)pos); // Remove list from gadget SetGadgetChoices(data->objlist,GAD_PATHFORMAT_PATHS,(APTR)~0); // Add to lister node=Att_NewNode(data->path_list,0,(ULONG)pos,ADDNODE_SORT); // Attach list to gadget SetGadgetChoices(data->objlist,GAD_PATHFORMAT_PATHS,data->path_list); // Select the new node config_paths_select(data,node,TRUE); // Activate path field if (activate) ActivateStrGad(GADGET(GetObject(data->objlist,GAD_PATHFORMAT_PATH)),data->window); } }
// Trap 'more' in default tool BOOL file_trap_more(char *name,char *tool) { short len; BOOL ok=0; if (!(environment->env->settings.icon_flags&ICONFLAG_TRAP_MORE)) return 0; // Look for 'more' in default tool len=strlen(tool); if (len>=4 && stricmp(tool+len-4,"more")==0 && (len==4 || tool[len-5]=='/' || tool[len-5]==':')) { struct read_startup *read; // Allocate startup if ((read=AllocVec(sizeof(struct read_startup),MEMF_CLEAR))) { // Create list if ((read->files=(struct List *)Att_NewList(0))) { // Add file to list if (Att_NewNode((Att_List *)read->files,name,0,0)) { // Substitute internal viewer misc_startup("dopus_more_trap",FUNC_SMARTREAD,0,read,FALSE); ok=1; } else Att_RemList((Att_List *)read->files,0); } if (!ok) FreeVec(read); } } return ok; }
void desktop_delete(IPCData *ipc,BackdropInfo *info,BackdropObject *only_one) { short groupcount=0,filecount=0,assigncount=0,othercount=0,dircount=0; BackdropObject *object=0; Att_List *list; Att_Node *node; char buf[100]; // Create list if (!(list=Att_NewList(LISTF_POOL))) return; // Lock backdrop list lock_listlock(&info->objects,0); // Go through backdrop list while ((object=backdrop_next_object(info,object,only_one))) { // Group? if (object->type==BDO_GROUP) ++groupcount; // Assign? else if (object->flags&BDOF_ASSIGN) ++assigncount; // Group object? else if (object->type==BDO_LEFT_OUT && info->flags&BDIF_GROUP) ++filecount; // Desktop object? else if (object->type==BDO_LEFT_OUT && object->flags&BDOF_DESKTOP_FOLDER) { ++othercount; if (object->icon->do_Type==WBDRAWER) ++dircount; } // Something else else continue; // Add to list Att_NewNode(list,0,(ULONG)object,0); } // Unlock backdrop list unlock_listlock(&info->objects); // Nothing to delete? if (IsListEmpty((struct List *)list)) { Att_RemList(list,0); return; } // Build message; start with query strcpy(info->buffer,GetString(&locale,MSG_DESKTOP_REALLY_DELETE)); // Any groups? if (groupcount>0) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_GROUPS),groupcount); strcat(info->buffer,buf); } // Or assigns? else if (assigncount>0) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_ASSIGNS),assigncount); strcat(info->buffer,buf); } // Any group files? else if (filecount>0) { // Add file count lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_GROUP_OBJECTS),filecount); strcat(info->buffer,buf); } // Desktop objects? if (othercount>0) { BOOL cr=0; // Add CR? if (groupcount>0 || assigncount>0 || filecount>0) cr=1; // Add files if (othercount>dircount) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_DESKTOP_FILES),othercount-dircount); if (cr) strcat(info->buffer,"\n"); strcat(info->buffer,buf); cr=1; } // Add dirs if (dircount>0) { lsprintf(buf,GetString(&locale,MSG_DESKTOP_DELETE_DESKTOP_DIRS),dircount); if (cr) strcat(info->buffer,"\n"); strcat(info->buffer,buf); } } // Add question mark strcat(info->buffer,"?"); // Display requester if (!(super_request_args( GUI->screen_pointer, info->buffer, SRF_IPC|SRF_SCREEN_PARENT, ipc, GetString(&locale,MSG_DELETE), GetString(&locale,MSG_CANCEL),0))) { Att_RemList(list,0); return; } // Check owner for refresh if (info->lister) IPC_Command(info->lister->ipc,LISTER_CHECK_REFRESH,0,0,0,REPLY_NO_PORT); // Group objects? if (info->flags&BDIF_GROUP) { // Send command to group IPC_Command(info->ipc,GROUP_DELETE,0,only_one,0,0); } // Otherwise else { // Go through the list for (node=(Att_Node *)list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { // Lock backdrop list lock_listlock(&info->objects,1); // Get object if ((object=find_backdrop_object(info,(BackdropObject *)node->data))) { // Group? if (object->type==BDO_GROUP) { // Delete this group backdrop_delete_group(info,object); } // Assign? else if (object->flags&BDOF_ASSIGN) { // Copy name, strip trailing colon strcpy(info->buffer+2,object->name); info->buffer[strlen(info->buffer+2)+1]=0; // Delete assign if (AssignLock(info->buffer+2,0)) { // Erase object backdrop_erase_icon(info,object,0); // Remove object backdrop_remove_object(info,object); } } } // Unlock backdrop list unlock_listlock(&info->objects); } } // Free list Att_RemList(list,0); // Recalc backdrop objects backdrop_calc_virtual(info); // Delete other things? if (othercount>0) { // Run delete function icon_function(info,0,0,def_function_delete_quiet,0); } }
static Att_List *do_read_sites_iff(struct opusftp_globals *og,char *filename,LONG *diskerr) { APTR iff; BOOL err=FALSE; Att_List *list; D(bug("read sites\n")); if (!(list=Att_NewList(LISTF_POOL))) return(NULL); // Open IFF file if ((iff=IFFOpen(filename,IFF_READ,ID_OPUS))) { struct site_entry *e; ULONG chunk; while (!err && (chunk=IFFNextChunk(iff,0))) { if ((e=AllocVec(sizeof(struct site_entry),MEMF_CLEAR))) { int size; int chunksize = 0; if (chunk==ID_FTPSITE_SHORT) size=SMALL_SIZE; else if (chunk==ID_FTPSITE_LONG) size=LARGE_SIZE; else { *diskerr=212; err=TRUE; FreeVec(e); break; } // Adjustment for changed ListFormat size chunksize = (int)IFFChunkSize(iff); if ((chunksize < size) && (size - chunksize == 84)) { if (!(err=(chunksize!=IFFReadChunkBytes(iff,(char *)e,chunksize)))); { char patterns[82] = {'\0'}; int i = 0; CopyMem(e->se_listformat.show_pattern_p, patterns, 80); memset(e->se_listformat.show_pattern_p, 0, 160); for (i = 0; i < 40; i++) { e->se_listformat.show_pattern_p[i] = patterns[i]; e->se_listformat.hide_pattern_p[i] = patterns[i+40]; } } } else err=(size!=IFFReadChunkBytes(iff,(char *)e,size)); if (!err) { #ifdef __AROS__ e->se_anon = AROS_BE2WORD(e->se_anon); e->se_port = AROS_BE2LONG(e->se_port); e->se_has_custom_env = AROS_BE2WORD(e->se_has_custom_env); if (size == LARGE_SIZE) { e->se_env_private.e_retry_count = AROS_BE2LONG(e->se_env_private.e_retry_count); e->se_env_private.e_retry_delay = AROS_BE2LONG(e->se_env_private.e_retry_delay); e->se_env_private.e_list_update = AROS_BE2LONG(e->se_env_private.e_list_update); e->se_env_private.e_timeout = AROS_BE2LONG(e->se_env_private.e_timeout); e->se_env_private.e_script_time = AROS_BE2LONG(e->se_env_private.e_script_time); e->se_env_private.e_indexsize = AROS_BE2LONG(e->se_env_private.e_indexsize); e->se_env_private.bitfield1 = AROS_BE2LONG(e->se_env_private.bitfield1); e->se_env_private.bitfield2 = AROS_BE2LONG(e->se_env_private.bitfield2); } #endif // adjust ptrs for environment // if custom env then set ptr to internal private copy // else set it to point to global ftp default if (e->se_has_custom_env) e->se_env=&e->se_env_private; else e->se_env=&og->og_oc.oc_env; Att_NewNode(list, e->se_name ,(ULONG)e ,0 ); } else FreeVec(e); } else err=TRUE; } // Close file IFFClose(iff); if (!err) return(list); } Att_RemList(list,REMLIST_FREEDATA); if (!*diskerr) *diskerr=IoErr(); return(NULL); }
static Att_List *do_import_amftp(struct display_globals *dg,char *path) { struct opusftp_globals *og; Att_List *list=NULL; char *buf; og=dg->dg_og; if (!check_amftpfile(dg,path)) return (NULL); if ((buf=AllocVec(AMFTP_LEN,MEMF_CLEAR))) { struct amftp_profile *p = (struct amftp_profile *)buf; if ((list = Att_NewList(LISTF_POOL))) { BPTR fp; if ((fp = Open(path, MODE_OLDFILE))) { WORD a; LONG b; // read intro unknown stuff Read(fp,&a, 2); Read(fp, &b, 4); while (AMFTP_LEN==Read(fp, buf, AMFTP_LEN)) { ULONG magic=-1; int i; struct site_entry *e; for (i = 0; i < AMFTP_LEN; ++i) buf[i] ^= encrypt(&magic); if ((e = AllocVec( sizeof(struct site_entry), MEMF_CLEAR ))) { // get main settings from amftp config if (p->amftp_name) stccpy( e->se_name, p->amftp_name, HOSTNAMELEN ); if (p->amftp_host) stccpy( e->se_host, p->amftp_host, HOSTNAMELEN ); if (buf[520]) e->se_anon = TRUE; if (!e->se_anon) { if (p->amftp_login) stccpy( e->se_user, p->amftp_login, USERNAMELEN ); if (p->amftp_pass) stccpy( e->se_pass, p->amftp_pass, PASSWORDLEN ); } e->se_port=atoi(p->amftp_port); if (e->se_port<=0 || e->se_port >16384) e->se_port=21; if (p->amftp_remote) stccpy( e->se_path,p->amftp_remote, PATHLEN ); // get global default env and mark as custom *(&e->se_env_private)=*(&og->og_oc.oc_env); e->se_env=&e->se_env_private; e->se_has_custom_env=TRUE; // Clear format marker e->se_env->e_custom_format=FALSE; // get retry and save last dir settings if ((e->se_env->e_retry_count=buf[521])) e->se_env->e_retry=TRUE; if (buf[522]) e->se_env->e_keep_last_dir=TRUE; Att_NewNode(list, e->se_name ,(ULONG)e ,ADDNODE_SORT ); } } Close( fp ); } } FreeVec(buf); } return list; }
static Att_List *do_import_sites(struct opusftp_globals *og,char *path) { FuncArgs * fa; struct site_entry *e; int anon, acct; BPTR cf; char *buf; Att_List *list=NULL; if (!(buf=AllocVec(TMPBUFLEN,MEMF_CLEAR))) { DisplayBeep(NULL); return(NULL); } if ((list = Att_NewList(LISTF_POOL))) { if ((cf = Open(path, MODE_OLDFILE ))) { while ( FGets( cf, buf, TMPBUFLEN )) { if (*buf=='#' || *buf=='\n') continue; /* skip config entries */ if ((fa = ParseArgs( CONFIG_TEMPLATE, buf ))) { DisposeArgs( fa ); continue; } /* handle addressbook stuff*/ if ((fa = ParseArgs( ADDR_TEMPLATE, buf ))) { anon = fa->FA_Arguments[A_OPT_ANON]; acct = fa->FA_Arguments[A_OPT_ACCT]; // skip any lines starting with '---' if (fa->FA_Arguments[A_OPT_HOST] && strncmp((char*)fa->FA_Arguments[A_OPT_HOST],"---",3)==0) { DisposeArgs( fa ); continue; } if (((anon == 0) != (acct == 0)) /* Can't be both or neither */ && (anon || fa->FA_Arguments[A_OPT_USER]) /* User Account must have user name */ && (fa->FA_Arguments[A_OPT_HOST] || fa->FA_Arguments[A_OPT_ADDR])/* Must have Hostname or Address */ ) { if ((e = AllocVec( sizeof(struct site_entry), MEMF_CLEAR ))) { e->se_anon = anon; if (!anon) { if (fa->FA_Arguments[A_OPT_USER]) stccpy( e->se_user, (char*)fa->FA_Arguments[A_OPT_USER], USERNAMELEN ); if (fa->FA_Arguments[A_OPT_PASS]) stccpy( e->se_pass, (char*)fa->FA_Arguments[A_OPT_PASS], PASSWORDLEN ); } /* Use Hostname or Address for the socket */ if (fa->FA_Arguments[A_OPT_HOST]) stccpy( e->se_host, (char*)fa->FA_Arguments[A_OPT_HOST], HOSTNAMELEN ); else stccpy( e->se_host, (char*)fa->FA_Arguments[A_OPT_ADDR], HOSTNAMELEN ); // special port specified ? if (fa->FA_Arguments[A_OPT_PORT]) e->se_port=*(int*)fa->FA_Arguments[A_OPT_PORT]; if (e->se_port<=0 || e->se_port >9999) e->se_port=21; /* Use Alias, Hostname, or Address in requester */ if (fa->FA_Arguments[A_OPT_ALIS]) stccpy( e->se_name, (char*)fa->FA_Arguments[A_OPT_ALIS], HOSTNAMELEN ); else if (fa->FA_Arguments[A_OPT_HOST]) stccpy( e->se_name, (char*)fa->FA_Arguments[A_OPT_HOST], HOSTNAMELEN ); else if (fa->FA_Arguments[A_OPT_ADDR]) stccpy( e->se_name, (char*)fa->FA_Arguments[A_OPT_ADDR], HOSTNAMELEN ); if (fa->FA_Arguments[A_OPT_PATH]) stccpy( e->se_path, (char*)fa->FA_Arguments[A_OPT_PATH], PATHLEN ); // set env to point to global default e->se_env=&og->og_oc.oc_env; e->se_has_custom_env=FALSE; Att_NewNode(list, e->se_name ,(ULONG)e ,ADDNODE_SORT); } } DisposeArgs( fa ); } } Close(cf); } } FreeVec(buf); return(list); }
// Change entry's path void config_paths_change(config_path_data *data) { char *str; BPTR lock; char path[256]; position_rec *pos; Att_Node *node; struct List *search; // No path selected? if (!data->path_sel) return; // Get path string str=(char *)GetGadgetValue(data->objlist,GAD_PATHFORMAT_PATH); // Invalid? if (!str || !*str) { // Remove this path config_paths_remove(data,TRUE); return; } // Try to lock if ((lock=Lock(str,ACCESS_READ))) { // Get full pathname NameFromLock(lock,path,256); UnLock(lock); } // Otherwise, use entered path else strcpy(path,str); // Fix path with trailing / AddPart(path,"",256); // See if path is already in edit list if ((node=(Att_Node *)FindNameI((struct List *)data->path_list,path))) { // Not the currently selected node? if (node!=data->path_sel) { // Error DisplayBeep(data->window->WScreen); ActivateStrGad(GADGET(GetObject(data->objlist,GAD_PATHFORMAT_PATH)),data->window); return; } } // Is path already in snapshot list? search=data->paths; while ((pos=(position_rec *)FindNameI(search,path))) { // Position entry? if (pos->node.ln_Type==PTYPE_POSITION) break; search=(struct List *)pos; } // Found it? if (pos) { // Different entry? if (pos!=(position_rec *)data->path_sel->data) { // Remove current entry from list Remove((struct Node *)data->path_sel->data); // Free current data FreeMemH((void *)data->path_sel->data); data->path_sel->data=(ULONG)pos; } // If path exists, clear "new" flag if (lock) pos->flags&=~POSITIONF_NEW; } // It is now else pos=(position_rec *)data->path_sel->data; // Set its user flag pos->flags|=POSITIONF_USER; // Store new name strcpy(pos->name,path); // Remove list from gadget SetGadgetChoices(data->objlist,GAD_PATHFORMAT_PATHS,(APTR)~0); // Remove existing node and add new one Att_RemNode(data->path_sel); // Add to list data->path_sel=Att_NewNode(data->path_list,pos->node.ln_Name,(ULONG)pos,ADDNODE_SORT); // Attach list to gadget SetGadgetChoices(data->objlist,GAD_PATHFORMAT_PATHS,data->path_list); // Select the new node config_paths_select(data,data->path_sel,TRUE); }
// Show about requester void show_about(struct Screen *screen,IPCData *ipc) { char buf[80],*buffer; struct Library *ModuleBase; Att_List *list; Att_Node *node; // Create list of text if (!(list=Att_NewList(0))) return; // Build lines lsprintf(buf,"%s %ld.%ld %s",dopus_name,5,version_num,version_string); Att_NewNode(list,buf,2,0); Att_NewNode(list,about_1,2,0); Att_NewNode(list,about_2,2,0); // Name of the translator Att_NewNode(list,GetString(&locale,MSG_TRANSLATION_BY_YOUR_NAME),3,0); // Registered? if (GUI->rego.name[0] && GUI->rego.serial_number[0] && atoi(GUI->rego.serial_number)!=(ULONG)GUI->backdrop) { Att_NewNode(list,GetString(&locale,MSG_REGISTERED_TO),1,0); Att_NewNode(list,"",1,0); Att_NewNode(list,GUI->rego.name,1,0); if (GUI->rego.company[0]) Att_NewNode(list,GUI->rego.company,1,0); if (GUI->rego.address1[0]) Att_NewNode(list,GUI->rego.address1,1,0); if (GUI->rego.address2[0]) Att_NewNode(list,GUI->rego.address2,1,0); if (GUI->rego.address3[0]) Att_NewNode(list,GUI->rego.address3,1,0); Att_NewNode(list,"",1,0); strcpy(buf,GetString(&locale,MSG_SERIAL_NUMBER)); strcat(buf,GUI->rego.serial_number); Att_NewNode(list,buf,0,0); } // Unregistered else { Att_NewNode(list,"",1,0); Att_NewNode(list,GetString(&locale,MSG_UNREGISTERED),1,0); Att_NewNode(list,"",0,0); } // Try for external about library if ((ModuleBase=OpenLibrary("dopus5:modules/about.module",0))) { short ret; // Show about ret=Module_Entry((struct List *)list,screen,ipc,&main_ipc,0,0); CloseLibrary(ModuleBase); // If it displayed ok, return if (ret) { Att_RemList(list,0); return; } } // Allocate buffer if (buffer=AllocVec(512,0)) { // Clear buffer buffer[0]=0; // Build about text for (node=(Att_Node *)list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { // Skip? if (node->data==3) continue; // Add to string strcat(buffer,node->node.ln_Name); if (node->data>0) { strcat(buffer,(node->data==2)?"\n\n":"\n"); } } // Display about text super_request_args( screen, buffer, SRF_SCREEN_PARENT|SRF_IPC, ipc, GetString(&locale,MSG_OKAY),0); // Free buffer FreeVec(buffer); } // Free list Att_RemList(list,0); }
Att_List *build_text_display(struct Window *window,ObjectList *objlist,char *text) { Att_List *list; struct TextExtent extent; short want_len,max_len,textlen=0,width; char *textpos=0; struct Rectangle rect; char old; // Allocate a new list list=Att_NewList(0); // Get list object size GetObjectRect(objlist,GAD_TEXT_DISPLAY,&rect); width=RECTWIDTH(&rect)-28; // Go through text FOREVER { // No current line? if (!textpos) textpos=text; // Move on from current line else { // Were we on a newline? if (textlen==0) ++textpos; // No else { // Bump pointer textpos+=textlen; // If this leaves us on a newline or space, skip over it if (*textpos=='\n' || *textpos=='\t') ++textpos; } } // End of text? if (!*textpos) break; // If we're on a space, skip over it if (*textpos==' ') ++textpos; // Calculate desired length of the line for (want_len=0;textpos[want_len] && textpos[want_len]!='\n';++want_len); // Blank line? if (want_len==0) { textlen=0; } // Not blank else { // Get maximum length that will actually fit max_len=TextFit( window->RPort, textpos, want_len, &extent, 0,1, width,window->RPort->TxHeight); // Go from here to end of current word want_len=max_len; while ( textpos[want_len] && textpos[want_len]!='\n' && textpos[want_len]!=' ') ++want_len; // Loop until successful do { // Get text size TextExtent(window->RPort,textpos,want_len,&extent); // Will it fit? if (extent.te_Width<=width) { // Save size textlen=want_len; break; } // Come backwards to word break for (--want_len;want_len>0 && textpos[want_len]!=' ';--want_len); // Didn't find one? if (want_len<1) { // Get maximum length want_len=max_len; } } while(1); } // Null out break temporarily old=textpos[textlen]; textpos[textlen]=0; // Add node Att_NewNode(list,textpos,0,0); // Restore character textpos[textlen]=old; } // Add list to display SetGadgetChoices(objlist,GAD_TEXT_DISPLAY,list); return list; }
// Rename some objects void icon_rename(IPCData *ipc,BackdropInfo *info,BackdropObject *icon) { Att_List *list; Att_Node *node; BackdropObject *object; BOOL save_pos=0; BPTR lock=0,old=0; // Group? if (info->flags&BDIF_GROUP) { GroupData *group; // Get group pointer group=(GroupData *)IPCDATA(info->ipc); // Build directory name lsprintf(info->buffer,"dopus5:groups/%s",group->name); // Lock directory if (!(lock=Lock(info->buffer,ACCESS_READ))) return; // Change directory old=CurrentDir(lock); } // Create list if (!(list=Att_NewList(0))) { if (lock) UnLock(CurrentDir(old)); return; } // Lock backdrop list lock_listlock(&info->objects,0); // Go through backdrop list (backwards, just for the hell of it) for (object=(BackdropObject *)info->objects.list.lh_TailPred; object->node.ln_Pred; object=(BackdropObject *)object->node.ln_Pred) { // Correct type? if (object->type!=BDO_APP_ICON && object->type!=BDO_BAD_DISK && !(object->flags&BDOF_CACHE)) { // Selected or supplied? if ((!icon && object->state) || icon==object) { // Add object to list Att_NewNode( list, (object->flags&BDOF_CUSTOM_LABEL)?object->device_name:object->name, (ULONG)object, 0); if (icon) break; } } } // Unlock backdrop list unlock_listlock(&info->objects); // Go through list of objects for (node=(Att_Node *)list->list.lh_Head; node->node.ln_Succ; node=(Att_Node *)node->node.ln_Succ) { char *name,*origname; BackdropObject *object; short ret,copy=1; BOOL retry,fail=0; if (!(name=AllocVec(512,0))) break; origname=name+256; // Loop on retries do { // Clear retry flag retry=0; // Copy name strcpy(name,node->node.ln_Name); // Build message lsprintf(info->buffer,GetString(&locale,MSG_RENAME_DISK),name); // Strip trailing colon for assigns if (name[(ret=(strlen(name)-1))]==':') name[ret]=0; // Copy original name strcpy(origname,name); // Ask for new name if (!(ret=super_request_args( info->window, info->buffer, SRF_BUFFER|SRF_IPC|SRF_PATH_FILTER|SRF_MOUSE_POS, name,255, ipc, GetString(&locale,MSG_OKAY), GetString(&locale,(node->node.ln_Succ->ln_Succ)?MSG_SKIP:MSG_CANCEL), (node->node.ln_Succ->ln_Succ)?GetString(&locale,MSG_CANCEL):0,0))) { // Cancel fail=1; break; } // Ok to rename? else if (ret!=2) { // Lock backdrop list lock_listlock(&info->objects,0); // Is object still valid?> if ((object=find_backdrop_object(info,(BackdropObject *)node->data))) { // Object in a group? if (info->flags&BDIF_GROUP) { // Must have custom label if (object->flags&BDOF_CUSTOM_LABEL) { // Try to rename object if (Rename(object->device_name,name)) { // Store new name strcpy(object->device_name,name); ret=1; copy=0; } } } // Assign? else if (object->flags&BDOF_ASSIGN) { BPTR lock; // Lock the assign if ((lock=Lock(object->name,ACCESS_READ))) { // Assign the new name to it while (!(ret=AssignLock(name,lock))) { // Failed, display requester if (!(error_request( info->window, ERF_MOUSE, GetString(&locale,MSG_RENAMING), -1, object->name, ":", 0))) break; } // Success? if (ret) { // Delete the old assignment AssignLock(origname,0); } // Otherwise free the lock else UnLock(lock); } } // Disk? else if (object->type==BDO_DISK) { // Try to relabel while (!(ret=OriginalRelabel(object->device_name,name))) { // Failed, display requester if (!(error_request( info->window, ERF_MOUSE, GetString(&locale,MSG_RENAMING), -1, object->name, ":", 0))) break; } // Success? if (ret) { // Pass name change through to things notify_disk_name_change(info,object->device_name,name); } } // Group, desktop folder else if (object->type==BDO_GROUP || (object->type==BDO_LEFT_OUT && object->flags&BDOF_DESKTOP_FOLDER)) { BPTR old=0,lock; // Change directory if ((lock=Lock(object->path,ACCESS_READ))) old=CurrentDir(lock); // Rename file if (!(ret=Rename(object->name,name))) { // Show error requester if (error_request( info->window, ERF_MOUSE, GetString(&locale,MSG_RENAMING), -1, object->name, ":", 0)) { // Set flag to retry retry=1; } } // Success? if (ret) { GroupData *group; // Add .infos on strcpy(info->buffer,object->name); strcat(info->buffer,".info"); strcpy(info->buffer+300,name); strcat(info->buffer+300,".info"); // Rename icon Rename(info->buffer,info->buffer+300); // Group? if (object->type==BDO_GROUP) { // Lock process list lock_listlock(&GUI->group_list,0); // See if group is open if ((group=backdrop_find_group(object))) { char *name_copy; // Get a copy of the name if ((name_copy=AllocVec(strlen(name)+1,0))) { // Signal it to update its name strcpy(name_copy,name); IPC_Command(group->ipc,GROUP_NEW_NAME,0,0,name_copy,0); } } // Unlock process list unlock_listlock(&GUI->group_list); } } // Restore directory if (lock) UnLock(CurrentDir(old)); } // Left-out else if (object->type==BDO_LEFT_OUT) { leftout_record *left; // Lock position list lock_listlock(&GUI->positions,0); // Look for entry for icon for (left=(leftout_record *)&GUI->positions.list.lh_Head; left->node.ln_Succ; left=(leftout_record *)left->node.ln_Succ) { // Leftout? if (left->node.ln_Type==PTYPE_LEFTOUT) { // Match this icon? if (object->misc_data==(ULONG)left) { // Store new label stccpy(left->icon_label,name,sizeof(left->icon_label)); save_pos=1; break; } } } // Unlock position list unlock_listlock(&GUI->positions); // Store name in icon if (object->flags&BDOF_CUSTOM_LABEL) { strcpy(object->device_name,name); ret=1; copy=0; } } // Successful? if (ret) { // Erase object backdrop_erase_icon(info,object,0); // Store new name if (copy) { strcpy(object->name,name); if (object->flags&BDOF_ASSIGN) strcat(object->name,":"); } // Show new object backdrop_render_object(info,object,BRENDERF_CLIP); } } // Unlock backdrop list unlock_listlock(&info->objects); } } while (retry); // Abort? FreeVec(name); if (fail) break; } // Free list Att_RemList(list,0); // Lock backdrop list lock_listlock(&info->objects,0); // Save any left-outs if (save_pos) { // Lock list lock_listlock(&GUI->positions,0); // Save list SavePositions(&GUI->positions.list,GUI->position_name); // Unlock list unlock_listlock(&GUI->positions); } // Unlock backdrop list unlock_listlock(&info->objects); // Restore CD if (lock) UnLock(CurrentDir(old)); }