Editing
Protocol
Jump to navigation
Jump to search
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
The following is based on the official Word document from Hotsprings that describes the Hotline Network Protocol 1.9. You might also want to take a look at [[Virtual1's_Hotline_Server_Protocol_Guide|Virtual1's Hotline Server Protocol Guide]], a reverse-engineered documentation of the protocol that was used for development of [[HotSocket]], a REALbasic socket class. You can find some aspects of the protocol explained in further detail in other [[:Category:Development|development pages]]. =Protocol Overview= Hotline client is an application executing on the user’s computer, and providing user interface for end-user services (chat, messaging, file services and other). Hotline server provides services and facilitates communication between all clients that are currently connected to it. Tracker application stores the list of servers that register with it, and provides that list to clients that request it. All these applications use TCP/IP for communication. To be able to connect to the specific server, IP address and port number must be provided to the client application. If client receives server’s address from a tracker, the tracker will provide the client with complete address. Otherwise, the user of Hotline client software must manually set this address. IP port number, set in the Hotline client for a specific server, is called ''base port number''. Additional port numbers utilized by the network protocol are determined by using this base port number. Namely, the base port number itself is used for regular transactions, while base port + 1 is used when upload/download is requested. HTTP tunneling uses base port + 2 for the regular transactions, and base + 3 for uploads/downloads. Numeric data transmitted over the wire is always in the network byte order. =Session Initialization= After establishing TCP connection, both client and server start the handshake process in order to confirm that each of them comply with requirements of the other. The information provided in this initial data exchange identifies protocols, and their versions, used in the communication. In the case where, after inspection, the capabilities of one of the subjects do not comply with the requirements of the other, the connection is dropped. The following information is sent to the server: {| class="article-table" !Description !Size !Data !Note |- |Protocol ID |4 |‘TRTP’ |0x54525450 |- |Sub-protocol ID |4 | |User defined |- |Version |2 |1 |Currently 1 |- |Sub-version |2 | |User defined |} The server replies with the following: {| class="article-table" !Description !Size !Data !Note |- |Protocol ID |4 |‘TRTP’ |- |Error code |4 | |Error code returned by the server (0 = no error) |} In the case of an error, client and server close the connection. =Transactions= After the initial handshake, client and server communicate over the connection by sending and receiving ''transactions''. Every transaction contains description (request) and/or status (reply) of the operation that is performed, and parameters used for that specific operation. A transaction begins with the following header: {| class="article-table" !Description !Size !Data !Note |- |Flags |1 |0 |Reserved (should be 0) |- |Is reply |1 |0 or 1 |Request (0) or reply (1) |- |Type |2 | |Requested operation (user defined). 0 for reply |- |ID |4 |Not 0 |Unique transaction ID (must not be 0) |- |Error code |4 | |Used in the reply (user defined, 0 = no error) |- |Total size |4 | |Total data size for the transaction (all parts) |- |Data size |4 | |Size of data in this transaction part This allows splitting large transactions into smaller parts |} Immediately following the header is optional transaction data. Data part contains ''transaction parameters''. When these parameters are used, data part starts with the field containing the number of parameters in the parameter list: {| class="article-table" !Description !Size !Note |- |Number of parameters |2 |Number of the parameters for this transaction |- |Parameter list… |} Parameter list contains multiple records with the following structure: {| class="article-table" !Description !Size !Note |- |Field ID |2 |- |Field size |2 |Size of the data part |- |Field data… |size |Actual field content |} Every field data format is based on the field type. Currently, there are only 3 predefined field data types: integer, string and binary. =Transaction Types (with Type ID)= This is the list of all transactions in the current version of Hotline software: {| class="article-table" !ID !Type !Initiator !Constant |- |100 |Error |? | |myTran_Error |- |101 |Get messages |Client |myTran_GetMsgs |- |102 |New message | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_NewMsg |- | style="width: 49px;" | 103 | style="width: 222px;" | Old post news | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_OldPostNews |- | style="width: 49px;" | 104 | style="width: 222px;" | Server message | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_ServerMsg |- | style="width: 49px;" | 105 | style="width: 222px;" | Send chat | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_ChatSend |- | style="width: 49px;" | 106 | style="width: 222px;" | Chat message | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_ChatMsg |- | style="width: 49px;" | 107 | style="width: 222px;" | Login | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_Login |- | style="width: 49px;" | 108 | style="width: 222px;" | Send instant message | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_SendInstantMsg |- | style="width: 49px;" | 109 | style="width: 222px;" | Show agreement | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_ShowAgreement |- | style="width: 49px;" | 110 | style="width: 222px;" | Disconnect user | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DisconnectUser |- | style="width: 49px;" | 111 | style="width: 222px;" | Disconnect message | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_DisconnectMsg |- | style="width: 49px;" | 112 | style="width: 222px;" | Invite to a new chat | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_InviteNewChat |- | style="width: 49px;" | 113 | style="width: 222px;" | Invite to chat | style="width: 66px;" | Client | style="width: 66px;" | Server | style="width: 187px;" | myTran_InviteToChat |- | style="width: 49px;" | 114 | style="width: 222px;" | Reject chat invite | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_RejectChatInvite |- | style="width: 49px;" | 115 | style="width: 222px;" | Join chat | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_JoinChat |- | style="width: 49px;" | 116 | style="width: 222px;" | Leave chat | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_LeaveChat |- | style="width: 49px;" | 117 | style="width: 222px;" | Notify chat of a user change | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_NotifyChatChangeUser |- | style="width: 49px;" | 118 | style="width: 222px;" | Notify chat of a delete user | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_NotifyChatDeleteUser |- | style="width: 49px;" | 119 | style="width: 222px;" | Notify of a chat subject | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_NotifyChatSubject |- | style="width: 49px;" | 120 | style="width: 222px;" | Set chat subject | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_SetChatSubject |- | style="width: 49px;" | 121 | style="width: 222px;" | Agreed | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_Agreed |- | style="width: 49px;" | 122 | style="width: 222px;" | Server banner | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_ServerBanner |- | style="width: 49px;" | 200 | style="width: 222px;" | Get file name list | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetFileNameList |- | style="width: 49px;" | 202 | style="width: 222px;" | Download file | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DownloadFile |- | style="width: 49px;" | 203 | style="width: 222px;" | Upload file | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_UploadFile |- | style="width: 49px;" | 204 | style="width: 222px;" | Delete file | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DeleteFile |- | style="width: 49px;" | 205 | style="width: 222px;" | New folder | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_NewFolder |- | style="width: 49px;" | 206 | style="width: 222px;" | Get file info | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetFileInfo |- | style="width: 49px;" | 207 | style="width: 222px;" | Set file info | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_SetFileInfo |- | style="width: 49px;" | 208 | style="width: 222px;" | Move file | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_MoveFile |- | style="width: 49px;" | 209 | style="width: 222px;" | Make file alias | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_MakeFileAlias |- | style="width: 49px;" | 210 | style="width: 222px;" | Download folder | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DownloadFldr |- | style="width: 49px;" | 211 | style="width: 222px;" | Download info | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_DownloadInfo |- | style="width: 49px;" | 212 | style="width: 222px;" | Download banner | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DownloadBanner |- | style="width: 49px;" | 213 | style="width: 222px;" | Upload folder | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_UploadFldr |- | style="width: 49px;" | 300 | style="width: 222px;" | Get user name list | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetUserNameList |- | style="width: 49px;" | 301 | style="width: 222px;" | Notify of a user change | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_NotifyChangeUser |- | style="width: 49px;" | 302 | style="width: 222px;" | Notify of a delete user | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_NotifyDeleteUser |- | style="width: 49px;" | 303 | style="width: 222px;" | Get client info text | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetClientInfoText |- | style="width: 49px;" | 304 | style="width: 222px;" | Set client user info | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_SetClientUserInfo |- | style="width: 49px;" | 350 | style="width: 222px;" | New user | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_NewUser |- | style="width: 49px;" | 351 | style="width: 222px;" | Delete user | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DeleteUser |- | style="width: 49px;" | 352 | style="width: 222px;" | Get user | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetUser |- | style="width: 49px;" | 353 | style="width: 222px;" | Set user | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_SetUser |- | style="width: 49px;" | 354 | style="width: 222px;" | User access | style="width: 66px;" | | style="width: 66px;" | Server | style="width: 187px;" | myTran_UserAccess |- | style="width: 49px;" | 355 | style="width: 222px;" | User broadcast | style="width: 66px;" | Client | style="width: 66px;" | Server | style="width: 187px;" | myTran_UserBroadcast |- | style="width: 49px;" | 370 | style="width: 222px;" | Get news category name list | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetNewsCatNameList |- | style="width: 49px;" | 371 | style="width: 222px;" | Get news article name list | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetNewsArtNameList |- | style="width: 49px;" | 380 | style="width: 222px;" | Delete news item | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DelNewsItem |- | style="width: 49px;" | 381 | style="width: 222px;" | New news folder | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_NewNewsFldr |- | style="width: 49px;" | 382 | style="width: 222px;" | New news category | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_NewNewsCat |- | style="width: 49px;" | 400 | style="width: 222px;" | Get news article data | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_GetNewsArtData |- | style="width: 49px;" | 410 | style="width: 222px;" | Post news article | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_PostNewsArt |- | style="width: 49px;" | 411 | style="width: 222px;" | Delete news article | style="width: 66px;" | Client | style="width: 66px;" | | style="width: 187px;" | myTran_DelNewsArt |- | style="width: 49px;" | 500 | style="width: 222px;" | Connection keep alive | style="width: 66px;" | | style="width: 66px;" | | style="width: 187px;" | myTran_KeepConnectionAlive |} The following are the lists of related transactions that are implemented in the new version of Hotline software: {| border="1" cellpadding="0" cellspacing="0" | colspan="4" style="width: 590px;" | ===User Login and Management=== |- | style="width: 49px;" | ID | style="width: 222px;" | Type | style="width: 84px;" | Initiator | style="width: 235px;" | Note |- | style="width: 49px;" | 107 | style="width: 222px;" | Login | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 109 | style="width: 222px;" | Show agreement | style="width: 84px;" | Server | style="width: 235px;" | |- | style="width: 49px;" | 121 | style="width: 222px;" | Agreed | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 304 | style="width: 222px;" | Set client user info | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 301 | style="width: 222px;" | Notify of a user change | style="width: 84px;" | Server | style="width: 235px;" | |- | style="width: 49px;" | 300 | style="width: 222px;" | Get user name list | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 302 | style="width: 222px;" | Notify of a delete user | style="width: 84px;" | Server | style="width: 235px;" | |} {| border="1" cellpadding="0" cellspacing="0" | colspan="4" style="width: 590px;" | ===Chat Transactions=== |- | style="width: 49px;" | ID | style="width: 222px;" | Type | style="width: 84px;" | Initiator | style="width: 235px;" | Note |- | style="width: 49px;" | 115 | style="width: 222px;" | Join chat | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 112 | style="width: 222px;" | Invite to a new chat | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 113 | style="width: 222px;" | Invite to chat | style="width: 84px;" | Client/Server | style="width: 235px;" | |- | style="width: 49px;" | 114 | style="width: 222px;" | Reject chat invite | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 117 | style="width: 222px;" | Notify chat of a user change | style="width: 84px;" | Server | style="width: 235px;" | |- | style="width: 49px;" | 116 | style="width: 222px;" | Leave chat | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 118 | style="width: 222px;" | Notify chat of a delete user | style="width: 84px;" | Server | style="width: 235px;" | |- | style="width: 49px;" | 120 | style="width: 222px;" | Set chat subject | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 119 | style="width: 222px;" | Notify of a chat subject | style="width: 84px;" | Server | style="width: 235px;" | |- | style="width: 49px;" | 105 | style="width: 222px;" | Send chat | style="width: 84px;" | Client | style="width: 235px;" | |- | style="width: 49px;" | 106 | style="width: 222px;" | Chat message | style="width: 84px;" | Server | style="width: 235px;" | |} {| border="1" cellpadding="0" cellspacing="0" | colspan="4" style="width: 590px;" | ===Messaging Transactions=== |- | style="width: 49px;" | ID | style="width: 222px;" | Type | style="width: 84px;" | Initiator | style="width: 235px;" | Note |- | style="width: 49px;" | 104 | style="width: 222px;" | Server message | style="width: 84px;" | Server | style="width: 235px;" | |- | style="width: 49px;" | 108 | style="width: 222px;" | Send instant message | style="width: 84px;" | Client | style="width: 235px;" | |} ==Transaction Description== Transaction types are described using the following format: '''''Constant''': Constant identifier used in the old version of the application.'' '''''Access''': Specifies access privilege required to perform the transaction.'' '''''Initiator''': Specifies transaction initiator (client or server).'' '''''Fields used in the request''': List of fields sent by the transaction initiator.'' '''''Fields used in the reply''': List of fields sent back to the transaction initiator.'' '''''Reply is not sent''': Receiver of transaction is not sending reply.'' '''Reply is not expected''': Sender of transaction is not expecting reply. '''Error (100)''' Constant: myTran_Error Initiator: None (?) '''Get Messages (101)''' Constant: myTran_GetMsgs Initiator: Client Fields used in the request: None Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | Message text |} '''New Message (102)''' Constant: myTran_NewMsg Initiator: Server Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | News text |} Reply is not sent. '''Old Post News (103)''' Constant: myTran_OldPostNews Access: News Post Article (21) Initiator: Client Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | |} Fields used in the reply: None '''Server Message (104)''' Constant: myTran_ServerMsg Initiator: Server Receive a message from the user on the current server, server’s administrator, or server software itself. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 103 | style="width: 114px;" | User ID | style="width: 433px;" | |- | style="width: 43px;" | 102 | style="width: 114px;" | User name | style="width: 433px;" | |- | style="width: 43px;" | 113 | style="width: 114px;" | Options | style="width: 433px;" | Bitmap created by combining the following values: - Automatic response (4) - Refuse private chat (2) - Refuse private message (1) |- | style="width: 43px;" | 101 | style="width: 114px;" | Data | style="width: 433px;" | Message to display |- | style="width: 43px;" | 214 | style="width: 114px;" | Quoting message | style="width: 433px;" | Message to quote |} If User ID (103) field is not sent, receiver assumes that sender uses the following fields: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | |- | style="width: 43px;" | 109 | style="width: 96px;" | Chat options | style="width: 451px;" | Server message (1) or admin message (any other value) |} Reply is not sent. '''Send Chat (105)''' Constant: myTran_ChatSend Access: Send Chat (10) Initiator: Client Send a chat message to the chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 109 | style="width: 96px;" | Chat options | style="width: 451px;" | Optional Normal (0) or alternate (1) chat message |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | Optional |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | Chat message string |} Reply is not expected. Note: While the chat message data can have a theoretical length of 32KB, many servers will clip the text to some length (server dependent) far before this point. Best practice is to not allow the client to send more than 4KB in one chat message. '''Chat Message (106)''' Constant: myTran_ChatMsg Initiator: Server Receive a chat message from the chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | Chat text |} If Chat ID is not available, the Data field contains: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | Special chat message |} Reply is not sent. '''Login (107)''' Constant: myTran_Login Initiator: Client Start login sequence with the server (see ''Transaction Sequences''). Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 105 | style="width: 96px;" | User login | style="width: 451px;" | |- | style="width: 43px;" | 106 | style="width: 96px;" | User password | style="width: 451px;" | |- | style="width: 43px;" | 160 | style="width: 96px;" | Version | style="width: 451px;" | Currently 151 |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 160 | style="width: 96px;" | Version | style="width: 451px;" | |} If Version is >= 151, additional fields are included: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 161 | style="width: 96px;" | Banner ID | style="width: 451px;" | Used for making HTTP request to get banner |- | style="width: 43px;" | 162 | style="width: 96px;" | Server name | style="width: 451px;" | Server name string |} If server version is < 151, client sends Set Client User Info (304) transaction with only User Name (102) and User Icon ID (104) fields used, and does not expect a reply. It does not expect agreement to be received (109). Subsequently, it sends Get User Name List (300) request, followed by Get File Name List (200) or Get News Category Name List (370), depending on user preferences. After that, a banner is requested from HTTP server. '''Send Instant Message (108)''' Constant: myTran_SendInstantMsg Initiator: Client Send instant message to the user on the current server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 103 | style="width: 114px;" | User ID | style="width: 433px;" | |- | style="width: 43px;" | 113 | style="width: 114px;" | Options | style="width: 433px;" | One of the following values: - User message (myOpt_UserMessage = 1) - Refuse message (myOpt_RefuseMessage = 2) - Refuse chat (myOpt_RefuseChat = 3) - Automatic response (myOpt_AutomaticResponse = 4) |- | style="width: 43px;" | 101 | style="width: 114px;" | Data | style="width: 433px;" | Optional |- | style="width: 43px;" | 214 | style="width: 114px;" | Quoting message | style="width: 433px;" | Optional |} Fields used in the reply: None '''Show Agreement (109)''' Constant: myTran_ShowAgreement Initiator: Server Receive agreement that will be presented to the user of the client application. This transaction is part of the login sequence (see ''Transaction Sequences''). Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 132px;" | Field Name | style="width: 415px;" | Note |- | style="width: 43px;" | 101 | style="width: 132px;" | Data | style="width: 415px;" | Agreement string |- | style="width: 43px;" | 154 | style="width: 132px;" | No server agreement | style="width: 415px;" | Optional No agreement available (1) |- | style="width: 43px;" | 152 | style="width: 132px;" | Server banner type | style="width: 415px;" | |- | style="width: 43px;" | 153 | style="width: 132px;" | Server banner URL | style="width: 415px;" | Optional If banner type is URL (1) |- | style="width: 43px;" | 151 | style="width: 132px;" | Server banner | style="width: 415px;" | Optional If banner type is not URL (1) |} Reply is not sent. '''Disconnect User (110)''' Constant: myTran_DisconnectUser Access: Disconnect User (22) Initiator: Client Disconnect user from the current server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 103 | style="width: 96px;" | User ID | style="width: 451px;" | |- | style="width: 43px;" | 113 | style="width: 96px;" | Options | style="width: 451px;" | Optional Ban options |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | Optional Name? |} Fields used in the reply: None '''Disconnect Message (111)''' Constant: myTran_DisconnectMsg Initiator: Server Receive disconnect message from the server. Upon receiving this transaction, client should close the connection with server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 101 | style="width: 114px;" | Data | style="width: 433px;" | Message to display on disconnect (mandatory) |} Reply is not sent. '''Invite New Chat (112)''' Constant: myTran_InviteNewChat Initiator: Client Invite users to the new chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 103 | style="width: 96px;" | User ID | style="width: 451px;" | Optional |- | style="width: 43px;" | 103 … | style="width: 96px;" | User ID … | style="width: 451px;" | Optional More user IDs… |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 103 | style="width: 114px;" | User ID | style="width: 433px;" | |- | style="width: 43px;" | 104 | style="width: 114px;" | User icon ID | style="width: 433px;" | |- | style="width: 43px;" | 112 | style="width: 114px;" | User flags | style="width: 433px;" | |- | style="width: 43px;" | 102 | style="width: 114px;" | User name | style="width: 433px;" | |- | style="width: 43px;" | 114 | style="width: 114px;" | Chat ID | style="width: 433px;" | |} '''Invite To Chat (113)''' Constant: myTran_InviteToChat Initiator: Client Invite user to the existing chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 103 | style="width: 96px;" | User ID | style="width: 451px;" | User to invite |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |} Reply is not expected. The server can also be an initiator of this transaction. Initiator: Server Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |- | style="width: 43px;" | 103 | style="width: 96px;" | User ID | style="width: 451px;" | User to invite |- | style="width: 43px;" | 102 | style="width: 96px;" | User name | style="width: 451px;" | |} Reply is not sent. When client receives this message from the sever with version < 151, and client has automatic response or reject chat flag set, Reject Chat Invite (114) transaction is sent back to the server. '''Reject Chat Invite (114)''' Constant: myTran_RejectChatInvite Initiator: Client Reject invitation to join the chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |} Reply is not expected. '''Join Chat (115)''' Constant: myTran_JoinChat Initiator: Client Join the chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 115 | style="width: 126px;" | Chat subject | style="width: 421px;" | |- | style="width: 43px;" | 300 | style="width: 126px;" | User name with info | style="width: 421px;" | Optional |- | style="width: 43px;" | 300 … | style="width: 126px;" | User name with info … | style="width: 421px;" | Optional More user names with info |} '''Leave Chat (116)''' Constant: myTran_LeaveChat Initiator: Client Leave the chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |} Reply is not expected. '''Notify Chat Change User (117)''' Constant: myTran_NotifyChatChangeUser Initiator: Server Notify the user of the chat that the information for some another user changed, or that a new user just joined the chat. This information should be added to (user joined the chat), or updated (user changed its info) in the chat user list. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 114 | style="width: 114px;" | Chat ID | style="width: 433px;" | |- | style="width: 43px;" | 103 | style="width: 114px;" | User ID | style="width: 433px;" | |- | style="width: 43px;" | 104 | style="width: 114px;" | User icon ID | style="width: 433px;" | |- | style="width: 43px;" | 112 | style="width: 114px;" | User flags | style="width: 433px;" | |- | style="width: 43px;" | 102 | style="width: 114px;" | User name | style="width: 433px;" | |} Reply is not sent. In the Hotline implementation v1.8x, this transaction is in fact used only when the user joins the chat. The user information update done by Notify Change User (301) transaction is also applied to any chat rooms on the clients receiving the update. '''Notify Chat Delete User (118)''' Constant: myTran_NotifyChatDeleteUser Initiator: Server Notify the user of the chat that a user left that chat. The client should update the chat user list. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 114 | style="width: 114px;" | Chat ID | style="width: 433px;" | |- | style="width: 43px;" | 103 | style="width: 114px;" | User ID | style="width: 433px;" | |} Reply is not sent. '''Notify Chat Subject (119)''' Constant: myTran_NotifyChatSubject Initiator: Server Notify the user of the chat of the chat subject. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |- | style="width: 43px;" | 115 | style="width: 96px;" | Chat subject | style="width: 451px;" | Chat subject string |} Reply is not sent. '''Set Chat Subject (120)''' Constant: myTran_SetChatSubject Initiator: Client Set chat subject for the chat. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 114 | style="width: 96px;" | Chat ID | style="width: 451px;" | |- | style="width: 43px;" | 115 | style="width: 96px;" | Chat subject | style="width: 451px;" | Chat subject string |} Reply is not expected. '''Agreed (121)''' Constant: myTran_Agreed Initiator: Client Notify the server that the user accepted the server agreement. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 102 | style="width: 126px;" | User name | style="width: 421px;" | |- | style="width: 43px;" | 104 | style="width: 126px;" | User icon ID | style="width: 421px;" | |- | style="width: 43px;" | 113 | style="width: 126px;" | Options | style="width: 421px;" | Bitmap created by combining the following values: - Automatic response (4) - Refuse private chat (2) - Refuse private message (1) |- | style="width: 43px;" | 215 | style="width: 126px;" | Automatic response | style="width: 421px;" | Optional Automatic response string used only if the options field indicates this feature |} Fields used in the reply: None After receiving server’s acknowledgement, the client sends Get User Name List (300) request, followed by Get File Name List (200) or Get News Category Name List (370), depending on user preferences. '''Server Banner (122)''' Constant: myTran_ServerBanner Initiator: Server Notify the client that a new banner should be displayed. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 132px;" | Field Name | style="width: 415px;" | Note |- | style="width: 43px;" | 152 | style="width: 132px;" | Server banner type | style="width: 415px;" | Uses only literal values |- | style="width: 43px;" | 153 | style="width: 132px;" | Server banner URL | style="width: 415px;" | Optional |} Reply is not sent. If banner type is URL, it is requested from that URL. Otherwise, the banner is requested from the server by Download Banner (212) request. This transaction uses only literal value constants in the banner type field (etc. ‘URL ‘, ‘JPEG’ or other). '''Get File Name List (200)''' Constant: myTran_GetFileNameList Initiator: Client Get the list of file names from the specified folder. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 202 | style="width: 96px;" | File path | style="width: 451px;" | Optional If not specified, root folder assumed |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 120px;" | Field Name | style="width: 427px;" | Note |- | style="width: 43px;" | 200 | style="width: 120px;" | File name with info | style="width: 427px;" | Optional |- | style="width: 43px;" | 200 … | style="width: 120px;" | File name with info … | style="width: 427px;" | Optional More file names with info |} '''Download File (202)''' Constant: myTran_DownloadFile Access: Download File (2) Initiator: Client Download the file from the specified path on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 120px;" | Field Name | style="width: 427px;" | Note |- | style="width: 43px;" | 201 | style="width: 120px;" | File name | style="width: 427px;" | |- | style="width: 43px;" | 202 | style="width: 120px;" | File path | style="width: 427px;" | |- | style="width: 43px;" | 203 | style="width: 120px;" | File resume data | style="width: 427px;" | Optional |- | style="width: 43px;" | 204 | style="width: 120px;" | File transfer options | style="width: 427px;" | Optional Currently set to 2 Used only for TEXT, JPEG, GIFF, BMP or PICT files |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 108 | style="width: 114px;" | Transfer size | style="width: 433px;" | Size of data to be downloaded |- | style="width: 43px;" | 207 | style="width: 114px;" | File size | style="width: 433px;" | |- | style="width: 43px;" | 107 | style="width: 114px;" | Reference number | style="width: 433px;" | Used later for transfer |- | style="width: 43px;" | 116 | style="width: 114px;" | Waiting count | style="width: 433px;" | |} After receiving reply from the server, the client opens TCP (or HTTP) connection to base port + 1 (HTTP uses base port + 3). On successful establishment, client sends the following record using the new connection: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Protocol | style="width: 41px;" | 4 | style="width: 64px;" | ‘HTXF’ | style="width: 370px;" | 0x48545846 |- | style="width: 115px;" | Reference number | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | Use reference number received from the server |- | style="width: 115px;" | Data size | style="width: 41px;" | 4 | style="width: 64px;" | 0 | style="width: 370px;" | |- | style="width: 115px;" | RSVD | style="width: 41px;" | 4 | style="width: 64px;" | 0 | style="width: 370px;" | ? |} After this, server sends the flattened file object (see ''Flattened File Object'') using this new TCP connection. '''Upload File (203)''' Constant: myTran_UploadFile Access: Upload File (1) Initiator: Client Upload a file to the specified path on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 120px;" | Field Name | style="width: 427px;" | Note |- | style="width: 43px;" | 201 | style="width: 120px;" | File name | style="width: 427px;" | |- | style="width: 43px;" | 202 | style="width: 120px;" | File path | style="width: 427px;" | |- | style="width: 43px;" | 204 | style="width: 120px;" | File transfer options | style="width: 427px;" | Optional Used only to resume download, currently has value 2 |- | style="width: 43px;" | 108 | style="width: 120px;" | File transfer size | style="width: 427px;" | Optional Used if download is not resumed |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 203 | style="width: 114px;" | File resume data | style="width: 433px;" | Optional Used only to resume download |- | style="width: 43px;" | 107 | style="width: 114px;" | Reference number | style="width: 433px;" | |} After receiving reply from the server, the client opens TCP (or HTTP) connection to base port + 1 (HTTP uses base port + 3). On successful establishment, client sends the following record using the new connection: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Protocol | style="width: 41px;" | 4 | style="width: 64px;" | ‘HTXF’ | style="width: 370px;" | 0x48545846 |- | style="width: 115px;" | Reference number | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | Use reference number received from the server |- | style="width: 115px;" | Data size | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | File size |- | style="width: 115px;" | RSVD | style="width: 41px;" | 4 | style="width: 64px;" | 0 | style="width: 370px;" | ? |} After this, client sends the flattened file object (see ''Flattened File Object'') using this new TCP connection. '''Delete File (204)''' Constant: myTran_DeleteFile Access: Delete File (0) or Delete Folder (6) Initiator: Client Delete the specific file from the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 201 | style="width: 96px;" | File name | style="width: 451px;" | |- | style="width: 43px;" | 202 | style="width: 96px;" | File path | style="width: 451px;" | |} Fields used in the reply: None '''New Folder (205)''' Constant: myTran_NewFolder Access: Create Folder (5) Initiator: Client Create a new folder on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 201 | style="width: 96px;" | File name | style="width: 451px;" | |- | style="width: 43px;" | 202 | style="width: 96px;" | File path | style="width: 451px;" | |} Fields used in the reply: None '''Get File Info (206)''' Constant: myTran_GetFileInfo Initiator: Client Request file information from the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 201 | style="width: 96px;" | File name | style="width: 451px;" | |- | style="width: 43px;" | 202 | style="width: 96px;" | File path | style="width: 451px;" | Optional |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 108px;" | Field Name | style="width: 439px;" | Note |- | style="width: 43px;" | 201 | style="width: 108px;" | File name | style="width: 439px;" | |- | style="width: 43px;" | 205 | style="width: 108px;" | File type string | style="width: 439px;" | |- | style="width: 43px;" | 206 | style="width: 108px;" | File creator string | style="width: 439px;" | |- | style="width: 43px;" | 210 | style="width: 108px;" | File comment | style="width: 439px;" | Comment string |- | style="width: 43px;" | 213 | style="width: 108px;" | File type | style="width: 439px;" | |- | style="width: 43px;" | 208 | style="width: 108px;" | File create date | style="width: 439px;" | |- | style="width: 43px;" | 209 | style="width: 108px;" | File modify date | style="width: 439px;" | |- | style="width: 43px;" | 207 | style="width: 108px;" | File size | style="width: 439px;" | |} '''Set File Info (207)''' Constant: myTran_SetFileInfo Access: Set File Comment (28) or Set Folder Comment (29) Initiator: Client Set information for the specified file on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 201 | style="width: 96px;" | File name | style="width: 451px;" | |- | style="width: 43px;" | 202 | style="width: 96px;" | File path | style="width: 451px;" | Optional |- | style="width: 43px;" | 211 | style="width: 96px;" | File new name | style="width: 451px;" | Optional |- | style="width: 43px;" | 210 | style="width: 96px;" | File comment | style="width: 451px;" | Optional |} Fields used in the reply: None '''Move File (208)''' Constant: myTran_MoveFile Initiator: Client Move the file from one folder to another on the same server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 201 | style="width: 96px;" | File name | style="width: 451px;" | |- | style="width: 43px;" | 202 | style="width: 96px;" | File path | style="width: 451px;" | |- | style="width: 43px;" | 212 | style="width: 96px;" | File new path | style="width: 451px;" | |} Fields used in the reply: None '''Make File Alias (209)''' Constant: myTran_MakeFileAlias Access: Make Alias (31) Initiator: Client Make the file alias using the specified path. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 201 | style="width: 96px;" | File name | style="width: 451px;" | |- | style="width: 43px;" | 202 | style="width: 96px;" | File path | style="width: 451px;" | |- | style="width: 43px;" | 212 | style="width: 96px;" | File new path | style="width: 451px;" | Destination path |} Fields used in the reply: None '''Download Folder (210)''' Constant: myTran_DownloadFldr Access: Download File (2) Initiator: Client Download all files from the specified folder and its subfolders on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 120px;" | Field Name | style="width: 427px;" | Note |- | style="width: 43px;" | 201 | style="width: 120px;" | File name | style="width: 427px;" | |- | style="width: 43px;" | 202 | style="width: 120px;" | File path | style="width: 427px;" | |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 220 | style="width: 114px;" | Folder item count | style="width: 433px;" | |- | style="width: 43px;" | 107 | style="width: 114px;" | Reference number | style="width: 433px;" | Used later for transfer |- | style="width: 43px;" | 108 | style="width: 114px;" | Transfer size | style="width: 433px;" | Size of data to be downloaded |- | style="width: 43px;" | 116 | style="width: 114px;" | Waiting count | style="width: 433px;" | |} After receiving reply from the server, the client opens TCP (or HTTP) connection to base port + 1 (HTTP uses base port + 3). On successful establishment, client sends the following record using the new connection: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Protocol | style="width: 39px;" | 4 | style="width: 61px;" | ‘HTXF’ | style="width: 351px;" | 0x48545846 |- | style="width: 139px;" | Reference number | style="width: 39px;" | 4 | style="width: 61px;" | | style="width: 351px;" | Use reference number received from the server |- | style="width: 139px;" | Data size | style="width: 39px;" | 4 | style="width: 61px;" | 0 | style="width: 351px;" | |- | style="width: 139px;" | Type | style="width: 39px;" | 2 | style="width: 61px;" | 1 | style="width: 351px;" | |- | style="width: 139px;" | RSVD | style="width: 39px;" | 2 | style="width: 61px;" | 0 | style="width: 351px;" | ? |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 3 | style="width: 351px;" | Next file action (3) See ''Download folder actions'' |} For every item in the folder, server replies with: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Header size | style="width: 41px;" | 2 | style="width: 64px;" | | style="width: 370px;" | |- | style="width: 115px;" | Header data | style="width: 41px;" | size | style="width: 64px;" | | style="width: 370px;" | |} Header data contains the following: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Type | style="width: 41px;" | 2 | style="width: 64px;" | | style="width: 370px;" | ? |- | style="width: 115px;" | File path | style="width: 41px;" | rest | style="width: 64px;" | | style="width: 370px;" | |} After receiving this header client can reply in 3 ways. (1) If type is an odd number (unknown type?), or file download for the current file is completed: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 3 | style="width: 351px;" | Next file action (3) See ''Download folder actions'' |} This notifies the server to send next item header. (2) If download of a file is to be resumed: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 2 | style="width: 351px;" | Resume file transfer (2) See ''Download folder actions'' |- | style="width: 139px;" | Resume data size | style="width: 39px;" | 2 | style="width: 61px;" | | style="width: 351px;" | |- | style="width: 139px;" | File resume data | style="width: 39px;" | size | style="width: 61px;" | | style="width: 351px;" | See content for field (203) |} (3) Otherwise, file download is requested by: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 1 | style="width: 351px;" | Send file action (1) starts file download See ''Download folder actions'' |} When download is requested (case 2 or 3), server replies with: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | File size | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | |- | style="width: 115px;" | File content… | style="width: 41px;" | size | style="width: 64px;" | | style="width: 370px;" | Actual flattened file object (see ''Flattened File Object'') |} After every file download client could request next file: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 3 | style="width: 351px;" | Next file action (3) See ''Download folder actions'' |} This notifies the server to send next item header. '''Download Info (211)''' Constant: myTran_DownloadInfo Initiator: Server Notify the client that all download slots on the server are full. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 107 | style="width: 114px;" | Reference number | style="width: 433px;" | Download reference number |- | style="width: 43px;" | 116 | style="width: 114px;" | Waiting count | style="width: 433px;" | Position in the server’s queue |} Reply is not sent. '''Download Banner (212)''' Constant: myTran_DownloadBanner Initiator: Client Request a new banner from the server. Fields used in the request: None Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 107 | style="width: 114px;" | Reference number | style="width: 433px;" | Used later for transfer |- | style="width: 43px;" | 108 | style="width: 114px;" | Transfer size | style="width: 433px;" | Size of data to be downloaded |} After receiving reply from the server, the client opens TCP (or HTTP) connection to base port + 1 (HTTP uses base port + 3). On successful establishment, client sends the following record using the new connection: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Protocol | style="width: 41px;" | 4 | style="width: 64px;" | ‘HTXF’ | style="width: 370px;" | 0x48545846 |- | style="width: 115px;" | Reference number | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | Use reference number received from the server |- | style="width: 115px;" | Data size | style="width: 41px;" | 4 | style="width: 64px;" | 0 | style="width: 370px;" | |- | style="width: 115px;" | Type | style="width: 41px;" | 2 | style="width: 64px;" | 2 | style="width: 370px;" | |- | style="width: 115px;" | RSVD | style="width: 41px;" | 2 | style="width: 64px;" | 0 | style="width: 370px;" | ? |} After this, server sends the file content using this new TCP connection. '''Upload Folder (213)''' Constant: myTran_UploadFldr Access: Upload File (1) Initiator: Client Upload all files from the local folder and its subfolders, to the specified path on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 120px;" | Field Name | style="width: 427px;" | Note |- | style="width: 43px;" | 201 | style="width: 120px;" | File name | style="width: 427px;" | |- | style="width: 43px;" | 202 | style="width: 120px;" | File path | style="width: 427px;" | |- | style="width: 43px;" | 108 | style="width: 120px;" | Transfer size | style="width: 427px;" | Total size of all items in the folder |- | style="width: 43px;" | 220 | style="width: 120px;" | Folder item count | style="width: 427px;" | |- | style="width: 43px;" | 204 | style="width: 120px;" | File transfer options | style="width: 427px;" | Optional Currently set to 1 |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 107 | style="width: 114px;" | Reference number | style="width: 433px;" | Used later for transfer |} After receiving reply from the server, the client opens TCP (or HTTP) connection to base port + 1 (HTTP uses base port + 3). On successful establishment, client sends the following record using the new connection: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Protocol | style="width: 41px;" | 4 | style="width: 64px;" | ‘HTXF’ | style="width: 370px;" | 0x48545846 |- | style="width: 115px;" | Reference number | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | Use reference number received from the server |- | style="width: 115px;" | Data size | style="width: 41px;" | 4 | style="width: 64px;" | 0 | style="width: 370px;" | |- | style="width: 115px;" | Type | style="width: 41px;" | 2 | style="width: 64px;" | 1 | style="width: 370px;" | |- | style="width: 115px;" | RSVD | style="width: 41px;" | 2 | style="width: 64px;" | 0 | style="width: 370px;" | ? |} Server can reply with: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 3 | style="width: 351px;" | Next file action (3) See ''Download folder actions'' |} After which client sends: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Data size | style="width: 41px;" | 2 | style="width: 64px;" | | style="width: 370px;" | Size of this structure (not including data size element itself) |- | style="width: 115px;" | Is folder | style="width: 41px;" | 2 | style="width: 64px;" | 0 or 1 | style="width: 370px;" | Is the following file path a folder |- | style="width: 115px;" | Path item count | style="width: 41px;" | 2 | style="width: 64px;" | | style="width: 370px;" | Number of items in the path |- | style="width: 115px;" | File name path… | style="width: 41px;" | | style="width: 64px;" | | style="width: 370px;" | |} File name path contains: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | | style="width: 41px;" | 2 | style="width: 64px;" | 0 | style="width: 370px;" | Currently 0 |- | style="width: 115px;" | Name size | style="width: 41px;" | 1 | style="width: 64px;" | | style="width: 370px;" | |- | style="width: 115px;" | File/folder name | style="width: 41px;" | size | style="width: 64px;" | | style="width: 370px;" | |} After every file, server can send one of 3 requests. (1) Request next file: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 3 | style="width: 351px;" | Next file action (3) See ''Download folder actions'' |} This notifies the client to send next item. (2) Resume a file download procedure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 2 | style="width: 351px;" | Resume file transfer (2) See ''Download folder actions'' |- | style="width: 139px;" | Resume data size | style="width: 39px;" | 2 | style="width: 61px;" | | style="width: 351px;" | |- | style="width: 139px;" | File resume data | style="width: 39px;" | size | style="width: 61px;" | | style="width: 351px;" | See content for field (203) |} After receiving this request, client starts sending file content from the requested location in the file. (3) Request a file download: {| border="1" cellpadding="0" cellspacing="0" | style="width: 139px;" | Description | style="width: 39px;" | Size | style="width: 61px;" | Data | style="width: 351px;" | Note |- | style="width: 139px;" | Download folder action | style="width: 39px;" | 2 | style="width: 61px;" | 1 | style="width: 351px;" | Send file action (1) starts file download See ''Download folder actions'' |} Client replies to download requests with: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | File size | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | Current file size |} After this client sends the flattened file object (see ''Flattened File Object''). '''Get User Name List (300)''' Constant: myTran_GetUserNameList Initiator: Client Request the list of all users connected to the current server. Fields used in the request: None Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 300 | style="width: 126px;" | User name with info | style="width: 421px;" | Optional |- | style="width: 43px;" | 300 … | style="width: 126px;" | User name with info … | style="width: 421px;" | Optional More user names with info |} '''Notify Change User (301)''' Constant: myTran_NotifyChangeUser Initiator: Server Notify the user that the information for some another user changed, or that a new user just connected to the server. This information is to be added to (user joined), or updated (user changed its info) in the existing user list. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 103 | style="width: 114px;" | User ID | style="width: 433px;" | |- | style="width: 43px;" | 104 | style="width: 114px;" | User icon ID | style="width: 433px;" | |- | style="width: 43px;" | 112 | style="width: 114px;" | User flags | style="width: 433px;" | |- | style="width: 43px;" | 102 | style="width: 114px;" | User name | style="width: 433px;" | |} Reply is not sent. In the Hotline implementation v1.8x, this transaction is also applied to any chat rooms on the clients receiving the update. '''Notify Delete User (302)''' Constant: myTran_NotifyDeleteUser Initiator: Server Notify the user that some another user disconnected from the server. The client should update the existing user list. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 103 | style="width: 114px;" | User ID | style="width: 433px;" | |} Reply is not sent. '''Get Client Info Text (303)''' Constant: myTran_GetClientInfoText Access: Get Client Info (24) Initiator: Client Request user information for the specific user. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 103 | style="width: 96px;" | User ID | style="width: 451px;" | |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 102 | style="width: 126px;" | User name | style="width: 421px;" | |- | style="width: 43px;" | 101 | style="width: 126px;" | Data | style="width: 421px;" | User info text string |} '''Set Client User Info (304)''' Constant: myTran_SetClientUserInfo Initiator: Client Set user preferences on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 102 | style="width: 126px;" | User name | style="width: 421px;" | |- | style="width: 43px;" | 104 | style="width: 126px;" | User icon ID | style="width: 421px;" | |- | style="width: 43px;" | 113 | style="width: 126px;" | Options | style="width: 421px;" | Bitmap created by combining the following values: - Automatic response (4) - Refuse private chat (2) - Refuse private message (1) |- | style="width: 43px;" | 215 | style="width: 126px;" | Automatic response | style="width: 421px;" | Optional Automatic response string used only if the options field indicates this feature |} Reply is not expected. '''New User (350)''' Constant: myTran_NewUser Initiator: Client Add a new user to the server’s list of allowed users. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 105 | style="width: 126px;" | User login | style="width: 421px;" | |- | style="width: 43px;" | 106 | style="width: 126px;" | User password | style="width: 421px;" | |- | style="width: 43px;" | 102 | style="width: 126px;" | User name | style="width: 421px;" | |- | style="width: 43px;" | 110 | style="width: 126px;" | User access | style="width: 421px;" | User access privileges bitmap (see ''Access Privileges'') |} Fields used in the reply: None '''Delete User (351)''' Constant: myTran_DeleteUser Initiator: Client Delete the specific user from the server’s list of allowed users. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 105 | style="width: 96px;" | User login | style="width: 451px;" | |} Fields used in the reply: None '''Get User (352)''' Constant: myTran_GetUser Initiator: Client Request the information for the specific user from the server’s list of allowed users. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 105 | style="width: 96px;" | User login | style="width: 451px;" | |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 102 | style="width: 126px;" | User name | style="width: 421px;" | |- | style="width: 43px;" | 105 | style="width: 126px;" | User login | style="width: 421px;" | Every character in this string is negated (login[ i ] = ~login[ i ]) |- | style="width: 43px;" | 106 | style="width: 126px;" | User password | style="width: 421px;" | |- | style="width: 43px;" | 110 | style="width: 126px;" | User access | style="width: 421px;" | User access privileges bitmap (see ''Access Privileges'') |} '''Set User (353)''' Constant: myTran_SetUser Initiator: Client Set the information for the specific user in the server’s list of allowed users. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 105 | style="width: 126px;" | User login | style="width: 421px;" | |- | style="width: 43px;" | 106 | style="width: 126px;" | User password | style="width: 421px;" | |- | style="width: 43px;" | 102 | style="width: 126px;" | User name | style="width: 421px;" | |- | style="width: 43px;" | 110 | style="width: 126px;" | User access | style="width: 421px;" | User access privileges bitmap (see ''Access Privileges'') |} Fields used in the reply: None '''User Access (354)''' Constant: myTran_UserAccess Initiator: Server Set access privileges for the current user. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 110 | style="width: 126px;" | User access | style="width: 421px;" | User access privileges bitmap (see ''Access Privileges'') |} Reply is not sent. '''User Broadcast (355)''' Constant: myTran_UserBroadcast Access: Broadcast (32) Initiator: Client Broadcast the message to all users on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | |} Fields used in the reply: None The server can also be an initiator of this transaction. Initiator: Server Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 101 | style="width: 96px;" | Data | style="width: 451px;" | Administrator message |} Reply is not sent. '''Get News Category Name List (370)''' Constant: myTran_GetNewsCatNameList Initiator: Client Get the list of category names at the specified news path. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 325 | style="width: 96px;" | News path | style="width: 451px;" | Optional |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 144px;" | Field Name | style="width: 403px;" | Note |- | style="width: 43px;" | 323 | style="width: 144px;" | News category list data | style="width: 403px;" | Optional |- | style="width: 43px;" | 323 … | style="width: 144px;" | News category list data … | style="width: 403px;" | Optional More news categories |} If version of client/server is 1.5 (prior to April 15, 1999?), instead of the previous reply, the following is sent: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 144px;" | Field Name | style="width: 403px;" | Note |- | style="width: 43px;" | 320 | style="width: 144px;" | News category list data | style="width: 403px;" | Optional |- | style="width: 43px;" | 320 … | style="width: 144px;" | News category list data … | style="width: 403px;" | Optional More news categories |} '''Get News Article Name List (371)''' Constant: myTran_GetNewsArtNameList Initiator: Client Get the list of article names at the specified news path. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 325 | style="width: 96px;" | News path | style="width: 451px;" | Optional |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 126px;" | Field Name | style="width: 421px;" | Note |- | style="width: 43px;" | 321 | style="width: 126px;" | News article list data | style="width: 421px;" | Optional |} '''Delete News Item (380)''' Constant: myTran_DelNewsItem Access: News Delete Folder (37) or News Delete Category (35) Initiator: Client Delete an existing news item from the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 325 | style="width: 96px;" | News path | style="width: 451px;" | |} Fields used in the reply: None '''New News Folder (381)''' Constant: myTran_NewNewsFldr Access: News Create Folder (36) Initiator: Client Create new news folder on the server Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 96px;" | Field Name | style="width: 451px;" | Note |- | style="width: 43px;" | 201 | style="width: 96px;" | File name | style="width: 451px;" | |- | style="width: 43px;" | 325 | style="width: 96px;" | News path | style="width: 451px;" | |} Fields used in the reply: None '''New News Category (382)''' Constant: myTran_NewNewsCat Access: News Create Category (34) Initiator: Client Create new news category on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 132px;" | Field Name | style="width: 415px;" | Note |- | style="width: 43px;" | 322 | style="width: 132px;" | News category name | style="width: 415px;" | |- | style="width: 43px;" | 325 | style="width: 132px;" | News path | style="width: 415px;" | |} Fields used in the reply: None '''Get News Article Data (400)''' Constant: myTran_GetNewsArtData Access: News Read Article (20) Initiator: Client Request information about the specific news article. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 102px;" | Field Name | style="width: 445px;" | Note |- | style="width: 43px;" | 325 | style="width: 102px;" | News path | style="width: 445px;" | |- | style="width: 43px;" | 326 | style="width: 102px;" | News article ID | style="width: 445px;" | |- | style="width: 43px;" | 327 | style="width: 102px;" | News article data flavor | style="width: 445px;" | |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 144px;" | Field Name | style="width: 403px;" | Note |- | style="width: 43px;" | 328 | style="width: 144px;" | News article title | style="width: 403px;" | |- | style="width: 43px;" | 329 | style="width: 144px;" | News article poster | style="width: 403px;" | |- | style="width: 43px;" | 330 | style="width: 144px;" | News article date | style="width: 403px;" | |- | style="width: 43px;" | 331 | style="width: 144px;" | Previous article ID | style="width: 403px;" | |- | style="width: 43px;" | 332 | style="width: 144px;" | Next article ID | style="width: 403px;" | |- | style="width: 43px;" | 335 | style="width: 144px;" | Parent article ID | style="width: 403px;" | |- | style="width: 43px;" | 336 | style="width: 144px;" | First child article ID | style="width: 403px;" | |- | style="width: 43px;" | 327 | style="width: 144px;" | News article data flavor | style="width: 403px;" | Should be “text/plain” Other values are currently ignored |- | style="width: 43px;" | 333 | style="width: 144px;" | News article data | style="width: 403px;" | Optional (if data flavor is “text/plain”) |} '''Post News Article (410)''' Constant: myTran_PostNewsArt Access: News Post Article (21) Initiator: Client Post new news article on the server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 114px;" | Field Name | style="width: 433px;" | Note |- | style="width: 43px;" | 325 | style="width: 114px;" | News path | style="width: 433px;" | |- | style="width: 43px;" | 326 | style="width: 114px;" | News article ID | style="width: 433px;" | ID of the parent article? |- | style="width: 43px;" | 328 | style="width: 114px;" | News article title | style="width: 433px;" | |- | style="width: 43px;" | 334 | style="width: 114px;" | News article flags | style="width: 433px;" | |- | style="width: 43px;" | 327 | style="width: 114px;" | News article data flavor | style="width: 433px;" | Currently “text/plain” |- | style="width: 43px;" | 333 | style="width: 114px;" | News article data | style="width: 433px;" | |} Fields used in the reply: None '''Delete News Article (411)''' Constant: myTran_DelNewsArt Access: News Delete Article (33) Initiator: Client Delete the specific news article. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | ID | style="width: 108px;" | Field Name | style="width: 439px;" | Note |- | style="width: 43px;" | 325 | style="width: 108px;" | News path | style="width: 439px;" | |- | style="width: 43px;" | 326 | style="width: 108px;" | News article ID | style="width: 439px;" | |- | style="width: 43px;" | 337 | style="width: 108px;" | News article – recursive delete | style="width: 439px;" | Delete child articles (1) or not (0) |} Fields used in the reply: None '''Connection Keep Alive (500)''' Constant: myTran_KeepConnectionAlive Pings the connection (?) '''Flattened File Object''' Transactions 202 (Download File), 203 (Upload File), 210 (Download Folder) and 213 (Upload Folder) format the file object in the following way: Flat file header: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Format | style="width: 42px;" | 4 | style="width: 66px;" | ‘FILP’ | style="width: 379px;" | 0x46494C50 |- | style="width: 103px;" | Version | style="width: 42px;" | 2 | style="width: 66px;" | 1 | style="width: 379px;" | |- | style="width: 103px;" | RSVD | style="width: 42px;" | 16 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Fork count | style="width: 42px;" | 2 | style="width: 66px;" | 2 | style="width: 379px;" | |} Flat file information fork header: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Fork type | style="width: 41px;" | 4 | style="width: 64px;" | ‘INFO’ | style="width: 370px;" | 0x494E464F |- | style="width: 115px;" | Compression type | style="width: 41px;" | 4 | style="width: 64px;" | 0 | style="width: 370px;" | Currently no compression |- | style="width: 115px;" | RSVD | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | |- | style="width: 115px;" | Data size | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | Size of the flat file information fork |} Flat file information fork: {| border="1" cellpadding="0" cellspacing="0" | style="width: 109px;" | Description | style="width: 41px;" | Size | style="width: 115px;" | Data | style="width: 325px;" | Note |- | style="width: 109px;" | Platform | style="width: 41px;" | 4 | style="width: 115px;" | ‘AMAC’ or ‘MWIN’ | style="width: 325px;" | Operating system used |- | style="width: 109px;" | Type signature | style="width: 41px;" | 4 | style="width: 115px;" | | style="width: 325px;" | File type signature |- | style="width: 109px;" | Creator signature | style="width: 41px;" | 4 | style="width: 115px;" | | style="width: 325px;" | File creator signature |- | style="width: 109px;" | Flags | style="width: 41px;" | 4 | style="width: 115px;" | | style="width: 325px;" | |- | style="width: 109px;" | Platform flags | style="width: 41px;" | 4 | style="width: 115px;" | | style="width: 325px;" | |- | style="width: 109px;" | RSVD | style="width: 41px;" | 32 | style="width: 115px;" | | style="width: 325px;" | |- | style="width: 109px;" | Create date | style="width: 41px;" | 8 | style="width: 115px;" | | style="width: 325px;" | See description for the File Create Date field (208) |- | style="width: 109px;" | Modify date | style="width: 41px;" | 8 | style="width: 115px;" | | style="width: 325px;" | See description for the File Modify Date field (209) |- | style="width: 109px;" | Name script | style="width: 41px;" | 2 | style="width: 115px;" | | style="width: 325px;" | |- | style="width: 109px;" | Name size | style="width: 41px;" | 2 | style="width: 115px;" | | style="width: 325px;" | |- | style="width: 109px;" | Name | style="width: 41px;" | size | style="width: 115px;" | | style="width: 325px;" | Maximum 128 characters |- |Comment size |2 | | |- |Comment |comment size | |When Comment size > 0 |} Flat file data fork header: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Fork type | style="width: 41px;" | 4 | style="width: 64px;" | ‘DATA’ | style="width: 370px;" | 0x44415441 |- | style="width: 115px;" | Compression type | style="width: 41px;" | 4 | style="width: 64px;" | 0 | style="width: 370px;" | Currently no compression |- | style="width: 115px;" | RSVD | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | |- | style="width: 115px;" | Data size | style="width: 41px;" | 4 | style="width: 64px;" | | style="width: 370px;" | Actual file content size |} =Transaction Fields= There are 3 predefined field data types: integer, string and binary. If field data does not fit in the first two categories, it is sent as binary data and interpreted by the receiving machine. Some of the binary fields are currently used as strings. All integer fields are treated as unsigned, and can be sent as 16 or 32-bit numbers. This is determined by evaluation of the number itself. Namely, if integer can be represented using only 2 bytes, it is sent as such. In the case when the number is greater than 2^16, it’s sent as 32-bit number. String fields currently use 8-bit ASCII character set. '''Error Text (100)''' Constant: myField_ErrorText '''Data (101)''' Constant: myField_Data Type: Binary '''User Name (102)''' Constant: myField_UserName Type: String '''User ID (103)''' Constant: myField_UserID Type: Integer '''User Icon ID (104)''' Constant: myField_UserIconID Type: Integer '''User Login (105)''' Constant: myField_UserLogin Type: String '''User Password (106)''' Constant: myField_UserPassword Type: String '''Reference Number (107)''' Constant: myField_RefNum Type: Integer '''Transfer Size (108)''' Constant: myField_TransferSize Type: Integer '''Chat Options (109)''' Constant: myField_ChatOptions Type: Integer '''User Access (110)''' Constant: myField_UserAccess Type: Binary This field is represented as 64-bit bitmap. The specific bit meaning is described in the ''Access Privileges'' section of this document. '''User Alias (111)''' Constant: myField_UserAlias '''User Flags (112)''' Constant: myField_UserFlags Type: Integer User flags field is a bitmap with the following values: {| border="1" cellpadding="0" cellspacing="0" | style="width: 37px;" | Bit | style="width: 54px;" | Value | style="width: 499px;" | Description |- | style="width: 37px;" | 0 | style="width: 54px;" | 1 | style="width: 499px;" | User is away |- | style="width: 37px;" | 1 | style="width: 54px;" | 2 | style="width: 499px;" | User is admin (or disconnected?) |- | style="width: 37px;" | 2 | style="width: 54px;" | 4 | style="width: 499px;" | User refuses private messages |- | style="width: 37px;" | 3 | style="width: 54px;" | 8 | style="width: 499px;" | User refuses private chat |} '''Options (113)''' Constant: myField_Options Type: Integer '''Chat ID (114)''' Constant: myField_ChatID Type: Integer '''Chat Subject (115)''' Constant: myField_ChatSubject Type: String '''Waiting Count (116)''' Constant: myField_WaitingCount Type: Integer '''Server Agreement (150)''' Constant: myField_ServerAgreement '''Server Banner (151)''' Constant: myField_ServerBanner Type: Binary '''Server Banner Type (152)''' Constant: myField_ServerBannerType Type: Integer This field can have one of the following values: {| border="1" cellpadding="0" cellspacing="0" | style="width: 49px;" | Value | style="width: 114px;" | Equivalent Value | style="width: 427px;" | Description |- | style="width: 49px;" | 1 | style="width: 114px;" | ‘URL ‘ | style="width: 427px;" | URL link |- | style="width: 49px;" | 3 | style="width: 114px;" | ‘JPEG’ | style="width: 427px;" | JPEG file |- | style="width: 49px;" | 4 | style="width: 114px;" | ‘GIFf’ | style="width: 427px;" | GIF file |- | style="width: 49px;" | 5 | style="width: 114px;" | ‘BMP ‘ | style="width: 427px;" | BMP file |- | style="width: 49px;" | 6 | style="width: 114px;" | ‘PICT | style="width: 427px;" | PICT file |} '''Server Banner URL (153)''' Constant: myField_ServerBannerUrl Type: Binary '''No Server Agreement (154)''' Constant: myField_NoServerAgreement Type: Integer The value of this field is 1 if there is no agreement to be sent. '''Version (160)''' Constant: myField_Vers Type: Integer '''Community Banner ID (161)''' Constant: myField_CommunityBannerID Type: Integer '''Server Name (162)''' Constant: myField_ServerName Type: Binary '''File Name with Info (200)''' Constant: myField_FileNameWithInfo Type: Binary File name with info field content is presented in this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Type | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | Folder (‘fldr’) or other |- | style="width: 103px;" | Creator | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | File size | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | Reserved? |- | style="width: 103px;" | Name script | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Name size | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Name data | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | |} '''File Name (201)''' Constant: myField_FileName Type: String '''File Path (202)''' Constant: myField_FilePath Type: Binary See [[Path Parameters]] for more info. '''File Resume Data (203)''' Constant: myField_FileResumeData Type: Binary File resume data field content is presented in this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Format | style="width: 42px;" | 4 | style="width: 66px;" | ‘RFLT’ | style="width: 379px;" | |- | style="width: 103px;" | Version | style="width: 42px;" | 2 | style="width: 66px;" | 1 | style="width: 379px;" | Currently 1 |- | style="width: 103px;" | RSVD | style="width: 42px;" | 34 | style="width: 66px;" | | style="width: 379px;" | ? |- | style="width: 103px;" | Fork count | style="width: 42px;" | 2 | style="width: 66px;" | 2 | style="width: 379px;" | Currently 2 |- | style="width: 103px;" | Fork info list… | style="width: 42px;" | | style="width: 66px;" | | style="width: 379px;" | |} Fork info list contains one or more records with the following structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Fork | style="width: 42px;" | 4 | style="width: 66px;" | ‘DATA’ | style="width: 379px;" | |- | style="width: 103px;" | Data size | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | Current file size |- | style="width: 103px;" | RSVD A | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | ? |- | style="width: 103px;" | RSVD B | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | ? |} '''File Transfer Options (204)''' Constant: myField_FileXferOptions Type: Integer '''File Type String (205)''' Constant: myField_FileTypeString Type: String '''File Creator String (206)''' Constant: myField_FileCreatorString Type: String '''File Size (207)''' Constant: myField_FileSize Type: Integer '''File Create Date (208)''' Constant: myField_FileCreateDate Type: Binary File create date field has this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Year | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Milliseconds | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Seconds | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |} See [[Date Parameters]] for more info. '''File Modify Date (209)''' Constant: myField_FileModifyDate Type: Binary File modify date field has this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Year | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Milliseconds | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Seconds | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |} See [[Date Parameters]] for more info. '''File Comment (210)''' Constant: myField_FileComment Type: String '''File New Name (211)''' Constant: myField_FileNewName Type: String '''File New Path (212)''' Constant: myField_FileNewPath Type: Binary '''File Type (213)''' Constant: myField_FileType Type: Binary File type field contains only one value: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | File type | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | File type code (‘fldr’ or other) |} '''Quoting Message (214)''' Constant: myField_QuotingMsg Type: Binary '''Automatic Response (215)''' Constant: myField_AutomaticResponse Type: String '''Folder Item Count (220)''' Constant: myField_FldrItemCount Type: Integer '''User Name with Info (300)''' Constant: myField_UserNameWithInfo Type: Binary User name with info field contains this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | User ID | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Icon ID | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | User flags | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | User name size | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | User name | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | User name string |} '''News Category GUID (319)''' Constant: myField_NewsCatGUID '''News Category List Data (320)''' Constant: myField_NewsCatListData Type: Binary News category list data field contains this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 84px;" | Data | style="width: 361px;" | Note |- | style="width: 103px;" | Type | style="width: 42px;" | 1 | style="width: 84px;" | 1, 10 or 255 | style="width: 361px;" | Category folder (1), category (10) or other (255) |- | style="width: 103px;" | Category name | style="width: 42px;" | rest | style="width: 84px;" | | style="width: 361px;" | |} This field is used for client/server version 1.5 (prior to April 15, 1999?). '''News Article List Data (321)''' Constant: myField_NewsArtListData Type: Binary News article list data field contains this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | ID | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Article count | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | Number of articles |- | style="width: 103px;" | Name size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Name | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Name string |- | style="width: 103px;" | Description size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Description | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Description string |- | style="width: 103px;" | List of articles… | style="width: 42px;" | | style="width: 66px;" | | style="width: 379px;" | Optional (if article count > 0) |} List of articles contains: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Article ID | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Time stamp | style="width: 42px;" | 8 | style="width: 66px;" | | style="width: 379px;" | Year (2 bytes), milliseconds (2 bytes) and seconds (4 bytes) |- | style="width: 103px;" | Parent article ID | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Article flags | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Flavor count | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Title size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Title | style="width: 42px;" | Size | style="width: 66px;" | | style="width: 379px;" | Title string |- | style="width: 103px;" | Poster size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Poster | style="width: 42px;" | Size | style="width: 66px;" | | style="width: 379px;" | Poster string |- | style="width: 103px;" | Flavor list… | style="width: 42px;" | | style="width: 66px;" | | style="width: 379px;" | Optional (if flavor count > 0) |} Flavor list has the following structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Flavor size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Flavor text | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | MIME type string |- | style="width: 103px;" | Article size | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |} '''News Category Name (322)''' Constant: myField_NewsCatName Type: String '''News Category List Data 1.5 (323)''' Constant: myField_NewsCatListData15 Type: Binary News category list data field contains this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Type | style="width: 42px;" | 2 | style="width: 66px;" | 2 or 3 | style="width: 379px;" | Bundle (2) or category (3) |} If type value indicates a bundle, what follows the type is: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Count | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Name size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Name data | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | |} In the case of a category type, type value is followed by: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Count | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | GUID | style="width: 42px;" | | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Add SN | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Delete SN | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Name size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Name data | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | |} '''News Path (325)''' Constant: myField_NewsPath Type: Binary '''News Article ID (326)''' Constant: myField_NewsArtID Type: Integer '''News Article Data Flavor (327)''' Constant: myField_NewsArtDataFlav Type: String '''News Article Title (328)''' Constant: myField_NewsArtTitle Type: String '''News Article Poster (329)''' Constant: myField_NewsArtPoster Type: String '''News Article Date (330)''' Constant: myField_NewsArtDate Type: Binary News article date field contains this structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Year | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Milliseconds | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Seconds | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |} See [[Date Parameters]] for more info. '''News Article – Previous Article (331)''' Constant: myField_NewsArtPrevArt Type: Integer '''News Article – Next Article (332)''' Constant: myField_NewsArtNextArt Type: Integer '''News Article Data (333)''' Constant: myField_NewsArtData Type: Binary '''News Article Flags (334)''' Constant: myField_NewsArtFlags Type: Integer '''News Article – Parent Article (335)''' Constant: myField_NewsArtParentArt Type: Integer '''News Article – First Child Article (336)''' Constant: myField_NewsArt1stChildArt Type: Integer '''News Article – Recursive Delete (337)''' (Delete Children) Constant: myField_NewsArtRecurseDel Type: Integer =Access Privileges= The following is the list of access privileges currently employed by the application. There are 3 types of access privileges: general, folder and bundle. Folder privileges are set per folder. Bundle access is related to the logical grouping of the information. General access privileges are used to set privileges for a user. '''Delete File (0)''' Constant: myAcc_DeleteFile Type: folder '''Upload File (1)''' Constant: myAcc_UploadFile Type: folder, general '''Download File (2)''' Constant: myAcc_DownloadFile Type: folder, general '''Rename File (3)''' Constant: myAcc_RenameFile '''Move File (4)''' Constant: myAcc_MoveFile '''Create Folder (5)''' Constant: myAcc_CreateFolder Type: folder '''Delete Folder (6)''' Constant: myAcc_DeleteFolder Type: folder '''Rename Folder (7)''' Constant: myAcc_RenameFolder '''Move Folder (8)''' Constant: myAcc_MoveFolder '''Read Chat (9)''' Constant: myAcc_ReadChat Type: general '''Send Chat (10)''' Constant: myAcc_SendChat Type: general '''Open Chat (11)''' Constant: myAcc_OpenChat '''Close Chat (12)''' Constant: myAcc_CloseChat '''Show in List (13)''' Constant: myAcc_ShowInList '''Create User (14)''' Constant: myAcc_CreateUser '''Delete User (15)''' Constant: myAcc_DeleteUser '''Open User (16)''' Constant: myAcc_OpenUser '''Modify User (17)''' Constant: myAcc_ModifyUser '''Change Own Password (18)''' Constant: myAcc_ChangeOwnPass '''Send Private Message (19)''' Constant: myAcc_SendPrivMsg '''News Read Article (20)''' Constant: myAcc_NewsReadArt Type: bundle, general '''News Post Article (21)''' Constant: myAcc_NewsPostArt Type: general, bundle '''Disconnect User (22)''' Constant: myAcc_DisconUser Type: general '''Cannot be Disconnected (23)''' Constant: myAcc_CannotBeDiscon '''Get Client Info (24)''' Constant: myAcc_GetClientInfo Type: general '''Upload Anywhere (25)''' Constant: myAcc_UploadAnywhere '''Any Name (26)''' Constant: myAcc_AnyName Type: general '''No Agreement (27)''' Constant: myAcc_NoAgreement '''Set File Comment (28)''' Constant: myAcc_SetFileComment Type: folder '''Set Folder Comment (29)''' Constant: myAcc_SetFolderComment Type: folder '''View Drop Boxes (30)''' Constant: myAcc_ViewDropBoxes '''Make Alias (31)''' Constant: myAcc_MakeAlias Type: folder '''Broadcast (32)''' Constant: myAcc_Broadcast Type: general '''News Delete Article (33)''' Constant: myAcc_NewsDeleteArt Type: bundle '''News Create Category (34)''' Constant: myAcc_NewsCreateCat Type: bundle '''News Delete Category (35)''' Constant: myAcc_NewsDeleteCat Type: bundle '''News Create Folder (36)''' Constant: myAcc_NewsCreateFldr Type: bundle '''News Delete Folder (37)''' Constant: myAcc_NewsDeleteFldr Type: bundle =Download Folder Actions= These values are used to control folder upload/download process. When an application receives folder upload request, it is presented with the first applicable file. In the reply, application will specify an action to be performed: '''Send File (1)''' Constant: dlFldrAction_SendFile Send file action starts the download of the file specified in the request. An additional TCP connection is opened to transfer this file, according to the protocol described in Download Folder (210) and Upload Folder (213) transaction. '''Resume File Download (2)''' Constant: dlFldrAction_ResumeFile This action is similar to the send file action. It also starts the download, while providing the starting position in the file. An additional TCP connection is opened to transfer this file, in the same manner as for send file action. '''Next File (3)''' Constant: dlFldrAction_NextFile Next file action notifies the receiver to send the name of the next file in a folder. Download of the current file in not initiated. =Transaction Sequences= Hotline client contains few predefined transaction sequences in its current implementation. These sequences are described in this section. ==Login== After sending Login transaction (107), server will reply with Show Agreement (109). If user accepts the agreement, Hotline client sends Agreed transaction (121), followed by Get User Name List (300). Next, a Get File Name List (200) or Get News Category Name List (370) transaction is sent, depending on user preferences. If server version is < 151, server will not send Show Agreement reply. In this case, after Login (107) transaction is sent, client sends Set Client User Info (304) transaction with only User Name (102) and User Icon ID (104) fields used, and does not expect a reply. Subsequently, it sends Get User Name List (300) request, followed by Get File Name List (200) or Get News Category Name List (370), depending on user preferences. After that, a banner is requested from HTTP server. See the [[Transactions]] page for more details. ==Invite To Chat== When client receives Invite To Chat (113) transaction from the sever with version < 151, and client has automatic response or reject chat flag set, Reject Chat Invite (114) transaction is sent back to the server. =Tracker Interface= All string values use 8-bit ASCII character set encoding. ==Client Interface with Tracker== After establishing a connection with tracker, the following information is sent: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Magic number | style="width: 42px;" | 4 | style="width: 66px;" | ‘HTRK’ | style="width: 379px;" | |- | style="width: 103px;" | Version | style="width: 42px;" | 2 | style="width: 66px;" | 1 or 2 | style="width: 379px;" | Old protocol (1) or new (2) |} When version number is 2, request also includes additional data: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Login size | style="width: 42px;" | 1 | style="width: 66px;" | >= 31 | style="width: 379px;" | Login string size |- | style="width: 103px;" | Login | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Login string (padded with 0) |- | style="width: 103px;" | Password size | style="width: 42px;" | 1 | style="width: 66px;" | >= 31 | style="width: 379px;" | Password string size |- | style="width: 103px;" | Password | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Password string (padded with 0) |} Reply received from the tracker starts with a header: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Magic number | style="width: 42px;" | 4 | style="width: 66px;" | ‘HTRK’ | style="width: 379px;" | 0x4854524B |- | style="width: 103px;" | Version | style="width: 42px;" | 2 | style="width: 66px;" | 1 or 2 | style="width: 379px;" | Old protocol (1) or new (2) |} Server information header follows, formatted as: {| border="1" cellpadding="0" cellspacing="0" | style="width: 115px;" | Description | style="width: 41px;" | Size | style="width: 64px;" | Data | style="width: 370px;" | Note |- | style="width: 115px;" | Message type | style="width: 41px;" | 2 | style="width: 64px;" | 1 | style="width: 370px;" | Sending list of servers |- | style="width: 115px;" | Message data size | style="width: 41px;" | 2 | style="width: 64px;" | | style="width: 370px;" | Remaining size of this request |- | style="width: 115px;" | Number of servers | style="width: 41px;" | 2 | style="width: 64px;" | | style="width: 370px;" | Number of servers in the server list |- | style="width: 115px;" | Number of servers | style="width: 41px;" | 2 | style="width: 64px;" | | style="width: 370px;" | Same as previous field |- | style="width: 115px;" | Server list… | style="width: 41px;" | | style="width: 64px;" | | style="width: 370px;" | |} A record in the server list has the following structure: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | IP address | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | Server’s IP address |- | style="width: 103px;" | IP port number | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | Server’s IP port number |- | style="width: 103px;" | Number of users | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | Number of users connected to this particular server |- | style="width: 103px;" | | style="width: 42px;" | 2 | style="width: 66px;" | 0 | style="width: 379px;" | |- | style="width: 103px;" | Name size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | Server’s name string size |- | style="width: 103px;" | Name | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Server’s name |- | style="width: 103px;" | Description size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | Server’s description string size |- | style="width: 103px;" | Description | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Description of the server |} If the number of servers in the server list is less than number of servers specified in the server information header, client will expect an additional server information, starting with the new server information header. The field containing number of servers in the new header should have the same value as the previous one. When a client is connected to the tracker over the HTTP tunneling protocol, the client does not send any request to the tracker, although it still expects a properly formatted reply. In this case establishing a connection to the tracker indicates a request for the server list. ==Server Interface with Tracker== Server sets up UDP port that is used to periodically send the following information to the trackers: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | | style="width: 42px;" | 2 | style="width: 66px;" | 1 | style="width: 379px;" | |- | style="width: 103px;" | IP port number | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | Server’s listening UDP port number |- | style="width: 103px;" | Number of users | style="width: 42px;" | 2 | style="width: 66px;" | | style="width: 379px;" | Number of users connected to this particular server |- | style="width: 103px;" | | style="width: 42px;" | 2 | style="width: 66px;" | 0 | style="width: 379px;" | |- | style="width: 103px;" | Pass ID | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | Random number generated by the server |- | style="width: 103px;" | Name size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | Server’s name string size |- | style="width: 103px;" | Name | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Server’s name |- | style="width: 103px;" | Description size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | Server’s description string size |- | style="width: 103px;" | Description | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Description of the server |} In the case when old (?) tracker is used, the additional information is formatted as follows: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Password size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | Server’s tracker password string size |- | style="width: 103px;" | Password | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Server’s tracker password |} For a new version of the tracker: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Login size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | Server’s tracker login string size |- | style="width: 103px;" | Login | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Server’s tracker login |- | style="width: 103px;" | Password size | style="width: 42px;" | 1 | style="width: 66px;" | | style="width: 379px;" | Server’s tracker password string size |- | style="width: 103px;" | Password | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | Server’s tracker password |} '''HTTP Tunneling''' When client is unable to communicate with the server using plain TCP connection, HTTP tunneling can be utilized to access the Hotline server over an HTTP proxy. To accomplish this, the client creates two connections to the server. One would be used for sending, and other for receiving data. After these connections are open, the client begins transmitting standard HTTP requests. If HTTP proxy terminates connection while that connection is still in use, the client recreates them, and interrupted requests are resent. ==HTTP Requests== HTTP POST request is sent over sending, while GET request is sent over receiving connection. The POST request is specified as follows: POST <address> HTTP/1.0\r\n Proxy-Connection: Keep-Alive\r\n Pragma: no-cache\r\n Host: <host>\r\n Content-Length: 999999999\r\n Content-Type: hotline/protocol\r\n \r\n The server replies to this request at the time when connection is about to be closed, as: HTTP/1.0 302 Found\r\n Connection: close\r\n Content-Length: 8\r\n Content-Type: hotline/protocol\r\n \r\n Next 8 bytes are filled with 0 to indicate termination of a connection. GET request is specified as: GET<address> HTTP/1.0\r\n Proxy-Connection: Keep-Alive\r\n Pragma: no-cache\r\n Host: <host>\r\n Accept: hotline/protocol\r\n \r\n Server’s immediate reply to GET is: HTTP/1.0 200 OK\r\n Proxy-Connection: Keep-Alive\r\n Content-Length: 999999999\r\n Content-Type: hotline/protocol\r\n \r\n After this reply, server uses this connection to send data to the client. Address used in these requests is standard URL address followed by the session ID, specified as the file in the root directory. This is an example of such address: http://tracker.com:5497/5555-5555-5555 Session ID is used in order to identify the client in the case of disconnect. Host name specified in the HTTP headers is in the form of standard domain name string, followed by the port number. For example: tracker.com:5497 ==Data Header== Additional header precedes every transaction that is sent over these two connections. This header has the format: {| border="1" cellpadding="0" cellspacing="0" | style="width: 103px;" | Description | style="width: 42px;" | Size | style="width: 66px;" | Data | style="width: 379px;" | Note |- | style="width: 103px;" | Data code | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | Disconnect (0), data (1), padding (2) |- | style="width: 103px;" | Data size | style="width: 42px;" | 4 | style="width: 66px;" | | style="width: 379px;" | |- | style="width: 103px;" | Data… | style="width: 42px;" | size | style="width: 66px;" | | style="width: 379px;" | |} Data content depends on the data code specified. If data code value is 1 (constant is http_Data), data content is transaction data as described in this specification (this includes tracker protocol). Code and size with value 0 (hard-coded constant) notifies the remote end of a pending disconnect. After predetermined period of inactivity on an HTTP connection, the proxy server can close that link in order to preserve its resources. To prevent this, additional “padding” data is transmitted, only to keep this connection “alive”. Data code value 2 (http_Padding) indicates that this is the case. When remote end receives this packet type, its data content is simply discarded. '''Global Server''' '''1.1 Server Information''' Hotline servers will be able to create an account on the global server by providing a unique ''server name'' (relatively short in size) and an ''access password''. This information constitutes an account login information that will have to be provided in every subsequent access to the global server. At the time the account is created, the global server assigns the unique ''server ID'' to the server. Global server will provide servers with the ability to store a predefined set of data fields. In addition to the name, the server can also provide region specific ''server alias''. Description field can be used to describe the server’s content to users. Servers can also be optionally classified into one of the few predefined categories provided by the global server. This will allow users to determine server’s content based on a common ''classification'' scheme. An optional ''public encryption key'' can be used to authenticate the server to the users that are connecting to it. Global server will also record server’s ''original and current''(last used) ''IP address''. ''Server flags ''enable or disable various operations that global server performs. ''Searchable flag'' signals if the server will be included as part of the results of the user’s query. ''Rating'' field enables users to rate the server. ''Server status ''describes the current availability of server’s services. ''On-line status'' indicates that server is currently operational and ready to process requests. ''Active status'' shows that server’s account is active, even if the server is not currently on-line. Removing active status indicates that the server can’t be made operational in the short term. This can be used when the server is about to go through a non-trivial maintenance process. The server can also specify the ''number of users'' currently connected to it. Global server records ''date'' when account was ''created'' and ''accessed''. The following table summarizes the server information stored on the global server: {| border="1" cellpadding="0" cellspacing="0" | style="width: 133px;" | =Data= | style="width: 192px;" | ==Options== | style="width: 265px;" | Note |- | style="width: 133px;" | Server ID | style="width: 192px;" | | style="width: 265px;" | Assigned by the global server |- | style="width: 133px;" | Server name | style="width: 192px;" | | style="width: 265px;" | Used as login |- | style="width: 133px;" | Access password | style="width: 192px;" | | style="width: 265px;" | |- | style="width: 133px;" | Server alias | style="width: 192px;" | | style="width: 265px;" | Region specific alias |- | style="width: 133px;" | Description | style="width: 192px;" | | style="width: 265px;" | |- | style="width: 133px;" | Classification | style="width: 192px;" | | style="width: 265px;" | |- | style="width: 133px;" | Icon | style="width: 192px;" | | style="width: 265px;" | Graphical icon |- | style="width: 133px;" | Rating | style="width: 192px;" | | style="width: 265px;" | |- | style="width: 133px;" | Public encryption key | style="width: 192px;" | | style="width: 265px;" | |- | style="width: 133px;" | IP address | style="width: 192px;" | Original Current | style="width: 265px;" | Include the port number |- | style="width: 133px;" | Attributes | style="width: 192px;" | Searchable Allow rating | style="width: 265px;" | |- | style="width: 133px;" | Status flags | style="width: 192px;" | Active On-line | style="width: 265px;" | Active or not On-line or off-line |- | style="width: 133px;" | Number of users | style="width: 192px;" | | style="width: 265px;" | |- | style="width: 133px;" | Date | style="width: 192px;" | Account created Last access | style="width: 265px;" | |} '''1.2 Global Server Transactions''' '''1.2.1 Server Login''' Initiator: Server This transaction is used every time the server logins to the global server. It must be the first transaction sent to the global server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Server name | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Access password | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | New account indicator | style="width: 409px;" | Optional Indicates if this is a new account |} Fields used in the reply: None If server indicates that it creates a new account, and account with identical ID already exists in the database, or if a new account cannot be created for any other reason, the global server indicates these conditions with the proper error code. '''1.2.2 Update Server Information''' Initiator: Server Update server information on the global server. All fields in this request are optional. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Access password | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Server name | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Server alias | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Description | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Classification | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Icon | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Attributes | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Status flags | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | IP port number | style="width: 409px;" | Hotline protocol port number |- | style="width: 43px;" | | style="width: 138px;" | Number of users | style="width: 409px;" | Current number of users |} Fields used in the reply: None '''1.2.3 Delete Server Account''' Access: Administrator Initiator: Client Delete server account from the database. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Server name | style="width: 409px;" | |} Fields used in the reply: None '''1.2.4 Rate Server''' Initiator: Client Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Server name | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Rating | style="width: 409px;" | |} Fields used in the reply: None '''1.2.5 Query Server Database''' Initiator: Client Create a query for the server database. All fields in this request are optional. If client does not specify the search string, the list of all servers is returned. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Search string | style="width: 409px;" | Optional |- | style="width: 43px;" | | style="width: 138px;" | Classification | style="width: 409px;" | Optional |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Server ID | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Server ID … | style="width: 409px;" | Optional More server IDs |} '''1.2.6 Get Server Information''' Initiator: Client Get information about the specific server. Fields used in the request: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Server ID | style="width: 409px;" | |} Fields used in the reply: {| border="1" cellpadding="0" cellspacing="0" | style="width: 43px;" | '''ID''' | style="width: 138px;" | Field Name | style="width: 409px;" | Note |- | style="width: 43px;" | | style="width: 138px;" | Server name | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Server alias | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Description | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Current IP address | style="width: 409px;" | Including port number |- | style="width: 43px;" | | style="width: 138px;" | Classification | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Icon | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Status flags | style="width: 409px;" | |- | style="width: 43px;" | | style="width: 138px;" | Number of users | style="width: 409px;" | |} [[Category:Development]]
Summary:
Please note that all contributions to Hotline Wiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
HL Wiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Navigation menu
Personal tools
Not logged in
Talk
Contributions
Create account
Log in
Namespaces
Page
Discussion
English
Views
Read
Edit
Edit source
View history
More
Navigation
Home
Clients
Servers
Trackers
Development
Recent Changes
discord
Our Discord(BNETcc)
Macintosh Garden
partners
Macintosh Garden
BNET.cc
Moghouse
Tools
What links here
Related changes
Special pages
Page information