librats 1.0.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -331
- package/binding.gyp +16 -3
- package/lib/index.d.ts +288 -696
- package/lib/index.js +407 -44
- package/native-src/3rdparty/android/ifaddrs-android.c +1 -0
- package/native-src/3rdparty/android/ifaddrs-android.h +1 -0
- package/native-src/CMakeLists.txt +404 -179
- package/native-src/LICENSE +1 -1
- package/native-src/src/librats/bindings/rats.cpp +762 -0
- package/native-src/src/librats/bindings/rats.h +380 -0
- package/native-src/src/librats/bittorrent/bencode.cpp +437 -0
- package/native-src/src/librats/bittorrent/bencode.h +176 -0
- package/native-src/src/librats/bittorrent/bitfield.cpp +97 -0
- package/native-src/src/librats/bittorrent/bitfield.h +76 -0
- package/native-src/src/librats/bittorrent/byte_io.h +58 -0
- package/native-src/src/librats/bittorrent/choker.cpp +25 -0
- package/native-src/src/librats/bittorrent/choker.h +46 -0
- package/native-src/src/librats/bittorrent/client.cpp +413 -0
- package/native-src/src/librats/bittorrent/client.h +227 -0
- package/native-src/src/librats/bittorrent/disk_io.cpp +209 -0
- package/native-src/src/librats/bittorrent/disk_io.h +150 -0
- package/native-src/src/librats/bittorrent/extensions.cpp +191 -0
- package/native-src/src/librats/bittorrent/extensions.h +94 -0
- package/native-src/src/librats/bittorrent/file_storage.cpp +77 -0
- package/native-src/src/librats/bittorrent/file_storage.h +79 -0
- package/native-src/src/librats/bittorrent/log.h +42 -0
- package/native-src/src/librats/bittorrent/magnet_uri.cpp +98 -0
- package/native-src/src/librats/bittorrent/magnet_uri.h +35 -0
- package/native-src/src/librats/bittorrent/peer_connection.cpp +502 -0
- package/native-src/src/librats/bittorrent/peer_connection.h +194 -0
- package/native-src/src/librats/bittorrent/peer_list.cpp +68 -0
- package/native-src/src/librats/bittorrent/peer_list.h +75 -0
- package/native-src/src/librats/bittorrent/piece_picker.cpp +352 -0
- package/native-src/src/librats/bittorrent/piece_picker.h +201 -0
- package/native-src/src/librats/bittorrent/reactor.cpp +97 -0
- package/native-src/src/librats/bittorrent/reactor.h +89 -0
- package/native-src/src/librats/bittorrent/resume_data.cpp +72 -0
- package/native-src/src/librats/bittorrent/resume_data.h +41 -0
- package/native-src/src/librats/bittorrent/store_buffer.cpp +48 -0
- package/native-src/src/librats/bittorrent/store_buffer.h +47 -0
- package/native-src/src/librats/bittorrent/torrent.cpp +870 -0
- package/native-src/src/librats/bittorrent/torrent.h +260 -0
- package/native-src/src/librats/bittorrent/torrent_creator.cpp +129 -0
- package/native-src/src/librats/bittorrent/torrent_creator.h +58 -0
- package/native-src/src/librats/bittorrent/torrent_info.cpp +314 -0
- package/native-src/src/librats/bittorrent/torrent_info.h +118 -0
- package/native-src/src/librats/bittorrent/tracker.cpp +374 -0
- package/native-src/src/librats/bittorrent/tracker.h +108 -0
- package/native-src/src/librats/bittorrent/types.cpp +206 -0
- package/native-src/src/librats/bittorrent/types.h +86 -0
- package/native-src/src/librats/core/address.cpp +35 -0
- package/native-src/src/librats/core/address.h +78 -0
- package/native-src/src/librats/core/bytes.h +69 -0
- package/native-src/src/librats/core/chained_send_buffer.cpp +172 -0
- package/native-src/src/librats/core/chained_send_buffer.h +183 -0
- package/native-src/src/librats/core/endpoint_parse.cpp +41 -0
- package/native-src/src/librats/core/endpoint_parse.h +31 -0
- package/native-src/src/librats/core/event_bus.h +70 -0
- package/native-src/src/librats/core/host_endpoint.h +56 -0
- package/native-src/src/{io_poller.cpp → librats/core/io_poller.cpp} +520 -65
- package/native-src/src/{io_poller.h → librats/core/io_poller.h} +12 -6
- package/native-src/src/librats/core/ip_address.cpp +120 -0
- package/native-src/src/librats/core/ip_address.h +109 -0
- package/native-src/src/librats/core/mpsc_queue.h +47 -0
- package/native-src/src/librats/core/notifier.h +74 -0
- package/native-src/src/librats/core/receive_buffer.cpp +219 -0
- package/native-src/src/librats/core/receive_buffer.h +171 -0
- package/native-src/src/librats/core/service_registry.h +58 -0
- package/native-src/src/{socket.cpp → librats/core/socket.cpp} +625 -118
- package/native-src/src/librats/core/socket.h +496 -0
- package/native-src/src/librats/core/timer_queue.h +105 -0
- package/native-src/src/librats/core/types.cpp +43 -0
- package/native-src/src/librats/core/types.h +103 -0
- package/native-src/src/librats/core/wakeup_pipe.h +83 -0
- package/native-src/src/{crypto → librats/crypto}/blake2_endian.h +21 -23
- package/native-src/src/{crypto → librats/crypto}/blake2b.c +34 -33
- package/native-src/src/{crypto → librats/crypto}/blake2b.h +7 -6
- package/native-src/src/{crypto → librats/crypto}/blake2s.c +55 -54
- package/native-src/src/{crypto → librats/crypto}/blake2s.h +13 -12
- package/native-src/src/{crypto → librats/crypto}/chacha.c +22 -21
- package/native-src/src/{crypto → librats/crypto}/chacha.h +14 -13
- package/native-src/src/{crypto → librats/crypto}/chachapoly.c +56 -56
- package/native-src/src/{crypto → librats/crypto}/chachapoly.h +24 -17
- package/native-src/src/{crc32.cpp → librats/crypto/crc32.cpp} +1 -1
- package/native-src/src/{crc32.h → librats/crypto/crc32.h} +3 -1
- package/native-src/src/{crypto → librats/crypto}/curve25519.c +6 -4
- package/native-src/src/{crypto → librats/crypto}/curve25519.h +6 -3
- package/native-src/src/librats/crypto/hkdf.c +266 -0
- package/native-src/src/{crypto → librats/crypto}/hkdf.h +19 -19
- package/native-src/src/{noise.cpp → librats/crypto/noise.cpp} +84 -73
- package/native-src/src/{noise.h → librats/crypto/noise.h} +18 -8
- package/native-src/src/{crypto → librats/crypto}/poly1305.c +47 -46
- package/native-src/src/librats/crypto/poly1305.h +37 -0
- package/native-src/src/{sha1.cpp → librats/crypto/sha1.cpp} +33 -1
- package/native-src/src/{sha1.h → librats/crypto/sha1.h} +14 -6
- package/native-src/src/{crypto → librats/crypto}/sha256.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha256.h +8 -7
- package/native-src/src/{crypto → librats/crypto}/sha512.c +15 -14
- package/native-src/src/{crypto → librats/crypto}/sha512.h +8 -7
- package/native-src/src/librats/dht/announce.cpp +37 -0
- package/native-src/src/librats/dht/announce.h +41 -0
- package/native-src/src/librats/dht/bep42.cpp +109 -0
- package/native-src/src/librats/dht/bep42.h +48 -0
- package/native-src/src/librats/dht/dht.cpp +501 -0
- package/native-src/src/librats/dht/dht.h +119 -0
- package/native-src/src/librats/dht/dht_runner.cpp +103 -0
- package/native-src/src/librats/dht/dht_runner.h +71 -0
- package/native-src/src/librats/dht/dos_blocker.cpp +42 -0
- package/native-src/src/librats/dht/dos_blocker.h +47 -0
- package/native-src/src/librats/dht/find_peers.cpp +52 -0
- package/native-src/src/librats/dht/find_peers.h +73 -0
- package/native-src/src/librats/dht/id.h +167 -0
- package/native-src/src/{krpc.cpp → librats/dht/krpc.cpp} +32 -81
- package/native-src/src/{krpc.h → librats/dht/krpc.h} +19 -23
- package/native-src/src/librats/dht/log.h +38 -0
- package/native-src/src/librats/dht/node.cpp +473 -0
- package/native-src/src/librats/dht/node.h +164 -0
- package/native-src/src/librats/dht/node_entry.h +81 -0
- package/native-src/src/librats/dht/observer.h +72 -0
- package/native-src/src/librats/dht/persistence.cpp +90 -0
- package/native-src/src/librats/dht/persistence.h +32 -0
- package/native-src/src/librats/dht/routing_table.cpp +559 -0
- package/native-src/src/librats/dht/routing_table.h +185 -0
- package/native-src/src/librats/dht/rpc_manager.cpp +127 -0
- package/native-src/src/librats/dht/rpc_manager.h +77 -0
- package/native-src/src/librats/dht/storage.cpp +92 -0
- package/native-src/src/librats/dht/storage.h +74 -0
- package/native-src/src/librats/dht/transport.h +27 -0
- package/native-src/src/librats/dht/traversal.cpp +326 -0
- package/native-src/src/librats/dht/traversal.h +120 -0
- package/native-src/src/librats/dht/udp_transport.cpp +49 -0
- package/native-src/src/librats/dht/udp_transport.h +51 -0
- package/native-src/src/librats/mdns/log.h +22 -0
- package/native-src/src/{mdns.cpp → librats/mdns/mdns.cpp} +75 -40
- package/native-src/src/{mdns.h → librats/mdns/mdns.h} +9 -8
- package/native-src/src/{natpmp.cpp → librats/nat/natpmp.cpp} +12 -9
- package/native-src/src/{natpmp.h → librats/nat/natpmp.h} +3 -3
- package/native-src/src/{port_mapping.h → librats/nat/port_mapping.h} +3 -2
- package/native-src/src/{stun.cpp → librats/nat/stun.cpp} +4 -4
- package/native-src/src/{stun.h → librats/nat/stun.h} +1 -1
- package/native-src/src/{upnp.cpp → librats/nat/upnp.cpp} +6 -6
- package/native-src/src/{upnp.h → librats/nat/upnp.h} +2 -2
- package/native-src/src/librats/node/circuit_service.h +84 -0
- package/native-src/src/librats/node/config.h +110 -0
- package/native-src/src/librats/node/dial_service.h +54 -0
- package/native-src/src/librats/node/dialer.cpp +264 -0
- package/native-src/src/librats/node/dialer.h +188 -0
- package/native-src/src/librats/node/host_events.h +26 -0
- package/native-src/src/librats/node/identify.cpp +130 -0
- package/native-src/src/librats/node/identify.h +71 -0
- package/native-src/src/librats/node/nat_status.cpp +103 -0
- package/native-src/src/librats/node/nat_status.h +118 -0
- package/native-src/src/librats/node/node.cpp +865 -0
- package/native-src/src/librats/node/node.h +344 -0
- package/native-src/src/librats/node/node_context.h +33 -0
- package/native-src/src/librats/node/peer_network.h +91 -0
- package/native-src/src/librats/peer/peer.h +49 -0
- package/native-src/src/librats/peer/peer_book.cpp +181 -0
- package/native-src/src/librats/peer/peer_book.h +88 -0
- package/native-src/src/librats/peer/peer_id.cpp +72 -0
- package/native-src/src/librats/peer/peer_id.h +62 -0
- package/native-src/src/librats/peer/peer_info.h +37 -0
- package/native-src/src/librats/peer/peer_table.cpp +170 -0
- package/native-src/src/librats/peer/peer_table.h +148 -0
- package/native-src/src/librats/security/handshaker.h +66 -0
- package/native-src/src/librats/security/identity.h +43 -0
- package/native-src/src/librats/security/noise_security.cpp +122 -0
- package/native-src/src/librats/security/noise_security.h +37 -0
- package/native-src/src/librats/security/plaintext_security.h +106 -0
- package/native-src/src/librats/security/session.h +37 -0
- package/native-src/src/{storage.cpp → librats/storage/storage.cpp} +369 -522
- package/native-src/src/{storage.h → librats/storage/storage.h} +135 -299
- package/native-src/src/librats/subsystems/bittorrent.cpp +211 -0
- package/native-src/src/librats/subsystems/bittorrent.h +136 -0
- package/native-src/src/librats/subsystems/dht_discovery.cpp +202 -0
- package/native-src/src/librats/subsystems/dht_discovery.h +123 -0
- package/native-src/src/librats/subsystems/dht_service.h +36 -0
- package/native-src/src/librats/subsystems/file_transfer.cpp +972 -0
- package/native-src/src/librats/subsystems/file_transfer.h +367 -0
- package/native-src/src/librats/subsystems/hole_punch.cpp +605 -0
- package/native-src/src/librats/subsystems/hole_punch.h +290 -0
- package/native-src/src/librats/subsystems/hole_punch_service.h +38 -0
- package/native-src/src/librats/subsystems/mdns_discovery.cpp +66 -0
- package/native-src/src/librats/subsystems/mdns_discovery.h +55 -0
- package/native-src/src/librats/subsystems/message_json.cpp +112 -0
- package/native-src/src/librats/subsystems/message_json.h +88 -0
- package/native-src/src/librats/subsystems/peer_exchange.cpp +241 -0
- package/native-src/src/librats/subsystems/peer_exchange.h +136 -0
- package/native-src/src/librats/subsystems/ping_service.cpp +98 -0
- package/native-src/src/librats/subsystems/ping_service.h +66 -0
- package/native-src/src/librats/subsystems/port_mapping_service.cpp +192 -0
- package/native-src/src/librats/subsystems/port_mapping_service.h +84 -0
- package/native-src/src/librats/subsystems/pubsub.cpp +567 -0
- package/native-src/src/librats/subsystems/pubsub.h +175 -0
- package/native-src/src/librats/subsystems/reconnection.cpp +239 -0
- package/native-src/src/librats/subsystems/reconnection.h +126 -0
- package/native-src/src/librats/subsystems/relay.cpp +1142 -0
- package/native-src/src/librats/subsystems/relay.h +211 -0
- package/native-src/src/librats/subsystems/relay_service.h +46 -0
- package/native-src/src/librats/transport/connection.cpp +343 -0
- package/native-src/src/librats/transport/connection.h +283 -0
- package/native-src/src/librats/transport/link.h +96 -0
- package/native-src/src/librats/transport/reactor.cpp +588 -0
- package/native-src/src/librats/transport/reactor.h +262 -0
- package/native-src/src/librats/transport/reactor_pool.h +81 -0
- package/native-src/src/librats/transport/relay_link.cpp +208 -0
- package/native-src/src/librats/transport/relay_link.h +303 -0
- package/native-src/src/librats/transport/tcp_link.cpp +49 -0
- package/native-src/src/librats/transport/tcp_link.h +43 -0
- package/native-src/src/librats/transport/udp_mux.cpp +617 -0
- package/native-src/src/librats/transport/udp_mux.h +363 -0
- package/native-src/src/librats/transport/udp_packet.cpp +121 -0
- package/native-src/src/librats/transport/udp_packet.h +190 -0
- package/native-src/src/librats/transport/udp_stream.cpp +1194 -0
- package/native-src/src/librats/transport/udp_stream.h +614 -0
- package/native-src/src/librats/util/features.h.in +51 -0
- package/native-src/src/{fs.cpp → librats/util/fs.cpp} +51 -3
- package/native-src/src/librats/util/fs.h +136 -0
- package/native-src/src/librats/util/json.cpp +1002 -0
- package/native-src/src/librats/util/json.h +444 -0
- package/native-src/src/{logger.cpp → librats/util/logger.cpp} +1 -1
- package/native-src/src/{logger.h → librats/util/logger.h} +43 -31
- package/native-src/src/{network_monitor.cpp → librats/util/network_monitor.cpp} +12 -4
- package/native-src/src/{network_monitor.h → librats/util/network_monitor.h} +2 -1
- package/native-src/src/{network_utils.cpp → librats/util/network_utils.cpp} +38 -23
- package/native-src/src/{network_utils.h → librats/util/network_utils.h} +15 -8
- package/native-src/src/{os.cpp → librats/util/os.cpp} +48 -18
- package/native-src/src/librats/util/rats_export.h +69 -0
- package/native-src/src/{version.cpp → librats/util/version.cpp} +2 -2
- package/native-src/src/{version.h.in → librats/util/version.h.in} +1 -1
- package/native-src/src/librats/wire/frame.cpp +76 -0
- package/native-src/src/librats/wire/frame.h +111 -0
- package/native-src/src/librats/wire/message_router.cpp +45 -0
- package/native-src/src/librats/wire/message_router.h +47 -0
- package/package.json +5 -4
- package/scripts/build-librats.js +1 -0
- package/scripts/postinstall.js +3 -3
- package/scripts/prepare-package.js +4 -4
- package/scripts/verify-installation.js +63 -105
- package/src/librats_node.cpp +1067 -1323
- package/native-src/src/bencode.cpp +0 -485
- package/native-src/src/bencode.h +0 -145
- package/native-src/src/bittorrent.cpp +0 -14
- package/native-src/src/bittorrent.h +0 -74
- package/native-src/src/bt_bitfield.cpp +0 -372
- package/native-src/src/bt_bitfield.h +0 -316
- package/native-src/src/bt_choker.cpp +0 -228
- package/native-src/src/bt_choker.h +0 -147
- package/native-src/src/bt_client.cpp +0 -1047
- package/native-src/src/bt_client.h +0 -445
- package/native-src/src/bt_create_torrent.cpp +0 -677
- package/native-src/src/bt_create_torrent.h +0 -473
- package/native-src/src/bt_extension.cpp +0 -469
- package/native-src/src/bt_extension.h +0 -309
- package/native-src/src/bt_file_storage.cpp +0 -261
- package/native-src/src/bt_file_storage.h +0 -298
- package/native-src/src/bt_handshake.cpp +0 -134
- package/native-src/src/bt_handshake.h +0 -157
- package/native-src/src/bt_messages.cpp +0 -364
- package/native-src/src/bt_messages.h +0 -324
- package/native-src/src/bt_network.cpp +0 -1007
- package/native-src/src/bt_network.h +0 -417
- package/native-src/src/bt_peer_connection.cpp +0 -742
- package/native-src/src/bt_peer_connection.h +0 -592
- package/native-src/src/bt_piece_picker.cpp +0 -786
- package/native-src/src/bt_piece_picker.h +0 -473
- package/native-src/src/bt_resume_data.cpp +0 -410
- package/native-src/src/bt_resume_data.h +0 -249
- package/native-src/src/bt_torrent.cpp +0 -2120
- package/native-src/src/bt_torrent.h +0 -641
- package/native-src/src/bt_torrent_info.cpp +0 -659
- package/native-src/src/bt_torrent_info.h +0 -418
- package/native-src/src/bt_types.h +0 -621
- package/native-src/src/chained_send_buffer.cpp +0 -75
- package/native-src/src/chained_send_buffer.h +0 -137
- package/native-src/src/crypto/hkdf.c +0 -266
- package/native-src/src/crypto/poly1305.h +0 -36
- package/native-src/src/dht.cpp +0 -3311
- package/native-src/src/dht.h +0 -717
- package/native-src/src/disk_io.cpp +0 -632
- package/native-src/src/disk_io.h +0 -315
- package/native-src/src/file_transfer.cpp +0 -1415
- package/native-src/src/file_transfer.h +0 -286
- package/native-src/src/fs.h +0 -108
- package/native-src/src/gossipsub.cpp +0 -1139
- package/native-src/src/gossipsub.h +0 -403
- package/native-src/src/ice.cpp +0 -893
- package/native-src/src/ice.h +0 -559
- package/native-src/src/json.hpp +0 -25526
- package/native-src/src/librats.cpp +0 -2378
- package/native-src/src/librats.h +0 -2324
- package/native-src/src/librats_bittorrent.cpp +0 -601
- package/native-src/src/librats_c.cpp +0 -1557
- package/native-src/src/librats_c.h +0 -323
- package/native-src/src/librats_discovery.cpp +0 -402
- package/native-src/src/librats_encryption.cpp +0 -275
- package/native-src/src/librats_file_transfer.cpp +0 -144
- package/native-src/src/librats_gossipsub.cpp +0 -289
- package/native-src/src/librats_ice.cpp +0 -213
- package/native-src/src/librats_log_macros.h +0 -36
- package/native-src/src/librats_logging.cpp +0 -173
- package/native-src/src/librats_mdns.cpp +0 -166
- package/native-src/src/librats_persistence.cpp +0 -796
- package/native-src/src/librats_portmap.cpp +0 -419
- package/native-src/src/librats_reconnection.cpp +0 -218
- package/native-src/src/librats_statistic.cpp +0 -105
- package/native-src/src/librats_storage.cpp +0 -189
- package/native-src/src/rats_export.h +0 -17
- package/native-src/src/receive_buffer.cpp +0 -82
- package/native-src/src/receive_buffer.h +0 -127
- package/native-src/src/socket.h +0 -228
- package/native-src/src/threadmanager.cpp +0 -105
- package/native-src/src/threadmanager.h +0 -53
- package/native-src/src/tracker.cpp +0 -1264
- package/native-src/src/tracker.h +0 -319
- package/native-src/src/turn.cpp +0 -762
- package/native-src/src/turn.h +0 -460
- package/native-src/src/wakeup_pipe.h +0 -60
- /package/native-src/src/{os.h → librats/util/os.h} +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file features.h
|
|
5
|
+
* @brief How this copy of librats was built: which optional modules it contains,
|
|
6
|
+
* and whether it is a DLL.
|
|
7
|
+
*
|
|
8
|
+
* Generated by CMake from features.h.in — do not edit the generated copy.
|
|
9
|
+
*
|
|
10
|
+
* All three macros are build-time switches that change the *installed headers*,
|
|
11
|
+
* not just which .cpp files compile, so a consumer reading the headers with one
|
|
12
|
+
* of them in a different state than the library was built with sees something
|
|
13
|
+
* other than what it links against:
|
|
14
|
+
*
|
|
15
|
+
* - RATS_SEARCH_FEATURES — dht/dht.h, dht/node.h and subsystems/bittorrent.h
|
|
16
|
+
* declare the spider API behind it, and dht::Node declares *data members*
|
|
17
|
+
* behind it. Getting it wrong is a missing declaration at best and a silently
|
|
18
|
+
* different object layout at worst.
|
|
19
|
+
* - RATS_STORAGE — same mechanism; no installed header tests it today.
|
|
20
|
+
* - RATS_IMPORT_DLL — MSVC only: without it RATS_API expands to nothing, so a
|
|
21
|
+
* consumer of the shared build compiles as if the library were static and
|
|
22
|
+
* loses __declspec(dllimport) on every exported symbol (see rats_export.h).
|
|
23
|
+
* Not set for a static build, where the same define would send the consumer
|
|
24
|
+
* looking for __imp_-prefixed symbols that do not exist. RATS_EXPORT_DLL is
|
|
25
|
+
* deliberately absent: it is PRIVATE to the library's own translation units,
|
|
26
|
+
* and rats_export.h tests it first, so it still wins there.
|
|
27
|
+
*
|
|
28
|
+
* CMakeLists.txt also sets these on the `rats` target (PUBLIC for the features,
|
|
29
|
+
* INTERFACE for RATS_IMPORT_DLL), so a consumer using find_package(rats CONFIG) +
|
|
30
|
+
* rats::rats gets them via INTERFACE_COMPILE_DEFINITIONS. That path alone is not
|
|
31
|
+
* enough: vcpkg's MSBuild integration, a hand-rolled -I<prefix>/include build, and
|
|
32
|
+
* IDE indexers never read the CMake target. Recording the answers in an installed
|
|
33
|
+
* header makes the headers self-describing for every consumer, whatever their
|
|
34
|
+
* build system, and removes the need for Conan's package_info() to repeat them.
|
|
35
|
+
*
|
|
36
|
+
* Included from rats_export.h, which practically every public header pulls in,
|
|
37
|
+
* so the macros are set before any #ifdef that tests them. The #ifndef guards
|
|
38
|
+
* keep the definition benign when the compile definition already supplied it.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
#ifndef RATS_SEARCH_FEATURES
|
|
42
|
+
#cmakedefine RATS_SEARCH_FEATURES
|
|
43
|
+
#endif
|
|
44
|
+
|
|
45
|
+
#ifndef RATS_STORAGE
|
|
46
|
+
#cmakedefine RATS_STORAGE
|
|
47
|
+
#endif
|
|
48
|
+
|
|
49
|
+
#ifndef RATS_IMPORT_DLL
|
|
50
|
+
#cmakedefine RATS_IMPORT_DLL
|
|
51
|
+
#endif
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
#include "fs.h"
|
|
2
|
-
#include "logger.h"
|
|
1
|
+
#include "librats/util/fs.h"
|
|
2
|
+
#include "librats/util/logger.h"
|
|
3
3
|
#include <cstring>
|
|
4
4
|
#include <cstdlib>
|
|
5
5
|
#include <sys/stat.h>
|
|
@@ -520,9 +520,57 @@ bool create_file_with_size(const char* path, uint64_t size) {
|
|
|
520
520
|
return true;
|
|
521
521
|
}
|
|
522
522
|
|
|
523
|
+
// ── FileStream: one open handle across many positioned operations ──────────────
|
|
524
|
+
|
|
525
|
+
static bool fs_seek64(FILE* f, uint64_t offset) {
|
|
526
|
+
#ifdef _WIN32
|
|
527
|
+
return _fseeki64(f, static_cast<__int64>(offset), SEEK_SET) == 0;
|
|
528
|
+
#else
|
|
529
|
+
return fseeko(f, static_cast<off_t>(offset), SEEK_SET) == 0;
|
|
530
|
+
#endif
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
bool FileStream::open_read(const char* path) {
|
|
534
|
+
close();
|
|
535
|
+
if (!path) return false;
|
|
536
|
+
f_ = fopen(path, "rb");
|
|
537
|
+
if (!f_) { LOG_ERROR("FS", "FileStream: cannot open for reading: " << path); return false; }
|
|
538
|
+
return true;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
bool FileStream::open_write(const char* path) {
|
|
542
|
+
close();
|
|
543
|
+
if (!path) return false;
|
|
544
|
+
f_ = fopen(path, "r+b"); // keep existing content (positioned writes)
|
|
545
|
+
if (!f_ && !file_exists(path)) {
|
|
546
|
+
std::string parent = get_parent_directory(path);
|
|
547
|
+
if (!parent.empty() && !directory_exists(parent.c_str())) create_directories(parent.c_str());
|
|
548
|
+
f_ = fopen(path, "w+b"); // create fresh
|
|
549
|
+
}
|
|
550
|
+
if (!f_) { LOG_ERROR("FS", "FileStream: cannot open for writing: " << path); return false; }
|
|
551
|
+
return true;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
bool FileStream::seek(uint64_t offset) { return f_ && fs_seek64(f_, offset); }
|
|
555
|
+
|
|
556
|
+
size_t FileStream::read(void* buffer, size_t size) {
|
|
557
|
+
if (!f_ || !buffer) return 0;
|
|
558
|
+
return fread(buffer, 1, size, f_);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
bool FileStream::write_at(uint64_t offset, const void* data, size_t size) {
|
|
562
|
+
if (!f_ || !data) return false;
|
|
563
|
+
if (!fs_seek64(f_, offset)) return false;
|
|
564
|
+
return fwrite(data, 1, size, f_) == size;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
void FileStream::close() {
|
|
568
|
+
if (f_) { fclose(f_); f_ = nullptr; }
|
|
569
|
+
}
|
|
570
|
+
|
|
523
571
|
bool rename_file(const char* old_path, const char* new_path) {
|
|
524
572
|
if (!old_path || !new_path) return false;
|
|
525
|
-
|
|
573
|
+
|
|
526
574
|
return rename(old_path, new_path) == 0;
|
|
527
575
|
}
|
|
528
576
|
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include <string>
|
|
4
|
+
#include <vector>
|
|
5
|
+
#include <cstdint>
|
|
6
|
+
#include <cstdio>
|
|
7
|
+
#include "librats/util/rats_export.h"
|
|
8
|
+
|
|
9
|
+
namespace librats {
|
|
10
|
+
|
|
11
|
+
// File/Directory existence check
|
|
12
|
+
RATS_API bool file_or_directory_exists(const char* path);
|
|
13
|
+
RATS_API bool directory_exists(const char* path);
|
|
14
|
+
RATS_API bool file_exists(const char* path);
|
|
15
|
+
|
|
16
|
+
// File creation and writing
|
|
17
|
+
RATS_API bool create_file(const char* path, const char* content);
|
|
18
|
+
RATS_API bool create_file_binary(const char* path, const void* data, size_t size);
|
|
19
|
+
RATS_API bool append_to_file(const char* path, const char* content);
|
|
20
|
+
|
|
21
|
+
// File reading
|
|
22
|
+
RATS_API char* read_file_text(const char* path, size_t* size_out = nullptr);
|
|
23
|
+
RATS_API void* read_file_binary(const char* path, size_t* size_out);
|
|
24
|
+
|
|
25
|
+
// Directory operations
|
|
26
|
+
RATS_API bool create_directory(const char* path);
|
|
27
|
+
RATS_API bool create_directories(const char* path); // Create parent directories if needed
|
|
28
|
+
|
|
29
|
+
// File information
|
|
30
|
+
RATS_API int64_t get_file_size(const char* path);
|
|
31
|
+
RATS_API bool is_file(const char* path);
|
|
32
|
+
RATS_API bool is_directory(const char* path);
|
|
33
|
+
|
|
34
|
+
// File operations
|
|
35
|
+
RATS_API bool delete_file(const char* path);
|
|
36
|
+
RATS_API bool delete_directory(const char* path);
|
|
37
|
+
RATS_API bool copy_file(const char* src_path, const char* dest_path);
|
|
38
|
+
RATS_API bool move_file(const char* src_path, const char* dest_path);
|
|
39
|
+
|
|
40
|
+
// File metadata operations
|
|
41
|
+
RATS_API uint64_t get_file_modified_time(const char* path);
|
|
42
|
+
RATS_API std::string get_file_extension(const char* path);
|
|
43
|
+
RATS_API std::string get_filename_from_path(const char* path);
|
|
44
|
+
RATS_API std::string get_parent_directory(const char* path);
|
|
45
|
+
|
|
46
|
+
// File chunk operations
|
|
47
|
+
RATS_API bool write_file_chunk(const char* path, uint64_t offset, const void* data, size_t size);
|
|
48
|
+
RATS_API bool read_file_chunk(const char* path, uint64_t offset, void* buffer, size_t size);
|
|
49
|
+
|
|
50
|
+
// Advanced file operations
|
|
51
|
+
RATS_API bool create_file_with_size(const char* path, uint64_t size); // Pre-allocate file space
|
|
52
|
+
RATS_API bool rename_file(const char* old_path, const char* new_path);
|
|
53
|
+
|
|
54
|
+
// A file kept open across many positioned reads/writes. Streaming a large file
|
|
55
|
+
// then costs one open()/close() instead of one per chunk (see read_file_chunk /
|
|
56
|
+
// write_file_chunk, which re-open every call). 64-bit offsets. NOT thread-safe:
|
|
57
|
+
// a stream is meant to be owned by a single thread at a time.
|
|
58
|
+
class RATS_API FileStream {
|
|
59
|
+
public:
|
|
60
|
+
FileStream() = default;
|
|
61
|
+
~FileStream() { close(); }
|
|
62
|
+
FileStream(const FileStream&) = delete;
|
|
63
|
+
FileStream& operator=(const FileStream&) = delete;
|
|
64
|
+
FileStream(FileStream&& o) noexcept : f_(o.f_) { o.f_ = nullptr; }
|
|
65
|
+
FileStream& operator=(FileStream&& o) noexcept {
|
|
66
|
+
if (this != &o) { close(); f_ = o.f_; o.f_ = nullptr; }
|
|
67
|
+
return *this;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
bool open_read(const char* path); ///< open an existing file for reading
|
|
71
|
+
bool open_write(const char* path); ///< open (creating parents+file if needed) for writing
|
|
72
|
+
bool seek(uint64_t offset); ///< reposition the cursor
|
|
73
|
+
size_t read(void* buffer, size_t size); ///< sequential read; returns bytes read
|
|
74
|
+
bool write_at(uint64_t offset, const void* data, size_t size); ///< positioned write
|
|
75
|
+
void close();
|
|
76
|
+
bool is_open() const { return f_ != nullptr; }
|
|
77
|
+
|
|
78
|
+
private:
|
|
79
|
+
FILE* f_ = nullptr;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// Directory listing
|
|
83
|
+
struct DirectoryEntry {
|
|
84
|
+
std::string name;
|
|
85
|
+
std::string path;
|
|
86
|
+
bool is_directory;
|
|
87
|
+
uint64_t size;
|
|
88
|
+
uint64_t modified_time;
|
|
89
|
+
};
|
|
90
|
+
RATS_API bool list_directory(const char* path, std::vector<DirectoryEntry>& entries);
|
|
91
|
+
|
|
92
|
+
// Path utilities
|
|
93
|
+
RATS_API std::string combine_paths(const std::string& base, const std::string& relative);
|
|
94
|
+
RATS_API bool validate_path(const char* path, bool check_write_access = false);
|
|
95
|
+
|
|
96
|
+
// Utility functions
|
|
97
|
+
RATS_API void free_file_buffer(void* buffer); // Free memory allocated by read functions
|
|
98
|
+
RATS_API bool get_current_directory(char* buffer, size_t buffer_size);
|
|
99
|
+
RATS_API bool set_current_directory(const char* path);
|
|
100
|
+
|
|
101
|
+
// C++ convenience wrappers
|
|
102
|
+
inline bool file_or_directory_exists(const std::string& path) { return file_or_directory_exists(path.c_str()); }
|
|
103
|
+
inline bool file_exists(const std::string& path) { return file_exists(path.c_str()); }
|
|
104
|
+
inline bool directory_exists(const std::string& path) { return directory_exists(path.c_str()); }
|
|
105
|
+
inline bool create_file(const std::string& path, const std::string& content) {
|
|
106
|
+
return create_file(path.c_str(), content.c_str());
|
|
107
|
+
}
|
|
108
|
+
inline std::string read_file_text_cpp(const std::string& path) {
|
|
109
|
+
size_t size;
|
|
110
|
+
char* content = read_file_text(path.c_str(), &size);
|
|
111
|
+
if (!content) return "";
|
|
112
|
+
std::string result(content, size);
|
|
113
|
+
free_file_buffer(content);
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Additional C++ wrappers for new functions
|
|
118
|
+
inline uint64_t get_file_modified_time(const std::string& path) { return get_file_modified_time(path.c_str()); }
|
|
119
|
+
inline std::string get_file_extension(const std::string& path) { return get_file_extension(path.c_str()); }
|
|
120
|
+
inline std::string get_filename_from_path(const std::string& path) { return get_filename_from_path(path.c_str()); }
|
|
121
|
+
inline std::string get_parent_directory(const std::string& path) { return get_parent_directory(path.c_str()); }
|
|
122
|
+
inline bool write_file_chunk(const std::string& path, uint64_t offset, const void* data, size_t size) {
|
|
123
|
+
return write_file_chunk(path.c_str(), offset, data, size);
|
|
124
|
+
}
|
|
125
|
+
inline bool read_file_chunk(const std::string& path, uint64_t offset, void* buffer, size_t size) {
|
|
126
|
+
return read_file_chunk(path.c_str(), offset, buffer, size);
|
|
127
|
+
}
|
|
128
|
+
inline bool create_file_with_size(const std::string& path, uint64_t size) { return create_file_with_size(path.c_str(), size); }
|
|
129
|
+
inline bool rename_file(const std::string& old_path, const std::string& new_path) {
|
|
130
|
+
return rename_file(old_path.c_str(), new_path.c_str());
|
|
131
|
+
}
|
|
132
|
+
inline bool validate_path(const std::string& path, bool check_write_access = false) {
|
|
133
|
+
return validate_path(path.c_str(), check_write_access);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
} // namespace librats
|