# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# Mobius Forensic Toolkit
# Copyright (C) 2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023 Eduardo Aguiar
#
# 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 2, 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 <http://www.gnu.org/licenses/>.
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
import pymobius.app.skype
import pymobius.app.utorrent

ATTR_NAME = 'data.files_sent'

# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# @brief Model class
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
class model (object):

  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  # @brief Initialize object
  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  def __init__ (self, item):
    self.__item = item

    if item.has_attribute (ATTR_NAME):
      self.__entries = item.get_attribute (ATTR_NAME)
      self.__entries_loaded = True

    else:
      self.__entries = []
      self.__entries_loaded = False

  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  # @brief Get data from model
  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  def get (self):
    if not self.__entries_loaded:
      self.__retrieve_entries ()
      self.__entries_loaded = True
      self.__item.set_attribute (ATTR_NAME, self.__entries)

    return self.__entries

  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  # @brief Get data from model
  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  def refresh (self):
    self.__item.remove_attribute (ATTR_NAME)
    self.__entries = []
    self.__entries_loaded = False

  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  # @brief Retrieve data
  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  def __retrieve_entries (self):
    self.__retrieve_skype ()
    #self.__retrieve_utorrent ()   # p2p sent files model is quite different...

  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  # @brief Retrieve data from Skype
  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  def __retrieve_skype (self):
    DOWNLOAD_STATE = { 0 : 'Not initiated', 7 : 'Cancelled', 8 : 'Completed', 9 : 'Error' }
    model = pymobius.app.skype.model (self.__item)

    for profile in model.get_profiles ():
      for ft in profile.get_file_transfers ():
        if ft.type == 2:
          entry = pymobius.Data ()
          entry.username = profile.username
          entry.start_time = ft.start_time
          entry.end_time = ft.finish_time
          entry.filename = ft.filename
          entry.path = ft.path
          entry.app_id = 'skype'
          entry.app_name = 'Skype'
          entry.item = self.__item.name

          entry.metadata = []
          entry.metadata.append (('Size', ft.size))
          entry.metadata.append (('Bytes received', ft.bytes_transferred))
          entry.metadata.append (('Transfer state', DOWNLOAD_STATE.get (ft.status, 'Unknown (%d)' % ft.status)))

          sender = ft.from_skype_account
          if ft.from_skype_name:
            sender += ' (%s)' % ft.from_skype_name

          receiver = ft.to_skype_account
          if ft.to_skype_name:
            receiver += ' (%s)' % ft.to_skype_name

          entry.metadata.append (('Sender account', sender))
          entry.metadata.append (('Receiver account', receiver))

          self.__entries.append (entry)

  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  # @brief Retrieve data from uTorrent
  # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  def __retrieve_utorrent (self):
    model = pymobius.app.utorrent.model (self.__item)

    for profile in model.get_profiles ():
      for f in profile.get_uploaded_files ():
        entry = pymobius.Data ()
        entry.username = profile.username
        entry.start_time = None
        entry.end_time = None
        entry.filename = f.name
        entry.path = f.path
        entry.app_id = f.app_id
        entry.app_name = f.app_name
        entry.item = self.__item.name

        entry.metadata = []
        entry.metadata.append (('Size', f.size))
        entry.metadata.append (('Caption', f.caption))
        entry.metadata.append (('Resume.dat path', f.resume_dat_path))
        entry.metadata.append (('Torrent path', f.torrent_path))

        self.__entries.append (entry)
