-
Notifications
You must be signed in to change notification settings - Fork 0
/
diskbrowser.c
197 lines (153 loc) · 4.88 KB
/
diskbrowser.c
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
/*********************************************************************
* Disk browser main program & initialization
*********************************************************************/
#pragma rtl
#include <finder.h>
#include <list.h>
#include <locator.h>
#include <memory.h>
#include <menu.h>
#include <resources.h>
#include <tcpip.h>
#include <orca.h>
#include "mounturl.h"
#include "json.h"
#include "diskbrowser.h"
#include "browserevents.h"
#include "browserwindow.h"
#include "diskmount.h"
/* The browser window */
GrafPortPtr window;
/* Is the window open? */
Boolean windowOpened;
/* Is the resource manager started for our user ID? */
Boolean resourceStarted = false;
/* Disks list control */
CtlRecHndl disksListHandle;
/* List of disks, used for list control & mounting disks */
struct diskListEntry *diskList;
/* Do we want to open a window with disk contents? Counts down until ready. */
int wantToOpenWindow = 0;
/* JSON for current disk list (needs to be kept in memory while it's shown) */
json_value *json[MAX_PAGES];
/* User ID of this program */
Word myUserID;
/* String for "More Results" (used to identify that list entry) */
char moreResultsString[] = " <More Results>";
/* String to indicate no results were found */
char noResultsString[] = " No Disks Found";
/***/
static char menuTitle[] = "\pArchive.org Disk Browser\xC9";
static char diskbrowserRequestName[] = "\pSTH~DiskBrowser~";
/* ID of our menu item in the Finder (or 0 if we're not active) */
static Word menuItemID = 0;
/*********************************************************************
* Window handling and initialization
*********************************************************************/
void InstallMenuItem(void) {
static MenuItemTemplate menuItem = {
/* .version = */ 0x8000, /* show dividing line */
/* .itemID = */ 0,
/* .itemChar = */ 0,
/* .itemAltChar = */ 0,
/* .itemCheck = */ 0,
/* .itemFlag = */ refIsPointer,
/* .itemTitleRef = */ (Long)&menuTitle
};
tellFinderAddToExtrasOut dataOutRec = {0};
SendRequest(tellFinderAddToExtras, sendToName|stopAfterOne,
(Long)NAME_OF_FINDER,
(Long)&menuItem,
(Ptr)&dataOutRec);
if (dataOutRec.finderResult == 0) {
menuItemID = dataOutRec.menuItemID;
} else {
menuItemID = 0;
}
}
void RemoveMenuItem(void) {
tellFinderRemoveFromExtrasOut dataOutRec = {0};
if (menuItemID == 0)
return;
SendRequest(tellFinderRemoveFromExtras, sendToName|stopAfterOne,
(Long)NAME_OF_FINDER,
(Long)menuItemID,
(Ptr)&dataOutRec);
menuItemID = 0;
}
void DoGoAway(void) {
CloseBrowserWindow();
RemoveMenuItem();
AcceptRequests(NULL, myUserID, NULL);
if (resourceStarted) {
Word origResourceApp = GetCurResourceApp();
SetCurResourceApp(myUserID);
ResourceShutDown();
SetCurResourceApp(origResourceApp);
resourceStarted = false;
}
}
/*
* Request procedure which may be called by the Finder.
*/
#pragma databank 1
#pragma toolparms 1
static pascal Word requestProc(Word reqCode, Long dataIn, void *dataOut) {
switch (reqCode) {
case finderSaysHello:
InstallMenuItem();
break;
case finderSaysGoodbye:
RemoveMenuItem();
break;
case finderSaysExtrasChosen:
if ((dataIn & 0x0000FFFF) == menuItemID) {
ShowBrowserWindow();
return 0x8000;
}
break;
case finderSaysIdle:
if (wantToOpenWindow) {
ShowDiskWindow();
}
break;
case srqGoAway:
DoGoAway();
((srqGoAwayOut*)dataOut)->resultID = myUserID;
((srqGoAwayOut*)dataOut)->resultFlags = 0;
return 0x8000;
break;
}
return 0;
}
#pragma toolparms 0
#pragma databank 0
boolean NetDiskPresent(void)
{
static struct MountURLRec mountURLRec = {sizeof(struct MountURLRec)};
mountURLRec.result = NETDISK_NOT_PRESENT;
mountURLRec.url = "";
mountURLRec.flags = flgUseCache;
SendRequest(MountURL, sendToName|stopAfterOne, (Long)NETDISK_REQUEST_NAME,
(Long)&mountURLRec, NULL);
if (mountURLRec.result == NETDISK_NOT_PRESENT) {
return false;
}
return true;
}
int main(void) {
myUserID = MMStartUp();
Word origResourceApp = GetCurResourceApp();
ResourceStartUp(myUserID);
resourceStarted = true;
SetCurResourceApp(origResourceApp);
/* Bail out if NetDisk or Marinetti is not present */
if (!NetDiskPresent() || !TCPIPStatus() || toolerror()) {
return 1;
}
/* Check for List Manager, in case future Finder doesn't start it. */
if (!ListStatus() || toolerror()) {
return 1;
}
AcceptRequests(diskbrowserRequestName, myUserID, &requestProc);
}