Beispiel #1
0
        public static int onReceiveNextBlock(IntPtr handle
                                             , [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] Byte[] buf, int len, bool toBeContinued)
        {
            if (len < 0)
            {
                Console.WriteLine("FSP Internal panic? Callback on peeked return {0}", len);
                FSPAPI.Dispose(handle);
                finished = true;
                return(-1);
            }

            if (len > 0)
            {
                Console.Write("{0} bytes read, to write the buffer directly...", len);
                try
                {
                    hFile.Write(buf, 0, len);
                    Console.WriteLine("done.");
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error on writing file: {0}", e.Message);
                    FSPAPI.Dispose(handle);
                    finished = true;
                    return(-1);
                }
            }
            else
            {
                Console.WriteLine("Receive nothing when calling the CallbackPeeked.");
            }

            if (!toBeContinued)
            {
                Console.WriteLine("All data have been received, to acknowledge...\n");
                hFile.Close();
                // Respond with a code saying no error
                int r = FSPAPI.WriteTo(handle, Encoding.ASCII.GetBytes("0000"), 4, FlagEndOfMessage.END_OF_MESSAGE, new NotifyOrReturn(onAcknowledgeSent));
                if (r < 0)
                {
                    FSPAPI.Dispose(handle);
                    finished = true;
                    return(-1);
                }
            }

            // return a non-zero would let the occupied receive buffer free
            return(1);
        }
Beispiel #2
0
        public static int onReceiveFileNameReturn(IntPtr handle, FSP_ServiceCode code, int result)
        {
            if (code != FSP_ServiceCode.FSP_NotifyDataReady || result < 0)
            {
                FSPAPI.Dispose(handle);
                finished = true;
                return(-1);
            }

            if (result == 0)
            {
                Console.WriteLine("No filename returned. onReceiveFileNameReturn called more than once?");
                return(0);
            }

            // The byte length, result, included the terminating zero which should be excluded
            // TODO: should add some configurable work directory
            String filePath = DEFAULT_RECV_DIR + Encoding.UTF8.GetString(fileName, 0, result - 1);

            Console.WriteLine("{0}", filePath);
            try
            {
                // TODO: exploit to GetDiskFreeSpace to take use of SECTOR size
                // _aligned_malloc
                // the client should take use of 'FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH' for ultimate integrity
                hFile = File.Create(filePath, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan | FileOptions.WriteThrough);
                //    , GENERIC_WRITE
                //    , 0	// shared none
                //    , NULL
                //    , CREATE_NEW
                //    , FILE_FLAG_POSIX_SEMANTICS | FILE_FLAG_WRITE_THROUGH
                //    , NULL);
                //// | FILE_FLAG_NO_BUFFERING [require data block alignment which condition is too strict]
                //
                Console.WriteLine("To read content with inline buffering...");
                FSPAPI.RecvInline(handle, new CallbackPeeked(onReceiveNextBlock));
            }
            catch (Exception e)
            {
                Console.WriteLine("Unfortunately exception occured:");
                Console.WriteLine(e.Message);
                finished = true;
                FSPAPI.Dispose(handle); // may raise second-chance exceptions?
            }

            return(0);
        }
Beispiel #3
0
        // This time it is really shutdown
        public static int onAcknowledgeSent(IntPtr h, FSP_ServiceCode c, int r)
        {
            Console.WriteLine("Result of sending the acknowledgement: {0}", r);
            if (r < 0)
            {
                finished = true;
                FSPAPI.Dispose(h);
                return(0);
            }

            if (FSPAPI.Shutdown(h, new NotifyOrReturn(onShutdown)) < 0)
            {
                Console.WriteLine("Cannot shutdown gracefully in the final stage.");
                FSPAPI.Dispose(h);
                finished = true;
                return(-1);
            }

            return(0);
        }
Beispiel #4
0
        public static int onPublicKeySent(IntPtr handle, FSP_ServiceCode code, int result)
        {
            Console.WriteLine("onPublicKeySent: Handle = {0:X}, code = {1}, result = {2}", handle, code, result);
            if (result < 0)
            {
                FSPAPI.Dispose(handle);
                finished = true;
                return(-1);
            }

            Console.Write("To read the filename directly...\t");
            if (FSPAPI.ReadFrom(handle, fileName, fileName.Length, new NotifyOrReturn(onReceiveFileNameReturn)) < 0)
            {
                FSPAPI.Dispose(handle);
                finished = true;
                return(-1);
            }

            return(0);
        }
Beispiel #5
0
 public static int onShutdown(IntPtr handle, FSP_ServiceCode code, int result)
 {
     Console.WriteLine("onShutdown: Handle = {0:X}, code = {1}, result = {2}", handle, code, result);
     FSPAPI.Dispose(handle);
     return(0);
 }