예제 #1
0
    // Start is called before the first frame update
    void Start()
    {
        var storage = FirebaseStorage.DefaultInstance;
        // 테스트할 때마다 경로 바꿔서 테스트 가능
        var screenshotReference = storage.GetReferenceFromUrl(PATH).Child($"/screenshots/city-4298285_640.jpg");

        #region Set-Metadata
        var metadataChange = new MetadataChange()
        {
            CustomMetadata = new Dictionary <string, string>()
            {
                //{ "Position", Camera.main.transform.position.ToString()},
                { "Location", "카페" }
            }
        };
        #endregion

        screenshotReference.UpdateMetadataAsync(metadataChange).ContinueWith(task => {
            if (!task.IsFaulted && !task.IsCanceled)
            {
                // access the updated meta data
                Firebase.Storage.StorageMetadata meta = task.Result;
            }
        });
    }
    public static void UploadFile(string File, string Path, string Type, string Database)
    {
        StorageReference FileReference = StorageReference.Child(Path);

        var Metadata = new MetadataChange();

        Metadata.ContentType = "image/" + Type.Replace(".", "");

        FileReference.PutFileAsync(File, Metadata).ContinueWith((Task) =>
        {
            if (Task.IsFaulted || Task.IsCanceled)
            {
                Debug.Log(Task.Exception.ToString());
                TecWolf.System.SystemInterface.Alert("Foto não enviada com sucesso, tente novamente.");
            }
            else
            {
                TecWolf.System.SystemInterface.Alert("Foto enviada com sucesso.");

                FileReference.GetDownloadUrlAsync().ContinueWith(TaskDownload =>
                {
                    if (TaskDownload.IsCompleted)
                    {
                        Debug.Log("Download URL: " + TaskDownload.Result);
                        DownloadUrl = TaskDownload.Result.ToString();

                        FirebaseController.WriteDataString(Database, "link", FirebaseController.DownloadUrl);
                    }
                });
            }
        });
    }
예제 #3
0
    /// <summary>
    /// Sets value at Voxel containing point.
    /// If updateStruct, re-grids contained space so no voxel contains two points.
    /// If not, replaces value in vox.
    /// If Container does not contain newPoint, throws ArgumentOutOfRangeException.
    /// Returns MetadataChange object specifying changes made.
    /// <summary>
    public MetadataChange set(Vector3 point, T value, bool updateStruct)
    {
        if (!contains(point))
        {
            throw new ArgumentOutOfRangeException("point", "not contained in Container.");
        }
        int childNum = whichChild(point);

        if (children[childNum].GetType() == typeof(OctreeContainer <T>))
        {
            return(((OctreeContainer <T>)children[childNum]).set(point, value, updateStruct));
        }
        else
        {
            if (!updateStruct || ((Voxel <T>)children[childNum]).nullVox == true ||
                children[childNum].size() < 2f * minSize)
            {
                /// reassign voxel data
                return(((Voxel <T>)children[childNum]).set(point, value));
            }
            else
            {
                /// split, try set again
                MetadataChange change1;
                children[childNum] = ((Voxel <T>)children[childNum]).split(out change1);
                MetadataChange change2 = ((OctreeContainer <T>)children[childNum]).set(point, value, updateStruct);
                return(change1 + change2);
            }
        }
    }
예제 #4
0
        /// <summary>
        /// upload the Live2D model to server
        /// </summary>
        /// <param name="filepath">Current live2D model.json file</param>
        public async Task UploadLive2D(string filepath)
        {
            var fileType = new MetadataChange();
            //setup compressor
            ModelCompressor comp = new ModelCompressor();
            string          data = null;
            await Task.Run(() =>
            {
                data = comp.CompressAsync(filepath).Result;
            });

            StorageReference moc3Path = Storage_ref.Child("VRP/" + CurrentUser.UserId + "/Live2D/" + Path.GetFileNameWithoutExtension(filepath) + "_model.json");

            isUploading          = true;
            fileType.ContentType = "application/json";

            await moc3Path.PutBytesAsync(System.Text.Encoding.UTF8.GetBytes(data), fileType).ContinueWith((Task <StorageMetadata> task) =>
            {
                Debug.Log("start uploading");
                if (task.IsFaulted || task.IsCanceled)
                {
                    Debug.Log(task.Exception.ToString());
                    // Uh-oh, an error occurred!
                    isUploading = false;
                }
                else
                {
                    metadata = task.Result;
                    Debug.Log("Finished uploading...");
                }
                isUploading = false;
            });
        }
예제 #5
0
    /// <summary>
    /// Reformats children if necessary. Should not be called if size() < newMinSize
    /// </summary>
    public override MetadataChange Reformat(float newMinSize)
    {
        if (size() < newMinSize * 2f)
        {
            throw new ArgumentOutOfRangeException("newMinSize", "greater than size()/2. " +
                                                  "Reformat should be called on parent.");
        }

        minSize = newMinSize;

        if (size() < newMinSize * 4f)
        {
            // convert children to voxels
            MetadataChange change = -SubTreeData();
            for (int i = 0; i < 8; i++)
            {
                children[i] = new Voxel <T>(children[i].min, children[i].max, minSize,
                                            children[i].getPoint(children[i].min), children[i].get(children[i].min));
            }
            return(change + SubTreeData());
        }
        else
        {
            // reformat children
            MetadataChange change = new MetadataChange();
            for (int i = 0; i < 8; i++)
            {
                change += children[i].Reformat(newMinSize);
            }
            return(change);
        }
    }
예제 #6
0
 /// <summary>
 /// updates metadata given MetadataChange from Component classes.
 /// <summary>
 private void updateMetadata(MetadataChange change)
 {
     numComponents    += change.components;
     numVoxels        += change.voxels;
     numNonNullVoxels += change.nonNullVoxels;
     volume           += change.volume;
     nonNullVolume    += change.nonNullVolume;
     memSize           = ((numComponents - numVoxels) * OctreeContainer <T> .memSize) + (numVoxels * Voxel <T> .memSize);
 }
예제 #7
0
    /// <summary>
    /// Sets value at Voxel containing point.
    /// If updateStruct, re-grids contained space so no voxel contains two points.
    /// If not, replaces value in vox.
    /// If Octree does not contain point, will grow until it does.
    /// <summary>
    public void set(Vector3 point, T value, bool updateStruct)
    {
        if (!root.contains(point))
        {
            grow(point);
        }
        MetadataChange change = root.set(point, value, updateStruct);

        updateMetadata(change);
    }
예제 #8
0
    public override MetadataChange SubTreeData()
    {
        MetadataChange info = new MetadataChange(1, 0, 0, 0, 0);

        for (int i = 0; i < 8; i++)
        {
            info += children[i].SubTreeData();
        }
        return(info);
    }
예제 #9
0
    // Convert a string in the form:
    //   key1=value1
    //   ...
    //   keyN=valueN
    //
    // to a MetadataChange object.
    //
    // If an empty string is provided this method returns null.
    MetadataChange StringToMetadataChange(string metadataString)
    {
        var  metadataChange = new MetadataChange();
        var  customMetadata = new Dictionary <string, string>();
        bool hasMetadata    = false;

        foreach (var metadataStringLine in metadataString.Split(new char[] { '\n' }))
        {
            if (metadataStringLine.Trim() == "")
            {
                continue;
            }
            var keyValue = metadataStringLine.Split(new char[] { '=' });
            if (keyValue.Length != 2)
            {
                DebugLog(String.Format("Ignoring malformed metadata line '{0}' tokens={2}",
                                       metadataStringLine, keyValue.Length));
                continue;
            }
            hasMetadata = true;
            var key   = keyValue[0];
            var value = keyValue[1];
            if (key == "CacheControl")
            {
                metadataChange.CacheControl = value;
            }
            else if (key == "ContentDisposition")
            {
                metadataChange.ContentDisposition = value;
            }
            else if (key == "ContentEncoding")
            {
                metadataChange.ContentEncoding = value;
                Debug.Log("!!!!!ENCODING: " + value.ToString());
            }
            else if (key == "ContentLanguage")
            {
                metadataChange.ContentLanguage = value;
            }
            else if (key == "ContentType")
            {
                metadataChange.ContentType = value;
            }
            else
            {
                customMetadata[key] = value;
            }
        }
        if (customMetadata.Count > 0)
        {
            metadataChange.CustomMetadata = customMetadata;
        }
        return(hasMetadata ? metadataChange : null);
    }
예제 #10
0
    private IEnumerator CoUpload(Texture2D screenshot)
    {
        // create a storage ref
        var    storage  = FirebaseStorage.DefaultInstance;
        string filePath = $"/drawings/{Guid.NewGuid()}.png";

        Debug.Log(filePath);
        var screenshotRef = storage.GetReference(filePath);
        // TODO: perhaps can create a new folder for each game room --> require a game room id instead of drawings

        // convert texture2d into bytes
        var bytes = screenshot.EncodeToPNG();
        // add any metadata relevant
        var metadataChange = new MetadataChange()
        {
            ContentEncoding = "image/png"
        };


        var uploadTask = screenshotRef.PutBytesAsync(bytes, metadataChange);

        yield return(new WaitUntil(() => uploadTask.IsCompleted));

        Debug.Log("uploaded");

        // handle error
        if (uploadTask.Exception != null)
        {
            Debug.LogError($"Failed to upload because {uploadTask.Exception}");
            yield break;
        }


        // no error continue to get a download url ==> technically not necessary for this game.
        // can keep this part for the save function
        var getURLTask = screenshotRef.GetDownloadUrlAsync();

        yield return(new WaitUntil(() => getURLTask.IsCompleted));

        // handle error
        if (getURLTask.Exception != null)
        {
            Debug.LogError($"Failed to get a download url because {getURLTask.Exception}");
            yield break;
        }

        Debug.Log("Download from " + getURLTask.Result);
        // ^ not necessary

        // save the storage reference of this drawing
        downloadURL = "gs://picartsso.appspot.com" + filePath;
        Debug.Log("file location is " + downloadURL);
    }
예제 #11
0
    /// <summary>
    /// Splits Voxel into 8 smaller Voxels, returns new Octree Container.
    /// <summary>
    public OctreeContainer <T> split(out MetadataChange change)
    {
        OctreeContainer <T> replacement = new OctreeContainer <T>(min, max, minSize);

        /// add original point to new OctreeContainer
        int childNum  = replacement.whichChild(point);
        var voxBounds = replacement.childBounds(childNum);

        replacement.setChild(childNum, new Voxel <T>(voxBounds["min"], voxBounds["max"], minSize, point, value));

        change = new MetadataChange(dComponents: 8, dVoxels: 7, dNonNullVolume: -0.875 * replacement.volume());
        return(replacement);
    }
예제 #12
0
        public async Task <Uri> UploadImage(Stream image, string path)
        {
            var metadata = new MetadataChange
            {
                ContentType = "image/jpeg"
            };

            var reference = _storage.RootReference.GetChild(path);

            await reference.PutStreamAsync(image, metadata).ConfigureAwait(false);

            return(await reference.GetDownloadUrlAsync().ConfigureAwait(false));
        }
예제 #13
0
        /// <summary>
        /// upload VRM file to server
        /// </summary>
        /// <param name="filepath">Current VRM model path</param>
        public async Task UploadVRM(string filepath)
        {
            var fileType             = new MetadataChange();
            StorageReference vrmPath = Storage_ref.Child("VRP/" + CurrentUser.UserId + "/vrm/" + Path.GetFileName(filepath));
            //get thumbnail form vrm
            var context = new VRMImporterContext();

            byte[] vrmByte = null;
            using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read))
            {
                vrmByte = new byte[fs.Length];
                fs.Read(vrmByte, 0, vrmByte.Length);
                context.ParseGlb(vrmByte);
            }
            var meta = context.ReadMeta(true);

            string th;

            byte[] thumbnailData = meta.Thumbnail.EncodeToPNG();
            try
            {
                th = Convert.ToBase64String(thumbnailData);
            }
            catch (Exception e)
            {
                th = "";
            }
            isUploading          = true;
            fileType.ContentType = "application/vrm";

            await vrmPath.PutBytesAsync(vrmByte, fileType).ContinueWith((Task <StorageMetadata> task) =>
            {
                if (task.IsFaulted || task.IsCanceled)
                {
                    Debug.Log(task.Exception.ToString());
                    // Uh-oh, an error occurred!
                    isUploading = false;
                }
                else
                {
                    // Metadata contains file metadata such as size, content-type, and download URL.
                    metadata = task.Result;
                    Debug.Log("Finished uploading...");
                }
                isUploading = false;
            });
        }
예제 #14
0
 public Change(string tableName, MetadataChange tableError = null)
 {
     ObjectName = tableName;
     ChangeType = ChangeType.Table;
     if (tableError != null)
     {
         IsTableError   = true;
         _changeInclude = CheckState.Unchecked;
         ObjectName    += " (Unable to validate source query)";
         IsLeaf         = true;
     }
     else
     {
         _changeInclude = CheckState.Checked;
         IsLeaf         = false;
     }
 }
예제 #15
0
 public Change(string tableName, MetadataChange tableError = null)
 {
     ObjectName = tableName;
     ChangeType = ChangeType.Table;
     if (tableError != null)
     {
         IsTableError   = true;
         _changeInclude = CheckState.Unchecked;
         ObjectName    += tableError.ChangeType == MetadataChangeType.SourceQueryError ? " (Unable to validate source query)"
             : " (Metadata for partition \"" + tableError.Partition.Name + "\" differs from other partitions on the table)";
         IsLeaf = true;
     }
     else
     {
         _changeInclude = CheckState.Checked;
         IsLeaf         = false;
     }
 }
예제 #16
0
    public void UploadeFile()
    {
        Debug.Log("uploading file");

        // Get a reference to the storage service, using the default Firebase App
        FirebaseStorage storage = FirebaseStorage.DefaultInstance;

        StorageReference storage_ref = storage.GetReferenceFromUrl("gs://pathiktestsih.appspot.com");

        // File located on disk
        string local_file = "file://" + Application.persistentDataPath + "/mapdata.xml";

        Debug.Log(local_file);

        // Create a reference to the file you want to upload
        // StorageReference file_ref = storage_ref.Child("Map Data/" + CreateHash(Random.Range(100f, 1000f).ToString()) + "/mapdata.xml");

        // Create file metadata including the content type
        var new_metadata = new MetadataChange();

        new_metadata.ContentType = "text/xml";


        var task = storage_ref.Child("Map Data/" + CreateHash(ID) + "/mapdata.xml")
                   .PutFileAsync(local_file, null,
                                 new StorageProgress <UploadState>(state => {
            // called periodically during the upload
            Debug.Log(String.Format("Progress: {0} of {1} bytes transferred.",
                                    state.BytesTransferred, state.TotalByteCount));
        }), CancellationToken.None, null);

        task.ContinueWith(resultTask => {
            if (!resultTask.IsFaulted && !resultTask.IsCanceled)
            {
                Debug.Log("Upload finished.");
                ID = "null";
            }
            else
            {
                Debug.Log(task.Exception.ToString());
            }
        });
    }
예제 #17
0
    public void UploadImagesToFirebase(List <string> Paths)
    {
        FilePath = Paths;
        //Creating a different session everytime the user wants create a scene
        Debug.Log("Module Started");
        string sessionReference = CreateUserSession();

        Firebase.Storage.StorageReference session_ref = user_ref.Child(sessionReference);
        MetadataChange type = new MetadataChange {
            ContentType = "image/jpeg"
        };
        int Counter = 0;

        foreach (string ImagePath in Paths)
        {
            string imageName = "Image_" + Counter.ToString() + ".JPG";
            Counter++;
            StorageReference folder_ref = session_ref.Child(imageName);
            folder_ref.PutFileAsync(ImagePath, type)
            .ContinueWith((Task <StorageMetadata> task) =>
            {
                if (task.IsFaulted || task.IsCanceled)
                {
                    Debug.Log(task.Exception.ToString());
                }
                else
                {
                    StorageMetadata metadata = task.Result;
                    string download_url      = metadata.DownloadUrl.ToString() + "\n";
                    UTF8Encoding uniEncoding = new UTF8Encoding(true);
                    File.WriteAllText(fileName, download_url);
                    images.Add(download_url);
                    Debug.Log(download_url);
                    uploadCount++;
                    CheckIfComplete();
                }
            }
                          );
        }
    }
예제 #18
0
        public Change(MetadataChange metadataChange)
        {
            MetadataChange = metadataChange;
            IsLeaf         = true;
            ChangeInclude  = CheckState.Checked;
            ObjectName     = metadataChange.ModelColumn?.Name ?? "(Not imported)";
            SourceColumn   = metadataChange.ModelColumn?.SourceColumn ?? metadataChange.SourceColumn;
            ModelDataType  = metadataChange.ModelColumn?.DataType.ToString() ?? "";
            SourceDataType = string.IsNullOrEmpty(metadataChange.SourceProviderType) ? null : metadataChange.SourceType.ToString();

            switch (metadataChange.ChangeType)
            {
            case MetadataChangeType.DataTypeChange:
                Description = "Change Data Type"; ChangeType = ChangeType.EditDataType; break;

            case MetadataChangeType.SourceColumnAdded:
                Description = "Import Column"; ChangeType = ChangeType.AddColumn; break;

            case MetadataChangeType.SourceColumnNotFound:
                Description = "Remove Column"; ChangeType = ChangeType.RemoveColumn; break;
            }
        }
예제 #19
0
    private IEnumerator UploadCoroutine(Texture2D screenshot)
    {
        #region DateTime-Set
        DateTime dateTime = DateTime.Now;
        // 시-분-초
        string time = dateTime.Hour.ToString() + "-" + dateTime.Minute.ToString() + "-" + dateTime.Second.ToString();
        #endregion

        string TOTAL_DATE = dateTime.ToShortDateString() + "+" + time;

        FirebaseStorage  storage             = FirebaseStorage.DefaultInstance;
        StorageReference screenshotReference = storage.GetReferenceFromUrl(PATH).Child($"/screenshots/{TOTAL_DATE}.png");

        #region Set-Metadata
        var metadataChange = new MetadataChange()
        {
            ContentEncoding = "image/png",

            /* 여기는 메타데이터 설정
             * CustomMetadata = new Dictionary<string, string>()
             * {
             *  { "Position", Camera.main.transform.position.ToString()},
             *  { "Rotation", Camera.main.transform.position.ToString()}
             * }
             */
        };
        #endregion

        var bytes      = screenshot.EncodeToPNG();
        var uploadTask = screenshotReference.PutBytesAsync(bytes, metadataChange);
        yield return(new WaitUntil(() => uploadTask.IsCompleted));

        if (uploadTask.Exception != null)
        {
            Debug.LogError($"업로드에 실패했습니다. {uploadTask.Exception}");
            yield break;
        }
    }
예제 #20
0
    /// <summary>
    /// Reformats octree upon increase in MinSize.
    /// Growing octree resets all data.
    /// </summary>
    private void Reformat(float newMinValue)
    {
        if (root.size() < newMinValue * 2f)
        {
            root = new OctreeContainer <T>(root.min,
                                           root.min + new Vector3(newMinValue * 2, newMinValue * 2, newMinValue * 2), MinSize);

            numComponents    = 9;
            numVoxels        = 8;
            numNonNullVoxels = 1;
            volume           = root.volume();
            nonNullVolume    = root.volume() / 8f;
        }
        else
        {
            MetadataChange change = new MetadataChange();
            for (int i = 0; i < 8; i++)
            {
                change += root.children[i].Reformat(newMinValue);
            }
            updateMetadata(change);
        }
    }
예제 #21
0
        // Returns the top times, given the level's database path and map id.
        // Upload the replay data to Firebase Storage
        private static Task <StorageMetadata> UploadReplayData(
            UserScore userScore, ReplayData replay, UploadConfig config)
        {
            StorageReference storageRef =
                FirebaseStorage.DefaultInstance.GetReference(config.storagePath);

            // Serializing replay data to byte array
            System.IO.MemoryStream stream = new System.IO.MemoryStream();
            replay.Serialize(stream);
            stream.Position = 0;
            byte[] serializedData = stream.ToArray();

            // Add database path and time to metadata for future usage
            MetadataChange newMetadata = new MetadataChange {
                CustomMetadata = new Dictionary <string, string> {
                    { "DatabaseReplayPath", config.dbSharedReplayPath },
                    { "DatabaseRankPath", config.dbRankPath },
                    { "Time", userScore.Score.ToString() },
                    { "Shared", config.shareReplay.ToString() },
                }
            };

            return(storageRef.PutBytesAsync(serializedData, newMetadata));
        }
예제 #22
0
        public MainPageViewModel(INavigationService navigationService)
            : base(navigationService)
        {
            Title = "Main Page";

            SelectImageCommand.Subscribe(async() =>
            {
                try
                {
                    if (!CrossMedia.Current.IsPickPhotoSupported)
                    {
                        return;
                    }

                    var file = await CrossMedia.Current.PickPhotoAsync(new Media.Abstractions.PickMediaOptions
                    {
                        PhotoSize = Media.Abstractions.PhotoSize.Medium
                    });

                    if (file == null)
                    {
                        return;
                    }

                    var name   = Path.GetFileName(file.Path);
                    var stream = file.GetStream();

                    file.Dispose();

                    Image.Value            = null;
                    UploadProgress.Value   = 0;
                    DownloadProgress.Value = 0;
                    Name.Value             = null;
                    Size.Value             = 0;
                    CreationTime.Value     = null;
                    Url.Value = null;

                    var reference = CrossFirebaseStorage.Current.Instance.RootReference.Child(name);

                    var uploadProgress              = new Progress <IUploadState>();
                    uploadProgress.ProgressChanged += (sender, e) =>
                    {
                        UploadProgress.Value = e.TotalByteCount > 0 ? 100.0 * e.BytesTransferred / e.TotalByteCount : 0;
                    };

                    var metadataChange = new MetadataChange
                    {
                        ContentType = "image/jpeg"
                    };

                    await reference.PutStreamAsync(stream, metadataChange, uploadProgress);
                    UploadProgress.Value = 100;

                    var downloadProgress              = new Progress <IDownloadState>();
                    downloadProgress.ProgressChanged += (sender, e) =>
                    {
                        DownloadProgress.Value = e.TotalByteCount > 0 ? 100.0 * e.BytesTransferred / e.TotalByteCount : 0;
                    };

                    var data = await reference.GetStreamAsync(downloadProgress);
                    DownloadProgress.Value = 100;

                    Image.Value = ImageSource.FromStream(() => data);

                    var metadata = await reference.GetMetadataAsync();

                    Name.Value         = metadata.Name;
                    Size.Value         = metadata.SizeBytes;
                    CreationTime.Value = metadata.CreationTime.LocalDateTime;

                    var url   = await reference.GetDownloadUrlAsync();
                    Url.Value = url.ToString();
                }
                catch (Exception e)
                {
                    System.Diagnostics.Debug.WriteLine(e);
                }
            });
        }