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