summaryrefslogtreecommitdiff
path: root/apps/JAWS/server/VFS.h
blob: 845dc3af1efcf0dbf6b46d7ef858b92460b90993 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// VFS.h

// Associate URI's to real path.
// Hash on URI.
// Maintain a table of files which are opened.
// Return a handle to the file, and provide I/O mechanisms for it.

#if !defined (VFS_H)
#define VFS_H

#include "JAWS/server/JXH_List.h"

#include "ace/Mem_Map.h"
#include "ace/Singleton.h"
#include "ace/Synch.h"

class JAWS_VFS_Node
{
public:
  JAWS_VFS_Node (char *uri);
  ~JAWS_VFS_Node (void);

  char const * URI (void) const;
  int status (void) const;

  void open (void);
  // This if for TransmitFile.

  int map_read (void);
  // HTTP GET: File transfer without TransmitFile

  int map_write (u_long size);
  // HTTP PUT

  void *addr (void) const;
  // Address of memory mapped region

  ACE_HANDLE get_handle (void) const;
  // HTTP GET: TransmitFile
  
  unsigned long size (void) const;
  // File size

private:
  void uritopath (void);

  int open (int flags);

private:
  ACE_Mem_Map file_mapping_;

  char *uri_;
  char path_[MAXPATHLEN+1];

  //  void *file_;
  //  char buf_[BUFSIZ];

  struct stat stat_;
  ACE_HANDLE handle_;

  int status_;

  enum { NOT_OPEN, OPENED, MAPPED_READ, MAPPED_READWRITE };
  u_long map_state_;
};

class JAWS_VFS_Node_List : public JXH_List<JAWS_VFS_Node *>
{
public:
  JAWS_VFS_Node_List (int sz);
};

#include "JAWS/server/VFS_T.h"

class JAWS_VFS_Hash_Table
{
public:
  JAWS_VFS_Hash_Table ();

  ~JAWS_VFS_Hash_Table ();

  JAWS_VFS_Node * operator[] (char *URI);

private:
  int hashfunction (char *key) const;

private:
  JAWS_VFS_Node_Bucket<ACE_Thread_Mutex> *ht_;
};

class JAWS_VFS
{
public:
  int open (char *URI, JAWS_VFS_Node * &handle);
  int close (JAWS_VFS_Node * &handle);
  
private:
  JAWS_VFS_Hash_Table hash_;
};

typedef ACE_Singleton <JAWS_VFS, ACE_Thread_Mutex> VFS;

#endif /* VFS_H */

/// Local Variables:
/// mode: c++
/// End: