xref: /haiku/src/servers/print/Printer.Scripting.cpp (revision 83b1a68c52ba3e0e8796282759f694b7fdddf06d)
1 /*
2  * Copyright 2001-2006, Haiku. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Ithamar R. Adema
7  */
8 #include "Printer.h"
9 
10 
11 #include "pr_server.h"
12 
13 	// BeOS API
14 #include <AppDefs.h>
15 #include <Catalog.h>
16 #include <Locale.h>
17 #include <Message.h>
18 #include <Messenger.h>
19 #include <PropertyInfo.h>
20 
21 
22 #undef B_TRANSLATION_CONTEXT
23 #define B_TRANSLATION_CONTEXT "Printer Scripting"
24 
25 
26 static property_info prop_list[] = {
27 	{ "Name", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER },
28 		B_TRANSLATE_MARK("Get name of printer") },
29 	{ "TransportAddon", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER },
30 		B_TRANSLATE_MARK("Get name of the transport add-on used for this printer") },
31 	{ "TransportConfig", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER },
32 		B_TRANSLATE_MARK("Get the transport configuration for this printer") },
33 	{ "PrinterAddon", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER },
34 		B_TRANSLATE_MARK("Get name of the printer add-on used for this printer") },
35 	{ "Comments", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER },
36 		B_TRANSLATE_MARK("Get comments about this printer") },
37 	{ 0 } // terminate list
38 };
39 
40 
41 void
42 Printer::HandleScriptingCommand(BMessage* msg)
43 {
44 	status_t rc = B_ERROR;
45 	BString propName;
46 	BString result;
47 	BMessage spec;
48 	int32 idx;
49 
50 	if ((rc=msg->GetCurrentSpecifier(&idx,&spec)) == B_OK &&
51 		(rc=spec.FindString("property",&propName)) == B_OK) {
52 		switch(msg->what) {
53 			case B_GET_PROPERTY:
54 				if (propName == "Name")
55 					rc = SpoolDir()->ReadAttrString(PSRV_PRINTER_ATTR_PRT_NAME, &result);
56 				else if (propName == "TransportAddon")
57 					rc = SpoolDir()->ReadAttrString(PSRV_PRINTER_ATTR_TRANSPORT, &result);
58 				else if (propName == "TransportConfig")
59 					rc = SpoolDir()->ReadAttrString(PSRV_PRINTER_ATTR_TRANSPORT_ADDR, &result);
60 				else if (propName == "PrinterAddon")
61 					rc = SpoolDir()->ReadAttrString(PSRV_PRINTER_ATTR_DRV_NAME, &result);
62 				else if (propName == "Comments")
63 					rc = SpoolDir()->ReadAttrString(PSRV_PRINTER_ATTR_COMMENTS, &result);
64 				else { // If unknown scripting request, let super class handle it
65 					Inherited::MessageReceived(msg);
66 					break;
67 				}
68 
69 				BMessage reply(B_REPLY);
70 				reply.AddString("result", result);
71 				reply.AddInt32("error", rc);
72 				msg->SendReply(&reply);
73 				break;
74 		}
75 	}
76 	else {
77 			// If GetSpecifier failed
78 		if (idx == -1) {
79 			BMessage reply(B_REPLY);
80 			reply.AddMessenger("result", BMessenger(this));
81 			reply.AddInt32("error", B_OK);
82 			msg->SendReply(&reply);
83 		}
84 	}
85 }
86 
87 BHandler*
88 Printer::ResolveSpecifier(BMessage* msg, int32 index, BMessage* spec,
89 	int32 form, const char* prop)
90 {
91 	BPropertyInfo prop_info(prop_list);
92 	BHandler* rc = this;
93 
94 	int32 idx;
95 	switch( idx=prop_info.FindMatch(msg,0,spec,form,prop) ) {
96 		case B_ERROR:
97 			rc = Inherited::ResolveSpecifier(msg,index,spec,form,prop);
98 			break;
99 	}
100 
101 	return rc;
102 }
103 
104 status_t
105 Printer::GetSupportedSuites(BMessage* msg)
106 {
107 	msg->AddString("suites", "application/x-vnd.OpenBeOS-printer");
108 
109 	static bool localized = false;
110 	if (!localized) {
111 		localized = true;
112 		for (int i = 0; prop_list[i].name != NULL; i ++)
113 			prop_list[i].usage = B_TRANSLATE_NOCOLLECT(prop_list[i].usage);
114 	}
115 
116 	BPropertyInfo prop_info(prop_list);
117 	msg->AddFlat("messages", &prop_info);
118 
119 	return Inherited::GetSupportedSuites(msg);
120 }
121