Slight rework of my previous commit... now ports can be asked too ;)

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23928 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ithamar R. Adema
2008-02-08 02:00:08 +00:00
parent 62cb58a8ef
commit eb5a25ca41
4 changed files with 50 additions and 12 deletions
+4 -4
View File
@@ -35,18 +35,18 @@ THE SOFTWARE.
#include <Directory.h> #include <Directory.h>
#include <Message.h> #include <Message.h>
// int transport_features; symbol name #define B_TRANSPORT_LIST_PORTS_SYMBOL "list_transport_ports"
#define B_TRANSPORT_FEATURES_SYMBOL "transport_features" #define B_TRANSPORT_FEATURES_SYMBOL "transport_features"
// Bit values for 'transport_features' // Bit values for 'transport_features'
enum { enum {
B_TRANSPORT_SUPPORTS_PROBE = 1, B_TRANSPORT_IS_HOTPLUG = 1,
B_TRANSPORT_SUPPORTS_SHARING = 2, B_TRANSPORT_IS_NETWORK = 2,
}; };
// to be implemented by the transport add-on // to be implemented by the transport add-on
extern "C" BDataIO* instantiate_transport(BDirectory* printer, BMessage* msg); extern "C" BDataIO* instantiate_transport(BDirectory* printer, BMessage* msg);
extern "C" status_t install_transport_probe(void); extern "C" status_t list_transport_ports(BMessage* msg);
#endif #endif
+12 -2
View File
@@ -17,6 +17,8 @@
static property_info prop_list[] = { static property_info prop_list[] = {
{ "Name", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER }, { "Name", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER },
"Get name of transport" }, "Get name of transport" },
{ "Ports", { B_GET_PROPERTY }, { B_DIRECT_SPECIFIER },
"Get currently available ports/devices" },
{ 0 } // terminate list { 0 } // terminate list
}; };
@@ -33,8 +35,16 @@ void Transport::HandleScriptingCommand(BMessage* msg)
switch(msg->what) { switch(msg->what) {
case B_GET_PROPERTY: case B_GET_PROPERTY:
if (propName == "Name") if (propName == "Name")
result = fName; result = Name();
else { // If unknown scripting request, let superclas handle it else if (propName == "Ports") {
// Need to duplicate messaging code, as our result is a complex
// bmessage, not a string :(
BMessage reply(B_REPLY);
rc = ListAvailablePorts(&reply);
reply.AddInt32("error", rc);
msg->SendReply(&reply);
break;
} else { // If unknown scripting request, let superclas handle it
Inherited::MessageReceived(msg); Inherited::MessageReceived(msg);
break; break;
} }
+30 -4
View File
@@ -112,7 +112,7 @@ status_t Transport::Scan(directory_which which)
// --------------------------------------------------------------- // ---------------------------------------------------------------
Transport::Transport(const BPath& path) Transport::Transport(const BPath& path)
: BHandler(B_EMPTY_STRING), : BHandler(B_EMPTY_STRING),
fName(path.Leaf()), fPath(path),
fImageID(-1), fImageID(-1),
fFeatures(0) fFeatures(0)
{ {
@@ -130,9 +130,8 @@ Transport::Transport(const BPath& path)
} else { } else {
fFeatures = *transport_features_ptr; fFeatures = *transport_features_ptr;
if (*transport_features_ptr & B_TRANSPORT_SUPPORTS_PROBE) { if (*transport_features_ptr & B_TRANSPORT_IS_HOTPLUG) {
// Transport supports probing, so it needs to stay loaded... // We are hotpluggable; so keep us loaded!
printf("IRA: Transport %s supports probing!\n", path.Path());
fImageID = id; fImageID = id;
} }
else // No extended Transport support; so no need to keep loaded else // No extended Transport support; so no need to keep loaded
@@ -148,6 +147,33 @@ Transport::~Transport()
sTransports.RemoveItem(this); sTransports.RemoveItem(this);
} }
// ---------------------------------------------------------------
status_t Transport::ListAvailablePorts(BMessage* msg)
{
status_t (*list_ports)(BMessage*);
image_id id = fImageID;
status_t rc = B_OK;
// Load image if not loaded yet
if (id == -1 && (id=load_add_on(fPath.Path())) < 0)
return id;
// Get pointer to addon function
if ((rc=get_image_symbol(id, B_TRANSPORT_LIST_PORTS_SYMBOL,
B_SYMBOL_TYPE_TEXT, (void**)&list_ports)) != B_OK)
goto done;
// run addon...
rc = (*list_ports)(msg);
done:
// clean up if needed
if (fImageID != id)
unload_add_on(id);
return rc;
}
// --------------------------------------------------------------- // ---------------------------------------------------------------
// MessageReceived // MessageReceived
// //
+4 -2
View File
@@ -24,7 +24,9 @@ public:
Transport(const BPath& path); Transport(const BPath& path);
~Transport(); ~Transport();
const BString& Name() const { return fName; } BString Name() const { return fPath.Leaf(); }
status_t ListAvailablePorts(BMessage* msg);
static status_t Scan(directory_which which); static status_t Scan(directory_which which);
@@ -42,7 +44,7 @@ public:
int32 form, const char* prop); int32 form, const char* prop);
private: private:
BString fName; BPath fPath;
long fImageID; long fImageID;
int fFeatures; int fFeatures;