Skip to content

Commit 0a5e547

Browse files
author
Dr. Brandon Wiley
committed
Initial import
1 parent fd6bba2 commit 0a5e547

File tree

4 files changed

+191
-0
lines changed

4 files changed

+191
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
Package.resolved
2+
.swiftpm
3+
.build
4+
15
# Xcode
26
#
37
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

Package.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// swift-tools-version: 5.9
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "TransmissionData",
8+
platforms: [
9+
.macOS(.v14),
10+
.iOS(.v17)
11+
],
12+
products: [
13+
// Products define the executables and libraries a package produces, making them visible to other packages.
14+
.library(
15+
name: "TransmissionData",
16+
targets: ["TransmissionData"]),
17+
],
18+
dependencies: [
19+
.package(url: "https://github.com/OperatorFoundation/Straw", branch: "main"),
20+
.package(url: "https://github.com/OperatorFoundation/Transmission", branch: "main"),
21+
],
22+
targets: [
23+
// Targets are the basic building blocks of a package, defining a module or a test suite.
24+
// Targets can depend on other targets in this package and products from dependencies.
25+
.target(
26+
name: "TransmissionData",
27+
dependencies: [
28+
"Straw",
29+
"Transmission",
30+
]
31+
),
32+
.testTarget(
33+
name: "TransmissionDataTests",
34+
dependencies: ["TransmissionData"]),
35+
],
36+
swiftLanguageVersions: [.v5]
37+
)
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
//
2+
// TransmissionData.swift
3+
//
4+
//
5+
// Created by Dr. Brandon Wiley on 1/15/24.
6+
//
7+
8+
import Foundation
9+
10+
import Straw
11+
import Transmission
12+
13+
public class TransmissionData: Transmission.Connection
14+
{
15+
var readBuffer: UnsafeStraw = UnsafeStraw()
16+
var writeBuffer: UnsafeStraw = UnsafeStraw()
17+
var closed: Bool = false
18+
19+
let readLock: DispatchSemaphore = DispatchSemaphore(value: 1)
20+
let writeLock: DispatchSemaphore = DispatchSemaphore(value: 1)
21+
22+
public init(readBuffer: Data = Data(), writeBuffer: Data = Data())
23+
{
24+
self.readBuffer.write(readBuffer)
25+
self.writeBuffer.write(writeBuffer)
26+
}
27+
28+
// Transmission.Connection
29+
public func read(size: Int) -> Data?
30+
{
31+
defer
32+
{
33+
self.readLock.signal()
34+
}
35+
self.readLock.wait()
36+
37+
if closed
38+
{
39+
return nil
40+
}
41+
42+
return try? self.readBuffer.read(size: size)
43+
}
44+
45+
public func unsafeRead(size: Int) -> Data?
46+
{
47+
if closed
48+
{
49+
return nil
50+
}
51+
52+
return try? self.readBuffer.read(size: size)
53+
}
54+
55+
public func read(maxSize: Int) -> Data?
56+
{
57+
defer
58+
{
59+
self.readLock.signal()
60+
}
61+
self.readLock.wait()
62+
63+
if closed
64+
{
65+
return nil
66+
}
67+
68+
return try? self.readBuffer.read(maxSize: maxSize)
69+
}
70+
71+
public func readWithLengthPrefix(prefixSizeInBits: Int) -> Data?
72+
{
73+
if closed
74+
{
75+
return nil
76+
}
77+
78+
return Transmission.readWithLengthPrefix(prefixSizeInBits: prefixSizeInBits, connection: self)
79+
}
80+
81+
public func write(string: String) -> Bool
82+
{
83+
defer
84+
{
85+
self.writeLock.signal()
86+
}
87+
self.writeLock.wait()
88+
89+
if closed
90+
{
91+
return false
92+
}
93+
94+
self.writeBuffer.write(string.data)
95+
96+
return true
97+
}
98+
99+
public func write(data: Data) -> Bool
100+
{
101+
defer
102+
{
103+
self.writeLock.signal()
104+
}
105+
self.writeLock.wait()
106+
107+
if closed
108+
{
109+
return false
110+
}
111+
112+
self.writeBuffer.write(data)
113+
114+
return true
115+
}
116+
117+
public func writeWithLengthPrefix(data: Data, prefixSizeInBits: Int) -> Bool
118+
{
119+
if closed
120+
{
121+
return false
122+
}
123+
124+
return Transmission.writeWithLengthPrefix(data: data, prefixSizeInBits: prefixSizeInBits, connection: self)
125+
}
126+
127+
public func close()
128+
{
129+
self.closed = true
130+
}
131+
// End Transmission.Connection
132+
133+
public func flip()
134+
{
135+
self.readBuffer = self.writeBuffer
136+
self.writeBuffer = UnsafeStraw()
137+
}
138+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import XCTest
2+
@testable import TransmissionData
3+
4+
final class TransmissionDataTests: XCTestCase {
5+
func testExample() throws {
6+
// XCTest Documentation
7+
// https://developer.apple.com/documentation/xctest
8+
9+
// Defining Test Cases and Test Methods
10+
// https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods
11+
}
12+
}

0 commit comments

Comments
 (0)