blob: 0d90286ad7f65fe43b4c1c3274f37c77a4332ce4 [file] [log] [blame]
yangsu@google.comf3493f02011-08-08 15:12:05 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "SkGradientShader.h"
5#include "SkGPipe.h"
6#include "SkSockets.h"
7#include "SkOSMenu.h"
8
9#define MAX_READS_PER_FRAME 5
10class NetPipeReaderView : public SampleView {
11public:
12 NetPipeReaderView() {
13 fSocket = NULL;
14 fSync = false;
15 }
16
17 ~NetPipeReaderView() {
18 if (fSocket) {
19 delete fSocket;
20 }
21 fDataArray.reset();
22 }
23 virtual void requestMenu(SkOSMenu* menu) {
24 menu->setTitle("Net Pipe Reader");
25 menu->appendTextField("Server IP", "Server IP", this->getSinkID(),
26 "IP address");
27 menu->appendSwitch("Sync", "Sync", this->getSinkID(), fSync);
28 }
29
30protected:
31 static void readData(int cid, const void* data, size_t size,
32 SkSocket::DataType type, void* context) {
33 NetPipeReaderView* view = (NetPipeReaderView*)context;
34 view->onRead(data, size);
35 }
36
37 void onRead(const void* data, size_t size) {
38 if (size > 0)
39 fDataArray.append(size, (const char*)data);
40 }
41
42 bool onQuery(SkEvent* evt) {
43 if (SampleCode::TitleQ(*evt)) {
44 SampleCode::TitleR(evt, "Net Pipe Reader");
45 return true;
46 }
47 return this->INHERITED::onQuery(evt);
48 }
49
50 bool onEvent(const SkEvent& evt) {;
51 SkString s;
52 if (SkOSMenu::FindText(&evt, "Server IP", &s)) {
53 if (NULL != fSocket) {
54 delete fSocket;
55 }
56 fSocket = new SkTCPClient(s.c_str());
57 fSocket->connectToServer();
58 SkDebugf("Connecting to %s\n", s.c_str());
59 return true;
60 }
61 if (SkOSMenu::FindSwitchState(&evt, "Sync", &fSync))
62 return true;
63 return this->INHERITED::onEvent(evt);
64 }
65
66 void onDrawContent(SkCanvas* canvas) {
67 if (NULL == fSocket)
68 return;
69
70 if (fSocket->isConnected()) {
71 int dataToRemove = fDataArray.count();
72 if (fSync) {
73 int numreads = 0;
74 while (fSocket->readPacket(readData, this) > 0 &&
75 numreads < MAX_READS_PER_FRAME) {
76 fDataArray.remove(0, dataToRemove);
77 dataToRemove = fDataArray.count();
78 ++numreads;
79 }
80 }
81 else {
82 if (fSocket->readPacket(readData, this) > 0)
83 fDataArray.remove(0, dataToRemove);
84 }
85 }
86 else
87 fSocket->connectToServer();
88
89 SkGPipeReader reader(canvas);
90 size_t bytesRead;
91 SkGPipeReader::Status fStatus = reader.playback(fDataArray.begin(),
92 fDataArray.count(),
93 &bytesRead);
94 SkASSERT(SkGPipeReader::kError_Status != fStatus);
95 this->inval(NULL);
96 }
97
98private:
99 bool fSync;
100 SkTDArray<char> fDataArray;
101 SkTCPClient* fSocket;
102 typedef SampleView INHERITED;
103};
104
105
106///////////////////////////////////////////////////////////////////////////////
107
108static SkView* MyFactory() { return new NetPipeReaderView; }
109static SkViewRegister reg(MyFactory);
110