1 //========================================================================
5 // Copyright 1999-2002 Emmanuel Lesueur
7 //========================================================================
12 #include <exec/types.h>
15 #include "apdf/AComm.h"
17 #include "AOutputDev.h"
18 #include "apdf/io_client.h"
29 extern volatile int *abortFlagPtr
;
30 extern volatile int *drawStatePtr
;
31 extern int lastDrawState
;
32 extern struct Error
*errors
;
36 int init(int errors
,volatile int*,volatile int*);
37 void use_prefs(int,const char*,size_t,size_t);
38 int get_page_size(PDFDoc
*,int page
,int* width
,int* height
,int* rotate
);
39 PDFDoc
* create_doc(BPTR
,const char* filename
,int*,const char*,const char*);
40 void delete_doc(PDFDoc
*);
41 AOutputDev
* create_output_dev(UBYTE
*map
,int size
);
42 void delete_output_dev(AOutputDev
*);
43 int simple_find(AOutputDev
* aout
,const char* str
,int top
,int* xmin
,int* ymin
,int* xmax
,int* ymax
);
44 int init_find(const char*);
45 int find(PDFDoc
* doc
,int start
,int stop
,int* xmin
,int* ymin
,int* xmax
,int* ymax
,int* page
);
47 //int chklink(PDFDoc* doc,AOutputDev* aout,int x,int y,Action** action,char* str,size_t len);
48 //int doaction(PDFDoc* doc,AOutputDev* aout,Action** actionp,int* state,int* page,int* x,int* y,char* buf,size_t len);
49 OutputDev
* init_write(PDFDoc
* doc
,const char* filename
,int type
,int first_page
,int last_page
,int zoom
,int rotate
);
50 int writefile(PDFDoc
* doc
,OutputDev
* sv
,int first_page
,int last_page
,int zoom
,int rotate
);
51 void end_write(OutputDev
* sv
);
52 char* gettext(AOutputDev
*,int,int,int,int);
53 int show_page(AOutputDev
*,PDFDoc
*,int,int,int,unsigned char*,int,int,int,int,int,int,int,int);
54 void add_fontmap(PDFDoc
*,const char*,const char*,int);
55 void clear_fontmap(PDFDoc
*);
56 FontOutputDev
* init_scan();
57 int scan_fonts(PDFDoc
*,FontOutputDev
*,int,int);
58 int scan_default_fonts();
59 void end_scan_fonts(FontOutputDev
*);
60 int get_font(FontOutputDev
*,int,char*,int,char*,int,int*,int*);
61 int has_outlines(PDFDoc
* doc
);
62 int get_outlines_info(PDFDoc
* doc
,int* num
,size_t* bufsize
);
63 void get_outlines(PDFDoc
* doc
,OutlinesInfo
* outlines
,size_t bufsize
);
64 char* get_doc_info(PDFDoc
* doc
,size_t*,int*,int*,int*,int*);
65 void get_version(char*,size_t);
66 void set_AA_levels(AOutputDev
*,int,int,int);
67 void clear_font_path();
68 void add_font_path(const char *);
69 void get_page_label(PDFDoc
*,int,char *,size_t);
70 const char** get_page_labels(PDFDoc
*,size_t*,int*);
71 int get_page_index(PDFDoc
*,const char *);
72 int get_error(char*,size_t);
73 int get_num_annots(PDFDoc
*,int,size_t*);
74 int get_annots(PDFDoc
*,AOutputDev
*,int,AnnotInfo
*,int);
75 Action
* set_annot_state(PDFDoc
*,Annot
*,int);
76 Action
* doaction(PDFDoc
*,AOutputDev
*,Action
*,size_t*);
77 int get_events(AOutputDev
*,struct ActionInfo
*);
78 size_t set_textfield(TextField
*,const char*);
79 size_t set_choicefield(ChoiceField
*,int,const char*);
80 int import_fdf(PDFDoc
*,const char*);
81 int export_fdf(PDFDoc
*,const char*);
84 const char* memalloc_file
;
89 void* myAllocMem(size_t);
90 void myFreeMem(void*,size_t);
100 static const int begwall
=8;
101 static const int endwall
=16;
103 static const int begwall
=0;
104 static const int endwall
=0;
128 void addtail(free_node
* n
) {
130 n
->next
=(free_node
*)&tail
;
148 bool is_free() const { return !(size
&1); }
149 bool is_first() const {
152 bool is_last() const {
153 return *(size_t*)((char*)(this+1)+begwall
+endwall
+(size
&~1))==0;
155 memblock
* succ() const {
157 return (memblock
*)((char*)(this+1)+begwall
+endwall
+(size
&~1));
161 void adjust_successors_pred() {
162 if(memblock
* p
=succ())
166 ((free_node
*)(this+1))->remove();
168 void add_to_freelist(free_list
& l
) {
169 l
.addtail((free_node
*)(this+1));
171 void add_to_freelist(free_node
& n
) {
172 free_node
* p
=(free_node
*)(this+1);
180 memblock
* get_memblock(free_node
& n
) {
181 return (memblock
*)&n
-1;
185 extern memblock tail
;
186 memblock head
={0,0,&tail
,NULL
};
187 memblock tail
={0,0,NULL
,&head
};
192 bool check(memblock
* p
) {
194 unsigned char* t
=(unsigned char*)(p
+1);
195 for(int k
=0;k
<begwall
;++k
)
197 printf("##### block %p (%u,%s,%d): bad header: %02x\n",p
,p
->size
,p
->file
?p
->file
:"?",p
->line
,t
[-1]);
201 size_t sz
=endwall
+(p
->size
&~1)-p
->alloc_size
;
202 for(int k
=0;k
<sz
;++k
)
204 printf("##### block %p (%u,%s,%d): bad trailer: %02x\n",p
,p
->size
,p
->file
?p
->file
:"?",p
->line
,t
[-1]);
211 printf("checking memory\n");
214 for(memblock
* p
=head
.next
;p
->next
;p
=p
->next
) {
219 printf("%u bytes allocated, %d blocks\n",sz
,n
);
222 extern "C" void printunfreed() {
223 printf("Unfreed memory:\n");
224 for(memblock
* p
=head
.next
;p
->next
;p
=p
->next
)
225 printf("%x\t%d\t%d\t%s\n",(char*)(p
+1)+begwall
,p
->alloc_size
,p
->line
,p
->file
?p
->file
:"?");
226 for(int k
=0;k
<1000;++k
)
228 printf("sz=%d: %d\n",(k
+1)*8,sizes
[k
]);
230 printf("bigger: %d\n",bigger
);
240 static const int num_small_blocks
=1000;
241 static const int num_small_chunks
=8;
242 static const size_t block_quantum
=8;
243 static const size_t tresh_size
=32768;
244 static const size_t puddle_size
=128*1024;
245 static const size_t small_puddle_size
=16*1024;
246 static free_list small_blocks
[num_small_blocks
];
247 static free_list big_blocks
={(free_node
*)&big_blocks
.tail
,NULL
,(free_node
*)&big_blocks
.head
};
248 static memlist chunks
={(memchunk
*)&chunks
.tail
,NULL
,(memchunk
*)&chunks
.head
};
249 static memlist small_chunks
[num_small_chunks
];
251 extern "C" int meminit() {
252 for(int k
=0;k
<num_small_blocks
;++k
) {
253 small_blocks
[k
].head
=(free_node
*)&small_blocks
[k
].tail
;
254 small_blocks
[k
].tailpred
=(free_node
*)&small_blocks
[k
].head
;
256 for(int k
=0;k
<num_small_chunks
;++k
) {
257 small_chunks
[k
].head
=(memchunk
*)&small_chunks
[k
].tail
;
258 small_chunks
[k
].tailpred
=(memchunk
*)&small_chunks
[k
].head
;
263 extern "C" void memcleanup() {
264 memchunk
* q
=chunks
.head
;
267 myFreeMem(q
,q
->size
);
270 for(int k
=0;k
<num_small_chunks
;++k
) {
271 memchunk
* q
=small_chunks
[k
].head
;
274 myFreeMem(q
,q
->size
);
280 static void free_block(memblock
* p
) {
283 printf("##### block %p (%u,%s,%d): not free\n",p
,p
->size
,p
->file
?p
->file
:"?",p
->line
);
287 if(p
->size
<=num_small_chunks
*block_quantum
) {
288 p
->add_to_freelist(small_blocks
[(p
->size
-1)/block_quantum
]);
290 if(memblock
* q
=p
->pred
) {
293 q
->size
+=p
->size
+sizeof(memblock
)+begwall
+endwall
;
295 p
->adjust_successors_pred();
298 if(memblock
* q
=p
->succ()) {
301 p
->size
+=q
->size
+sizeof(memblock
)+begwall
+endwall
;
302 p
->adjust_successors_pred();
305 if(p
->is_first() && p
->is_last()) {
306 memchunk
* q
=(memchunk
*)p
-1;
307 q
->next
->prev
=q
->prev
;
308 q
->prev
->next
=q
->next
;
309 myFreeMem(q
,q
->size
);
311 if(p
->size
<=num_small_blocks
*block_quantum
) {
312 p
->add_to_freelist(small_blocks
[(p
->size
-1)/block_quantum
]);
314 free_node
* q
=big_blocks
.head
;
315 while(q
->next
&& get_memblock(*q
)->size
<p
->size
)
317 p
->add_to_freelist(*q
);
323 extern "C" void* malloc(size_t sz
) {
324 size_t sz2
=(sz
+7)&~7;
328 if (sz2
<=num_small_chunks
*block_quantum
) {
329 size_t k
=(sz2
-1)/block_quantum
;
330 free_node
* q
=small_blocks
[k
].head
;
335 memchunk
* q
=small_chunks
[k
].tailpred
;
336 size_t sz3
=sz2
+sizeof(memblock
)+begwall
+endwall
;
337 if (!q
->prev
|| sz3
>q
->free
) {
338 const size_t chunk_size
=small_puddle_size
;
339 q
=(memchunk
*)myAllocMem(chunk_size
);
342 q
->next
=(memchunk
*)&small_chunks
[k
].tail
;
343 q
->prev
=small_chunks
[k
].tailpred
;
344 small_chunks
[k
].tailpred
->next
=q
;
345 small_chunks
[k
].tailpred
=q
;
347 q
->free
=q
->size
-((sizeof(memchunk
)+7)&~7);
349 p
=(memblock
*)((char*)q
+q
->size
-q
->free
);
352 p
->pred
=(memblock
*)0xdeadbeef;
357 if(sz2
<=num_small_blocks
*block_quantum
) {
358 size_t k
=(sz2
-1)/block_quantum
;
360 free_node
* q
=small_blocks
[k
].head
;
367 } while(k
<num_small_blocks
);
370 free_node
* t
=big_blocks
.head
;
371 while(t
->next
&& get_memblock(*t
)->size
<sz2
)
377 size_t chunk_size
=sz2
+((sizeof(memblock
)+begwall
+endwall
+sizeof(memchunk
)+sizeof(size_t)+7)&~7);
378 if(chunk_size
<tresh_size
)
379 chunk_size
=puddle_size
;
380 memchunk
* q
=(memchunk
*)myAllocMem(chunk_size
);
383 q
->next
=(memchunk
*)&chunks
.tail
;
384 q
->prev
=chunks
.tailpred
;
385 chunks
.tailpred
->next
=q
;
389 chunk_size
-=(sizeof(memchunk
)+sizeof(size_t)+7)&~7;
390 *(size_t*)((char*)(q
+1)+chunk_size
)=0;
392 p
->size
=chunk_size
-sizeof(memblock
)-begwall
-endwall
;
396 if(p
->size
-sz2
>=sizeof(memblock
)+begwall
+endwall
+block_quantum
) {
397 memblock
* q
=(memblock
*)((char*)(p
+1)+begwall
+endwall
+sz2
);
398 q
->size
=p
->size
-sz2
-sizeof(memblock
)-begwall
-endwall
;
401 q
->adjust_successors_pred();
409 printf("##### invalid block size\n");
423 p
->file
=memalloc_file
;
424 p
->line
=memalloc_line
;
426 unsigned char* q
=(unsigned char*)(p
+1);
427 for(int k
=0;k
<begwall
;++k
)
429 for(int k
=0;k
<sz
;++k
)
431 size_t sz3
=endwall
+(p
->size
&~1)-sz
;
432 for(int k
=0;k
<sz3
;++k
)
435 return (char*)(p
+1)+begwall
;
438 extern "C" void* calloc(size_t n
,size_t sz
) {
446 extern "C" void* realloc(void* t
,size_t sz
) {
449 memblock
* p
=(memblock
*)((char*)t
-begwall
)-1;
453 size_t oldsz
=p
->size
&~1;
454 size_t sz2
=(sz
+7)&~7;
457 if(sz2
>num_small_chunks
*block_quantum
&& oldsz
>num_small_chunks
*block_quantum
) {
459 if(memblock
* q
=p
->succ()) {
461 q
->size
+sizeof(memblock
)+begwall
+endwall
>=sz2
-oldsz
) {
463 oldsz
+=q
->size
+sizeof(memblock
)+begwall
+endwall
;
465 p
->adjust_successors_pred();
468 unsigned char* t
=(unsigned char*)(p
+1)+begwall
+p
->alloc_size
;
469 for(int k
=0;k
<sz
-p
->alloc_size
;++k
)
472 size_t sz3
=endwall
+oldsz
-sz
;
473 for(int k
=0;k
<sz3
;++k
)
480 if(oldsz
-sz2
>=sizeof(memblock
)+begwall
+endwall
+block_quantum
) {
481 memblock
* q
=(memblock
*)((char*)(p
+1)+begwall
+endwall
+sz2
);
482 q
->size
=oldsz
-sz2
-sizeof(memblock
)-begwall
-endwall
;
485 q
->adjust_successors_pred();
490 unsigned char* q
=(unsigned char*)(p
+1)+begwall
+sz
;
491 size_t sz3
=endwall
+(p
->size
&~1)-sz
;
492 for(int k
=0;k
<sz3
;++k
)
495 return (char*)(p
+1)+begwall
;
501 memcpy(q
,t
,sz
<oldsz
?sz
:oldsz
);
504 unsigned char* r
=(unsigned char*)q
+oldsz
;
506 for(int k
=0;k
<sz4
;++k
)
513 extern "C" void free(void* p
) {
515 memblock
* q
=(memblock
*)((char*)p
-begwall
)-1;
517 if(q
->is_free() || q
->next
==NULL
|| q
->prev
==NULL
) {
518 printf("##### free called at %s/%d\n",memalloc_file
,memalloc_line
);
519 printf("##### block %p (%u,%s,%d): already freed\n",q
,q
->size
,q
->file
?q
->file
:"?",q
->line
);
529 unsigned char* t
=(unsigned char*)(q
+1)+begwall
;
530 for(int k
=0;k
<q
->alloc_size
;++k
)
532 q
->next
->prev
=q
->prev
;
533 q
->prev
->next
=q
->next
;
544 void* operator new (size_t sz
) {
547 throw "Out of memory!";
551 void operator delete (void* p
) {
555 void* operator new [] (size_t sz
) {
558 throw "Out of memory!";
562 void operator delete [] (void* p
) {
567 extern int maxColors
;
569 struct comm_info
*(*create_comm_info
)(size_t);
570 void (*delete_comm_info
)(struct comm_info
*);
571 int (*exchange_msg
)(struct comm_info
*,struct msg_base
*,size_t,int);
572 //void (*send_msg)(struct comm_info *,void *,size_t,int);
573 void* (*get_msg
)(struct server_info
*,void **,size_t *,int *);
574 void (*reply_msg
)(void *);
577 class ServColorAllocator
: public ColorAllocator
{
579 ServColorAllocator(int depth
);
580 ~ServColorAllocator();
581 virtual Guchar
allocate(Gulong
);
582 virtual void allocate(int,ColorEntry
*);
587 ServColorAllocator::ServColorAllocator(int depth
) {
588 size_t sz
=sizeof(ppcmsg_max
);
590 size_t sz2
=sizeof(msg_getcolors
)+sizeof(ColorEntry
)*maxColors
;
594 if(!(ci
=create_comm_info(sz
)))
595 throw "Can't create message & port.";
598 ServColorAllocator::~ServColorAllocator() {
599 delete_comm_info(ci
);
602 Guchar
ServColorAllocator::allocate(Gulong val
) {
603 msg_getcolor
* m
=(msg_getcolor
*)ci
->cmddata
;
604 m
->r
=((val
>>16)&0xff)*0x01010101;
605 m
->g
=((val
>> 8)&0xff)*0x01010101;
606 m
->b
=((val
>> 0)&0xff)*0x01010101;
607 exchange_msg(ci
,&m
->base
,sizeof(*m
),MSGID_GETCOLOR
);
608 return Guchar(m
->base
.success
);
611 void ServColorAllocator::allocate(int num
,ColorEntry
* p
) {
613 printf("too many colors (%d/%d).\n",num
,maxColors
);
616 msg_getcolors
* m
=(msg_getcolors
*)ci
->cmddata
;
618 memcpy(m
->table
,p
,num
*sizeof(ColorEntry
));
619 exchange_msg(ci
,&m
->base
,sizeof(*m
)-sizeof(m
->table
[0])+num
*sizeof(ColorEntry
),MSGID_GETCOLORS
);
620 memcpy(p
,m
->table
,num
*sizeof(ColorEntry
));
621 /*unsigned long* q=m->table;
631 void server(comm_info
*ci
) {
633 IoServer io_server
= NULL
;
639 void* msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
640 DB(printf("-- msg = %d\n",id
);)
643 msg_init
* p
=(msg_init
*)msgdat
;
644 p
->base
.success
=init_ok
=(p
->version
==VMAGIC
&& initClientIo(io_server
=p
->io_server
) && init(p
->errors
,p
->abort_flag_ptr
,p
->draw_state_ptr
));
651 case MSGID_GETERROR
: {
652 msg_error
* p
=(msg_error
*)msgdat
;
653 p
->base
.success
=get_error(p
->msg
,sizeof(p
->msg
));
656 case MSGID_USEPREFS
: {
657 msg_prefs
* p
=(msg_prefs
*)msgdat
;
658 use_prefs(p
->colors
,p
->gzipcmd
,p
->cachesz
,p
->cacheblocsz
);
662 case MSGID_CREATEDOC
: {
663 msg_createdoc
* m
=(msg_createdoc
*)msgdat
;
664 m
->doc
=create_doc(m
->dir
,m
->filename
,&m
->num_pages
,m
->ownerpw
,m
->userpw
);
665 m
->base
.success
=m
->doc
!=NULL
;
668 case MSGID_DELETEDOC
: {
669 msg_deletedoc
* m
=(msg_deletedoc
*)msgdat
;
674 case MSGID_PAGESIZE
: {
675 msg_pagesize
* m
=(msg_pagesize
*)msgdat
;
676 m
->base
.success
=get_page_size(m
->doc
,m
->page
,&m
->width
,&m
->height
,&m
->rotate
);
679 case MSGID_CREATEOUTPUTDEV
: {
680 msg_create_output_dev
* m
=(msg_create_output_dev
*)msgdat
;
682 //ColorAllocator* colorAllocator=NULL;
684 //colorAllocator=new ServColorAllocator(m->depth);
685 //m->out=create_output_dev(colorAllocator);
686 //colorAllocator=NULL;
687 m
->out
=create_output_dev(m
->map
,16);
689 catch(const char* msg
) {
690 printf("Exception: %s\n", msg
);
693 printf("Exception caught.");
695 //delete colorAllocator;
696 m
->base
.success
=m
->out
!=NULL
;
699 case MSGID_DELETEOUTPUTDEV
: {
700 msg_delete_output_dev
* m
=(msg_delete_output_dev
*)msgdat
;
701 delete_output_dev(m
->out
);
706 case MSGID_SETAALEVELS
: {
707 msg_setaalevels
* m
=(msg_setaalevels
*)msgdat
;
708 set_AA_levels(m
->out
,m
->text
,m
->stroke
,m
->fill
);
714 msg_page
* m
=(msg_page
*)msgdat
;
716 AOutputDev
* aout
=m
->aout
;
726 int pixfmt
=m
->pixfmt
;
729 m
->base
.error
=errors
!=NULL
;
730 *drawStatePtr
=lastDrawState
=0;
732 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
733 DB(printf("-- abort=%d, level=%d\n-- show_page\n",*abortFlagPtr
,lev
);)
734 lev
=show_page(aout
,doc
,n
,z
,r
,
735 (unsigned char*)msgdat
,
736 x
,y
,w
,h
,mod
,bpp
,pixfmt
,lev
);
737 DB(printf("-- abort=%d, level=%d\n",*abortFlagPtr
,lev
);)
740 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
742 m
->returned_level
=*abortFlagPtr
?-1:lev
;
747 case MSGID_CHKLINK
: {
748 msg_chklink
* m
=(msg_chklink
*)msgdat
;
749 m
->base
.success
=chklink(m
->doc
,m
->aout
,m
->x
,m
->y
,&m
->action
,m
->str
,sizeof(m
->str
));
752 case MSGID_DOACTION
: {
753 msg_doaction
* m
=(msg_doaction
*)msgdat
;
754 m
->base
.success
=doaction(m
->doc
,m
->aout
,&m
->action
,&m
->state
,&m
->page
,&m
->x
,&m
->y
,m
->str
,sizeof(m
->str
));
758 case MSGID_SIMPLEFIND
: {
759 msg_find
* m
=(msg_find
*)msgdat
;
760 m
->base
.success
=simple_find(m
->aout
,m
->str
,m
->top
,&m
->xmin
,&m
->ymin
,&m
->xmax
,&m
->ymax
);
763 case MSGID_INITFIND
: {
764 msg_find
* m
=(msg_find
*)msgdat
;
765 m
->base
.success
=init_find(m
->str
);
769 msg_find
* m
=(msg_find
*)msgdat
;
770 m
->base
.success
=find(m
->doc
,m
->top
,m
->bottom
,&m
->xmin
,&m
->ymin
,&m
->xmax
,&m
->ymax
,&m
->page
);
776 case MSGID_INITWRITE
: {
777 msg_write
* m
=(msg_write
*)msgdat
;
778 m
->savedev
=init_write(m
->doc
,m
->filename
,m
->type
,m
->first_page
,m
->last_page
,m
->zoom
,m
->rotate
);
779 m
->base
.success
=m
->savedev
!=NULL
;
783 msg_write
* m
=(msg_write
*)msgdat
;
784 writefile(m
->doc
,m
->savedev
,m
->first_page
,m
->last_page
,m
->zoom
,m
->rotate
);
788 case MSGID_ENDWRITE
: {
789 msg_write
* m
=(msg_write
*)msgdat
;
790 end_write(m
->savedev
);
795 case MSGID_GETTEXT
: {
796 msg_gettext
* m
=(msg_gettext
*)msgdat
;
797 char* p
=gettext(m
->aout
,m
->xmin
,m
->ymin
,m
->xmax
,m
->ymax
);
798 m
->base
.success
=p
!=NULL
;
799 m
->base
.error
=errors
!=NULL
;
800 if(m
->base
.success
) {
803 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
804 char* q
=(char*)msgdat
;
812 case MSGID_HASOUTLINES
: {
813 msg_get_outlines_info
* m
=(msg_get_outlines_info
*)msgdat
;
814 m
->base
.success
=has_outlines(m
->doc
);
817 case MSGID_GETOUTLINESINFO
: {
818 msg_get_outlines_info
* m
=(msg_get_outlines_info
*)msgdat
;
819 m
->base
.success
=get_outlines_info(m
->doc
,&m
->num
,&m
->bufsize
);
822 case MSGID_GETOUTLINES
: {
823 msg_get_outlines
* m
=(msg_get_outlines
*)msgdat
;
826 m
->base
.error
=errors
!=NULL
;
828 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
829 get_outlines(doc
,(OutlinesInfo
*)msgdat
,0);
833 case MSGID_GETDOCINFO
: {
834 msg_getdocinfo
* m
=(msg_getdocinfo
*)msgdat
;
835 char* p
=get_doc_info(m
->doc
,(size_t*)&m
->size
,&m
->linearized
,&m
->encrypted
,&m
->oktoprint
,&m
->oktocopy
);
836 m
->base
.success
=p
!=NULL
;
837 m
->base
.error
=errors
!=NULL
;
838 if(m
->base
.success
) {
840 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
841 char* q
=(char*)msgdat
;
842 memcpy(q
,p
,m
->size
>len
-1?len
-1:m
->size
);
849 case MSGID_ADDFONTMAP
: {
850 msg_addfontmap
* m
=(msg_addfontmap
*)msgdat
;
851 add_fontmap(m
->pdfdoc
,m
->pdffont
,m
->font
,m
->type
);
855 case MSGID_CLEARFONTMAP
: {
856 msg_addfontmap
* m
=(msg_addfontmap
*)msgdat
;
857 clear_fontmap(m
->pdfdoc
);
861 case MSGID_ADDFONTPATH
: {
862 msg_addfontpath
* m
=(msg_addfontpath
*)msgdat
;
863 add_font_path(m
->path
);
867 case MSGID_CLEARFONTPATH
:
870 case MSGID_INITSCAN
: {
871 msg_scan_fonts
* m
=(msg_scan_fonts
*)msgdat
;
873 m
->base
.success
=m
->out
!=NULL
;
876 case MSGID_SCANFONTS
: {
877 msg_scan_fonts
* m
=(msg_scan_fonts
*)msgdat
;
878 m
->base
.success
=scan_fonts(m
->doc
,m
->out
,m
->first_page
,m
->last_page
);
881 case MSGID_ENDSCANFONTS
: {
882 msg_scan_fonts
* m
=(msg_scan_fonts
*)msgdat
;
883 end_scan_fonts(m
->out
);
887 case MSGID_GETFONT
: {
888 msg_fontmap
* m
=(msg_fontmap
*)msgdat
;
889 m
->base
.success
=get_font(m
->out
,m
->m
,m
->pdffont
,sizeof(m
->pdffont
),m
->font
,sizeof(m
->font
),&m
->type
,&m
->flags
);
892 case MSGID_VERSION
: {
893 msg_version
* m
=(msg_version
*)msgdat
;
894 get_version(m
->version
,sizeof(m
->version
));
899 case MSGID_GETPAGELABEL
: {
900 msg_pagelabel
* m
=(msg_pagelabel
*)msgdat
;
901 get_page_label(m
->doc
,m
->index
,m
->label
,sizeof(m
->label
));
906 case MSGID_GETPAGELABELS
: {
907 msg_pagelabels
* m
=(msg_pagelabels
*)msgdat
;
910 const char** p
=get_page_labels(m
->doc
,&sz
,&n
);
913 m
->base
.error
=errors
!=NULL
;
916 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
919 const char** q
=(const char**)msgdat
;
920 int offset
=(char*)msgdat
-(char*)p
;
929 case MSGID_GETPAGEINDEX
: {
930 msg_pagelabel
* m
=(msg_pagelabel
*)msgdat
;
931 m
->index
=get_page_index(m
->doc
,m
->label
);
932 m
->base
.success
=m
->index
!=-1;
935 case MSGID_GETANNOTS
: {
936 msg_getannots
* m
=(msg_getannots
*)msgdat
;
938 AOutputDev
* aout
=m
->aout
;
940 int num
=m
->num
=get_num_annots(doc
,page
,&m
->size
);
942 m
->base
.error
=errors
!=NULL
;
945 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
947 get_annots(doc
,aout
,page
,(AnnotInfo
*)msgdat
,num
);
952 case MSGID_SETANNOTSTATE
: {
953 msg_setannotstate
* m
=(msg_setannotstate
*)msgdat
;
954 m
->action
=set_annot_state(m
->pdfdoc
,m
->annot
,m
->state
);
958 case MSGID_DOACTION
: {
959 msg_doaction
* m
=(msg_doaction
*)msgdat
;
960 m
->action
=doaction(m
->pdfdoc
,m
->aout
,m
->action
,&m
->size
);
964 case MSGID_GETEVENTS
: {
965 msg_getevents
* m
=(msg_getevents
*)msgdat
;
966 AOutputDev
* aout
=m
->aout
;
968 m
->base
.error
=errors
!=NULL
;
970 msg
=get_msg(NULL
,&msgdat
,&len
,&id
);
972 get_events(aout
,(ActionInfo
*)msgdat
);
976 case MSGID_SETTEXTFIELD
: {
977 msg_settextfield
* m
=(msg_settextfield
*)msgdat
;
978 m
->size
=set_textfield(m
->field
,m
->txt
);
982 case MSGID_SETCHOICEFIELD
: {
983 msg_setchoicefield
* m
=(msg_setchoicefield
*)msgdat
;
984 m
->size
=set_choicefield(m
->field
,m
->num
,m
->txt
);
988 case MSGID_IMPORTFDF
: {
989 msg_fdf
* m
=(msg_fdf
*)msgdat
;
990 m
->base
.success
=import_fdf(m
->pdfdoc
,m
->filename
);
993 case MSGID_EXPORTFDF
: {
994 msg_fdf
* m
=(msg_fdf
*)msgdat
;
995 m
->base
.success
=export_fdf(m
->pdfdoc
,m
->filename
);
999 ((msg_base
*)msgdat
)->error
=0;
1000 ((msg_base
*)msgdat
)->success
=0;
1004 ((msg_base
*)msgdat
)->error
=errors
!=NULL
;
1005 DB(printf("-- replying\n");)
1011 cleanupClientIo(io_server
);
1012 #ifndef NO_CUSTOM_MEM