[ Be Logo ] [ Home ][ Site Map ][ Search ][ Contact ][ Be Europe ][ Developers Banner ]
About Be, Inc.Be ProductsThe World of BeDeveloper ServicesJobs @ Be[Bottom]

Be Developer Services

Free Resources

BeIA FAQ

BeIA Evaluation

Partner Program

Join

Partner Area

|

  The BMessage
Issue 14    November 15, 2000

News

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

JLG

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

Engineering Insights

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.



.
About Be, Inc. | Be Products | World of Be | BeOS Support | Jobs | Developers | Press | Partners | Investors
.
Copyright © 2001 by Be, Inc. All rights reserved. (Legal Info)
Comments, questions, or confessions about our site? Please write the Webmaster!