Issue 14 November 15, 2000
Be in the News
November 6, 2000
A BeOS View
Of Apple's New OS X, Byte.com
Be Press Releases
November 13, 2000
Be
Inc. Unveils First Complete Solution for Internet Appliances with the
Introduction of BeIA MAP
November 13, 2000
Be and
Epson Team to Offer Printing Options for Internet Appliances
return to top
Thoughts on Comdex 2000
by Jean-Louis Gassée, CEO and Chairman
I never imagined that Comdex would provide relief but, in
this Year of The Chad, it does. The noisy trade show took
my mind off such dark thoughts as a possible suit against the
INS for unacceptably slow processing of the Gassée family's
US citizenship application, for example...
Just before Comdex, a Gentle Reader wrote strong words to
the effect that he had had to pick himself up off the floor
laughing after browsing our Web site and reading BeIA material.
He said -- all caveats and apologies hereby tendered -- Who
needs this? No one will buy a device just to browse the Net.
Fair comment. We've seen how some pioneers have fared, from
the iToaster to the i-Opener; one can understand the basis of
our Gentle Reader's hilarity. The gentleman was charitable
enough not to add Microsoft's weight to his argument -- the
WebTV's slow and very expensive progress (hundreds of
millions of dollars sunk, so far) could have made his point
final, an argument as difficult to push around as a sumo
wrestler.
On the other hand, interest in "connected devices" (another
name for Internet Appliances) keeps gaining weight. Consumer
electronics giants and phone companies, from Panasonic to
Nokia, are all showing various permutations of mobile and
home devices rendering Internet content in some form. One
can argue that we've seen loud proclamations before that lead
nowhere in practice, such as Larry Ellison and Sun's NC. I
have two comments on this point: 1) some Internet Appliances
are indeed the implementation of Larry's NC; and 2) no one
really argues that the Internet will be everywhere. The real
argument is when and how.
Today, the PC is the Net navigation and rendering device.
This is changing -- which is not to say that PCs will disappear.
We're moving from the PC as the universal device to a more
rational segmentation into task-specific devices, just as we
observe in every other walk of life, from transportation to
entertainment. Bill Gates made similar points in his customary
Comdex address, while demonstrating a Windows-powered tablet.
He recognized long ago that we're moving from a PC-centric world
view to an Internet-centric one. The DOJ might argue about
Microsoft's way of converting to the new world view, but no one
disputes the validity of Bill's "Pearl Harbor" speech five years
ago.
Speaking of The Chairman, we were flattered that he spent time
in the Internet Appliances pavilion, looking closely at the
various BeIA-powered devices we were showing. While this makes
some of us a little nervous, we must also tip our hat to the
person and company culture he created. How many CEOs, or
Chairpersons, go around Comdex like Bill Gates and personally
look at the competition and ask questions?
We also had a suite at the Venetian Hotel adjoining the Sands
Convention Center, close enough to the natural flow of traffic
and quiet enough for discussions with our business partners. Of
all the appliances we displayed, one had visitors making a
bee-line straight across the room: a prototype tablet powered
by a low-power processor -- that is all we can describe at this
time. We can say that it provides a very attractive way of
browsing the Net, rendering multimedia content, providing
untethered information and entertainment. It shows the
emotional -- and economic -- impact of wireless broadband at
home.
How and when the Internet will be everywhere remain important
questions, but Comdex provides a better perception of the way
technologies are converging to make Internet Appliances a
convenient and fun reality.
return to top
Creating a New Mimetype with Attributes
by Jonathan Tarbox, DTS Engineer
Hi, I'm the new guy here at Be. You may remember me from the Technical Support team in Dallas
or for helping a bit with the 3c509 Linux driver. Now I'm working on the Be team in California, and
writing my first newsletter article.
My subject is creating a new mimetype with file attributes. Now,
I'm sure that each and every one of us has thought about adding our own mimetype and attributes
to files so we can use them in Tracker, to search for or display information. I'm going to go over
the process of creating a new generic mimetype and adding attributes to it.
What I'll show is an
example I put together from a personal project I'm working on. It's is a tool to search for and find
Quake2 (and other games in the future) servers and launch the game with the correct parameters.
You may know of a Windows equivalent called GameSpy.
First we need to create the search
index for the attributes we want to be able to query. We do this with the fs_create_index() function.
In this function, the necessary parameters are the storage Device, the attribute name, the attribute
type, and 0 (currently unused at the moment). This function must be called PRIOR to the creation of
any files with this attribute, because you can't query files created before the function is called. As
it's currently coded, the attributes are indexed whether the game is found or not, just to make sure
that they are indexed. Also, as you can see, I do this only for the boot volume. If you want to index
on multiple volumes, you need to call fs_create_index for each volume. This is on my to-do list, but
I haven't gotten to it yet.
Next, for the purpose of this example, it's assumed that the application
has already searched for and found that Quake2 is installed on the system; thus the Q2_found
boolean is set for true. Before selecting a new mimetype, I recommended reading the BeBook
for details on valid mimetypes. Assuming that our mimetype is valid, we can set the BMimeType
class to our mimetype, "application/x-gameserver-Quake2", and see if it's already installed with
the IsInstalled() function. If it isn't, we call Install() to create it and then set the descriptions and the
Preferred Application for it, "application/x-vnd.TriggerFinger".
Then, we grab the large icon and
the mini icon from the actual Quake2 executable to use in the Quake2 server mimetype. After that,
a BMessage is generated to pass to the BMimeType class with all the attribute information. The
"source to the people" application in BeOS R5 inspired this.
Let's go over each component you
need to add an attribute to a mimetype:
* "attr:public_name" -- the name of the attribute as
seen within Tracker. For the most part, this is how the attribute will be named to the end users.
* "attr:name" -- the internal name of the attribute. This is how the attribute will be addressed from
internal code.
* "attr:type" -- the type of the attribute. Valid types are almost any of the 'Type
Codes' from the BeBook. This includes B_STRING_TYPE, B_BOOLEAN_TYPE, B_INT32_TYPE,
etc. B_ANY_TYPE and B_MIME_TYPE could be used, but I don't see the purpose in doing so.
* "attr:viewable" -- a boolean option that defines whether this attribute can be seen from within
Tracker. If you want end users to be able to see the attribute, mark this as true; if not, mark it
false.
* "attr:editable" -- another boolean option that defines whether an attribute is editable
within the Tracker by an end user. This option is mute if the attribute is not visible.
* "attr:width" -- this option expects a numeric value for the default width in pixels for this attribute if
it's visible from within Tracker.
* "attr:alignment" -- defines the alignment of an attribute if it's visible from within
Tracker. Valid values are B_ALIGN_LEFT, B_ALIGN_CENTER, B_ALIGN_RIGHT.
* "attr:extra"
-- the BeBook does not go into this unused variable, but because the People source code sample
marked this as false, so did I -- just to be cautious.
Once each attribute for this mimetype is
defined, just pass the message to the BMimeType class. That's it! If you look in the File Types
preference, there should be a new mimetype with the correct attributes.
Please look at the
header file in order to better understand the code.
These defines are in the header file, but included here to
help better understand the code.
#define APP_SIG "application/x-vnd.TriggerFinger"
#define QUAKE2_SERVER "application/x-gameserver-Quake2"
void TriggerFinger::check_mimetypes() {
Bbitmap large_icon(BRect(0, 0, B_LARGE_ICON - 1, B_LARGE_ICON - 1), B_COLOR_8_BIT);
Bbitmap mini_icon(BRect(0, 0, B_MINI_ICON - 1, B_MINI_ICON - 1), B_COLOR_8_BIT);
Bvolume vol;
BvolumeRoster roster;
BmimeType mime;
Bmessage msg;
roster.GetBootVolume(&vol);
fs_create_index(vol.Device(), "TF:servername", B_STRING_TYPE, 0);
fs_create_index(vol.Device(), "TF:IPaddress", B_STRING_TYPE, 0);
fs_create_index(vol.Device(), "TF:map", B_STRING_TYPE, 0);
fs_create_index(vol.Device(), "TF:game", B_STRING_TYPE, 0);
fs_create_index(vol.Device(), "TF:password", B_STRING_TYPE, 0);
fs_create_index(vol.Device(), "TF:maxplayers", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:numplayers", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:dmflags", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:fraglimit", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:timelimit", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:averageping", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:minping", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:maxping", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:pingcount", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:pingtotal", B_INT32_TYPE, 0);
fs_create_index(vol.Device(), "TF:ping", B_INT32_TYPE, 0);
if (Q2_found) {
mime.SetType(QUAKE2_SERVER);
if (!mime.IsInstalled()) {
mime.Install();
mime.SetShortDescription("Quake2 Server");
mime.SetLongDescription("A multiplayer server for Quake2.");
mime.SetPreferredApp(APP_SIG);
BEntry quake2(&Q2_ref);
GetIcon(&quake2, &large_icon, &mini_icon);
mime.SetIcon(&large_icon, B_LARGE_ICON);
mime.SetIcon(&mini_icon, B_MINI_ICON);
msg.AddString("attr:public_name", "Server Name");
msg.AddString("attr:name", "TF:servername");
msg.AddInt32("attr:type", B_STRING_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 120);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Internet Address");
msg.AddString("attr:name", "TF:IPaddress");
msg.AddInt32("attr:type", B_STRING_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 120);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Current Ping");
msg.AddString("attr:name", "TF:ping");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Total Ping");
msg.AddString("attr:name", "TF:pingtotal");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", false);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Refresh Count");
msg.AddString("attr:name", "TF:pingcount");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Highest Ping");
msg.AddString("attr:name", "TF:maxping");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Lowest Ping");
msg.AddString("attr:name", "TF:minping");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Average Ping");
msg.AddString("attr:name", "TF:averageping");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Map");
msg.AddString("attr:name", "TF:map");
msg.AddInt32("attr:type", B_STRING_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Game");
msg.AddString("attr:name", "TF:game");
msg.AddInt32("attr:type", B_STRING_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Password Needed");
msg.AddString("attr:name", "TF:password");
msg.AddInt32("attr:type", B_STRING_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Time Limit");
msg.AddString("attr:name", "TF:timelimit");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Frag Limit");
msg.AddString("attr:name", "TF:fraglimit");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "DM Flags");
msg.AddString("attr:name", "TF:dmflags");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Number of Players");
msg.AddString("attr:name", "TF:numplayers");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
msg.AddString("attr:public_name", "Maximum Players");
msg.AddString("attr:name", "TF:maxplayers");
msg.AddInt32("attr:type", B_INT32_TYPE);
msg.AddBool("attr:viewable", true);
msg.AddBool("attr:editable", false);
msg.AddInt32("attr:width", 90);
msg.AddInt32("attr:alignment", B_ALIGN_LEFT);
msg.AddBool("attr:extra", false);
mime.SetAttrInfo(&msg);
}
}
}
return to top
Statements contained in this Newsletter that are not historical facts are
"forward-looking statements" including without limitation statements
regarding the demand for, future market penetration and market acceptance of
BeIA and BeOS, the shipment dates of Be's products, and the future operating
results of Be Incorporated. Actual events or results may differ materially
as a result of risks facing Be Incorporated or actual results differing from
the assumptions underlying such statements. Such risks and assumptions
include, but are not limited to, risks related to competition, market
acceptance and market penetration of Be's products, ability to establish and
maintain strategic relationships, the benefit of Be's products to OEM and
Internet appliance manufacturers. the continued availability of third party
BeOS applications and drivers, and the ability to establish and maintain
strategic publishing relationships. All forward-looking statements are
expressly qualified in their entirety by the "Risk Factors" and other
cautionary statements included in Be Incorporated's Annual Report on Form
10-K for the year ended December 31, 1999, and other public filings with the
Securities and Exchange Commission.
The BMessage
Copyright (c) 2001 by Be, Inc.
All rights reserved.
Be, Inc.
800 El Camino Real, Suite 400
Menlo Park, CA 94025
Tel: (650) 462-4100
Fax: (650) 462-4129
Web: http://www.be.com/
Be, BeOS and BeIA are trademarks or registered trademarks of Be Incorporated
in the United States and other countries. Other brand product names are
registered trademarks or trademarks of their respective holders. All rights
reserved.
The BMessage is sent to subscribers of one or more of the Be mailing lists.
For more information about subscribing/unsubscribing, see the Be web site:
http://www.be.com/world/mailinglists.html. The Be web site also offers a complete set of current and back issues of Be Newsletters:
If you have any comments about The BMessage, please e-mail them
to:newsletter@be.com.