blob: 787675e39ab345e0c8e3b94c1b01f1b2c2dfd220 (
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
108
109
110
111
112
113
114
115
116
117
118
|
import Foundation
struct HotlineServer: Identifiable, Hashable {
let id = UUID()
let address: String
let port: UInt16
let users: UInt16
let name: String?
let description: String?
static func == (lhs: HotlineServer, rhs: HotlineServer) -> Bool {
return lhs.id == rhs.id
}
func hash(into hasher: inout Hasher) {
hasher.combine(self.id)
}
}
struct HotlineTransactionParameter {
let id: UInt16
let dataSize: UInt16
let data: Data
}
struct HotlineTransaction {
static let headerSize = 20
let flags: UInt8
let isReply: UInt8
let type: HotlineTransactionType
let id: UInt32
let errorCode: UInt32
let totalSize: UInt32
let dataSize: UInt32
var parameterCount: UInt16 = 0
var parameters: [HotlineTransactionParameter]? = nil
func encode(to data: inout Data) {
data.appendUInt8(self.flags)
data.appendUInt8(self.isReply)
data.appendUInt16(self.type.rawValue)
data.appendUInt32(self.id)
data.appendUInt32(self.errorCode)
data.appendUInt32(self.totalSize)
data.appendUInt32(self.dataSize)
if let p = self.parameters, p.count > 0 {
data.appendUInt16(UInt16(p.count))
for param in p {
data.appendUInt16(param.id)
data.appendUInt16(param.dataSize)
data.append(param.data)
}
}
}
}
enum HotlineTransactionType: UInt16 {
case unknown = 0
case error = 100
case getMessages = 101
case newMessage = 102
case oldPostNews = 103
case serverMessage = 104
case sendChat = 105
case chatMessage = 106
case login = 107
case sendInstantMessage = 108
case showAgreement = 109
case disconnectUser = 110
case disconnectMessage = 111
case inviteToNewChat = 112
case inviteToChat = 113
case rejectChatInvite = 114
case joinChat = 115
case leaveChat = 116
case notifyChatOfUserChange = 117
case notifyChatOfUserDelete = 118
case notifyChatSubject = 119
case setChatSubject = 120
case agreed = 121
case serverBanner = 122
case getFileNameList = 200
case downloadFile = 202
case uploadFile = 203
case deleteFile = 204
case newFolder = 205
case getFileInfo = 206
case setFileInfo = 207
case moveFile = 208
case makeFileAlias = 209
case downloadFolder = 210
case downloadInfo = 211
case downloadBanner = 212
case uploadFolder = 213
case getUserNameList = 300
case notifyOfUserChange = 301
case notifyOfUserDelete = 302
case getClientInfoText = 303
case setClientUserInfo = 304
case newUser = 350
case deleteUser = 351
case getUser = 352
case setUser = 353
case userAccess = 354
case userBroadcast = 355
case getNewsCategoryNameList = 370
case getNewsArticleNameList = 371
case deleteNewsItem = 380
case newNewsFolder = 381
case newNewsCategory = 382
case getNewsArticleData = 400
case postNewsArticle = 410
case deleteNewsArticle = 411
}
|