2013-07-16 19:02:30 +00:00
|
|
|
/*
|
|
|
|
* synergy -- mouse and keyboard sharing utility
|
|
|
|
* Copyright (C) 2013 Bolton Software Ltd.
|
|
|
|
*
|
|
|
|
* This package is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* found in the file COPYING that should have accompanied this file.
|
|
|
|
*
|
|
|
|
* This package is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <gtest/gtest.h>
|
2013-07-24 16:41:12 +00:00
|
|
|
#include <stdexcept>
|
|
|
|
#include <sstream>
|
2013-07-16 19:02:30 +00:00
|
|
|
#include <fstream>
|
2013-07-24 16:41:12 +00:00
|
|
|
#include <iostream>
|
|
|
|
#include <stdio.h>
|
2013-07-16 19:02:30 +00:00
|
|
|
|
|
|
|
#define TEST_ENV
|
|
|
|
|
|
|
|
#include "CLog.h"
|
|
|
|
#include "CServer.h"
|
|
|
|
#include "CClient.h"
|
|
|
|
#include "TMethodEventJob.h"
|
|
|
|
#include "server/CMockConfig.h"
|
|
|
|
#include "server/CMockPrimaryClient.h"
|
|
|
|
#include "synergy/CMockScreen.h"
|
|
|
|
#include "CClientListener.h"
|
|
|
|
#include "CNetworkAddress.h"
|
|
|
|
#include "CTCPSocketFactory.h"
|
|
|
|
#include "CCryptoOptions.h"
|
|
|
|
#include "CSocketMultiplexer.h"
|
|
|
|
#include "CTestEventQueue.h"
|
|
|
|
#include "server/CMockInputFilter.h"
|
2013-07-24 16:41:12 +00:00
|
|
|
#include "TMethodJob.h"
|
|
|
|
#include "CThread.h"
|
|
|
|
#include "CFileChunker.h"
|
|
|
|
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
using namespace std;
|
2013-07-16 19:02:30 +00:00
|
|
|
using ::testing::_;
|
2013-07-24 16:41:12 +00:00
|
|
|
using ::testing::NiceMock;
|
2013-07-16 19:02:30 +00:00
|
|
|
using ::testing::Return;
|
|
|
|
using ::testing::Invoke;
|
|
|
|
|
|
|
|
#define TEST_PORT 24803
|
|
|
|
#define TEST_HOST "localhost"
|
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
const size_t kMockDataSize = 1024 * 1024 * 10; // 10MB
|
|
|
|
const UInt16 kMockDataChunkIncrement = 1024; // 1KB
|
|
|
|
const char* kMockFilename = "NetworkTests.mock";
|
|
|
|
const size_t kMockFileSize = 1024 * 1024 * 10; // 10MB
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
void getScreenShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h);
|
|
|
|
void getCursorPos(SInt32& x, SInt32& y);
|
|
|
|
CString intToString(size_t i);
|
|
|
|
UInt8* newMockData(size_t size);
|
|
|
|
void createFile(fstream& file, const char* filename, size_t size);
|
2013-07-16 19:02:30 +00:00
|
|
|
|
|
|
|
class NetworkTests : public ::testing::Test
|
|
|
|
{
|
|
|
|
public:
|
2013-07-24 16:41:12 +00:00
|
|
|
NetworkTests() :
|
|
|
|
m_mockData(NULL),
|
|
|
|
m_mockDataSize(0),
|
|
|
|
m_mockFileSize(0)
|
|
|
|
{
|
|
|
|
m_mockData = newMockData(kMockDataSize);
|
|
|
|
createFile(m_mockFile, kMockFilename, kMockFileSize);
|
|
|
|
}
|
|
|
|
|
|
|
|
~NetworkTests()
|
|
|
|
{
|
|
|
|
remove(kMockFilename);
|
|
|
|
delete[] m_mockData;
|
|
|
|
}
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
void sendMockData(void* eventTarget);
|
|
|
|
|
|
|
|
void sendToClient_mockData_handleClientConnected(const CEvent&, void* vlistener);
|
|
|
|
void sendToClient_mockData_fileRecieveComplete(const CEvent&, void*);
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
void sendToClient_mockFile_handleClientConnected(const CEvent&, void* vlistener);
|
|
|
|
void sendToClient_mockFile_fileRecieveComplete(const CEvent& event, void*);
|
|
|
|
|
|
|
|
void sendToServer_mockData_handleClientConnected(const CEvent&, void* vlistener);
|
|
|
|
void sendToServer_mockData_fileRecieveComplete(const CEvent& event, void*);
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
void sendToServer_mockFile_handleClientConnected(const CEvent&, void* vlistener);
|
|
|
|
void sendToServer_mockFile_fileRecieveComplete(const CEvent& event, void*);
|
|
|
|
|
2013-07-16 19:02:30 +00:00
|
|
|
public:
|
|
|
|
CTestEventQueue m_events;
|
2013-07-24 16:41:12 +00:00
|
|
|
UInt8* m_mockData;
|
|
|
|
size_t m_mockDataSize;
|
|
|
|
fstream m_mockFile;
|
|
|
|
size_t m_mockFileSize;
|
2013-07-16 19:02:30 +00:00
|
|
|
};
|
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
TEST_F(NetworkTests, sendToClient_mockData)
|
|
|
|
{
|
|
|
|
// server and client
|
|
|
|
CNetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
|
|
|
CCryptoOptions cryptoOptions;
|
|
|
|
|
|
|
|
serverAddress.resolve();
|
|
|
|
|
|
|
|
// server
|
|
|
|
CSocketMultiplexer serverSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* serverSocketFactory = new CTCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
|
|
|
CClientListener listener(serverAddress, serverSocketFactory, NULL, cryptoOptions, &m_events);
|
|
|
|
NiceMock<CMockScreen> serverScreen;
|
|
|
|
NiceMock<CMockPrimaryClient> primaryClient;
|
|
|
|
NiceMock<CMockConfig> serverConfig;
|
|
|
|
NiceMock<CMockInputFilter> serverInputFilter;
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forCClientListener().connected(), &listener,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
|
|
|
this, &NetworkTests::sendToClient_mockData_handleClientConnected, &listener));
|
|
|
|
|
|
|
|
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
|
|
|
ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter));
|
|
|
|
|
|
|
|
CServer server(serverConfig, &primaryClient, &serverScreen, &m_events);
|
|
|
|
server.m_mock = true;
|
|
|
|
listener.setServer(&server);
|
|
|
|
|
|
|
|
// client
|
|
|
|
NiceMock<CMockScreen> clientScreen;
|
|
|
|
CSocketMultiplexer clientSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* clientSocketFactory = new CTCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
|
|
|
|
|
|
|
ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape));
|
|
|
|
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
|
|
|
|
|
|
|
CClient client(&m_events, "stub", serverAddress, clientSocketFactory, NULL, &clientScreen, cryptoOptions);
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forIScreen().fileRecieveComplete(), &client,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
|
|
|
this, &NetworkTests::sendToClient_mockData_fileRecieveComplete));
|
|
|
|
|
|
|
|
client.connect();
|
|
|
|
|
2013-07-26 12:44:14 +00:00
|
|
|
m_events.initQuitTimeout(10);
|
2013-07-24 16:41:12 +00:00
|
|
|
m_events.loop();
|
|
|
|
m_events.cleanupQuitTimeout();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(NetworkTests, sendToClient_mockFile)
|
2013-07-16 19:02:30 +00:00
|
|
|
{
|
|
|
|
// server and client
|
|
|
|
CNetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
|
|
|
CCryptoOptions cryptoOptions;
|
|
|
|
|
|
|
|
serverAddress.resolve();
|
|
|
|
|
|
|
|
// server
|
|
|
|
CSocketMultiplexer serverSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* serverSocketFactory = new CTCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
|
|
|
CClientListener listener(serverAddress, serverSocketFactory, NULL, cryptoOptions, &m_events);
|
|
|
|
NiceMock<CMockScreen> serverScreen;
|
|
|
|
NiceMock<CMockPrimaryClient> primaryClient;
|
|
|
|
NiceMock<CMockConfig> serverConfig;
|
|
|
|
NiceMock<CMockInputFilter> serverInputFilter;
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forCClientListener().connected(), &listener,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
2013-07-24 16:41:12 +00:00
|
|
|
this, &NetworkTests::sendToClient_mockFile_handleClientConnected, &listener));
|
2013-07-16 19:02:30 +00:00
|
|
|
|
|
|
|
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
|
|
|
ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter));
|
|
|
|
|
|
|
|
CServer server(serverConfig, &primaryClient, &serverScreen, &m_events);
|
|
|
|
server.m_mock = true;
|
|
|
|
listener.setServer(&server);
|
|
|
|
|
|
|
|
// client
|
|
|
|
NiceMock<CMockScreen> clientScreen;
|
|
|
|
CSocketMultiplexer clientSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* clientSocketFactory = new CTCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape));
|
|
|
|
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
2013-07-16 19:02:30 +00:00
|
|
|
|
|
|
|
CClient client(&m_events, "stub", serverAddress, clientSocketFactory, NULL, &clientScreen, cryptoOptions);
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forIScreen().fileRecieveComplete(), &client,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
2013-07-24 16:41:12 +00:00
|
|
|
this, &NetworkTests::sendToClient_mockFile_fileRecieveComplete));
|
2013-07-16 19:02:30 +00:00
|
|
|
|
|
|
|
client.connect();
|
|
|
|
|
2013-07-26 12:44:14 +00:00
|
|
|
m_events.initQuitTimeout(10);
|
2013-07-24 16:41:12 +00:00
|
|
|
m_events.loop();
|
|
|
|
m_events.cleanupQuitTimeout();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(NetworkTests, sendToServer_mockData)
|
|
|
|
{
|
|
|
|
// server and client
|
|
|
|
CNetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
|
|
|
CCryptoOptions cryptoOptions;
|
|
|
|
|
|
|
|
serverAddress.resolve();
|
|
|
|
|
|
|
|
// server
|
|
|
|
CSocketMultiplexer serverSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* serverSocketFactory = new CTCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
|
|
|
CClientListener listener(serverAddress, serverSocketFactory, NULL, cryptoOptions, &m_events);
|
|
|
|
NiceMock<CMockScreen> serverScreen;
|
|
|
|
NiceMock<CMockPrimaryClient> primaryClient;
|
|
|
|
NiceMock<CMockConfig> serverConfig;
|
|
|
|
NiceMock<CMockInputFilter> serverInputFilter;
|
|
|
|
|
|
|
|
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
|
|
|
ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter));
|
|
|
|
|
|
|
|
CServer server(serverConfig, &primaryClient, &serverScreen, &m_events);
|
|
|
|
server.m_mock = true;
|
|
|
|
listener.setServer(&server);
|
|
|
|
|
|
|
|
// client
|
|
|
|
NiceMock<CMockScreen> clientScreen;
|
|
|
|
CSocketMultiplexer clientSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* clientSocketFactory = new CTCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
|
|
|
|
|
|
|
ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape));
|
|
|
|
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
|
|
|
|
|
|
|
CClient client(&m_events, "stub", serverAddress, clientSocketFactory, NULL, &clientScreen, cryptoOptions);
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forCClientListener().connected(), &listener,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
|
|
|
this, &NetworkTests::sendToServer_mockData_handleClientConnected, &client));
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forIScreen().fileRecieveComplete(), &server,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
|
|
|
this, &NetworkTests::sendToServer_mockData_fileRecieveComplete));
|
|
|
|
|
|
|
|
client.connect();
|
|
|
|
|
2013-07-26 12:44:14 +00:00
|
|
|
m_events.initQuitTimeout(10);
|
2013-07-24 16:41:12 +00:00
|
|
|
m_events.loop();
|
|
|
|
m_events.cleanupQuitTimeout();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(NetworkTests, sendToServer_mockFile)
|
|
|
|
{
|
|
|
|
// server and client
|
|
|
|
CNetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
|
|
|
CCryptoOptions cryptoOptions;
|
|
|
|
|
|
|
|
serverAddress.resolve();
|
|
|
|
|
|
|
|
// server
|
|
|
|
CSocketMultiplexer serverSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* serverSocketFactory = new CTCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
|
|
|
CClientListener listener(serverAddress, serverSocketFactory, NULL, cryptoOptions, &m_events);
|
|
|
|
NiceMock<CMockScreen> serverScreen;
|
|
|
|
NiceMock<CMockPrimaryClient> primaryClient;
|
|
|
|
NiceMock<CMockConfig> serverConfig;
|
|
|
|
NiceMock<CMockInputFilter> serverInputFilter;
|
|
|
|
|
|
|
|
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
|
|
|
ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter));
|
|
|
|
|
|
|
|
CServer server(serverConfig, &primaryClient, &serverScreen, &m_events);
|
|
|
|
server.m_mock = true;
|
|
|
|
listener.setServer(&server);
|
|
|
|
|
|
|
|
// client
|
|
|
|
NiceMock<CMockScreen> clientScreen;
|
|
|
|
CSocketMultiplexer clientSocketMultiplexer;
|
|
|
|
CTCPSocketFactory* clientSocketFactory = new CTCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
|
|
|
|
|
|
|
ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape));
|
|
|
|
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
|
|
|
|
|
|
|
CClient client(&m_events, "stub", serverAddress, clientSocketFactory, NULL, &clientScreen, cryptoOptions);
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forCClientListener().connected(), &listener,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
|
|
|
this, &NetworkTests::sendToServer_mockFile_handleClientConnected, &client));
|
|
|
|
|
|
|
|
m_events.adoptHandler(
|
|
|
|
m_events.forIScreen().fileRecieveComplete(), &server,
|
|
|
|
new TMethodEventJob<NetworkTests>(
|
|
|
|
this, &NetworkTests::sendToServer_mockFile_fileRecieveComplete));
|
|
|
|
|
|
|
|
client.connect();
|
|
|
|
|
2013-07-26 12:44:14 +00:00
|
|
|
m_events.initQuitTimeout(10);
|
2013-07-16 19:02:30 +00:00
|
|
|
m_events.loop();
|
|
|
|
m_events.cleanupQuitTimeout();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2013-07-24 16:41:12 +00:00
|
|
|
NetworkTests::sendToClient_mockData_handleClientConnected(const CEvent&, void* vlistener)
|
2013-07-16 19:02:30 +00:00
|
|
|
{
|
|
|
|
CClientListener* listener = reinterpret_cast<CClientListener*>(vlistener);
|
|
|
|
CServer* server = listener->getServer();
|
|
|
|
|
|
|
|
CClientProxy* client = listener->getNextClient();
|
|
|
|
if (client == NULL) {
|
2013-07-24 16:41:12 +00:00
|
|
|
throw runtime_error("client is null");
|
2013-07-16 19:02:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
CBaseClientProxy* bcp = reinterpret_cast<CBaseClientProxy*>(client);
|
|
|
|
server->adoptClient(bcp);
|
|
|
|
server->setActive(bcp);
|
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
sendMockData(server);
|
2013-07-16 19:02:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2013-07-24 16:41:12 +00:00
|
|
|
NetworkTests::sendToClient_mockData_fileRecieveComplete(const CEvent& event, void*)
|
2013-07-16 19:02:30 +00:00
|
|
|
{
|
|
|
|
CClient* client = reinterpret_cast<CClient*>(event.getTarget());
|
|
|
|
EXPECT_TRUE(client->isReceivedFileSizeValid());
|
|
|
|
|
|
|
|
m_events.raiseQuitEvent();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2013-07-24 16:41:12 +00:00
|
|
|
NetworkTests::sendToClient_mockFile_handleClientConnected(const CEvent&, void* vlistener)
|
2013-07-16 19:02:30 +00:00
|
|
|
{
|
2013-07-24 16:41:12 +00:00
|
|
|
CClientListener* listener = reinterpret_cast<CClientListener*>(vlistener);
|
|
|
|
CServer* server = listener->getServer();
|
|
|
|
|
|
|
|
CClientProxy* client = listener->getNextClient();
|
|
|
|
if (client == NULL) {
|
|
|
|
throw runtime_error("client is null");
|
|
|
|
}
|
|
|
|
|
|
|
|
CBaseClientProxy* bcp = reinterpret_cast<CBaseClientProxy*>(client);
|
|
|
|
server->adoptClient(bcp);
|
|
|
|
server->setActive(bcp);
|
|
|
|
|
|
|
|
server->sendFileToClient(kMockFilename);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
NetworkTests::sendToClient_mockFile_fileRecieveComplete(const CEvent& event, void*)
|
|
|
|
{
|
|
|
|
CClient* client = reinterpret_cast<CClient*>(event.getTarget());
|
|
|
|
EXPECT_TRUE(client->isReceivedFileSizeValid());
|
|
|
|
|
|
|
|
m_events.raiseQuitEvent();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
NetworkTests::sendToServer_mockData_handleClientConnected(const CEvent&, void* vclient)
|
|
|
|
{
|
|
|
|
CClient* client = reinterpret_cast<CClient*>(vclient);
|
|
|
|
sendMockData(client);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
NetworkTests::sendToServer_mockData_fileRecieveComplete(const CEvent& event, void*)
|
|
|
|
{
|
|
|
|
CServer* server = reinterpret_cast<CServer*>(event.getTarget());
|
|
|
|
EXPECT_TRUE(server->isReceivedFileSizeValid());
|
|
|
|
|
|
|
|
m_events.raiseQuitEvent();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
NetworkTests::sendToServer_mockFile_handleClientConnected(const CEvent&, void* vclient)
|
|
|
|
{
|
|
|
|
CClient* client = reinterpret_cast<CClient*>(vclient);
|
|
|
|
client->sendFileToServer(kMockFilename);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
NetworkTests::sendToServer_mockFile_fileRecieveComplete(const CEvent& event, void*)
|
|
|
|
{
|
|
|
|
CServer* server = reinterpret_cast<CServer*>(event.getTarget());
|
|
|
|
EXPECT_TRUE(server->isReceivedFileSizeValid());
|
|
|
|
|
|
|
|
m_events.raiseQuitEvent();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
NetworkTests::sendMockData(void* eventTarget)
|
|
|
|
{
|
|
|
|
// send first message (file size)
|
|
|
|
CString size = intToString(kMockDataSize);
|
2013-08-02 13:21:06 +00:00
|
|
|
size_t sizeLength = size.size();
|
2013-07-24 16:41:12 +00:00
|
|
|
CFileChunker::CFileChunk* sizeMessage = new CFileChunker::CFileChunk(sizeLength + 2);
|
|
|
|
char* chunkData = sizeMessage->m_chunk;
|
|
|
|
|
|
|
|
chunkData[0] = kFileStart;
|
|
|
|
memcpy(&chunkData[1], size.c_str(), sizeLength);
|
|
|
|
chunkData[sizeLength + 1] = '\0';
|
|
|
|
m_events.addEvent(CEvent(m_events.forIScreen().fileChunkSending(), eventTarget, sizeMessage));
|
|
|
|
|
|
|
|
// send chunk messages with incrementing chunk size
|
|
|
|
size_t lastSize = 0;
|
|
|
|
size_t sentLength = 0;
|
|
|
|
while (true) {
|
|
|
|
size_t chunkSize = lastSize + kMockDataChunkIncrement;
|
|
|
|
|
|
|
|
// make sure we don't read too much from the mock data.
|
|
|
|
if (sentLength + chunkSize > kMockDataSize) {
|
|
|
|
chunkSize = kMockDataSize - sentLength;
|
|
|
|
}
|
|
|
|
|
|
|
|
// first byte is the chunk mark, last is \0
|
|
|
|
CFileChunker::CFileChunk* fileChunk = new CFileChunker::CFileChunk(chunkSize + 2);
|
|
|
|
char* chunkData = fileChunk->m_chunk;
|
|
|
|
|
|
|
|
chunkData[0] = kFileChunk;
|
|
|
|
memcpy(&chunkData[1], &m_mockData[sentLength], chunkSize);
|
|
|
|
chunkData[chunkSize + 1] = '\0';
|
|
|
|
m_events.addEvent(CEvent(m_events.forIScreen().fileChunkSending(), eventTarget, fileChunk));
|
|
|
|
|
|
|
|
sentLength += chunkSize;
|
|
|
|
lastSize = chunkSize;
|
|
|
|
|
|
|
|
if (sentLength == kMockDataSize) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
// send last message
|
|
|
|
CFileChunker::CFileChunk* transferFinished = new CFileChunker::CFileChunk(2);
|
|
|
|
chunkData = transferFinished->m_chunk;
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-07-24 16:41:12 +00:00
|
|
|
chunkData[0] = kFileEnd;
|
|
|
|
chunkData[1] = '\0';
|
|
|
|
m_events.addEvent(CEvent(m_events.forIScreen().fileChunkSending(), eventTarget, transferFinished));
|
|
|
|
}
|
|
|
|
|
|
|
|
UInt8*
|
|
|
|
newMockData(size_t size)
|
|
|
|
{
|
|
|
|
UInt8* buffer = new UInt8[size];
|
|
|
|
|
|
|
|
UInt8* data = buffer;
|
|
|
|
const UInt8 head[] = "mock head... ";
|
|
|
|
size_t headSize = sizeof(head) - 1;
|
|
|
|
const UInt8 tail[] = "... mock tail";
|
|
|
|
size_t tailSize = sizeof(tail) - 1;
|
|
|
|
const UInt8 synergyRocks[] = "synergy\0 rocks! ";
|
|
|
|
size_t synergyRocksSize = sizeof(synergyRocks) - 1;
|
|
|
|
|
|
|
|
memcpy(data, head, headSize);
|
|
|
|
data += headSize;
|
|
|
|
|
2013-08-02 13:21:06 +00:00
|
|
|
size_t times = (size - headSize - tailSize) / synergyRocksSize;
|
2013-07-24 16:41:12 +00:00
|
|
|
for (SInt32 i = 0; i < times; ++i) {
|
|
|
|
memcpy(data, synergyRocks, synergyRocksSize);
|
|
|
|
data += synergyRocksSize;
|
|
|
|
}
|
2013-07-16 19:02:30 +00:00
|
|
|
|
2013-08-02 13:21:06 +00:00
|
|
|
size_t remainder = (size - headSize - tailSize) % synergyRocksSize;
|
2013-07-24 16:41:12 +00:00
|
|
|
if (remainder != 0) {
|
|
|
|
memset(data, '.', remainder);
|
|
|
|
data += remainder;
|
|
|
|
}
|
|
|
|
|
|
|
|
memcpy(data, tail, tailSize);
|
|
|
|
return buffer;
|
2013-07-16 19:02:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2013-07-24 16:41:12 +00:00
|
|
|
createFile(fstream& file, const char* filename, size_t size)
|
|
|
|
{
|
|
|
|
UInt8* buffer = newMockData(size);
|
|
|
|
|
|
|
|
file.open(filename, ios::out | ios::binary);
|
|
|
|
if (!file.is_open()) {
|
|
|
|
throw runtime_error("file not open");
|
|
|
|
}
|
|
|
|
|
|
|
|
file.write(reinterpret_cast<char*>(buffer), size);
|
|
|
|
file.close();
|
|
|
|
|
|
|
|
delete[] buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
getScreenShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h)
|
2013-07-16 19:02:30 +00:00
|
|
|
{
|
|
|
|
x = 0;
|
|
|
|
y = 0;
|
|
|
|
w = 1;
|
|
|
|
h = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2013-07-24 16:41:12 +00:00
|
|
|
getCursorPos(SInt32& x, SInt32& y)
|
2013-07-16 19:02:30 +00:00
|
|
|
{
|
|
|
|
x = 0;
|
|
|
|
y = 0;
|
|
|
|
}
|
2013-07-24 16:41:12 +00:00
|
|
|
|
|
|
|
CString
|
|
|
|
intToString(size_t i)
|
|
|
|
{
|
|
|
|
stringstream ss;
|
|
|
|
ss << i;
|
|
|
|
return ss.str();
|
|
|
|
}
|