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 package uk.ac.rdg.resc.jstyx.client.callbacks;
30
31 import uk.ac.rdg.resc.jstyx.client.StyxConnection;
32 import uk.ac.rdg.resc.jstyx.client.CStyxFile;
33 import uk.ac.rdg.resc.jstyx.client.MessageCallback;
34
35 import uk.ac.rdg.resc.jstyx.messages.StyxMessage;
36 import uk.ac.rdg.resc.jstyx.messages.TwalkMessage;
37 import uk.ac.rdg.resc.jstyx.messages.RwalkMessage;
38 import uk.ac.rdg.resc.jstyx.messages.TcreateMessage;
39 import uk.ac.rdg.resc.jstyx.messages.RcreateMessage;
40
41 /***
42 * Callback used when creating a file (see CStyxFile.createAsync())
43 *
44 * @author jdb
45 * $Revision: 350 $
46 * $Date: 2005-08-08 10:36:19 +0100 (Mon, 08 Aug 2005) $
47 * $Log$
48 * Revision 1.2 2005/08/08 09:36:19 jonblower
49 * Minor changes
50 *
51 * Revision 1.1 2005/08/05 13:46:40 jonblower
52 * Factored out all callback objects from CStyxFile into separate classes
53 *
54 */
55
56 public class CreateCallback extends MessageCallback
57 {
58 private boolean isDirectory;
59 private int permissions;
60 private int mode;
61 private MessageCallback callback;
62 private long parentFid;
63 private CStyxFile file;
64 private StyxConnection conn;
65
66 public CreateCallback(CStyxFile file, boolean isDirectory, int permissions,
67 int mode, MessageCallback callback)
68 {
69 this.file = file;
70 this.conn = this.file.getConnection();
71 this.isDirectory = isDirectory;
72 this.permissions = permissions;
73 this.mode = mode;
74 this.callback = callback;
75 this.parentFid = -1;
76 }
77
78 public void nextStage()
79 {
80 if (this.file.hasFid())
81 {
82
83 this.error("File already exists", null);
84 }
85 else if (this.parentFid < 0)
86 {
87
88 TwalkMessage tWalkMsg = new TwalkMessage(this.conn.getRootFid(),
89 this.conn.getFreeFid(), this.file.getParentPath());
90 conn.sendAsync(tWalkMsg, this);
91 }
92 else
93 {
94
95 TcreateMessage tCreateMsg = new TcreateMessage(this.parentFid,
96 this.file.getName(), this.permissions, this.isDirectory, this.mode);
97 conn.sendAsync(tCreateMsg, this);
98 }
99 }
100
101 public void replyArrived(StyxMessage rMessage, StyxMessage tMessage)
102 {
103 if (rMessage instanceof RwalkMessage)
104 {
105
106 RwalkMessage rWalkMsg = (RwalkMessage)rMessage;
107 TwalkMessage tWalkMsg = (TwalkMessage)tMessage;
108 if (rWalkMsg.getNumSuccessfulWalks() == tWalkMsg.getNumPathElements())
109 {
110
111 this.parentFid = tWalkMsg.getNewFid();
112 this.nextStage();
113 }
114 else
115 {
116 String errMsg = "'" +
117 tWalkMsg.getPathElements()[rWalkMsg.getNumSuccessfulWalks()]
118 + "' does not exist.";
119 this.error(errMsg, tWalkMsg);
120 }
121 }
122 else
123 {
124
125 RcreateMessage rCreateMsg = (RcreateMessage)rMessage;
126 TcreateMessage tCreateMsg = (TcreateMessage)tMessage;
127 this.file.setFid(tCreateMsg.getFid());
128 this.file.setMode(tCreateMsg.getMode());
129 this.file.setIoUnit((int)rCreateMsg.getIoUnit());
130 if (this.callback != null)
131 {
132 callback.replyArrived(rMessage, tMessage);
133 }
134 else
135 {
136 this.file.fireCreated();
137 }
138 }
139 }
140
141 public void error(String message, StyxMessage tMessage)
142 {
143 if (tMessage instanceof TwalkMessage)
144 {
145
146 conn.returnFid(((TwalkMessage)tMessage).getNewFid());
147 }
148 if (this.callback != null)
149 {
150 this.callback.error(message, tMessage);
151 }
152 else
153 {
154 this.file.fireError(message);
155 }
156 }
157 }