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