#include "normApi.h"
#include "protoDefs.h"
#include "protoDebug.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef WIN32
const char DIR_DELIMITER = '\\';
#else
const char DIR_DELIMITER = '/';
#endif
int main(int argc, char* argv[])
{
if (argc != 2)
{
fprintf(stderr, "normFileRecv error: invalid argument(s)\n");
fprintf(stderr, "Usage: normRecvFile <rxCachePath>\n");
return -1;
}
const char* rxCachePath = argv[1];
NormInstanceHandle instance = NormCreateInstance();
NormSessionHandle session = NormCreateSession(instance,
"224.1.2.3",
6003,
NORM_NODE_ANY);
NormSetRxPortReuse(session, true);
NormSetMulticastLoopback(session, true);
NormSetRxLoss(session, 10.0); struct timeval currentTime;
ProtoSystemTime(currentTime);
srand(currentTime.tv_sec);
if (!NormSetCacheDirectory(instance, rxCachePath))
{
fprintf(stderr, "normFileReceive: error setting cache directory\n");
return -1;
}
NormStartReceiver(session, 1024*1024);
bool keepGoing = true;
while (keepGoing)
{
NormEvent theEvent;
if (!NormGetNextEvent(instance, &theEvent)) continue;
switch (theEvent.type)
{
case NORM_RX_OBJECT_NEW:
fprintf(stderr, "normFileRecv: NORM_RX_OBJECT_NEW event ...\n");
break;
case NORM_RX_OBJECT_INFO:
fprintf(stderr, "normFileRecv: NORM_RX_OBJECT_INFO event ...\n");
if (NORM_OBJECT_FILE == NormObjectGetType(theEvent.object))
{
char fileName[PATH_MAX];
strcpy(fileName, rxCachePath);
int pathLen = strlen(fileName);
if (DIR_DELIMITER != fileName[pathLen-1])
{
fileName[pathLen++] = DIR_DELIMITER;
fileName[pathLen] = '\0';
}
unsigned short nameLen = PATH_MAX - pathLen;
nameLen = NormObjectGetInfo(theEvent.object, fileName+pathLen, nameLen);
fileName[nameLen + pathLen] = '\0';
char* ptr = fileName + 5;
while ('\0' != *ptr)
{
if ('/' == *ptr) *ptr = DIR_DELIMITER;
ptr++;
}
if (!NormFileRename(theEvent.object, fileName))
fprintf(stderr, "normFileRecv: NormSetFileName(%s) error\n", fileName);
}
break;
case NORM_RX_OBJECT_UPDATED:
{
NormSize objectSize = NormObjectGetSize(theEvent.object);
fprintf(stderr, "sizeof(NormSize) = %d\n", (int)sizeof(NormSize));
NormSize completed = objectSize - NormObjectGetBytesPending(theEvent.object);
double percentComplete = 100.0 * ((double)completed/(double)objectSize);
fprintf(stderr, "normFileRecv: completion status %lu/%lu (%3.0lf%%)\n",
(unsigned long)completed, (unsigned long)objectSize, percentComplete);
break;
}
case NORM_RX_OBJECT_COMPLETED:
fprintf(stderr, "normFileRecv: NORM_RX_OBJECT_COMPLETED event ...\n");
keepGoing = false;
break;
case NORM_RX_OBJECT_ABORTED:
fprintf(stderr, "normFileRecv: NORM_RX_OBJECT_ABORTED event ...\n");
break;
case NORM_REMOTE_SENDER_NEW:
fprintf(stderr, "normFileRecv: NORM_REMOTE_SENDER_NEW event ...\n");
break;
case NORM_REMOTE_SENDER_ACTIVE:
fprintf(stderr, "normFileRecv: NORM_REMOTE_SENDER_ACTIVE event ...\n");
break;
case NORM_REMOTE_SENDER_INACTIVE:
fprintf(stderr, "normFileRecv: NORM_REMOTE_SENDER_INACTIVE event ...\n");
break;
default:
fprintf(stderr, "normFileRecv: Got event type: %d\n", theEvent.type);
} }
NormStopReceiver(session);
NormDestroySession(session);
NormDestroyInstance(instance);
fprintf(stderr, "normFileRecv: Done.\n");
return 0;
}