2 Copyright © 1995-2003, The AROS Development Team. All rights reserved.
9 #define USE_BOOPSI_STUBS
10 #include <proto/exec.h>
11 #include <proto/dos.h>
12 #include <proto/intuition.h>
13 #include <intuition/intuition.h>
14 #include <intuition/gadgetclass.h>
15 #include <intuition/cghooks.h>
16 #include <datatypes/datatypesclass.h>
17 #include <utility/tagitem.h>
18 #include <clib/boopsistubs.h>
19 #include "datatypes_intern.h"
24 struct Message pm_Msg
;
25 struct DataTypesBase
*pm_dtb
;
27 struct Window
*pm_window
;
28 struct Requester
*pm_requester
;
29 struct dtPrint pm_dtprint
;
30 struct GadgetInfo pm_ginfo
;
35 void AsyncPrinter(void)
37 struct DataTypesBase
*DataTypesBase
;
38 struct PrintMessage
*pm
;
39 struct DTSpecialInfo
*dtsi
;
41 struct MsgPort
*ReplyPort
;
44 struct Process
*MyProc
= (struct Process
*)FindTask(NULL
);
46 WaitPort(&MyProc
->pr_MsgPort
);
47 pm
= (struct PrintMessage
*)GetMsg(&MyProc
->pr_MsgPort
);
49 DataTypesBase
= pm
->pm_dtb
;
51 object
= pm
->pm_object
;
52 dtsi
= ((struct Gadget
*)object
)->SpecialInfo
;
54 if((ReplyPort
= CreateMsgPort()))
56 struct IORequest
*IORequest
;
58 if((IORequest
= CreateIORequest(ReplyPort
, sizeof(union printerIO
))))
60 union printerIO
*oldPIO
;
61 struct Window
*window
;
63 CopyMem(pm
->pm_dtprint
.dtp_PIO
,IORequest
,sizeof(union printerIO
));
65 IORequest
->io_Message
.mn_ReplyPort
=ReplyPort
;
67 oldPIO
= pm
->pm_dtprint
.dtp_PIO
;
68 pm
->pm_dtprint
.dtp_PIO
= (union printerIO
*)IORequest
;
69 pm
->pm_dtprint
.dtp_GInfo
=NULL
;
71 if((window
= pm
->pm_window
))
73 pm
->pm_dtprint
.dtp_GInfo
= &pm
->pm_ginfo
;
74 pm
->pm_ginfo
.gi_Screen
= window
->WScreen
;
75 pm
->pm_ginfo
.gi_Window
= window
;
76 pm
->pm_ginfo
.gi_Requester
= pm
->pm_requester
;
77 pm
->pm_ginfo
.gi_RastPort
= window
->RPort
;
79 if(pm
->pm_requester
!= NULL
)
80 pm
->pm_ginfo
.gi_Layer
= pm
->pm_requester
->ReqLayer
;
82 pm
->pm_ginfo
.gi_Layer
=window
->WLayer
;
84 pm
->pm_ginfo
.gi_DrInfo
= GetScreenDrawInfo(window
->WScreen
);
87 result
= DoMethodA(object
, (Msg
)&pm
->pm_dtprint
);
89 if (pm
->pm_ginfo
.gi_DrInfo
)
90 FreeScreenDrawInfo(window
->WScreen
, pm
->pm_ginfo
.gi_DrInfo
);
92 pm
->pm_dtprint
.dtp_PIO
= oldPIO
;
94 DeleteIORequest(IORequest
);
97 DeleteMsgPort(ReplyPort
);
100 setattrs((struct Library
*)DataTypesBase
, object
, DTA_PrinterProc
, NULL
,
103 DoGad_OM_NOTIFY((struct Library
*)DataTypesBase
, object
, pm
->pm_window
,
104 pm
->pm_requester
, 0, GA_ID
,
105 (ULONG
)((struct Gadget
*)object
)->GadgetID
,
106 DTA_PrinterStatus
, result
, TAG_DONE
);
112 dtsi
->si_Flags
&= ~DTSIF_PRINTING
;
118 /*****************************************************************************
121 #include <proto/datatypes.h>
124 AROS_LH4(ULONG
, PrintDTObjectA
,
127 AROS_LHA(Object
*, object
, A0
),
128 AROS_LHA(struct Window
*, window
, A1
),
129 AROS_LHA(struct Requester
*, requester
, A2
),
130 AROS_LHA(struct dtPrint
*, msg
, A3
),
133 struct Library
*, DataTypesBase
, 19, DataTypes
)
137 Perform an object's DTM_PRINT method in an asynchronous manner.
141 object -- pointer to the data type object
142 window -- pointer to the window the object has been added to
143 requester -- pointer to the requester the object has been added to
147 TRUE on success, FALSE otherwise.
151 When an application has called PrintDTObjectA() it must not touch
152 the printerIO union until a IDCMP_IDCMPUPDATE is received which
153 contains the DTA_PrinterStatus tag.
154 To abort a print, send the DTM_ABORTPRINT method to the object.
155 This will signal the print process with a SIGBREAK_CTRL_C.
167 *****************************************************************************/
172 struct DTSpecialInfo
*dtsi
= ((struct Gadget
*)object
)->SpecialInfo
;
173 struct PrintMessage
*pm
;
175 ObtainSemaphore(&(GPB(DataTypesBase
)->dtb_Semaphores
[SEM_ASYNC
]));
177 if(!(dtsi
->si_Flags
& DTSIF_PRINTING
))
179 dtsi
->si_Flags
|= DTSIF_PRINTING
;
181 if((pm
= AllocVec(sizeof(struct PrintMessage
),
182 MEMF_PUBLIC
| MEMF_CLEAR
)))
184 struct TagItem Tags
[5];
185 struct Process
*PrintProcess
;
187 pm
->pm_Msg
.mn_Node
.ln_Type
= NT_MESSAGE
;
188 pm
->pm_Msg
.mn_Length
= sizeof(struct PrintMessage
);
189 pm
->pm_dtb
= (struct DataTypesBase
*)DataTypesBase
;
190 pm
->pm_object
= object
;
191 pm
->pm_window
= window
;
192 pm
->pm_requester
= requester
;
193 pm
->pm_dtprint
= *msg
;
195 Tags
[0].ti_Tag
= NP_StackSize
;
196 Tags
[0].ti_Data
= 4096;
197 Tags
[1].ti_Tag
= NP_Entry
;
198 Tags
[1].ti_Data
= (IPTR
)&AsyncPrinter
;
199 Tags
[2].ti_Tag
= NP_Priority
;
201 Tags
[3].ti_Tag
= NP_Name
;
202 Tags
[3].ti_Data
= (IPTR
)"AsyncPrintDaemon";
203 Tags
[4].ti_Tag
= TAG_DONE
;
205 if((PrintProcess
= CreateNewProc(Tags
)))
207 PutMsg(&PrintProcess
->pr_MsgPort
, &pm
->pm_Msg
);
209 setattrs(DataTypesBase
, object
, DTA_PrinterProc
, PrintProcess
,
219 ReleaseSemaphore(&(GPB(DataTypesBase
)->dtb_Semaphores
[SEM_ASYNC
]));
224 } /* PrintDTObjectA */