ts3phpframework
Loading...
Searching...
No Matches
FileTransfer.php
Go to the documentation of this file.
1<?php
2
3namespace PlanetTeamSpeak\TeamSpeak3Framework\Adapter;
4
5use PlanetTeamSpeak\TeamSpeak3Framework\Exception\FileTransferException;
6use PlanetTeamSpeak\TeamSpeak3Framework\Exception\TransportException;
7use PlanetTeamSpeak\TeamSpeak3Framework\Helper\Profiler;
8use PlanetTeamSpeak\TeamSpeak3Framework\Helper\Signal;
9use PlanetTeamSpeak\TeamSpeak3Framework\Helper\StringHelper;
10use PlanetTeamSpeak\TeamSpeak3Framework\Transport\Transport;
11
18class FileTransfer extends Adapter
19{
23 public function syn(): void
24 {
25 $this->initTransport($this->options);
26 $this->transport->setAdapter($this);
27
28 Profiler::init(spl_object_hash($this));
29
30 Signal::getInstance()->emit("filetransferConnected", $this);
31 }
32
36 public function __destruct()
37 {
38 if ($this->getTransport() instanceof Transport && $this->getTransport()->isConnected()) {
39 $this->getTransport()->disconnect();
40 }
41 }
42
50 protected function init(string $ftkey): void
51 {
52 if (strlen($ftkey) != 32 && strlen($ftkey) != 16) {
53 throw new FileTransferException("invalid file transfer key format");
54 }
55
56 $this->getProfiler()->start();
57 $this->getTransport()->send($ftkey);
58
59 Signal::getInstance()->emit("filetransferHandshake", $this);
60 }
61
71 public function upload(string $ftkey, int $seek, string $data): void
72 {
73 $this->init($ftkey);
74
75 $size = strlen($data);
76 $pack = 4096;
77
78 Signal::getInstance()->emit("filetransferUploadStarted", $ftkey, $seek, $size);
79
80 for (; $seek < $size;) {
81 $rest = $size - $seek;
82 $pack = min($rest, $pack);
83 $buff = substr($data, $seek, $pack);
84 $seek = $seek + $pack;
85
86 $this->getTransport()->send($buff);
87
88 Signal::getInstance()->emit("filetransferUploadProgress", $ftkey, $seek, $size);
89 }
90
91 $this->getProfiler()->stop();
92
93 Signal::getInstance()->emit("filetransferUploadFinished", $ftkey, $seek, $size);
94 }
95
106 public function download(string $ftkey, int $size, bool $passthru = false)
107 {
108 $this->init($ftkey);
109
110 if ($passthru) {
111 $this->passthru($size);
112 return;
113 }
114
115 $buff = new StringHelper("");
116 $pack = 4096;
117
118 Signal::getInstance()->emit("filetransferDownloadStarted", $ftkey, count($buff), $size);
119
120 for ($seek = 0; $seek < $size;) {
121 $rest = $size - $seek;
122 $pack = min($rest, $pack);
123 $data = $this->getTransport()->read(min($rest, $pack));
124 $seek = $seek + $pack;
125
126 $buff->append($data);
127
128 Signal::getInstance()->emit("filetransferDownloadProgress", $ftkey, count($buff), $size);
129 }
130
131 $this->getProfiler()->stop();
132
133 Signal::getInstance()->emit("filetransferDownloadFinished", $ftkey, count($buff), $size);
134
135 if (strlen($buff) != $size) {
136 throw new FileTransferException("incomplete file download (" . count($buff) . " of " . $size . " bytes)");
137 }
138
139 return $buff;
140 }
141
150 protected function passthru(int $size): void
151 {
152 $buff_size = fpassthru($this->getTransport()->getStream());
153
154 if ($buff_size != $size) {
155 throw new FileTransferException("incomplete file download (" . $buff_size . " of " . $size . " bytes)");
156 }
157 }
158}
initTransport(array $options, string $transport=TCP::class)
Definition Adapter.php:111
Provides low-level methods for file transfer communication with a TeamSpeak 3 Server.
download(string $ftkey, int $size, bool $passthru=false)
upload(string $ftkey, int $seek, string $data)
Enhanced exception class for PlanetTeamSpeak\TeamSpeak3Framework\Adapter\FileTransfer objects.
Abstract class for connecting to a TeamSpeak 3 Server through different ways of transport.
Definition Transport.php:17