TelnetTransport::~TelnetTransport() { Stop(); if (sendSuffix) rakFree(sendSuffix); if (sendPrefix) rakFree(sendPrefix); }
void FileList::Clear(void) { unsigned i; for (i=0; i<fileList.Size(); i++) { rakFree(fileList[i].data); rakFree(fileList[i].filename); } fileList.Clear(); }
void FileList::AddFile(const char *filename, const char *data, const unsigned dataLength, const unsigned fileLength, FileListNodeContext context, bool isAReference) { if (filename==0) return; if (strlen(filename)>MAX_FILENAME_LENGTH) { // Should be enough for anyone RakAssert(0); return; } // If adding a reference, do not send data RakAssert(isAReference==false || data==0); // Avoid duplicate insertions unless the data is different, in which case overwrite the old data unsigned i; for (i=0; i<fileList.Size();i++) { if (strcmp(fileList[i].filename, filename)==0) { if (fileList[i].fileLengthBytes==fileLength && fileList[i].dataLengthBytes==dataLength && (dataLength==0 || memcmp(fileList[i].data, data, dataLength)==0)) // Exact same file already here return; // File of the same name, but different contents, so overwrite rakFree(fileList[i].data); rakFree(fileList[i].filename); fileList.RemoveAtIndex(i); break; } } FileListNode n; n.filename=(char*) rakMalloc( strlen(filename)+1 ); if (dataLength && data) { n.data=(char*) rakMalloc( dataLength ); memcpy(n.data, data, dataLength); } else n.data=0; n.dataLengthBytes=dataLength; n.fileLengthBytes=fileLength; n.isAReference=isAReference; n.context=context; strcpy(n.filename, filename); fileList.Insert(n); }
void MessageFilter::DeallocateFilterSet(FilterSet* filterSet) { unsigned i; for (i=0; i < filterSet->allowedRPCs.Size(); i++) rakFree(filterSet->allowedRPCs[i]); delete filterSet; }
void TCPInterface::DeallocatePacket( Packet *packet ) { if (packet==0) return; assert(incomingMessages.CheckReadUnlockOrder(packet)); rakFree(packet->data); incomingMessages.ReadUnlock(); }
ThreadsafePacketLogger::~ThreadsafePacketLogger() { char **msg; while ((msg = logMessages.ReadLock()) != 0) { rakFree((*msg)); } }
void ThreadsafePacketLogger::Update(RakPeerInterface *peer) { (void) peer; char **msg; while ((msg = logMessages.ReadLock()) != 0) { WriteLog(*msg); rakFree((*msg)); } }
void TelnetTransport::SetSendPrefix(const char *prefix) { if (sendPrefix) { rakFree(sendPrefix); sendPrefix=0; } if (prefix) { sendPrefix = (char*) rakMalloc(strlen(prefix)+1); strcpy(sendPrefix, prefix); } }
void TelnetTransport::SetSendSuffix(const char *suffix) { if (sendSuffix) { rakFree(sendSuffix); sendSuffix=0; } if (suffix) { sendSuffix = (char*) rakMalloc(strlen(suffix)+1); strcpy(sendSuffix, suffix); } }
void FileList::AddFile(const char *filepath, const char *filename, FileListNodeContext context) { if (filepath==0 || filename==0) return; char *data; //std::fstream file; //file.open(filename, std::ios::in | std::ios::binary); FILE *fp = fopen(filepath, "rb"); if (fp==0) return; fseek(fp, 0, SEEK_END); int length = ftell(fp); fseek(fp, 0, SEEK_SET); if (length > (int) ((unsigned int)-1 / 8)) { // If this assert hits, split up your file. You could also change BitSize_t in RakNetTypes.h to unsigned long long but this is not recommended for performance reasons RakAssert("Cannot add files over 536 MB" && 0); fclose(fp); return; } #if !defined(_XBOX) && !defined(_X360) bool usedAlloca=false; if (length < MAX_ALLOCA_STACK_ALLOCATION) { data = ( char* ) alloca( length ); usedAlloca=true; } else #endif { data = (char*) rakMalloc( length ); } fread(data, 1, length, fp); AddFile(filename, data, length, length, context); fclose(fp); #if !defined(_XBOX) && !defined(_X360) if (usedAlloca==false) #endif rakFree(data); }
void TelnetTransport::DeallocatePacket( Packet *packet ) { if (tcpInterface==0) return; rakFree(packet->data); rakFree(packet); }
void FileList::PopulateDataFromDisk(const char *applicationDirectory, bool writeFileData, bool writeFileHash, bool removeUnknownFiles) { FILE *fp; char fullPath[512]; unsigned i; // CSHA1 sha1; i=0; while (i < fileList.Size()) { rakFree(fileList[i].data); strcpy(fullPath, applicationDirectory); FixEndingSlash(fullPath); strcat(fullPath,fileList[i].filename); fp=fopen(fullPath, "rb"); if (fp) { if (writeFileHash || writeFileData) { fseek(fp, 0, SEEK_END); fileList[i].fileLengthBytes = ftell(fp); fseek(fp, 0, SEEK_SET); if (writeFileHash) { if (writeFileData) { // Hash + data so offset the data by HASH_LENGTH fileList[i].data=(char*) rakMalloc( fileList[i].fileLengthBytes+HASH_LENGTH ); fread(fileList[i].data+HASH_LENGTH, fileList[i].fileLengthBytes, 1, fp); // sha1.Reset(); // sha1.Update((unsigned char*)fileList[i].data+HASH_LENGTH, fileList[i].fileLength); // sha1.Final(); unsigned int hash = SuperFastHash(fileList[i].data+HASH_LENGTH, fileList[i].fileLengthBytes); if (RakNet::BitStream::DoEndianSwap()) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); // memcpy(fileList[i].data, sha1.GetHash(), HASH_LENGTH); memcpy(fileList[i].data, &hash, HASH_LENGTH); } else { // Hash only fileList[i].dataLengthBytes=HASH_LENGTH; if (fileList[i].fileLengthBytes < HASH_LENGTH) fileList[i].data=(char*) rakMalloc( HASH_LENGTH ); else fileList[i].data=(char*) rakMalloc( fileList[i].fileLengthBytes ); fread(fileList[i].data, fileList[i].fileLengthBytes, 1, fp); // sha1.Reset(); // sha1.Update((unsigned char*)fileList[i].data, fileList[i].fileLength); // sha1.Final(); unsigned int hash = SuperFastHash(fileList[i].data, fileList[i].fileLengthBytes); if (RakNet::BitStream::DoEndianSwap()) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); // memcpy(fileList[i].data, sha1.GetHash(), HASH_LENGTH); memcpy(fileList[i].data, &hash, HASH_LENGTH); } } else { // Data only fileList[i].dataLengthBytes=fileList[i].fileLengthBytes; fileList[i].data=(char*) rakMalloc( fileList[i].fileLengthBytes ); fread(fileList[i].data, fileList[i].fileLengthBytes, 1, fp); } fclose(fp); i++; } else { fileList[i].data=0; fileList[i].dataLengthBytes=0; } } else { if (removeUnknownFiles) { rakFree(fileList[i].filename); fileList.RemoveAtIndex(i); } else i++; } } }
void FileList::AddFilesFromDirectory(const char *applicationDirectory, const char *subDirectory, bool writeHash, bool writeData, bool recursive, FileListNodeContext context) { DataStructures::Queue<char*> dirList; char root[260]; char fullPath[520]; _finddata_t fileInfo; intptr_t dir; FILE *fp; char *dirSoFar, *fileData; dirSoFar=(char*) rakMalloc( 520 ); if (applicationDirectory) strcpy(root, applicationDirectory); else root[0]=0; int rootLen=(int)strlen(root); if (rootLen) { strcpy(dirSoFar, root); if (FixEndingSlash(dirSoFar)) rootLen++; } else dirSoFar[0]=0; if (subDirectory) { strcat(dirSoFar, subDirectory); FixEndingSlash(dirSoFar); } if (callback) callback->OnAddFilesFromDirectoryStarted(this, dirSoFar); // RAKNET_DEBUG_PRINTF("Adding files from directory %s\n",dirSoFar); dirList.Push(dirSoFar); while (dirList.Size()) { dirSoFar=dirList.Pop(); strcpy(fullPath, dirSoFar); // Changed from *.* to * for Linux compatibility strcat(fullPath, "*"); dir=_findfirst(fullPath, &fileInfo ); if (dir==-1) { _findclose(dir); rakFree(dirSoFar); unsigned i; for (i=0; i < dirList.Size(); i++) rakFree(dirList[i]); return; } // RAKNET_DEBUG_PRINTF("Adding %s. %i remaining.\n", fullPath, dirList.Size()); if (callback) callback->OnDirectory(this, fullPath, dirList.Size()); do { // no guarantee these entries are first... if (strcmp("." , fileInfo.name) == 0 || strcmp("..", fileInfo.name) == 0) { continue; } if ((fileInfo.attrib & (_A_HIDDEN | _A_SUBDIR | _A_SYSTEM))==0) { strcpy(fullPath, dirSoFar); strcat(fullPath, fileInfo.name); fileData=0; if (callback) callback->OnFile(this, dirSoFar, fileInfo.name, fileInfo.size); if (writeData && writeHash) { fileData= (char*) rakMalloc( fileInfo.size+HASH_LENGTH ); fp = fopen(fullPath, "rb"); fread(fileData+HASH_LENGTH, fileInfo.size, 1, fp); fclose(fp); unsigned int hash = SuperFastHash(fileData+HASH_LENGTH, fileInfo.size); if (RakNet::BitStream::DoEndianSwap()) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); memcpy(fileData, &hash, HASH_LENGTH); // sha1.Reset(); // sha1.Update( ( unsigned char* ) fileData+HASH_LENGTH, fileInfo.size ); // sha1.Final(); // memcpy(fileData, sha1.GetHash(), HASH_LENGTH); // File data and hash AddFile((const char*)fullPath+rootLen, fileData, fileInfo.size+HASH_LENGTH, fileInfo.size, context); } else if (writeHash) { // sha1.Reset(); // sha1.HashFile((char*)fullPath); // sha1.Final(); unsigned int hash = SuperFastHashFile(fullPath); if (RakNet::BitStream::DoEndianSwap()) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash, sizeof(hash)); // Hash only // AddFile((const char*)fullPath+rootLen, (const char*)sha1.GetHash(), HASH_LENGTH, fileInfo.size, context); AddFile((const char*)fullPath+rootLen, (const char*)&hash, HASH_LENGTH, fileInfo.size, context); } else if (writeData) { fileData= (char*) rakMalloc( fileInfo.size ); fp = fopen(fullPath, "rb"); fread(fileData, fileInfo.size, 1, fp); fclose(fp); // File data only AddFile(fullPath+rootLen, fileData, fileInfo.size, fileInfo.size, context); } else { // Just the filename AddFile(fullPath+rootLen, 0, 0, fileInfo.size, context); } if (fileData) rakFree(fileData); } else if ((fileInfo.attrib & _A_SUBDIR) && (fileInfo.attrib & (_A_HIDDEN | _A_SYSTEM))==0 && recursive) { char *newDir=(char*) rakMalloc( 520 ); strcpy(newDir, dirSoFar); strcat(newDir, fileInfo.name); strcat(newDir, "/"); dirList.Push(newDir); } } while (_findnext(dir, &fileInfo ) != -1); _findclose(dir); rakFree(dirSoFar); } }
bool WriteFileWithDirectories( const char *path, char *data, unsigned dataLength ) { int index; FILE *fp; char *pathCopy; #ifndef _WIN32 char *systemCommand; #endif if ( path == 0 || path[ 0 ] == 0 ) return false; #ifndef _WIN32 systemCommand = (char*) rakMalloc( strlen( path ) + 1 + 6 ); #endif pathCopy = (char*) rakMalloc( strlen( path ) + 1 ); strcpy( pathCopy, path ); index = 0; while ( pathCopy[ index ] ) { if ( pathCopy[ index ] == '/' || pathCopy[ index ] == '\\') { pathCopy[ index ] = 0; #ifdef _WIN32 #pragma warning( disable : 4966 ) // mkdir declared depreciated by Microsoft in order to make it harder to be cross platform. I don't agree it's depreciated. mkdir( pathCopy ); #else mkdir( pathCopy, 0744 ); #endif pathCopy[ index ] = '/'; } index++; } if (data) { fp = fopen( path, "wb" ); if ( fp == 0 ) { rakFree(pathCopy); #ifndef _WIN32 rakFree(systemCommand); #endif return false; } fwrite( data, 1, dataLength, fp ); fclose( fp ); } else { #ifdef _WIN32 #pragma warning( disable : 4966 ) // mkdir declared depreciated by Microsoft in order to make it harder to be cross platform. I don't agree it's depreciated. mkdir( pathCopy ); #else mkdir( pathCopy, 0744 ); #endif } rakFree(pathCopy); #ifndef _WIN32 rakFree(systemCommand); #endif return true; }