\o/ \o/ This is the mighty GoogleFS for BeOS, now also for Haiku. \o/ \o/
Quick, before I loose googlefs.h again (bloody /bin/deres which overwrites foo.h for foo.rsrc !!!!) A makefile is provided for BeOS/Zeta, the Jamfile currently only builds for Haiku. The makefile.ufs is for UserlandFS. The source code is quite messy, beware. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19873 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
b3e65bfd2e
commit
d256fad4bb
20
src/add-ons/kernel/file_systems/googlefs/Jamfile
Normal file
20
src/add-ons/kernel/file_systems/googlefs/Jamfile
Normal file
@ -0,0 +1,20 @@
|
||||
SubDir HAIKU_TOP src add-ons kernel file_systems googlefs ;
|
||||
|
||||
UsePrivateHeaders kernel ;
|
||||
|
||||
#SubDirCcFlags -DTRACK_FILENAME ;
|
||||
#SubDirCcFlags -DDEBUG_GOOGLEFS=1 ;
|
||||
|
||||
KernelAddon googlefs :
|
||||
attrs.c
|
||||
google_icon.c
|
||||
google_request.c
|
||||
googlefs.c
|
||||
http_cnx.c
|
||||
lists2.c
|
||||
parse_google_html.c
|
||||
query.c
|
||||
settings.c
|
||||
string_utils.c
|
||||
vnidpool.c
|
||||
;
|
29
src/add-ons/kernel/file_systems/googlefs/README.googlefs.txt
Normal file
29
src/add-ons/kernel/file_systems/googlefs/README.googlefs.txt
Normal file
@ -0,0 +1,29 @@
|
||||
Welcome to the Google™ FileSystem for BeOS™, Zeta™ and Haiku™.
|
||||
Copyright© 2004, 2005, François Revol.
|
||||
Google is a trademark of Google,Inc.
|
||||
BeOS is a trademark of PalmSource.
|
||||
Zeta is a trademark of yellowTAB GmbH.
|
||||
Haiku is a trademark of Haiku Inc.
|
||||
|
||||
|
||||
REQUIRES BONE
|
||||
|
||||
mkdir /google; ndmount googlefs /google
|
||||
|
||||
Use "Search Google" query template in this folder to ask google anything.
|
||||
|
||||
or:
|
||||
|
||||
query -v /google '((name=="*QUESTION*")&&(BEOS:TYPE=="application/x-vnd.Be-bookmark"))'
|
||||
where QUESTION is what you want to ask google. (googlefs currently filters queries to only answer those)
|
||||
( you will want to pipe that to catattr:
|
||||
query -v /google '((name=="*site:bebits.com bone*")&&(BEOS:TYPE=="application/x-vnd.Be-bookmark"))' | xargs catattr META:url
|
||||
note that won't work with sync_unlink true in the settings)
|
||||
|
||||
Included are 2 scripts, google and imlucky that runs such a query using the arguments given on the command line.
|
||||
|
||||
An addon for Ingo Weinhold's UserlandFS is provided, compiled with debug printouts, so you can see it at work.
|
||||
To use it, startUserlandFSServer and run:
|
||||
ufs_mount googlefs /dev/zero /google
|
||||
|
||||
Enjoy.
|
1
src/add-ons/kernel/file_systems/googlefs/_APP_
Symbolic link
1
src/add-ons/kernel/file_systems/googlefs/_APP_
Symbolic link
@ -0,0 +1 @@
|
||||
/boot/home/config/bin/UserlandFSServer
|
10
src/add-ons/kernel/file_systems/googlefs/attr2c
Executable file
10
src/add-ons/kernel/file_systems/googlefs/attr2c
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "attr2c attrname file"
|
||||
exit 1
|
||||
fi
|
||||
#for R5 catattr
|
||||
/bin/catattr "$1" "$2" | tail +2 | cut -c 10-57 | sed 's/,/, 0x/g;s/ / 0x/;s/ *//;s/$/,/'
|
||||
#for zeta ??
|
||||
#catattr "$1" "$2" | tail +2 | cut -c 10-57 | sed 's/,/, 0x/g;s/ / 0x/;s/ *//;s/$/,/'
|
273
src/add-ons/kernel/file_systems/googlefs/attrs.c
Normal file
273
src/add-ons/kernel/file_systems/googlefs/attrs.c
Normal file
@ -0,0 +1,273 @@
|
||||
#include <SupportDefs.h>
|
||||
#include "googlefs.h"
|
||||
|
||||
#define SZSTR(s) sizeof(s), s
|
||||
#define SZTAB(s) sizeof(s), s
|
||||
|
||||
extern const char google_icon_M[];
|
||||
extern const char google_icon_L[];
|
||||
|
||||
|
||||
struct attr_entry root_folder_attrs[] = {
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("application/x-vnd.Be-directory") },
|
||||
{ "BEOS:M:STD_ICON", 'MICN', 16*16, google_icon_M },
|
||||
{ "BEOS:L:STD_ICON", 'ICON', 32*32, google_icon_L },
|
||||
//{ "BEOS:EMBLEMS", 'CSTR', SZSTR("palm") },
|
||||
{ NULL, 0, 0, NULL } /* end of list */
|
||||
};
|
||||
|
||||
static uint8 folders_attrs_1[] = {
|
||||
0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x54, 0x69, 0x74, 0x6c,
|
||||
0x65, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
|
||||
0x00, 0x00, 0x4d, 0x45, 0x54, 0x41, 0x3a, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x00, 0x52, 0x7d, 0xfb,
|
||||
0x77, 0x52, 0x54, 0x53, 0x43, 0x00, 0x01, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x03,
|
||||
0x00, 0x00, 0x00, 0x55, 0x52, 0x4c, 0x00, 0x00, 0x00, 0x39, 0x43, 0x00, 0x00, 0x2a, 0x43, 0x00,
|
||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x54, 0x41, 0x3a, 0x75, 0x72, 0x6c, 0x00,
|
||||
0x52, 0x54, 0x5b, 0xe3, 0x52, 0x54, 0x53, 0x43, 0x00, 0x01, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00,
|
||||
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x00, 0x00,
|
||||
0x00, 0xb9, 0x43, 0x00, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4d,
|
||||
0x45, 0x54, 0x41, 0x3a, 0x6b, 0x65, 0x79, 0x77, 0x00, 0x52, 0xdc, 0xf3, 0xdb, 0x52, 0x54, 0x53,
|
||||
0x43, 0x00, 0x01, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4d,
|
||||
0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x00, 0x00, 0xc0, 0x00, 0x44, 0x00, 0x00, 0x16, 0x43,
|
||||
0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x2f, 0x6d, 0x6f,
|
||||
0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x00, 0x45, 0x6d, 0x4b, 0x5d, 0x45, 0x4d, 0x49, 0x54, 0x01,
|
||||
0x00, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x47, 0x6f, 0x6f,
|
||||
0x67, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x00, 0x00, 0x00, 0x2a, 0x44, 0x00, 0x00,
|
||||
0xa0, 0x41, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45,
|
||||
0x3a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x00, 0x47, 0xde, 0xef, 0xfc, 0x47, 0x4e, 0x4f, 0x4c, 0x00,
|
||||
0x01 };
|
||||
static uint8 folders_attrs_2[] = {
|
||||
0x52, 0xf5, 0x5e, 0x6f, 0x0a, 0x00, 0x00, 0x00, 0x74, 0x73, 0x6c, 0x54, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x47, 0xde, 0xef, 0xfc, 0x47, 0x4e, 0x4f, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x01 };
|
||||
struct attr_entry folders_attrs[] = {
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("application/x-vnd.Be-directory") },
|
||||
{ "_trk/columns_le", 'RAWT', SZTAB(folders_attrs_1) },
|
||||
{ "_trk/viewstate_le", 'RAWT', SZTAB(folders_attrs_2) },
|
||||
{ "", 'RAWT', SZTAB(folders_attrs_2) },
|
||||
{ NULL, 0, 0, NULL } /* end of list */
|
||||
};
|
||||
|
||||
struct attr_entry bookmark_attrs[] = {
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("application/x-vnd.Be-bookmark") },
|
||||
{ NULL, 0, 0, NULL } /* end of list */
|
||||
};
|
||||
|
||||
/* for debugging */
|
||||
static int32 fake_bm_attr_1 = 1;
|
||||
struct attr_entry fake_bookmark_attrs[] = {
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("application/x-vnd.Be-bookmark") },
|
||||
{ "META:title", 'CSTR', SZSTR("Plop!") },
|
||||
{ "META:url", 'CSTR', SZSTR("http://127.0.0.1/") },
|
||||
{ "META:keyw", 'CSTR', SZSTR("plop") },
|
||||
//{ "GOOGLE:order", 'LONG', sizeof(int32), &fake_bm_attr_1 },
|
||||
{ NULL, 0, 0, NULL } /* end of list */
|
||||
};
|
||||
|
||||
static uint8 template_1_attrs_1 = 1;
|
||||
static int32 template_1_attrs_2 = 1;
|
||||
static uint8 template_1_attrs_3[] = {
|
||||
0x31, 0x42, 0x4F, 0x46, 0x01, 0x00, 0x00, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x01, 0x0F, 0x47, 0x4E, 0x4F, 0x4C, 0x04, 0x0C, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E,
|
||||
0x44, 0x61, 0x74, 0x65, 0x51, 0xEA, 0xC7, 0x41, 0x0F, 0x47, 0x4E, 0x4C, 0x4C, 0x08, 0x08, 0x63,
|
||||
0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B,
|
||||
0x52, 0x54, 0x53, 0x43, 0x08, 0x0A, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4E, 0x61, 0x6D, 0x65,
|
||||
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x41, 0x0B, 0x52, 0x54, 0x53, 0x43, 0x10, 0x0A, 0x76,
|
||||
0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x4E, 0x61, 0x6D, 0x65, 0x07, 0x00, 0x00, 0x00, 0x47, 0x6F, 0x6F,
|
||||
0x67, 0x6C, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x52, 0x54, 0x53, 0x43, 0x10, 0x07,
|
||||
0x66, 0x73, 0x68, 0x4E, 0x61, 0x6D, 0x65, 0x09, 0x00, 0x00, 0x00, 0x67, 0x6F, 0x6F, 0x67, 0x6C,
|
||||
0x65, 0x66, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||
static int32 template_1_attrs_4 = 0x4662796E;
|
||||
static uint8 template_1_attrs_5[] = {
|
||||
0x00, 0x00, 0x06, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00 };
|
||||
static int32 template_1_attrs_6 = 0x00000027;
|
||||
static int32 template_1_attrs_7 = 0x00000000;
|
||||
static uint8 template_1_attrs_8[] = {
|
||||
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x82, 0x43, 0x00, 0x00, 0xA0, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0xE0, 0x9F, 0x44, 0x00, 0xC0, 0x7F, 0x44, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
static uint8 template_1_attrs_9[] = {
|
||||
0x00, 0x00, 0x00, 0x00, 0x58, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x44,
|
||||
0x00, 0x00, 0x0c, 0x44 };
|
||||
static uint8 template_1_attrs_10[] = {
|
||||
0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x54, 0x69, 0x74, 0x6c,
|
||||
0x65, 0x00, 0x00, 0x00, 0x20, 0x42, 0x00, 0x00, 0x50, 0x43, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00,
|
||||
0x00, 0x00, 0x4d, 0x45, 0x54, 0x41, 0x3a, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x00, 0x52, 0x7d, 0xfb,
|
||||
0x77, 0x52, 0x54, 0x53, 0x43, 0x00, 0x01, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x03,
|
||||
0x00, 0x00, 0x00, 0x55, 0x52, 0x4c, 0x00, 0x00, 0x80, 0x83, 0x43, 0x00, 0x80, 0x85, 0x43, 0x00,
|
||||
0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4d, 0x45, 0x54, 0x41, 0x3a, 0x75, 0x72, 0x6c, 0x00,
|
||||
0x52, 0x54, 0x5b, 0xe3, 0x52, 0x54, 0x53, 0x43, 0x00, 0x01, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00,
|
||||
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x00, 0x00,
|
||||
0x40, 0x08, 0x44, 0x00, 0x00, 0x02, 0x43, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x4d,
|
||||
0x45, 0x54, 0x41, 0x3a, 0x6b, 0x65, 0x79, 0x77, 0x00, 0x52, 0xdc, 0xf3, 0xdb, 0x52, 0x54, 0x53,
|
||||
0x43, 0x00, 0x01, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x4d,
|
||||
0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x00, 0x00, 0x80, 0x2c, 0x44, 0x00, 0x00, 0x16, 0x43,
|
||||
0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x2f, 0x6d, 0x6f,
|
||||
0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x00, 0x45, 0x6d, 0x4b, 0x5d, 0x45, 0x4d, 0x49, 0x54, 0x01,
|
||||
0x00, 0x52, 0x56, 0xf2, 0x4f, 0x15, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x47, 0x6f, 0x6f,
|
||||
0x67, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x00, 0x00, 0xc0, 0x55, 0x44, 0x00, 0x00,
|
||||
0x70, 0x41, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45,
|
||||
0x3a, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x00, 0x47, 0xde, 0xef, 0xfc, 0x47, 0x4e, 0x4f, 0x4c, 0x00,
|
||||
0x00 };
|
||||
static uint8 template_1_attrs_11[] = {
|
||||
0x52, 0xf5, 0x5e, 0x6f, 0x0a, 0x00, 0x00, 0x00, 0x74, 0x73, 0x6c, 0x54, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x47, 0xde, 0xef, 0xfc, 0x47, 0x4e, 0x4f, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x01 };
|
||||
struct attr_entry template_1_attrs[] = {
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("application/x-vnd.Be-queryTemplate") },
|
||||
{ "_trk/qrystr", 'CSTR', SZSTR("((name==\"*[aA][nN][yY] [qQ][uU][eE][sS][tT][iI][oO][nN] [yY][oO][uU]\\'[dD] [lL][iI][kK][eE] [tT][oO] [aA][sS][kK] [gG][oO][oO][gG][lL][eE] ?*\")&&(BEOS:TYPE==\"application/x-vnd.Be-bookmark\"))") },
|
||||
{ "_trk/queryDynamicDate", 'BOOL', 1, &template_1_attrs_1 },
|
||||
{ "_trk/recentQuery", 'LONG', sizeof(int32), &template_1_attrs_2 },
|
||||
{ "_trk/qryvol1", 'MSGG', SZTAB(template_1_attrs_3) },
|
||||
{ "_trk/qryinitmime", 'CSTR', SZSTR("Bookmark") },
|
||||
{ "_trk/qryinitmode", 'LONG', sizeof(int32), &template_1_attrs_4 },
|
||||
{ "_trk/qrymoreoptions_le", 'RAWT', SZTAB(template_1_attrs_5) },
|
||||
{ "_trk/qryinitstr", 'CSTR', SZSTR("Any question you'd like to ask google ?") },
|
||||
{ "_trk/focusedView", 'CSTR', SZSTR("TextControl") },
|
||||
{ "_trk/focusedSelEnd", 'LONG', sizeof(int32), &template_1_attrs_6 },
|
||||
{ "_trk/focusedSelStart", 'LONG', sizeof(int32), &template_1_attrs_7 },
|
||||
{ "_trk/xtpinfo_le", 'RAWT', SZTAB(template_1_attrs_8) },
|
||||
{ "_trk/pinfo_le", 'RAWT', SZTAB(template_1_attrs_9) },
|
||||
{ "_trk/columns_le", 'RAWT', SZTAB(folders_attrs_1)/*SZTAB(template_1_attrs_10)*/ },
|
||||
{ "_trk/viewstate_le", 'RAWT', SZTAB(template_1_attrs_11) },
|
||||
{ NULL, 0, 0, NULL } /* end of list */
|
||||
};
|
||||
|
||||
static int32 text_attrs_1 = 0x0000FFFF;
|
||||
static int32 text_attrs_2 = 0x00000000;
|
||||
static uint8 text_attrs_3 = 1;
|
||||
static uint8 text_attrs_4[] = {
|
||||
0x41, 0x6c, 0x69, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00,
|
||||
0x53, 0x77, 0x69, 0x73, 0x37, 0x32, 0x31, 0x20, 0x42, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x41, 0x60, 0x00, 0x00, 0x42, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x28, 0x53, 0x77, 0x69, 0x73, 0x37, 0x32, 0x31, 0x20, 0x42, 0x54, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x41, 0x60, 0x00, 0x00, 0x42, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x53, 0x77, 0x69, 0x73, 0x37, 0x32, 0x31, 0x20,
|
||||
0x42, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x60, 0x00, 0x00, 0x42, 0xb4, 0x00, 0x00,
|
||||
0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x53, 0x77, 0x69, 0x73,
|
||||
0x37, 0x32, 0x31, 0x20, 0x42, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x6f, 0x6d, 0x61,
|
||||
0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x60, 0x00, 0x00,
|
||||
0x42, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47,
|
||||
0x53, 0x77, 0x69, 0x73, 0x37, 0x32, 0x31, 0x20, 0x42, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x41, 0x20, 0x00, 0x00, 0x42, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00 };
|
||||
struct attr_entry text_attrs[] = {
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("text/plain") },
|
||||
{ "be:encoding", 'LONG', sizeof(int32), &text_attrs_1 },
|
||||
{ "alignment", 'LONG', sizeof(int32), &text_attrs_2 },
|
||||
{ "wrap", 'BOOL', sizeof(uint8), &text_attrs_3 },
|
||||
{ "styles", 'RAWT', SZTAB(text_attrs_4) },
|
||||
{ NULL, 0, 0, NULL } /* end of list */
|
||||
};
|
||||
|
||||
char *readmestr = \
|
||||
"Welcome to the Google™ FileSystem for BeOS™, Zeta™ and Haiku™.
|
||||
Copyright© 2004, 2005, François Revol.
|
||||
Google is a trademark of Google,Inc.
|
||||
BeOS is a trademark of PalmSource.
|
||||
Zeta is a trademark of yellowTAB GmbH.
|
||||
Haiku is a trademark of Haiku Inc.
|
||||
|
||||
Use \"Search Google\" query template in this folder to ask google anything.
|
||||
";
|
||||
|
||||
struct attr_entry mailto_me_bookmark_attrs[] = {
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("application/x-person") },
|
||||
{ "META:email", 'CSTR', SZSTR("revol@free.fr") },
|
||||
{ "META:name", 'CSTR', SZSTR("François Revol") },
|
||||
{ "META:country", 'CSTR', SZSTR("France") },
|
||||
{ "META:nickname", 'CSTR', SZSTR("mmu_man") },
|
||||
{ "META:company", 'CSTR', SZSTR("yellowTAB GmbH") },
|
||||
{ "META:url", 'CSTR', SZSTR("") },
|
||||
{ "META:group", 'CSTR', SZSTR("") },
|
||||
{ "IM:connections", 'CSTR', SZSTR("icq:77792625") },
|
||||
#if 0
|
||||
{ "BEOS:TYPE", /*B_MIME_STRING_TYPE*/'MIMS', SZSTR("application/x-vnd.Be-bookmark") },
|
||||
{ "META:title", 'CSTR', SZSTR("Report googlefs bugs") },
|
||||
{ "META:url", 'CSTR', SZSTR("mailto:revol@free.fr"/*"&subject=googlefs bug report""&body=Hi, I found a bug in GoogleFS."*/) },
|
||||
{ "META:keyw", 'CSTR', SZSTR("googlefs") },
|
||||
//{ "GOOGLE:order", 'LONG', sizeof(int32), &fake_bm_attr_1 },
|
||||
#endif
|
||||
{ NULL, 0, 0, NULL } /* end of list */
|
||||
};
|
||||
|
||||
#if 0
|
||||
File: Search Google a
|
||||
Type Size Name Value
|
||||
---------- ---------- ---------------------------------- -----------------------------------------------------------------
|
||||
'MIMS' 35 "BEOS:TYPE" "application/x-vnd.Be-queryTemplate"
|
||||
STRING 191 "_trk/qrystr" "((name==\"*[aA][nN][yY] [qQ][uU][eE][sS][tT][iI][oO][nN] [yY][o"
|
||||
"O][uU]\\'[dD] [lL][iI][kK][eE] [tT][oO] [aA][sS][kK] [gG][oO][o"
|
||||
"O][gG][lL][eE] ?*\")&&(BEOS:TYPE==\"application/x-vnd.Be-bookma"
|
||||
"rk\"))"
|
||||
BOOL 1 "_trk/queryDynamicDate" TRUE
|
||||
INT32 4 "_trk/recentQuery" 1 0x00000001
|
||||
01 0F 47 4E 4F 4C 04 0C-63 72 65 61 74 69 6F 6E ..GNOL..creation
|
||||
44 61 74 65 51 EA C7 41-0F 47 4E 4C 4C 08 08 63 DateQ..A.GNLL..c
|
||||
61 70 61 63 69 74 79 00-00 00 00 00 00 00 00 0B apacity.........
|
||||
52 54 53 43 08 0A 64 65-76 69 63 65 4E 61 6D 65 RTSC..deviceName
|
||||
01 00 00 00 00 00 70 41-0B 52 54 53 43 10 0A 76 ......pA.RTSC..v
|
||||
6F 6C 75 6D 65 4E 61 6D-65 07 00 00 00 47 6F 6F olumeName....Goo
|
||||
67 6C 65 00 00 00 00 00-00 0B 52 54 53 43 10 07 gle.......RTSC..
|
||||
66 73 68 4E 61 6D 65 09-00 00 00 67 6F 6F 67 6C fshName....googl
|
||||
65 66 73 00 00 00 00 00- efs.....
|
||||
STRING 9 "_trk/qryinitmime" "Bookmark"
|
||||
INT32 4 "_trk/qryinitmode" 1180858734 0x4662796E
|
||||
RAW 36 "_trk/qrymoreoptions_le" 00 00 06 EC 00 00 00 00-01 00 00 00 00 00 00 00 ................
|
||||
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
|
||||
00 00 00 00 - ....
|
||||
STRING 40 "_trk/qryinitstr" "Any question you'd like to ask google ?"
|
||||
STRING 12 "_trk/focusedView" "TextControl"
|
||||
INT32 4 "_trk/focusedSelEnd" 39 0x00000027
|
||||
INT32 4 "_trk/focusedSelStart" 0 0x00000000
|
||||
RAW 60 "_trk/xtpinfo_le" FF FF FF FF 00 00 00 00-00 00 00 00 00 00 00 00 ................
|
||||
00 00 00 00 00 00 00 00-00 00 00 00 01 00 00 00 ................
|
||||
00 00 82 43 00 00 A0 42-00 00 00 00 00 00 00 00 ...C...B........
|
||||
00 E0 9F 44 00 C0 7F 44-FF FF FF FF ...D...D....
|
||||
#endif
|
||||
#if 0
|
||||
, 0x41, 0x6E, 0x79, 0x20, 0x71, 0x75, 0x65, 0x73-74, 0x69, 0x6F, 0x6E, 0x20, 0x79, 0x6F, 0x75
|
||||
, 0x27, 0x64, 0x20, 0x6C, 0x69, 0x6B, 0x65, 0x20-74, 0x6F, 0x20, 0x61, 0x73, 0x6B, 0x20, 0x67
|
||||
, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x20, 0x3F, 0x00-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x54, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x74-72, 0x6F, 0x6C, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x27, 0x00, 0x00, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x00, 0x00, 0x00, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
#endif
|
45
src/add-ons/kernel/file_systems/googlefs/attrs.h
Normal file
45
src/add-ons/kernel/file_systems/googlefs/attrs.h
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
, 0xValue, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x-----------------------------------------------
|
||||
, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74-69, 0x6F, 0x6E, 0x2F, 0x78, 0x2D, 0x76, 0x6E
|
||||
, 0x64, 0x2E, 0x42, 0x65, 0x2D, 0x71, 0x75, 0x65-72, 0x79, 0x54, 0x65, 0x6D, 0x70, 0x6C, 0x61
|
||||
, 0x74, 0x65, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x28, 0x28, 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x3D-22, 0x2A, 0x5B, 0x61, 0x41, 0x5D, 0x5B, 0x6E
|
||||
, 0x4E, 0x5D, 0x5B, 0x79, 0x59, 0x5D, 0x20, 0x5B-71, 0x51, 0x5D, 0x5B, 0x75, 0x55, 0x5D, 0x5B
|
||||
, 0x65, 0x45, 0x5D, 0x5B, 0x73, 0x53, 0x5D, 0x5B-74, 0x54, 0x5D, 0x5B, 0x69, 0x49, 0x5D, 0x5B
|
||||
, 0x6F, 0x4F, 0x5D, 0x5B, 0x6E, 0x4E, 0x5D, 0x20-5B, 0x79, 0x59, 0x5D, 0x5B, 0x6F, 0x4F, 0x5D
|
||||
, 0x5B, 0x75, 0x55, 0x5D, 0x5C, 0x27, 0x5B, 0x64-44, 0x5D, 0x20, 0x5B, 0x6C, 0x4C, 0x5D, 0x5B
|
||||
, 0x69, 0x49, 0x5D, 0x5B, 0x6B, 0x4B, 0x5D, 0x5B-65, 0x45, 0x5D, 0x20, 0x5B, 0x74, 0x54, 0x5D
|
||||
, 0x5B, 0x6F, 0x4F, 0x5D, 0x20, 0x5B, 0x61, 0x41-5D, 0x5B, 0x73, 0x53, 0x5D, 0x5B, 0x6B, 0x4B
|
||||
, 0x5D, 0x20, 0x5B, 0x67, 0x47, 0x5D, 0x5B, 0x6F-4F, 0x5D, 0x5B, 0x6F, 0x4F, 0x5D, 0x5B, 0x67
|
||||
, 0x47, 0x5D, 0x5B, 0x6C, 0x4C, 0x5D, 0x5B, 0x65-45, 0x5D, 0x20, 0x3F, 0x2A, 0x22, 0x29, 0x26
|
||||
, 0x26, 0x28, 0x42, 0x45, 0x4F, 0x53, 0x3A, 0x54-59, 0x50, 0x45, 0x3D, 0x3D, 0x22, 0x61, 0x70
|
||||
, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F-6E, 0x2F, 0x78, 0x2D, 0x76, 0x6E, 0x64, 0x2E
|
||||
, 0x42, 0x65, 0x2D, 0x62, 0x6F, 0x6F, 0x6B, 0x6D-61, 0x72, 0x6B, 0x22, 0x29, 0x29, 0x00, 0x, 0x, 0x
|
||||
, 0xFD, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x01, 0x00, 0x00, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x31, 0x42, 0x4F, 0x46, 0x01, 0x00, 0x00, 0x98-98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
, 0x01, 0x0F, 0x47, 0x4E, 0x4F, 0x4C, 0x04, 0x0C-63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6F, 0x6E
|
||||
, 0x44, 0x61, 0x74, 0x65, 0x51, 0xEA, 0xC7, 0x41-0F, 0x47, 0x4E, 0x4C, 0x4C, 0x08, 0x08, 0x63
|
||||
, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x00-00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B
|
||||
, 0x52, 0x54, 0x53, 0x43, 0x08, 0x0A, 0x64, 0x65-76, 0x69, 0x63, 0x65, 0x4E, 0x61, 0x6D, 0x65
|
||||
, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x41-0B, 0x52, 0x54, 0x53, 0x43, 0x10, 0x0A, 0x76
|
||||
, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x4E, 0x61, 0x6D-65, 0x07, 0x00, 0x00, 0x00, 0x47, 0x6F, 0x6F
|
||||
, 0x67, 0x6C, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00-00, 0x0B, 0x52, 0x54, 0x53, 0x43, 0x10, 0x07
|
||||
, 0x66, 0x73, 0x68, 0x4E, 0x61, 0x6D, 0x65, 0x09-00, 0x00, 0x00, 0x67, 0x6F, 0x6F, 0x67, 0x6C
|
||||
, 0x65, 0x66, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x42, 0x6F, 0x6F, 0x6B, 0x6D, 0x61, 0x72, 0x6B-00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x6E, 0x79, 0x62, 0x46, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x00, 0x00, 0x06, 0xEC, 0x00, 0x00, 0x00, 0x00-01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00-00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
, 0x00, 0x00, 0x00, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x41, 0x6E, 0x79, 0x20, 0x71, 0x75, 0x65, 0x73-74, 0x69, 0x6F, 0x6E, 0x20, 0x79, 0x6F, 0x75
|
||||
, 0x27, 0x64, 0x20, 0x6C, 0x69, 0x6B, 0x65, 0x20-74, 0x6F, 0x20, 0x61, 0x73, 0x6B, 0x20, 0x67
|
||||
, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x20, 0x3F, 0x00-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x54, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x74-72, 0x6F, 0x6C, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x27, 0x00, 0x00, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0x00, 0x00, 0x00, 0x00, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x-, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
||||
, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00-00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00-00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
|
||||
, 0x00, 0x00, 0x82, 0x43, 0x00, 0x00, 0xA0, 0x42-00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
, 0x00, 0xE0, 0x9F, 0x44, 0x00, 0xC0, 0x7F, 0x44-FF, 0xFF, 0xFF, 0xFF, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x
|
33
src/add-ons/kernel/file_systems/googlefs/attrs.txt
Normal file
33
src/add-ons/kernel/file_systems/googlefs/attrs.txt
Normal file
@ -0,0 +1,33 @@
|
||||
File: Search Google a
|
||||
Type Size Name Value
|
||||
---------- ---------- ---------------------------------- -----------------------------------------------------------------
|
||||
'MIMS' 35 "BEOS:TYPE" "application/x-vnd.Be-queryTemplate"
|
||||
STRING 191 "_trk/qrystr" "((name==\"*[aA][nN][yY] [qQ][uU][eE][sS][tT][iI][oO][nN] [yY][o"
|
||||
"O][uU]\\'[dD] [lL][iI][kK][eE] [tT][oO] [aA][sS][kK] [gG][oO][o"
|
||||
"O][gG][lL][eE] ?*\")&&(BEOS:TYPE==\"application/x-vnd.Be-bookma"
|
||||
"rk\"))"
|
||||
BOOL 1 "_trk/queryDynamicDate" TRUE
|
||||
INT32 4 "_trk/recentQuery" 1 0x00000001
|
||||
MESSAGE 152 "_trk/qryvol1" 31 42 4F 46 01 00 00 98-98 00 00 00 00 00 00 00 1BOF............
|
||||
01 0F 47 4E 4F 4C 04 0C-63 72 65 61 74 69 6F 6E ..GNOL..creation
|
||||
44 61 74 65 51 EA C7 41-0F 47 4E 4C 4C 08 08 63 DateQ..A.GNLL..c
|
||||
61 70 61 63 69 74 79 00-00 00 00 00 00 00 00 0B apacity.........
|
||||
52 54 53 43 08 0A 64 65-76 69 63 65 4E 61 6D 65 RTSC..deviceName
|
||||
01 00 00 00 00 00 70 41-0B 52 54 53 43 10 0A 76 ......pA.RTSC..v
|
||||
6F 6C 75 6D 65 4E 61 6D-65 07 00 00 00 47 6F 6F olumeName....Goo
|
||||
67 6C 65 00 00 00 00 00-00 0B 52 54 53 43 10 07 gle.......RTSC..
|
||||
66 73 68 4E 61 6D 65 09-00 00 00 67 6F 6F 67 6C fshName....googl
|
||||
65 66 73 00 00 00 00 00- efs.....
|
||||
STRING 9 "_trk/qryinitmime" "Bookmark"
|
||||
INT32 4 "_trk/qryinitmode" 1180858734 0x4662796E
|
||||
RAW 36 "_trk/qrymoreoptions_le" 00 00 06 EC 00 00 00 00-01 00 00 00 00 00 00 00 ................
|
||||
00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
|
||||
00 00 00 00 - ....
|
||||
STRING 40 "_trk/qryinitstr" "Any question you'd like to ask google ?"
|
||||
STRING 12 "_trk/focusedView" "TextControl"
|
||||
INT32 4 "_trk/focusedSelEnd" 39 0x00000027
|
||||
INT32 4 "_trk/focusedSelStart" 0 0x00000000
|
||||
RAW 60 "_trk/xtpinfo_le" FF FF FF FF 00 00 00 00-00 00 00 00 00 00 00 00 ................
|
||||
00 00 00 00 00 00 00 00-00 00 00 00 01 00 00 00 ................
|
||||
00 00 82 43 00 00 A0 42-00 00 00 00 00 00 00 00 ...C...B........
|
||||
00 E0 9F 44 00 C0 7F 44-FF FF FF FF ...D...D....
|
2
src/add-ons/kernel/file_systems/googlefs/bin/google
Executable file
2
src/add-ons/kernel/file_systems/googlefs/bin/google
Executable file
@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
query -v /google/ '((name=="*'"$*"'*")&&(BEOS:TYPE=="application/x-vnd.Be-bookmark"))' | xargs catattr META:url
|
2
src/add-ons/kernel/file_systems/googlefs/bin/imlucky
Executable file
2
src/add-ons/kernel/file_systems/googlefs/bin/imlucky
Executable file
@ -0,0 +1,2 @@
|
||||
#!/bin/sh
|
||||
query -v /google/ '((name=="*'"$*"'*")&&(BEOS:TYPE=="application/x-vnd.Be-bookmark"))' | xargs catattr META:url | head -1
|
33
src/add-ons/kernel/file_systems/googlefs/bookmark.mime
Normal file
33
src/add-ons/kernel/file_systems/googlefs/bookmark.mime
Normal file
@ -0,0 +1,33 @@
|
||||
/bin/setmime -set application/x-vnd.Be-bookmark -short "Bookmark" -long "Bookmark for a web page." -preferredAppSig application/x-vnd.Be-NPOS \
|
||||
-attribute "META:url" -attrName "URL" \
|
||||
-attrType 'CSTR' -attrWidth 170 -attrAlignment left \
|
||||
-attrViewable 1 -attrEditable 1 -attrExtra 0 \
|
||||
-attribute "META:keyw" -attrName "Keywords" \
|
||||
-attrType 'CSTR' -attrWidth 130 -attrAlignment left \
|
||||
-attrViewable 1 -attrEditable 1 -attrExtra 0 \
|
||||
-attribute "META:title" -attrName "Title" \
|
||||
-attrType 'CSTR' -attrWidth 130 -attrAlignment left \
|
||||
-attrViewable 1 -attrEditable 1 -attrExtra 0 \
|
||||
-attribute "GOOGLE:order" -attrName "Google order" \
|
||||
-attrType 'LONG' -attrWidth 40 -attrAlignment right \
|
||||
-attrViewable 1 -attrEditable 1 -attrExtra 0 \
|
||||
-miniIcon ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffff00003f1b0000ffffffff\
|
||||
ffffffffff001b1c3f3f3f1b0000ffffffffffffff0000111b1c3f3f3f1b0000ffffff00002d2c0000111b1c3f000e5dffff003f00002d2c2d00001b000f5d00\
|
||||
ffff003f1b1c00002d2c2d000f5d00ffff001b3f3f3f1b1c00002d2c000011ffff001b1c3f3f3f3f1b00002c2d2d0000005d00001c1b3f3f000e5d00002d2c00\
|
||||
00005d1c00001c000f5d00ffff00003fffff00005d1b000f5d00ffffffffffffffffffff00005d5d00ffffffffffffffffffffffffff0000ffffffffffffffff \
|
||||
-largeIcon ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\
|
||||
ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003f0000ffffffffffffffffffffff\
|
||||
ffffffffffffffffffffffffffffffff001b1c3f3f0000ffffffffffffffffffffffffffffffffffffffffffff0000003f191a1b1c3f3f0000ffffffffffffff\
|
||||
ffffffffffffffffffffffff003f3f3f3f3f3f191a1b1c3f3f0000ffffffffffffffffffffffffffffffff001b1c1b3f3f3f3f3f3f191a1b1c3f3f000000ffff\
|
||||
ffffffffffffffffffff000000151b1c1c3f3f3f3f3f3f191a1b1c3f3f0000ffffffffffffffffffffff002b2a0000151b1c1c3f3f3f3f3f3f191a1b1c0000ff\
|
||||
ffffffffffffffffff00302c2d2b2a0000151b1c1c3f3f3f3f1b1c00001b00ffffffffffffffff00000000302f2c2d2b2b0100151c1b1c3f1b00001c0f005d00\
|
||||
ffffffffffff001b1c0f0f0000302f2c2d2b2b0100151c1b001c0f0f005d00ffffffffffff001b1c1b1c1c0f0e00002f302c2d2b2a000016000f1b005d000fff\
|
||||
ffffffff003f3f3f3f1b1c1b1c0f0f00002f302c2d2b2a00001b005d000fffffffffffff003f3f3f3f3f3f1b1c1b1c0f0f00002f302b313132005d000fffffff\
|
||||
ffffff003f3f3f3f3f3f3f3f3f1b1c1b1c0f0f00002f32313200000fffffffffffffff001b3f3f3f3f3f3f3f3f3f3f1b1c1b1c1c00003231320000000f0fffff\
|
||||
ffff003f1b3f1b3f3f3f3f3f3f3f3f3f3f1b000000000031312d2b2a00000f0fff00003f3f3f1b3f3f3f3f3f3f3f3f3f3f000e0f1c000031312c2d2c2b2b0000\
|
||||
ff1b0000003f3f1b1c3f3f3f3f3f3f3f000e1c3f005d000000002d2c2d2d000fff00003f3f00003f3f1b1c3f3f3f3f3f001b3f005d00000effff00002d2c00ff\
|
||||
005d5d00003f3f00003f3f1b1c3f3f001b3f005d000effffffffffff000000ffff00005d5d00003f3f00003f3f1b3f001b005d000fffffffffffffffffffffff\
|
||||
ffffff00005d5d00003f3f00003f001b005d000fffffffffffffffffffffffffffffffffff00005d5d00003f3f001b005d000fffffffffffffffffffffffffff\
|
||||
ffffffffffffff00005d5d00003f005d000effffffffffffffffffffffffffffffffffffffffffffff00005d5d005d000effffffffffffffffffffffffffffff\
|
||||
ffffffffffffffffffffff00005d000effffffffffffffffffffffffffffffffffffffffffffffffffffffffff000effffffffffffffffffffffffffffffffff
|
15
src/add-ons/kernel/file_systems/googlefs/config/googlefs
Normal file
15
src/add-ons/kernel/file_systems/googlefs/config/googlefs
Normal file
@ -0,0 +1,15 @@
|
||||
# googlefs configuration file
|
||||
#
|
||||
|
||||
# IP of the google server to query
|
||||
server 66.102.11.99
|
||||
|
||||
# max number of vnodes allowed in the fs (to limit RAM usage)
|
||||
# 10 <= allowed <= 1000000
|
||||
max_nodes 5000
|
||||
|
||||
# maximum number of results to ask google for
|
||||
max_results 50
|
||||
|
||||
# delete result entries on last query close
|
||||
sync_unlink 0
|
250
src/add-ons/kernel/file_systems/googlefs/fsproto.h
Normal file
250
src/add-ons/kernel/file_systems/googlefs/fsproto.h
Normal file
@ -0,0 +1,250 @@
|
||||
#ifndef _FSPROTO_H
|
||||
#define _FSPROTO_H
|
||||
|
||||
//#include <sys/dirent.h>
|
||||
#include <dirent.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <iovec.h>
|
||||
#include <OS.h>
|
||||
#include <fs_attr.h>
|
||||
#include <fs_info.h>
|
||||
#include <BeBuild.h>
|
||||
|
||||
typedef dev_t nspace_id;
|
||||
typedef ino_t vnode_id;
|
||||
|
||||
/* UGLY UGLY UGLY */
|
||||
#ifndef _DRIVERS_H
|
||||
struct selectsync;
|
||||
typedef struct selectsync selectsync;
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* PUBLIC PART OF THE FILE SYSTEM PROTOCOL
|
||||
*/
|
||||
|
||||
#define WSTAT_MODE 0x0001
|
||||
#define WSTAT_UID 0x0002
|
||||
#define WSTAT_GID 0x0004
|
||||
#define WSTAT_SIZE 0x0008
|
||||
#define WSTAT_ATIME 0x0010
|
||||
#define WSTAT_MTIME 0x0020
|
||||
#define WSTAT_CRTIME 0x0040
|
||||
|
||||
#define WFSSTAT_NAME 0x0001
|
||||
|
||||
#define B_ENTRY_CREATED 1
|
||||
#define B_ENTRY_REMOVED 2
|
||||
#define B_ENTRY_MOVED 3
|
||||
#define B_STAT_CHANGED 4
|
||||
#define B_ATTR_CHANGED 5
|
||||
#define B_DEVICE_MOUNTED 6
|
||||
#define B_DEVICE_UNMOUNTED 7
|
||||
|
||||
#define B_STOP_WATCHING 0x0000
|
||||
#define B_WATCH_NAME 0x0001
|
||||
#define B_WATCH_STAT 0x0002
|
||||
#define B_WATCH_ATTR 0x0004
|
||||
#define B_WATCH_DIRECTORY 0x0008
|
||||
|
||||
/* UGLY UGLY UGLY - that goes to Drivers.h too */
|
||||
#ifndef SELECT_READ
|
||||
#define SELECT_READ 1
|
||||
#define SELECT_WRITE 2
|
||||
#define SELECT_EXCEPTION 3
|
||||
#endif
|
||||
|
||||
#define B_CUR_FS_API_VERSION 2
|
||||
|
||||
struct attr_info;
|
||||
struct index_info;
|
||||
|
||||
typedef int op_read_vnode(void *ns, vnode_id vnid, char r, void **node);
|
||||
typedef int op_write_vnode(void *ns, void *node, char r);
|
||||
typedef int op_remove_vnode(void *ns, void *node, char r);
|
||||
typedef int op_secure_vnode(void *ns, void *node);
|
||||
|
||||
typedef int op_walk(void *ns, void *base, const char *file, char **newpath,
|
||||
vnode_id *vnid);
|
||||
|
||||
typedef int op_access(void *ns, void *node, int mode);
|
||||
|
||||
typedef int op_create(void *ns, void *dir, const char *name,
|
||||
int omode, int perms, vnode_id *vnid, void **cookie);
|
||||
typedef int op_mkdir(void *ns, void *dir, const char *name, int perms);
|
||||
typedef int op_symlink(void *ns, void *dir, const char *name,
|
||||
const char *path);
|
||||
typedef int op_link(void *ns, void *dir, const char *name, void *node);
|
||||
|
||||
typedef int op_rename(void *ns, void *olddir, const char *oldname,
|
||||
void *newdir, const char *newname);
|
||||
typedef int op_unlink(void *ns, void *dir, const char *name);
|
||||
typedef int op_rmdir(void *ns, void *dir, const char *name);
|
||||
|
||||
typedef int op_readlink(void *ns, void *node, char *buf, size_t *bufsize);
|
||||
|
||||
typedef int op_opendir(void *ns, void *node, void **cookie);
|
||||
typedef int op_closedir(void *ns, void *node, void *cookie);
|
||||
typedef int op_rewinddir(void *ns, void *node, void *cookie);
|
||||
typedef int op_readdir(void *ns, void *node, void *cookie, long *num,
|
||||
struct dirent *buf, size_t bufsize);
|
||||
|
||||
typedef int op_open(void *ns, void *node, int omode, void **cookie);
|
||||
typedef int op_close(void *ns, void *node, void *cookie);
|
||||
typedef int op_free_cookie(void *ns, void *node, void *cookie);
|
||||
typedef int op_read(void *ns, void *node, void *cookie, off_t pos, void *buf,
|
||||
size_t *len);
|
||||
typedef int op_write(void *ns, void *node, void *cookie, off_t pos,
|
||||
const void *buf, size_t *len);
|
||||
typedef int op_readv(void *ns, void *node, void *cookie, off_t pos, const iovec *vec,
|
||||
size_t count, size_t *len);
|
||||
typedef int op_writev(void *ns, void *node, void *cookie, off_t pos, const iovec *vec,
|
||||
size_t count, size_t *len);
|
||||
typedef int op_ioctl(void *ns, void *node, void *cookie, int cmd, void *buf,
|
||||
size_t len);
|
||||
typedef int op_setflags(void *ns, void *node, void *cookie, int flags);
|
||||
|
||||
typedef int op_rstat(void *ns, void *node, struct stat *);
|
||||
typedef int op_wstat(void *ns, void *node, struct stat *, long mask);
|
||||
typedef int op_fsync(void *ns, void *node);
|
||||
|
||||
typedef int op_select(void *ns, void *node, void *cookie, uint8 event,
|
||||
uint32 ref, selectsync *sync);
|
||||
typedef int op_deselect(void *ns, void *node, void *cookie, uint8 event,
|
||||
selectsync *sync);
|
||||
|
||||
typedef int op_initialize(const char *devname, void *parms, size_t len);
|
||||
typedef int op_mount(nspace_id nsid, const char *devname, ulong flags,
|
||||
void *parms, size_t len, void **data, vnode_id *vnid);
|
||||
typedef int op_unmount(void *ns);
|
||||
typedef int op_sync(void *ns);
|
||||
typedef int op_rfsstat(void *ns, struct fs_info *);
|
||||
typedef int op_wfsstat(void *ns, struct fs_info *, long mask);
|
||||
|
||||
|
||||
typedef int op_open_attrdir(void *ns, void *node, void **cookie);
|
||||
typedef int op_close_attrdir(void *ns, void *node, void *cookie);
|
||||
typedef int op_rewind_attrdir(void *ns, void *node, void *cookie);
|
||||
typedef int op_read_attrdir(void *ns, void *node, void *cookie, long *num,
|
||||
struct dirent *buf, size_t bufsize);
|
||||
typedef int op_remove_attr(void *ns, void *node, const char *name);
|
||||
typedef int op_rename_attr(void *ns, void *node, const char *oldname,
|
||||
const char *newname);
|
||||
typedef int op_stat_attr(void *ns, void *node, const char *name,
|
||||
struct attr_info *buf);
|
||||
|
||||
typedef int op_write_attr(void *ns, void *node, const char *name, int type,
|
||||
const void *buf, size_t *len, off_t pos);
|
||||
typedef int op_read_attr(void *ns, void *node, const char *name, int type,
|
||||
void *buf, size_t *len, off_t pos);
|
||||
|
||||
typedef int op_open_indexdir(void *ns, void **cookie);
|
||||
typedef int op_close_indexdir(void *ns, void *cookie);
|
||||
typedef int op_rewind_indexdir(void *ns, void *cookie);
|
||||
typedef int op_read_indexdir(void *ns, void *cookie, long *num,
|
||||
struct dirent *buf, size_t bufsize);
|
||||
typedef int op_create_index(void *ns, const char *name, int type, int flags);
|
||||
typedef int op_remove_index(void *ns, const char *name);
|
||||
typedef int op_rename_index(void *ns, const char *oldname,
|
||||
const char *newname);
|
||||
typedef int op_stat_index(void *ns, const char *name, struct index_info *buf);
|
||||
|
||||
typedef int op_open_query(void *ns, const char *query, ulong flags,
|
||||
port_id port, long token, void **cookie);
|
||||
typedef int op_close_query(void *ns, void *cookie);
|
||||
typedef int op_read_query(void *ns, void *cookie, long *num,
|
||||
struct dirent *buf, size_t bufsize);
|
||||
|
||||
typedef struct vnode_ops {
|
||||
op_read_vnode (*read_vnode);
|
||||
op_write_vnode (*write_vnode);
|
||||
op_remove_vnode (*remove_vnode);
|
||||
op_secure_vnode (*secure_vnode);
|
||||
op_walk (*walk);
|
||||
op_access (*access);
|
||||
op_create (*create);
|
||||
op_mkdir (*mkdir);
|
||||
op_symlink (*symlink);
|
||||
op_link (*link);
|
||||
op_rename (*rename);
|
||||
op_unlink (*unlink);
|
||||
op_rmdir (*rmdir);
|
||||
op_readlink (*readlink);
|
||||
op_opendir (*opendir);
|
||||
op_closedir (*closedir);
|
||||
op_free_cookie (*free_dircookie);
|
||||
op_rewinddir (*rewinddir);
|
||||
op_readdir (*readdir);
|
||||
op_open (*open);
|
||||
op_close (*close);
|
||||
op_free_cookie (*free_cookie);
|
||||
op_read (*read);
|
||||
op_write (*write);
|
||||
op_readv (*readv);
|
||||
op_writev (*writev);
|
||||
op_ioctl (*ioctl);
|
||||
op_setflags (*setflags);
|
||||
op_rstat (*rstat);
|
||||
op_wstat (*wstat);
|
||||
op_fsync (*fsync);
|
||||
op_initialize (*initialize);
|
||||
op_mount (*mount);
|
||||
op_unmount (*unmount);
|
||||
op_sync (*sync);
|
||||
op_rfsstat (*rfsstat);
|
||||
op_wfsstat (*wfsstat);
|
||||
op_select (*select);
|
||||
op_deselect (*deselect);
|
||||
op_open_indexdir (*open_indexdir);
|
||||
op_close_indexdir (*close_indexdir);
|
||||
op_free_cookie (*free_indexdircookie);
|
||||
op_rewind_indexdir (*rewind_indexdir);
|
||||
op_read_indexdir (*read_indexdir);
|
||||
op_create_index (*create_index);
|
||||
op_remove_index (*remove_index);
|
||||
op_rename_index (*rename_index);
|
||||
op_stat_index (*stat_index);
|
||||
op_open_attrdir (*open_attrdir);
|
||||
op_close_attrdir (*close_attrdir);
|
||||
op_free_cookie (*free_attrdircookie);
|
||||
op_rewind_attrdir (*rewind_attrdir);
|
||||
op_read_attrdir (*read_attrdir);
|
||||
op_write_attr (*write_attr);
|
||||
op_read_attr (*read_attr);
|
||||
op_remove_attr (*remove_attr);
|
||||
op_rename_attr (*rename_attr);
|
||||
op_stat_attr (*stat_attr);
|
||||
op_open_query (*open_query);
|
||||
op_close_query (*close_query);
|
||||
op_free_cookie (*free_querycookie);
|
||||
op_read_query (*read_query);
|
||||
} vnode_ops;
|
||||
|
||||
extern _IMPEXP_KERNEL int new_path(const char *path, char **copy);
|
||||
extern _IMPEXP_KERNEL void free_path(char *p);
|
||||
|
||||
extern _IMPEXP_KERNEL int notify_listener(int op, nspace_id nsid,
|
||||
vnode_id vnida, vnode_id vnidb,
|
||||
vnode_id vnidc, const char *name);
|
||||
extern _IMPEXP_KERNEL void notify_select_event(selectsync *sync, uint32 ref);
|
||||
extern _IMPEXP_KERNEL int send_notification(port_id port, long token,
|
||||
ulong what, long op, nspace_id nsida,
|
||||
nspace_id nsidb, vnode_id vnida,
|
||||
vnode_id vnidb, vnode_id vnidc,
|
||||
const char *name);
|
||||
extern _IMPEXP_KERNEL int get_vnode(nspace_id nsid, vnode_id vnid, void **data);
|
||||
extern _IMPEXP_KERNEL int put_vnode(nspace_id nsid, vnode_id vnid);
|
||||
extern _IMPEXP_KERNEL int new_vnode(nspace_id nsid, vnode_id vnid, void *data);
|
||||
extern _IMPEXP_KERNEL int remove_vnode(nspace_id nsid, vnode_id vnid);
|
||||
extern _IMPEXP_KERNEL int unremove_vnode(nspace_id nsid, vnode_id vnid);
|
||||
extern _IMPEXP_KERNEL int is_vnode_removed(nspace_id nsid, vnode_id vnid);
|
||||
|
||||
|
||||
extern _EXPORT vnode_ops fs_entry;
|
||||
extern _EXPORT int32 api_version;
|
||||
|
||||
#endif
|
140
src/add-ons/kernel/file_systems/googlefs/google-ext-search.html
Normal file
140
src/add-ons/kernel/file_systems/googlefs/google-ext-search.html
Normal file
@ -0,0 +1,140 @@
|
||||
<html><head><meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=ISO-8859-1"><title>Google Search: google api help "frequently asked" -plop </title><style><!--
|
||||
body,td,div,.p,a{font-family:arial,sans-serif }
|
||||
div,td{color:#000}
|
||||
.f,.fl:link{color:#6f6f6f}
|
||||
a:link,.w,a.w:link,.w a:link{color:#00c}
|
||||
a:visited,.fl:visited{color:#551a8b}
|
||||
a:active,.fl:active{color:#f00}
|
||||
.t a:link,.t a:active,.t a:visited,.t{color:#000}
|
||||
.t{background-color:#e5ecf9}
|
||||
.k{background-color:#36c}
|
||||
.j{width:34em}
|
||||
.h{color:#36c}
|
||||
.i,.i:link{color:#a90a08}
|
||||
.a,.a:link{color:#008000}
|
||||
.z{display:none}
|
||||
div.n {margin-top: 1ex}
|
||||
.n a{font-size:10pt; color:#000}
|
||||
.n .i{font-size:10pt; font-weight:bold}
|
||||
.q a:visited,.q a:link,.q a:active,.q {color: #00c; }
|
||||
.b{font-size: 12pt; color:#00c; font-weight:bold}
|
||||
.ch{cursor:pointer;cursor:hand}
|
||||
.e{margin-top: .75em; margin-bottom: .75em}
|
||||
.g{margin-top: 1em; margin-bottom: 1em}
|
||||
//-->
|
||||
</style>
|
||||
<script>
|
||||
<!--
|
||||
function ss(w){window.status=w;return true;}
|
||||
function cs(){window.status='';}
|
||||
function ga(o,e) {return true;}
|
||||
//-->
|
||||
</script>
|
||||
</head><body bgcolor=#ffffff topmargin=2 marginheight=2><table border=0 cellpadding=0 cellspacing=0><tr><td valign=top><a href="http://www.google.com/webhp?hl=en"><img src="/images/logo_sm.gif" width=150 height=55 alt="Go to Google Home" border=0 vspace=12></a></td><td> </td><td valign=top><table cellpadding=0 cellspacing=0 border=0><tr><td height=14 valign=bottom><table border=0 cellpadding=4 cellspacing=0><tr><td class=q><font size=-1><font color=#000000><b>Web</b></font> <a id=t1a class=q href="http://images.google.com/images?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=&ie=UTF-8&sa=N&as_qdr=m3&tab=wi">Images</a> <a id=t2a class=q href="http://groups-beta.google.com/groups?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=&ie=UTF-8&sa=N&as_qdr=m3&tab=wg">Groups</a><sup><a href="http://groups-beta.google.com/groups?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=&ie=UTF-8&sa=N&as_qdr=m3&tab=wg" style="text-decoration:none;"><font color=red>New!</font></a></sup> <a id=t4a class=q href="http://news.google.com/news?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=&ie=UTF-8&sa=N&as_qdr=m3&tab=wn">News</a> <a id=t5a class=q href="http://froogle.google.com/froogle?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=&ie=UTF-8&sa=N&as_qdr=m3&tab=wf">Froogle</a> </font><font size=-1><b><a href="/options/" class=q>more »</a></b></font></td></tr></table></td></tr><tr><td><table border=0 cellpadding=0 cellspacing=0><tr><td nowrap><form name=gs method=GET action=/search><input type=hidden name=num value=50><input type=hidden name=hl value="en"><input type=hidden name=lr value="lang_en"><input type=hidden name=ie value="ISO-8859-1"><input type=hidden name=as_qdr value="m3"><input type=text name=q size=41 maxlength=2048 value="google api help "frequently asked" -plop"><font size=-1> <select name=as_qdr><option value="all">anytime<option value="m3" selected>past <b>3</b> <b>months</b><option value="m6">past <b>6</b> <b>months</b><option value="y">past year</select> <input type=submit name="btnG" value="Search"><span id=hf></span></font></td><td nowrap><font size=-2> <a href=/advanced_search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3>Advanced Search</a><br> <a href=/preferences?q=google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3>Preferences</a> </font></td></tr></table></td></tr></table><table cellpadding=0 cellspacing=0 border=0><tr><td><font size=-1><input id=stw type=radio name=lr value="" ><label for=stw>Search the Web</label><input id=lrt type=radio name=lr value=lang_en checked><label for=lrt>Search English pages</label></font></td></tr><tr><td height=7><img width=1 height=1 alt=""></td></tr></table></td></tr></form></table>
|
||||
<style><!--
|
||||
.fl:link{color:#7777CC}
|
||||
-->
|
||||
</style>
|
||||
<table width=100% border=0 cellpadding=0 cellspacing=0><tr><td bgcolor=#3366cc><img width=1 height=1 alt=""></td></tr></table><table width=100% border=0 cellpadding=0 cellspacing=0 bgcolor=#e5ecf9><tr><td bgcolor=#e5ecf9 nowrap><font size=+1> <b>Web</b></font> </td><td bgcolor=#e5ecf9 align=right nowrap><font size=-1 color=>Results <b>1</b> - <b>50</b> of about <b>12,800</b> <b>English</b> pages over the <b>past <b>3</b> <b>months</b></b> for <b>google api help "frequently asked" -plop</b>. (<b>0.40</b> seconds) </font></td></tr></table><table cellspacing=0 cellpadding=0 width=25% align=right bgColor=#ffffff border=0><tr><td colspan=4><font size=-1> </font></td></tr><tr><td rowspan=5> </td><td width=1 bgcolor=#c9d7f1 rowspan=5><img width=1 height=1 alt=""></td><td rowspan=5> </td><td height=25 align=center><font color=#6f6f6f size=-1>Sponsored Links</font></td></tr><tr height=7><td><img width=1 height=1 alt=""></td></tr><tr><td nowrap><font size=-1><a id=aw1 href=/pagead/iclk?adurl=http://www.google-store.com/index.php%3FcPath%3D24&sa=l&ai=Bqi6_oW-1QZX2MpWyQZLA1cUBibTDB6XtoJYBt7-F5QHQhgMQARgBMAA4AEDKEUi_OaABj-_B_gPIAQE&num=1 onMouseOver="return ss('go to www.GoogleStore.com')" onMouseOut="cs()"><b>Google</b> <b>Help</b></a><br>Better Understand Your Results &<br>Learn Fun Facts Too. Get More Info!<br><font class=a>www.GoogleStore.com</font></font></td></tr><tr height=7><td><img width=1 height=1 alt=""></td></tr><tr><td height=25 align=center><font size=-1><a href="https://adwords.google.com/select/main?cmd=Login&sourceid=awo&subid=symhen1&hl=en" class=fl>See your message here...</a></font></td></tr></table><div><p class=g><a href=http://www.google.com/apis/api_faq.html><b>Google</b> Web APIs - FAQ</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> a custom Java client library, documentation on <b>how</b> <b>to</b> use the <b>...</b> You can find it at
|
||||
http://<b>api</b>.<b>google</b>.com/GoogleSearch.wsdl <b>...</b> need to get started is in <b>googleapi</b>.jar <b>...</b>
|
||||
<br><font color=#008000>www.<b>google</b>.com/<b>api</b>s/<b>api</b>_faq.html - 29k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:vR7BaPWutnkJ:www.google.com/apis/api_faq.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.google.com/apis/api_faq.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.seocount.com/faq.php>SEO Count - Keyword Ranking Tool - <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>Frequently</b> <b>Asked</b> Questions. <b>...</b> that <b>Google</b> only indexes the www version to <b>help</b> increase
|
||||
Page <b>...</b> Since the <b>Google</b> <b>API</b> provides results for UTF-8 Encoding we are able <b>...</b>
|
||||
<br><font color=#008000>www.seocount.com/faq.php - 16k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:JUp4DvQqYDsJ:www.seocount.com/faq.php+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.seocount.com/faq.php">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.ebayhacks.com/exec/show/book_faq>eBay Hacks - <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> If you need <b>help</b> getting started with eBay, you'd <b>...</b> is concerned with programming and
|
||||
the eBay <b>API</b>; that leaves <b>...</b> 5.36934319 × 10 41 Joules, as reported by <b>Google</b> <b>...</b>
|
||||
<br><font color=#008000>www.ebayhacks.com/exec/show/book_faq - 8k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:pM93M0j51uQJ:www.ebayhacks.com/exec/show/book_faq+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.ebayhacks.com/exec/show/book_faq">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.freeprogrammingresources.com/soap.html>Free SOAP Resources, freeprogrammingresources.com</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> The <b>Google</b> <b>API</b> is used as an example. <b>...</b> Tutorials, Links FAQs. <b>...</b> This page explains <b>how</b>
|
||||
<b>to</b> get started editing the home page of your Manila site using SOAP to make <b>...</b>
|
||||
<br><font color=#008000>www.freeprogrammingresources.com/soap.html - </font><nobr> <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.freeprogrammingresources.com/soap.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.top25web.com/faq.html>FAQ: SEO Search Engine Optimization <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> come from the Top25Web.com server, and it is using the <b>Google</b> <b>API</b> which was recently
|
||||
made available by <b>Google</b>. <b>...</b> Post a message in our forums for more <b>help</b>! <b>...</b>
|
||||
<br><font color=#008000>www.top25web.com/faq.html - 15k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:52lfVKHHvP0J:www.top25web.com/faq.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.top25web.com/faq.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://interalia.org/archives/2003/03/24/google-api-cocoa-framework>Among Other Things » <b>Google</b> <b>API</b> Cocoa framework</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> to be using the <b>Google</b> <b>API</b> for something <b>...</b> NetBSD/dreamcast NetBSD/dreamcast: <b>How</b> <b>to</b>
|
||||
use NetBSD/dreamcast NetBSD/dreamcast <b>Frequently</b> <b>Asked</b> Questions The <b>...</b>
|
||||
<br><font color=#008000>interalia.org/archives/2003/ 03/24/<b>google</b>-<b>api</b>-cocoa-framework - 48k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:c7cLz3BPqFcJ:interalia.org/archives/2003/03/24/google-api-cocoa-framework+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:interalia.org/archives/2003/03/24/google-api-cocoa-framework">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.googleguide.com/links.html><b>Google</b> Guide: Useful Links</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> www.googleguide.com/searchLeader.html; <b>Google's</b> Online <b>Help</b>: <b>Google</b> <b>Help</b> Central -
|
||||
www.<b>google</b>.com/<b>help</b>/; <b>...</b> <b>Google</b> Web <b>API</b> - www.<b>google</b>.com/apis/ <b>API</b> stands <b>...</b>
|
||||
<br><font color=#008000>www.<b>google</b>guide.com/links.html - 12k - 6 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:afR9S_mwClsJ:www.googleguide.com/links.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.googleguide.com/links.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.codecomments.com/Clipper/message320018.html>FAQ: Very <b>Frequently</b> <b>Asked</b> Questions (with answers) v1.29</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> some of the questions that are most <b>frequently</b> <b>asked</b> in comp <b>...</b> <b>Google</b> search:
|
||||
<URL:http://groups.<b>google</b>.com/groups <b>...</b> URLs contain information on <b>how</b> <b>to</b> reinstate <b>...</b>
|
||||
<br><font color=#008000>www.codecomments.com/Clipper/message320018.html - 23k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:SNHirYqDNpQJ:www.codecomments.com/Clipper/message320018.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.codecomments.com/Clipper/message320018.html">Similar pages</a></nobr></font></td></tr></table> <blockquote class=g><p class=g><a href=http://www.codecomments.com/Prolog/message321541.html>comp.lang.prolog <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> For details on <b>how</b> <b>to</b> join or send in contributions, check <b>...</b> readers who would be glad
|
||||
to <b>help</b> people making a <b>...</b> Yes, there are: <b>Google</b> Groups has archives of news <b>...</b>
|
||||
<br><font color=#008000>www.codecomments.com/Prolog/message321541.html - 42k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:uPuRm5kbI-kJ:www.codecomments.com/Prolog/message321541.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.codecomments.com/Prolog/message321541.html">Similar pages</a></nobr><br>[ <a class=fl href=/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=+site:www.codecomments.com+google+api++help+%22frequently+asked%22+-plop>More results from www.codecomments.com</a> ]</font></td></tr></table> </blockquote><p class=g><a href=http://open.echomine.org/cowiki/20.html><b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> <b>Frequently</b> <b>Asked</b> Questions. <b>...</b> Since the <b>API</b> is entirely modular, we are looking for
|
||||
people who can <b>help</b> fix bugs or add enhancements to the project. <b>...</b>
|
||||
<br><font color=#008000>open.echomine.org/cowiki/20.html - 36k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:vxoDXjAbG3IJ:open.echomine.org/cowiki/20.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:open.echomine.org/cowiki/20.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.chat11.com/SEM_-_Paid_Inclusion_Doesn't_Seem_To_Be_Helping>Chat11.com: SEM - Paid Inclusion Doesn't Seem To Be Helping</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> <b>Google</b>, <b>...</b> I Thought Paid Inclusion Would <b>Help</b>, So Why Are My Pages Not Ranked Better? <b>...</b>
|
||||
Our Tutorial About <b>How</b> <b>To</b> Increase Visitors To Your Website. <b>...</b>
|
||||
<br><font color=#008000>www.chat11.com/ SEM_-_Paid_Inclusion_Doesn't_Seem_To_Be_Helping - 17k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:QNbuFVRJUF4J:www.chat11.com/SEM_-_Paid_Inclusion_Doesn%27t_Seem_To_Be_Helping+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.chat11.com/SEM_-_Paid_Inclusion_Doesn%27t_Seem_To_Be_Helping">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.wwwcoder.com/main/parentid/191/site/3373/68/default.aspx>Data Transformation Services for SQL Server 2005: <b>Frequently</b> <b>Asked</b> <b>...</b></a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Tuesday, November 23, 2004. .: Home Articles/Tutorials SQL_Server : Data Transformation
|
||||
Services for SQL Server 2005: <b>Frequently</b> <b>Asked</b> Design Questions. <b>...</b>
|
||||
<br><font color=#008000>www.wwwcoder.com/main/parentid/ 191/site/3373/68/default.aspx - 47k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:F4Tru65giswJ:www.wwwcoder.com/main/parentid/191/site/3373/68/default.aspx+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.wwwcoder.com/main/parentid/191/site/3373/68/default.aspx">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://webservices.xml.com/programming/>Programming Articles on webservices.xml.com</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> month's XML Endpoints column, Rich Salz explains <b>how</b> <b>to</b> process SOAP <b>...</b> <b>Google's</b> Gaffe.
|
||||
By Paul Prescod Paul Prescod explains why moving its <b>API</b> to use <b>...</b>
|
||||
<br><font color=#008000>webservices.xml.com/programming/ - 38k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:6Fah1mD4lYoJ:webservices.xml.com/programming/+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:webservices.xml.com/programming/">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.helpware.net/FAR/far_faq.htm>HTML <b>Help</b> FAQs</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> This is a nice site found using <b>Google</b>: <b>...</b> Borland Delphi and HH. Free code examples
|
||||
show you <b>how</b> <b>to</b> program the HTML <b>Help</b> <b>API</b> via Borland Delphi. <b>...</b>
|
||||
<br><font color=#008000>www.<b>help</b>ware.net/FAR/far_faq.htm - 101k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:P4-m_2muxlIJ:www.helpware.net/FAR/far_faq.htm+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.helpware.net/FAR/far_faq.htm">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://ruminations.weblogger.com/>Ruminations</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> <b>Frequently</b> <b>Asked</b> Questions, Getting Started with Radio UserLand, Tips, and Tutorials. <b>...</b>
|
||||
Using the <b>Google</b> <b>API</b> with Radio and Frontier - <b>How</b> <b>to</b> make requests <b>...</b>
|
||||
<br><font color=#008000>ruminations.weblogger.com/ - 27k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:aX1tEUdxrlAJ:ruminations.weblogger.com/+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:ruminations.weblogger.com/">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://news-01.rankforsales.com/news-bf/889-seo-nov-22-04.html><b>Google</b> launches its Deskbar <b>API</b></a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> a big difference in your rankings and our most popular ** <b>How</b> <b>To</b> ** section The <b>...</b> Deskbar
|
||||
<b>API</b> can be found here: http://deskbar.<b>google</b>.com/<b>help</b>/<b>api</b>/index.html <b>...</b>
|
||||
<br><font color=#008000>news-01.rankforsales.com/news-bf/889-seo-nov-22-04.html - 18k - 6 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:HmjXK8WGhkgJ:news-01.rankforsales.com/news-bf/889-seo-nov-22-04.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:news-01.rankforsales.com/news-bf/889-seo-nov-22-04.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.physci.org/codes/javafaq.jsp>Java FAQ - <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Search <b>google</b>. <b>...</b> The JAI <b>API</b> is the subject of discussion in this Sun sponsored mailing <b>...</b>
|
||||
Java FAQ is written and maintained by Andrew Thompson, with <b>help</b> from the <b>...</b>
|
||||
<br><font color=#008000>www.physci.org/codes/javafaq.jsp - 53k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:1qVElLEay90J:www.physci.org/codes/javafaq.jsp+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.physci.org/codes/javafaq.jsp">Similar pages</a></nobr></font></td></tr></table> <blockquote class=g><p class=g><a href=http://www.physci.org/guifaq.jsp><b>Frequently</b> <b>Asked</b> Questions - comp.lang.java.gui</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> first document has requested a notice that he is not a <b>help</b> desk for <b>...</b> 7.10 Java 3D
|
||||
<b>API</b>. <b>...</b> see news:comp.lang.java.3d http://groups.<b>google</b>.com/groups?group=comp.lang <b>...</b>
|
||||
<br><font color=#008000>www.physci.org/guifaq.jsp - 44k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:k5eyUK79yzcJ:www.physci.org/guifaq.jsp+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.physci.org/guifaq.jsp">Similar pages</a></nobr></font></td></tr></table> </blockquote><p class=g><a href=http://www.googleduel.com/about.php>GoogleDuel - About</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> <b>Asked</b> Questions (FAQ) An old <b>Frequently</b> <b>Asked</b> Questions list <b>...</b> sample source code which
|
||||
illustrates <b>how</b> <b>to</b> use the <b>...</b> SOAP library to call the <b>Google</b> <b>API</b> from PHP. <b>...</b>
|
||||
<br><font color=#008000>www.<b>google</b>duel.com/about.php - 12k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:avCr33BPa00J:www.googleduel.com/about.php+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.googleduel.com/about.php">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.bearcanyonseo.com/tips_links.html>Search engine articles, tools, links and resources</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Search Engine <b>Help</b> by Highrankings Search Engine Features Chart <b>...</b> top Guide to frames
|
||||
usage <b>How</b> <b>to</b> Optimize a <b>...</b> Enumeration <b>Google</b> Count - uses <b>Google</b> <b>API</b> Go Rank <b>...</b>
|
||||
<br><font color=#008000>www.bearcanyonseo.com/tips_links.html - 29k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:1F1_yTbuk0wJ:www.bearcanyonseo.com/tips_links.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.bearcanyonseo.com/tips_links.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.openoffice.org/faq.html>OpenOffice.org FAQ</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Most <b>Frequently</b> <b>Asked</b> Questions On using OpenOffice.org software in <b>...</b> printing with
|
||||
the binaries, the <b>help</b> system, licensing <b>...</b> <b>API</b> FAQ Questions and answers on the <b>...</b>
|
||||
<br><font color=#008000>www.openoffice.org/faq.html - 10k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:UrwdZzIyFLEJ:www.openoffice.org/faq.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.openoffice.org/faq.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.webmasterworld.com/forum80/457-9-10.htm>hey <b>Google</b> - don't auto-update my toolbar!</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>Google</b> Toolbar, Desktop Search, and <b>API</b> Topics. <b>...</b> <b>Google</b>, there is absolutely no need
|
||||
for this. <b>...</b> <b>Asked</b> Questions section of the toolbar <b>help</b>: http://toolbar.<b>google</b> <b>...</b>
|
||||
<br><font color=#008000>www.webmasterworld.com/forum80/457-9-10.htm - </font><nobr> <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.webmasterworld.com/forum80/457-9-10.htm">Similar pages</a></nobr></font></td></tr></table> <blockquote class=g><p class=g><a href=http://www.webmasterworld.com/forum80/457-10-10.htm>hey <b>Google</b> - don't auto-update my toolbar!</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>Google</b> Toolbar, Desktop Search, and <b>API</b> Topics. <b>...</b> then the very first link is to the
|
||||
toolbar <b>help</b> page. <b>...</b> If <b>Google</b> is willing to support use of the toolbar without <b>...</b>
|
||||
<br><font color=#008000>www.webmasterworld.com/forum80/457-10-10.htm - </font><nobr> <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.webmasterworld.com/forum80/457-10-10.htm">Similar pages</a></nobr><br>[ <a class=fl href=/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=+site:www.webmasterworld.com+google+api++help+%22frequently+asked%22+-plop>More results from www.webmasterworld.com</a> ]</font></td></tr></table> </blockquote><p class=g><a href=http://www.kcl.ac.uk/kis/support/cc/fortran/engfaq.html>Michel Olagnon's Fortran 90 List</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> programs and Microsoft Windows Open Database Connectivity (ODBC) <b>API</b>. <b>...</b> 3.7 - Other
|
||||
places for <b>Help</b> on Fortran 90. <b>...</b> ftp.cs.unm.edu; Free Software; <b>How</b> <b>to</b> get Fortran <b>...</b>
|
||||
<br><font color=#008000>www.kcl.ac.uk/kis/support/cc/fortran/engfaq.html - 56k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:_N13Y1xZug0J:www.kcl.ac.uk/kis/support/cc/fortran/engfaq.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.kcl.ac.uk/kis/support/cc/fortran/engfaq.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://confluence.atlassian.com/display/DOC/Frequently+Asked+Questions><b>Frequently</b> <b>Asked</b> Questions - Confluence</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> exporting, searchable attachments, a comprehensive remote <b>API</b>, easy installation <b>...</b>
|
||||
starting up to tell it <b>how</b> <b>to</b> use its <b>...</b> If you need <b>help</b> with a particular server <b>...</b>
|
||||
<br><font color=#008000>confluence.atlassian.com/ display/DOC/Frequently+Asked+Questions - 35k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:vcUvJpLMecwJ:confluence.atlassian.com/display/DOC/Frequently%2BAsked%2BQuestions+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:confluence.atlassian.com/display/DOC/Frequently%2BAsked%2BQuestions">Similar pages</a></nobr></font></td></tr></table> <blockquote class=g><p class=g><a href=http://confluence.atlassian.com/display/DOC/Frequently+Asked+Questions?focusedCommentId=11067><b>Frequently</b> <b>Asked</b> Questions - Confluence</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> I figured-out <b>how</b> <b>to</b> add an inline image. <b>...</b> page hierachies, page subscription, online
|
||||
<b>help</b>, WebDAV file storage, a more comprehensive remote <b>API</b>... <b>...</b>
|
||||
<br><font color=#008000>confluence.atlassian.com/display/DOC/ Frequently+Asked+Questions?focusedCommentId=11067 - 72k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:QjC6lo0skiIJ:confluence.atlassian.com/display/DOC/Frequently%2BAsked%2BQuestions%3FfocusedCommentId%3D11067+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:confluence.atlassian.com/display/DOC/Frequently%2BAsked%2BQuestions%3FfocusedCommentId%3D11067">Similar pages</a></nobr><br>[ <a class=fl href=/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=+site:confluence.atlassian.com+google+api++help+%22frequently+asked%22+-plop>More results from confluence.atlassian.com</a> ]</font></td></tr></table> </blockquote><p class=g><a href=http://pages.videotron.com/gbradet/home_bm.htm>Bookmarks for bradg@videotron.ca</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> The Mother of All Search Engines <b>Google</b> SEARCH.COM <b>...</b> J2EE <b>API</b> Java(TM) SE Platform
|
||||
Documentation Servlets <b>...</b> Franck Allimant - Accueil (Win JDK <b>Help</b> Files) Getting <b>...</b>
|
||||
<br><font color=#008000>pages.videotron.com/gbradet/home_bm.htm - 30k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:lZSFxlleiEoJ:pages.videotron.com/gbradet/home_bm.htm+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:pages.videotron.com/gbradet/home_bm.htm">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.java201.com/resources/browse/126-all.html>Resources for Java server-side developers: CLDC - Bluetooth <b>API</b> <b>...</b></a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Applications by Qusay H. Mahmoud This two-part series of articles will show you
|
||||
<b>how</b> <b>to</b> use J2ME <b>...</b> Home > J2ME Technologies > CLDC - Bluetooth <b>API</b> (JSR-82). <b>Google</b>, <b>...</b>
|
||||
<br><font color=#008000>www.java201.com/resources/browse/126-all.html - 13k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:4nsKRSM4O7sJ:www.java201.com/resources/browse/126-all.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.java201.com/resources/browse/126-all.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://vivisimo.com/html/faq>Vivísimo // <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> just a small sampling of who we can <b>help</b>: Researchers; Support <b>...</b> well we work on top
|
||||
of the <b>Google</b> Appliance <b>...</b> delivered as aC software library with an <b>API</b>; they run <b>...</b>
|
||||
<br><font color=#008000>vivisimo.com/html/faq - 31k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:qfDGPzGoMRsJ:vivisimo.com/html/faq+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:vivisimo.com/html/faq">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.datapower.com/xmldev/tech_resources.html>DataPower: Technical Resources</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Headers DataPower chief security architect Rich Salz explains <b>how</b> <b>to</b> process SOAP <b>...</b>
|
||||
of WSDL, with particular reference to the new <b>Google</b> web services <b>API</b>. <b>...</b>
|
||||
<br><font color=#008000>www.datapower.com/xmldev/tech_resources.html - 19k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:hPj-fnnugHcJ:www.datapower.com/xmldev/tech_resources.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.datapower.com/xmldev/tech_resources.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://myst-technology.com/mysmartchannels/public/search?q=mysmartchannels&scheme=standalone>Search Results | MySmartChannels</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Search <b>Google</b>, <b>...</b> MySmartChannels I agree that actually trying out the different SQL
|
||||
functions on a computer will <b>help</b> with the <b>...</b> Is there an <b>API</b> to MySmartChannels? <b>...</b>
|
||||
<br><font color=#008000>myst-technology.com/mysmartchannels/ public/search?q=mysmartchannels&scheme=standalone - 101k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:yJQnPyVodzMJ:myst-technology.com/mysmartchannels/public/search%3Fq%3Dmysmartchannels%26scheme%3Dstandalone+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:myst-technology.com/mysmartchannels/public/search%3Fq%3Dmysmartchannels%26scheme%3Dstandalone">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.macromedia.com/support/ultradev/ts/documents/ultradev_faq.htm>Macromedia -UltraDevTechNotes:UltraDev Technical FAQ (<b>Frequently</b> <b>...</b></a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Printable instructions on <b>how</b> <b>to</b> create objects and server behaviors using UltraDev's
|
||||
JavaScript <b>API</b> are available <b>...</b> Search powered by Powered by <b>Google</b>.
|
||||
<br><font color=#008000>www.macromedia.com/support/ ultradev/ts/documents/ultradev_faq.htm - 28k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:FTjaxwaZiDcJ:www.macromedia.com/support/ultradev/ts/documents/ultradev_faq.htm+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.macromedia.com/support/ultradev/ts/documents/ultradev_faq.htm">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://mensniche.com/forum/archive/index.php/f-2.html>Mensniche.com Forum - Main Forum</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> SG Forum - Great Resource; need <b>help</b>; PPC Results; 404 Traffic; www.volume <b>...</b> Meta Tags
|
||||
Optimization; Pre-Sell; <b>Google</b> PageRank, & <b>How</b> <b>to</b> Get It; Nice <b>Google</b> <b>API</b> tool <b>...</b>
|
||||
<br><font color=#008000>mensniche.com/forum/archive/index.php/f-2.html - 15k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:LkQMpFdTDxUJ:mensniche.com/forum/archive/index.php/f-2.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:mensniche.com/forum/archive/index.php/f-2.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.bookshare.org/web/SingleTitle.html?submittitleid=19778>Bookshare.org - Book Information</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> new <b>Google</b> <b>API</b>, including <b>how</b> <b>to</b> build and modify scripts that can become custom
|
||||
business applications based on <b>Google</b>. <b>Google</b> Hacks contains 100 tips, tricks <b>...</b>
|
||||
<br><font color=#008000>www.bookshare.org/web/SingleTitle. html?submittitleid=19778 - 18k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:4HvQgJGUodoJ:www.bookshare.org/web/SingleTitle.html%3Fsubmittitleid%3D19778+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.bookshare.org/web/SingleTitle.html%3Fsubmittitleid%3D19778">Similar pages</a></nobr></font></td></tr></table> <blockquote class=g><p class=g><a href=http://www.bookshare.org/web/BooksByAuthor.html?author_id=10726>Bookshare.org - Books by Author</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> advanced search interface and the new <b>Google</b> <b>API</b>, including <b>how</b> <b>...</b> <b>Google</b> Hacks contains
|
||||
100 tips, tricks and scripts <b>...</b> tips, tricks, and tools to <b>help</b> serious Mac <b>...</b>
|
||||
<br><font color=#008000>www.bookshare.org/web/ BooksByAuthor.html?author_id=10726 - 29k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:TvaTFQWAcrwJ:www.bookshare.org/web/BooksByAuthor.html%3Fauthor_id%3D10726+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.bookshare.org/web/BooksByAuthor.html%3Fauthor_id%3D10726">Similar pages</a></nobr></font></td></tr></table> </blockquote><p class=g><a href=http://www.page87.net/links/>page87 - links</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> PHP Implementation of the <b>Google</b> Web <b>API</b> System 26 <b>...</b> Promotion <b>Google</b> ranking tips
|
||||
<b>Google's</b> AdWords Advertising Program <b>How</b> <b>to</b> Advertise Responsibly <b>...</b>
|
||||
<br><font color=#008000>www.page87.net/links/ - 70k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:jBj9jqz-IcEJ:www.page87.net/links/+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.page87.net/links/">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.iwalt.com/weblog/2002/04/>April 2002 | iWalt.com</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> It’s an AppleScript which calls the <b>Google</b> <b>API</b> and gets the top result for your
|
||||
query. <b>...</b> <b>Frequently</b> <b>Asked</b> Questions. <b>...</b> <b>Help</b> define the site. =-). <b>...</b>
|
||||
<br><font color=#008000>www.iwalt.com/weblog/2002/04/ - 39k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:UwgNxjrX5pgJ:www.iwalt.com/weblog/2002/04/+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.iwalt.com/weblog/2002/04/">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.apl.jhu.edu/~hall/java/FAQs-and-Tutorials.html>Java Programming FAQs and Tutorials: Learning Java</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Search the Web: <b>Google</b>. <b>...</b> Tutorials, online courses and more, to <b>help</b> you pass your
|
||||
Java certification <b>...</b> Learning <b>how</b> <b>to</b> generate high-quality printouts of components <b>...</b>
|
||||
<br><font color=#008000>www.apl.jhu.edu/~hall/java/FAQs-and-Tutorials.html - 21k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:6rqbxjg93QoJ:www.apl.jhu.edu/~hall/java/FAQs-and-Tutorials.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.apl.jhu.edu/~hall/java/FAQs-and-Tutorials.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.ihelpyouservices.com/forums/showthread.php?s=&threadid=13023>Keyword density research report - Best Practices Search Engine <b>...</b></a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> everything come from the <b>Google</b> <b>API</b>? Did <b>Google</b> have to approve this? If so,
|
||||
do you have any tips on getting <b>API</b> applications approved? <b>...</b>
|
||||
<br><font color=#008000>www.i<b>help</b>youservices.com/forums/ showthread.php?s=&threadid=13023 - 63k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:fHRmB5iB2W4J:www.ihelpyouservices.com/forums/showthread.php%3Fs%3D%26threadid%3D13023+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.ihelpyouservices.com/forums/showthread.php%3Fs%3D%26threadid%3D13023">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.clarkconnect.org/forums/showflat.php?Cat=&Board=howtos&Number=40192>Recommended Reading List / Answers to <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Guide Clark Connect <b>Help</b> Downloadable User Guides Webconfig <b>API</b> (For those <b>...</b> relay
|
||||
host(I can't send email) <b>Help</b>, I can <b>...</b> Also, don't forget to <b>google</b> Note: All the <b>...</b>
|
||||
<br><font color=#008000>www.clarkconnect.org/forums/showflat. php?Cat=&Board=howtos&Number=40192 - 31k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:loNtIpVl0qYJ:www.clarkconnect.org/forums/showflat.php%3FCat%3D%26Board%3Dhowtos%26Number%3D40192+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.clarkconnect.org/forums/showflat.php%3FCat%3D%26Board%3Dhowtos%26Number%3D40192">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.xmlhub.com/dir/index/Computers/Programming/Languages/Visual_FoxPro/>XMLhub.com Web Directory: Computers: Programming: Languages <b>...</b></a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Microsoft: Visual FoxPro v3.0+ - Technical support forums and mutual <b>help</b> system
|
||||
for <b>...</b> Usenet microsoft.public.fox.vfp.lck-<b>api</b> - news: - <b>Google</b> Groups; Usenet <b>...</b>
|
||||
<br><font color=#008000>www.xmlhub.com/dir/index/Computers/ Programming/Languages/Visual_FoxPro/ - 18k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:qRSpMPab8EkJ:www.xmlhub.com/dir/index/Computers/Programming/Languages/Visual_FoxPro/+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.xmlhub.com/dir/index/Computers/Programming/Languages/Visual_FoxPro/">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.gamedev.net/community/forums/showfaq.asp?forum_id=31>Forum FAQ - GameDev.Net Discussion Forums</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> If you're looking for <b>API</b> specific tutorials, here are some of the most common to
|
||||
<b>help</b> get you <b>...</b> could easily answer yourself with a quick <b>Google</b> search or a <b>...</b>
|
||||
<br><font color=#008000>www.gamedev.net/community/ forums/showfaq.asp?forum_id=31 - 32k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:LWwtVOLqs_wJ:www.gamedev.net/community/forums/showfaq.asp%3Fforum_id%3D31+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.gamedev.net/community/forums/showfaq.asp%3Fforum_id%3D31">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.ndis.com/faq/QA10290101.htm>NDIS <b>Frequently</b> <b>Asked</b> Questions</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> The Microsoft DDK <b>help</b> file and DDK samples, as well as <b>...</b> On the other hand, the
|
||||
user-mode WMI <b>API</b> is fairly <b>...</b> useful information is to perform a <b>Google</b> Search on <b>...</b>
|
||||
<br><font color=#008000>www.ndis.com/faq/QA10290101.htm - 35k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:oGxlF6CRgvQJ:www.ndis.com/faq/QA10290101.htm+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.ndis.com/faq/QA10290101.htm">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://confluence.public.thoughtworks.org/display/CC/Managing+CruiseControl+With+JMX>Managing CruiseControl With JMX - Confluence</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> It is ridiculously easy to enable controling CC using the JMX (Java Mananagement
|
||||
eXtensions) <b>api</b>. Here's what you get : <b>...</b> <b>How</b> <b>to</b> enable the JMX server. <b>...</b>
|
||||
<br><font color=#008000>confluence.public.thoughtworks.org/ display/CC/Managing+CruiseControl+With+JMX - 26k - 6 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:XFv2_d2WTGYJ:confluence.public.thoughtworks.org/display/CC/Managing%2BCruiseControl%2BWith%2BJMX+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:confluence.public.thoughtworks.org/display/CC/Managing%2BCruiseControl%2BWith%2BJMX">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://chris.pirillo.com/blog/cmd=post_comment/article_id=119543/parent_id=165843>Post Comment</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Gone Wild General RSS Stuff Hardware <b>Help</b> HijackThis Logs <b>...</b> And why has the <b>Google</b>
|
||||
<b>API</b> stagnated for 2.5 years <b>...</b> So what should <b>Google</b>, MSNbot and Yahoo search (to <b>...</b>
|
||||
<br><font color=#008000>chris.pirillo.com/blog/cmd=post_comment/ article_id=119543/parent_id=165843 - 57k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:cXqz06lseBMJ:chris.pirillo.com/blog/cmd%3Dpost_comment/article_id%3D119543/parent_id%3D165843+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:chris.pirillo.com/blog/cmd%3Dpost_comment/article_id%3D119543/parent_id%3D165843">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.fwe.org/p/p.asp?mlid=354&jid=1018>FWE - National Headquarters - Job Search - View Job</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Northwest-Software Engineering <b>GOOGLE</b> - C++, Win32 <b>API</b>, and Linux Kernel Engineering
|
||||
Opportunities POSTED: 9/30/2004 JOB TITLE: Software Engineer <b>Google</b> is <b>...</b>
|
||||
<br><font color=#008000>www.fwe.org/p/p.asp?mlid=354&jid=1018 - 43k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:K1muKibnvKMJ:www.fwe.org/p/p.asp%3Fmlid%3D354%26jid%3D1018+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.fwe.org/p/p.asp%3Fmlid%3D354%26jid%3D1018">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.mozilla.org/support/firefox/faq>Firefox <b>Help</b>: Firefox FAQ</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> be able to find packages using <b>Google</b>. <b>...</b> EWH32.<b>api</b> , printme.<b>api</b> and search.<b>api</b> from
|
||||
plug_ins_disabled <b>...</b> can convert the bookmarks with the <b>help</b> from BookmarkPriest <b>...</b>
|
||||
<br><font color=#008000>www.mozilla.org/support/firefox/faq - 35k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:8x4HfNYboxgJ:www.mozilla.org/support/firefox/faq+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.mozilla.org/support/firefox/faq">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://directory.thestar.com.my/cat.asp?/Computers/Programming/Internet/ASP/FAQs,_Help,_and_Tutorials/>The Star Online Directory - FAQs, <b>Help</b>, and Tutorials</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Active Server Pages, and the Internet Server <b>API</b>. <b>...</b> public.inetserver.iis.activeserverpages
|
||||
- news: - <b>Google</b> Groups. <b>Help</b> build the largest human-edited directory <b>...</b>
|
||||
<br><font color=#008000>directory.thestar.com.my/cat.asp?/Computers/ Programming/Internet/ASP/FAQs,_Help,_and_Tutorials/ - 15k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:bVTPAXck5cYJ:directory.thestar.com.my/cat.asp%3F/Computers/Programming/Internet/ASP/FAQs,_Help,_and_Tutorials/+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:directory.thestar.com.my/cat.asp%3F/Computers/Programming/Internet/ASP/FAQs,_Help,_and_Tutorials/">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.spheri.ca/resources.html>eMarketing Resources @ Spherica</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Rank Checker SEO Count Advanced <b>API</b> Rank Checker <b>...</b> <b>Google</b> AdWords Keyword Suggestion
|
||||
Tool Additional eTools Spider <b>...</b> Index: Simple formula to <b>help</b> determine the <b>...</b>
|
||||
<br><font color=#008000>www.spheri.ca/resources.html - 18k - 5 Dec 2004 - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:Xm9eqoc7__0J:www.spheri.ca/resources.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.spheri.ca/resources.html">Similar pages</a></nobr></font></td></tr></table> <p class=g><a href=http://www.learningtree.com/courses/508qa.htm>Building XML Web Services with .NET: Hands-On - Course FAQ</a><table cellpadding=0 cellspacing=0 border=0><tr><td class=j><font size=-1><b>...</b> Web services currently available include the <b>Google</b> <b>API</b>, Microsoft’s <b>...</b> You learn <b>how</b>
|
||||
<b>to</b> use the .NET System.Xml class <b>...</b> Does this course <b>help</b> me prepare for the <b>...</b>
|
||||
<br><font color=#008000>www.learningtree.com/courses/508qa.htm - 29k - </font><nobr> <a class=fl href="http://216.239.59.104/search?q=cache:YgHddX6KqgoJ:www.learningtree.com/courses/508qa.htm+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a> - <a class=fl href="/search?hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&q=related:www.learningtree.com/courses/508qa.htm">Similar pages</a></nobr></font></td></tr></table> </div><br clear=all><div class=n><table border=0 cellpadding=0 width=1% cellspacing=0 align=center><tr align=center valign=top><td valign=bottom nowrap><font size=-1>Result Page: </font><td><img src=/nav_first.gif width=18 height=26 alt=""><br><td><img src=/nav_current.gif width=16 height=26 alt=""><br><span class=i>1</span><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=50&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>2</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=100&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>3</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=150&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>4</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=200&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>5</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=250&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>6</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=300&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>7</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=350&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>8</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=400&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>9</a><td><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=450&sa=N><img src=/nav_page.gif width=16 height=26 alt="" border=0><br>10</a><td nowrap><a href=/search?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&start=50&sa=N><img src=/nav_next.gif width=100 height=26 alt="" border=0><br><span class=b>Next</span></a></table></div><center>
|
||||
<br clear=all><br><table cellspacing=0 cellpadding=0 border=0 width="100%"><tr><td class=k><img height=1 alt="" width=1></td></tr><tr><td align=center bgcolor=#e5ecf9> <br><table border=0 cellpadding=0 cellspacing=0 align=center><form method=GET action=/search><tr><td nowrap>
|
||||
<font size=-1><input type=text name=q size=31 maxlength=2048 value="google api help "frequently asked" -plop"> <input type=submit name=btnG VALUE="Search"><input type=hidden name=num value=50><input type=hidden name=hl value="en"><input type=hidden name=lr value="lang_en"><input type=hidden name=ie value="ISO-8859-1"><input type=hidden name=as_qdr value="m3"><input type=hidden name=as_qdr value=m3></font></td></tr></form></table><br><font size=-1><a href=/swr?q=google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3&swrnum=12800>Search within results</a> | <a href=/language_tools?q=google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3>Language Tools</a> | <a href=/help/>Search Tips</a> | <a href=/quality_form?q=google+api++help+%22frequently+asked%22+-plop&num=50&hl=en&lr=lang_en&ie=UTF-8&as_qdr=m3 target=_blank>Dissatisfied? Help us improve</a></font><br><br></td></tr><tr><td class=k><img height=1 alt="" width=1></td></tr></table></center><center><p><hr class=z><table width=100% cellpadding=2 cellspacing=0 border=0><tr><td align=center><font size=-1><a href="http://www.google.com/">Google Home</a> - <a href="/ads/">Advertising Programs</a> - <a href="/services/">Business Solutions</a> - <a href=/about.html>About Google</a></font></table><br><font size=-1 class=p>©2004 Google</font></center></body></html>
|
29
src/add-ons/kernel/file_systems/googlefs/google.src
Normal file
29
src/add-ons/kernel/file_systems/googlefs/google.src
Normal file
@ -0,0 +1,29 @@
|
||||
# Mozilla/Google plug-in by amitp+mozilla@google.com
|
||||
|
||||
<search
|
||||
name="Google"
|
||||
description="Google Search"
|
||||
method="GET"
|
||||
action="http://www.google.com/search"
|
||||
update="http://www.google.com/mozilla/google.src"
|
||||
updateCheckDays=1
|
||||
queryEncoding="utf-8"
|
||||
queryCharset="utf-8"
|
||||
>
|
||||
|
||||
<input name="q" user>
|
||||
<input name="sourceid" value="mozilla-search">
|
||||
<inputnext name="start" factor="10">
|
||||
<inputprev name="start" factor="10">
|
||||
<input name="ie" value="utf-8">
|
||||
<input name="oe" value="utf-8">
|
||||
|
||||
<interpret
|
||||
browserResultType="result"
|
||||
charset = "UTF-8"
|
||||
resultListStart="<!--a-->"
|
||||
resultListEnd="<!--z-->"
|
||||
resultItemStart="<!--m-->"
|
||||
resultItemEnd="<!--n-->"
|
||||
>
|
||||
</search>
|
175
src/add-ons/kernel/file_systems/googlefs/google_icon.c
Normal file
175
src/add-ons/kernel/file_systems/googlefs/google_icon.c
Normal file
@ -0,0 +1,175 @@
|
||||
#if 0
|
||||
/* old one */
|
||||
const char google_icon_M[] = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x1b, 0xd9, 0xd9, 0x1d, 0xff, 0xff,
|
||||
0xff, 0xff, 0x1d, 0x82, 0x82, 0x19, 0xff, 0xff, 0x1e, 0xd8, 0x64, 0x63, 0x63, 0xd8, 0x1b, 0xff,
|
||||
0xff, 0x1a, 0x2c, 0x2d, 0x2d, 0x2c, 0xc4, 0x1d, 0x62, 0x63, 0x1c, 0x3f, 0x1e, 0x63, 0xd8, 0x1d,
|
||||
0x1a, 0x2c, 0xca, 0x1a, 0x1d, 0x82, 0x2d, 0xa3, 0xd8, 0x62, 0x3f, 0x3f, 0x3f, 0x1e, 0xd8, 0x1a,
|
||||
0x82, 0x2d, 0x1a, 0x3f, 0x3f, 0x3f, 0xa3, 0x2d, 0xd8, 0x62, 0x0e, 0x1e, 0x3f, 0x1f, 0xd8, 0x62,
|
||||
0x82, 0x2d, 0x1d, 0x3f, 0x3f, 0x0f, 0x82, 0x2e, 0x63, 0x83, 0x0a, 0x1e, 0x3f, 0xfd, 0x64, 0x1b,
|
||||
0x19, 0x2c, 0x5a, 0x3f, 0x1e, 0x0b, 0xc4, 0xeb, 0x1a, 0x64, 0xd8, 0xd9, 0xd9, 0x64, 0x83, 0xff,
|
||||
0xff, 0xca, 0x2c, 0xa3, 0x5a, 0xc4, 0x2e, 0x82, 0xff, 0x1b, 0x83, 0x8a, 0x89, 0x17, 0x17, 0xff,
|
||||
0xff, 0x1a, 0xa9, 0x2e, 0x2e, 0xca, 0x82, 0x17, 0xff, 0xff, 0xff, 0x17, 0x17, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1a, 0x1a, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
const char google_icon_L[] = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x1b, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1c, 0x62, 0x63, 0xd8, 0xd8, 0xd8, 0x63, 0x62, 0x1d, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x1e, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x1a, 0xd8, 0xd8, 0xd8, 0xf8, 0xd8, 0xf8, 0xd8, 0xd8, 0x63, 0x1b, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x1a, 0x18, 0xa3, 0xc4, 0xc4, 0xc4, 0xa9, 0x82, 0x1a, 0xff, 0xff, 0xff,
|
||||
0xff, 0x1a, 0xd8, 0xd8, 0x64, 0x84, 0x83, 0x63, 0x63, 0x84, 0xf8, 0xd8, 0x63, 0x1b, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1c, 0xa3, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0xc4, 0x1a, 0xff, 0xff,
|
||||
0x1c, 0x63, 0xf8, 0x84, 0x83, 0x1d, 0x1f, 0x3f, 0x1f, 0x1c, 0x63, 0x64, 0xd8, 0x63, 0x1d, 0xff,
|
||||
0xff, 0xff, 0x1c, 0xc4, 0x2c, 0x2c, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2c, 0x2c, 0x2c, 0x19, 0xff,
|
||||
0x62, 0xd8, 0x84, 0x63, 0x1f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0x63, 0xf8, 0xd8, 0x62, 0xff,
|
||||
0xff, 0x1a, 0xa3, 0x2c, 0x2d, 0x2e, 0xa3, 0x1a, 0x1c, 0x1a, 0x82, 0x2e, 0x2d, 0x2c, 0xc4, 0x1b,
|
||||
0x63, 0xf8, 0x84, 0x1d, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1b, 0xf8, 0xd8, 0x63, 0x1a,
|
||||
0xff, 0x18, 0x2c, 0x2d, 0x2f, 0x82, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1a, 0x2d, 0x2c, 0x2c, 0xa9,
|
||||
0xd8, 0x64, 0x83, 0x1f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0xd8, 0xd8, 0x83, 0x1a,
|
||||
0x1a, 0xa3, 0x2c, 0xeb, 0xa9, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x82, 0x2d, 0x2c, 0xca,
|
||||
0xd8, 0x64, 0x83, 0x1f, 0x19, 0x1b, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1f, 0xd8, 0xd8, 0x83, 0x1a,
|
||||
0x1a, 0xc4, 0x2c, 0x2f, 0x61, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1d, 0xc4, 0x2c, 0xeb,
|
||||
0xd8, 0xf8, 0x83, 0x15, 0x01, 0x03, 0x1b, 0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0xd8, 0xf8, 0x83, 0x1a,
|
||||
0x1a, 0xc4, 0x2c, 0x2f, 0x1c, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1c, 0x1b, 0x1e, 0xc4, 0x2d, 0x2f,
|
||||
0x83, 0xd8, 0x64, 0x0f, 0x00, 0x01, 0x19, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xd8, 0x64, 0x14, 0x1a,
|
||||
0x1a, 0xc4, 0x2c, 0x2d, 0xda, 0x3f, 0x3f, 0x3f, 0x3f, 0x1c, 0x04, 0x02, 0x16, 0xc4, 0x2d, 0x2f,
|
||||
0x89, 0xf8, 0xd8, 0x63, 0x12, 0x15, 0x1f, 0x3f, 0x3f, 0x3f, 0xfe, 0xd8, 0xf8, 0x84, 0x18, 0xff,
|
||||
0x1a, 0xa9, 0x2c, 0x2c, 0x82, 0x3f, 0x3f, 0x3f, 0x3f, 0x1b, 0x02, 0x00, 0xa9, 0x2c, 0x2e, 0x2f,
|
||||
0x1a, 0x83, 0xf8, 0xf8, 0xd8, 0xfd, 0x1f, 0x1f, 0x1e, 0xfd, 0xd8, 0xf8, 0x84, 0x89, 0x1a, 0xff,
|
||||
0xff, 0x82, 0x2d, 0x2c, 0x2c, 0xda, 0x3f, 0x3f, 0x3f, 0x3f, 0x17, 0x13, 0xc4, 0x2d, 0xeb, 0xa9,
|
||||
0x1a, 0x1a, 0x83, 0x84, 0x64, 0xf8, 0xd8, 0xd8, 0xd8, 0xf8, 0xf8, 0x84, 0x89, 0x1b, 0xff, 0xff,
|
||||
0xff, 0x1a, 0xca, 0x2d, 0x2c, 0x2c, 0x5a, 0x1e, 0x3f, 0x1f, 0xda, 0xc4, 0x2c, 0xeb, 0x2f, 0x18,
|
||||
0xff, 0xff, 0x1a, 0x89, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x8a, 0x89, 0x1b, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0x19, 0xeb, 0x2d, 0x2c, 0x2c, 0x2c, 0xc4, 0x2c, 0x2c, 0x2c, 0x2e, 0x2f, 0x13, 0xff,
|
||||
0xff, 0xff, 0xff, 0x1a, 0x17, 0x89, 0x89, 0x8a, 0x89, 0x89, 0x18, 0x1a, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x19, 0xca, 0x2e, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0xeb, 0x2f, 0x13, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1a, 0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x1c, 0xa9, 0xca, 0xeb, 0xeb, 0xeb, 0xca, 0xa9, 0x18, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x1a, 0x18, 0x61, 0x1b, 0x1a, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
#endif
|
||||
|
||||
// icons by ahwayakchih
|
||||
|
||||
const char google_icon_M[] = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xd9, 0xd9, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x82, 0x82, 0x19, 0xff, 0xff, 0xff, 0xd8, 0x64, 0x63, 0x63, 0xd8, 0xff, 0xff,
|
||||
0xff, 0xff, 0x2c, 0x2d, 0x2d, 0x2c, 0xc4, 0xff, 0x62, 0x63, 0x1c, 0x3f, 0x1e, 0x63, 0xd8, 0xff,
|
||||
0xff, 0x2c, 0xca, 0x1a, 0x1d, 0x82, 0x2d, 0xa3, 0xd8, 0x62, 0x3f, 0x3f, 0x3f, 0x1e, 0xd8, 0x1a,
|
||||
0x82, 0x2d, 0x1a, 0x3f, 0x3f, 0x3f, 0xa3, 0x2d, 0xd8, 0x62, 0x0e, 0x1e, 0x3f, 0x1f, 0xd8, 0x62,
|
||||
0x82, 0x2d, 0x1d, 0x3f, 0x3f, 0x0f, 0x82, 0x2e, 0x63, 0x83, 0x0a, 0x1e, 0x3f, 0xfd, 0x64, 0xff,
|
||||
0xff, 0x2c, 0x5a, 0x3f, 0x1e, 0x0b, 0xc4, 0xeb, 0xff, 0x64, 0xd8, 0xd9, 0xd9, 0x64, 0x83, 0xff,
|
||||
0xff, 0xca, 0x2c, 0xa3, 0x5a, 0xc4, 0x2e, 0x82, 0xff, 0xff, 0x83, 0x8a, 0x89, 0x17, 0xff, 0xff,
|
||||
0xff, 0xff, 0xa9, 0x2e, 0x2e, 0xca, 0x82, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
||||
|
||||
const char google_icon_L[] = {
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x1b,
|
||||
0x09, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x04, 0x1c,
|
||||
0x1b, 0x1c, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x1b, 0x09, 0x08,
|
||||
0x1c, 0x1c, 0x1b, 0x1c, 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x04, 0x1c, 0x1b, 0x1c,
|
||||
0x08, 0x09, 0x1c, 0x1b, 0x1c, 0x1b, 0x09, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x1b, 0x09, 0x08, 0x1c, 0x1c,
|
||||
0x1b, 0x1c, 0x08, 0x09, 0x1c, 0x1b, 0x1c, 0x1b, 0x09, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x04, 0x1c, 0x1b, 0x1c, 0x08, 0x09,
|
||||
0x1c, 0x1b, 0x1c, 0x1b, 0x09, 0x08, 0x1c, 0x1c, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x1b, 0x09, 0x08, 0x1c, 0x1c, 0x1b, 0x1c,
|
||||
0x08, 0x09, 0x1c, 0x1b, 0x1c, 0x1b, 0x09, 0x00, 0x1c, 0x00, 0xd9, 0x00, 0x00, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x04, 0x04, 0x1c, 0x1c, 0x1b, 0x09, 0x08, 0x1c, 0x1b,
|
||||
0x1c, 0x1c, 0x08, 0x09, 0x1b, 0x1c, 0x1c, 0x00, 0x15, 0x00, 0xd1, 0xd9, 0xd9, 0x00, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x3f, 0x08, 0x09, 0x1b, 0x1c, 0x1b, 0x1c, 0x09, 0x08,
|
||||
0x1c, 0x1b, 0x1c, 0x1c, 0x08, 0x00, 0x1c, 0x00, 0x15, 0x00, 0xd1, 0xd1, 0xd9, 0x00, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x04, 0x04, 0x04, 0x1c, 0x3f, 0x3f, 0x08, 0x09, 0x1b, 0x1c, 0x1b, 0x1c,
|
||||
0x09, 0x08, 0x1c, 0x1b, 0x1c, 0x00, 0x15, 0x00, 0x15, 0x00, 0xd1, 0xd9, 0xaa, 0x01, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x04, 0x3f, 0x08, 0x09, 0x1b, 0x1c, 0x3f, 0x3f, 0x08, 0x09, 0x1b, 0x1c,
|
||||
0x1b, 0x1c, 0x09, 0x00, 0x1b, 0x00, 0x15, 0x00, 0x0f, 0x00, 0xd9, 0xaa, 0xaa, 0x00, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0x04, 0x3f, 0x3f, 0x3f, 0x08, 0x09, 0x1b, 0x1c, 0x3f, 0x3f, 0x08, 0x09,
|
||||
0x1b, 0x1c, 0x1b, 0x00, 0x16, 0x00, 0x15, 0x00, 0x0f, 0xd9, 0xaa, 0xaa, 0xaa, 0x00, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x00, 0x04, 0x3f, 0x1b, 0x1c, 0x3f, 0x3f, 0x08, 0x09, 0x1b, 0x1c, 0x3f, 0x3f,
|
||||
0x08, 0x00, 0x1c, 0x00, 0x15, 0x00, 0x0f, 0x00, 0xd9, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0xff, 0xff,
|
||||
0xff, 0xff, 0x00, 0xd9, 0x04, 0x3f, 0x1b, 0x1c, 0x1b, 0x1c, 0x3f, 0x3f, 0x08, 0x09, 0x1b, 0x1c,
|
||||
0x3f, 0x00, 0x15, 0x00, 0x15, 0x00, 0x0f, 0xd9, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x0f, 0xff,
|
||||
0xff, 0x00, 0xd9, 0xd1, 0x04, 0x15, 0x1a, 0x19, 0x1c, 0x1b, 0x1c, 0x1c, 0x3f, 0x3f, 0x08, 0x00,
|
||||
0x1c, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x63, 0xd8, 0xd8, 0xd8, 0x63, 0x62, 0xaa, 0x00, 0x0f, 0xff,
|
||||
0xff, 0x00, 0xd9, 0xd9, 0x04, 0x0f, 0x15, 0x15, 0x1a, 0x19, 0x1c, 0x1c, 0x1b, 0x1c, 0x3f, 0x00,
|
||||
0x15, 0x00, 0x15, 0x00, 0xd8, 0xd8, 0xd8, 0xf8, 0xd8, 0xf8, 0xd8, 0xd8, 0x63, 0x0f, 0x0f, 0xff,
|
||||
0xff, 0x00, 0x83, 0x83, 0xd9, 0xd9, 0x0f, 0xa3, 0xc4, 0xc4, 0xc4, 0xa9, 0x82, 0x1c, 0x1b, 0x00,
|
||||
0x15, 0x00, 0x0f, 0xd8, 0xd8, 0x64, 0x84, 0x83, 0x63, 0x63, 0x84, 0xf8, 0xd8, 0x63, 0xff, 0xff,
|
||||
0xff, 0x00, 0x83, 0x83, 0x83, 0xa3, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0xc4, 0x1c, 0x00,
|
||||
0x15, 0x00, 0x63, 0xf8, 0x84, 0x83, 0x1d, 0x3f, 0x3f, 0x3f, 0x1c, 0x63, 0x64, 0xd8, 0x63, 0xff,
|
||||
0xff, 0x00, 0x83, 0x83, 0xc4, 0x2c, 0x2c, 0x2d, 0xeb, 0xeb, 0xeb, 0xeb, 0x2c, 0x2c, 0x2c, 0x00,
|
||||
0x0f, 0x62, 0xd8, 0x84, 0x63, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0x63, 0xf8, 0xd8, 0x62,
|
||||
0xff, 0x00, 0x83, 0xa3, 0x2c, 0x2d, 0xeb, 0xa3, 0x1a, 0x1c, 0x1a, 0x82, 0xeb, 0x2d, 0x2c, 0xc4,
|
||||
0x0f, 0x63, 0xf8, 0x84, 0x1d, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1b, 0xf8, 0xd8, 0x63,
|
||||
0xff, 0x00, 0x83, 0x2c, 0x2d, 0x2f, 0x82, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1a, 0x2d, 0x2c, 0x2c,
|
||||
0xa9, 0xd8, 0x64, 0x83, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0xd8, 0xd8, 0x83,
|
||||
0xff, 0x00, 0xa3, 0x2c, 0xeb, 0xa9, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x82, 0x2d, 0x2c,
|
||||
0xca, 0xd8, 0x64, 0x83, 0x3f, 0x19, 0x1b, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0xd8, 0xd8, 0x83,
|
||||
0xff, 0x00, 0xc4, 0x2c, 0x2f, 0x19, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1d, 0xc4, 0x2c,
|
||||
0xeb, 0xd8, 0xf8, 0x83, 0x15, 0x01, 0x03, 0x1b, 0x3f, 0x3f, 0x3f, 0x3f, 0x1e, 0xd8, 0xf8, 0x83,
|
||||
0xff, 0x00, 0xc4, 0x2c, 0x2f, 0x1c, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x1c, 0x1b, 0x1e, 0xc4, 0x2d,
|
||||
0x2f, 0x83, 0xd8, 0x64, 0x0f, 0x00, 0x01, 0x19, 0x3f, 0x3f, 0x3f, 0x3f, 0xfd, 0xd8, 0x64, 0x14,
|
||||
0xff, 0x00, 0xc4, 0x2c, 0x2d, 0xda, 0x3f, 0x3f, 0x3f, 0x3f, 0x1c, 0x04, 0x02, 0x16, 0xc4, 0x2d,
|
||||
0x2f, 0x89, 0xf8, 0xd8, 0x63, 0x12, 0x15, 0x3f, 0x3f, 0x3f, 0x3f, 0xfe, 0xd8, 0xf8, 0x84, 0x14,
|
||||
0xff, 0xff, 0xa9, 0x2c, 0x2c, 0x82, 0x3f, 0x3f, 0x3f, 0x3f, 0x1b, 0x02, 0x00, 0xa9, 0x2c, 0xeb,
|
||||
0x2f, 0xaa, 0x83, 0xf8, 0xf8, 0xd8, 0xfd, 0x3f, 0x3f, 0x1e, 0xfd, 0xd8, 0xf8, 0x84, 0x89, 0xff,
|
||||
0xff, 0xff, 0x82, 0x2d, 0x2c, 0x2c, 0xda, 0x3f, 0x3f, 0x3f, 0x3f, 0x17, 0x13, 0xc4, 0x2d, 0xeb,
|
||||
0xa9, 0x00, 0x0f, 0x83, 0x84, 0x64, 0xf8, 0xd8, 0xd8, 0xd8, 0xf8, 0xf8, 0x84, 0x89, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xca, 0x2d, 0x2c, 0x2c, 0x5a, 0x1e, 0x3f, 0x3f, 0xda, 0xc4, 0x2c, 0xeb, 0x2f,
|
||||
0x00, 0x0f, 0x0f, 0xff, 0x89, 0x84, 0x84, 0x84, 0x84, 0x84, 0x84, 0x8a, 0x89, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xeb, 0x2d, 0x2c, 0x2c, 0x2c, 0xc4, 0x2c, 0x2c, 0x2c, 0xeb, 0x2f, 0x00,
|
||||
0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x89, 0x89, 0x8a, 0x89, 0x89, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0xeb, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0xeb, 0x2f, 0x00, 0x0f,
|
||||
0x0e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa9, 0xca, 0xeb, 0xeb, 0xeb, 0xca, 0xa9, 0x00, 0x0e, 0x0f,
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
};
|
212
src/add-ons/kernel/file_systems/googlefs/google_request.c
Normal file
212
src/add-ons/kernel/file_systems/googlefs/google_request.c
Normal file
@ -0,0 +1,212 @@
|
||||
#include <OS.h>
|
||||
#include <KernelExport.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <malloc.h>
|
||||
#include <sys/socket.h>
|
||||
#include "http_cnx.h"
|
||||
#include "google_request.h"
|
||||
#include "lists2.h"
|
||||
#include "settings.h"
|
||||
|
||||
#define DO_PUBLISH
|
||||
//#define FAKE_INPUT "/boot/home/devel/drivers/googlefs/log2.html"
|
||||
|
||||
//#define TESTURL "http://www.google.com/search?as_q=google+api+&num=50&hl=en&ie=ISO-8859-1&btnG=Google+Search&as_epq=frequently+asked&as_oq=help&as_eq=plop&lr=lang_en&as_ft=i&as_filetype=&as_qdr=m3&as_nlo=&as_nhi=&as_occt=any&as_dt=i&as_sitesearch="
|
||||
|
||||
//#define BASEURL "http://www.google.com/search?as_q="
|
||||
//#define Q "google+api+"
|
||||
//#define EXTRAURL "&num=50&hl=en&ie=ISO-8859-1&btnG=Google+Search&as_epq=frequently+asked&as_oq=help&as_eq=plop&lr=lang_en&as_ft=i&as_filetype=&as_qdr=m3&as_nlo=&as_nhi=&as_occt=any&as_dt=i&as_sitesearch="
|
||||
|
||||
#define TESTURL "http://www.google.com/search?hl=en&ie=UTF-8&num=50&q=beos"
|
||||
//#define BASEURL "http://www.google.com/search?hl=en&ie=UTF-8&num=50&q="
|
||||
#define BASEURL "/search?hl=en&ie=UTF-8&oe=UTF-8"
|
||||
#define FMT_NUM "&num=%u"
|
||||
#define FMT_Q "&q=%s"
|
||||
|
||||
/* parse_google_html.c */
|
||||
extern int google_parse_results(const char *html, size_t htmlsize, struct google_result **results);
|
||||
|
||||
// move that to ksocket inlined
|
||||
static kinet_aton(const char *in, struct in_addr *addr)
|
||||
{
|
||||
int i;
|
||||
unsigned long a;
|
||||
uint32 inaddr = 0L;
|
||||
const char *p = in;
|
||||
for (i = 0; i < 4; i++) {
|
||||
a = strtoul(p, &p, 10);
|
||||
if (!p)
|
||||
return -1;
|
||||
inaddr = (inaddr >> 8) | ((a & 0x0ff) << 24);
|
||||
*(uint32 *)addr = inaddr;
|
||||
if (!*p)
|
||||
return 0;
|
||||
p++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
status_t google_request_init()
|
||||
{
|
||||
status_t err;
|
||||
err = http_init();
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t google_request_uninit()
|
||||
{
|
||||
status_t err;
|
||||
err = http_uninit();
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t google_request_process(struct google_request *req)
|
||||
{
|
||||
struct sockaddr_in sin;
|
||||
struct http_cnx *cnx = NULL;
|
||||
struct google_result *res;
|
||||
int err, i, count;
|
||||
size_t len;
|
||||
char *p = NULL;
|
||||
char *url = NULL;
|
||||
|
||||
err = http_create(&cnx);
|
||||
if (err)
|
||||
return err;
|
||||
err = ENOMEM;
|
||||
req->cnx = cnx;
|
||||
#ifndef FAKE_INPUT
|
||||
sin.sin_len = sizeof(struct sockaddr_in);
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
if (kinet_aton(google_server, &sin.sin_addr) < 0)
|
||||
goto err_cnx;
|
||||
sin.sin_port = htons(google_server_port);
|
||||
err = http_connect(cnx, &sin);
|
||||
dprintf("google_request: http_connect: error 0x%08lx\n", err);
|
||||
if (err)
|
||||
goto err_cnx;
|
||||
|
||||
err = ENOMEM;
|
||||
p = urlify_string(req->query_string);
|
||||
if (!p)
|
||||
goto err_con;
|
||||
|
||||
err = ENOMEM;
|
||||
url = malloc(strlen(BASEURL)+strlen(FMT_NUM)+10+strlen(FMT_Q)+strlen(p)+2);
|
||||
if (!url)
|
||||
goto err_url;
|
||||
strcpy(url, BASEURL);
|
||||
sprintf(url+strlen(url), FMT_NUM, max_results);
|
||||
sprintf(url+strlen(url), FMT_Q, p);
|
||||
|
||||
dprintf("google_request: final URL: %s\n", url);
|
||||
|
||||
err = http_get(cnx, url);
|
||||
dprintf("google_request: http_get: error 0x%08lx\n", err);
|
||||
if (err < 0)
|
||||
goto err_url2;
|
||||
dprintf("google_request: http_get: HEADERS %d:%s\n", cnx->headerslen, cnx->headers);
|
||||
//dprintf("DATA: %d:%s\n", cnx->datalen, cnx->data);
|
||||
|
||||
dprintf("google_request: buffer @ %p, len %ld\n", cnx->data, cnx->datalen);
|
||||
{
|
||||
int fd;
|
||||
// debug output
|
||||
fd = open("/tmp/google.html", O_CREAT|O_TRUNC|O_RDWR, 0644);
|
||||
write(fd, cnx->data, cnx->datalen);
|
||||
close(fd);
|
||||
}
|
||||
#else
|
||||
{
|
||||
int fd;
|
||||
struct stat st;
|
||||
// debug output
|
||||
fd = open(FAKE_INPUT, O_RDONLY, 0644);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
if (fstat(fd, &st) < 0)
|
||||
return -1;
|
||||
cnx->datalen = st.st_size;
|
||||
cnx->data = malloc(cnx->datalen);
|
||||
if (!cnx->data)
|
||||
return ENOMEM;
|
||||
if (read(fd, cnx->data, cnx->datalen) < cnx->datalen)
|
||||
return -1;
|
||||
close(fd);
|
||||
}
|
||||
#endif /* FAKE_INPUT */
|
||||
err = count = google_parse_results(req->cnx->data, req->cnx->datalen, &req->results);
|
||||
if (err < 0)
|
||||
goto err_get;
|
||||
#ifdef DO_PUBLISH
|
||||
while ((res = SLL_DEQUEUE(req->results, next))) {
|
||||
res->next = NULL;
|
||||
googlefs_push_result_to_query(req, res);
|
||||
}
|
||||
#endif
|
||||
free(url);
|
||||
free(p);
|
||||
/* close now */
|
||||
http_close(cnx);
|
||||
|
||||
return B_OK;
|
||||
|
||||
|
||||
err_get:
|
||||
err_url2:
|
||||
free(url);
|
||||
err_url:
|
||||
free(p);
|
||||
err_con:
|
||||
http_close(cnx);
|
||||
err_cnx:
|
||||
http_delete(cnx);
|
||||
req->cnx = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t google_request_process_async(struct google_request *req)
|
||||
{
|
||||
return ENOSYS;
|
||||
}
|
||||
|
||||
status_t google_request_close(struct google_request *req)
|
||||
{
|
||||
if (!req)
|
||||
return EINVAL;
|
||||
if (!req->cnx)
|
||||
return B_OK;
|
||||
http_close(req->cnx);
|
||||
http_delete(req->cnx);
|
||||
req->cnx = NULL;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t google_request_open(const char *query_string, struct fs_nspace *ns, struct fs_node *query_node, struct google_request **req)
|
||||
{
|
||||
struct google_request *r;
|
||||
if (!req)
|
||||
return EINVAL;
|
||||
r = malloc(sizeof(struct google_request));
|
||||
if (!r)
|
||||
return ENOMEM;
|
||||
memset(r, 0, sizeof(struct google_request));
|
||||
r->query_string = strdup(query_string);
|
||||
r->ns = ns;
|
||||
r->query_node = query_node;
|
||||
*req = r;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t google_request_free(struct google_request *req)
|
||||
{
|
||||
if (!req)
|
||||
return EINVAL;
|
||||
free(req->query_string);
|
||||
free(req);
|
||||
}
|
37
src/add-ons/kernel/file_systems/googlefs/google_request.h
Normal file
37
src/add-ons/kernel/file_systems/googlefs/google_request.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef _GOOGLE_REQUEST_H
|
||||
#define _GOOGLE_REQUEST_H
|
||||
|
||||
struct google_request {
|
||||
struct google_request *next;
|
||||
struct fs_nspace *ns;
|
||||
struct fs_node *query_node; /* root folder for that query */
|
||||
char *query_string;
|
||||
struct http_cnx *cnx;
|
||||
struct google_result *results;
|
||||
};
|
||||
|
||||
/* those are quite arbitrary values */
|
||||
#define GR_MAX_NAME 70
|
||||
#define GR_MAX_PROTO 16
|
||||
#define GR_MAX_URL 1024
|
||||
#define GR_MAX_SNIPSET 256
|
||||
struct google_result {
|
||||
struct google_result *next;
|
||||
long id;
|
||||
char name[GR_MAX_NAME];
|
||||
char proto[GR_MAX_PROTO];
|
||||
char url[GR_MAX_URL];
|
||||
char snipset[GR_MAX_SNIPSET];
|
||||
char cache_url[GR_MAX_URL];
|
||||
char similar_url[GR_MAX_URL];
|
||||
};
|
||||
|
||||
extern status_t google_request_init();
|
||||
extern status_t google_request_uninit();
|
||||
extern status_t google_request_process(struct google_request *req);
|
||||
extern status_t google_request_process_async(struct google_request *req);
|
||||
extern status_t google_request_close(struct google_request *req);
|
||||
extern status_t google_request_open(const char *query_string, struct fs_nspace *ns, struct fs_node *query_node, struct google_request **req);
|
||||
extern status_t google_request_free(struct google_request *req);
|
||||
|
||||
#endif /* _GOOGLE_REQUEST_H */
|
1801
src/add-ons/kernel/file_systems/googlefs/googlefs.c
Normal file
1801
src/add-ons/kernel/file_systems/googlefs/googlefs.c
Normal file
File diff suppressed because it is too large
Load Diff
10
src/add-ons/kernel/file_systems/googlefs/googlefs.docs.txt
Normal file
10
src/add-ons/kernel/file_systems/googlefs/googlefs.docs.txt
Normal file
@ -0,0 +1,10 @@
|
||||
======================
|
||||
pointers to docs
|
||||
|
||||
parsing google results from python (+ diffs on User-Agent ?):
|
||||
http://forums.devshed.com/archive/t-154742
|
||||
|
||||
perl hack: plain old XML instead of SOAP:
|
||||
http://hacks.oreilly.com/pub/h/173
|
||||
|
||||
http://www.webmasterworld.com/forum10003/2856.htm
|
131
src/add-ons/kernel/file_systems/googlefs/googlefs.h
Normal file
131
src/add-ons/kernel/file_systems/googlefs/googlefs.h
Normal file
@ -0,0 +1,131 @@
|
||||
#ifndef _GOOGLEFS_H
|
||||
#define _GOOGLEFS_H
|
||||
|
||||
/* wrappers */
|
||||
#ifdef __HAIKU__
|
||||
|
||||
#include <fs_interface.h>
|
||||
#include <kernel/lock.h>
|
||||
#include <fs_info.h>
|
||||
#include <NodeMonitor.h>
|
||||
#define lock benaphore
|
||||
#define new_lock benaphore_init
|
||||
#define free_lock benaphore_destroy
|
||||
#define LOCK benaphore_lock
|
||||
#define UNLOCK benaphore_unlock
|
||||
typedef dev_t nspace_id;
|
||||
|
||||
#else
|
||||
|
||||
#include "fsproto.h"
|
||||
#include "lock.h"
|
||||
#define publish_vnode new_vnode
|
||||
|
||||
#endif
|
||||
|
||||
#include "lists2.h"
|
||||
|
||||
#include <Errors.h>
|
||||
#include <sys/stat.h>
|
||||
#include <SupportDefs.h>
|
||||
|
||||
/* should be more than enough */
|
||||
//#define GOOGLEFS_NAME_LEN B_OS_NAME_LENGTH
|
||||
//#define GOOGLEFS_NAME_LEN 64 /* GR_MAX_NAME */
|
||||
/* some google results are a bit more than 64 */
|
||||
#define GOOGLEFS_NAME_LEN 70 /* GR_MAX_NAME */
|
||||
|
||||
#define GOOGLEFS_NAME "googlefs"
|
||||
#define GOOGLEFS_PRETTY_NAME "Google Bookmark File System"
|
||||
|
||||
#define MAX_VNIDS 5000
|
||||
|
||||
|
||||
struct attr_entry {
|
||||
const char *name;
|
||||
uint32 type;
|
||||
size_t size;
|
||||
void *value;
|
||||
};
|
||||
|
||||
#define ASSERT(op) if (!(op)) panic("ASSERT: %s in %s:%s", #op, __FILE__, __FUNCTION__)
|
||||
|
||||
struct mount_fs_params
|
||||
{
|
||||
/* no param */
|
||||
};
|
||||
|
||||
struct fs_file_cookie;
|
||||
|
||||
struct fs_node
|
||||
{
|
||||
struct fs_node *nlnext; /* node list */
|
||||
struct fs_node *qnext; /* query list */
|
||||
struct fs_node *next; /* next in folder */
|
||||
struct fs_node *parent, *children;
|
||||
struct fs_file_cookie *opened; /* opened on this node */
|
||||
|
||||
char name[GOOGLEFS_NAME_LEN];
|
||||
vnode_id vnid;
|
||||
lock l;
|
||||
|
||||
int is_perm:1; /* don't delete on last close */
|
||||
int deleted:1;
|
||||
int qcompleted:1;
|
||||
int hidden:1; /* don't list in readdir */
|
||||
struct stat st; /* including S_IFDIR in st_mode */
|
||||
struct google_request *request; /* set on root folder for a query */
|
||||
struct google_result *result; /* for query results */
|
||||
struct attr_entry *attrs_indirect;
|
||||
struct attr_entry attrs[10];
|
||||
void *data;
|
||||
size_t data_size;
|
||||
};
|
||||
|
||||
struct vnidpool;
|
||||
|
||||
struct fs_nspace
|
||||
{
|
||||
nspace_id nsid;
|
||||
vnode_id rootid;
|
||||
struct vnidpool *vnids;
|
||||
struct fs_node *root; /* fast access for stat time change */
|
||||
struct fs_node *nodes;
|
||||
struct fs_node *queries;
|
||||
vint32 nodecount; /* just for statvfs() */
|
||||
|
||||
lock l;
|
||||
};
|
||||
|
||||
struct fs_file_cookie
|
||||
{
|
||||
struct fs_file_cookie *next; /* must stay here */
|
||||
struct fs_node *node;
|
||||
int dir_current; /* current entry for readdir() */
|
||||
int omode;
|
||||
int type; /* S_IF* of the *cookie* */
|
||||
struct attr_entry *attr;
|
||||
};
|
||||
/* just for type */
|
||||
#define S_IFQUERY 00000070000
|
||||
|
||||
typedef struct attr_entry attr_entry;
|
||||
typedef struct fs_nspace fs_nspace;
|
||||
typedef struct fs_node fs_node;
|
||||
typedef struct fs_file_cookie fs_file_cookie;
|
||||
/* not much different */
|
||||
#define fs_dir_cookie fs_file_cookie
|
||||
#define fs_attr_dir_cookie fs_file_cookie
|
||||
#define fs_query_cookie fs_file_cookie
|
||||
|
||||
vnode_id new_vnid(fs_nspace *ns);
|
||||
int googlefs_free_vnode(fs_nspace *ns, fs_node *node);
|
||||
|
||||
int googlefs_event(fs_nspace *ns, fs_node *node, int flags);
|
||||
|
||||
/* used by the requester to publish entries in queries
|
||||
* result = NULL to notify end of list
|
||||
*/
|
||||
extern int googlefs_push_result_to_query(struct google_request *request, struct google_result *result);
|
||||
|
||||
#endif
|
88
src/add-ons/kernel/file_systems/googlefs/googlefs_res.rdef
Normal file
88
src/add-ons/kernel/file_systems/googlefs/googlefs_res.rdef
Normal file
@ -0,0 +1,88 @@
|
||||
/*
|
||||
** googlefs.rdef
|
||||
**
|
||||
** Automatically generated by BResourceParser on
|
||||
** Saturday, January 20, 2007 at 01:48:42.
|
||||
**
|
||||
*/
|
||||
|
||||
|
||||
resource(1, "BEOS:APP_VERSION") #'APPV' array {
|
||||
$"0000000000000000010000000000000000000000476F6F676C65465300000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000476F6F676C65465320C2A920"
|
||||
$"323030342C204672616EC3A76F6973205265766F6C0000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000000000000000000000000000000000000000000000000000"
|
||||
$"0000000000000000"
|
||||
};
|
||||
|
||||
resource(1, "BEOS:L:STD_ICON") #'ICON' array {
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFF0400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFF041B0908FFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFF0400041C1B1C0809FFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFF041B09081C1C1B1C0809FFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFF0400041C1B1C08091C1B1C1B0908FFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFF041B09081C1C1B1C08091C1B1C1B0900FFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFF0400041C1B1C08091C1B1C1B09081C1C1B0000FFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFF041B09081C1C1B1C08091C1B1C1B09001C00D90000FFFFFF"
|
||||
$"FFFFFFFFFFFF0404041C1C1B09081C1B1C1C08091B1C1C001500D1D9D900FFFF"
|
||||
$"FFFFFFFFFFFF043F08091B1C1B1C09081C1B1C1C08001C001500D1D1D900FFFF"
|
||||
$"FFFFFFFF0404041C3F3F08091B1C1B1C09081C1B1C0015001500D1D9AA01FFFF"
|
||||
$"FFFFFFFF043F08091B1C3F3F08091B1C1B1C09001B0015000F00D9AAAA00FFFF"
|
||||
$"FFFFFFFF043F3F3F08091B1C3F3F08091B1C1B00160015000FD9AAAAAA00FFFF"
|
||||
$"FFFFFF00043F1B1C3F3F08091B1C3F3F08001C0015000F00D9AAAAAAAA00FFFF"
|
||||
$"FFFF00D9043F1B1C1B1C3F3F08091B1C3F00150015000FD9AAAAAAAAAA000FFF"
|
||||
$"FF00D9D104151A191C1B1C1C3F3F08001C0015000F0063D8D8D86362AA000FFF"
|
||||
$"FF00D9D9040F15151A191C1C1B1C3F0015001500D8D8D8F8D8F8D8D8630F0FFF"
|
||||
$"FF008383D9D90FA3C4C4C4A9821C1B0015000FD8D8648483636384F8D863FFFF"
|
||||
$"FF00838383A32C2C2C2C2C2C2CC41C00150063F884831D3F3F3F1C6364D863FF"
|
||||
$"FF008383C42C2C2DEBEBEBEB2C2C2C000F62D884633F3F3F3F3F3F1E63F8D862"
|
||||
$"FF0083A32C2DEBA31A1C1A82EB2D2CC40F63F8841D3F3F3F3F3F3F3F1BF8D863"
|
||||
$"FF00832C2D2F823F3F3F3F3F1A2D2C2CA9D864833F3F3F3F3F3F3F3F1ED8D883"
|
||||
$"FF00A32CEBA93F3F3F3F3F3F3F822D2CCAD864833F191B3F3F3F3F3F3FD8D883"
|
||||
$"FF00C42C2F193F3F3F3F3F3F3F1DC42CEBD8F8831501031B3F3F3F3F1ED8F883"
|
||||
$"FF00C42C2F1C3F3F3F3F3F1C1B1EC42D2F83D8640F0001193F3F3F3FFDD86414"
|
||||
$"FF00C42C2DDA3F3F3F3F1C040216C42D2F89F8D86312153F3F3F3FFED8F88414"
|
||||
$"FFFFA92C2C823F3F3F3F1B0200A92CEB2FAA83F8F8D8FD3F3F1EFDD8F88489FF"
|
||||
$"FFFF822D2C2CDA3F3F3F3F1713C42DEBA9000F838464F8D8D8D8F8F88489FFFF"
|
||||
$"FFFFFFCA2D2C2C5A1E3F3FDAC42CEB2F000F0FFF898484848484848A89FFFFFF"
|
||||
$"FFFFFFFFEB2D2C2C2CC42C2C2CEB2F000F0FFFFFFFFF89898A8989FFFFFFFFFF"
|
||||
$"FFFFFFFFFFCAEB2D2D2D2D2DEB2F000F0EFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFA9CAEBEBEBCAA9000E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
};
|
||||
|
||||
resource(1, "BEOS:M:STD_ICON") #'MICN' array {
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFF1BD9D9FFFFFF"
|
||||
$"FFFFFF828219FFFFFFD8646363D8FFFF"
|
||||
$"FFFF2C2D2D2CC4FF62631C3F1E63D8FF"
|
||||
$"FF2CCA1A1D822DA3D8623F3F3F1ED81A"
|
||||
$"822D1A3F3F3FA32DD8620E1E3F1FD862"
|
||||
$"822D1D3F3F0F822E63830A1E3FFD64FF"
|
||||
$"FF2C5A3F1E0BC4EBFF64D8D9D96483FF"
|
||||
$"FFCA2CA35AC42E82FFFF838A8917FFFF"
|
||||
$"FFFFA92E2ECA82FFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
$"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
|
||||
};
|
||||
|
235
src/add-ons/kernel/file_systems/googlefs/http_cnx.c
Normal file
235
src/add-ons/kernel/file_systems/googlefs/http_cnx.c
Normal file
@ -0,0 +1,235 @@
|
||||
#include <errno.h>
|
||||
#include <sys/param.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "ksocket.h"
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "http_cnx.h"
|
||||
|
||||
//#define TESTME
|
||||
|
||||
#ifdef _KERNEL_MODE
|
||||
#include <KernelExport.h>
|
||||
#define printf dprintf
|
||||
#undef TESTME
|
||||
#endif
|
||||
|
||||
#define DBG "googlefs: http_cnx: "
|
||||
|
||||
#define HTTPVER "1.0"
|
||||
|
||||
#define GOOGLEFS_UA "GoogleFS"
|
||||
|
||||
#ifdef TESTME
|
||||
#define BUFSZ (128*1024)
|
||||
#endif
|
||||
|
||||
KSOCKET_MODULE_DECL;
|
||||
|
||||
status_t http_init()
|
||||
{
|
||||
return ksocket_init();
|
||||
}
|
||||
|
||||
status_t http_uninit()
|
||||
{
|
||||
return ksocket_cleanup();
|
||||
}
|
||||
|
||||
status_t http_create(struct http_cnx **cnx)
|
||||
{
|
||||
struct http_cnx *c;
|
||||
int err;
|
||||
c = malloc(sizeof(struct http_cnx));
|
||||
if (!c)
|
||||
return ENOMEM;
|
||||
memset(c, 0, sizeof(struct http_cnx));
|
||||
err = c->sock = ksocket(AF_INET, SOCK_STREAM, 0);
|
||||
if (err < 0) {
|
||||
free(c);
|
||||
return errno;
|
||||
}
|
||||
*cnx = c;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t http_delete(struct http_cnx *cnx)
|
||||
{
|
||||
if (!cnx)
|
||||
return EINVAL;
|
||||
if ((unsigned long)cnx < 0x40) {
|
||||
dprintf("http: WARNING: cnx ptr = %p\n", cnx);
|
||||
return B_OK;
|
||||
}
|
||||
if (cnx->sock >= 0) {
|
||||
kclosesocket(cnx->sock);
|
||||
cnx->sock = -1;
|
||||
}
|
||||
if (cnx->buffer)
|
||||
free(cnx->buffer);
|
||||
cnx->buffer = 0xaa55aa55;//XXX
|
||||
free(cnx);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t http_connect(struct http_cnx *cnx, struct sockaddr_in *sin)
|
||||
{
|
||||
int err;
|
||||
uint32 ip;
|
||||
uint16 port;
|
||||
if (!sin) {
|
||||
dprintf("http_connect(, NULL)!!\n");
|
||||
return EINVAL;
|
||||
}
|
||||
ip = sin->sin_addr.s_addr;
|
||||
port = sin->sin_port;
|
||||
dprintf("http_connect(, %d.%d.%d.%d:%d), sock = %ld\n", ip & 0xff, (ip >> 8) & 0xff, (ip >> 16) & 0xff, (ip >> 24) & 0xff, ntohs(port), cnx->sock);
|
||||
err = kconnect(cnx->sock, (struct sockaddr *)sin, sin->sin_len);
|
||||
cnx->err = 0;
|
||||
if (err == -1)
|
||||
return errno;
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t http_close(struct http_cnx *cnx)
|
||||
{
|
||||
int err;
|
||||
if (!cnx)
|
||||
return EINVAL;
|
||||
if (cnx->sock < 0)
|
||||
return 0;
|
||||
err = kclosesocket(cnx->sock);
|
||||
cnx->sock = -1;
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t http_get(struct http_cnx *cnx, const char *url)
|
||||
{
|
||||
char *req, *p;
|
||||
int reqlen;
|
||||
int len;
|
||||
int err;
|
||||
long headerslen = 0;
|
||||
long contentlen = 0;
|
||||
if (strlen(url) > 4096 - 128)
|
||||
return EINVAL;
|
||||
req = malloc(4096);
|
||||
if (!req)
|
||||
return B_NO_MEMORY;
|
||||
/* no snprintf in kernel :( */
|
||||
sprintf(req, "GET %s HTTP/"HTTPVER"\nUser-Agent: " GOOGLEFS_UA "/" "0.1" "\nAccept: */*\n\n", url);
|
||||
reqlen = strlen(req);
|
||||
err = len = write(cnx->sock, req, reqlen);
|
||||
if (len < 1)
|
||||
goto err0;
|
||||
reqlen = 4096;
|
||||
err = len = read(cnx->sock, req, reqlen);
|
||||
printf("read(sock) = %d\n", len);
|
||||
//write(1, req, len);
|
||||
err = B_NO_MEMORY;
|
||||
if (len < 10)
|
||||
goto err0;
|
||||
if (!strstr(req, "\r\n\r\n")) {
|
||||
if (!strstr(req, "\n\n")) /* shouldn't happen */
|
||||
goto err0;
|
||||
headerslen = strstr(req, "\n\n") - req + 2;
|
||||
req[headerslen-1] = '\0';
|
||||
req[headerslen-2] = '\0';
|
||||
} else {
|
||||
headerslen = strstr(req, "\r\n\r\n") - req + 4;
|
||||
req[headerslen-3] = '\0';
|
||||
req[headerslen-4] = '\0';
|
||||
}
|
||||
if (headerslen < 2 || headerslen > 4095)
|
||||
goto err0;
|
||||
p = strstr(req, "HTTP/1.");
|
||||
if (!p)
|
||||
goto err0;
|
||||
p += strlen("HTTP/1.");
|
||||
if (strlen(p) < 5)
|
||||
goto err0;
|
||||
p += strlen("1 ");
|
||||
cnx->err = strtol(p, &p, 10);
|
||||
if (cnx->err < 200 || cnx->err > 299)
|
||||
goto err0;
|
||||
printf("REQ: %d\n", cnx->err);
|
||||
contentlen = len - headerslen;
|
||||
// if (!strstr(req, "\n\n") && !strstr(req, "\r\n\r\n"))
|
||||
// goto err0;
|
||||
while (len > 0) {
|
||||
long left = reqlen - headerslen - contentlen;
|
||||
if (left < 128) {
|
||||
reqlen += 4096;
|
||||
p = realloc(req, reqlen);
|
||||
left += 4096;
|
||||
if (!p)
|
||||
goto err0;
|
||||
req = p;
|
||||
}
|
||||
err = len = read(cnx->sock, req + headerslen + contentlen, left);
|
||||
if (len < 0)
|
||||
goto err0;
|
||||
contentlen += len;
|
||||
}
|
||||
cnx->buffer = req;
|
||||
cnx->headers = req;
|
||||
cnx->headerslen = headerslen;
|
||||
cnx->data = req + headerslen;
|
||||
cnx->datalen = contentlen;
|
||||
cnx->data[contentlen] = '\0'; /* we have at least 128 bytes allocated ahead */
|
||||
return B_OK;
|
||||
err0:
|
||||
if (err > -1)
|
||||
err = -1;
|
||||
free(req);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef TESTME
|
||||
//#define TESTURL "/"
|
||||
//#define TESTURL "http://www.google.com/search?as_q=google+api+&num=50&hl=en&ie=ISO-8859-1&btnG=Google+Search&as_epq=frequently+asked&as_oq=help&as_eq=plop&lr=lang_en&as_ft=i&as_filetype=&as_qdr=m3&as_nlo=&as_nhi=&as_occt=any&as_dt=i&as_sitesearch="
|
||||
#define TESTURL "http://www.google.com/search?hl=en&ie=UTF-8&num=50&q=beos"
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct sockaddr_in sin;
|
||||
struct http_cnx *cnx;
|
||||
size_t len;
|
||||
char *p;
|
||||
int err;
|
||||
|
||||
http_init();
|
||||
err = http_create(&cnx);
|
||||
printf("error 0x%08lx\n", err);
|
||||
sin.sin_len = sizeof(struct sockaddr_in);
|
||||
sin.sin_family = AF_INET;
|
||||
sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
||||
inet_aton("66.102.11.99", &sin.sin_addr);
|
||||
sin.sin_port = htons(80);
|
||||
err = http_connect(cnx, &sin);
|
||||
printf("error 0x%08lx\n", err);
|
||||
err = http_get(cnx, TESTURL);
|
||||
printf("error 0x%08lx\n", err);
|
||||
if (err < 0)
|
||||
return 1;
|
||||
printf("HEADERS %d:%s\n", cnx->headerslen, cnx->headers);
|
||||
printf("DATA: %d:%s\n", cnx->datalen, cnx->data);
|
||||
http_close(cnx);
|
||||
http_delete(cnx);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
31
src/add-ons/kernel/file_systems/googlefs/http_cnx.h
Normal file
31
src/add-ons/kernel/file_systems/googlefs/http_cnx.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef _HTTP_CNX_H
|
||||
#define _HTTP_CNX_H
|
||||
|
||||
struct http_cnx {
|
||||
int sock;
|
||||
status_t err; /* 404, ... */
|
||||
char *headers;
|
||||
size_t headerslen;
|
||||
char *data;
|
||||
size_t datalen;
|
||||
/* for bookkeeping */
|
||||
char *buffer;
|
||||
};
|
||||
|
||||
struct sockaddr_in;
|
||||
|
||||
extern status_t http_init();
|
||||
extern status_t http_uninit();
|
||||
|
||||
extern status_t http_create(struct http_cnx **);
|
||||
extern status_t http_delete(struct http_cnx *cnx);
|
||||
|
||||
extern status_t http_connect(struct http_cnx *cnx, struct sockaddr_in *sin);
|
||||
extern status_t http_close(struct http_cnx *cnx);
|
||||
|
||||
extern status_t http_get(struct http_cnx *cnx, const char *url);
|
||||
//extern status_t http_post(struct http_cnx *cnx, const char *url);
|
||||
/* read the actual data in the buffer */
|
||||
//extern status_t http_fetch_data(struct http_cnx *cnx);
|
||||
|
||||
#endif /* _HTTP_CNX_H */
|
114
src/add-ons/kernel/file_systems/googlefs/ksocket.h
Normal file
114
src/add-ons/kernel/file_systems/googlefs/ksocket.h
Normal file
@ -0,0 +1,114 @@
|
||||
/*
|
||||
* kernel-level support for sockets, includes userland support as well for testing.
|
||||
* François Revol.
|
||||
*/
|
||||
|
||||
#ifndef _KSOCKET_H
|
||||
#define _KSOCKET_H
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
#ifndef _KERNEL_MODE /* userland wrapper */
|
||||
|
||||
#define ksocket socket
|
||||
#define kbind bind
|
||||
#define kconnect connect
|
||||
#define kgetsockname getsockname
|
||||
#define kgetpeername getpeername
|
||||
#define kaccept accept
|
||||
#define ksendmsg sendmsg
|
||||
#define krecvmsg recvmsg
|
||||
#define krecvfrom recvfrom
|
||||
#define ksendto sendto
|
||||
#define krecv recv
|
||||
#define ksend send
|
||||
#define klisten listen
|
||||
#define kshutdown shutdown
|
||||
#define kclosesocket close
|
||||
#define ksocket_init() ({B_OK;})
|
||||
#define ksocket_cleanup() ({B_OK;})
|
||||
#define kmessage(fmt, ...) printf(fmt "\n", ##__VA_ARGS__)
|
||||
#define KSOCKET_MODULE_DECL /* nothing */
|
||||
|
||||
#elif defined(__HAIKU__)
|
||||
|
||||
/* Haiku socket module */
|
||||
#include <os/drivers/socket_interface.h>
|
||||
|
||||
extern struct socket_module_info *gSocket;
|
||||
#define ksocket (gSocket->socket)
|
||||
#define kbind (gSocket->bind)
|
||||
#define kconnect (gSocket->connect)
|
||||
#define kgetsockname (gSocket->getsockname)
|
||||
#define kgetpeername (gSocket->getpeername)
|
||||
#define kaccept (gSocket->accept)
|
||||
//#define kaccept(_fd, _addr, _sz) ({int thesock; thesock = (gSocket->accept)(_fd, _addr, _sz); dprintf("kaccept(%d, , ) = %d\n", _fd, thesock); thesock; })
|
||||
#define ksendmsg (gSocket->sendmsg)
|
||||
#define krecvmsg (gSocket->recvmsg)
|
||||
#define krecvfrom (gSocket->recvfrom)
|
||||
#define ksendto (gSocket->sendto)
|
||||
#define krecv (gSocket->recv)
|
||||
#define ksend (gSocket->send)
|
||||
#define klisten (gSocket->listen)
|
||||
#define kshutdown (gSocket->shutdown)
|
||||
#define kclosesocket close
|
||||
#define kmessage(fmt, ...) dprintf("ksocket: " fmt "\n", ##__VA_ARGS__)
|
||||
|
||||
extern status_t ksocket_init ();
|
||||
extern status_t ksocket_cleanup ();
|
||||
|
||||
#define KSOCKET_MODULE_DECL \
|
||||
struct socket_module_info *gSocket; \
|
||||
status_t ksocket_init () { \
|
||||
return get_module(B_SOCKET_MODULE_NAME, (module_info **)&gSocket); \
|
||||
} \
|
||||
\
|
||||
status_t ksocket_cleanup () { \
|
||||
return put_module(B_SOCKET_MODULE_NAME); \
|
||||
}
|
||||
|
||||
#elif defined(BONE_VERSION)
|
||||
|
||||
/* BONE socket module */
|
||||
#include <sys/socket_module.h>
|
||||
|
||||
extern bone_socket_info_t *gSocket;
|
||||
#define ksocket (gSocket->socket)
|
||||
//#define ksocket(_fam, _typ, _pro) ({int thesock; thesock = (gSocket->socket)(_fam, _typ, _pro); dprintf("ksocket(%d, %d, %d) = %d\n", _fam, _typ, _pro, thesock); thesock;})
|
||||
#define kbind (gSocket->bind)
|
||||
#define kconnect (gSocket->connect)
|
||||
#define kgetsockname (gSocket->getsockname)
|
||||
#define kgetpeername (gSocket->getpeername)
|
||||
#define kaccept (gSocket->accept)
|
||||
//#define kaccept(_fd, _addr, _sz) ({int thesock; thesock = (gSocket->accept)(_fd, _addr, _sz); dprintf("kaccept(%d, , ) = %d\n", _fd, thesock); thesock; })
|
||||
#define ksendmsg _ERROR_no_sendmsg_in_BONE
|
||||
#define krecvmsg _ERROR_no_recvmsg_in_BONE
|
||||
#define krecvfrom (gSocket->recvfrom)
|
||||
#define ksendto (gSocket->sendto)
|
||||
#define krecv (gSocket->recv)
|
||||
#define ksend (gSocket->send)
|
||||
#define klisten (gSocket->listen)
|
||||
#define kshutdown (gSocket->shutdown)
|
||||
#define kclosesocket close
|
||||
#define kmessage(fmt, ...) dprintf("ksocket: " fmt "\n", ##__VA_ARGS__)
|
||||
|
||||
extern status_t ksocket_init ();
|
||||
extern status_t ksocket_cleanup ();
|
||||
|
||||
#define KSOCKET_MODULE_DECL \
|
||||
bone_socket_info_t *gSocket; \
|
||||
status_t ksocket_init () { \
|
||||
return get_module(BONE_SOCKET_MODULE, (module_info **)&gSocket); \
|
||||
} \
|
||||
\
|
||||
status_t ksocket_cleanup () { \
|
||||
return put_module(BONE_SOCKET_MODULE); \
|
||||
}
|
||||
|
||||
#else /* _KERNEL_MODE, !BONE_VERSION */
|
||||
|
||||
#error feel free to put back ksocketd support if you dare
|
||||
|
||||
#endif /* _KERNEL_MODE, BONE_VERSION */
|
||||
|
||||
#endif /* _KSOCKET_H */
|
80
src/add-ons/kernel/file_systems/googlefs/lists.c
Normal file
80
src/add-ons/kernel/file_systems/googlefs/lists.c
Normal file
@ -0,0 +1,80 @@
|
||||
#include <OS.h>
|
||||
#include "lists.h"
|
||||
|
||||
void slist_init(struct _slist_entry *item)
|
||||
{
|
||||
item->next = NULL;
|
||||
}
|
||||
|
||||
void slist_uninit(struct _slist_entry *item)
|
||||
{
|
||||
item->next = NULL;
|
||||
}
|
||||
|
||||
struct _slist_entry *slist_find(struct _slist_entry *head, slist_compare_func func, void *id)
|
||||
{
|
||||
struct _slist_entry *p = head;
|
||||
if (head == NULL)
|
||||
return NULL;
|
||||
while (p) {
|
||||
if (func(p, id) == 0)
|
||||
return p;
|
||||
p = p->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status_t slist_insert_head(struct _slist_entry **head, struct _slist_entry *item)
|
||||
{
|
||||
struct _slist_entry *next = NULL;
|
||||
if (head == NULL || item == NULL)
|
||||
return EINVAL;
|
||||
if (*head)
|
||||
next = *head;
|
||||
item->next = next;
|
||||
*head = item;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
struct _slist_entry *slist_dequeue_tail(struct _slist_entry **head)
|
||||
{
|
||||
struct _slist_entry **prev = NULL;
|
||||
struct _slist_entry *curr = NULL;
|
||||
if (head == NULL || *head == NULL)
|
||||
return NULL;
|
||||
prev = head;
|
||||
curr = *head;
|
||||
while (curr->next) {
|
||||
prev = &(curr->next);
|
||||
curr = curr->next;
|
||||
}
|
||||
*prev = NULL;
|
||||
return curr;
|
||||
}
|
||||
|
||||
status_t slist_remove(struct _slist_entry **head, struct _slist_entry *item)
|
||||
{
|
||||
struct _slist_entry **prev = NULL;
|
||||
struct _slist_entry *curr = NULL;
|
||||
if (head == NULL || *head == NULL || item == NULL)
|
||||
return EINVAL;
|
||||
prev = head;
|
||||
curr = *head;
|
||||
while (prev && curr) {
|
||||
if (curr == item) {
|
||||
*prev = curr->next;
|
||||
curr->next = NULL;
|
||||
return B_OK;
|
||||
}
|
||||
prev = &(curr->next);
|
||||
curr = curr->next;
|
||||
}
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
struct _slist_entry *slist_next(struct _slist_entry *item)
|
||||
{
|
||||
if (!item || !item->next)
|
||||
return NULL;
|
||||
return item->next;
|
||||
}
|
29
src/add-ons/kernel/file_systems/googlefs/lists.h
Normal file
29
src/add-ons/kernel/file_systems/googlefs/lists.h
Normal file
@ -0,0 +1,29 @@
|
||||
/* good old single linked list stuff */
|
||||
/* revol@free.fr */
|
||||
|
||||
#ifndef _LISTS_H
|
||||
#define _LISTS_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef struct _slist_entry {
|
||||
struct _slist_entry *next;
|
||||
char id[0];
|
||||
} slist_entry;
|
||||
|
||||
typedef int (*slist_compare_func)(struct _slist_entry *item, void *id);
|
||||
|
||||
extern void slist_init(struct _slist_entry *item);
|
||||
extern void slist_uninit(struct _slist_entry *item);
|
||||
extern struct _slist_entry *slist_find(struct _slist_entry *head, slist_compare_func func, void *id);
|
||||
extern status_t slist_insert_head(struct _slist_entry **head, struct _slist_entry *item);
|
||||
extern struct _slist_entry *slist_dequeue_tail(struct _slist_entry **head);
|
||||
extern status_t slist_remove(struct _slist_entry **head, struct _slist_entry *item);
|
||||
extern struct _slist_entry *slist_next(struct _slist_entry *item);
|
||||
|
||||
#define LENT_TO_OBJ(_obtype, _sle, _moff) ((_obtype *)(((char *)(_sle)) - offsetof(_obtype, _moff)))
|
||||
#define OBJ_TO_LENT(_obj, _member) (&((_obj)->_member))
|
||||
|
||||
|
||||
#endif /* _LISTS_H */
|
||||
|
99
src/add-ons/kernel/file_systems/googlefs/lists2.c
Normal file
99
src/add-ons/kernel/file_systems/googlefs/lists2.c
Normal file
@ -0,0 +1,99 @@
|
||||
#include <OS.h>
|
||||
#include "lists2.h"
|
||||
|
||||
void *sll_find(long nextoff, void *head, sll_compare_func func, void *id)
|
||||
{
|
||||
void *p = head;
|
||||
int count = 5000;
|
||||
if (head == NULL)
|
||||
return NULL;
|
||||
while (p) {
|
||||
if (func(p, id) == 0)
|
||||
return p;
|
||||
p = sll_next(nextoff, p);
|
||||
if (!count--) {
|
||||
dprintf("sll_find: WARNING: 5000 nodes to search ??? looks more of a loop.\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status_t sll_insert_head(long nextoff, void **head, void *item)
|
||||
{
|
||||
void *next = NULL;
|
||||
if (head == NULL || item == NULL)
|
||||
return EINVAL;
|
||||
if (*head)
|
||||
next = *head;
|
||||
*(void **)(((char *)item)+nextoff) = next;
|
||||
*head = item;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t sll_insert_tail(long nextoff, void **head, void *item)
|
||||
{
|
||||
void *p, *next = NULL;
|
||||
if (head == NULL || item == NULL)
|
||||
return EINVAL;
|
||||
|
||||
if (*(void **)(((char *)item)+nextoff)) {
|
||||
dprintf("sll_insert_tail: WARNING: %p->next NOT NULL\n", item);
|
||||
*(void **)(((char *)item)+nextoff) = NULL;
|
||||
}
|
||||
|
||||
p = *head;
|
||||
if (!p) {
|
||||
*head = item;
|
||||
return B_OK;
|
||||
}
|
||||
while (sll_next(nextoff, p))
|
||||
p = sll_next(nextoff, p);
|
||||
*(void **)(((char *)p)+nextoff) = item;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
void *sll_dequeue_tail(long nextoff, void **head)
|
||||
{
|
||||
void **prev = NULL;
|
||||
void *curr = NULL;
|
||||
if (head == NULL || *head == NULL)
|
||||
return NULL;
|
||||
prev = head;
|
||||
curr = *head;
|
||||
while (sll_next(nextoff, curr)) {
|
||||
prev = (void **)(((char *)curr)+nextoff);
|
||||
curr = sll_next(nextoff, curr);
|
||||
}
|
||||
*prev = NULL;
|
||||
return curr;
|
||||
}
|
||||
|
||||
status_t sll_remove(long nextoff, void **head, void *item)
|
||||
{
|
||||
void **prev = NULL;
|
||||
void *curr = NULL;
|
||||
if (head == NULL || *head == NULL || item == NULL)
|
||||
return EINVAL;
|
||||
prev = head;
|
||||
curr = *head;
|
||||
while (prev && curr) {
|
||||
if (curr == item) {
|
||||
*prev = sll_next(nextoff, curr);
|
||||
*(void **)(((char *)item)+nextoff) = NULL;
|
||||
return B_OK;
|
||||
}
|
||||
prev = (void **)(((char *)curr)+nextoff);
|
||||
curr = sll_next(nextoff, curr);
|
||||
}
|
||||
return ENOENT;
|
||||
}
|
||||
|
||||
void *sll_next(long nextoff, void *item)
|
||||
{
|
||||
void *next;
|
||||
if (!item)
|
||||
return NULL;
|
||||
next = *(void **)(((char *)item)+nextoff);
|
||||
return next;
|
||||
}
|
28
src/add-ons/kernel/file_systems/googlefs/lists2.h
Normal file
28
src/add-ons/kernel/file_systems/googlefs/lists2.h
Normal file
@ -0,0 +1,28 @@
|
||||
/* good old single linked list stuff */
|
||||
/* revol@free.fr */
|
||||
|
||||
#ifndef _LISTS2_H
|
||||
#define _LISTS2_H
|
||||
|
||||
typedef int (*sll_compare_func)(const void *item, void *id);
|
||||
|
||||
extern void *sll_find(long nextoff, void *head, sll_compare_func func, void *id);
|
||||
extern status_t sll_insert_head(long nextoff, void **head, void *item);
|
||||
extern status_t sll_insert_tail(long nextoff, void **head, void *item);
|
||||
extern void *sll_dequeue_tail(long nextoff, void **head);
|
||||
extern status_t sll_remove(long nextoff, void **head, void *item);
|
||||
extern void *sll_next(long nextoff, void *item);
|
||||
|
||||
#define SLLPTROFF(type,item,nextp) ((typeof(item))(((char *)(item)) + offsetof(item, nextp)))
|
||||
#define SLLITEM2PTR(type,item,nextp) ((typeof(item))(((char *)(item)) + offsetof(item, nextp)))
|
||||
#define SLLPTR2ITEM(type,ptr,nextp) ((typeof(ptr))(((char *)(ptr)) - offsetof(ptr, nextp)))
|
||||
#define SLLNEXT(type,item,nextp) (*(typeof(item))(((char *)(item)) + offsetof(item, nextp)))
|
||||
|
||||
#define SLL_FIND(_head,_nextp,_func,_with) (typeof(_head))sll_find(offsetof(typeof(*_head),_nextp), (void *)(_head), _func, _with)
|
||||
#define SLL_INSERT(_head,_nextp,_item) (typeof(_head))sll_insert_head(offsetof(typeof(*_head),_nextp), (void **)&(_head), _item)
|
||||
//#define SLL_INSERT_TAIL(_head,_nextp,_item) (typeof(_head))sll_insert_tail(offsetof(typeof(*_head),_nextp), (void **)&(_head), _item)
|
||||
#define SLL_INSERT_TAIL(_head,_nextp,_item) sll_insert_head(offsetof(typeof(*_head),_nextp), (void **)&(_head), _item)
|
||||
#define SLL_DEQUEUE(_head,_nextp) (typeof(_head))sll_dequeue_tail(offsetof(typeof(*_head),_nextp), (void **)&(_head))
|
||||
#define SLL_REMOVE(_head,_nextp,_item) (typeof(_head))sll_remove(offsetof(typeof(*_head),_nextp), (void **)&(_head), _item)
|
||||
|
||||
#endif /* _LISTS2_H */
|
52
src/add-ons/kernel/file_systems/googlefs/lock.h
Normal file
52
src/add-ons/kernel/file_systems/googlefs/lock.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#ifndef _LOCK_H
|
||||
#define _LOCK_H
|
||||
|
||||
#include <BeBuild.h>
|
||||
|
||||
#include <OS.h>
|
||||
|
||||
typedef struct lock lock;
|
||||
typedef struct mlock mlock;
|
||||
|
||||
struct lock {
|
||||
sem_id s;
|
||||
long c;
|
||||
};
|
||||
|
||||
struct mlock {
|
||||
sem_id s;
|
||||
};
|
||||
|
||||
extern _IMPEXP_KERNEL int new_lock(lock *l, const char *name);
|
||||
extern _IMPEXP_KERNEL int free_lock(lock *l);
|
||||
|
||||
static inline status_t LOCK(lock *l)
|
||||
{
|
||||
if (atomic_add(&(l->c), -1) <= 0)
|
||||
return acquire_sem(l->s);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
static inline status_t UNLOCK(lock *l)
|
||||
{
|
||||
if (atomic_add(&(l->c), 1) < 0)
|
||||
return release_sem(l->s);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
//#define LOCK(l) if (atomic_add(&l.c, -1) <= 0) acquire_sem(l.s);
|
||||
//#define UNLOCK(l) if (atomic_add(&l.c, 1) < 0) release_sem(l.s);
|
||||
|
||||
extern _IMPEXP_KERNEL int new_mlock(mlock *l, long c, const char *name);
|
||||
extern _IMPEXP_KERNEL int free_mlock(mlock *l);
|
||||
|
||||
#define LOCKM(l,cnt) acquire_sem_etc(l.s, cnt, 0, 0)
|
||||
#define UNLOCKM(l,cnt) release_sem_etc(l.s, cnt, 0)
|
||||
|
||||
#endif
|
133
src/add-ons/kernel/file_systems/googlefs/makefile
Normal file
133
src/add-ons/kernel/file_systems/googlefs/makefile
Normal file
@ -0,0 +1,133 @@
|
||||
## BeOS Generic Makefile v2.2 ##
|
||||
|
||||
## Fill in this file to specify the project being created, and the referenced
|
||||
## makefile-engine will do all of the hard work for you. This handles both
|
||||
## Intel and PowerPC builds of the BeOS.
|
||||
|
||||
## Application Specific Settings ---------------------------------------------
|
||||
|
||||
# specify the name of the binary
|
||||
NAME= googlefs
|
||||
|
||||
# specify the type of binary
|
||||
# APP: Application
|
||||
# SHARED: Shared library or add-on
|
||||
# STATIC: Static library archive
|
||||
# DRIVER: Kernel Driver
|
||||
TYPE= DRIVER
|
||||
|
||||
# add support for new Pe and Eddie features
|
||||
# to fill in generic makefile
|
||||
|
||||
#%{
|
||||
# @src->@
|
||||
|
||||
# specify the source files to use
|
||||
# full paths or paths relative to the makefile can be included
|
||||
# all files, regardless of directory, will have their object
|
||||
# files created in the common object directory.
|
||||
# Note that this means this makefile will not work correctly
|
||||
# if two source files with the same name (source.c or source.cpp)
|
||||
# are included from different directories. Also note that spaces
|
||||
# in folder names do not work well with this makefile.
|
||||
SRCS= vnidpool.c \
|
||||
lists2.c \
|
||||
http_cnx.c \
|
||||
parse_google_html.c \
|
||||
google_request.c \
|
||||
query.c \
|
||||
googlefs.c \
|
||||
google_icon.c \
|
||||
attrs.c \
|
||||
settings.c \
|
||||
string_utils.c
|
||||
|
||||
# specify the resource files to use
|
||||
# full path or a relative path to the resource file can be used.
|
||||
RSRCS=
|
||||
|
||||
# @<-src@
|
||||
#%}
|
||||
|
||||
# end support for Pe and Eddie
|
||||
|
||||
# specify additional libraries to link against
|
||||
# there are two acceptable forms of library specifications
|
||||
# - if your library follows the naming pattern of:
|
||||
# libXXX.so or libXXX.a you can simply specify XXX
|
||||
# library: libbe.so entry: be
|
||||
#
|
||||
# - if your library does not follow the standard library
|
||||
# naming scheme you need to specify the path to the library
|
||||
# and it's name
|
||||
# library: my_lib.a entry: my_lib.a or path/my_lib.a
|
||||
LIBS=
|
||||
|
||||
# specify additional paths to directories following the standard
|
||||
# libXXX.so or libXXX.a naming scheme. You can specify full paths
|
||||
# or paths relative to the makefile. The paths included may not
|
||||
# be recursive, so include all of the paths where libraries can
|
||||
# be found. Directories where source files are found are
|
||||
# automatically included.
|
||||
LIBPATHS=
|
||||
|
||||
# additional paths to look for system headers
|
||||
# thes use the form: #include <header>
|
||||
# source file directories are NOT auto-included here
|
||||
SYSTEM_INCLUDE_PATHS =
|
||||
|
||||
# additional paths to look for local headers
|
||||
# thes use the form: #include "header"
|
||||
# source file directories are automatically included
|
||||
LOCAL_INCLUDE_PATHS =
|
||||
|
||||
# specify the level of optimization that you desire
|
||||
# NONE, SOME, FULL
|
||||
OPTIMIZE= FULL
|
||||
|
||||
# specify any preprocessor symbols to be defined. The symbols will not
|
||||
# have their values set automatically; you must supply the value (if any)
|
||||
# to use. For example, setting DEFINES to "DEBUG=1" will cause the
|
||||
# compiler option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG"
|
||||
# would pass "-DDEBUG" on the compiler's command line.
|
||||
#DEFINES= _IMPEXP_KERNEL= DEBUG_GOOGLEFS=1
|
||||
DEFINES+= _IMPEXP_KERNEL=
|
||||
#DEFINES+= DEBUG=1
|
||||
#DEBUG=1
|
||||
|
||||
# specify special warning levels
|
||||
# if unspecified default warnings will be used
|
||||
# NONE = supress all warnings
|
||||
# ALL = enable all warnings
|
||||
WARNINGS = ALL
|
||||
|
||||
# specify whether image symbols will be created
|
||||
# so that stack crawls in the debugger are meaningful
|
||||
# if TRUE symbols will be created
|
||||
SYMBOLS = TRUE
|
||||
|
||||
# specify debug settings
|
||||
# if TRUE will allow application to be run from a source-level
|
||||
# debugger. Note that this will disable all optimzation.
|
||||
DEBUGGER =
|
||||
|
||||
# specify additional compiler flags for all files
|
||||
COMPILER_FLAGS =
|
||||
|
||||
# specify additional linker flags
|
||||
LINKER_FLAGS =
|
||||
|
||||
# specify the version of this particular item
|
||||
# (for example, -app 3 4 0 d 0 -short 340 -long "340 "`echo -n -e '\302\251'`"1999 GNU GPL")
|
||||
# This may also be specified in a resource.
|
||||
APP_VERSION =
|
||||
|
||||
# (for TYPE == DRIVER only) Specify desired location of driver in the /dev
|
||||
# hierarchy. Used by the driverinstall rule. E.g., DRIVER_PATH = video/usb will
|
||||
# instruct the driverinstall rule to place a symlink to your driver's binary in
|
||||
# ~/add-ons/kernel/drivers/dev/video/usb, so that your driver will appear at
|
||||
# /dev/video/usb when loaded. Default is "misc".
|
||||
DRIVER_PATH =
|
||||
|
||||
## include the makefile-engine
|
||||
include $(BUILDHOME)/etc/makefile-engine
|
134
src/add-ons/kernel/file_systems/googlefs/makefile.ufs
Normal file
134
src/add-ons/kernel/file_systems/googlefs/makefile.ufs
Normal file
@ -0,0 +1,134 @@
|
||||
## BeOS Generic Makefile v2.2 ##
|
||||
|
||||
## Fill in this file to specify the project being created, and the referenced
|
||||
## makefile-engine will do all of the hard work for you. This handles both
|
||||
## Intel and PowerPC builds of the BeOS.
|
||||
|
||||
## Application Specific Settings ---------------------------------------------
|
||||
|
||||
# specify the name of the binary
|
||||
NAME= googlefs
|
||||
|
||||
# specify the type of binary
|
||||
# APP: Application
|
||||
# SHARED: Shared library or add-on
|
||||
# STATIC: Static library archive
|
||||
# DRIVER: Kernel Driver
|
||||
TYPE= SHARED
|
||||
|
||||
# add support for new Pe and Eddie features
|
||||
# to fill in generic makefile
|
||||
|
||||
#%{
|
||||
# @src->@
|
||||
|
||||
# specify the source files to use
|
||||
# full paths or paths relative to the makefile can be included
|
||||
# all files, regardless of directory, will have their object
|
||||
# files created in the common object directory.
|
||||
# Note that this means this makefile will not work correctly
|
||||
# if two source files with the same name (source.c or source.cpp)
|
||||
# are included from different directories. Also note that spaces
|
||||
# in folder names do not work well with this makefile.
|
||||
SRCS= vnidpool.c \
|
||||
lists2.c \
|
||||
http_cnx.c \
|
||||
parse_google_html.c \
|
||||
google_request.c \
|
||||
query.c \
|
||||
googlefs.c \
|
||||
google_icon.c \
|
||||
attrs.c \
|
||||
settings.c \
|
||||
string_utils.c
|
||||
|
||||
# specify the resource files to use
|
||||
# full path or a relative path to the resource file can be used.
|
||||
RSRCS=
|
||||
|
||||
# @<-src@
|
||||
#%}
|
||||
|
||||
# end support for Pe and Eddie
|
||||
|
||||
# specify additional libraries to link against
|
||||
# there are two acceptable forms of library specifications
|
||||
# - if your library follows the naming pattern of:
|
||||
# libXXX.so or libXXX.a you can simply specify XXX
|
||||
# library: libbe.so entry: be
|
||||
#
|
||||
# - if your library does not follow the standard library
|
||||
# naming scheme you need to specify the path to the library
|
||||
# and it's name
|
||||
# library: my_lib.a entry: my_lib.a or path/my_lib.a
|
||||
LIBS= _APP_ socket bind
|
||||
|
||||
# specify additional paths to directories following the standard
|
||||
# libXXX.so or libXXX.a naming scheme. You can specify full paths
|
||||
# or paths relative to the makefile. The paths included may not
|
||||
# be recursive, so include all of the paths where libraries can
|
||||
# be found. Directories where source files are found are
|
||||
# automatically included.
|
||||
LIBPATHS=
|
||||
|
||||
# additional paths to look for system headers
|
||||
# thes use the form: #include <header>
|
||||
# source file directories are NOT auto-included here
|
||||
SYSTEM_INCLUDE_PATHS =
|
||||
|
||||
# additional paths to look for local headers
|
||||
# thes use the form: #include "header"
|
||||
# source file directories are automatically included
|
||||
LOCAL_INCLUDE_PATHS =
|
||||
|
||||
# specify the level of optimization that you desire
|
||||
# NONE, SOME, FULL
|
||||
OPTIMIZE= FULL
|
||||
|
||||
# specify any preprocessor symbols to be defined. The symbols will not
|
||||
# have their values set automatically; you must supply the value (if any)
|
||||
# to use. For example, setting DEFINES to "DEBUG=1" will cause the
|
||||
# compiler option "-DDEBUG=1" to be used. Setting DEFINES to "DEBUG"
|
||||
# would pass "-DDEBUG" on the compiler's command line.
|
||||
DEFINES= DEBUG=1 _BUILDING_fs=1 _IMPEXP_KERNEL=
|
||||
#DEBUG=1
|
||||
|
||||
# specify special warning levels
|
||||
# if unspecified default warnings will be used
|
||||
# NONE = supress all warnings
|
||||
# ALL = enable all warnings
|
||||
WARNINGS = ALL
|
||||
|
||||
# specify whether image symbols will be created
|
||||
# so that stack crawls in the debugger are meaningful
|
||||
# if TRUE symbols will be created
|
||||
SYMBOLS = TRUE
|
||||
|
||||
# specify debug settings
|
||||
# if TRUE will allow application to be run from a source-level
|
||||
# debugger. Note that this will disable all optimzation.
|
||||
DEBUGGER =
|
||||
|
||||
# specify additional compiler flags for all files
|
||||
COMPILER_FLAGS =
|
||||
|
||||
# specify additional linker flags
|
||||
LINKER_FLAGS =
|
||||
|
||||
# specify the version of this particular item
|
||||
# (for example, -app 3 4 0 d 0 -short 340 -long "340 "`echo -n -e '\302\251'`"1999 GNU GPL")
|
||||
# This may also be specified in a resource.
|
||||
APP_VERSION =
|
||||
|
||||
# (for TYPE == DRIVER only) Specify desired location of driver in the /dev
|
||||
# hierarchy. Used by the driverinstall rule. E.g., DRIVER_PATH = video/usb will
|
||||
# instruct the driverinstall rule to place a symlink to your driver's binary in
|
||||
# ~/add-ons/kernel/drivers/dev/video/usb, so that your driver will appear at
|
||||
# /dev/video/usb when loaded. Default is "misc".
|
||||
DRIVER_PATH =
|
||||
|
||||
## include the makefile-engine
|
||||
include $(BUILDHOME)/etc/makefile-engine
|
||||
|
||||
_APP_:
|
||||
ln -s /boot/home/config/bin/UserlandFSServer _APP_
|
9
src/add-ons/kernel/file_systems/googlefs/makezip.sh
Executable file
9
src/add-ons/kernel/file_systems/googlefs/makezip.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
FILES="home/config/settings/kernel/drivers/googlefs home/config/add-ons/kernel/file_systems/googlefs home/config/add-ons/userlandfs/googlefs home/config/bin/ndmount home/config/bin/mountgooglefs home/config/bin/imlucky home/config/bin/google home/Desktop/README.googlefs.txt home/config/settings/Tracker/DefaultQueryTemplates/application_x-vnd.Be-bookmark"
|
||||
|
||||
cd /boot
|
||||
zip -r9 googlefs-test-bin.zip ${FILES}
|
||||
|
||||
|
||||
|
253
src/add-ons/kernel/file_systems/googlefs/parse_google_html.c
Normal file
253
src/add-ons/kernel/file_systems/googlefs/parse_google_html.c
Normal file
@ -0,0 +1,253 @@
|
||||
#include <errno.h>
|
||||
#include <sys/param.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <OS.h>
|
||||
#include "google_request.h"
|
||||
#include "string_utils.h"
|
||||
|
||||
#define TESTME
|
||||
|
||||
#ifdef _KERNEL_MODE
|
||||
#define printf dprintf
|
||||
#undef TESTME
|
||||
#endif
|
||||
|
||||
#define DBG "googlefs: parse_html: "
|
||||
|
||||
#ifdef TESTME
|
||||
#define BUFSZ (128*1024)
|
||||
#endif
|
||||
|
||||
//old
|
||||
//#define G_BEGIN_URL "<p class=g><a class=l href=\""
|
||||
#define G_BEGIN_URL "<div class=g><a class=l href=\""
|
||||
#define G_END_URL "\">"
|
||||
//#define G_BEGIN_NAME
|
||||
#define G_END_NAME "</a>"
|
||||
#define G_BEGIN_SNIPSET /*"<td class=j>"*/"<font size=-1>"
|
||||
#define G_END_SNIPSET "<br>"
|
||||
#define G_BEGIN_CACHESIM " <a class=fl href=\""
|
||||
#define G_END_CACHESIM "\">"
|
||||
|
||||
int google_parse_results(const char *html, size_t htmlsize, struct google_result **results)
|
||||
{
|
||||
struct google_result *res = NULL, *nres = NULL, *prev = NULL;
|
||||
const char *p, *q;
|
||||
char *nextresult = NULL;
|
||||
long numres = 0;
|
||||
long maxres = 0;
|
||||
long startid = 0;
|
||||
long lastid = 0;
|
||||
int done = 0;
|
||||
int err = ENOMEM;
|
||||
|
||||
if (!html || !results)
|
||||
return EINVAL;
|
||||
/* sanity checks */
|
||||
printf(DBG"sanity check...\n");
|
||||
if (strstr(html, "<html><head>") != html)
|
||||
return EINVAL;
|
||||
// p = strstr(html, "<title>Google Search:");
|
||||
p = strstr(html, "Google");
|
||||
if (!p) return EINVAL;
|
||||
p = strstr(html, "</head><body");
|
||||
if (!p) return EINVAL;
|
||||
p = strstr(html, ">Results <b>");
|
||||
if (!p) return EINVAL;
|
||||
p+= strlen(">Results <b>");
|
||||
startid = strtol(p, &p, 10);
|
||||
if (!p) return EINVAL;
|
||||
p = strstr(html, "</b> - <b>");
|
||||
p+= strlen("</b> - <b>");
|
||||
if (!p) return EINVAL;
|
||||
lastid = strtol(p, &p, 10);
|
||||
if (!p) return EINVAL;
|
||||
maxres = lastid - startid + 1;
|
||||
printf(DBG"getting %ld results (%ld to %ld)\n", maxres, startid, lastid);
|
||||
|
||||
|
||||
printf(DBG"parsing...\n");
|
||||
do {
|
||||
char *item;
|
||||
long itemlen;
|
||||
char *tmp;
|
||||
int i;
|
||||
nres = malloc(sizeof(struct google_result));
|
||||
if (!nres) {
|
||||
// XXX: cleanup!
|
||||
goto err0;
|
||||
}
|
||||
memset(nres, 0, sizeof(struct google_result));
|
||||
nres->id = startid + numres; //- 1;
|
||||
|
||||
/* find url */
|
||||
// <p class=g><a href=URL>
|
||||
if (!p) break;
|
||||
if (nextresult)
|
||||
p = nextresult;
|
||||
else
|
||||
p = strstr(p, G_BEGIN_URL);
|
||||
if (!p) break;
|
||||
p+= strlen(G_BEGIN_URL);
|
||||
nextresult = strstr(p, G_BEGIN_URL);
|
||||
//printf(DBG"[%ld] found token 1\n", numres);
|
||||
item = p;
|
||||
p = strstr(p, G_END_URL);
|
||||
if (!p) break;
|
||||
p+= strlen(G_END_URL);
|
||||
//printf(DBG"[%ld] found token 2\n", numres);
|
||||
itemlen = p - item - strlen(G_END_URL);
|
||||
itemlen = MIN(GR_MAX_URL-1, itemlen);
|
||||
strncpy(nres->url, item, itemlen);
|
||||
nres->url[itemlen] = '\0';
|
||||
|
||||
/* find name */
|
||||
//<b>Google</b> Web APIs - FAQ</a><table
|
||||
item = p;
|
||||
p = strstr(p, G_END_NAME);
|
||||
if (!p) break;
|
||||
p+= strlen(G_END_NAME);
|
||||
//printf(DBG"[%ld] found token 3\n", numres);
|
||||
itemlen = p - item - strlen(G_END_NAME);
|
||||
//itemlen = MIN(GR_MAX_NAME-1, itemlen);
|
||||
itemlen = MIN(GR_MAX_NAME*4-1, itemlen);
|
||||
q = malloc(itemlen+1);
|
||||
if (!q)
|
||||
goto err0;
|
||||
strncpy(q, item, itemlen);
|
||||
q[itemlen] = '\0';
|
||||
/* strip <*b> off */
|
||||
while ((tmp = strstr(q, "<b>")))
|
||||
strcpy(tmp, tmp + 3);
|
||||
while ((tmp = strstr(q, "</b>")))
|
||||
strcpy(tmp, tmp + 4);
|
||||
/* strip &foo; */
|
||||
tmp = unentitify_string(q);
|
||||
free(q);
|
||||
if (!tmp)
|
||||
goto err0;
|
||||
strncpy(nres->name, tmp, GR_MAX_NAME-1);
|
||||
nres->name[GR_MAX_NAME-1] = '\0';
|
||||
free(tmp);
|
||||
|
||||
#if 0
|
||||
/* find snipset */
|
||||
//<td class=j><font size=-1><b>...</b> a custom Java client library, documentation on <b>how</b> <b>to</b> use the <b>...</b> You can find it at http://<b>api</b>.<b>google</b>.com/GoogleSearch.wsdl <b>...</b> need to get started is in <b>googleapi</b>.jar <b>...</b> <br>
|
||||
if (!p) break;
|
||||
q = strstr(p, G_BEGIN_SNIPSET);
|
||||
if (q && (!nextresult || (q < nextresult))) {
|
||||
p = q;
|
||||
p+= strlen(G_BEGIN_SNIPSET);
|
||||
//printf(DBG"[%ld] found token 4\n", numres);
|
||||
item = p;
|
||||
p = strstr(p, G_END_SNIPSET);
|
||||
if (!p) break;
|
||||
p+= strlen(G_END_SNIPSET);
|
||||
//printf(DBG"[%ld] found token 5\n", numres);
|
||||
itemlen = p - item - strlen(G_END_SNIPSET);
|
||||
itemlen = MIN(GR_MAX_URL-1, itemlen);
|
||||
strncpy(nres->snipset, item, itemlen);
|
||||
nres->snipset[itemlen] = '\0';
|
||||
/* strip &foo; */
|
||||
tmp = unentitify_string(nres->snipset);
|
||||
if (!tmp)
|
||||
break;
|
||||
strncpy(nres->snipset, tmp, GR_MAX_SNIPSET-1);
|
||||
nres->snipset[GR_MAX_SNIPSET-1] = '\0';
|
||||
free(tmp);
|
||||
/* strip <*b> off */
|
||||
while ((tmp = strstr(nres->snipset, "<b>")))
|
||||
strcpy(tmp, tmp + 3);
|
||||
while ((tmp = strstr(nres->snipset, "</b>")))
|
||||
strcpy(tmp, tmp + 4);
|
||||
while ((tmp = strstr(nres->snipset, "\r")))
|
||||
strcpy(tmp, tmp + 1);
|
||||
while ((tmp = strstr(nres->snipset, "\n")))
|
||||
*tmp = ' ';
|
||||
}
|
||||
|
||||
#endif
|
||||
/* find cache/similar url */
|
||||
// <a class=fl href="http://216.239.59.104/search?q=cache:vR7BaPWutnkJ:www.google.com/apis/api_faq.html+google+api++help+%22frequently+asked%22+-plop&hl=en&lr=lang_en&ie=UTF-8">Cached</a>
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (!p) break;
|
||||
q = strstr(p, G_BEGIN_CACHESIM);
|
||||
if (q && nextresult && (q > nextresult)) {
|
||||
p = q;
|
||||
printf(DBG"[%ld] cache/sim beyond next\n", numres);
|
||||
p = nextresult; /* reset */
|
||||
} else if (q && (!nextresult || (q < nextresult))) {
|
||||
int iscache;
|
||||
p = q;
|
||||
p+= strlen(G_BEGIN_CACHESIM);
|
||||
//printf(DBG"[%ld] found token 6\n", numres);
|
||||
item = p;
|
||||
p = strstr(p, G_END_CACHESIM);
|
||||
if (!p) break;
|
||||
p+= strlen(G_END_CACHESIM);
|
||||
//printf(DBG"[%ld] found token 7\n", numres);
|
||||
itemlen = p - item - strlen(G_END_CACHESIM);
|
||||
itemlen = MIN(GR_MAX_URL-1, itemlen);
|
||||
if (!strncmp(p, "Cached", 6)) {
|
||||
strncpy(nres->cache_url, item, itemlen);
|
||||
nres->cache_url[itemlen] = '\0';
|
||||
} else if (!strncmp(p, "Similar", 7)) {
|
||||
strncpy(nres->similar_url, item, itemlen);
|
||||
nres->similar_url[itemlen] = '\0';
|
||||
}
|
||||
// else
|
||||
// break;
|
||||
}
|
||||
}
|
||||
|
||||
numres++;
|
||||
if (!prev)
|
||||
res = nres;
|
||||
else
|
||||
prev->next = nres;
|
||||
prev = nres;
|
||||
nres = NULL;
|
||||
} while (!done || numres < maxres);
|
||||
*results = res;
|
||||
return numres;
|
||||
err0:
|
||||
free(nres);
|
||||
while (res) {
|
||||
nres = res->next;
|
||||
free(res);
|
||||
res = nres;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef TESTME
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
struct google_result *results;
|
||||
struct google_result *tag1 = 0xaaaa5555, *res = NULL, *tag2 = 0x5555aaaa;
|
||||
size_t len;
|
||||
char *p;
|
||||
int err;
|
||||
|
||||
p = malloc(BUFSZ+8);
|
||||
len = read(0, p+4, BUFSZ);
|
||||
p[BUFSZ+4-1] = '\0';
|
||||
*(uint32 *)p = 0xa5a5a5a5;
|
||||
*(uint32 *)(&p[BUFSZ+4]) = 0x5a5a5a5a;
|
||||
err = google_parse_results(p+4, len, &results);
|
||||
printf("error 0x%08lx\n", err);
|
||||
if (err < 0)
|
||||
return 1;
|
||||
res = results;
|
||||
while (res) {
|
||||
printf("[%ld]:\nURL='%s'\nNAME='%s'\nSNIPSET='%s'\nCACHE='%s'\nSIMILAR='%s'\n\n", res->id, res->url, res->name, res->snipset, res->cache_url, res->similar_url);
|
||||
res = res->next;
|
||||
}
|
||||
printf("before = 0x%08lx:0x%08lx, after = 0x%08lx:0x%08lx\n", 0xa5a5a5a5, *(uint32 *)p, 0x5a5a5a5a, *(uint32 *)(&p[BUFSZ+4]));
|
||||
printf("before = 0x%08lx:0x%08lx, after = 0x%08lx:0x%08lx\n", 0xaaaa5555, tag1, 0x5555aaaa, tag2);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
181
src/add-ons/kernel/file_systems/googlefs/query.c
Normal file
181
src/add-ons/kernel/file_systems/googlefs/query.c
Normal file
@ -0,0 +1,181 @@
|
||||
#include "query.h"
|
||||
|
||||
//#define TESTME
|
||||
|
||||
#ifdef _KERNEL_MODE
|
||||
#define printf dprintf
|
||||
#undef TESTME
|
||||
#endif
|
||||
|
||||
#ifdef TESTME
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
// ('foo'<>"bar\"")&&!(()||())
|
||||
|
||||
void free_query_tree(query_exp *tree)
|
||||
{
|
||||
if (!tree)
|
||||
return;
|
||||
if (tree->op >= B_AND) {
|
||||
free_query_tree(tree->lv.exp);
|
||||
free_query_tree(tree->rv.exp);
|
||||
}
|
||||
free(tree->lv.str);
|
||||
free(tree->rv.str);
|
||||
free(tree);
|
||||
}
|
||||
|
||||
char *query_unescape_string(const char *q, const char **newq, char delim)
|
||||
{
|
||||
int backslash = 0;
|
||||
int i;
|
||||
char *p, *p2;
|
||||
p = malloc(10);
|
||||
if (!p)
|
||||
return NULL;
|
||||
for (i = 0; *q; i++) {
|
||||
if ((i % 10) == 9) {
|
||||
p2 = realloc(p, i+10);
|
||||
if (!p2) {
|
||||
free(p);
|
||||
return NULL;//p;
|
||||
}
|
||||
p = p2;
|
||||
}
|
||||
if (backslash) {
|
||||
backslash = 0;
|
||||
p[i] = *q;
|
||||
} else if (*q == '\\') {
|
||||
backslash = 1;
|
||||
i--;
|
||||
} else if (*q == '\0') {
|
||||
break;
|
||||
} else if (*q == delim) {
|
||||
break;
|
||||
} else {
|
||||
p[i] = *q;
|
||||
}
|
||||
q++;
|
||||
}
|
||||
p[i] = '\0';
|
||||
if (newq)
|
||||
*newq = q;
|
||||
if (i)
|
||||
return p;
|
||||
free(p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *query_strip_bracketed_Cc(char *str)
|
||||
{
|
||||
char *p = str;
|
||||
char c, C;
|
||||
while (*p) {
|
||||
if (*p == '[') {
|
||||
if (p[1] && p[2] && p[3] == ']') {
|
||||
c = p[1];
|
||||
C = p[2];
|
||||
//printf("cC = %c%c\n", c, C);
|
||||
if (C >= 'a' && C <= 'z' && (c == C + 'A' - 'a'))
|
||||
*p = C;
|
||||
else if (c >= 'a' && c <= 'z' && (C == c + 'A' - 'a'))
|
||||
*p = c;
|
||||
if (*p != '[') {
|
||||
strcpy(p+1, p + 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
enum pqs_state {
|
||||
QS_UNKNOWN,
|
||||
QS_PAREN,
|
||||
QS_QTR,
|
||||
QS_
|
||||
};
|
||||
|
||||
static const char *parse_qs_r(const char *query, query_exp *tree)
|
||||
{
|
||||
int parens = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
status_t query_parse(const char *query, query_exp **tree)
|
||||
{
|
||||
query_exp *t;
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
#ifdef TESTME
|
||||
|
||||
const char *strqop(query_op op)
|
||||
{
|
||||
switch (op) {
|
||||
#define QOP(_op) case _op: return #_op
|
||||
QOP(B_INVALID_OP);
|
||||
QOP(B_EQ);
|
||||
QOP(B_GT);
|
||||
QOP(B_GE);
|
||||
QOP(B_LT);
|
||||
QOP(B_LE);
|
||||
QOP(B_NE);
|
||||
QOP(B_CONTAINS);
|
||||
QOP(B_BEGINS_WITH);
|
||||
QOP(B_ENDS_WITH);
|
||||
QOP(B_AND);
|
||||
QOP(B_OR);
|
||||
QOP(B_NOT);
|
||||
#undef QOP
|
||||
default: return "B_?_OP";
|
||||
}
|
||||
}
|
||||
|
||||
#define INDC '#'
|
||||
|
||||
void dump_query_tree(query_exp *tree, int indent)
|
||||
{
|
||||
int i;
|
||||
if (!tree)
|
||||
return;
|
||||
if (tree->op >= B_AND) {
|
||||
for (i=0;i<indent;i++) printf("%c", INDC);
|
||||
printf(": %s {\n", strqop(tree->op));
|
||||
dump_query_tree(tree->lv.exp, indent+1);
|
||||
dump_query_tree(tree->rv.exp, indent+1);
|
||||
for (i=0;i<indent;i++) printf("%c", INDC);
|
||||
printf("}\n");
|
||||
} else {
|
||||
for (i=0;i<indent;i++) printf("%c", INDC);
|
||||
printf(": {%s} %s {%s}\n", tree->lv.str, strqop(tree->op), tree->rv.str);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
status_t err;
|
||||
query_exp *tree;
|
||||
char *p;
|
||||
if (argc < 2)
|
||||
return 1;
|
||||
/*
|
||||
err = query_parse(argv[1], &tree);
|
||||
if (err) {
|
||||
printf("parse_query_string: %s\n", strerror(err));
|
||||
return 1;
|
||||
}
|
||||
dump_query_tree(tree, 0);
|
||||
*/
|
||||
if (!strncmp(argv[1], "((name==\"*", 10)) {
|
||||
argv[1] += 10;
|
||||
}
|
||||
p = query_unescape_string(argv[1], NULL, '"');
|
||||
printf("'%s'\n", p);
|
||||
query_strip_bracketed_Cc(p);
|
||||
printf("'%s'\n", p);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
57
src/add-ons/kernel/file_systems/googlefs/query.h
Normal file
57
src/add-ons/kernel/file_systems/googlefs/query.h
Normal file
@ -0,0 +1,57 @@
|
||||
#ifndef _K_QUERY_H
|
||||
#define _K_QUERY_H
|
||||
|
||||
#include <OS.h>
|
||||
|
||||
#ifndef _QUERY_H
|
||||
/* already defined in Query.h */
|
||||
typedef enum {
|
||||
B_INVALID_OP = 0,
|
||||
B_EQ,
|
||||
B_GT,
|
||||
B_GE,
|
||||
B_LT,
|
||||
B_LE,
|
||||
B_NE,
|
||||
B_CONTAINS,
|
||||
B_BEGINS_WITH,
|
||||
B_ENDS_WITH,
|
||||
B_AND = 0x101,
|
||||
B_OR,
|
||||
B_NOT,
|
||||
_B_RESERVED_OP_ = 0x100000
|
||||
} query_op;
|
||||
#endif
|
||||
|
||||
struct query_exp;
|
||||
|
||||
struct query_term {
|
||||
struct query_exp *exp;
|
||||
char *str;
|
||||
/* uint32 type;
|
||||
union {
|
||||
int32 int32v;
|
||||
uint32 uint32v;
|
||||
int64 int64v;
|
||||
uint64 uint64v;
|
||||
bigtime_t bigtimev;
|
||||
char *strv;
|
||||
} val;
|
||||
*/
|
||||
};
|
||||
|
||||
typedef struct query_exp {
|
||||
query_op op;
|
||||
struct query_term lv;
|
||||
struct query_term rv;
|
||||
} query_exp;
|
||||
|
||||
/* this one dups the string */
|
||||
extern char *query_unescape_string(const char *q, const char **newq, char delim);
|
||||
|
||||
/* this oen is in-place */
|
||||
extern char *query_strip_bracketed_Cc(char *str);
|
||||
|
||||
extern status_t query_parse(const char *query, query_exp **tree);
|
||||
|
||||
#endif /* _K_QUERY_H */
|
133
src/add-ons/kernel/file_systems/googlefs/ringbuff.c
Normal file
133
src/add-ons/kernel/file_systems/googlefs/ringbuff.c
Normal file
@ -0,0 +1,133 @@
|
||||
/*
|
||||
* ring buffer funcs
|
||||
* (c) 2003, François Revol, revol@free.fr
|
||||
*/
|
||||
|
||||
#define _BUILDING_fs 1
|
||||
|
||||
//#define TEST_RB
|
||||
|
||||
#include <sys/param.h>
|
||||
#ifndef TEST_RB
|
||||
//#include "lock.h"
|
||||
#include "googlefs.h"
|
||||
#endif
|
||||
|
||||
#ifdef TEST_RB
|
||||
#include <OS.h>
|
||||
struct ring_buffer {
|
||||
size_t size;
|
||||
size_t current; /* index of next byte to read */
|
||||
size_t avail; /* number of bytes in */
|
||||
unsigned char data[0];
|
||||
};
|
||||
#define ASSERT(op) if (!(op)) debugger("ASSERT: " #op " in " __FILE__ ":" __FUNCTION__)
|
||||
#else
|
||||
#define ASSERT(op) if (!(op)) panic("ASSERT: %s in %s:%s", #op, __FILE__, __FUNCTION__)
|
||||
#endif
|
||||
|
||||
void rb_init(struct ring_buffer *rb, size_t size)
|
||||
{
|
||||
rb->size = size;
|
||||
rb->current = 0;
|
||||
rb->avail = 0;
|
||||
}
|
||||
|
||||
void rb_clear(struct ring_buffer *rb)
|
||||
{
|
||||
rb->avail = 0;
|
||||
rb->current = 0;
|
||||
}
|
||||
|
||||
size_t rb_can_write(struct ring_buffer *rb)
|
||||
{
|
||||
if (!rb)
|
||||
return 0;
|
||||
return (rb->size - rb->avail);
|
||||
}
|
||||
|
||||
size_t rb_can_read(struct ring_buffer *rb)
|
||||
{
|
||||
if (!rb)
|
||||
return 0;
|
||||
return rb->avail;
|
||||
}
|
||||
|
||||
size_t rb_write(struct ring_buffer *rb, void *data, size_t len)
|
||||
{
|
||||
size_t index, towrite, written;
|
||||
if (!rb)
|
||||
return 0;
|
||||
index = (rb->current + rb->avail) % rb->size;
|
||||
towrite = rb_can_write(rb);
|
||||
towrite = MIN(len, towrite);
|
||||
if (towrite < 1)
|
||||
return 0;
|
||||
len = rb->size - index;
|
||||
len = MIN(len, towrite);
|
||||
memcpy(((char *)rb->data)+index, data, len);
|
||||
rb->avail += len;
|
||||
written = len;
|
||||
if (len < towrite) {
|
||||
towrite -= len;
|
||||
len = MIN(towrite, rb_can_write(rb));
|
||||
index = 0;
|
||||
memcpy(((char *)rb->data)+index, ((char *)data)+written, len);
|
||||
rb->avail += len;
|
||||
written += len;
|
||||
}
|
||||
ASSERT(rb->avail <= rb->size);
|
||||
return written;
|
||||
}
|
||||
|
||||
size_t rb_read(struct ring_buffer *rb, void *data, size_t len)
|
||||
{
|
||||
size_t index, toread, got;
|
||||
if (!rb)
|
||||
return 0;
|
||||
index = rb->current;
|
||||
toread = rb_can_read(rb);
|
||||
toread = MIN(len, toread);
|
||||
if (toread < 1)
|
||||
return 0;
|
||||
len = rb->size - index;
|
||||
len = MIN(len, toread);
|
||||
memcpy(data, ((char *)rb->data)+index, len);
|
||||
rb->avail -= len;
|
||||
rb->current += len;
|
||||
got = len;
|
||||
if (len < toread) {
|
||||
toread -= len;
|
||||
len = MIN(toread, rb_can_read(rb));
|
||||
index = 0;
|
||||
memcpy(((char *)data)+got, ((char *)rb->data)+index, len);
|
||||
rb->current = len;
|
||||
rb->avail -= len;
|
||||
got += len;
|
||||
}
|
||||
ASSERT(rb->avail <= rb->size);
|
||||
return got;
|
||||
}
|
||||
|
||||
#ifdef TEST_RB
|
||||
int main(void)
|
||||
{
|
||||
struct _myrb {
|
||||
struct ring_buffer rb;
|
||||
char buff[10];
|
||||
} myrb;
|
||||
char buffer[10];
|
||||
char obuffer[10];
|
||||
int got, tow;
|
||||
rb_init(&myrb.rb, 10);
|
||||
while ((got = read(0, buffer, 10))) {
|
||||
int len, olen;
|
||||
len = rb_write(&myrb.rb, buffer, got);
|
||||
olen = rb_read(&myrb.rb, obuffer, 10);
|
||||
write(1, obuffer, olen);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
18
src/add-ons/kernel/file_systems/googlefs/ringbuff.h
Normal file
18
src/add-ons/kernel/file_systems/googlefs/ringbuff.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef _RINGBUFF_H
|
||||
#define _RINGBUFF_H
|
||||
|
||||
struct ring_buffer {
|
||||
size_t size;
|
||||
size_t current; /* index of next byte to read */
|
||||
size_t avail; /* number of bytes in */
|
||||
unsigned char data[0];
|
||||
};
|
||||
|
||||
void rb_init(struct ring_buffer *rb, size_t size);
|
||||
void rb_clear(struct ring_buffer *rb);
|
||||
size_t rb_can_write(struct ring_buffer *rb);
|
||||
size_t rb_can_read(struct ring_buffer *rb);
|
||||
size_t rb_write(struct ring_buffer *rb, void *data, size_t len);
|
||||
size_t rb_read(struct ring_buffer *rb, void *data, size_t len);
|
||||
|
||||
#endif
|
50
src/add-ons/kernel/file_systems/googlefs/settings.c
Normal file
50
src/add-ons/kernel/file_systems/googlefs/settings.c
Normal file
@ -0,0 +1,50 @@
|
||||
#include <stdlib.h>
|
||||
#include <driver_settings.h>
|
||||
#include "settings.h"
|
||||
|
||||
#define DEFAULT_GOOGLE_SERVER "66.102.11.99"
|
||||
#define DEFAULT_MAX_VNODES 5000
|
||||
char google_server[20] = DEFAULT_GOOGLE_SERVER;
|
||||
int google_server_port = 80;
|
||||
uint32 max_vnodes = DEFAULT_MAX_VNODES;
|
||||
uint32 max_results = 50;
|
||||
bool sync_unlink_queries = false;
|
||||
|
||||
status_t load_settings(void)
|
||||
{
|
||||
void *handle;
|
||||
char *val;
|
||||
handle = load_driver_settings("googlefs");
|
||||
if (!handle)
|
||||
return ENOENT;
|
||||
|
||||
dprintf("googlefs: loaded settings\n");
|
||||
|
||||
val = get_driver_parameter(handle, "server", \
|
||||
DEFAULT_GOOGLE_SERVER, DEFAULT_GOOGLE_SERVER);
|
||||
strncpy(google_server, val, 20);
|
||||
google_server[20-1] = '\0';
|
||||
|
||||
val = get_driver_parameter(handle, "port", "80", "80");
|
||||
google_server_port = strtoul(val, NULL, 10);
|
||||
|
||||
val = get_driver_parameter(handle, "max_nodes", "5000", "5000");
|
||||
max_vnodes = strtoul(val, NULL, 10);
|
||||
max_vnodes = MIN(max_vnodes, 1000000);
|
||||
max_vnodes = MAX(max_vnodes, 10);
|
||||
|
||||
val = get_driver_parameter(handle, "max_results", "50", "50");
|
||||
max_results = strtoul(val, NULL, 10);
|
||||
max_results = MIN(max_results, 1000);
|
||||
max_results = MAX(max_results, 5);
|
||||
|
||||
sync_unlink_queries = get_driver_boolean_parameter(handle, "sync_unlink", false, true);
|
||||
|
||||
dprintf("googlefs: settings: server = %s\n", google_server);
|
||||
dprintf("googlefs: settings: max_nodes = %lu\n", max_vnodes);
|
||||
dprintf("googlefs: settings: max_results = %lu\n", max_results);
|
||||
dprintf("googlefs: settings: sync_unlink = %c\n", sync_unlink_queries?'t':'f');
|
||||
unload_driver_settings(handle);
|
||||
return B_OK;
|
||||
}
|
||||
|
13
src/add-ons/kernel/file_systems/googlefs/settings.h
Normal file
13
src/add-ons/kernel/file_systems/googlefs/settings.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef _SETTINGS_H
|
||||
#define _SETTINGS_H
|
||||
|
||||
/* settings */
|
||||
extern char google_server[20];
|
||||
extern int google_server_port;
|
||||
extern uint32 max_vnodes;
|
||||
extern uint32 max_results;
|
||||
extern bool sync_unlink_queries;
|
||||
|
||||
extern status_t load_settings(void);
|
||||
|
||||
#endif /* _SETTINGS_H */
|
153
src/add-ons/kernel/file_systems/googlefs/string_utils.c
Normal file
153
src/add-ons/kernel/file_systems/googlefs/string_utils.c
Normal file
@ -0,0 +1,153 @@
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include "string_utils.h"
|
||||
|
||||
//#define TESTME
|
||||
|
||||
#ifdef _KERNEL_MODE
|
||||
#define printf dprintf
|
||||
#undef TESTME
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
char *urlify_string(const char *str)
|
||||
{
|
||||
char *dst, *d;
|
||||
const char *p;
|
||||
const char *allowed = "abcdefghijklmnopqrstuvwxyz" \
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
|
||||
"0123456789" \
|
||||
"-_.!~*'()"; /* cf. RFC 2396 */
|
||||
const char *hex = "0123456789ABCDEF";
|
||||
if (!str)
|
||||
return NULL;
|
||||
// hacky, but safe
|
||||
dst = malloc(strlen(str)*3);
|
||||
if (!dst)
|
||||
return NULL;
|
||||
for (p = str, d = dst; *p; p++) {
|
||||
if (strchr(allowed, *p))
|
||||
*d++ = *p;
|
||||
else if (*p == ' ') {
|
||||
*d++ = '+';
|
||||
} else {
|
||||
/* use hex value */
|
||||
*d++ = '%';
|
||||
*d++ = hex[(*(unsigned char *)p >> 4) & 0x0F];
|
||||
*d++ = hex[(*(unsigned char *)p) & 0x0F];
|
||||
}
|
||||
}
|
||||
*d = '\0';
|
||||
return dst;
|
||||
}
|
||||
|
||||
// cf. http://www.htmlhelp.com/reference/html40/entities/
|
||||
|
||||
static const char *entities_tab[][2] = {
|
||||
{ "lt", "<" },
|
||||
{ "gt", ">" },
|
||||
{ "amp", "&" },
|
||||
{ "nbsp", " " },
|
||||
{ "quot", "\"" },
|
||||
{ "raquo", "»" },
|
||||
//{ "laquo", "" },
|
||||
{ "ccedil", "ç" },
|
||||
// grave
|
||||
{ "agrave", "à" },
|
||||
{ "egrave", "è" },
|
||||
// acute
|
||||
//{ "aacute", "" },
|
||||
{ "eacute", "é" },
|
||||
// circ
|
||||
{ "acirc", "â" },
|
||||
{ "ecirc", "ê" },
|
||||
{ "icirc", "î" },
|
||||
{ "ocirc", "ô" },
|
||||
{ "ucirc", "û" },
|
||||
{ "copy", "©" },
|
||||
{ "trade", "™" },
|
||||
//{ "", "" },
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
char *unentitify_string(const char *str)
|
||||
{
|
||||
char *dst, *d;
|
||||
const char *p;
|
||||
const char *hex = "0123456789abcdef";
|
||||
int i;
|
||||
if (!str)
|
||||
return NULL;
|
||||
// hacky, but safe
|
||||
dst = malloc(strlen(str)+2);
|
||||
if (!dst)
|
||||
return NULL;
|
||||
for (p = str, d = dst; *p; p++) {
|
||||
if (*p != '&')
|
||||
*d++ = *p;
|
||||
/* those case convert to binary, but won't check for valid multibyte UTF-8 sequences */
|
||||
else if ((p[1] == '#') && p[2] && p[3] && (p[4] == ';') &&
|
||||
isdigit(p[2]) &&
|
||||
isdigit(p[3])) {
|
||||
/* &#nn; */
|
||||
char c = ((p[2]) - '0') * 10 +
|
||||
((p[3]) - '0');
|
||||
*d++ = c;
|
||||
p += 4;
|
||||
} else if ((p[1] == '#') && p[2] && p[3] && p[4] && (p[5] == ';') &&
|
||||
isdigit(p[2]) &&
|
||||
isdigit(p[3]) &&
|
||||
isdigit(p[4])) {
|
||||
/* &#nnn; */
|
||||
char c = ((p[2]) - '0') * 100 +
|
||||
((p[3]) - '0') * 10 +
|
||||
((p[4]) - '0');
|
||||
*d++ = c;
|
||||
p += 5;
|
||||
} else if ((p[1] == '#') && (p[2] == 'x') && p[3] && p[4] && (p[5] == ';') &&
|
||||
strchr(hex, tolower(p[3])) &&
|
||||
strchr(hex, tolower(p[4]))) {
|
||||
/* &#xnn; */
|
||||
char c = (strchr(hex, tolower(p[3])) - hex) << 4 |
|
||||
(strchr(hex, tolower(p[4])) - hex);
|
||||
*d++ = c;
|
||||
p += 5;
|
||||
} else {
|
||||
char buf[20];
|
||||
strncpy(buf, p+1, 20);
|
||||
buf[19] = '\0';
|
||||
if (!strchr(buf, ';')) {
|
||||
*d++ = *p;
|
||||
continue;
|
||||
}
|
||||
*(strchr(buf, ';')) = '\0';
|
||||
for (i = 0; entities_tab[i][0]; i++) {
|
||||
if (!strcmp(buf, entities_tab[i][0])) {
|
||||
strcpy(d, entities_tab[i][1]);
|
||||
d += strlen(d);
|
||||
p += strlen(entities_tab[i][0]) + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!entities_tab[i][0]) /* not found */
|
||||
*d++ = '&';
|
||||
}
|
||||
}
|
||||
*d = '\0';
|
||||
return dst;
|
||||
}
|
||||
|
||||
#ifdef TESTME
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *p;
|
||||
if (argc < 2)
|
||||
return 1;
|
||||
p = unentitify_string(argv[1]);
|
||||
printf("'%s'\n", p);
|
||||
free(p);
|
||||
free(malloc(10));
|
||||
return 0;
|
||||
}
|
||||
#endif
|
16
src/add-ons/kernel/file_systems/googlefs/string_utils.h
Normal file
16
src/add-ons/kernel/file_systems/googlefs/string_utils.h
Normal file
@ -0,0 +1,16 @@
|
||||
#ifndef _STRING_UTILS_H
|
||||
#define _STRING_UTILS_H
|
||||
|
||||
/* converts a string to a format suitable for use in urls
|
||||
* ex: "foo bar+" -> "foo+bar%2D"
|
||||
* caller must free() result
|
||||
*/
|
||||
extern char *urlify_string(const char *str);
|
||||
|
||||
/* converts string with html entities to regular utf-8 string
|
||||
* ex: "François" -> "François"
|
||||
* caller must free() result
|
||||
*/
|
||||
extern char *unentitify_string(const char *str);
|
||||
|
||||
#endif /* _STRING_UTILS_H */
|
96
src/add-ons/kernel/file_systems/googlefs/vnidpool.c
Normal file
96
src/add-ons/kernel/file_systems/googlefs/vnidpool.c
Normal file
@ -0,0 +1,96 @@
|
||||
#include <malloc.h>
|
||||
#include "vnidpool.h"
|
||||
|
||||
/* primary type for the bitmap */
|
||||
#define BMT uint32
|
||||
|
||||
#define BM_BYTE(p, vnid) (p->bitmap[(vnid % p->bmsize) / sizeof(BMT)])
|
||||
#define BM_ISSET(p, vnid) (BM_BYTE(p, vnid) & (1 << (p->nextvnid % sizeof(BMT))))
|
||||
#define BM_SET(p, vnid) (BM_BYTE(p, vnid) |= (1 << (p->nextvnid % sizeof(BMT))))
|
||||
#define BM_UNSET(p, vnid) (BM_BYTE(p, vnid) &= ~(1 << (p->nextvnid % sizeof(BMT))))
|
||||
|
||||
status_t vnidpool_alloc(struct vnidpool **pool, size_t size)
|
||||
{
|
||||
struct vnidpool *p;
|
||||
if (size < 2)
|
||||
return EINVAL;
|
||||
if (!pool)
|
||||
return EINVAL;
|
||||
size = (size + sizeof(BMT) - 1) / sizeof(BMT);
|
||||
size *= sizeof(BMT);
|
||||
p = malloc(sizeof(struct vnidpool) + size / sizeof(BMT));
|
||||
if (!p)
|
||||
return B_NO_MEMORY;
|
||||
if (new_lock(&p->lock, "vnidpool lock") < B_OK) {
|
||||
free(p);
|
||||
return B_NO_MEMORY;
|
||||
}
|
||||
p->nextvnid = 1LL;
|
||||
p->bitmap = (BMT *)(p + 1);
|
||||
p->bmsize = size;
|
||||
memset(p->bitmap, 0, size / sizeof(BMT));
|
||||
dprintf("vnidpool_alloc: pool @ %p, bitmap @ %p, size %d\n", p, p->bitmap, p->bmsize);
|
||||
*pool = p;
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t vnidpool_free(struct vnidpool *pool) {
|
||||
int i;
|
||||
dprintf("vnidpool_free: pool @ %p\n", pool);
|
||||
if (!pool)
|
||||
return EINVAL;
|
||||
if (LOCK(&pool->lock) < B_OK)
|
||||
return B_ERROR;
|
||||
/* make sure no vnid is left in use */
|
||||
for (i = 0; i < (pool->bmsize % sizeof(BMT)); i++) {
|
||||
if (pool->bitmap[i])
|
||||
dprintf("WARNING: vnidpool_free called with vnids still in use!!!\n");
|
||||
//panic("vnidpool_free: vnids still in use");
|
||||
}
|
||||
free_lock(&pool->lock);
|
||||
free(pool);
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
status_t vnidpool_get(struct vnidpool *pool, vnode_id *vnid)
|
||||
{
|
||||
status_t err = B_ERROR;
|
||||
uint32 i;
|
||||
if (!pool)
|
||||
return EINVAL;
|
||||
if (LOCK(&pool->lock) < B_OK)
|
||||
return B_ERROR;
|
||||
for (i = 0; BM_ISSET(pool, pool->nextvnid) && i < pool->bmsize; pool->nextvnid++, i++) {
|
||||
/* avoid 0 as vnid */
|
||||
if (!pool->nextvnid)
|
||||
continue;
|
||||
}
|
||||
if (BM_ISSET(pool, pool->nextvnid))
|
||||
err = ENOBUFS;
|
||||
else {
|
||||
BM_SET(pool, pool->nextvnid);
|
||||
*vnid = pool->nextvnid++;
|
||||
err = B_OK;
|
||||
}
|
||||
UNLOCK(&pool->lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
status_t vnidpool_put(struct vnidpool *pool, vnode_id vnid)
|
||||
{
|
||||
status_t err = B_ERROR;
|
||||
uint32 i;
|
||||
if (!pool)
|
||||
return EINVAL;
|
||||
if (LOCK(&pool->lock) < B_OK)
|
||||
return B_ERROR;
|
||||
if (!BM_ISSET(pool, vnid))
|
||||
err = EINVAL;
|
||||
else {
|
||||
BM_UNSET(pool, vnid);
|
||||
err = B_OK;
|
||||
}
|
||||
UNLOCK(&pool->lock);
|
||||
return err;
|
||||
}
|
||||
|
18
src/add-ons/kernel/file_systems/googlefs/vnidpool.h
Normal file
18
src/add-ons/kernel/file_systems/googlefs/vnidpool.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef _VNIDPOOL_H
|
||||
#define _VNIDPOOL_H
|
||||
|
||||
#include "googlefs.h"
|
||||
|
||||
typedef struct vnidpool {
|
||||
lock lock;
|
||||
vnode_id nextvnid;
|
||||
uint32 *bitmap;
|
||||
size_t bmsize;
|
||||
} vnidpool;
|
||||
|
||||
status_t vnidpool_alloc(struct vnidpool **pool, size_t size);
|
||||
status_t vnidpool_free(struct vnidpool *pool);
|
||||
status_t vnidpool_get(struct vnidpool *pool, vnode_id *vnid);
|
||||
status_t vnidpool_put(struct vnidpool *pool, vnode_id vnid);
|
||||
|
||||
#endif /* _VNIDPOOL_H */
|
Loading…
Reference in New Issue
Block a user