void TextureFragment::SetFilename(const Data *data) { filename = ConvertFilename(data, stringId); }
int btFiles::BuildFromMI(const char *metabuf, const size_t metabuf_len, const char *saveas) { char path[MAXPATHLEN]; const char *s, *p; size_t r,q,n; int64_t t; int f_warned = 0; if( !decode_query(metabuf, metabuf_len, "info|name", &s, &q, (int64_t*)0, QUERY_STR) || MAXPATHLEN <= q ) return -1; memcpy(path, s, q); path[q] = '\0'; r = decode_query(metabuf, metabuf_len, "info|files", (const char**)0, &q, (int64_t*)0, QUERY_POS); if( r ){ BTFILE *pbf_last = (BTFILE*) 0; BTFILE *pbf = (BTFILE*) 0; size_t dl; if( decode_query(metabuf,metabuf_len,"info|length", (const char**) 0,(size_t*) 0,(int64_t*) 0,QUERY_LONG) ) return -1; if( saveas ){ m_directory = new char[strlen(saveas) + 1]; #ifndef WINDOWS if(!m_directory) return -1; #endif strcpy(m_directory,saveas); }else{ int f_conv; char *tmpfn = new char[strlen(path)*2+5]; #ifndef WINDOWS if( !tmpfn ) return -1; #endif if( f_conv = ConvertFilename(tmpfn, path, strlen(path)*2+5) ){ if( arg_flg_convert_filenames ){ m_directory = new char[strlen(tmpfn) + 1]; #ifndef WINDOWS if( !m_directory ){ delete []tmpfn; return -1; } #endif strcpy(m_directory,tmpfn); }else{ CONSOLE.Warning(3, "Dir name contains non-printable characters; use -T to convert."); f_warned = 1; } } delete []tmpfn; if( !f_conv || !arg_flg_convert_filenames ){ m_directory = new char[strlen(path) + 1]; #ifndef WINDOWS if( !m_directory ) return -1; #endif strcpy(m_directory,path); } } /* now r saved the pos of files list. q saved list length */ p = metabuf + r + 1; q--; for(; q && 'e' != *p; p += dl, q -= dl){ if(!(dl = decode_dict(p, q, (const char*) 0)) ) return -1; if( !decode_query(p, dl, "length", (const char**) 0, (size_t*) 0,&t,QUERY_LONG) ) return -1; pbf = _new_bfnode(); #ifndef WINDOWS if( !pbf ) return -1; #endif pbf->bf_length = t; m_total_files_length += t; r = decode_query(p, dl, "path", (const char **)0, &n, (int64_t*)0, QUERY_POS); if( !r ) return -1; if(!decode_list2path(p + r, n, path)) return -1; int f_conv; char *tmpfn = new char[strlen(path)*2+5]; #ifndef WINDOWS if( !tmpfn ) return -1; #endif if( f_conv = ConvertFilename(tmpfn, path, strlen(path)*2+5) ){ if( arg_flg_convert_filenames ){ pbf->bf_filename = new char[strlen(tmpfn) + 1]; #ifndef WINDOWS if( !pbf->bf_filename ){ delete []tmpfn; return -1; } #endif strcpy(pbf->bf_filename, tmpfn); }else if(!f_warned){ CONSOLE.Warning(3, "Filename contains non-printable characters; use -T to convert."); f_warned = 1; } } delete []tmpfn; if( !f_conv || !arg_flg_convert_filenames ){ pbf->bf_filename = new char[strlen(path) + 1]; #ifndef WINDOWS if( !pbf->bf_filename ) return -1; #endif strcpy(pbf->bf_filename, path); } if(pbf_last) pbf_last->bf_next = pbf; else m_btfhead = pbf; pbf_last = pbf; } }else{ if( !decode_query(metabuf,metabuf_len,"info|length", (const char**) 0,(size_t*) 0,&t,QUERY_LONG) ) return -1; m_btfhead = _new_bfnode(); #ifndef WINDOWS if( !m_btfhead) return -1; #endif m_btfhead->bf_length = m_total_files_length = t; if( saveas ){ m_btfhead->bf_filename = new char[strlen(saveas) + 1]; #ifndef WINDOWS if(!m_btfhead->bf_filename ) return -1; #endif strcpy(m_btfhead->bf_filename, saveas); }else if( arg_flg_convert_filenames ){ char *tmpfn = new char[strlen(path)*2+5]; #ifndef WINDOWS if( !tmpfn ) return -1; #endif ConvertFilename(tmpfn, path, strlen(path)*2+5); m_btfhead->bf_filename = new char[strlen(tmpfn) + 1]; #ifndef WINDOWS if( !m_btfhead->bf_filename ){ delete []tmpfn; return -1; } #endif strcpy(m_btfhead->bf_filename, tmpfn); delete []tmpfn; }else{ m_btfhead->bf_filename = new char[strlen(path) + 1]; #ifndef WINDOWS if(!m_btfhead->bf_filename ) return -1; #endif strcpy(m_btfhead->bf_filename, path); } } return 0; }