1/*
2 * Copyright 2004-2008, Fran��ois Revol, <revol@free.fr>.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _WEBSEARCHFS_H
6#define _WEBSEARCHFS_H
7
8/* wrappers */
9#ifdef __HAIKU__
10
11#include <fs_interface.h>
12#include <fs_info.h>
13#include <private/shared/locks.h>
14#include <NodeMonitor.h>
15#define lock mutex
16#define new_lock mutex_init
17#define free_lock mutex_destroy
18#define LOCK mutex_lock
19#define UNLOCK mutex_unlock
20typedef dev_t nspace_id;
21#endif
22
23#include "lists2.h"
24
25#include <Errors.h>
26#include <sys/stat.h>
27#include <SupportDefs.h>
28
29/* should be more than enough */
30//#define WEBSEARCHFS_NAME_LEN B_OS_NAME_LENGTH
31//#define WEBSEARCHFS_NAME_LEN 64 /* GR_MAX_NAME */
32/* some DuckDuckGo results are a bit more than 64 */
33#define WEBSEARCHFS_NAME_LEN 70 /* GR_MAX_NAME */
34
35#define WEBSEARCHFS_NAME "websearchfs"
36#define WEBSEARCHFS_PRETTY_NAME "Web Search Bookmark File System"
37
38#define MAX_VNIDS 5000
39
40#ifdef __cplusplus
41extern "C" {
42#endif
43
44struct attr_entry {
45	const char *name;
46	uint32 type;
47	size_t size;
48	void *value;
49};
50
51#undef ASSERT
52#define ASSERT(op) if (!(op)) panic("ASSERT: %s in %s:%s", #op, __FILE__, __FUNCTION__)
53
54struct mount_fs_params
55{
56	/* no param */
57};
58
59struct fs_file_cookie;
60
61struct fs_node
62{
63	struct fs_node *nlnext; /* node list */
64	struct fs_node *qnext; /* query list */
65	struct fs_node *next; /* next in folder */
66	struct fs_node *parent, *children;
67	struct fs_file_cookie *opened; /* opened on this node */
68
69	char name[WEBSEARCHFS_NAME_LEN];
70	ino_t vnid;
71	lock l;
72
73	int is_perm:1;	/* don't delete on last close */
74	int deleted:1;
75	int qcompleted:1;
76	int hidden:1;	/* don't list in readdir */
77	struct stat st; /* including S_IFDIR in st_mode */
78	struct duckduckgo_request *request; /* set on root folder for a query */
79	struct duckduckgo_result *result; /* for query results */
80	struct attr_entry *attrs_indirect;
81	struct attr_entry attrs[10];
82	void *data;
83	size_t data_size;
84};
85
86struct vnidpool;
87
88struct fs_nspace
89{
90	nspace_id nsid;
91	ino_t rootid;
92	struct vnidpool *vnids;
93	struct fs_node *root; /* fast access for stat time change */
94	struct fs_node *nodes;
95	struct fs_node *queries;
96	int32 nodecount; /* just for statvfs() */
97
98	lock l;
99};
100
101struct fs_file_cookie
102{
103	struct fs_file_cookie *next; /* must stay here */
104	struct fs_node *node;
105	int dir_current; /* current entry for readdir() */
106	int omode;
107	int type; /* S_IF* of the *cookie* */
108	struct attr_entry *attr;
109};
110/* just for type */
111#define     S_IFQUERY                     00000070000
112
113typedef struct attr_entry attr_entry;
114typedef struct fs_nspace fs_nspace;
115typedef struct fs_node fs_node;
116typedef struct fs_file_cookie fs_file_cookie;
117/* not much different */
118#define fs_dir_cookie fs_file_cookie
119#define fs_attr_dir_cookie fs_file_cookie
120#define fs_query_cookie fs_file_cookie
121
122ino_t new_vnid(fs_nspace *ns);
123
124int websearchfs_event(fs_nspace *ns, fs_node *node, int flags);
125
126/* used by the requester to publish entries in queries
127 * result = NULL to notify end of list
128 */
129extern int websearchfs_push_result_to_query(struct duckduckgo_request *request,
130	struct duckduckgo_result *result);
131
132#ifdef __cplusplus
133}
134#endif
135
136#endif
137