886
ddjvu_document_s::want_pageinfo()
888
if (doc && docinfoflag && !pageinfoflag)
891
int doctype = doc->get_doc_type();
892
if (doctype == DjVuDocument::BUNDLED ||
893
doctype == DjVuDocument::OLD_BUNDLED )
897
GMonitorLock lock(&monitor);
898
if (streams.contains(0))
901
if (pool && doctype == DjVuDocument::BUNDLED)
903
GP<DjVmDir> dir = doc->get_djvm_dir();
905
for (int i=0; i<dir->get_files_num(); i++)
907
GP<DjVmDir::File> f = dir->pos_to_file(i);
908
if (! pool->has_data(f->offset, f->size))
909
pool->add_trigger(f->offset, f->size, callback, (void*)this );
912
else if (pool && doctype == DjVuDocument::OLD_BUNDLED)
914
GP<DjVmDir0> dir = doc->get_djvm_dir0();
916
for (int i=0; i<dir->get_files_num(); i++)
918
GP<DjVmDir0::FileRec> f = dir->get_file(i);
919
if (! pool->has_data(f->offset, f->size))
920
pool->add_trigger(f->offset, f->size, callback, (void*)this );
879
929
// ----------------------------------------
1172
1225
GP<DjVmDir0::FileRec> frec = dir0->get_file(fileno);
1174
1227
G_THROW("Illegal file number");
1175
info->size = frec->size;
1176
info->id = (const char*) frec->name;
1177
info->name = info->title = info->id;
1228
myinfo.size = frec->size;
1229
myinfo.id = (const char*) frec->name;
1230
myinfo.name = myinfo.title = myinfo.id;
1179
1232
return DDJVU_JOB_STARTED;
1180
1233
else if (nav->name_to_page(frec->name) >= 0)
1237
memcpy(info, &myinfo, infosz);
1184
1238
return DDJVU_JOB_OK;
1188
1242
if (fileno<0 || fileno>=doc->get_pages_num())
1189
1243
G_THROW("Illegal file number");
1191
info->pageno = fileno;
1245
myinfo.pageno = fileno;
1193
1247
GP<DjVuNavDir> nav = doc->get_nav_dir();
1194
info->id = (nav) ? (const char *) nav->page_to_name(fileno) : 0;
1195
info->name = info->title = info->id;
1248
myinfo.id = (nav) ? (const char *) nav->page_to_name(fileno) : 0;
1249
myinfo.name = myinfo.title = myinfo.id;
1196
1250
GP<DjVuFile> file = doc->get_djvu_file(fileno, true);
1197
1251
GP<DataPool> pool = (file) ? file->get_init_data_pool() : 0;
1198
info->size = (pool) ? pool->get_length() : -1;
1252
myinfo.size = (pool) ? pool->get_length() : -1;
1253
memcpy(info, &myinfo, infosz);
1199
1254
return DDJVU_JOB_OK;
2410
GMonitorLock lock(&document->monitor);
2411
GPosition p = document->thumbnails.contains(pagenum);
2412
2465
GP<ddjvu_thumbnail_p> thumb;
2415
thumb = document->thumbnails[p];
2419
DjVuDocument *doc = document->doc;
2466
DjVuDocument* doc = document->doc;
2469
GMonitorLock lock(&document->monitor);
2470
GPosition p = document->thumbnails.contains(pagenum);
2472
thumb = document->thumbnails[p];
2420
2476
GP<DataPool> pool = doc->get_thumbnail(pagenum, !start);
2479
GMonitorLock lock(&document->monitor);
2423
2480
thumb = new ddjvu_thumbnail_p;
2424
2481
thumb->document = document;
2425
2482
thumb->pagenum = pagenum;
2426
2483
thumb->pool = pool;
2427
2484
document->thumbnails[pagenum] = thumb;
2428
pool->add_trigger(-1, ddjvu_thumbnail_p::callback,
2429
(void*)(ddjvu_thumbnail_p*)thumb);
2487
pool->add_trigger(-1, ddjvu_thumbnail_p::callback,
2488
(void*)(ddjvu_thumbnail_p*)thumb);
2433
2491
return DDJVU_JOB_NOTSTARTED;
2434
2492
else if (thumb->pool)
2963
ddjvu_savejob_s::notify_file_flags_changed(const DjVuFile *file, long mask, long)
3041
ddjvu_savejob_s::notify_file_flags_changed(const DjVuFile *file,
2965
if (mask & (DjVuFile::ALL_DATA_PRESENT ||
2966
DjVuFile::DECODE_FAILED || DjVuFile::DECODE_STOPPED ||
2967
DjVuFile::STOPPED || DjVuFile::DECODE_STOPPED ))
3044
if (mask & (DjVuFile::ALL_DATA_PRESENT | DjVuFile::DATA_PRESENT |
3045
DjVuFile::DECODE_FAILED | DjVuFile::DECODE_STOPPED |
3046
DjVuFile::STOPPED | DjVuFile::DECODE_STOPPED ))
2969
3048
GMonitorLock lock(&monitor);
2970
3049
monitor.signal();
3054
ddjvu_savejob_s::parse_pagespec(const char *s, int npages, bool *flags)
3059
int end_page = npages;
3069
if (*p>='0' && *p<='9') {
3070
end_page = strtol(p, &p, 10);
3072
} else if (*p=='$') {
3084
start_page = end_page;
3094
if (*p && *p != ',')
3104
if (end_page > npages)
3106
if (start_page > npages)
3107
start_page = npages;
3108
if (start_page <= end_page)
3109
for(pageno=start_page; pageno<=end_page; pageno++)
3110
flags[pageno-1] = true;
3112
for(pageno=start_page; pageno>=end_page; pageno--)
3113
flags[pageno-1] = true;
3121
ddjvu_savejob_s::mark_included_files(DjVuFile *file)
3123
GP<DataPool> pool = file->get_init_data_pool();
3124
GP<ByteStream> str(pool->get_stream());
3125
GP<IFFByteStream> iff(IFFByteStream::create(str));
3127
if (!iff->get_chunk(chkid))
3129
while (iff->get_chunk(chkid))
3131
if (chkid == "INCL")
3133
GP<ByteStream> incl = iff->get_bytestream();
3137
while((length=incl->read(buffer, 1024)))
3138
fileid += GUTF8String(buffer, length);
3139
for (int i=0; i<comp_ids.size(); i++)
3140
if (fileid == comp_ids[i] && !comp_flags[i])
3146
pool->clear_stream();
2975
3150
ddjvu_savejob_s::run()
2977
3152
DjVuDocument *doc = mydoc->doc;
2978
3153
doc->wait_for_complete_init();
2979
// Determine which components to save
2981
GArray<GUTF8String> comp_ids;
2982
GPArray<DjVuFile> comp_files;
3155
// Determine which pages to save
3156
int npages = doc->get_pages_num();
3157
GTArray<bool> page_flags(0, npages-1);
3160
for (int pageno=0; pageno<npages; pageno++)
3161
page_flags[pageno] = true;
3165
const char *s = pages;
3166
while (*s && *s!='=')
3168
for (int pageno=0; pageno<npages; pageno++)
3169
page_flags[pageno] = false;
3170
if ((*s != '=') || !parse_pagespec(s+1, npages, (bool*)page_flags))
3171
complain(pages,"Illegal page specification");
3172
if (doc->get_doc_type()==DjVuDocument::OLD_BUNDLED ||
3173
doc->get_doc_type()==DjVuDocument::OLD_INDEXED )
3174
complain(pages,"Saving subsets of obsolete formats is not supported");
3177
// Determine which component files to save
2983
3179
if (doc->get_doc_type()==DjVuDocument::BUNDLED ||
2984
3180
doc->get_doc_type()==DjVuDocument::INDIRECT)
2986
3182
GP<DjVmDir> dir = doc->get_djvm_dir();
2987
ncomp = dir->get_files_num();
2988
comp_ids.resize(ncomp - 1);
2989
comp_files.resize(ncomp - 1);
3183
ncomps = dir->get_files_num();
3184
comp_ids.resize(ncomps - 1);
3185
comp_flags.resize(ncomps - 1);
3186
comp_files.resize(ncomps - 1);
2990
3188
GPList<DjVmDir::File> flist = dir->get_files_list();
2991
3189
GPosition pos=flist;
2992
for (int comp=0; comp<ncomp; ++pos, ++comp)
2993
comp_ids[comp] = flist[pos]->get_load_name();
2997
ncomp = doc->get_pages_num();
2998
comp_ids.resize(ncomp - 1);
2999
comp_files.resize(ncomp - 1);
3000
{ // extra nesting for windows
3001
for (int comp=0; comp<ncomp; comp++)
3002
comp_ids[comp] = GUTF8String(comp);
3005
// Monitoring download progress
3190
for (int comp=0; comp<ncomps; ++pos, ++comp)
3192
DjVmDir::File *file = flist[pos];
3193
comp_ids[comp] = file->get_load_name();
3194
comp_flags[comp] = 0;
3195
if (file->is_page() && page_flags[pageno++])
3196
comp_flags[comp] = 1;
3202
comp_flags.resize(ncomps - 1);
3203
comp_files.resize(ncomps - 1);
3204
for (int comp=0; comp<ncomps; ++comp)
3205
comp_flags[comp] = page_flags[comp];
3008
3209
get_portcaster()->add_route(doc, this);
3009
while (lo < ncomp && !mystop)
3011
int in_progress = 0;
3216
for (comp=0; comp<ncomps; comp++)
3218
int flags = comp_flags[comp];
3223
else if (!comp_files[comp]->is_data_present())
3227
comp_flags[comp] += 1;
3228
mark_included_files(comp_files[comp]);
3231
for (comp=0; comp<ncomps; comp++)
3232
if (comp_flags[comp] > 0)
3234
progress(loaded * 100 / wanted);
3235
if (wanted == loaded)
3237
for (comp=0; comp<ncomps && asked < 2; comp++)
3238
if (comp_flags[comp] == 1)
3240
if (comp_ids.size() > 0)
3241
comp_files[comp] = doc->get_djvu_file(comp_ids[comp]);
3243
comp_files[comp] = doc->get_djvu_file(comp);
3244
comp_flags[comp] += 1;
3245
if (!comp_files[comp]->is_data_present())
3012
3248
GMonitorLock lock(&monitor);
3013
while (lo<hi && comp_files[lo]->is_data_present())
3015
{ // extra nesting for windows
3016
for (int comp=lo; comp<hi; comp++)
3249
for (comp=0; comp<ncomps; comp++)
3250
if (comp_flags[comp] == 2)
3017
3251
if (! comp_files[comp]->is_data_present())
3020
while (hi<ncomp && in_progress < 2)
3022
comp_files[hi] = doc->get_djvu_file(comp_ids[hi]);
3026
if (in_progress > 0)
3258
G_THROW(DataPool::Stop);
3263
djvm = doc->get_djvm_doc();
3267
djvm = DjVmDoc::create();
3268
GP<DjVmDir> dir = doc->get_djvm_dir();
3269
GPList<DjVmDir::File> flist = dir->get_files_list();
3270
GPosition pos=flist;
3272
for (int comp=0; comp<ncomps; ++pos, ++comp)
3274
if (flist[pos]->is_page())
3276
if (comp_flags[comp])
3278
GP<DjVmDir::File> f = new DjVmDir::File(*flist[pos]);
3279
if (f->is_page() && f->get_save_name()==f->get_title())
3280
f->set_title(GUTF8String(pageno));
3281
GP<DjVuFile> file = comp_files[comp];
3282
GP<DataPool> data = file->get_init_data_pool();
3283
djvm->insert_file(f, data);
3289
else if (odir.is_valid() && oname.length() > 0)
3290
djvm->expand(odir, oname);
3033
3291
return DDJVU_JOB_OK;