source: abuse/tags/pd/macabuse/src/net/mac/atalk.hpp @ 49

Last change on this file since 49 was 49, checked in by Sam Hocevar, 11 years ago
  • Imported original public domain release, for future reference.
File size: 5.6 KB
Line 
1#include "sock.hpp"
2#include "dprint.hpp"
3//#define dprintf printf
4
5#include <string.h>
6#include <stdio.h>
7#include <AppleTalk.h>
8#include <ADSP.h>
9
10#include "isllist.hpp"
11
12#define MAXSOCKS 30
13#define QSIZE 1024
14
15class atalk_address : public net_address
16{
17public :
18  AddrBlock addr;
19
20        atalk_address(short net, short node)
21        {
22                addr.aNet = net;
23                addr.aNode = node;
24                addr.aSocket = 0;
25        }
26  atalk_address(AddrBlock *Addr)
27  {
28        memcpy(&addr,Addr,sizeof(addr));
29  }
30  atalk_address() {}
31
32  virtual protocol protocol_type() const { return net_address::ATALK; }
33  int get_port() { return addr.aSocket; }
34
35  virtual int equal(const net_address *who) const
36  {
37    if (who->protocol_type()==ATALK &&
38                                (addr.aNet == ((atalk_address *)who)->addr.aNet) &&
39                                (addr.aNode == ((atalk_address *)who)->addr.aNode))
40                        return 1;
41    else
42        return 0;
43  }
44  virtual int set_port(int port)  { return addr.aSocket=port; }
45
46  virtual void print()
47  {
48    dprintf("%d:%d:%d",addr.aNet,addr.aNode,addr.aSocket);
49  }
50  net_address *copy()  { return new atalk_address(&addr); }
51  void store_string(char *st, int st_length)
52  {
53    char buf[100];
54    sprintf(buf,"%d:%d:%d",addr.aNet,addr.aNode,addr.aSocket);
55    strncpy(st,buf,st_length);
56    st[st_length-1]=0;   
57  }
58};
59
60class atalk_base : public net_socket
61{
62protected:
63  int num;
64  int select_flags;
65public:
66        int select_count()
67        {
68                return ( ((select_flags&1 && ready_to_read())? 1 : 0)
69                                         + ((select_flags&2 && ready_to_write())? 1 : 0) );
70        }
71
72  atalk_base(int fd);
73  virtual ~atalk_base();
74
75  virtual void read_selectable() { select_flags |= 1; }
76  virtual void read_unselectable() { select_flags &= ~1; }
77  virtual void write_selectable() { select_flags |= 2; }
78  virtual void write_unselectable() { select_flags &= ~2; }
79 
80  int get_fd() { return num; } 
81};
82
83class adsp_listener;
84class atalk_protocol;
85
86class adsp_socket : public atalk_base
87{
88        friend adsp_listener;
89private:
90        TRCCB   ccb;
91protected:
92        DSPParamBlock   dsp;
93        char send_queue[QSIZE];
94        char recv_queue[QSIZE];
95        char attn_buff[attnBufSize];
96        short   conn;
97public :
98  adsp_socket(int fd);
99        int open(atalk_address *addr);
100        void cleanup();
101        virtual ~adsp_socket() { cleanup(); }
102
103  virtual int error();
104  virtual int ready_to_read();
105  virtual int ready_to_write();                 
106
107  virtual int read(void *buf, int size, net_address **addr);
108  virtual int write(void *buf, int size, net_address *addr=NULL);
109};
110
111class adsp_listener : public atalk_base
112{
113        friend atalk_protocol;
114private:
115        TRCCB   ccb;
116protected:
117        DSPParamBlock   dsp;
118        short   conn;
119        int listening;
120public:
121  adsp_listener(int fd);
122        void cleanup();
123        virtual ~adsp_listener() { cleanup(); }
124
125  virtual int error() { return 0; }
126  virtual int ready_to_read();
127  virtual int ready_to_write() { return 0; }
128
129  virtual int listen(int port);
130  virtual net_socket *accept(net_address *&addr);
131
132  virtual void write_selectable() { return; }
133  virtual void write_unselectable() { return; }
134
135  virtual int read(void *buf, int size, net_address **addr) { return 0; }
136  virtual int write(void *buf, int size, net_address *addr=NULL) { return 0; }
137};
138
139class ddp_socket : public atalk_base
140{
141protected:
142        ATDDPRec ddp;
143        char buffer[602 + 20 + 602*16];
144        short socket;
145
146        struct sPacket
147        {
148                long Count;
149                AddrBlock Addr;
150                long Data;
151        };
152        struct sDDPBuff
153        {
154                struct sPacket *Start,*End,*Head,*Tail;
155                long Count;
156                long Data;
157        };
158public :
159
160        AddrBlock def_addr;
161        short get_socket() const { return socket; }
162
163  ddp_socket(int fd);
164        void cleanup();
165  virtual ~ddp_socket() { cleanup(); }
166
167  virtual int error();
168  virtual int ready_to_read();
169  virtual int ready_to_write() { return 1; }
170
171  virtual int read(void *buf, int size, net_address **addr);
172  virtual int write(void *buf, int size, net_address *addr=NULL);
173};
174
175class atalk_protocol : public net_protocol
176{
177        friend adsp_listener;
178        friend ddp_socket;
179       
180protected:
181        MPPParamBlock mpp,nbp;
182        NamesTableEntry NTEName;
183        Str32 Name;
184        atalk_base *socket[MAXSOCKS];
185        int usage[MAXSOCKS];
186        int free;
187        int ok;
188        short listener;
189        int registered;
190        int querying;
191        char Buff[(586+2)*10 + 20];
192       
193        // Zone information
194        enum { MAXZONENAMES = 1024 };
195        struct sZoneBlock
196        {
197                char Name[1024];
198        };
199        typedef isllist<sZoneBlock*>::iterator p_zoneblock;
200        isllist<sZoneBlock*> zones;
201        char *(ZoneName[MAXZONENAMES]);
202        long last_pos;
203        sZoneBlock *last_block;
204        int num_zones;
205        Str255 MyZone;
206       
207  // Request Data
208  struct RequestItem
209  {
210        atalk_address *addr;
211        char name[256];   //name
212  };
213  typedef isllist<RequestItem *>::iterator p_request;
214  isllist<RequestItem*> servers,returned;
215public :
216        int new_socket();
217        void free_socket(int num);
218
219  atalk_protocol();
220  virtual ~atalk_protocol() { cleanup(); }
221
222  net_address *get_local_address();
223  net_address *get_node_address(char *&server_name, int def_port, int force_port);
224  net_socket *connect_to_server(net_address *addr,
225                                net_socket::socket_type sock_type=net_socket::SOCKET_SECURE);
226  net_socket *create_listen_socket(int &port, net_socket::socket_type sock_type);
227  int installed() { return ok; }
228  char *name() { return "AppleTalk"; }
229  void cleanup();
230  int select(int block);          // return # of sockets available for read & writing
231
232  // Notification methods
233  virtual net_socket *start_notify(int port, void *data, int len);
234  virtual void end_notify();
235
236  // Find notifiers methods
237  virtual net_address *find_address(int port, char *name);   // name should be a 256 byte buffer
238  virtual void reset_find_list();
239 
240  // Specialized Zone stuff
241  char **GetZones(int &num);
242  int GetMyZone(char *);
243  void SetZone(char *);
244  void AddZone(unsigned char *name);   // pascal string
245  void FreeZones();
246};
247
248extern atalk_protocol atalk;
249
Note: See TracBrowser for help on using the repository browser.