Skip to content

Commit 9d868bd

Browse files
committed
Exposed bf_read and bf_write
1 parent b136416 commit 9d868bd

File tree

1 file changed

+382
-0
lines changed

1 file changed

+382
-0
lines changed

src/core/modules/basetypes/basetypes_wrap_python.cpp

+382
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ void export_send_prop_types();
5252
void export_send_prop_flags();
5353
void export_server_class();
5454
void export_take_damage_info();
55+
void export_bf_write();
56+
void export_bf_read();
5557

5658

5759
//-----------------------------------------------------------------------------
@@ -67,6 +69,8 @@ DECLARE_SP_MODULE(_basetypes)
6769
export_send_prop_flags();
6870
export_server_class();
6971
export_take_damage_info();
72+
export_bf_write();
73+
export_bf_read();
7074
}
7175

7276

@@ -372,3 +376,381 @@ void export_take_damage_info()
372376
// Add memory tools...
373377
TakeDamageInfo ADD_MEM_TOOLS(CTakeDamageInfo, "TakeDamageInfo");
374378
}
379+
380+
381+
//-----------------------------------------------------------------------------
382+
// Expose bf_read/bf_write.
383+
//-----------------------------------------------------------------------------
384+
class bf_writeExt {
385+
public:
386+
static void __del__(bf_write* buffer)
387+
{
388+
delete buffer->GetData();
389+
}
390+
391+
static boost::shared_ptr<bf_write> __init__(int buffer_size)
392+
{
393+
return boost::shared_ptr<bf_write>(new bf_write(new unsigned char[buffer_size], buffer_size), &__del__);
394+
}
395+
396+
static list GetData(bf_write& buffer)
397+
{
398+
list result;
399+
400+
unsigned char* data = buffer.GetData();
401+
for (int i=0; i < buffer.GetNumBytesWritten(); i++) {
402+
result.append(data[i]);
403+
}
404+
405+
return result;
406+
}
407+
};
408+
409+
void export_bf_write()
410+
{
411+
class_<bf_write>("bf_write", no_init)
412+
.def("__init__",
413+
make_constructor(&bf_writeExt::__init__, default_call_policies())
414+
)
415+
416+
.def("seek_to_bit",
417+
&bf_write::SeekToBit,
418+
"Seeks to a specific position."
419+
)
420+
421+
.def("write_one_bit",
422+
&bf_write::WriteOneBit
423+
)
424+
425+
.def("write_one_bit_no_check",
426+
&bf_write::WriteOneBitNoCheck
427+
)
428+
429+
.def("write_one_bit_at",
430+
&bf_write::WriteOneBitAt
431+
)
432+
433+
.def("write_ubit_long",
434+
&bf_write::WriteUBitLong,
435+
("data", "num_bits", arg("check_range")=true)
436+
)
437+
438+
.def("write_sbit_long",
439+
&bf_write::WriteSBitLong
440+
)
441+
442+
.def("write_ubit_var",
443+
&bf_write::WriteUBitVar,
444+
"Writes an unsigned integer with variable bit length."
445+
)
446+
447+
.def("write_bits_from_buffer",
448+
&bf_write::WriteBitsFromBuffer,
449+
"Copy the bits straight out of <pIn>. This seeks <pIn> forward by <nBits>. Returns an error if this buffer or the read buffer overflows."
450+
)
451+
452+
.def("write_bit_angle",
453+
&bf_write::WriteBitAngle
454+
)
455+
456+
.def("write_bit_coord",
457+
&bf_write::WriteBitCoord
458+
)
459+
460+
.def("write_bit_coord_mp",
461+
&bf_write::WriteBitCoordMP
462+
)
463+
464+
.def("write_bit_float",
465+
&bf_write::WriteBitFloat
466+
)
467+
468+
.def("write_bit_vec3_coord",
469+
&bf_write::WriteBitVec3Coord
470+
)
471+
472+
.def("write_bit_normal",
473+
&bf_write::WriteBitNormal
474+
)
475+
476+
.def("write_bit_vec3_normal",
477+
&bf_write::WriteBitVec3Normal
478+
)
479+
480+
.def("write_bit_angles",
481+
&bf_write::WriteBitAngles
482+
)
483+
484+
.def("write_char",
485+
&bf_write::WriteChar
486+
)
487+
488+
.def("write_byte",
489+
&bf_write::WriteByte
490+
)
491+
492+
.def("write_short",
493+
&bf_write::WriteShort
494+
)
495+
496+
.def("write_word",
497+
&bf_write::WriteWord
498+
)
499+
500+
.def("write_long",
501+
&bf_write::WriteLong
502+
)
503+
504+
.def("write_long_long",
505+
&bf_write::WriteLongLong
506+
)
507+
508+
.def("write_float",
509+
&bf_write::WriteFloat
510+
)
511+
512+
.def("write_string",
513+
// Required for CS:GO
514+
GET_METHOD(bool, bf_write, WriteString, const char*),
515+
"Returns false if it overflows the buffer."
516+
)
517+
518+
.def("get_num_bytes_written",
519+
&bf_write::GetNumBytesWritten
520+
)
521+
522+
.def("get_num_bits_written",
523+
&bf_write::GetNumBitsWritten
524+
)
525+
526+
.def("get_max_num_bits",
527+
&bf_write::GetMaxNumBits
528+
)
529+
530+
.def("get_num_bits_left",
531+
&bf_write::GetNumBitsLeft
532+
)
533+
534+
.def("get_num_bytes_left",
535+
&bf_write::GetNumBytesLeft
536+
)
537+
538+
.def("get_data",
539+
&bf_writeExt::GetData
540+
)
541+
542+
.def("check_for_overflow",
543+
&bf_write::CheckForOverflow
544+
)
545+
546+
.def("is_overflowed",
547+
&bf_write::IsOverflowed
548+
)
549+
550+
.def("set_overflow_flag",
551+
&bf_write::SetOverflowFlag
552+
)
553+
554+
.def_readwrite("data_bytes_count",
555+
&bf_write::m_nDataBytes
556+
)
557+
558+
.def_readwrite("data_bits_count",
559+
&bf_write::m_nDataBits
560+
)
561+
562+
.def_readwrite("current_bit",
563+
&bf_write::m_iCurBit
564+
)
565+
566+
ADD_MEM_TOOLS(bf_write, "bf_write")
567+
;
568+
}
569+
570+
class bf_readExt {
571+
public:
572+
static void __del__(bf_read* buffer)
573+
{
574+
delete buffer->GetBasePointer();
575+
}
576+
577+
static boost::shared_ptr<bf_read> __init__(bf_write& buffer)
578+
{
579+
int size = buffer.GetNumBytesWritten();
580+
void* pData = new unsigned char[size];
581+
memcpy(pData, buffer.GetData(), size);
582+
return boost::shared_ptr<bf_read>(new bf_read(pData, size), &__del__);
583+
}
584+
585+
static list GetData(bf_read& buffer)
586+
{
587+
list result;
588+
589+
const unsigned char* data = buffer.GetBasePointer();
590+
for (unsigned int i=0; i < buffer.m_nDataBytes; i++) {
591+
result.append(data[i]);
592+
}
593+
594+
return result;
595+
}
596+
597+
static int GetNumBytesRead(bf_read& buffer)
598+
{
599+
return BitByte(buffer.GetNumBitsRead());
600+
}
601+
602+
static str ReadString(bf_read& buffer)
603+
{
604+
char* pStr = new char[buffer.m_nDataBytes];
605+
buffer.ReadString(pStr, buffer.m_nDataBytes);
606+
607+
// Let Boost handle deallocating the string
608+
str result = str((const char *) pStr);
609+
delete pStr;
610+
return result;
611+
}
612+
};
613+
614+
void export_bf_read()
615+
{
616+
class_<bf_read>("bf_read", no_init)
617+
.def("__init__",
618+
make_constructor(&bf_readExt::__init__, default_call_policies())
619+
)
620+
621+
.def("read_one_bit",
622+
&bf_read::ReadOneBit
623+
)
624+
625+
.def("read_bit_angle",
626+
&bf_read::ReadBitAngle
627+
)
628+
629+
.def("read_ubit_long",
630+
&bf_read::ReadUBitLong
631+
)
632+
633+
.def("peek_ubit_long",
634+
&bf_read::PeekUBitLong
635+
)
636+
637+
.def("read_sbit_long",
638+
&bf_read::ReadSBitLong
639+
)
640+
641+
.def("read_ubit_var",
642+
&bf_read::ReadUBitVar
643+
)
644+
645+
.def("read_bit_coord",
646+
&bf_read::ReadBitCoord
647+
)
648+
649+
.def("read_bit_coord_mp",
650+
&bf_read::ReadBitCoordMP
651+
)
652+
653+
.def("read_bit_float",
654+
&bf_read::ReadBitFloat
655+
)
656+
657+
.def("read_bit_normal",
658+
&bf_read::ReadBitNormal
659+
)
660+
661+
.def("read_bit_vec3_coord",
662+
&bf_read::ReadBitVec3Coord
663+
)
664+
665+
.def("read_bit_vec3_normal",
666+
&bf_read::ReadBitVec3Normal
667+
)
668+
669+
.def("read_bit_angles",
670+
&bf_read::ReadBitAngles
671+
)
672+
673+
.def("read_char",
674+
&bf_read::ReadChar
675+
)
676+
677+
.def("read_byte",
678+
&bf_read::ReadByte
679+
)
680+
681+
.def("read_short",
682+
&bf_read::ReadShort
683+
)
684+
685+
.def("read_word",
686+
&bf_read::ReadWord
687+
)
688+
689+
.def("read_long",
690+
&bf_read::ReadLong
691+
)
692+
693+
.def("read_long_long",
694+
&bf_read::ReadLongLong
695+
)
696+
697+
.def("read_float",
698+
&bf_read::ReadFloat
699+
)
700+
701+
.def("read_string",
702+
&bf_readExt::ReadString
703+
)
704+
705+
.def("get_num_bytes_left",
706+
&bf_read::GetNumBytesLeft
707+
)
708+
709+
.def("get_num_bytes_read",
710+
&bf_readExt::GetNumBytesRead
711+
)
712+
713+
.def("get_num_bits_left",
714+
&bf_read::GetNumBitsLeft
715+
)
716+
717+
.def("get_num_bits_read",
718+
&bf_read::GetNumBitsRead
719+
)
720+
721+
.def("is_overflowed",
722+
&bf_read::IsOverflowed
723+
)
724+
725+
.def("seek",
726+
&bf_read::Seek
727+
)
728+
729+
.def("seek_relative",
730+
&bf_read::SeekRelative
731+
)
732+
733+
.def("set_overflow_flag",
734+
&bf_read::SetOverflowFlag
735+
)
736+
737+
.def("get_data",
738+
&bf_readExt::GetData
739+
)
740+
741+
.def_readwrite("data_bytes_count",
742+
&bf_read::m_nDataBytes
743+
)
744+
745+
.def_readwrite("data_bits_count",
746+
&bf_read::m_nDataBits
747+
)
748+
749+
.add_property("current_bit",
750+
&bf_read::Seek,
751+
&bf_read::GetNumBitsRead
752+
)
753+
754+
ADD_MEM_TOOLS(bf_read, "bf_read")
755+
;
756+
}

0 commit comments

Comments
 (0)