iOS/Cocoa SampleApp, Drawingboard, and Networking updates
http://codereview.appspot.com/4843041/
http://codereview.appspot.com/4826061/
http://codereview.appspot.com/4832044/
http://codereview.appspot.com/4798055/


git-svn-id: http://skia.googlecode.com/svn/trunk@2058 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/Networking/SampleNetPipeReader.cpp b/experimental/Networking/SampleNetPipeReader.cpp
new file mode 100644
index 0000000..0d90286
--- /dev/null
+++ b/experimental/Networking/SampleNetPipeReader.cpp
@@ -0,0 +1,110 @@
+#include "SampleCode.h"
+#include "SkView.h"
+#include "SkCanvas.h"
+#include "SkGradientShader.h"
+#include "SkGPipe.h"
+#include "SkSockets.h"
+#include "SkOSMenu.h"
+
+#define MAX_READS_PER_FRAME 5
+class NetPipeReaderView : public SampleView {
+public:
+	NetPipeReaderView() {
+        fSocket = NULL;
+        fSync = false;
+    }
+    
+    ~NetPipeReaderView() {
+        if (fSocket) {
+            delete fSocket;
+        }
+        fDataArray.reset();
+    }
+    virtual void requestMenu(SkOSMenu* menu) {
+        menu->setTitle("Net Pipe Reader");
+        menu->appendTextField("Server IP", "Server IP", this->getSinkID(), 
+                              "IP address");
+        menu->appendSwitch("Sync", "Sync", this->getSinkID(), fSync);
+    }
+    
+protected:
+    static void readData(int cid, const void* data, size_t size,
+                         SkSocket::DataType type, void* context) {
+        NetPipeReaderView* view = (NetPipeReaderView*)context;
+        view->onRead(data, size);
+    }
+    
+    void onRead(const void* data, size_t size) {
+        if (size > 0)
+            fDataArray.append(size, (const char*)data);
+    }
+    
+    bool onQuery(SkEvent* evt) {
+        if (SampleCode::TitleQ(*evt)) {
+            SampleCode::TitleR(evt, "Net Pipe Reader");
+            return true;
+        }
+        return this->INHERITED::onQuery(evt);
+    }
+
+    bool onEvent(const SkEvent& evt) {;
+        SkString s;
+        if (SkOSMenu::FindText(&evt, "Server IP", &s)) {
+            if (NULL != fSocket) {
+                delete fSocket;
+            }
+            fSocket = new SkTCPClient(s.c_str());
+            fSocket->connectToServer();
+            SkDebugf("Connecting to %s\n", s.c_str());
+            return true;
+        }
+        if (SkOSMenu::FindSwitchState(&evt, "Sync", &fSync))
+            return true;
+        return this->INHERITED::onEvent(evt);
+    }
+    
+    void onDrawContent(SkCanvas* canvas) {
+        if (NULL == fSocket)
+            return;
+
+        if (fSocket->isConnected()) {
+            int dataToRemove = fDataArray.count();
+            if (fSync) {
+                int numreads = 0;
+                while (fSocket->readPacket(readData, this) > 0 && 
+                       numreads < MAX_READS_PER_FRAME) {
+                    fDataArray.remove(0, dataToRemove);
+                    dataToRemove = fDataArray.count();
+                    ++numreads;
+                }
+            }
+            else {
+                if (fSocket->readPacket(readData, this) > 0) 
+                    fDataArray.remove(0, dataToRemove);
+            }
+        }
+        else
+            fSocket->connectToServer();
+
+        SkGPipeReader reader(canvas);
+        size_t bytesRead;
+        SkGPipeReader::Status fStatus = reader.playback(fDataArray.begin(),
+                                                        fDataArray.count(),
+                                                        &bytesRead);
+        SkASSERT(SkGPipeReader::kError_Status != fStatus);
+        this->inval(NULL);
+    }
+
+private:
+    bool fSync;
+    SkTDArray<char> fDataArray;
+    SkTCPClient* fSocket;
+    typedef SampleView INHERITED;
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+static SkView* MyFactory() { return new NetPipeReaderView; }
+static SkViewRegister reg(MyFactory);
+