[LIB-9] Add ability to archive qrcode content
[chesshog.git] / chesshog-qrcode / src / main / java / org / hedgecode / chess / qrcode / zip / ZipChessQRCodeReader.java
diff --git a/chesshog-qrcode/src/main/java/org/hedgecode/chess/qrcode/zip/ZipChessQRCodeReader.java b/chesshog-qrcode/src/main/java/org/hedgecode/chess/qrcode/zip/ZipChessQRCodeReader.java
new file mode 100644 (file)
index 0000000..8578a8b
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2018-2019. Developed by Hedgecode.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.hedgecode.chess.qrcode.zip;
+
+import java.io.File;
+
+import com.google.zxing.common.DecoderResult;
+
+import org.hedgecode.chess.qrcode.ChessQRCodeException;
+import org.hedgecode.chess.qrcode.ChessQRCodeMode;
+import org.hedgecode.chess.qrcode.ChessQRCodeReader;
+import org.hedgecode.chess.qrcode.ChessQRResult;
+
+/**
+ *
+ *
+ * @author Dmitry Samoshin aka gotty
+ */
+public class ZipChessQRCodeReader extends ChessQRCodeReader {
+
+    private static ZipChessQRCodeReader _instance = new ZipChessQRCodeReader();
+
+    protected ZipChessQRCodeReader() {
+        super();
+    }
+
+    @Override
+    protected ChessQRResult createResult(DecoderResult decoderResult) throws ChessQRCodeException {
+        String result = decoderResult.getText();
+        ChessQRCodeMode mode = ChessQRResult.getMode(result);
+
+        if (ChessQRCodeMode.ZIP.equals(mode)) {
+            String contents = ZipContentInflater.inflate(
+                    ChessQRResult.getContents(result)
+            );
+
+            mode = ChessQRResult.getMode(contents);
+            if (mode == null) {
+                throw new ChessQRCodeException(
+                        ChessQRCodeException.Type.READ, "read.unknown.chess.mode"
+                );
+            }
+
+            return new ChessQRResult(
+                    mode,
+                    ChessQRResult.getContents(contents)
+            );
+        } else {
+            return super.createResult(decoderResult);
+        }
+    }
+
+    public static ZipChessQRCodeReader getInstance() {
+        return _instance;
+    }
+
+
+    public static void main(String[] args) {
+        try {
+            ChessQRResult qrCodeResult = ZipChessQRCodeReader.getInstance().read(
+                    new File("qrcode.png")
+            );
+            System.out.println("Decoded format = " + qrCodeResult.getMode());
+            System.out.println("Decoded text = " + qrCodeResult.getContents());
+        } catch (ChessQRCodeException e) {
+            System.out.println("Could not decode QR Code. Exception: " + e.getMessage());
+        }
+    }
+
+}