Module src.communicator.uploadqueue

Onionr - Private P2P Communication.

Class to remember blocks that need to be uploaded and not shared on startup/shutdown

Expand source code
"""Onionr - Private P2P Communication.

Class to remember blocks that need to be uploaded
and not shared on startup/shutdown
"""
import atexit
import os
from typing import TYPE_CHECKING

import deadsimplekv

import filepaths
from onionrutils import localcommand
if TYPE_CHECKING:
    from communicator import OnionrCommunicatorDaemon
"""
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
"""

UPLOAD_MEMORY_FILE = filepaths.upload_list


def _add_to_hidden_blocks(cache):
    for bl in cache:
        localcommand.local_command('waitforshare/' + bl, post=True)


class UploadQueue:
    """Saves and loads block upload info from json file."""

    def __init__(self, communicator: 'OnionrCommunicatorDaemon'):
        """Start the UploadQueue object, loading left over uploads into queue.

        register save shutdown function
        """
        self.communicator = communicator
        cache: deadsimplekv.DeadSimpleKV = deadsimplekv.DeadSimpleKV(
            UPLOAD_MEMORY_FILE)
        self.store_obj = cache
        cache = cache.get('uploads')
        if cache is None:
            cache = []

        _add_to_hidden_blocks(cache)
        self.communicator.blocksToUpload.extend(cache)

        atexit.register(self.save)

    def save(self):
        """Save to disk on shutdown or if called manually."""
        bl: deadsimplekv.DeadSimpleKV = self.communicator.blocksToUpload
        if len(bl) == 0:
            try:
                os.remove(UPLOAD_MEMORY_FILE)
            except FileNotFoundError:
                pass
        else:
            self.store_obj.put('uploads', bl)
            self.store_obj.flush()

Classes

class UploadQueue (communicator)

Saves and loads block upload info from json file.

Start the UploadQueue object, loading left over uploads into queue.

register save shutdown function

Expand source code
class UploadQueue:
    """Saves and loads block upload info from json file."""

    def __init__(self, communicator: 'OnionrCommunicatorDaemon'):
        """Start the UploadQueue object, loading left over uploads into queue.

        register save shutdown function
        """
        self.communicator = communicator
        cache: deadsimplekv.DeadSimpleKV = deadsimplekv.DeadSimpleKV(
            UPLOAD_MEMORY_FILE)
        self.store_obj = cache
        cache = cache.get('uploads')
        if cache is None:
            cache = []

        _add_to_hidden_blocks(cache)
        self.communicator.blocksToUpload.extend(cache)

        atexit.register(self.save)

    def save(self):
        """Save to disk on shutdown or if called manually."""
        bl: deadsimplekv.DeadSimpleKV = self.communicator.blocksToUpload
        if len(bl) == 0:
            try:
                os.remove(UPLOAD_MEMORY_FILE)
            except FileNotFoundError:
                pass
        else:
            self.store_obj.put('uploads', bl)
            self.store_obj.flush()

Methods

def save(self)

Save to disk on shutdown or if called manually.

Expand source code
def save(self):
    """Save to disk on shutdown or if called manually."""
    bl: deadsimplekv.DeadSimpleKV = self.communicator.blocksToUpload
    if len(bl) == 0:
        try:
            os.remove(UPLOAD_MEMORY_FILE)
        except FileNotFoundError:
            pass
    else:
        self.store_obj.put('uploads', bl)
        self.store_obj.flush()