Пример #1
0
        private void ListPackageVersions(
            ClientConnection clientConnection,
            ClientRequest clientRequest)
        {
            // request
            XmlDocument xmlDocument = new XmlDocument();

            using (MemoryStream memoryStream = new MemoryStream(clientRequest.Message.Data))
            {
                xmlDocument.Load(memoryStream);
            }

            XmlMessageListPackages listPackagesMessage = XmlMessageCreator.CreateXmlMessageListPackages(xmlDocument);

            // response
            XmlMessageListPackageVersions packageVersions = XmlMessageCreator.CreateXmlMessageListPackageVersions();

            foreach (KeyValuePair <string, List <string> > repositoryItem in listPackagesMessage.Repositories)
            {
                Repository repository = _repositoryManager.GetRepository(repositoryItem.Key);
                foreach (string packageName in repositoryItem.Value)
                {
                    List <string> versions = repository.GetPackageVersions(packageName);
                    if (!packageVersions.AddRepositoryPackageVersions(repository.Name, packageName, versions))
                    {
                        Console.WriteLine("ERROR: Cannot add package versions!");
                    }
                }
            }

            SendClientXmlResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_VERSIONS, packageVersions);
        }
Пример #2
0
        public void GetPackageVersions(
            string repositoryName,
            string packageNames)
        {
            XmlMessageListPackages listPackagesMessage = XmlMessageCreator.CreateXmlMessageListPackages();

            List <string> packages = packageNames.Split(',').ToList <string>();

            listPackagesMessage.AddRepositoryPackages(repositoryName, packages);


            // create packet
            PacketMessage packetMessage =
                new PacketMessage(PacketMessageType.C_LIST_PACKAGE_VERSIONS, 0, listPackagesMessage.ToByteArray());

            byte[] packet = _packetManager.CreateMessage(packetMessage.GetMessageData());

            // send
            _clientSocket.Send(packet);

            // get response
            int rec = _clientSocket.Receive(_socketBuffer);

            byte[] data = new byte[rec];
            Array.Copy(_socketBuffer, data, rec);
            _packetManager.AddReceivedData(data);
        }
        private void OnPackageDataHeaderReceived(PacketMessage packetMessage)
        {
            XmlDocument xmlDocument = CreateXmlDocumentFromMessage(packetMessage);
            //Console.WriteLine("DEBUG: Received S_PACKAGE_DATA_HEADER: " + xmlDocument.OuterXml);
            XmlMessagePackageDataHeader message = XmlMessageCreator.CreateXmlMessagePackageDataHeader(xmlDocument);

            if (PackageDataHeaderReceived != null)
            {
                PackageDataHeaderReceived(this, message);
            }
        }
        private void OnListPackageVersionsReceived(PacketMessage packetMessage)
        {
            XmlDocument xmlDocument = CreateXmlDocumentFromMessage(packetMessage);
            //Console.WriteLine("DEBUG: Received S_PACKAGE_VERSIONS: " + xmlDocument.OuterXml);
            XmlMessageListPackageVersions message = XmlMessageCreator.CreateXmlMessageListPackageVersions(xmlDocument);

            if (ListPackageVersionsReceived != null)
            {
                ListPackageVersionsReceived(this, message);
            }
        }
        private void OnPackageFileDataBeginReceived(PacketMessage packetMessage)
        {
            XmlDocument xmlDocument = CreateXmlDocumentFromMessage(packetMessage);
            //Console.WriteLine("DEBUG: Received S_PACKAGE_FILE_BEGIN: " + xmlDocument.OuterXml);
            XmlMessagePackageFileBegin message = XmlMessageCreator.CreateXmlMessagePackageFileBegin(xmlDocument);

            if (PackageFileDataBeginReceived != null)
            {
                PackageFileDataBeginReceived(this, message);
            }
        }
Пример #6
0
        private void GetPackage(
            ClientConnection clientConnection,
            ClientRequest clientRequest)
        {
            // request
            XmlDocument xmlDocument = new XmlDocument();

            using (MemoryStream memoryStream = new MemoryStream(clientRequest.Message.Data))
            {
                xmlDocument.Load(memoryStream);
            }

            XmlMessageGetPackage getPackageMessage = XmlMessageCreator.CreateXmlMessageGetPackage(xmlDocument);

            Console.WriteLine("INFO: Requested to send package:");
            Console.WriteLine("      * repository: " + getPackageMessage.RepositoryName);
            Console.WriteLine("      * package   : " + getPackageMessage.PackageName);
            Console.WriteLine("      * version   : " + getPackageMessage.Version);

            // response
            Repository repository = _repositoryManager.GetRepository(getPackageMessage.RepositoryName);

            if (repository == null)
            {
                // invalid request
                string reason = "Invalid repository name - " + getPackageMessage.RepositoryName;
                Console.WriteLine("ERROR: Cannot get package. " + reason);
                SendClientStringResponse(clientConnection, clientRequest, PacketMessageType.S_ERROR_INVALID_PACKAGE_REQUEST, reason);
                return;
            }

            string packageDataDir = repository.GetPackagePath(getPackageMessage.PackageName, getPackageMessage.Version);

            if (String.IsNullOrEmpty(packageDataDir))
            {
                // invalid request
                string reason = "Invalid package - " + getPackageMessage.PackageName + "(" + getPackageMessage.Version + ")";
                Console.WriteLine("ERROR: Cannot get package. " + reason);
                SendClientStringResponse(clientConnection, clientRequest, PacketMessageType.S_ERROR_INVALID_PACKAGE_REQUEST, reason);
                return;
            }

            // send package data
            SendPackageData(clientConnection, clientRequest, getPackageMessage, packageDataDir);
        }
Пример #7
0
        public bool GetPackage(
            string repositoryName,
            string packageName,
            string version)
        {
            // verify repository
            LocalRepository requestedRepository = _localRepositoryManager.LocalRepositories.FirstOrDefault(
                localRepository => localRepository.Name == repositoryName);

            if (requestedRepository != null)
            {
                XmlMessageGetPackage getPackageMessage =
                    XmlMessageCreator.CreateXmlMessageGetPackage(repositoryName, packageName, version);


                // create packet
                PacketMessage packetMessage =
                    new PacketMessage(PacketMessageType.C_GET_PACKAGE, 0, getPackageMessage.ToByteArray());
                byte[] packet = _packetManager.CreateMessage(packetMessage.GetMessageData());

                // setup package builder and send request
                _packetBuilder.StartReceiving(requestedRepository.Path);
                _clientSocket.Send(packet);

                // get response
                Console.WriteLine("INFO: Waiting for incoming data...");

                do
                {
                    int    rec  = _clientSocket.Receive(_socketBuffer);
                    byte[] data = new byte[rec];
                    Array.Copy(_socketBuffer, data, rec);
                    _packetManager.AddReceivedData(data);

                    Thread.Sleep(10);  // TODO must be removed
                }while (_packetBuilder.IsReceiving());

                return(true);
            }
            else
            {
                return(false);
            }
        }
Пример #8
0
        private void ListPackages(
            ClientConnection clientConnection,
            ClientRequest clientRequest)
        {
            XmlMessageListPackages listPackagesMessage = XmlMessageCreator.CreateXmlMessageListPackages();

            foreach (Repository repository in _repositoryManager.Repositories.Values)
            {
                List <string> packages = new List <string>();
                foreach (string package in repository.GetPackages())
                {
                    packages.Add(package);
                }

                listPackagesMessage.AddRepositoryPackages(repository.Name, packages);
            }

            SendClientXmlResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGES, listPackagesMessage);
        }
Пример #9
0
        private void SendPackageFile(
            ClientConnection clientConnection,
            ClientRequest clientRequest,
            FileInfo packageFileInfo)
        {
            // send file data
            const int FILE_CHUNK_SIZE = 32 * 1024 * 1024; // read the file by chunks of 32MB

            using (FileStream file = File.OpenRead(packageFileInfo.FullName))
            {
                // send file begin
                XmlMessagePackageFileBegin fileBeginMessage = XmlMessageCreator.CreateXmlMessagePackageFileBegin(
                    packageFileInfo.Name,
                    file.Length,
                    ComputeFileChecksum(packageFileInfo));

                SendClientXmlResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_FILE_BEGIN, fileBeginMessage);

                int    part      = 0;
                int    bytesRead = 0;
                byte[] buffer    = new byte[FILE_CHUNK_SIZE];
                while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0)
                {
                    byte[] dataToSend = buffer;

                    // extract only "bytesRead" number of bytes
                    if (bytesRead < buffer.Length)
                    {
                        dataToSend = new byte[bytesRead];
                        Array.Copy(buffer, dataToSend, bytesRead);
                    }

                    SendClientRawDataResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_FILE_DATA, dataToSend, part++);
                }
            }

            // send file end
            SendClientNoDataResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_FILE_END);
        }
Пример #10
0
        private void SendPackageData(
            ClientConnection clientConnection,
            ClientRequest clientRequest,
            XmlMessageGetPackage getPackageMessage,
            string packageDataDir)
        {
            DirectoryInfo packageDataInfo = new DirectoryInfo(packageDataDir);

            // send data package header
            XmlMessagePackageDataHeader packagedataHeader =
                XmlMessageCreator.CreateXmlMessagePackageDataHeader(
                    getPackageMessage.RepositoryName,
                    getPackageMessage.PackageName,
                    getPackageMessage.Version,
                    packageDataInfo.GetFiles().Length);

            SendClientXmlResponse(clientConnection, clientRequest, PacketMessageType.S_PACKAGE_DATA_HEADER, packagedataHeader);

            // send files
            foreach (FileInfo packageFileInfo in packageDataInfo.GetFiles())
            {
                SendPackageFile(clientConnection, clientRequest, packageFileInfo);
            }
        }