BITMAP* BitmapCache::GetBitmap(const std::string& filename) { //Return NULL if a bad filename was passed. if(filename.empty()) return nullptr; if(exists(filename.c_str()) == false) return nullptr; //Reduce incorrect results by forcing slash equality. std::string f(filename); f = fix_filename_slashes(&f[0]); //Clean the cache if it's dirty. CleanCache(); //Search for requested BITMAP. MapStrBmpIter _iter = _cache.find(f); //If found, return it. if(_iter != _cache.end()) { _iter->second.first++; return _iter->second.second; } //Otherwise, create it, store it, then return it. BITMAP* result = load_bitmap(f.c_str(), nullptr); if(result == nullptr) return nullptr; _cache.insert(std::make_pair(f, std::make_pair(static_cast<long>(1), result))); return result; }
void edit_qt() //this is used to set the quest template for the current quest { char tpath[2048]; char tpath2[2048]; strcpy(temppath, header.templatepath); if(temppath[0]==0) { getcwd(temppath,2048); fix_filename_case(temppath); fix_filename_slashes(temppath); put_backslash(temppath); } bool gotname; gotname=getname("Load Quest Template (.zqt)","zqt",NULL,temppath,true); if(gotname) { strcpy(tpath, temppath); chop_path(tpath); getcwd(tpath2,2048); fix_filename_case(tpath2); fix_filename_slashes(tpath2); put_backslash(tpath2); if(!strcmp(tpath, tpath2)) { strcpy(header.templatepath, get_filename(temppath)); } else { strcpy(header.templatepath, temppath); } if(!valid_zqt(temppath)) { jwin_alert("ZQuest","Invalid Quest Template",NULL,NULL,"O&K",NULL,'k',0,lfont); memset(header.templatepath, 0, 2048); } } }
void BitmapCache::IncrementRefCount(const std::string& name) { if(name.empty()) return; std::string n(name); n = fix_filename_slashes(&n[0]); MapStrBmpIter _iter = _cache.find(n); if(_iter != _cache.end()) { _iter->second.first++; } }
BITMAP* BitmapCache::RetrieveBitmap(const std::string& name) { if(name.empty()) return nullptr; std::string n(name); n = fix_filename_slashes(&n[0]); MapStrBmpIter _iter = _cache.find(n); if(_iter != _cache.end()) { _iter->second.first++; return _iter->second.second; } return nullptr; }
void BitmapCache::StoreBitmap(const std::string& name, BITMAP* bmp) { if(name.empty() || bmp == nullptr) return; CleanCache(); std::string n(name); n = fix_filename_slashes(&n[0]); MapStrBmpIter _iter = _cache.find(n); //Bitmap already exists in cache, do not store it. if(_iter != _cache.end()) { return; } _cache.insert(std::make_pair(n, std::make_pair(static_cast<long>(0), bmp))); }
/* File Name Concatenator basically on Windows / DOS */ char *ci_find_file(char *dir_name, char *file_name) { char *diamond = NULL; if (dir_name == NULL && file_name == NULL) return NULL; if (dir_name == NULL) { diamond = (char *)malloc(strlen(file_name) + 3); strcpy(diamond, file_name); } else { diamond = (char *)malloc(strlen(dir_name) + strlen(file_name) + 2); append_filename(diamond, dir_name, file_name, strlen(dir_name) + strlen(file_name) + 2); } fix_filename_case(diamond); fix_filename_slashes(diamond); return diamond; }
bool validate_user_file_path(const char *fnmm, char *output, bool currentDirOnly) { if (strncmp(fnmm, "$SAVEGAMEDIR$", 13) == 0) { fnmm += 14; sprintf(output, "%s%s", saveGameDirectory, fnmm); } else if (strncmp(fnmm, "$APPDATADIR$", 12) == 0) { fnmm += 13; const char *appDataDir = platform->GetAllUsersDataDirectory(); if (appDataDir == NULL) appDataDir = "."; if (game.saveGameFolderName[0] != 0) { sprintf(output, "%s/%s", appDataDir, game.saveGameFolderName); fix_filename_slashes(output); mkdir(output); } else { strcpy(output, appDataDir); } put_backslash(output); strcat(output, fnmm); } else { get_current_dir_path(output, fnmm); } // don't allow access to files outside current dir if (!currentDirOnly) { } else if ((strchr (fnmm, '/') != NULL) || (strchr(fnmm, '\\') != NULL) || (strstr(fnmm, "..") != NULL) || (strchr(fnmm, ':') != NULL)) { debug_log("Attempt to access file '%s' denied (not current directory)", fnmm); return false; } return true; }
/* Case Insensitive File Find */ char *ci_find_file(char *dir_name, char *file_name) { struct stat statbuf; struct dirent *entry = NULL; DIR *rough = NULL; DIR *prevdir = NULL; char *diamond = NULL; char *directory = NULL; char *filename = NULL; if (dir_name == NULL && file_name == NULL) return NULL; if (!(dir_name == NULL)) { fix_filename_case(dir_name); fix_filename_slashes(dir_name); } fix_filename_case(file_name); fix_filename_slashes(file_name); if (dir_name == NULL) { char *match = NULL; int match_len = NULL; int dir_len = NULL; match = get_filename(file_name); if (match == NULL) return NULL; match_len = strlen(match); dir_len = (match - file_name); if (dir_len == 0) { directory = (char *)malloc(2); strcpy(directory,"."); } else { directory = (char *)malloc(dir_len + 1); strncpy(directory, file_name, dir_len); directory[dir_len] = '\0'; } filename = (char *)malloc(match_len + 1); strncpy(filename, match, match_len); filename[match_len] = '\0'; } else { directory = (char *)malloc(strlen(dir_name) + 1); strcpy(directory, dir_name); filename = (char *)malloc(strlen(file_name) + 1); strcpy(filename, file_name); } if ((prevdir = opendir(".")) == NULL) { fprintf(stderr, "ci_find_file: cannot open current working directory\n"); return NULL; } if (chdir(directory) == -1) { fprintf(stderr, "ci_find_file: cannot change to directory: %s\n", directory); return NULL; } if ((rough = opendir(directory)) == NULL) { fprintf(stderr, "ci_find_file: cannot open directory: %s\n", directory); return NULL; } while ((entry = readdir(rough)) != NULL) { lstat(entry->d_name, &statbuf); if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode)) { if (strcasecmp(filename, entry->d_name) == 0) { #ifdef _DEBUG fprintf(stderr, "ci_find_file: Looked for %s in rough %s, found diamond %s.\n", filename, directory, entry->d_name); #endif _DEBUG diamond = (char *)malloc(strlen(directory) + strlen(entry->d_name) + 2); append_filename(diamond, directory, entry->d_name, strlen(directory) + strlen(entry->d_name) + 2); break; } } } closedir(rough); fchdir(dirfd(prevdir)); closedir(prevdir); free(directory); free(filename); return diamond; }
/* jwin_file_select_ex: * Displays the JWin file selector, with the message as caption. * Allows the user to select a file, and stores the selection in the * path buffer, whose length in bytes is given by size and should have * room for at least 80 characters. The files are filtered according to * the file extensions in ext. Passing NULL includes all files, "PCX;BMP" * includes only files with .PCX or .BMP extensions. Returns zero if it * was closed with the Cancel button or non-zero if it was OK'd. */ int jwin_file_select_ex(AL_CONST char *message, char *path, AL_CONST char *ext, int size, int width, int height, FONT *title_font) { static attrb_state_t default_attrb_state[ATTRB_MAX] = DEFAULT_ATTRB_STATE; int ret; char *p; char tmp[32]; ASSERT(message); ASSERT(path); if(title_font) { file_selector[0].dp2=title_font; } if(width == OLD_FILESEL_WIDTH) width = 304; #ifdef HAVE_DIR_LIST if(height == OLD_FILESEL_HEIGHT) height = 160; #else if(height == OLD_FILESEL_HEIGHT) height = 188; #endif /* for fs_dlist_proc() */ ASSERT(size >= 4 * uwidth_max(U_CURRENT)); usetc(updir, 0); file_selector[FS_WIN].dp = (char *)message; file_selector[FS_EDIT].d1 = size/uwidth_max(U_CURRENT) - 1; file_selector[FS_EDIT].dp = path; file_selector[FS_OK].dp = (void*)get_config_text("OK"); file_selector[FS_CANCEL].dp = (void*)get_config_text("Cancel"); /* Set default attributes. */ memcpy(attrb_state, default_attrb_state, sizeof(default_attrb_state)); /* Parse extension string. */ // if (ext)// && ugetc(ext)) { parse_extension_string(ext); } if(!ugetc(path)) { #ifdef HAVE_DIR_LIST int drive = _al_getdrive(); #else int drive = 0; #endif _al_getdcwd(drive, path, size - ucwidth(OTHER_PATH_SEPARATOR)); fix_filename_case(path); fix_filename_slashes(path); put_backslash(path); } clear_keybuf(); do { } while(gui_mouse_b()); file_selector[FS_TYPES].proc = fs_dummy_proc; enlarge_file_selector(width, height); ret = popup_zqdialog(file_selector, FS_EDIT); if(fext) { zc_free(fext); fext = NULL; } if(fext_p) { _al_free(fext_p); fext_p = NULL; } if((ret == FS_CANCEL) || (ret == FS_WIN) || (!ugetc(get_filename(path)))) return FALSE; p = get_extension(path); if((!ugetc(p)) && (ext) && (!ustrpbrk(ext, uconvert_ascii(" ,;", tmp)))) { size -= ((long)(size_t)p - (long)(size_t)path + ucwidth('.')); if(size >= uwidth_max(U_CURRENT) + ucwidth(0)) /* do not end with '.' */ { p += usetc(p, '.'); ustrzcpy(p, size, ext); } } return TRUE; }
int raine_file_select_ex( char *message, char *path, char *ext, int size,int width, int height) { char buf[512]; int ret; char *p; if (width == -1) width = 305; #ifdef HAVE_DIR_LIST if (height == -1) height = 161; #else if (height == -1) height = 189; #endif /* for fs_dlist_proc() */ ASSERT(size >= 4 * uwidth_max(U_CURRENT)); ustrcpy(updir, empty_string); file_selector[FS_MESSAGE].dp = (char *)message; file_selector[FS_EDIT].d1 = size/uwidth_max(U_CURRENT) - 1; file_selector[FS_EDIT].dp = path; file_selector[FS_OK].dp = (void*)raine_get_config_text("OK"); file_selector[FS_CANCEL].dp = (void*)raine_get_config_text("Cancel"); fext = ext; if (!ugetc(path)) { if (!getcwd(buf, sizeof(buf))) buf[0]=0; do_uconvert(buf, U_ASCII, path, U_CURRENT, size); fix_filename_case(path); fix_filename_slashes(path); put_backslash(path); } clear_keybuf(); do { } while (gui_mouse_b()); stretch_dialog(file_selector, width, height); centre_dialog(file_selector); // Stupid correction of the allegro colors... file_selector[FS_FILES].fg = CGUI_COL_TEXT_1; file_selector[FS_FILES].bg = CGUI_BOX_COL_MIDDLE; #ifdef HAVE_DIR_LIST /* not all platforms need a directory list */ file_selector[FS_DISKS].fg = CGUI_COL_TEXT_1; file_selector[FS_DISKS].bg = CGUI_BOX_COL_MIDDLE; #endif ret = do_dialog(file_selector, FS_EDIT); if (ret == FS_CANCEL) return FALSE; p = get_extension(path); if ((!ugetc(p)) && (ext) && (!ustrpbrk(ext, uconvert_ascii(" ,;", NULL)))) { p += usetc(p, '.'); ustrcpy(p, ext); } return TRUE; }
void edit_qt(int index) { int ret; quest_template tqt; char tpath[2048]; char tpath2[2048]; tqt=QuestTemplates[index]; editqt_dlg[0].dp2=lfont; do { editqt_dlg[6].dp=QuestTemplates[index].name; editqt_dlg[8].dp=QuestTemplates[index].path; strcpy(temppath, QuestTemplates[index].path); bool gotname; if(is_large) large_dialog(editqt_dlg); ret=zc_popup_dialog(editqt_dlg,6); switch(ret) { case 2: gotname=getname("Load Quest Template (.zqt)","zqt",NULL,temppath,true); if(gotname) { strcpy(tpath, temppath); chop_path(tpath); getcwd(tpath2,2048); fix_filename_case(tpath2); fix_filename_slashes(tpath2); put_backslash(tpath2); if(!strcmp(tpath, tpath2)) { strcpy(QuestTemplates[index].path, get_filename(temppath)); } else { strcpy(QuestTemplates[index].path, temppath); } } break; case 3: if(!valid_zqt(temppath)) { ret=2; jwin_alert("ZQuest","Invalid Quest Template",NULL,NULL,"O&K",NULL,'k',0,lfont); break; } if(index==qt_count) { ++qt_count; } break; case 4: QuestTemplates[index]=tqt; break; } } while(ret==2); }