From 0fd2dfdcbb706345ef44797c2e9d92bbfc64b2bf Mon Sep 17 00:00:00 2001
From: Faris Hasim <farishasimsyauqi@gmail.com>
Date: Thu, 25 Nov 2021 11:24:44 +0700
Subject: [PATCH] add segment from/to file

---
 halo.txt   |  1 +
 segment.py | 59 ++++++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 49 insertions(+), 11 deletions(-)
 create mode 100644 halo.txt

diff --git a/halo.txt b/halo.txt
new file mode 100644
index 0000000..4bb9374
--- /dev/null
+++ b/halo.txt
@@ -0,0 +1 @@
+ABU ABU CAKUE
\ No newline at end of file
diff --git a/segment.py b/segment.py
index d092bec..a5d966b 100644
--- a/segment.py
+++ b/segment.py
@@ -1,4 +1,5 @@
 import struct
+import os
 
 # constant
 SEG_SIZE = 32782
@@ -6,8 +7,14 @@ DATA_SIZE = SEG_SIZE - 12
 
 class Segment():
 
-    def __init__(self):
+    def __init__(self, seq_no=0, ack_no=0, data=bytes(), checksum=0):
+        self.DATA_PTR = 12
+
         self.bytes = [0 for _ in range(SEG_SIZE)]
+        self.set_seq_no(seq_no)
+        self.set_ack_no(ack_no)
+        self.set_data(data)
+        self.set_checksum(checksum)
 
     def set_seq_no(self, val):
         self.bytes[0] = val >> 24 & 0xff
@@ -33,6 +40,20 @@ class Segment():
                 (self.bytes[6] << 8) + \
                 self.bytes[7]
 
+    def set_data(self, data):
+        ptr = self.DATA_PTR
+        for byte in data:
+            self.bytes[ptr] = byte
+            ptr += 1
+
+    def get_data(self):
+        data=[]
+        ptr = self.DATA_PTR   # pointer to data in segment
+        while self.bytes[ptr] != 0:
+            data.append(self.bytes[ptr])
+            ptr += 1
+        return bytes(data)
+
     def setSYN(self):
         # raise SYN flag
         self.bytes[8] = self.bytes[8] | 0b01000000
@@ -73,6 +94,7 @@ class Segment():
             len_data += 1
             data += struct.pack('!B', 0)
 
+        checksum=0
         for i in range (0, len_data, 2):
             w = (data[i] << 8) + (data[i + 1])
             checksum += w
@@ -91,16 +113,31 @@ class Segment():
         self.bytes = list(byte)
         return self
 
-if __name__=="__main__":
-    seg = Segment()
+    def from_file(self, filepath):
+        filename = os.path.basename(filepath)
+        with open(filename, 'rb') as f:
+            self.set_data(f.read())
 
-    seg.setFIN()
-    seg.set_seq_no()
-    seg.set_ack_no()
-    
-    checksum = seg.count_checksum()
-    seg.set_checksum(checksum)
+    def to_file(self, filename):
+        with open(filename, 'wb') as f:
+            data = self.get_data()
+            f.write(data)
 
-    seg = Segment(seqno, ackno, flag, data)
+    def log(self):
+        print(self.bytes[:50])
 
-    print(seg.bytes[:100])
\ No newline at end of file
+if __name__=="__main__":
+    # seg = Segment()
+    # seg.setFIN()
+    # seg.set_seq_no()
+    # seg.set_ack_no()
+    # checksum = seg.count_checksum()
+    # seg.set_checksum(checksum)
+    # seg = Segment(seqno, ackno, flag, data)
+
+    seg = Segment(200, 199)
+    seg.from_file("halo.txt")
+    seg.set_checksum(seg.count_checksum())
+    seg.log()
+
+    seg.to_file("out.txt")
\ No newline at end of file
-- 
GitLab