1#include "PrintAddOnServer.h" 2 3#include <Entry.h> 4#include <Roster.h> 5 6#include "PrinterDriverAddOn.h" 7#include "PrintAddOnServerProtocol.h" 8 9static const bigtime_t kSeconds = 1000000L; 10static const bigtime_t kDeliveryTimeout = 30 * kSeconds; 11static const bigtime_t kReplyTimeout = B_INFINITE_TIMEOUT; 12 13 14PrintAddOnServer::PrintAddOnServer(const char* driver) 15 : 16 fDriver(driver) 17{ 18 fLaunchStatus = Launch(fMessenger); 19} 20 21 22PrintAddOnServer::~PrintAddOnServer() 23{ 24 if (fLaunchStatus == B_OK) 25 Quit(); 26} 27 28 29status_t 30PrintAddOnServer::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 45status_t 46PrintAddOnServer::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 63status_t 64PrintAddOnServer::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 81status_t 82PrintAddOnServer::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 98status_t 99PrintAddOnServer::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 116status_t 117PrintAddOnServer::FindPathToDriver(const char* driver, BPath* path) 118{ 119 return PrinterDriverAddOn::FindPathToDriver(driver, path); 120} 121 122 123const char* 124PrintAddOnServer::Driver() const 125{ 126 return fDriver.String(); 127} 128 129 130status_t 131PrintAddOnServer::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 146bool 147PrintAddOnServer::IsLaunched() 148{ 149 return fLaunchStatus == B_OK; 150} 151 152 153void 154PrintAddOnServer::Quit() 155{ 156 if (fLaunchStatus == B_OK) { 157 fMessenger.SendMessage(B_QUIT_REQUESTED); 158 fLaunchStatus = B_ERROR; 159 } 160} 161 162 163void 164PrintAddOnServer::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 180void 181PrintAddOnServer::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 192status_t 193PrintAddOnServer::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 203status_t 204PrintAddOnServer::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 215status_t 216PrintAddOnServer::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