From 2e9a038f684740004b68a6a6b7e4e8ab3799a664 Mon Sep 17 00:00:00 2001
From: ficeto <ficeto@Hristos-Mac-mini-2.local>
Date: Thu, 14 May 2015 12:41:24 +0300
Subject: [PATCH] add template methods for stream to stream writes to SD and FS

---
 cores/esp8266/FileSystem.h | 22 ++++++++++++++++++++++
 libraries/SD/src/SD.h      | 22 ++++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/cores/esp8266/FileSystem.h b/cores/esp8266/FileSystem.h
index f83a83d1a..8704f260c 100755
--- a/cores/esp8266/FileSystem.h
+++ b/cores/esp8266/FileSystem.h
@@ -54,6 +54,28 @@ public:
   operator bool(){ return _file > 0; }
   char * name();
   boolean isDirectory(void);
+
+  template<typename T> size_t write(T &src){
+    uint8_t obuf[64];
+    size_t doneLen = 0;
+    size_t sentLen;
+    int i;
+
+    while (src.available() > 64){
+      src.read(obuf, 64);
+      sentLen = write(obuf, 64);
+      doneLen = doneLen + sentLen;
+      if(sentLen != 64){
+        return doneLen;
+      }
+    }
+  
+    size_t leftLen = src.available();
+    src.read(obuf, leftLen);
+    sentLen = write(obuf, leftLen);
+    doneLen = doneLen + sentLen;
+    return doneLen;
+  }
   
   using Print::write;
 };
diff --git a/libraries/SD/src/SD.h b/libraries/SD/src/SD.h
index 449984219..93c79138b 100644
--- a/libraries/SD/src/SD.h
+++ b/libraries/SD/src/SD.h
@@ -48,6 +48,28 @@ public:
   boolean isDirectory(void);
   File openNextFile(uint8_t mode = O_RDONLY);
   void rewindDirectory(void);
+
+  template<typename T> size_t write(T &src){
+    uint8_t obuf[512];
+    size_t doneLen = 0;
+    size_t sentLen;
+    int i;
+
+    while (src.available() > 512){
+      src.read(obuf, 512);
+      sentLen = write(obuf, 512);
+      doneLen = doneLen + sentLen;
+      if(sentLen != 512){
+        return doneLen;
+      }
+    }
+  
+    size_t leftLen = src.available();
+    src.read(obuf, leftLen);
+    sentLen = write(obuf, leftLen);
+    doneLen = doneLen + sentLen;
+    return doneLen;
+  }
   
   using Print::write;
 };