Go to the documentation of this file.00001 #include "SystemAddressList.h"
00002 #include "Rand.h"
00003 #include "RakAssert.h"
00004 #include "BitStream.h"
00005 #include <stdio.h>
00006
00007 SystemAddressList::SystemAddressList()
00008 {
00009
00010 }
00011 SystemAddressList::SystemAddressList(SystemAddress system)
00012 {
00013 systemList.Insert(system, __FILE__, __LINE__);
00014 }
00015 void SystemAddressList::AddSystem(SystemAddress system)
00016 {
00017 systemList.Insert(system, __FILE__, __LINE__);
00018 }
00019 void SystemAddressList::RandomizeOrder(void)
00020 {
00021 unsigned index, size, randIndex;
00022 SystemAddress temp;
00023 size = systemList.Size();
00024 for (index=0; index < size; index++)
00025 {
00026 randIndex=index + (randomMT() % (size-index));
00027 if (randIndex!=index)
00028 {
00029 temp=systemList[index];
00030 systemList[index]=systemList[randIndex];
00031 systemList[randIndex]=temp;
00032 }
00033 }
00034 }
00035 void SystemAddressList::Serialize(RakNet::BitStream *out)
00036 {
00037 out->Write((unsigned short) systemList.Size());
00038 unsigned index;
00039 for (index=0; index < systemList.Size(); index++)
00040 out->Write(systemList[index]);
00041 }
00042 bool SystemAddressList::Deserialize(RakNet::BitStream *in)
00043 {
00044 unsigned short systemListSize;
00045 SystemAddress systemAddress;
00046 unsigned index;
00047 if (in->Read(systemListSize)==false)
00048 {
00049 RakAssert(0);
00050 return false;
00051 }
00052 systemList.Clear(false, __FILE__, __LINE__);
00053 for (index=0; index < systemListSize; index++)
00054 {
00055 if (in->Read(systemAddress)==false)
00056 {
00057 RakAssert(0);
00058 systemList.Clear(false, __FILE__, __LINE__);
00059 return false;
00060 }
00061 systemList.Insert(systemAddress, __FILE__, __LINE__);
00062
00063 }
00064 return true;
00065 }
00066 void SystemAddressList::RemoveSystem(SystemAddress system)
00067 {
00068 unsigned i;
00069 for (i=0; i < systemList.Size(); i++)
00070 {
00071 if (systemList[i]==system)
00072 {
00073 systemList.RemoveAtIndex(i);
00074 return;
00075 }
00076 }
00077 }
00078 DataStructures::List<SystemAddress> * SystemAddressList::GetList(void)
00079 {
00080 return &systemList;
00081 }
00082 bool SystemAddressList::Save(const char *filename)
00083 {
00084 RakNet::BitStream temp;
00085 Serialize(&temp);
00086 FILE *fp = fopen(filename, "wb");
00087 if (fp)
00088 {
00089 fwrite(temp.GetData(), (size_t) temp.GetNumberOfBytesUsed(), 1, fp);
00090 fclose(fp);
00091 return true;
00092 }
00093 return false;
00094 }
00095 bool SystemAddressList::Load(const char *filename)
00096 {
00097 FILE *fp = NULL;
00098 unsigned long fileSize;
00099
00100 if ( ( fp = fopen( filename, "rb" ) ) == 0 )
00101 return false;
00102
00103 fseek( fp, 0, SEEK_END );
00104 fileSize = ftell( fp );
00105 fseek( fp, 0, SEEK_SET );
00106 if (fileSize==0)
00107 {
00108 fclose(fp);
00109 return false;
00110 }
00111 unsigned char *filedata = (unsigned char*) rakMalloc_Ex( fileSize, __FILE__, __LINE__ );
00112 fread(filedata, fileSize, 1, fp);
00113 fclose(fp);
00114
00115 RakNet::BitStream bs(filedata, fileSize, false);
00116 Deserialize(&bs);
00117 rakFree_Ex(filedata, __FILE__, __LINE__ );
00118 return true;
00119 }
00120 unsigned SystemAddressList::Size(void) const
00121 {
00122 return systemList.Size();
00123 }
00124 SystemAddress& SystemAddressList::operator[] ( const unsigned int position ) const
00125 {
00126 return systemList[position];
00127 }
00128 void SystemAddressList::Clear(void)
00129 {
00130 systemList.Clear(false, __FILE__, __LINE__);
00131 }