protostructs.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef __BARRY_PROTOSTRUCTS_H__
00031 #define __BARRY_PROTOSTRUCTS_H__
00032
00033 #include <stdint.h>
00034 #include <sys/types.h>
00035
00036
00037 namespace Barry { class Data; }
00038
00039 namespace Barry { namespace Protocol {
00040
00041
00042 union SizePacket
00043 {
00044 uint16_t size;
00045 char buffer[4];
00046 } __attribute__ ((packed));
00047
00048
00049
00050
00051
00052 struct GroupLink
00053 {
00054 uint32_t uniqueId;
00055 uint16_t unknown;
00056 } __attribute__ ((packed));
00057
00058 struct MessageAddress
00059 {
00060 uint8_t unknown[8];
00061 uint8_t addr[1];
00062
00063
00064 } __attribute__ ((packed));
00065
00066
00067
00068
00069
00070
00071 struct CommonField
00072 {
00073 uint16_t size;
00074 uint8_t type;
00075
00076 union CommonFieldData
00077 {
00078
00079 GroupLink link;
00080 MessageAddress addr;
00081 uint32_t uint32;
00082 int32_t min1900;
00083 uint16_t code;
00084 uint8_t raw[1];
00085 int16_t int16;
00086
00087 } __attribute__ ((packed)) u;
00088
00089 } __attribute__ ((packed));
00090 #define COMMON_FIELD_HEADER_SIZE (sizeof(Barry::Protocol::CommonField) - sizeof(Barry::Protocol::CommonField::CommonFieldData))
00091 #define COMMON_FIELD_MIN1900_SIZE (sizeof(int32_t))
00092
00093 struct CommandTableField
00094 {
00095 uint8_t size;
00096 uint8_t code;
00097 uint8_t name[1];
00098 } __attribute__ ((packed));
00099 #define COMMAND_FIELD_HEADER_SIZE (sizeof(Barry::Protocol::CommandTableField) - 1)
00100
00101 struct OldDBDBField
00102 {
00103 uint16_t dbNumber;
00104 uint8_t unknown1;
00105 uint32_t dbSize;
00106
00107 uint16_t dbRecordCount;
00108 uint16_t unknown2;
00109 uint16_t nameSize;
00110 uint8_t name[1];
00111 } __attribute__ ((packed));
00112 #define OLD_DBDB_FIELD_HEADER_SIZE (sizeof(Barry::Protocol::OldDBDBField) - 1)
00113
00114 struct DBDBField
00115 {
00116 uint16_t dbNumber;
00117 uint8_t unknown1;
00118 uint32_t dbSize;
00119
00120 uint32_t dbRecordCount;
00121 uint16_t unknown2;
00122 uint16_t nameSize;
00123 uint8_t unknown3;
00124 uint8_t name[1];
00125 uint16_t unknown;
00126
00127
00128 } __attribute__ ((packed));
00129 #define DBDB_FIELD_HEADER_SIZE (sizeof(Barry::Protocol::DBDBField) - 1)
00130
00131 struct RecordStateTableField
00132 {
00133 uint8_t rectype;
00134
00135
00136
00137
00138
00139 uint16_t index;
00140 uint32_t uniqueId;
00141
00142 uint8_t flags;
00143
00144
00145 #define BARRY_RSTF_DIRTY 0x01
00146 uint8_t unknown2[4];
00147 } __attribute__ ((packed));
00148
00149 struct CalendarRecurrenceDataField
00150 {
00151 uint8_t type;
00152 #define CRDF_TYPE_DAY 0x01
00153 #define CRDF_TYPE_MONTH_BY_DATE 0x03
00154 #define CRDF_TYPE_MONTH_BY_DAY 0x04
00155 #define CRDF_TYPE_YEAR_BY_DATE 0x05
00156 #define CRDF_TYPE_YEAR_BY_DAY 0x06
00157 #define CRDF_TYPE_WEEK 0x0c
00158
00159 uint8_t unknown;
00160 uint16_t interval;
00161 uint32_t startTime;
00162 uint32_t endTime;
00163
00164 union Additional
00165 {
00166
00167
00168 struct Day
00169 {
00170 uint8_t day[6];
00171 } __attribute__ ((packed)) day;
00172
00173 struct MonthByDate
00174 {
00175 uint8_t monthDay;
00176
00177 uint8_t blank[5];
00178 } __attribute__ ((packed)) month_by_date;
00179
00180 struct MonthByDay
00181 {
00182 uint8_t weekDay;
00183 uint8_t week;
00184
00185
00186 uint8_t blank[4];
00187 } __attribute__ ((packed)) month_by_day;
00188
00189 struct YearByDate
00190 {
00191 uint8_t monthDay;
00192
00193 uint8_t blank;
00194 uint8_t month;
00195 uint8_t blank_[3];
00196 } __attribute__ ((packed)) year_by_date;
00197
00198 struct YearByDay
00199 {
00200 uint8_t weekDay;
00201 uint8_t week;
00202 uint8_t month;
00203 uint8_t blank[3];
00204 } __attribute__ ((packed)) year_by_day;
00205
00206 struct Week
00207 {
00208 uint8_t days;
00209 #define CRDF_WD_SUN 0x01
00210 #define CRDF_WD_MON 0x02
00211 #define CRDF_WD_TUE 0x04
00212 #define CRDF_WD_WED 0x08
00213 #define CRDF_WD_THU 0x10
00214 #define CRDF_WD_FRI 0x20
00215 #define CRDF_WD_SAT 0x40
00216
00217 uint8_t blank[5];
00218 } __attribute__ ((packed)) week;
00219
00220 } __attribute__ ((packed)) u;
00221
00222 } __attribute__ ((packed));
00223 #define CALENDAR_RECURRENCE_DATA_FIELD_SIZE sizeof(Barry::Protocol::CalendarRecurrenceDataField)
00224
00225
00226
00227
00228
00229
00230 struct PackedField_02
00231 {
00232 uint8_t code;
00233 uint8_t size;
00234 uint8_t type;
00235 uint8_t raw[1];
00236 } __attribute__ ((packed));
00237 #define PACKED_FIELD_02_HEADER_SIZE (sizeof(Barry::Protocol::PackedField_02) - 1)
00238
00239 struct PackedField_10
00240 {
00241 uint8_t type;
00242 uint8_t size;
00243 uint8_t raw[1];
00244 } __attribute__ ((packed));
00245 #define PACKED_FIELD_10_HEADER_SIZE (sizeof(Barry::Protocol::PackedField_10) - 1)
00246
00247
00248
00249
00250
00251
00252
00253 struct ServiceBookConfigField
00254 {
00255 uint8_t format;
00256 uint8_t fields[1];
00257 } __attribute__ ((packed));
00258 #define SERVICE_BOOK_CONFIG_FIELD_HEADER_SIZE (sizeof(Barry::Protocol::ServiceBookConfigField) - 1)
00259
00260
00261
00262
00263
00264 struct DBC_Record
00265 {
00266 uint16_t recordIndex;
00267 uint8_t data[1];
00268 } __attribute__ ((packed));
00269 #define DBC_RECORD_HEADER_SIZE (sizeof(Barry::Protocol::DBC_Record) - 1)
00270
00271 struct DBC_RecordFlags
00272 {
00273 uint8_t unknown;
00274 uint16_t index;
00275 uint8_t unknown2[5];
00276 } __attribute__ ((packed));
00277 #define DBC_RECORD_FLAGS_SIZE (sizeof(Barry::Protocol::DBC_RecordFlags))
00278
00279 struct DBC_TaggedUpload
00280 {
00281 uint8_t rectype;
00282
00283
00284
00285
00286
00287 uint32_t uniqueId;
00288 uint8_t unknown2;
00289 uint8_t data[1];
00290 } __attribute__ ((packed));
00291 #define DBC_TAGGED_UPLOAD_HEADER_SIZE (sizeof(Barry::Protocol::DBC_TaggedUpload) - 1)
00292
00293 struct DBC_IndexedUpload
00294 {
00295 uint8_t unknown;
00296 uint16_t index;
00297 uint8_t data[1];
00298 } __attribute__ ((packed));
00299 #define DBC_INDEXED_UPLOAD_HEADER_SIZE (sizeof(Barry::Protocol::DBC_IndexedUpload) - 1)
00300
00301 struct PasswordChallenge
00302 {
00303 uint8_t remaining_tries;
00304
00305
00306
00307
00308 uint8_t unknown;
00309
00310
00311
00312 uint16_t param;
00313
00314
00315
00316
00317 union Hash
00318 {
00319 uint32_t seed;
00320 uint8_t hash[20];
00321 } __attribute__ ((packed)) u;
00322
00323 } __attribute__ ((packed));
00324 #define PASSWORD_CHALLENGE_HEADER_SIZE (sizeof(Barry::Protocol::PasswordChallenge) - sizeof(Barry::Protocol::PasswordChallenge::Hash))
00325 #define PASSWORD_CHALLENGE_SEED_SIZE (PASSWORD_CHALLENGE_HEADER_SIZE + sizeof(uint32_t))
00326 #define PASSWORD_CHALLENGE_SIZE (sizeof(Barry::Protocol::PasswordChallenge))
00327
00328 struct AttributeFetch
00329 {
00330 uint16_t object;
00331 uint16_t attribute;
00332 uint8_t raw[1];
00333 } __attribute__ ((packed));
00334 #define ATTRIBUTE_FETCH_COMMAND_SIZE (sizeof(Barry::Protocol::AttributeFetch) - 1)
00335
00336 struct ModeSelect
00337 {
00338 uint8_t name[16];
00339 struct ResponseBlock
00340 {
00341 uint8_t unknown[20];
00342 } __attribute__ ((packed)) response;
00343 } __attribute__ ((packed));
00344
00345
00346
00347
00348
00349 struct SocketCommand
00350 {
00351 uint16_t socket;
00352 uint8_t sequence;
00353
00354
00355
00356 union PacketData
00357 {
00358
00359 PasswordChallenge password;
00360 AttributeFetch fetch;
00361 ModeSelect mode;
00362 uint8_t raw[1];
00363
00364 } __attribute__ ((packed)) u;
00365 } __attribute__ ((packed));
00366 #define SOCKET_COMMAND_HEADER_SIZE (sizeof(Barry::Protocol::SocketCommand) - sizeof(Barry::Protocol::SocketCommand::PacketData))
00367
00368 struct SequenceCommand
00369 {
00370 uint8_t unknown1;
00371 uint8_t unknown2;
00372 uint8_t unknown3;
00373 uint32_t sequenceId;
00374 } __attribute__ ((packed));
00375
00376 struct DBCommand
00377 {
00378 uint8_t operation;
00379 uint16_t databaseId;
00380
00381 union Parameters
00382 {
00383
00384 DBC_Record record;
00385 DBC_RecordFlags flags;
00386 DBC_TaggedUpload tag_upload;
00387 DBC_IndexedUpload index_upload;
00388 uint8_t raw[1];
00389
00390 } __attribute__ ((packed)) u;
00391 } __attribute__ ((packed));
00392 #define DB_COMMAND_HEADER_SIZE (sizeof(Barry::Protocol::DBCommand) - sizeof(Barry::Protocol::DBCommand::Parameters))
00393
00394
00395
00396
00397
00398
00399 struct DBR_OldDBDBRecord
00400 {
00401 uint16_t count;
00402 OldDBDBField field[1];
00403 } __attribute__ ((packed));
00404 #define OLD_DBDB_RECORD_HEADER_SIZE (sizeof(Barry::Protocol::DBR_OldDBDBRecord) - sizeof(Barry::Protocol::OldDBDBField))
00405
00406 struct DBR_DBDBRecord
00407 {
00408 uint16_t count;
00409 uint8_t unknown[3];
00410 DBDBField field[1];
00411 } __attribute__ ((packed));
00412 #define DBDB_RECORD_HEADER_SIZE (sizeof(Barry::Protocol::DBR_DBDBRecord) - sizeof(Barry::Protocol::DBDBField))
00413
00414
00415
00416
00417
00418
00419
00420 struct DBR_OldTaggedRecord
00421 {
00422 uint8_t rectype;
00423 uint16_t index;
00424 uint32_t uniqueId;
00425 uint8_t unknown2;
00426
00427 union TaggedData
00428 {
00429 CommonField field[1];
00430 } __attribute__ ((packed)) u;
00431 } __attribute__ ((packed));
00432 #define DBR_OLD_TAGGED_RECORD_HEADER_SIZE (sizeof(Barry::Protocol::DBR_OldTaggedRecord) - sizeof(Barry::Protocol::DBR_OldTaggedRecord::TaggedData))
00433
00434 struct MessageRecord
00435 {
00436 uint8_t field1;
00437 uint32_t field2;
00438 uint32_t flags;
00439 uint32_t field4;
00440
00441
00442 uint32_t field5;
00443 uint32_t field6;
00444 uint32_t field7;
00445 uint32_t field8;
00446 uint16_t field9;
00447
00448 uint16_t dateReceived;
00449 uint16_t timeReceived;
00450 uint16_t dateDuplicate;
00451 uint16_t timeDuplicate;
00452 uint16_t dateSent;
00453 uint16_t timeSent;
00454
00455 uint16_t priority;
00456 uint32_t field14;
00457 uint32_t field15;
00458 uint16_t field16;
00459 uint32_t field13;
00460 uint16_t messageSize;
00461 uint32_t field18;
00462 uint32_t field19;
00463 uint16_t field20;
00464 uint16_t field21;
00465 uint32_t inReplyTo;
00466 uint32_t field22;
00467 uint16_t field23;
00468
00469 uint32_t folderOne;
00470 uint32_t folderTwo;
00471
00472 uint16_t replyMessageFlags;
00473
00474
00475
00476
00477 uint16_t field27;
00478 uint32_t headerUID;
00479
00480 uint32_t field29;
00481 uint16_t field30;
00482 uint16_t field31;
00483 uint16_t field32;
00484 uint16_t field34;
00485 uint8_t field33;
00486 uint32_t timeBlock;
00487 CommonField field[1];
00488 } __attribute__ ((packed));
00489 #define MESSAGE_RECORD_HEADER_SIZE (sizeof(Barry::Protocol::MessageRecord) - sizeof(Barry::Protocol::CommonField))
00490
00491
00492
00493
00494
00495
00496 struct DBResponse
00497 {
00498 uint8_t operation;
00499
00500 union Parameters
00501 {
00502
00503 DBR_OldTaggedRecord tagged;
00504 DBR_OldDBDBRecord old_dbdb;
00505 DBR_DBDBRecord dbdb;
00506
00507 } __attribute__ ((packed)) u;
00508
00509 } __attribute__ ((packed));
00510 #define DB_RESPONSE_HEADER_SIZE (sizeof(Barry::Protocol::DBResponse) - sizeof(Barry::Protocol::DBResponse::Parameters))
00511
00512
00513
00514
00515
00516
00517
00518 struct DBAccess
00519 {
00520 uint8_t tableCmd;
00521
00522 union DBData
00523 {
00524 DBCommand command;
00525 DBResponse response;
00526 CommandTableField table[1];
00527 uint8_t return_code;
00528 uint8_t fragment[1];
00529
00530 } __attribute__ ((packed)) u;
00531 } __attribute__ ((packed));
00532 #define SB_DBACCESS_HEADER_SIZE (sizeof(Barry::Protocol::DBAccess) - sizeof(Barry::Protocol::DBAccess::DBData))
00533 #define SB_DBACCESS_RETURN_CODE_SIZE (1)
00534
00535
00536
00537
00538
00539
00540 struct Packet
00541 {
00542 uint16_t socket;
00543 uint16_t size;
00544 uint8_t command;
00545
00546 union PacketData
00547 {
00548
00549 SocketCommand socket;
00550 SequenceCommand sequence;
00551 DBAccess db;
00552 uint8_t raw[1];
00553
00554 } __attribute__ ((packed)) u;
00555 } __attribute__ ((packed));
00556 #define SB_PACKET_HEADER_SIZE (sizeof(Barry::Protocol::Packet) - sizeof(Barry::Protocol::Packet::PacketData))
00557
00558
00559 #define MIN_PACKET_SIZE 6
00560
00561
00562
00563 #define MAX_PACKET_SIZE 0x400 // anything beyond this needs to be
00564
00565
00566
00567
00568
00569
00570
00571 #define SB_PACKET_DBACCESS_HEADER_SIZE (SB_PACKET_HEADER_SIZE + SB_DBACCESS_HEADER_SIZE)
00572 #define SB_FRAG_HEADER_SIZE SB_PACKET_DBACCESS_HEADER_SIZE
00573
00574 #define SB_PACKET_COMMAND_HEADER_SIZE (SB_PACKET_DBACCESS_HEADER_SIZE + DB_COMMAND_HEADER_SIZE)
00575 #define SB_PACKET_RESPONSE_HEADER_SIZE (SB_PACKET_DBACCESS_HEADER_SIZE + DB_RESPONSE_HEADER_SIZE)
00576
00577 #define SB_PACKET_DBDB_HEADER_SIZE (SB_PACKET_RESPONSE_HEADER_SIZE + DBDB_RECORD_HEADER_SIZE)
00578 #define SB_PACKET_OLD_DBDB_HEADER_SIZE (SB_PACKET_RESPONSE_HEADER_SIZE + OLD_DBDB_RECORD_HEADER_SIZE)
00579
00580 #define SB_PACKET_UPLOAD_HEADER_SIZE (SB_PACKET_DBACCESS_HEADER_SIZE + UPLOAD_HEADER_SIZE)
00581
00582 #define SB_SEQUENCE_PACKET_SIZE (SB_PACKET_HEADER_SIZE + sizeof(Barry::Protocol::SequenceCommand))
00583 #define SB_SOCKET_PACKET_HEADER_SIZE (SB_PACKET_HEADER_SIZE + SOCKET_COMMAND_HEADER_SIZE)
00584 #define SB_MODE_PACKET_COMMAND_SIZE (SB_SOCKET_PACKET_HEADER_SIZE + sizeof(Barry::Protocol::ModeSelect) - sizeof(Barry::Protocol::ModeSelect::ResponseBlock))
00585 #define SB_MODE_PACKET_RESPONSE_SIZE (SB_SOCKET_PACKET_HEADER_SIZE + sizeof(Barry::Protocol::ModeSelect))
00586
00587
00588
00589 #define COMMAND(data) (((const Barry::Protocol::Packet *)data.GetData())->command)
00590 #define IS_COMMAND(data, cmd) (COMMAND(data) == cmd)
00591 #define MAKE_PACKET(var, data) const Barry::Protocol::Packet *var = (const Barry::Protocol::Packet *) (data).GetData()
00592 #define MAKE_PACKETPTR_BUF(var, ptr) Barry::Protocol::Packet *var = (Barry::Protocol::Packet *)ptr
00593 #define MAKE_RECORD(type,var,data,off) type *var = (type *) ((data).GetData() + (off))
00594 #define MAKE_RECORD_PTR(type,var,data,off) type *var = (type *) ((data) + (off))
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608 void CheckSize(const Barry::Data &packet, size_t requiredsize = MIN_PACKET_SIZE);
00609 unsigned int GetSize(const Barry::Data &packet);
00610
00611 }}
00612
00613 #endif
00614