xref: /haiku/src/kits/print/PrintAddOnServer.cpp (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 #include "PrintAddOnServer.h"
2 
3 #include <Entry.h>
4 #include <Roster.h>
5 
6 #include "PrinterDriverAddOn.h"
7 #include "PrintAddOnServerProtocol.h"
8 
9 static const bigtime_t kSeconds = 1000000L;
10 static const bigtime_t kDeliveryTimeout = 30 * kSeconds;
11 static const bigtime_t kReplyTimeout = B_INFINITE_TIMEOUT;
12 
13 
14 PrintAddOnServer::PrintAddOnServer(const char* driver)
15 	:
16 	fDriver(driver)
17 {
18 	fLaunchStatus = Launch(fMessenger);
19 }
20 
21 
22 PrintAddOnServer::~PrintAddOnServer()
23 {
24 	if (fLaunchStatus == B_OK)
25 		Quit();
26 }
27 
28 
29 status_t
30 PrintAddOnServer::AddPrinter(const char* spoolFolderName)
31 {
32 	BMessage message(kMessageAddPrinter);
33 	message.AddString(kPrinterDriverAttribute, Driver());
34 	message.AddString(kPrinterNameAttribute, spoolFolderName);
35 
36 	BMessage reply;
37 	status_t result = SendRequest(message, reply);
38 	if (result != B_OK)
39 		return result;
40 
41 	return GetResult(reply);
42 }
43 
44 
45 status_t
46 PrintAddOnServer::ConfigPage(BDirectory* spoolFolder,
47 	BMessage* settings)
48 {
49 	BMessage message(kMessageConfigPage);
50 	message.AddString(kPrinterDriverAttribute, Driver());
51 	AddDirectory(message, kPrinterFolderAttribute, spoolFolder);
52 	message.AddMessage(kPrintSettingsAttribute, settings);
53 
54 	BMessage reply;
55 	status_t result = SendRequest(message, reply);
56 	if (result != B_OK)
57 		return result;
58 
59 	return GetResultAndUpdateSettings(reply, settings);
60 }
61 
62 
63 status_t
64 PrintAddOnServer::ConfigJob(BDirectory* spoolFolder,
65 	BMessage* settings)
66 {
67 	BMessage message(kMessageConfigJob);
68 	message.AddString(kPrinterDriverAttribute, Driver());
69 	AddDirectory(message, kPrinterFolderAttribute, spoolFolder);
70 	message.AddMessage(kPrintSettingsAttribute, settings);
71 
72 	BMessage reply;
73 	status_t result = SendRequest(message, reply);
74 	if (result != B_OK)
75 		return result;
76 
77 	return GetResultAndUpdateSettings(reply, settings);
78 }
79 
80 
81 status_t
82 PrintAddOnServer::DefaultSettings(BDirectory* spoolFolder,
83 	BMessage* settings)
84 {
85 	BMessage message(kMessageDefaultSettings);
86 	message.AddString(kPrinterDriverAttribute, Driver());
87 	AddDirectory(message, kPrinterFolderAttribute, spoolFolder);
88 
89 	BMessage reply;
90 	status_t result = SendRequest(message, reply);
91 	if (result != B_OK)
92 		return result;
93 
94 	return GetResultAndUpdateSettings(reply, settings);
95 }
96 
97 
98 status_t
99 PrintAddOnServer::TakeJob(const char* spoolFile,
100 				BDirectory* spoolFolder)
101 {
102 	BMessage message(kMessageTakeJob);
103 	message.AddString(kPrinterDriverAttribute, Driver());
104 	message.AddString(kPrintJobFileAttribute, spoolFile);
105 	AddDirectory(message, kPrinterFolderAttribute, spoolFolder);
106 
107 	BMessage reply;
108 	status_t result = SendRequest(message, reply);
109 	if (result != B_OK)
110 		return result;
111 
112 	return GetResult(reply);
113 }
114 
115 
116 status_t
117 PrintAddOnServer::FindPathToDriver(const char* driver, BPath* path)
118 {
119 	return PrinterDriverAddOn::FindPathToDriver(driver, path);
120 }
121 
122 
123 const char*
124 PrintAddOnServer::Driver() const
125 {
126 	return fDriver.String();
127 }
128 
129 
130 status_t
131 PrintAddOnServer::Launch(BMessenger& messenger)
132 {
133 	team_id team;
134 	status_t result =
135 		be_roster->Launch(kPrintAddOnServerApplicationSignature,
136 			(BMessage*)NULL, &team);
137 	if (result != B_OK) {
138 		return result;
139 	}
140 
141 	fMessenger = BMessenger(kPrintAddOnServerApplicationSignature, team);
142 	return result;
143 }
144 
145 
146 bool
147 PrintAddOnServer::IsLaunched()
148 {
149 	return fLaunchStatus == B_OK;
150 }
151 
152 
153 void
154 PrintAddOnServer::Quit()
155 {
156 	if (fLaunchStatus == B_OK) {
157 		fMessenger.SendMessage(B_QUIT_REQUESTED);
158 		fLaunchStatus = B_ERROR;
159 	}
160 }
161 
162 
163 void
164 PrintAddOnServer::AddDirectory(BMessage& message, const char* name,
165 	BDirectory* directory)
166 {
167 	BEntry entry;
168 	status_t result = directory->GetEntry(&entry);
169 	if (result != B_OK)
170 		return;
171 
172 	BPath path;
173 	if (entry.GetPath(&path) != B_OK)
174 		return;
175 
176 	message.AddString(name, path.Path());
177 }
178 
179 
180 void
181 PrintAddOnServer::AddEntryRef(BMessage& message, const char* name,
182 	const entry_ref* entryRef)
183 {
184 	BPath path(entryRef);
185 	if (path.InitCheck() != B_OK)
186 		return;
187 
188 	message.AddString(name, path.Path());
189 }
190 
191 
192 status_t
193 PrintAddOnServer::SendRequest(BMessage& request, BMessage& reply)
194 {
195 	if (!IsLaunched())
196 		return fLaunchStatus;
197 
198 	return fMessenger.SendMessage(&request, &reply, kDeliveryTimeout,
199 		kReplyTimeout);
200 }
201 
202 
203 status_t
204 PrintAddOnServer::GetResult(BMessage& reply)
205 {
206 	int32 status;
207 	status_t result = reply.FindInt32(kPrintAddOnServerStatusAttribute,
208 		&status);
209 	if (result != B_OK)
210 		return result;
211 	return static_cast<status_t>(status);
212 }
213 
214 
215 status_t
216 PrintAddOnServer::GetResultAndUpdateSettings(BMessage& reply, BMessage* settings)
217 {
218 	BMessage newSettings;
219 	if (reply.FindMessage(kPrintSettingsAttribute, &newSettings) == B_OK)
220 		*settings = newSettings;
221 
222 	settings->PrintToStream();
223 
224 	return GetResult(reply);
225 }
226