char *locate(const char *name, int type) { char fname[256], *newpath, *newname, *fspec, *title; boolean result = FALSE; int ex_flags; if (type == L_FOLDER) { if ((fspec = fn_make_path(name, "*")) == NULL) /* HR 271102 */ return NULL; fname[0] = 0; ex_flags = EX_DIR; } else { if ( (fspec = fn_make_newname( name, ( (type == L_LOADCFG) || (type == L_SAVECFG) ) ? CFG_EXT : "*" /* HR 271102 */ ) ) == NULL ) return NULL; strcpy(fname, fn_get_name(name)); ex_flags = EX_FILE; } rsrc_gaddr(R_STRING, FSTLFILE + type, &title); do { newpath = xfileselector(fspec, fname, title); free(fspec); if (newpath == NULL) return NULL; if (type == L_FOLDER) { if (((newname = fn_get_path(newpath)) != NULL) && (isroot(newname) == TRUE)) { alert_printf(1, MNOROOT); free(newname); } else result = TRUE; } else { if ((type == L_PROGRAM) && (prg_isprogram(fname) == FALSE)) alert_printf(1, MFNPRG, fname); else { if (((newname = fn_make_newname(newpath, fname)) != NULL) && (type != L_SAVECFG)) { result = x_exist(newname, ex_flags); if (result == FALSE) { alert_printf(1, MFNEXIST, fname); free(newname); } } else result = TRUE; } } fspec = newpath; } while (result == FALSE); free(newpath); return newname; }
boolean item_print(WINDOW *wd, int n, int *list) { int i = 0, button, result = 0; boolean noerror = TRUE; /* DjV 031 070203 ---vvv--- */ /* XDINFO info; */ long nfiles=0, nfolders=0, nbytes=0, error; const char *name; /* DjV 031 070203 ---^^^--- */ if (check_print(wd, n, list) == FALSE) return FALSE; /* DjV 031 080203 ---vvv--- */ /* rsc_ltoftext(print, NITEMS, n); */ /* xd_open(print, &info); */ if ( count_items(wd, n, list, &nfolders, &nfiles, &nbytes) ) /* HR 151102: always display. */ { /* DjV 031 140203 */ cv_fntoform ( copyinfo + CPFOLDER, fn_get_name(dir_path(wd)) ); /* DjV 031 140203 */ cv_fntoform ( copyinfo + CPFILE, itm_name(wd, list[0]) ); /* DjV 031 140203 */ button = open_cfdialog( CF_PRINT, 0L, (long)n, nbytes, CMD_PRINT ); /* DJV 031 070203 */ } /* DjV 031 140203 */ else button = 0; /* if (button == PRINTOK) */ if ( button == COPYOK ) /* DjV 031 080203 ---^^^--- */ { if ((i < n) && (result != XFATAL) && (result != XABORT)) { /* DjV 031 080203 ---vvv--- */ name = itm_name(wd, list[i]); upd_name( dir_path(wd), CPFOLDER ); upd_name ( name, CPFILE ); /* DjV 031 080203 ---^^^--- */ result = print_file(wd, list[i]); if (result == XFATAL) noerror = FALSE; /* DJV 031 070203 150203 ---vvv--- */ /* rsc_ltoftext(print, NITEMS, n - i - 1); xd_draw(&info, NITEMS, 1); */ if ((error = itm_attrib(wd, list[i], 0, &pattr)) == 0) { nbytes -= pattr.size; upd_copyinfo ( 0L, n - i - 1, nbytes ); } else result = copy_error(error, name, 0); /* 0= any op but move or delete is "copy" */ /* DjV 031 070203 150203 ---^^^--- */ i++; } } else noerror = FALSE; /* DjV 031 070203 ---vvv--- */ /* xd_change(&info, button, NORMAL, 0); xd_close(&info); */ if ( button != 0 ) close_cfdialog( button ); /* DjV 031 070203 ---^^^--- */ return noerror; }
/* Service */ bool CService::load_module(const int64_t id, const char* path){ if(!Super::load_module(id, path)) return false; if(!path) return false; m_id =id; // load dll m_dl =::dlopen(path, RTLD_NOW | RTLD_GLOBAL); if(m_dl == 0){ const char* err =::dlerror(); ERROR("fail to call dlopen <%s>, %s", path, err ? err : "no error"); return false; } // object pool manager OPH(); // set path String* p =String::NewString(path); ASSIGN_POINTER(m_path, p); // get name { const char* (*fn_get_name)() =(const char* (*)())::dlsym(m_dl, "get_name"); if(!fn_get_name){ const char* err =::dlerror(); ERROR("fail to call dlsym <%s, get_name>, %s", path, err ? err : "no error"); unload_module(); return false; } const char* name =fn_get_name(); if(!name) name ="unnamed"; CLEAN_POINTER(m_name); m_name =String::NewString(name); m_name->retain(); } // get desc { const char* (*fn_get_desc)() =(const char* (*)())::dlsym(m_dl, "get_desc"); if(!fn_get_desc){ const char* err =::dlerror(); ERROR("fail to call dlsym <%s, get_desc>, %s", path, err ? err : "no error"); unload_module(); return false; } const char* desc =fn_get_desc(); if(!desc) desc =""; CLEAN_POINTER(m_desc); m_desc =String::NewString(desc); m_desc->retain(); } // get on_load { m_on_load =(PFN_ON_LOAD)::dlsym(m_dl, "on_load"); if(!m_on_load){ const char* err =::dlerror(); ERROR("fail to call dlsym <%s, on_load>, %s", path, err ? err : "no error"); unload_module(); return false; } } // get on_update { m_on_update =(PFN_ON_UPDATE)::dlsym(m_dl, "on_update"); if(!m_on_update){ const char* err =::dlerror(); ERROR("fail to call dlsym <%s, on_update>, %s", path, err ? err : "no error"); unload_module(); return false; } } // get on_start_command { m_on_start_command =(PFN_ON_START_COMMAND)::dlsym(m_dl, "on_start_command"); if(!m_on_start_command){ const char* err =::dlerror(); ERROR("fail to call dlsym <%s, on_start_command>, %s", path, err ? err : "no error"); unload_module(); return false; } } // get on_unload { m_on_unload =(PFN_ON_UNLOAD)::dlsym(m_dl, "on_unload"); if(!m_on_unload){ const char* err =::dlerror(); ERROR("fail to call dlsym <%s, on_unload>, %s", path, err ? err : "no error"); unload_module(); return false; } } return true; }