Kaynağa Gözat

correctly support multiple pages via adf

Corey Smith 4 yıl önce
ebeveyn
işleme
0adc6c2215
3 değiştirilmiş dosya ile 19 ekleme ve 15 silme
  1. 15 9
      src/backend.go
  2. 3 1
      src/definitions.go
  3. 1 5
      src/main.go

+ 15 - 9
src/backend.go

@@ -2,6 +2,7 @@ package main
 
 
 import (
 import (
 	"encoding/binary"
 	"encoding/binary"
+	"encoding/hex"
 	"fmt"
 	"fmt"
 	"image"
 	"image"
 	"github.com/corsmith/image/tiff"
 	"github.com/corsmith/image/tiff"
@@ -32,8 +33,8 @@ func Scan(brotherIP string, brotherPort int, resolution int, color string, rawin
 		return removeHeaders(bytes), width, height
 		return removeHeaders(bytes), width, height
 	} else {
 	} else {
 		log.Println("Bypassing socket...")
 		log.Println("Bypassing socket...")
-		width := 1648
-		height := 2287
+		width := 2480
+		height := 3228
 
 
 		bytes, err := os.ReadFile(rawinput)
 		bytes, err := os.ReadFile(rawinput)
 		HandleError(err)
 		HandleError(err)
@@ -68,8 +69,11 @@ func sendRequest(socket net.Conn, resolution int, _mode string) (int, int) {
 	adfStatus := 0
 	adfStatus := 0
 
 
 	fmt.Sscanf(offer[2:], "%d,%d,%d,%d,%d,%d,%d", &dpiX, &dpiY, &adfStatus, &planeWidth, &width, &planeHeight, &height)
 	fmt.Sscanf(offer[2:], "%d,%d,%d,%d,%d,%d,%d", &dpiX, &dpiY, &adfStatus, &planeWidth, &width, &planeHeight, &height)
+	if height == 0 {
+		height = int(float32(dpiY) * 10.76) // US-LETTER
+	}
 
 
-	log.Println("Sending scan request dpiX, dpiY", dpiX, dpiY)
+	log.Println("Sending scan request dpiX, dpiY, width, height", dpiX, dpiY, width, height)
 
 
 	request = []byte(fmt.Sprintf(formats.scanRequest, dpiX, dpiY, mode, compression, width, height))
 	request = []byte(fmt.Sprintf(formats.scanRequest, dpiX, dpiY, mode, compression, width, height))
 
 
@@ -102,8 +106,11 @@ readPackets:
 			if bytes == 1 && packet[0] == scanner.endScan {
 			if bytes == 1 && packet[0] == scanner.endScan {
 				log.Println("Scan received...")
 				log.Println("Scan received...")
 				break readPackets
 				break readPackets
+			} else if bytes == 1 && packet[0] == scanner.endPage {
+				// send next page
+				log.Println("Requesting next page...")
+				sendPacket(socket, []byte(formats.nextPageRequest))
 			}
 			}
-
 		default:
 		default:
 			HandleError(err)
 			HandleError(err)
 		}
 		}
@@ -173,7 +180,6 @@ func removeHeaders(data []byte) [][]byte {
 	pages := make([][]byte, 0)
 	pages := make([][]byte, 0)
 	page := make([]byte, 0)
 	page := make([]byte, 0)
 
 
-	currentPage := 1
 	i := 0
 	i := 0
 
 
 headersLoop:
 headersLoop:
@@ -186,15 +192,13 @@ headersLoop:
 			log.Println("End Page...")
 			log.Println("End Page...")
 			pages = append(pages, page)
 			pages = append(pages, page)
 
 
-			if len(data) > i+1 && data[i+1] == scanner.endScan {
+			if len(data) > i+1 && data[i+1] == scanner.endScan { // XXX: double check if this is true in the pcaps
 				break headersLoop
 				break headersLoop
 			}
 			}
 
 
 			page = make([]byte, 0)
 			page = make([]byte, 0)
 
 
-			currentPage++
-
-			i += scanner.headerLen - 2
+			i += 1
 			continue headersLoop
 			continue headersLoop
 		} else if data[i] == scanner.startGray {
 		} else if data[i] == scanner.startGray {
 			payloadLen := binary.LittleEndian.Uint16(data[i+1 : i+3])
 			payloadLen := binary.LittleEndian.Uint16(data[i+1 : i+3])
@@ -205,6 +209,8 @@ headersLoop:
 
 
 			i += chunkSize + scanner.headerLen
 			i += chunkSize + scanner.headerLen
 		} else {
 		} else {
+			hd := hex.Dumper(os.Stdout)
+			hd.Write(data[i:])
 			// This is an error
 			// This is an error
 			log.Fatalln("Invalid header type.  Giving up...")
 			log.Fatalln("Invalid header type.  Giving up...")
 			break headersLoop
 			break headersLoop

+ 3 - 1
src/definitions.go

@@ -3,6 +3,7 @@ package main
 type requests struct {
 type requests struct {
 	leaseRequest string
 	leaseRequest string
 	scanRequest  string
 	scanRequest  string
+	nextPageRequest  string
 }
 }
 
 
 type modes struct {
 type modes struct {
@@ -40,7 +41,7 @@ var scanner constants = constants{
 	headerLen: 3,
 	headerLen: 3,
 	A4height:  294,
 	A4height:  294,
 	mmInch:    25.4,
 	mmInch:    25.4,
-	endPage:   0x82,
+	endPage:   0x81,
 	endScan:   0x80,
 	endScan:   0x80,
 	startGray: 0x40,
 	startGray: 0x40,
 }
 }
@@ -48,4 +49,5 @@ var scanner constants = constants{
 var formats requests = requests{
 var formats requests = requests{
 	leaseRequest: "\x1bI\nR=%d,%d\nM=%s\n\x80",
 	leaseRequest: "\x1bI\nR=%d,%d\nM=%s\n\x80",
 	scanRequest:  "\x1bX\nR=%d,%d\nM=%s\nC=%s\nD=SIN\nB=50\nN=50\nA=0,0,%d,%d\n\x80",
 	scanRequest:  "\x1bX\nR=%d,%d\nM=%s\nC=%s\nD=SIN\nB=50\nN=50\nA=0,0,%d,%d\n\x80",
+	nextPageRequest:  "\x1bX\x80",
 }
 }

+ 1 - 5
src/main.go

@@ -25,10 +25,6 @@ func main() {
 	rawImages, width, height := Scan(*brotherIP, brotherPort, *resolution, *color, *rawinput, *debug)
 	rawImages, width, height := Scan(*brotherIP, brotherPort, *resolution, *color, *rawinput, *debug)
 
 
 	for i, rawImage := range rawImages {
 	for i, rawImage := range rawImages {
-		if i == len(rawImages)-1 {
-			SaveImage(rawImage, width, height, fmt.Sprintf("%s-%d.tiff", *name, i), *color, *debug, *resolution)
-		} else {
-			go SaveImage(rawImage, width, height, fmt.Sprintf("%s-%d.tiff", *name, i), *color, *debug, *resolution)
-		}
+		SaveImage(rawImage, width, height, fmt.Sprintf("%s-%d.tiff", *name, i), *color, *debug, *resolution)
 	}
 	}
 }
 }