Moved some more functions into MUtilities libraries.
This commit is contained in:
parent
07fdd97f97
commit
24e2b93d68
518
src/3rd_party/blake2.c
vendored
518
src/3rd_party/blake2.c
vendored
@ -1,518 +0,0 @@
|
|||||||
/*
|
|
||||||
BLAKE2 reference source code package - reference C implementations
|
|
||||||
|
|
||||||
Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
|
|
||||||
|
|
||||||
To the extent possible under law, the author(s) have dedicated all copyright
|
|
||||||
and related and neighboring rights to this software to the public domain
|
|
||||||
worldwide. This software is distributed without any warranty.
|
|
||||||
|
|
||||||
You should have received a copy of the CC0 Public Domain Dedication along with
|
|
||||||
this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "blake2.h"
|
|
||||||
|
|
||||||
/*------------------------------------*/
|
|
||||||
/* blake2-impl.h */
|
|
||||||
/*------------------------------------*/
|
|
||||||
|
|
||||||
static inline uint32_t load32( const void *src )
|
|
||||||
{
|
|
||||||
#if defined(NATIVE_LITTLE_ENDIAN)
|
|
||||||
return *( uint32_t * )( src );
|
|
||||||
#else
|
|
||||||
const uint8_t *p = ( uint8_t * )src;
|
|
||||||
uint32_t w = *p++;
|
|
||||||
w |= ( uint32_t )( *p++ ) << 8;
|
|
||||||
w |= ( uint32_t )( *p++ ) << 16;
|
|
||||||
w |= ( uint32_t )( *p++ ) << 24;
|
|
||||||
return w;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint64_t load64( const void *src )
|
|
||||||
{
|
|
||||||
#if defined(NATIVE_LITTLE_ENDIAN)
|
|
||||||
return *( uint64_t * )( src );
|
|
||||||
#else
|
|
||||||
const uint8_t *p = ( uint8_t * )src;
|
|
||||||
uint64_t w = *p++;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 8;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 16;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 24;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 32;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 40;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 48;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 56;
|
|
||||||
return w;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void store32( void *dst, uint32_t w )
|
|
||||||
{
|
|
||||||
#if defined(NATIVE_LITTLE_ENDIAN)
|
|
||||||
*( uint32_t * )( dst ) = w;
|
|
||||||
#else
|
|
||||||
uint8_t *p = ( uint8_t * )dst;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void store64( void *dst, uint64_t w )
|
|
||||||
{
|
|
||||||
#if defined(NATIVE_LITTLE_ENDIAN)
|
|
||||||
*( uint64_t * )( dst ) = w;
|
|
||||||
#else
|
|
||||||
uint8_t *p = ( uint8_t * )dst;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint64_t load48( const void *src )
|
|
||||||
{
|
|
||||||
const uint8_t *p = ( const uint8_t * )src;
|
|
||||||
uint64_t w = *p++;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 8;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 16;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 24;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 32;
|
|
||||||
w |= ( uint64_t )( *p++ ) << 40;
|
|
||||||
return w;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void store48( void *dst, uint64_t w )
|
|
||||||
{
|
|
||||||
uint8_t *p = ( uint8_t * )dst;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w; w >>= 8;
|
|
||||||
*p++ = ( uint8_t )w;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t rotl32( const uint32_t w, const unsigned c )
|
|
||||||
{
|
|
||||||
return ( w << c ) | ( w >> ( 32 - c ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint64_t rotl64( const uint64_t w, const unsigned c )
|
|
||||||
{
|
|
||||||
return ( w << c ) | ( w >> ( 64 - c ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint32_t rotr32( const uint32_t w, const unsigned c )
|
|
||||||
{
|
|
||||||
return ( w >> c ) | ( w << ( 32 - c ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline uint64_t rotr64( const uint64_t w, const unsigned c )
|
|
||||||
{
|
|
||||||
return ( w >> c ) | ( w << ( 64 - c ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* prevents compiler optimizing out memset() */
|
|
||||||
static inline void secure_zero_memory( void *v, size_t n )
|
|
||||||
{
|
|
||||||
volatile uint8_t *p = ( volatile uint8_t * )v;
|
|
||||||
|
|
||||||
while( n-- ) *p++ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*------------------------------------*/
|
|
||||||
/* blake2b-ref.c */
|
|
||||||
/*------------------------------------*/
|
|
||||||
|
|
||||||
static const uint64_t blake2b_IV[8] =
|
|
||||||
{
|
|
||||||
0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
|
|
||||||
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
|
|
||||||
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
|
|
||||||
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const uint8_t blake2b_sigma[12][16] =
|
|
||||||
{
|
|
||||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ,
|
|
||||||
{ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } ,
|
|
||||||
{ 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } ,
|
|
||||||
{ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } ,
|
|
||||||
{ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } ,
|
|
||||||
{ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } ,
|
|
||||||
{ 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } ,
|
|
||||||
{ 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } ,
|
|
||||||
{ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } ,
|
|
||||||
{ 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } ,
|
|
||||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ,
|
|
||||||
{ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static inline int blake2b_set_lastnode( blake2b_state *S )
|
|
||||||
{
|
|
||||||
S->f[1] = ~0ULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_clear_lastnode( blake2b_state *S )
|
|
||||||
{
|
|
||||||
S->f[1] = 0ULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Some helper functions, not necessarily useful */
|
|
||||||
static inline int blake2b_set_lastblock( blake2b_state *S )
|
|
||||||
{
|
|
||||||
if( S->last_node ) blake2b_set_lastnode( S );
|
|
||||||
|
|
||||||
S->f[0] = ~0ULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_clear_lastblock( blake2b_state *S )
|
|
||||||
{
|
|
||||||
if( S->last_node ) blake2b_clear_lastnode( S );
|
|
||||||
|
|
||||||
S->f[0] = 0ULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_increment_counter( blake2b_state *S, const uint64_t inc )
|
|
||||||
{
|
|
||||||
S->t[0] += inc;
|
|
||||||
S->t[1] += ( S->t[0] < inc );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Parameter-related functions
|
|
||||||
static inline int blake2b_param_set_digest_length( blake2b_param *P, const uint8_t digest_length )
|
|
||||||
{
|
|
||||||
P->digest_length = digest_length;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_fanout( blake2b_param *P, const uint8_t fanout )
|
|
||||||
{
|
|
||||||
P->fanout = fanout;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_max_depth( blake2b_param *P, const uint8_t depth )
|
|
||||||
{
|
|
||||||
P->depth = depth;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_leaf_length( blake2b_param *P, const uint32_t leaf_length )
|
|
||||||
{
|
|
||||||
store32( &P->leaf_length, leaf_length );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_node_offset( blake2b_param *P, const uint64_t node_offset )
|
|
||||||
{
|
|
||||||
store64( &P->node_offset, node_offset );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_node_depth( blake2b_param *P, const uint8_t node_depth )
|
|
||||||
{
|
|
||||||
P->node_depth = node_depth;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_inner_length( blake2b_param *P, const uint8_t inner_length )
|
|
||||||
{
|
|
||||||
P->inner_length = inner_length;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_salt( blake2b_param *P, const uint8_t salt[BLAKE2B_SALTBYTES] )
|
|
||||||
{
|
|
||||||
memcpy( P->salt, salt, BLAKE2B_SALTBYTES );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_param_set_personal( blake2b_param *P, const uint8_t personal[BLAKE2B_PERSONALBYTES] )
|
|
||||||
{
|
|
||||||
memcpy( P->personal, personal, BLAKE2B_PERSONALBYTES );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int blake2b_init0( blake2b_state *S )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
memset( S, 0, sizeof( blake2b_state ) );
|
|
||||||
|
|
||||||
for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i];
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* init xors IV with input parameter block */
|
|
||||||
int blake2b_init_param( blake2b_state *S, const blake2b_param *P )
|
|
||||||
{
|
|
||||||
uint8_t *p;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
blake2b_init0( S );
|
|
||||||
p = ( uint8_t * )( P );
|
|
||||||
|
|
||||||
/* IV XOR ParamBlock */
|
|
||||||
for( i = 0; i < 8; ++i )
|
|
||||||
S->h[i] ^= load64( p + sizeof( S->h[i] ) * i );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int blake2b_init( blake2b_state *S, const uint8_t outlen )
|
|
||||||
{
|
|
||||||
blake2b_param P[1];
|
|
||||||
|
|
||||||
if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1;
|
|
||||||
|
|
||||||
P->digest_length = outlen;
|
|
||||||
P->key_length = 0;
|
|
||||||
P->fanout = 1;
|
|
||||||
P->depth = 1;
|
|
||||||
store32( &P->leaf_length, 0 );
|
|
||||||
store64( &P->node_offset, 0 );
|
|
||||||
P->node_depth = 0;
|
|
||||||
P->inner_length = 0;
|
|
||||||
memset( P->reserved, 0, sizeof( P->reserved ) );
|
|
||||||
memset( P->salt, 0, sizeof( P->salt ) );
|
|
||||||
memset( P->personal, 0, sizeof( P->personal ) );
|
|
||||||
return blake2b_init_param( S, P );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen )
|
|
||||||
{
|
|
||||||
blake2b_param P[1];
|
|
||||||
|
|
||||||
if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1;
|
|
||||||
|
|
||||||
if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1;
|
|
||||||
|
|
||||||
P->digest_length = outlen;
|
|
||||||
P->key_length = keylen;
|
|
||||||
P->fanout = 1;
|
|
||||||
P->depth = 1;
|
|
||||||
store32( &P->leaf_length, 0 );
|
|
||||||
store64( &P->node_offset, 0 );
|
|
||||||
P->node_depth = 0;
|
|
||||||
P->inner_length = 0;
|
|
||||||
memset( P->reserved, 0, sizeof( P->reserved ) );
|
|
||||||
memset( P->salt, 0, sizeof( P->salt ) );
|
|
||||||
memset( P->personal, 0, sizeof( P->personal ) );
|
|
||||||
|
|
||||||
if( blake2b_init_param( S, P ) < 0 ) return -1;
|
|
||||||
|
|
||||||
{
|
|
||||||
uint8_t block[BLAKE2B_BLOCKBYTES];
|
|
||||||
memset( block, 0, BLAKE2B_BLOCKBYTES );
|
|
||||||
memcpy( block, key, keylen );
|
|
||||||
blake2b_update( S, block, BLAKE2B_BLOCKBYTES );
|
|
||||||
secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )
|
|
||||||
{
|
|
||||||
uint64_t m[16];
|
|
||||||
uint64_t v[16];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for( i = 0; i < 16; ++i )
|
|
||||||
m[i] = load64( block + i * sizeof( m[i] ) );
|
|
||||||
|
|
||||||
for( i = 0; i < 8; ++i )
|
|
||||||
v[i] = S->h[i];
|
|
||||||
|
|
||||||
v[ 8] = blake2b_IV[0];
|
|
||||||
v[ 9] = blake2b_IV[1];
|
|
||||||
v[10] = blake2b_IV[2];
|
|
||||||
v[11] = blake2b_IV[3];
|
|
||||||
v[12] = S->t[0] ^ blake2b_IV[4];
|
|
||||||
v[13] = S->t[1] ^ blake2b_IV[5];
|
|
||||||
v[14] = S->f[0] ^ blake2b_IV[6];
|
|
||||||
v[15] = S->f[1] ^ blake2b_IV[7];
|
|
||||||
#define G(r,i,a,b,c,d) \
|
|
||||||
do { \
|
|
||||||
a = a + b + m[blake2b_sigma[r][2*i+0]]; \
|
|
||||||
d = rotr64(d ^ a, 32); \
|
|
||||||
c = c + d; \
|
|
||||||
b = rotr64(b ^ c, 24); \
|
|
||||||
a = a + b + m[blake2b_sigma[r][2*i+1]]; \
|
|
||||||
d = rotr64(d ^ a, 16); \
|
|
||||||
c = c + d; \
|
|
||||||
b = rotr64(b ^ c, 63); \
|
|
||||||
} while(0)
|
|
||||||
#define ROUND(r) \
|
|
||||||
do { \
|
|
||||||
G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \
|
|
||||||
G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \
|
|
||||||
G(r,2,v[ 2],v[ 6],v[10],v[14]); \
|
|
||||||
G(r,3,v[ 3],v[ 7],v[11],v[15]); \
|
|
||||||
G(r,4,v[ 0],v[ 5],v[10],v[15]); \
|
|
||||||
G(r,5,v[ 1],v[ 6],v[11],v[12]); \
|
|
||||||
G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \
|
|
||||||
G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
|
|
||||||
} while(0)
|
|
||||||
ROUND( 0 );
|
|
||||||
ROUND( 1 );
|
|
||||||
ROUND( 2 );
|
|
||||||
ROUND( 3 );
|
|
||||||
ROUND( 4 );
|
|
||||||
ROUND( 5 );
|
|
||||||
ROUND( 6 );
|
|
||||||
ROUND( 7 );
|
|
||||||
ROUND( 8 );
|
|
||||||
ROUND( 9 );
|
|
||||||
ROUND( 10 );
|
|
||||||
ROUND( 11 );
|
|
||||||
|
|
||||||
for( i = 0; i < 8; ++i )
|
|
||||||
S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];
|
|
||||||
|
|
||||||
#undef G
|
|
||||||
#undef ROUND
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* inlen now in bytes */
|
|
||||||
int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen )
|
|
||||||
{
|
|
||||||
while( inlen > 0 )
|
|
||||||
{
|
|
||||||
size_t left = S->buflen;
|
|
||||||
size_t fill = 2 * BLAKE2B_BLOCKBYTES - left;
|
|
||||||
|
|
||||||
if( inlen > fill )
|
|
||||||
{
|
|
||||||
memcpy( S->buf + left, in, fill ); // Fill buffer
|
|
||||||
S->buflen += fill;
|
|
||||||
blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );
|
|
||||||
blake2b_compress( S, S->buf ); // Compress
|
|
||||||
memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); // Shift buffer left
|
|
||||||
S->buflen -= BLAKE2B_BLOCKBYTES;
|
|
||||||
in += fill;
|
|
||||||
inlen -= fill;
|
|
||||||
}
|
|
||||||
else // inlen <= fill
|
|
||||||
{
|
|
||||||
memcpy( S->buf + left, in, (size_t) inlen );
|
|
||||||
S->buflen = (size_t)(S->buflen + inlen); // Be lazy, do not compress
|
|
||||||
in += inlen;
|
|
||||||
inlen -= inlen;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is this correct? */
|
|
||||||
int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen )
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
uint8_t buffer[BLAKE2B_OUTBYTES];
|
|
||||||
|
|
||||||
if( S->buflen > BLAKE2B_BLOCKBYTES )
|
|
||||||
{
|
|
||||||
blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );
|
|
||||||
blake2b_compress( S, S->buf );
|
|
||||||
S->buflen -= BLAKE2B_BLOCKBYTES;
|
|
||||||
memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, S->buflen );
|
|
||||||
}
|
|
||||||
|
|
||||||
blake2b_increment_counter( S, S->buflen );
|
|
||||||
blake2b_set_lastblock( S );
|
|
||||||
memset( S->buf + S->buflen, 0, 2 * BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */
|
|
||||||
blake2b_compress( S, S->buf );
|
|
||||||
|
|
||||||
for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */
|
|
||||||
store64( buffer + sizeof( S->h[i] ) * i, S->h[i] );
|
|
||||||
|
|
||||||
memcpy( out, buffer, outlen );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* inlen, at least, should be uint64_t. Others can be size_t. */
|
|
||||||
int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen )
|
|
||||||
{
|
|
||||||
blake2b_state S[1];
|
|
||||||
|
|
||||||
/* Verify parameters */
|
|
||||||
if ( NULL == in ) return -1;
|
|
||||||
|
|
||||||
if ( NULL == out ) return -1;
|
|
||||||
|
|
||||||
if( NULL == key ) keylen = 0;
|
|
||||||
|
|
||||||
if( keylen > 0 )
|
|
||||||
{
|
|
||||||
if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( blake2b_init( S, outlen ) < 0 ) return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
blake2b_update( S, ( uint8_t * )in, inlen );
|
|
||||||
blake2b_final( S, out, outlen );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(BLAKE2B_SELFTEST)
|
|
||||||
#include <string.h>
|
|
||||||
#include "blake2-kat.h"
|
|
||||||
int main( int argc, char **argv )
|
|
||||||
{
|
|
||||||
uint8_t key[BLAKE2B_KEYBYTES];
|
|
||||||
uint8_t buf[KAT_LENGTH];
|
|
||||||
|
|
||||||
for( size_t i = 0; i < BLAKE2B_KEYBYTES; ++i )
|
|
||||||
key[i] = ( uint8_t )i;
|
|
||||||
|
|
||||||
for( size_t i = 0; i < KAT_LENGTH; ++i )
|
|
||||||
buf[i] = ( uint8_t )i;
|
|
||||||
|
|
||||||
for( size_t i = 0; i < KAT_LENGTH; ++i )
|
|
||||||
{
|
|
||||||
uint8_t hash[BLAKE2B_OUTBYTES];
|
|
||||||
blake2b( hash, buf, key, BLAKE2B_OUTBYTES, i, BLAKE2B_KEYBYTES );
|
|
||||||
|
|
||||||
if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) )
|
|
||||||
{
|
|
||||||
puts( "error" );
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
puts( "ok" );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
89
src/3rd_party/blake2.h
vendored
89
src/3rd_party/blake2.h
vendored
@ -1,89 +0,0 @@
|
|||||||
/*
|
|
||||||
BLAKE2 reference source code package - reference C implementations
|
|
||||||
|
|
||||||
Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
|
|
||||||
|
|
||||||
To the extent possible under law, the author(s) have dedicated all copyright
|
|
||||||
and related and neighboring rights to this software to the public domain
|
|
||||||
worldwide. This software is distributed without any warranty.
|
|
||||||
|
|
||||||
You should have received a copy of the CC0 Public Domain Dedication along with
|
|
||||||
this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
#ifndef __BLAKE2_H__
|
|
||||||
#define __BLAKE2_H__
|
|
||||||
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define ALIGN(x) __declspec(align(x))
|
|
||||||
#ifndef __cplusplus
|
|
||||||
#define inline __inline
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define ALIGN(x) __attribute__((aligned(x)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum blake2b_constant
|
|
||||||
{
|
|
||||||
BLAKE2B_BLOCKBYTES = 128,
|
|
||||||
BLAKE2B_OUTBYTES = 64,
|
|
||||||
BLAKE2B_KEYBYTES = 64,
|
|
||||||
BLAKE2B_SALTBYTES = 16,
|
|
||||||
BLAKE2B_PERSONALBYTES = 16
|
|
||||||
};
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
|
||||||
typedef struct __blake2b_param
|
|
||||||
{
|
|
||||||
uint8_t digest_length; // 1
|
|
||||||
uint8_t key_length; // 2
|
|
||||||
uint8_t fanout; // 3
|
|
||||||
uint8_t depth; // 4
|
|
||||||
uint32_t leaf_length; // 8
|
|
||||||
uint64_t node_offset; // 16
|
|
||||||
uint8_t node_depth; // 17
|
|
||||||
uint8_t inner_length; // 18
|
|
||||||
uint8_t reserved[14]; // 32
|
|
||||||
uint8_t salt[BLAKE2B_SALTBYTES]; // 48
|
|
||||||
uint8_t personal[BLAKE2B_PERSONALBYTES]; // 64
|
|
||||||
} blake2b_param;
|
|
||||||
|
|
||||||
ALIGN( 64 ) typedef struct __blake2b_state
|
|
||||||
{
|
|
||||||
uint64_t h[8];
|
|
||||||
uint64_t t[2];
|
|
||||||
uint64_t f[2];
|
|
||||||
uint8_t buf[2 * BLAKE2B_BLOCKBYTES];
|
|
||||||
size_t buflen;
|
|
||||||
uint8_t last_node;
|
|
||||||
} blake2b_state;
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
// Streaming API
|
|
||||||
int blake2b_init( blake2b_state *S, const uint8_t outlen );
|
|
||||||
int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen );
|
|
||||||
int blake2b_init_param( blake2b_state *S, const blake2b_param *P );
|
|
||||||
int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen );
|
|
||||||
int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen );
|
|
||||||
|
|
||||||
// Simple API
|
|
||||||
int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen );
|
|
||||||
|
|
||||||
static inline int blake2( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen )
|
|
||||||
{
|
|
||||||
return blake2b( out, in, key, outlen, inlen, keylen );
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
141
src/checksum.cpp
141
src/checksum.cpp
@ -1,141 +0,0 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Simple x264 Launcher
|
|
||||||
// Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
|
|
||||||
//
|
|
||||||
// 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 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, write to the Free Software Foundation, Inc.,
|
|
||||||
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
//
|
|
||||||
// http://www.gnu.org/licenses/gpl-2.0.txt
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/*
|
|
||||||
BLAKE2 reference source code package - reference C implementations
|
|
||||||
|
|
||||||
Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
|
|
||||||
|
|
||||||
To the extent possible under law, the author(s) have dedicated all copyright
|
|
||||||
and related and neighboring rights to this software to the public domain
|
|
||||||
worldwide. This software is distributed without any warranty.
|
|
||||||
|
|
||||||
You should have received a copy of the CC0 Public Domain Dedication along with
|
|
||||||
this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "checksum.h"
|
|
||||||
|
|
||||||
#include "global.h"
|
|
||||||
#include "3rd_party/blake2.h"
|
|
||||||
|
|
||||||
#include <malloc.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
static const size_t HASH_SIZE = 64;
|
|
||||||
|
|
||||||
class QBlake2ChecksumContext
|
|
||||||
{
|
|
||||||
friend QBlake2Checksum;
|
|
||||||
|
|
||||||
QBlake2ChecksumContext(void)
|
|
||||||
{
|
|
||||||
if(!(state = (blake2b_state*) _aligned_malloc(sizeof(blake2b_state), 64)))
|
|
||||||
{
|
|
||||||
THROW("Aligend malloc has failed!");
|
|
||||||
}
|
|
||||||
memset(state, 0, sizeof(blake2b_state));
|
|
||||||
}
|
|
||||||
|
|
||||||
~QBlake2ChecksumContext(void)
|
|
||||||
{
|
|
||||||
memset(state, 0, sizeof(blake2b_state));
|
|
||||||
_aligned_free(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
blake2b_state *state;
|
|
||||||
};
|
|
||||||
|
|
||||||
QBlake2Checksum::QBlake2Checksum(const char* key)
|
|
||||||
:
|
|
||||||
m_hash(HASH_SIZE, '\0'),
|
|
||||||
m_context(new QBlake2ChecksumContext()),
|
|
||||||
m_finalized(false)
|
|
||||||
{
|
|
||||||
if(key && key[0])
|
|
||||||
{
|
|
||||||
blake2b_init_key(m_context->state, HASH_SIZE, key, strlen(key));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
blake2b_init(m_context->state, HASH_SIZE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QBlake2Checksum::~QBlake2Checksum(void)
|
|
||||||
{
|
|
||||||
delete m_context;
|
|
||||||
}
|
|
||||||
|
|
||||||
void QBlake2Checksum::update(const QByteArray &data)
|
|
||||||
{
|
|
||||||
if(m_finalized)
|
|
||||||
{
|
|
||||||
THROW("BLAKE2 was already finalized!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(data.size() > 0)
|
|
||||||
{
|
|
||||||
if(blake2b_update(m_context->state, (const uint8_t*) data.constData(), data.size()) != 0)
|
|
||||||
{
|
|
||||||
THROW("BLAKE2 internal error!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void QBlake2Checksum::update(QFile &file)
|
|
||||||
{
|
|
||||||
bool okay = false;
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
QByteArray data = file.read(16384);
|
|
||||||
if(data.size() > 0)
|
|
||||||
{
|
|
||||||
okay = true;
|
|
||||||
update(data);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!okay)
|
|
||||||
{
|
|
||||||
qWarning("[QBlake2Checksum] Could not ready any data from file!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray QBlake2Checksum::finalize(const bool bAsHex)
|
|
||||||
{
|
|
||||||
if(!m_finalized)
|
|
||||||
{
|
|
||||||
if(blake2b_final(m_context->state, (uint8_t*) m_hash.data(), m_hash.size()) != 0)
|
|
||||||
{
|
|
||||||
THROW("BLAKE2 internal error!");
|
|
||||||
}
|
|
||||||
|
|
||||||
m_finalized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return bAsHex ? m_hash.toHex() : m_hash;
|
|
||||||
}
|
|
20
src/ipc.h
20
src/ipc.h
@ -21,22 +21,12 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QThread>
|
|
||||||
#include <QMutex>
|
|
||||||
|
|
||||||
class QSharedMemory;
|
|
||||||
class QStringList;
|
|
||||||
class QSystemSemaphore;
|
|
||||||
|
|
||||||
class IPCCore;
|
|
||||||
class IPCReceiveThread;
|
|
||||||
class IPCSendThread;
|
|
||||||
|
|
||||||
//IPC Commands
|
//IPC Commands
|
||||||
static const quint32 IPC_OPCODE_PING = 0;
|
static const quint32 IPC_OPCODE_NOOP = 0;
|
||||||
static const quint32 IPC_OPCODE_ADD_FILE = 1;
|
static const quint32 IPC_OPCODE_PING = 1;
|
||||||
static const quint32 IPC_OPCODE_ADD_JOB = 2;
|
static const quint32 IPC_OPCODE_ADD_FILE = 2;
|
||||||
static const quint32 IPC_OPCODE_MAX = 3;
|
static const quint32 IPC_OPCODE_ADD_JOB = 3;
|
||||||
|
static const quint32 IPC_OPCODE_MAX = 4;
|
||||||
|
|
||||||
//IPC Flags
|
//IPC Flags
|
||||||
static const quint32 IPC_FLAG_FORCE_START = 0x00000001;
|
static const quint32 IPC_FLAG_FORCE_START = 0x00000001;
|
||||||
|
@ -178,7 +178,7 @@ static int simple_x264_main(int &argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Create Main Window
|
//Create Main Window
|
||||||
QScopedPointer<MainWindow> mainWindow(new MainWindow(cpuFeatures));
|
QScopedPointer<MainWindow> mainWindow(new MainWindow(cpuFeatures, ipcChannel.data()));
|
||||||
mainWindow->show();
|
mainWindow->show();
|
||||||
|
|
||||||
//Run application
|
//Run application
|
||||||
|
103
src/thread_ipc_recv.cpp
Normal file
103
src/thread_ipc_recv.cpp
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Simple x264 Launcher
|
||||||
|
// Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
|
||||||
|
//
|
||||||
|
// 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 of the License, or
|
||||||
|
// (at your option) any later version, but always including the *additional*
|
||||||
|
// restrictions defined in the "License.txt" file.
|
||||||
|
//
|
||||||
|
// 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, write to the Free Software Foundation, Inc.,
|
||||||
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// http://www.gnu.org/licenses/gpl-2.0.txt
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "thread_ipc_recv.h"
|
||||||
|
|
||||||
|
//Internal
|
||||||
|
#include "Global.h"
|
||||||
|
#include "cli.h"
|
||||||
|
#include "ipc.h"
|
||||||
|
|
||||||
|
//MUtils
|
||||||
|
#include <MUtils/Global.h>
|
||||||
|
#include <MUtils/IPCChannel.h>
|
||||||
|
#include <MUtils/OSSupport.h>
|
||||||
|
|
||||||
|
//Qt
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
|
//CRT
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Constructor & Destructor
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
IPCThread_Recv::IPCThread_Recv(MUtils::IPCChannel *const ipcChannel)
|
||||||
|
:
|
||||||
|
m_ipcChannel(ipcChannel)
|
||||||
|
{
|
||||||
|
m_stopFlag = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPCThread_Recv::~IPCThread_Recv(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Thread Main
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void IPCThread_Recv::run()
|
||||||
|
{
|
||||||
|
setTerminationEnabled(true);
|
||||||
|
QStringList params;
|
||||||
|
quint32 command, flags;
|
||||||
|
|
||||||
|
while(!m_stopFlag)
|
||||||
|
{
|
||||||
|
if(m_ipcChannel->read(command, flags, params))
|
||||||
|
{
|
||||||
|
if(command != IPC_OPCODE_NOOP)
|
||||||
|
{
|
||||||
|
emit receivedCommand(command, params, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qWarning("Failed to read next IPC message!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Public Methods
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void IPCThread_Recv::stop(void)
|
||||||
|
{
|
||||||
|
if(!m_stopFlag)
|
||||||
|
{
|
||||||
|
m_stopFlag = true;
|
||||||
|
m_ipcChannel->send(0, 0, QStringList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// EVENTS
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
/*NONE*/
|
@ -5,7 +5,8 @@
|
|||||||
// This program is free software; you can redistribute it and/or modify
|
// 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
|
// it under the terms of the GNU General Public License as published by
|
||||||
// the Free Software Foundation; either version 2 of the License, or
|
// the Free Software Foundation; either version 2 of the License, or
|
||||||
// (at your option) any later version.
|
// (at your option) any later version, but always including the *additional*
|
||||||
|
// restrictions defined in the "License.txt" file.
|
||||||
//
|
//
|
||||||
// This program is distributed in the hope that it will be useful,
|
// This program is distributed in the hope that it will be useful,
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
@ -19,38 +20,31 @@
|
|||||||
// http://www.gnu.org/licenses/gpl-2.0.txt
|
// http://www.gnu.org/licenses/gpl-2.0.txt
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
/*
|
|
||||||
BLAKE2 reference source code package - reference C implementations
|
|
||||||
|
|
||||||
Written in 2012 by Samuel Neves <sneves@dei.uc.pt>
|
|
||||||
|
|
||||||
To the extent possible under law, the author(s) have dedicated all copyright
|
|
||||||
and related and neighboring rights to this software to the public domain
|
|
||||||
worldwide. This software is distributed without any warranty.
|
|
||||||
|
|
||||||
You should have received a copy of the CC0 Public Domain Dedication along with
|
|
||||||
this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QByteArray>
|
#include <QThread>
|
||||||
#include <QFile>
|
|
||||||
|
|
||||||
class QBlake2ChecksumContext;
|
namespace MUtils
|
||||||
|
|
||||||
class QBlake2Checksum
|
|
||||||
{
|
{
|
||||||
|
class IPCChannel;
|
||||||
|
}
|
||||||
|
|
||||||
|
class IPCThread_Recv: public QThread
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QBlake2Checksum(const char* key = NULL);
|
IPCThread_Recv(MUtils::IPCChannel *const ipcChannel);
|
||||||
~QBlake2Checksum(void);
|
~IPCThread_Recv(void);
|
||||||
|
|
||||||
void update(const QByteArray &data);
|
void stop(void);
|
||||||
void update(QFile &file);
|
|
||||||
QByteArray finalize(const bool bAsHex = true);
|
|
||||||
|
|
||||||
private:
|
signals:
|
||||||
QByteArray m_hash;
|
void receivedCommand(const int &command, const QStringList &args, const quint32 &flags);
|
||||||
QBlake2ChecksumContext *const m_context;
|
|
||||||
bool m_finalized;
|
protected:
|
||||||
|
volatile bool m_stopFlag;
|
||||||
|
MUtils::IPCChannel *const m_ipcChannel;
|
||||||
|
|
||||||
|
void run();
|
||||||
};
|
};
|
@ -1,755 +0,0 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Simple x264 Launcher
|
|
||||||
// Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
|
|
||||||
//
|
|
||||||
// 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 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, write to the Free Software Foundation, Inc.,
|
|
||||||
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
//
|
|
||||||
// http://www.gnu.org/licenses/gpl-2.0.txt
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#include "thread_updater.h"
|
|
||||||
|
|
||||||
#include "global.h"
|
|
||||||
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QProcess>
|
|
||||||
#include <QUrl>
|
|
||||||
#include <QEventLoop>
|
|
||||||
#include <QTimer>
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// CONSTANTS
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static const char *header_id = "!Update";
|
|
||||||
static const char *section_id = "Simple x264 Launcher";
|
|
||||||
|
|
||||||
static const char *mirror_url_postfix[] =
|
|
||||||
{
|
|
||||||
"update.ver",
|
|
||||||
"update_beta.ver",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *update_mirrors_prim[] =
|
|
||||||
{
|
|
||||||
"http://muldersoft.com/",
|
|
||||||
"http://mulder.bplaced.net/",
|
|
||||||
"http://mulder.cwsurf.de/",
|
|
||||||
"http://mulder.6te.net/",
|
|
||||||
"http://mulder.webuda.com/",
|
|
||||||
"http://mulder.byethost13.com/",
|
|
||||||
"http://muldersoft.kilu.de/",
|
|
||||||
"http://mulder.pe.hu/",
|
|
||||||
"http://muldersoft.zxq.net/",
|
|
||||||
"http://lamexp.sourceforge.net/",
|
|
||||||
"http://lordmulder.github.io/LameXP/",
|
|
||||||
"http://lord_mulder.bitbucket.org/",
|
|
||||||
"http://www.tricksoft.de/",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *update_mirrors_back[] =
|
|
||||||
{
|
|
||||||
"http://mplayer.savedonthe.net/",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *known_hosts[] = //Taken form: http://www.alexa.com/topsites !!!
|
|
||||||
{
|
|
||||||
"http://www.163.com/",
|
|
||||||
"http://www.7-zip.org/",
|
|
||||||
"http://www.ac3filter.net/",
|
|
||||||
"http://www.amazon.com/",
|
|
||||||
"http://antergos.com/",
|
|
||||||
"http://www.aol.com/",
|
|
||||||
"http://www.apache.org/",
|
|
||||||
"http://www.apple.com/",
|
|
||||||
"http://www.adobe.com/",
|
|
||||||
"http://www.avidemux.org/",
|
|
||||||
"http://www.babylon.com/",
|
|
||||||
"http://www.baidu.com/",
|
|
||||||
"http://bandcamp.com/",
|
|
||||||
"http://www.bbc.co.uk/",
|
|
||||||
"http://www.berlios.de/",
|
|
||||||
"http://www.bing.com/",
|
|
||||||
"http://www.bucketheadpikes.com/",
|
|
||||||
"http://www.ccc.de/",
|
|
||||||
"http://www.cnet.com/",
|
|
||||||
"http://cnzz.com/",
|
|
||||||
"http://www.codeplex.com/",
|
|
||||||
"http://www.ebay.com/",
|
|
||||||
"http://www.equation.com/",
|
|
||||||
"http://fc2.com/",
|
|
||||||
"http://fedoraproject.org/wiki/Fedora_Project_Wiki",
|
|
||||||
"http://blog.fefe.de/",
|
|
||||||
"http://www.ffmpeg.org/",
|
|
||||||
"http://blog.flickr.net/en",
|
|
||||||
"http://free-codecs.com/",
|
|
||||||
"http://blog.gitorious.org/",
|
|
||||||
"http://git-scm.com/",
|
|
||||||
"http://www.gmx.net/",
|
|
||||||
"http://www.gnome.org/",
|
|
||||||
"http://www.gnu.org/",
|
|
||||||
"http://go.com/",
|
|
||||||
"http://code.google.com/",
|
|
||||||
"http://www.heise.de/",
|
|
||||||
"http://www.huffingtonpost.co.uk/",
|
|
||||||
"http://www.iana.org/",
|
|
||||||
"http://www.imdb.com/",
|
|
||||||
"http://www.imgburn.com/",
|
|
||||||
"http://imgur.com/",
|
|
||||||
"http://en.jd.com/",
|
|
||||||
"http://kannmanumdieuhrzeitschonnbierchentrinken.de/",
|
|
||||||
"http://mirrors.kernel.org/",
|
|
||||||
"http://lame.sourceforge.net/",
|
|
||||||
"http://www.libav.org/",
|
|
||||||
"http://blog.linkedin.com/",
|
|
||||||
"http://www.linuxmint.com/",
|
|
||||||
"http://www.livedoor.com/",
|
|
||||||
"http://www.livejournal.com/",
|
|
||||||
"http://go.mail.ru/",
|
|
||||||
"http://www.mediafire.com/",
|
|
||||||
"http://ftp.mozilla.org/",
|
|
||||||
"http://mplayerhq.hu/",
|
|
||||||
"http://www.msn.com/en-us/",
|
|
||||||
"http://oss.netfarm.it/",
|
|
||||||
"http://www.nytimes.com/",
|
|
||||||
"http://www.opera.com/",
|
|
||||||
"http://pastie.org/",
|
|
||||||
"http://www.portablefreeware.com/",
|
|
||||||
"http://www.qt.io/",
|
|
||||||
"http://qt-project.org/",
|
|
||||||
"http://www.quakelive.com/",
|
|
||||||
"http://www.seamonkey-project.org/",
|
|
||||||
"http://www.sina.com.cn/",
|
|
||||||
"http://www.sohu.com/",
|
|
||||||
"http://www.soso.com/",
|
|
||||||
"http://sourceforge.net/",
|
|
||||||
"http://www.spiegel.de/",
|
|
||||||
"http://tdm-gcc.tdragon.net/",
|
|
||||||
"http://www.tdrsmusic.com/",
|
|
||||||
"http://www.ubuntu.com/",
|
|
||||||
"http://status.twitter.com/",
|
|
||||||
"http://www.uol.com.br/",
|
|
||||||
"http://www.videohelp.com/",
|
|
||||||
"http://www.videolan.org/",
|
|
||||||
"http://virtualdub.org/",
|
|
||||||
"http://blog.virustotal.com/",
|
|
||||||
"http://www.weibo.com/login.php",
|
|
||||||
"http://www.wikipedia.org/",
|
|
||||||
"http://www.winamp.com/",
|
|
||||||
"http://en.support.wordpress.com/",
|
|
||||||
"http://xiph.org/",
|
|
||||||
"http://us.mail.yahoo.com/",
|
|
||||||
"http://www.yandex.ru/",
|
|
||||||
"http://www.youtube.com/yt/about/",
|
|
||||||
"http://www.zedo.com/",
|
|
||||||
"http://ffmpeg.zeranoe.com/",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static const int MIN_CONNSCORE = 8;
|
|
||||||
static const int VERSION_INFO_EXPIRES_MONTHS = 6;
|
|
||||||
static char *USER_AGENT_STR = "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20111106 IceCat/7.0.1";
|
|
||||||
|
|
||||||
//Helper function
|
|
||||||
static int getMaxProgress(void)
|
|
||||||
{
|
|
||||||
int counter = MIN_CONNSCORE + 2;
|
|
||||||
for(int i = 0; update_mirrors_prim[i]; i++) counter++;
|
|
||||||
for(int i = 0; update_mirrors_back[i]; i++) counter++;
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
// Update Info Class
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
UpdateInfo::UpdateInfo(void)
|
|
||||||
{
|
|
||||||
resetInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateInfo::resetInfo(void)
|
|
||||||
{
|
|
||||||
m_buildNo = 0;
|
|
||||||
m_buildDate.setDate(1900, 1, 1);
|
|
||||||
m_downloadSite.clear();
|
|
||||||
m_downloadAddress.clear();
|
|
||||||
m_downloadFilename.clear();
|
|
||||||
m_downloadFilecode.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
// Constructor & Destructor
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
UpdateCheckThread::UpdateCheckThread(const QString &binWGet, const QString &binGnuPG, const QString &binKeys, const bool betaUpdates, const bool testMode)
|
|
||||||
:
|
|
||||||
m_updateInfo(new UpdateInfo()),
|
|
||||||
m_binaryWGet(binWGet),
|
|
||||||
m_binaryGnuPG(binGnuPG),
|
|
||||||
m_binaryKeys(binKeys),
|
|
||||||
m_betaUpdates(betaUpdates),
|
|
||||||
m_testMode(testMode),
|
|
||||||
m_maxProgress(getMaxProgress())
|
|
||||||
{
|
|
||||||
m_success = false;
|
|
||||||
m_status = UpdateStatus_NotStartedYet;
|
|
||||||
m_progress = 0;
|
|
||||||
|
|
||||||
if(m_binaryWGet.isEmpty() || m_binaryGnuPG.isEmpty() || m_binaryKeys.isEmpty())
|
|
||||||
{
|
|
||||||
THROW("Tools not initialized correctly!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateCheckThread::~UpdateCheckThread(void)
|
|
||||||
{
|
|
||||||
delete m_updateInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
// Protected functions
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void UpdateCheckThread::run(void)
|
|
||||||
{
|
|
||||||
qDebug("Update checker thread started!");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
m_testMode ? testKnownHosts() : checkForUpdates();
|
|
||||||
}
|
|
||||||
catch(const std::exception &error)
|
|
||||||
{
|
|
||||||
fflush(stdout); fflush(stderr);
|
|
||||||
fprintf(stderr, "\nGURU MEDITATION !!!\n\nException error:\n%s\n", error.what());
|
|
||||||
x264_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
fflush(stdout); fflush(stderr);
|
|
||||||
fprintf(stderr, "\nGURU MEDITATION !!!\n\nUnknown exception error!\n");
|
|
||||||
x264_fatal_exit(L"Unhandeled C++ exception error, application will exit!");
|
|
||||||
}
|
|
||||||
|
|
||||||
qDebug("Update checker thread completed.");
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateCheckThread::checkForUpdates(void)
|
|
||||||
{
|
|
||||||
// ----- Initialization ----- //
|
|
||||||
|
|
||||||
m_success = false;
|
|
||||||
m_updateInfo->resetInfo();
|
|
||||||
setProgress(0);
|
|
||||||
|
|
||||||
// ----- Test Internet Connection ----- //
|
|
||||||
|
|
||||||
int connectionScore = 0;
|
|
||||||
int maxConnectTries = (3 * MIN_CONNSCORE) / 2;
|
|
||||||
|
|
||||||
log("Checking internet connection...");
|
|
||||||
setStatus(UpdateStatus_CheckingConnection);
|
|
||||||
|
|
||||||
const int networkStatus = x264_network_status();
|
|
||||||
if(networkStatus == x264_network_non)
|
|
||||||
{
|
|
||||||
log("", "Operating system reports that the computer is currently offline !!!");
|
|
||||||
setProgress(m_maxProgress);
|
|
||||||
setStatus(UpdateStatus_ErrorNoConnection);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setProgress(1);
|
|
||||||
|
|
||||||
// ----- Test Known Hosts Connectivity ----- //
|
|
||||||
|
|
||||||
QStringList hostList;
|
|
||||||
for(int i = 0; known_hosts[i]; i++)
|
|
||||||
{
|
|
||||||
hostList << QString::fromLatin1(known_hosts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
x264_seed_rand();
|
|
||||||
|
|
||||||
while(!(hostList.isEmpty() || (connectionScore >= MIN_CONNSCORE) || (maxConnectTries < 1)))
|
|
||||||
{
|
|
||||||
switch(tryContactHost(hostList.takeAt(x264_rand() % hostList.count())))
|
|
||||||
{
|
|
||||||
case 01: connectionScore += 1; break;
|
|
||||||
case 02: connectionScore += 2; break;
|
|
||||||
default: maxConnectTries -= 1; break;
|
|
||||||
}
|
|
||||||
setProgress(qBound(1, connectionScore + 1, MIN_CONNSCORE + 1));
|
|
||||||
x264_sleep(64);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(connectionScore < MIN_CONNSCORE)
|
|
||||||
{
|
|
||||||
log("", "Connectivity test has failed: Internet connection appears to be broken!");
|
|
||||||
setProgress(m_maxProgress);
|
|
||||||
setStatus(UpdateStatus_ErrorConnectionTestFailed);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----- Build Mirror List ----- //
|
|
||||||
|
|
||||||
log("", "----", "", "Checking for updates online...");
|
|
||||||
setStatus(UpdateStatus_FetchingUpdates);
|
|
||||||
|
|
||||||
QStringList mirrorList;
|
|
||||||
for(int index = 0; update_mirrors_prim[index]; index++)
|
|
||||||
{
|
|
||||||
mirrorList << QString::fromLatin1(update_mirrors_prim[index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
x264_seed_rand();
|
|
||||||
if(const int len = mirrorList.count())
|
|
||||||
{
|
|
||||||
const int rounds = len * 1097;
|
|
||||||
for(int i = 0; i < rounds; i++)
|
|
||||||
{
|
|
||||||
mirrorList.swap(i % len, x264_rand() % len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int index = 0; update_mirrors_back[index]; index++)
|
|
||||||
{
|
|
||||||
mirrorList << QString::fromLatin1(update_mirrors_back[index]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----- Fetch Update Info From Server ----- //
|
|
||||||
|
|
||||||
while(!mirrorList.isEmpty())
|
|
||||||
{
|
|
||||||
QString currentMirror = mirrorList.takeFirst();
|
|
||||||
setProgress(m_progress + 1);
|
|
||||||
if(!m_success)
|
|
||||||
{
|
|
||||||
if(tryUpdateMirror(m_updateInfo, currentMirror))
|
|
||||||
{
|
|
||||||
m_success = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
x264_sleep(64);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setProgress(m_maxProgress);
|
|
||||||
|
|
||||||
if(m_success)
|
|
||||||
{
|
|
||||||
if(m_updateInfo->m_buildNo > x264_version_build())
|
|
||||||
{
|
|
||||||
setStatus(UpdateStatus_CompletedUpdateAvailable);
|
|
||||||
}
|
|
||||||
else if(m_updateInfo->m_buildNo == x264_version_build())
|
|
||||||
{
|
|
||||||
setStatus(UpdateStatus_CompletedNoUpdates);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setStatus(UpdateStatus_CompletedNewVersionOlder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setStatus(UpdateStatus_ErrorFetchUpdateInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateCheckThread::testKnownHosts(void)
|
|
||||||
{
|
|
||||||
QStringList hostList;
|
|
||||||
for(int i = 0; known_hosts[i]; i++)
|
|
||||||
{
|
|
||||||
hostList << QString::fromLatin1(known_hosts[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
qDebug("\n[Known Hosts]");
|
|
||||||
log("Testing all known hosts...", "", "---");
|
|
||||||
|
|
||||||
int hostCount = hostList.count();
|
|
||||||
while(!hostList.isEmpty())
|
|
||||||
{
|
|
||||||
QString currentHost = hostList.takeFirst();
|
|
||||||
qDebug("Testing: %s", currentHost.toLatin1().constData());
|
|
||||||
log("", "Testing:", currentHost, "");
|
|
||||||
QString outFile = QString("%1/%2.htm").arg(x264_temp_directory(), x264_rand_str());
|
|
||||||
bool httpOk = false;
|
|
||||||
if(!getFile(currentHost, outFile, 0, &httpOk))
|
|
||||||
{
|
|
||||||
if(httpOk)
|
|
||||||
{
|
|
||||||
qWarning("\nConnectivity test was SLOW on the following site:\n%s\n", currentHost.toLatin1().constData());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qWarning("\nConnectivity test FAILED on the following site:\n%s\n", currentHost.toLatin1().constData());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
log("", "---");
|
|
||||||
QFile::remove(outFile);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
// PRIVATE FUNCTIONS
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void UpdateCheckThread::setStatus(const int status)
|
|
||||||
{
|
|
||||||
if(m_status != status)
|
|
||||||
{
|
|
||||||
m_status = status;
|
|
||||||
emit statusChanged(status);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateCheckThread::setProgress(const int progress)
|
|
||||||
{
|
|
||||||
if(m_progress != progress)
|
|
||||||
{
|
|
||||||
m_progress = progress;
|
|
||||||
emit progressChanged(progress);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateCheckThread::log(const QString &str1, const QString &str2, const QString &str3, const QString &str4)
|
|
||||||
{
|
|
||||||
if(!str1.isNull()) emit messageLogged(str1);
|
|
||||||
if(!str2.isNull()) emit messageLogged(str2);
|
|
||||||
if(!str3.isNull()) emit messageLogged(str3);
|
|
||||||
if(!str4.isNull()) emit messageLogged(str4);
|
|
||||||
}
|
|
||||||
|
|
||||||
int UpdateCheckThread::tryContactHost(const QString &url)
|
|
||||||
{
|
|
||||||
int result = -1; bool httpOkay = false;
|
|
||||||
const QString outFile = QString("%1/%2.htm").arg(x264_temp_directory(), x264_rand_str());
|
|
||||||
log("", "Testing host:", url);
|
|
||||||
|
|
||||||
if(getFile(url, outFile, 0, &httpOkay))
|
|
||||||
{
|
|
||||||
log("Connection to host was established successfully.");
|
|
||||||
result = 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(httpOkay)
|
|
||||||
{
|
|
||||||
log("Connection to host timed out after HTTP OK was received.");
|
|
||||||
result = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log("Connection failed: The host could not be reached!");
|
|
||||||
result = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QFile::remove(outFile);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UpdateCheckThread::tryUpdateMirror(UpdateInfo *updateInfo, const QString &url)
|
|
||||||
{
|
|
||||||
bool success = false;
|
|
||||||
log("", "Trying mirror:", url);
|
|
||||||
|
|
||||||
const QString randPart = x264_rand_str();
|
|
||||||
const QString outFileVers = QString("%1/%2.ver").arg(x264_temp_directory(), randPart);
|
|
||||||
const QString outFileSign = QString("%1/%2.sig").arg(x264_temp_directory(), randPart);
|
|
||||||
|
|
||||||
if(getUpdateInfo(url, outFileVers, outFileSign))
|
|
||||||
{
|
|
||||||
log("", "Download okay, checking signature:");
|
|
||||||
if(checkSignature(outFileVers, outFileSign))
|
|
||||||
{
|
|
||||||
log("", "Signature okay, parsing info:");
|
|
||||||
success = parseVersionInfo(outFileVers, updateInfo);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log("", "Bad signature, take care!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
log("", "Download has failed!");
|
|
||||||
}
|
|
||||||
|
|
||||||
QFile::remove(outFileVers);
|
|
||||||
QFile::remove(outFileSign);
|
|
||||||
|
|
||||||
return success;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UpdateCheckThread::getUpdateInfo(const QString &url, const QString &outFileVers, const QString &outFileSign)
|
|
||||||
{
|
|
||||||
log("", "Downloading update info:");
|
|
||||||
if(!getFile(QString("%1%2" ).arg(url, mirror_url_postfix[m_betaUpdates ? 1 : 0]), outFileVers))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
log("", "Downloading signature:");
|
|
||||||
if(!getFile(QString("%1%2.sig").arg(url, mirror_url_postfix[m_betaUpdates ? 1 : 0]), outFileSign))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UpdateCheckThread::getFile(const QString &url, const QString &outFile, unsigned int maxRedir, bool *httpOk)
|
|
||||||
{
|
|
||||||
QFileInfo output(outFile);
|
|
||||||
output.setCaching(false);
|
|
||||||
if(httpOk) *httpOk = false;
|
|
||||||
|
|
||||||
if(output.exists())
|
|
||||||
{
|
|
||||||
QFile::remove(output.canonicalFilePath());
|
|
||||||
if(output.exists())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QProcess process;
|
|
||||||
x264_init_process(process, output.absolutePath());
|
|
||||||
|
|
||||||
QStringList args;
|
|
||||||
args << "-T" << "15" << "--no-cache" << "--no-dns-cache" << QString().sprintf("--max-redirect=%u", maxRedir);
|
|
||||||
args << QString("--referer=%1://%2/").arg(QUrl(url).scheme(), QUrl(url).host()) << "-U" << USER_AGENT_STR;
|
|
||||||
args << "-O" << output.fileName() << url;
|
|
||||||
|
|
||||||
QEventLoop loop;
|
|
||||||
connect(&process, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
|
|
||||||
connect(&process, SIGNAL(finished(int,QProcess::ExitStatus)), &loop, SLOT(quit()));
|
|
||||||
connect(&process, SIGNAL(readyRead()), &loop, SLOT(quit()));
|
|
||||||
|
|
||||||
QTimer timer;
|
|
||||||
timer.setSingleShot(true);
|
|
||||||
timer.setInterval(25000);
|
|
||||||
connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
|
|
||||||
|
|
||||||
const QRegExp httpResponseOK("200 OK$");
|
|
||||||
|
|
||||||
process.start(m_binaryWGet, args);
|
|
||||||
|
|
||||||
if(!process.waitForStarted())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
timer.start();
|
|
||||||
|
|
||||||
while(process.state() != QProcess::NotRunning)
|
|
||||||
{
|
|
||||||
loop.exec();
|
|
||||||
const bool bTimeOut = (!timer.isActive());
|
|
||||||
while(process.canReadLine())
|
|
||||||
{
|
|
||||||
QString line = QString::fromLatin1(process.readLine()).simplified();
|
|
||||||
if(line.contains(httpResponseOK))
|
|
||||||
{
|
|
||||||
line.append(" [OK]");
|
|
||||||
if(httpOk) *httpOk = true;
|
|
||||||
}
|
|
||||||
log(line);
|
|
||||||
}
|
|
||||||
if(bTimeOut)
|
|
||||||
{
|
|
||||||
qWarning("WGet process timed out <-- killing!");
|
|
||||||
process.kill();
|
|
||||||
process.waitForFinished();
|
|
||||||
log("!!! TIMEOUT !!!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
timer.stop();
|
|
||||||
timer.disconnect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
|
|
||||||
|
|
||||||
log(QString().sprintf("Exited with code %d", process.exitCode()));
|
|
||||||
return (process.exitCode() == 0) && output.exists() && output.isFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UpdateCheckThread::checkSignature(const QString &file, const QString &signature)
|
|
||||||
{
|
|
||||||
if(QFileInfo(file).absolutePath().compare(QFileInfo(signature).absolutePath(), Qt::CaseInsensitive) != 0)
|
|
||||||
{
|
|
||||||
qWarning("CheckSignature: File and signature should be in same folder!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if(QFileInfo(file).absolutePath().compare(QFileInfo(m_binaryKeys).absolutePath(), Qt::CaseInsensitive) != 0)
|
|
||||||
{
|
|
||||||
qWarning("CheckSignature: File and keyring should be in same folder!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
QProcess process;
|
|
||||||
x264_init_process(process, QFileInfo(file).absolutePath());
|
|
||||||
|
|
||||||
QEventLoop loop;
|
|
||||||
connect(&process, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
|
|
||||||
connect(&process, SIGNAL(finished(int,QProcess::ExitStatus)), &loop, SLOT(quit()));
|
|
||||||
connect(&process, SIGNAL(readyRead()), &loop, SLOT(quit()));
|
|
||||||
|
|
||||||
process.start(m_binaryGnuPG, QStringList() << "--homedir" << "." << "--keyring" << QFileInfo(m_binaryKeys).fileName() << QFileInfo(signature).fileName() << QFileInfo(file).fileName());
|
|
||||||
|
|
||||||
if(!process.waitForStarted())
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(process.state() == QProcess::Running)
|
|
||||||
{
|
|
||||||
loop.exec();
|
|
||||||
while(process.canReadLine())
|
|
||||||
{
|
|
||||||
log(QString::fromLatin1(process.readLine()).simplified());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
log(QString().sprintf("Exited with code %d", process.exitCode()));
|
|
||||||
return (process.exitCode() == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool UpdateCheckThread::parseVersionInfo(const QString &file, UpdateInfo *updateInfo)
|
|
||||||
{
|
|
||||||
QRegExp value("^(\\w+)=(.+)$");
|
|
||||||
QRegExp section("^\\[(.+)\\]$");
|
|
||||||
|
|
||||||
QDate updateInfoDate;
|
|
||||||
updateInfo->resetInfo();
|
|
||||||
|
|
||||||
QFile data(file);
|
|
||||||
if(!data.open(QIODevice::ReadOnly))
|
|
||||||
{
|
|
||||||
qWarning("Cannot open update info file for reading!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool inHeader = false;
|
|
||||||
bool inSection = false;
|
|
||||||
|
|
||||||
while(!data.atEnd())
|
|
||||||
{
|
|
||||||
QString line = QString::fromLatin1(data.readLine()).trimmed();
|
|
||||||
if(section.indexIn(line) >= 0)
|
|
||||||
{
|
|
||||||
log(QString("Sec: [%1]").arg(section.cap(1)));
|
|
||||||
inSection = (section.cap(1).compare(section_id, Qt::CaseInsensitive) == 0);
|
|
||||||
inHeader = (section.cap(1).compare(header_id, Qt::CaseInsensitive) == 0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(inSection && (value.indexIn(line) >= 0))
|
|
||||||
{
|
|
||||||
log(QString("Val: '%1' ==> '%2").arg(value.cap(1), value.cap(2)));
|
|
||||||
if(value.cap(1).compare("BuildNo", Qt::CaseInsensitive) == 0)
|
|
||||||
{
|
|
||||||
bool ok = false;
|
|
||||||
unsigned int temp = value.cap(2).toUInt(&ok);
|
|
||||||
if(ok) updateInfo->m_buildNo = temp;
|
|
||||||
}
|
|
||||||
else if(value.cap(1).compare("BuildDate", Qt::CaseInsensitive) == 0)
|
|
||||||
{
|
|
||||||
QDate temp = QDate::fromString(value.cap(2).trimmed(), Qt::ISODate);
|
|
||||||
if(temp.isValid()) updateInfo->m_buildDate = temp;
|
|
||||||
}
|
|
||||||
else if(value.cap(1).compare("DownloadSite", Qt::CaseInsensitive) == 0)
|
|
||||||
{
|
|
||||||
updateInfo->m_downloadSite = value.cap(2).trimmed();
|
|
||||||
}
|
|
||||||
else if(value.cap(1).compare("DownloadAddress", Qt::CaseInsensitive) == 0)
|
|
||||||
{
|
|
||||||
updateInfo->m_downloadAddress = value.cap(2).trimmed();
|
|
||||||
}
|
|
||||||
else if(value.cap(1).compare("DownloadFilename", Qt::CaseInsensitive) == 0)
|
|
||||||
{
|
|
||||||
updateInfo->m_downloadFilename = value.cap(2).trimmed();
|
|
||||||
}
|
|
||||||
else if(value.cap(1).compare("DownloadFilecode", Qt::CaseInsensitive) == 0)
|
|
||||||
{
|
|
||||||
updateInfo->m_downloadFilecode = value.cap(2).trimmed();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(inHeader && (value.indexIn(line) >= 0))
|
|
||||||
{
|
|
||||||
log(QString("Val: '%1' ==> '%2").arg(value.cap(1), value.cap(2)));
|
|
||||||
if(value.cap(1).compare("TimestampCreated", Qt::CaseInsensitive) == 0)
|
|
||||||
{
|
|
||||||
QDate temp = QDate::fromString(value.cap(2).trimmed(), Qt::ISODate);
|
|
||||||
if(temp.isValid()) updateInfoDate = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!updateInfoDate.isValid())
|
|
||||||
{
|
|
||||||
updateInfo->resetInfo();
|
|
||||||
log("WARNING: Version info timestamp is missing!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if(updateInfoDate.addMonths(VERSION_INFO_EXPIRES_MONTHS) < x264_current_date_safe())
|
|
||||||
{
|
|
||||||
updateInfo->resetInfo();
|
|
||||||
log(QString::fromLatin1("WARNING: This version info has expired at %1!").arg(updateInfoDate.addMonths(VERSION_INFO_EXPIRES_MONTHS).toString(Qt::ISODate)));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if(x264_current_date_safe() < updateInfoDate)
|
|
||||||
{
|
|
||||||
log("Version info is from the future, take care!");
|
|
||||||
qWarning("Version info is from the future, take care!");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool complete = true;
|
|
||||||
|
|
||||||
if(!(updateInfo->m_buildNo > 0)) complete = false;
|
|
||||||
if(!(updateInfo->m_buildDate.year() >= 2010)) complete = false;
|
|
||||||
if(updateInfo->m_downloadSite.isEmpty()) complete = false;
|
|
||||||
if(updateInfo->m_downloadAddress.isEmpty()) complete = false;
|
|
||||||
if(updateInfo->m_downloadFilename.isEmpty()) complete = false;
|
|
||||||
if(updateInfo->m_downloadFilecode.isEmpty()) complete = false;
|
|
||||||
|
|
||||||
if(!complete)
|
|
||||||
{
|
|
||||||
log("WARNING: Version info is incomplete!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return complete;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
// SLOTS
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/*NONE*/
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
// EVENTS
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/*NONE*/
|
|
@ -1,109 +0,0 @@
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Simple x264 Launcher
|
|
||||||
// Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
|
|
||||||
//
|
|
||||||
// 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 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, write to the Free Software Foundation, Inc.,
|
|
||||||
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
//
|
|
||||||
// http://www.gnu.org/licenses/gpl-2.0.txt
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QThread>
|
|
||||||
#include <QDate>
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
class UpdateInfo
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
UpdateInfo(void);
|
|
||||||
void resetInfo(void);
|
|
||||||
|
|
||||||
unsigned int m_buildNo;
|
|
||||||
QDate m_buildDate;
|
|
||||||
QString m_downloadSite;
|
|
||||||
QString m_downloadAddress;
|
|
||||||
QString m_downloadFilename;
|
|
||||||
QString m_downloadFilecode;
|
|
||||||
};
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
class UpdateCheckThread : public QThread
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
UpdateStatus_NotStartedYet = 0,
|
|
||||||
UpdateStatus_CheckingConnection = 1,
|
|
||||||
UpdateStatus_FetchingUpdates = 2,
|
|
||||||
UpdateStatus_CompletedUpdateAvailable = 3,
|
|
||||||
UpdateStatus_CompletedNoUpdates = 4,
|
|
||||||
UpdateStatus_CompletedNewVersionOlder = 5,
|
|
||||||
UpdateStatus_ErrorNoConnection = 6,
|
|
||||||
UpdateStatus_ErrorConnectionTestFailed = 7,
|
|
||||||
UpdateStatus_ErrorFetchUpdateInfo = 8
|
|
||||||
}
|
|
||||||
update_status_t;
|
|
||||||
|
|
||||||
UpdateCheckThread(const QString &binWGet, const QString &binGnuPG, const QString &binKeys, const bool betaUpdates, const bool testMode = false);
|
|
||||||
~UpdateCheckThread(void);
|
|
||||||
|
|
||||||
const int getUpdateStatus(void) const { return m_status; }
|
|
||||||
const bool getSuccess(void) const { return m_success; };
|
|
||||||
const int getMaximumProgress(void) const { return m_maxProgress; };
|
|
||||||
const int getCurrentProgress(void) const { return m_progress; };
|
|
||||||
const UpdateInfo *getUpdateInfo(void) const { return m_updateInfo; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void run(void);
|
|
||||||
void checkForUpdates(void);
|
|
||||||
void testKnownHosts(void);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void statusChanged(const int status);
|
|
||||||
void progressChanged(const int progress);
|
|
||||||
void messageLogged(const QString &text);
|
|
||||||
|
|
||||||
private:
|
|
||||||
const int m_maxProgress;
|
|
||||||
UpdateInfo *const m_updateInfo;
|
|
||||||
|
|
||||||
const bool m_betaUpdates;
|
|
||||||
const bool m_testMode;
|
|
||||||
|
|
||||||
const QString m_binaryWGet;
|
|
||||||
const QString m_binaryGnuPG;
|
|
||||||
const QString m_binaryKeys;
|
|
||||||
|
|
||||||
volatile bool m_success;
|
|
||||||
|
|
||||||
int m_status;
|
|
||||||
int m_progress;
|
|
||||||
|
|
||||||
inline void setStatus(const int status);
|
|
||||||
inline void setProgress(const int progress);
|
|
||||||
inline void log(const QString &str1, const QString &str2 = QString(), const QString &str3 = QString(), const QString &str4 = QString());
|
|
||||||
|
|
||||||
bool getFile(const QString &url, const QString &outFile, unsigned int maxRedir = 5, bool *httpOk = NULL);
|
|
||||||
bool getUpdateInfo(const QString &url, const QString &outFileVers, const QString &outFileSign);
|
|
||||||
int tryContactHost(const QString &url);
|
|
||||||
bool tryUpdateMirror(UpdateInfo *updateInfo, const QString &url);
|
|
||||||
bool checkSignature(const QString &file, const QString &signature);
|
|
||||||
bool parseVersionInfo(const QString &file, UpdateInfo *updateInfo);
|
|
||||||
};
|
|
@ -26,7 +26,7 @@
|
|||||||
#define VER_X264_MAJOR 2
|
#define VER_X264_MAJOR 2
|
||||||
#define VER_X264_MINOR 4
|
#define VER_X264_MINOR 4
|
||||||
#define VER_X264_PATCH 6
|
#define VER_X264_PATCH 6
|
||||||
#define VER_X264_BUILD 907
|
#define VER_X264_BUILD 911
|
||||||
|
|
||||||
#define VER_X264_PORTABLE_EDITION (0)
|
#define VER_X264_PORTABLE_EDITION (0)
|
||||||
|
|
||||||
|
152
src/win_main.cpp
152
src/win_main.cpp
@ -35,6 +35,7 @@
|
|||||||
#include "thread_avisynth.h"
|
#include "thread_avisynth.h"
|
||||||
#include "thread_vapoursynth.h"
|
#include "thread_vapoursynth.h"
|
||||||
#include "thread_encode.h"
|
#include "thread_encode.h"
|
||||||
|
#include "thread_ipc_recv.h"
|
||||||
#include "taskbar7.h"
|
#include "taskbar7.h"
|
||||||
#include "input_filter.h"
|
#include "input_filter.h"
|
||||||
#include "win_addJob.h"
|
#include "win_addJob.h"
|
||||||
@ -47,6 +48,7 @@
|
|||||||
//MUtils
|
//MUtils
|
||||||
#include <MUtils/OSSupport.h>
|
#include <MUtils/OSSupport.h>
|
||||||
#include <MUtils/CPUFeatures.h>
|
#include <MUtils/CPUFeatures.h>
|
||||||
|
#include <MUtils/IPCChannel.h>
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QDate>
|
#include <QDate>
|
||||||
@ -93,9 +95,9 @@ static const int vsynth_rev = 24;
|
|||||||
/*
|
/*
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures, MUtils::IPCChannel *const ipcChannel)
|
||||||
:
|
:
|
||||||
m_ipc(NULL),
|
m_ipcChannel(ipcChannel),
|
||||||
m_sysinfo(NULL),
|
m_sysinfo(NULL),
|
||||||
m_options(NULL),
|
m_options(NULL),
|
||||||
m_jobList(NULL),
|
m_jobList(NULL),
|
||||||
@ -103,7 +105,6 @@ MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
|||||||
m_preferences(NULL),
|
m_preferences(NULL),
|
||||||
m_recentlyUsed(NULL),
|
m_recentlyUsed(NULL),
|
||||||
m_initialized(false),
|
m_initialized(false),
|
||||||
m_sysTray(new QSystemTrayIcon(this)),
|
|
||||||
ui(new Ui::MainWindow())
|
ui(new Ui::MainWindow())
|
||||||
{
|
{
|
||||||
//Init the dialog, from the .ui file
|
//Init the dialog, from the .ui file
|
||||||
@ -116,23 +117,23 @@ MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
|||||||
qRegisterMetaType<JobStatus>("JobStatus");
|
qRegisterMetaType<JobStatus>("JobStatus");
|
||||||
|
|
||||||
//Create and initialize the sysinfo object
|
//Create and initialize the sysinfo object
|
||||||
m_sysinfo = new SysinfoModel();
|
m_sysinfo.reset(new SysinfoModel());
|
||||||
m_sysinfo->setAppPath(QApplication::applicationDirPath());
|
m_sysinfo->setAppPath(QApplication::applicationDirPath());
|
||||||
m_sysinfo->setMMXSupport(cpuFeatures.features && MUtils::CPUFetaures::FLAG_MMX);
|
m_sysinfo->setMMXSupport(cpuFeatures.features && MUtils::CPUFetaures::FLAG_MMX);
|
||||||
m_sysinfo->setSSESupport(cpuFeatures.features && MUtils::CPUFetaures::FLAG_SSE); //SSE implies MMX2
|
m_sysinfo->setSSESupport(cpuFeatures.features && MUtils::CPUFetaures::FLAG_SSE); //SSE implies MMX2
|
||||||
m_sysinfo->setX64Support(cpuFeatures.x64 && (cpuFeatures.features && MUtils::CPUFetaures::FLAG_SSE2)); //X64 implies SSE2
|
m_sysinfo->setX64Support(cpuFeatures.x64 && (cpuFeatures.features && MUtils::CPUFetaures::FLAG_SSE2)); //X64 implies SSE2
|
||||||
|
|
||||||
//Load preferences
|
//Load preferences
|
||||||
m_preferences = new PreferencesModel();
|
m_preferences.reset(new PreferencesModel());
|
||||||
PreferencesModel::loadPreferences(m_preferences);
|
PreferencesModel::loadPreferences(m_preferences.data());
|
||||||
|
|
||||||
//Load recently used
|
//Load recently used
|
||||||
m_recentlyUsed = new RecentlyUsed();
|
m_recentlyUsed.reset(new RecentlyUsed());
|
||||||
RecentlyUsed::loadRecentlyUsed(m_recentlyUsed);
|
RecentlyUsed::loadRecentlyUsed(m_recentlyUsed.data());
|
||||||
|
|
||||||
//Create options object
|
//Create options object
|
||||||
m_options = new OptionsModel(m_sysinfo);
|
m_options.reset(new OptionsModel(m_sysinfo.data()));
|
||||||
OptionsModel::loadTemplate(m_options, QString::fromLatin1(tpl_last));
|
OptionsModel::loadTemplate(m_options.data(), QString::fromLatin1(tpl_last));
|
||||||
|
|
||||||
//Freeze minimum size
|
//Freeze minimum size
|
||||||
setMinimumSize(size());
|
setMinimumSize(size());
|
||||||
@ -152,9 +153,9 @@ MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Create model
|
//Create model
|
||||||
m_jobList = new JobListModel(m_preferences);
|
m_jobList.reset(new JobListModel(m_preferences.data()));
|
||||||
connect(m_jobList, SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(jobChangedData(QModelIndex, QModelIndex)));
|
connect(m_jobList.data(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(jobChangedData(QModelIndex, QModelIndex)));
|
||||||
ui->jobsView->setModel(m_jobList);
|
ui->jobsView->setModel(m_jobList.data());
|
||||||
|
|
||||||
//Setup view
|
//Setup view
|
||||||
ui->jobsView->horizontalHeader()->setSectionHidden(3, true);
|
ui->jobsView->horizontalHeader()->setSectionHidden(3, true);
|
||||||
@ -167,16 +168,16 @@ MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
|||||||
connect(ui->jobsView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(jobSelected(QModelIndex, QModelIndex)));
|
connect(ui->jobsView->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(jobSelected(QModelIndex, QModelIndex)));
|
||||||
|
|
||||||
//Setup key listener
|
//Setup key listener
|
||||||
m_inputFilter_jobList = new InputEventFilter(ui->jobsView);
|
m_inputFilter_jobList.reset(new InputEventFilter(ui->jobsView));
|
||||||
m_inputFilter_jobList->addKeyFilter(Qt::ControlModifier | Qt::Key_Up, 1);
|
m_inputFilter_jobList->addKeyFilter(Qt::ControlModifier | Qt::Key_Up, 1);
|
||||||
m_inputFilter_jobList->addKeyFilter(Qt::ControlModifier | Qt::Key_Down, 2);
|
m_inputFilter_jobList->addKeyFilter(Qt::ControlModifier | Qt::Key_Down, 2);
|
||||||
connect(m_inputFilter_jobList, SIGNAL(keyPressed(int)), this, SLOT(jobListKeyPressed(int)));
|
connect(m_inputFilter_jobList.data(), SIGNAL(keyPressed(int)), this, SLOT(jobListKeyPressed(int)));
|
||||||
|
|
||||||
//Setup mouse listener
|
//Setup mouse listener
|
||||||
m_inputFilter_version = new InputEventFilter(ui->labelBuildDate);
|
m_inputFilter_version.reset(new InputEventFilter(ui->labelBuildDate));
|
||||||
m_inputFilter_version->addMouseFilter(Qt::LeftButton, 0);
|
m_inputFilter_version->addMouseFilter(Qt::LeftButton, 0);
|
||||||
m_inputFilter_version->addMouseFilter(Qt::RightButton, 0);
|
m_inputFilter_version->addMouseFilter(Qt::RightButton, 0);
|
||||||
connect(m_inputFilter_version, SIGNAL(mouseClicked(int)), this, SLOT(versionLabelMouseClicked(int)));
|
connect(m_inputFilter_version.data(), SIGNAL(mouseClicked(int)), this, SLOT(versionLabelMouseClicked(int)));
|
||||||
|
|
||||||
//Create context menu
|
//Create context menu
|
||||||
QAction *actionClipboard = new QAction(QIcon(":/buttons/page_paste.png"), tr("Copy to Clipboard"), ui->logView);
|
QAction *actionClipboard = new QAction(QIcon(":/buttons/page_paste.png"), tr("Copy to Clipboard"), ui->logView);
|
||||||
@ -227,7 +228,7 @@ MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
|||||||
SETUP_WEBLINK(ui->actionWebSecret, "http://www.youtube.com/watch_popup?v=AXIeHY-OYNI");
|
SETUP_WEBLINK(ui->actionWebSecret, "http://www.youtube.com/watch_popup?v=AXIeHY-OYNI");
|
||||||
|
|
||||||
//Create floating label
|
//Create floating label
|
||||||
m_label = new QLabel(ui->jobsView->viewport());
|
m_label.reset(new QLabel(ui->jobsView->viewport()));
|
||||||
m_label->setText(tr("No job created yet. Please click the 'Add New Job' button!"));
|
m_label->setText(tr("No job created yet. Please click the 'Add New Job' button!"));
|
||||||
m_label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
m_label->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
|
||||||
SET_TEXT_COLOR(m_label, Qt::darkGray);
|
SET_TEXT_COLOR(m_label, Qt::darkGray);
|
||||||
@ -239,25 +240,26 @@ MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
|||||||
updateLabelPos();
|
updateLabelPos();
|
||||||
|
|
||||||
//Init system tray icon
|
//Init system tray icon
|
||||||
|
m_sysTray.reset(new QSystemTrayIcon(this));
|
||||||
m_sysTray->setToolTip(this->windowTitle());
|
m_sysTray->setToolTip(this->windowTitle());
|
||||||
m_sysTray->setIcon(this->windowIcon());
|
m_sysTray->setIcon(this->windowIcon());
|
||||||
connect(m_sysTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(sysTrayActived()));
|
connect(m_sysTray.data(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(sysTrayActived()));
|
||||||
|
|
||||||
//Create corner widget
|
//Create corner widget
|
||||||
QLabel *checkUp = new QLabel(ui->menubar);
|
QLabel *checkUp = new QLabel(ui->menubar);
|
||||||
checkUp->setText(QString("<nobr><img src=\":/buttons/exclamation_small.png\"> <b style=\"color:darkred\">%1</b> </nobr>").arg(tr("Check for Updates")));
|
checkUp->setText(QString("<nobr><img src=\":/buttons/exclamation_small.png\"> <b style=\"color:darkred\">%1</b> </nobr>").arg(tr("Check for Updates")));
|
||||||
checkUp->setFixedHeight(ui->menubar->height());
|
checkUp->setFixedHeight(ui->menubar->height());
|
||||||
checkUp->setCursor(QCursor(Qt::PointingHandCursor));
|
checkUp->setCursor(QCursor(Qt::PointingHandCursor));
|
||||||
m_inputFilter_checkUp = new InputEventFilter(checkUp);
|
m_inputFilter_checkUp.reset(new InputEventFilter(checkUp));
|
||||||
m_inputFilter_checkUp->addMouseFilter(Qt::LeftButton, 0);
|
m_inputFilter_checkUp->addMouseFilter(Qt::LeftButton, 0);
|
||||||
m_inputFilter_checkUp->addMouseFilter(Qt::RightButton, 0);
|
m_inputFilter_checkUp->addMouseFilter(Qt::RightButton, 0);
|
||||||
connect(m_inputFilter_checkUp, SIGNAL(mouseClicked(int)), this, SLOT(checkUpdates()));
|
connect(m_inputFilter_checkUp.data(), SIGNAL(mouseClicked(int)), this, SLOT(checkUpdates()));
|
||||||
checkUp->hide();
|
checkUp->hide();
|
||||||
ui->menubar->setCornerWidget(checkUp);
|
ui->menubar->setCornerWidget(checkUp);
|
||||||
|
|
||||||
//Create timer
|
//Create timer
|
||||||
m_fileTimer = new QTimer(this);
|
m_fileTimer.reset(new QTimer(this));
|
||||||
connect(m_fileTimer, SIGNAL(timeout()), this, SLOT(handlePendingFiles()));
|
connect(m_fileTimer.data(), SIGNAL(timeout()), this, SLOT(handlePendingFiles()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -265,37 +267,27 @@ MainWindow::MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures)
|
|||||||
*/
|
*/
|
||||||
MainWindow::~MainWindow(void)
|
MainWindow::~MainWindow(void)
|
||||||
{
|
{
|
||||||
OptionsModel::saveTemplate(m_options, QString::fromLatin1(tpl_last));
|
OptionsModel::saveTemplate(m_options.data(), QString::fromLatin1(tpl_last));
|
||||||
|
|
||||||
X264_DELETE(m_jobList);
|
while(!m_toolsList->isEmpty())
|
||||||
X264_DELETE(m_options);
|
|
||||||
X264_DELETE(m_pendingFiles);
|
|
||||||
X264_DELETE(m_label);
|
|
||||||
X264_DELETE(m_inputFilter_jobList);
|
|
||||||
X264_DELETE(m_inputFilter_version);
|
|
||||||
X264_DELETE(m_inputFilter_checkUp);
|
|
||||||
|
|
||||||
while(!m_toolsList.isEmpty())
|
|
||||||
{
|
{
|
||||||
QFile *temp = m_toolsList.takeFirst();
|
QFile *temp = m_toolsList->takeFirst();
|
||||||
X264_DELETE(temp);
|
X264_DELETE(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FIXME !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
if(!m_ipcThread.isNull())
|
||||||
//if(m_ipc->isListening())
|
{
|
||||||
//{
|
m_ipcThread->stop();
|
||||||
// m_ipc->stopListening();
|
if(!m_ipcThread->wait(5000))
|
||||||
//}
|
{
|
||||||
|
m_ipcThread->terminate();
|
||||||
X264_DELETE(m_preferences);
|
m_ipcThread->wait();
|
||||||
X264_DELETE(m_recentlyUsed);
|
}
|
||||||
X264_DELETE(m_sysinfo);
|
}
|
||||||
X264_DELETE(m_fileTimer);
|
|
||||||
|
|
||||||
VapourSynthCheckThread::unload();
|
VapourSynthCheckThread::unload();
|
||||||
AvisynthCheckThread::unload();
|
AvisynthCheckThread::unload();
|
||||||
|
|
||||||
delete m_sysTray;
|
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,9 +306,9 @@ void MainWindow::addButtonPressed()
|
|||||||
bool runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
bool runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
||||||
QString sourceFileName, outputFileName;
|
QString sourceFileName, outputFileName;
|
||||||
|
|
||||||
if(createJob(sourceFileName, outputFileName, m_options, runImmediately))
|
if(createJob(sourceFileName, outputFileName, m_options.data(), runImmediately))
|
||||||
{
|
{
|
||||||
appendJob(sourceFileName, outputFileName, m_options, runImmediately);
|
appendJob(sourceFileName, outputFileName, m_options.data(), runImmediately);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -339,9 +331,9 @@ void MainWindow::openActionTriggered()
|
|||||||
{
|
{
|
||||||
bool runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
bool runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
||||||
QString sourceFileName(fileList.first()), outputFileName;
|
QString sourceFileName(fileList.first()), outputFileName;
|
||||||
if(createJob(sourceFileName, outputFileName, m_options, runImmediately))
|
if(createJob(sourceFileName, outputFileName, m_options.data(), runImmediately))
|
||||||
{
|
{
|
||||||
appendJob(sourceFileName, outputFileName, m_options, runImmediately);
|
appendJob(sourceFileName, outputFileName, m_options.data(), runImmediately);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -610,7 +602,7 @@ void MainWindow::showPreferences(void)
|
|||||||
{
|
{
|
||||||
ENSURE_APP_IS_READY();
|
ENSURE_APP_IS_READY();
|
||||||
|
|
||||||
PreferencesDialog *preferences = new PreferencesDialog(this, m_preferences, m_sysinfo);
|
PreferencesDialog *preferences = new PreferencesDialog(this, m_preferences.data(), m_sysinfo.data());
|
||||||
preferences->exec();
|
preferences->exec();
|
||||||
|
|
||||||
X264_DELETE(preferences);
|
X264_DELETE(preferences);
|
||||||
@ -766,17 +758,6 @@ void MainWindow::init(void)
|
|||||||
updateLabelPos();
|
updateLabelPos();
|
||||||
const MUtils::OS::ArgumentMap &arguments = MUtils::OS::arguments();
|
const MUtils::OS::ArgumentMap &arguments = MUtils::OS::arguments();
|
||||||
|
|
||||||
//---------------------------------------
|
|
||||||
// Create the IPC listener thread
|
|
||||||
//---------------------------------------
|
|
||||||
|
|
||||||
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FIXME !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
//if(m_ipc->isInitialized())
|
|
||||||
//{
|
|
||||||
// connect(m_ipc, SIGNAL(receivedCommand(int,QStringList,quint32)), this, SLOT(handleCommand(int,QStringList,quint32)), Qt::QueuedConnection);
|
|
||||||
// m_ipc->startListening();
|
|
||||||
//}
|
|
||||||
|
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Check required binaries
|
// Check required binaries
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
@ -788,10 +769,10 @@ void MainWindow::init(void)
|
|||||||
{
|
{
|
||||||
for(OptionsModel::EncVariant varnt = OptionsModel::EncVariant_LoBit; varnt <= OptionsModel::EncVariant_HiBit; NEXT(varnt))
|
for(OptionsModel::EncVariant varnt = OptionsModel::EncVariant_LoBit; varnt <= OptionsModel::EncVariant_HiBit; NEXT(varnt))
|
||||||
{
|
{
|
||||||
binFiles << ENC_BINARY(m_sysinfo, encdr, arch, varnt);
|
binFiles << ENC_BINARY(m_sysinfo.data(), encdr, arch, varnt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
binFiles << AVS_BINARY(m_sysinfo, arch == OptionsModel::EncArch_x64);
|
binFiles << AVS_BINARY(m_sysinfo.data(), arch == OptionsModel::EncArch_x64);
|
||||||
}
|
}
|
||||||
for(size_t i = 0; UpdaterDialog::BINARIES[i].name; i++)
|
for(size_t i = 0; UpdaterDialog::BINARIES[i].name; i++)
|
||||||
{
|
{
|
||||||
@ -816,7 +797,11 @@ void MainWindow::init(void)
|
|||||||
X264_DELETE(file);
|
X264_DELETE(file);
|
||||||
INIT_ERROR_EXIT();
|
INIT_ERROR_EXIT();
|
||||||
}
|
}
|
||||||
m_toolsList << file;
|
if(m_toolsList.isNull())
|
||||||
|
{
|
||||||
|
m_toolsList.reset(new QFileList());
|
||||||
|
}
|
||||||
|
m_toolsList->append(file);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -921,7 +906,7 @@ void MainWindow::init(void)
|
|||||||
if(val == 1)
|
if(val == 1)
|
||||||
{
|
{
|
||||||
m_preferences->setDisableWarnings(true);
|
m_preferences->setDisableWarnings(true);
|
||||||
PreferencesModel::savePreferences(m_preferences);
|
PreferencesModel::savePreferences(m_preferences.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -963,13 +948,13 @@ void MainWindow::init(void)
|
|||||||
if(val == 1)
|
if(val == 1)
|
||||||
{
|
{
|
||||||
m_preferences->setDisableWarnings(true);
|
m_preferences->setDisableWarnings(true);
|
||||||
PreferencesModel::savePreferences(m_preferences);
|
PreferencesModel::savePreferences(m_preferences.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qDebug(" ");
|
qDebug(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Finish initialization
|
// Finish initialization
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
@ -1019,7 +1004,7 @@ void MainWindow::init(void)
|
|||||||
{
|
{
|
||||||
qWarning("First run -> resetting update check now!");
|
qWarning("First run -> resetting update check now!");
|
||||||
m_recentlyUsed->setLastUpdateCheck(0);
|
m_recentlyUsed->setLastUpdateCheck(0);
|
||||||
RecentlyUsed::saveRecentlyUsed(m_recentlyUsed);
|
RecentlyUsed::saveRecentlyUsed(m_recentlyUsed.data());
|
||||||
}
|
}
|
||||||
else if(m_recentlyUsed->lastUpdateCheck() + 14 < x264_current_date_safe().toJulianDay())
|
else if(m_recentlyUsed->lastUpdateCheck() + 14 < x264_current_date_safe().toJulianDay())
|
||||||
{
|
{
|
||||||
@ -1035,8 +1020,19 @@ void MainWindow::init(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------
|
||||||
|
// Create the IPC listener thread
|
||||||
|
//---------------------------------------
|
||||||
|
|
||||||
|
if(m_ipcChannel)
|
||||||
|
{
|
||||||
|
m_ipcThread.reset(new IPCThread_Recv(m_ipcChannel));
|
||||||
|
connect(m_ipcThread.data(), SIGNAL(receivedCommand(int,QStringList,quint32)), this, SLOT(handleCommand(int,QStringList,quint32)), Qt::QueuedConnection);
|
||||||
|
m_ipcThread->start();
|
||||||
|
}
|
||||||
|
|
||||||
//Load queued jobs
|
//Load queued jobs
|
||||||
if(m_jobList->loadQueuedJobs(m_sysinfo) > 0)
|
if(m_jobList->loadQueuedJobs(m_sysinfo.data()) > 0)
|
||||||
{
|
{
|
||||||
m_label->setVisible(m_jobList->rowCount(QModelIndex()) == 0);
|
m_label->setVisible(m_jobList->rowCount(QModelIndex()) == 0);
|
||||||
m_jobList->clearQueuedJobs();
|
m_jobList->clearQueuedJobs();
|
||||||
@ -1141,7 +1137,7 @@ void MainWindow::handleCommand(const int &command, const QStringList &args, cons
|
|||||||
{
|
{
|
||||||
if(QFileInfo(args[0]).exists() && QFileInfo(args[0]).isFile())
|
if(QFileInfo(args[0]).exists() && QFileInfo(args[0]).isFile())
|
||||||
{
|
{
|
||||||
OptionsModel options(m_sysinfo);
|
OptionsModel options(m_sysinfo.data());
|
||||||
bool runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
bool runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
||||||
if(!(args[2].isEmpty() || X264_STRCMP(args[2], "-")))
|
if(!(args[2].isEmpty() || X264_STRCMP(args[2], "-")))
|
||||||
{
|
{
|
||||||
@ -1178,13 +1174,13 @@ void MainWindow::checkUpdates(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdaterDialog *updater = new UpdaterDialog(this, m_sysinfo, update_url);
|
UpdaterDialog *updater = new UpdaterDialog(this, m_sysinfo.data(), update_url);
|
||||||
const int ret = updater->exec();
|
const int ret = updater->exec();
|
||||||
|
|
||||||
if(updater->getSuccess())
|
if(updater->getSuccess())
|
||||||
{
|
{
|
||||||
m_recentlyUsed->setLastUpdateCheck(x264_current_date_safe().toJulianDay());
|
m_recentlyUsed->setLastUpdateCheck(x264_current_date_safe().toJulianDay());
|
||||||
RecentlyUsed::saveRecentlyUsed(m_recentlyUsed);
|
RecentlyUsed::saveRecentlyUsed(m_recentlyUsed.data());
|
||||||
if(QWidget *cornerWidget = ui->menubar->cornerWidget()) cornerWidget->hide();
|
if(QWidget *cornerWidget = ui->menubar->cornerWidget()) cornerWidget->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1273,7 +1269,7 @@ void MainWindow::closeEvent(QCloseEvent *e)
|
|||||||
if(QMessageBox::warning(this, tr("Jobs Are Running"), tr("<nobr>You still have running jobs, application will be minimized to notification area!<nobr>"), tr("OK"), tr("Don't Show Again")) == 1)
|
if(QMessageBox::warning(this, tr("Jobs Are Running"), tr("<nobr>You still have running jobs, application will be minimized to notification area!<nobr>"), tr("OK"), tr("Don't Show Again")) == 1)
|
||||||
{
|
{
|
||||||
m_preferences->setNoSystrayWarning(true);
|
m_preferences->setNoSystrayWarning(true);
|
||||||
PreferencesModel::savePreferences(m_preferences);
|
PreferencesModel::savePreferences(m_preferences.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hide();
|
hide();
|
||||||
@ -1400,7 +1396,7 @@ void MainWindow::dropEvent(QDropEvent *event)
|
|||||||
bool MainWindow::createJob(QString &sourceFileName, QString &outputFileName, OptionsModel *options, bool &runImmediately, const bool restart, int fileNo, int fileTotal, bool *applyToAll)
|
bool MainWindow::createJob(QString &sourceFileName, QString &outputFileName, OptionsModel *options, bool &runImmediately, const bool restart, int fileNo, int fileTotal, bool *applyToAll)
|
||||||
{
|
{
|
||||||
bool okay = false;
|
bool okay = false;
|
||||||
AddJobDialog *addDialog = new AddJobDialog(this, options, m_recentlyUsed, m_sysinfo, m_preferences);
|
AddJobDialog *addDialog = new AddJobDialog(this, options, m_recentlyUsed.data(), m_sysinfo.data(), m_preferences.data());
|
||||||
|
|
||||||
addDialog->setRunImmediately(runImmediately);
|
addDialog->setRunImmediately(runImmediately);
|
||||||
if(!sourceFileName.isEmpty()) addDialog->setSourceFile(sourceFileName);
|
if(!sourceFileName.isEmpty()) addDialog->setSourceFile(sourceFileName);
|
||||||
@ -1445,9 +1441,9 @@ bool MainWindow::createJobMultiple(const QStringList &filePathIn)
|
|||||||
{
|
{
|
||||||
runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
runImmediately = (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
||||||
QString sourceFileName(*iter), outputFileName;
|
QString sourceFileName(*iter), outputFileName;
|
||||||
if(createJob(sourceFileName, outputFileName, m_options, runImmediately, false, counter++, filePathIn.count(), &applyToAll))
|
if(createJob(sourceFileName, outputFileName, m_options.data(), runImmediately, false, counter++, filePathIn.count(), &applyToAll))
|
||||||
{
|
{
|
||||||
if(appendJob(sourceFileName, outputFileName, m_options, runImmediately))
|
if(appendJob(sourceFileName, outputFileName, m_options.data(), runImmediately))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1461,7 +1457,7 @@ bool MainWindow::createJobMultiple(const QStringList &filePathIn)
|
|||||||
const bool runImmediatelyTmp = runImmediately && (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
const bool runImmediatelyTmp = runImmediately && (countRunningJobs() < (m_preferences->getAutoRunNextJob() ? m_preferences->getMaxRunningJobCount() : 1));
|
||||||
const QString sourceFileName = *iter;
|
const QString sourceFileName = *iter;
|
||||||
const QString outputFileName = AddJobDialog::generateOutputFileName(sourceFileName, m_recentlyUsed->outputDirectory(), m_recentlyUsed->filterIndex(), m_preferences->getSaveToSourcePath());
|
const QString outputFileName = AddJobDialog::generateOutputFileName(sourceFileName, m_recentlyUsed->outputDirectory(), m_recentlyUsed->filterIndex(), m_preferences->getSaveToSourcePath());
|
||||||
if(!appendJob(sourceFileName, outputFileName, m_options, runImmediatelyTmp))
|
if(!appendJob(sourceFileName, outputFileName, m_options.data(), runImmediatelyTmp))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1477,7 +1473,7 @@ bool MainWindow::createJobMultiple(const QStringList &filePathIn)
|
|||||||
bool MainWindow::appendJob(const QString &sourceFileName, const QString &outputFileName, OptionsModel *options, const bool runImmediately)
|
bool MainWindow::appendJob(const QString &sourceFileName, const QString &outputFileName, OptionsModel *options, const bool runImmediately)
|
||||||
{
|
{
|
||||||
bool okay = false;
|
bool okay = false;
|
||||||
EncodeThread *thrd = new EncodeThread(sourceFileName, outputFileName, options, m_sysinfo, m_preferences);
|
EncodeThread *thrd = new EncodeThread(sourceFileName, outputFileName, options, m_sysinfo.data(), m_preferences.data());
|
||||||
QModelIndex newIndex = m_jobList->insertJob(thrd);
|
QModelIndex newIndex = m_jobList->insertJob(thrd);
|
||||||
|
|
||||||
if(newIndex.isValid())
|
if(newIndex.isValid())
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
//Qt
|
//Qt
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
|
||||||
class IPC;
|
|
||||||
class JobListModel;
|
class JobListModel;
|
||||||
class OptionsModel;
|
class OptionsModel;
|
||||||
class SysinfoModel;
|
class SysinfoModel;
|
||||||
@ -39,6 +38,7 @@ class InputEventFilter;
|
|||||||
class QModelIndex;
|
class QModelIndex;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class QSystemTrayIcon;
|
class QSystemTrayIcon;
|
||||||
|
class IPCThread_Recv;
|
||||||
enum JobStatus;
|
enum JobStatus;
|
||||||
|
|
||||||
namespace Ui
|
namespace Ui
|
||||||
@ -50,9 +50,11 @@ namespace MUtils
|
|||||||
{
|
{
|
||||||
namespace CPUFetaures
|
namespace CPUFetaures
|
||||||
{
|
{
|
||||||
struct _stuctName;
|
struct _cpu_info_t;
|
||||||
typedef struct _cpu_info_t cpu_info_t;
|
typedef struct _cpu_info_t cpu_info_t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class IPCChannel;
|
||||||
}
|
}
|
||||||
|
|
||||||
class MainWindow: public QMainWindow
|
class MainWindow: public QMainWindow
|
||||||
@ -60,9 +62,11 @@ class MainWindow: public QMainWindow
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures);
|
MainWindow(const MUtils::CPUFetaures::cpu_info_t &cpuFeatures, MUtils::IPCChannel *const ipcChannel);
|
||||||
~MainWindow(void);
|
~MainWindow(void);
|
||||||
|
|
||||||
|
typedef QList<QFile*> QFileList;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void closeEvent(QCloseEvent *e);
|
virtual void closeEvent(QCloseEvent *e);
|
||||||
virtual void showEvent(QShowEvent *e);
|
virtual void showEvent(QShowEvent *e);
|
||||||
@ -75,24 +79,25 @@ private:
|
|||||||
Ui::MainWindow *const ui;
|
Ui::MainWindow *const ui;
|
||||||
|
|
||||||
bool m_initialized;
|
bool m_initialized;
|
||||||
QLabel *m_label;
|
QScopedPointer<QLabel> m_label;
|
||||||
QTimer *m_fileTimer;
|
QScopedPointer<QTimer> m_fileTimer;
|
||||||
|
|
||||||
IPC *const m_ipc;
|
MUtils::IPCChannel *const m_ipcChannel;
|
||||||
QSystemTrayIcon *const m_sysTray;
|
QScopedPointer<IPCThread_Recv> m_ipcThread;
|
||||||
|
QScopedPointer<QSystemTrayIcon> m_sysTray;
|
||||||
|
|
||||||
InputEventFilter *m_inputFilter_jobList;
|
QScopedPointer<InputEventFilter> m_inputFilter_jobList;
|
||||||
InputEventFilter *m_inputFilter_version;
|
QScopedPointer<InputEventFilter> m_inputFilter_version;
|
||||||
InputEventFilter *m_inputFilter_checkUp;
|
QScopedPointer<InputEventFilter> m_inputFilter_checkUp;
|
||||||
|
|
||||||
JobListModel *m_jobList;
|
QScopedPointer<JobListModel> m_jobList;
|
||||||
OptionsModel *m_options;
|
QScopedPointer<OptionsModel> m_options;
|
||||||
QStringList *m_pendingFiles;
|
QScopedPointer<QStringList> m_pendingFiles;
|
||||||
QList<QFile*> m_toolsList;
|
QScopedPointer<QFileList> m_toolsList;
|
||||||
|
|
||||||
SysinfoModel *m_sysinfo;
|
QScopedPointer<SysinfoModel> m_sysinfo;
|
||||||
PreferencesModel *m_preferences;
|
QScopedPointer<PreferencesModel> m_preferences;
|
||||||
RecentlyUsed *m_recentlyUsed;
|
QScopedPointer<RecentlyUsed> m_recentlyUsed;
|
||||||
|
|
||||||
bool createJob(QString &sourceFileName, QString &outputFileName, OptionsModel *options, bool &runImmediately, const bool restart = false, int fileNo = -1, int fileTotal = 0, bool *applyToAll = NULL);
|
bool createJob(QString &sourceFileName, QString &outputFileName, OptionsModel *options, bool &runImmediately, const bool restart = false, int fileNo = -1, int fileTotal = 0, bool *applyToAll = NULL);
|
||||||
bool createJobMultiple(const QStringList &filePathIn);
|
bool createJobMultiple(const QStringList &filePathIn);
|
||||||
|
@ -22,10 +22,13 @@
|
|||||||
#include "win_updater.h"
|
#include "win_updater.h"
|
||||||
#include "UIC_win_updater.h"
|
#include "UIC_win_updater.h"
|
||||||
|
|
||||||
|
//Internal
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "model_sysinfo.h"
|
#include "model_sysinfo.h"
|
||||||
#include "thread_updater.h"
|
|
||||||
#include "checksum.h"
|
//MUtils
|
||||||
|
#include <MUtils/UpdateChecker.h>
|
||||||
|
#include <MUtils/Hash_Blake2.h>
|
||||||
|
|
||||||
#include <QMovie>
|
#include <QMovie>
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
@ -73,7 +76,7 @@ UpdaterDialog::UpdaterDialog(QWidget *parent, const SysinfoModel *sysinfo, const
|
|||||||
ui(new Ui::UpdaterDialog()),
|
ui(new Ui::UpdaterDialog()),
|
||||||
m_sysinfo(sysinfo),
|
m_sysinfo(sysinfo),
|
||||||
m_updateUrl(updateUrl),
|
m_updateUrl(updateUrl),
|
||||||
m_status(UpdateCheckThread::UpdateStatus_NotStartedYet),
|
m_status(MUtils::UpdateChecker::UpdateStatus_NotStartedYet),
|
||||||
m_thread(NULL),
|
m_thread(NULL),
|
||||||
m_updaterProcess(NULL),
|
m_updaterProcess(NULL),
|
||||||
m_success(false),
|
m_success(false),
|
||||||
@ -95,8 +98,8 @@ UpdaterDialog::UpdaterDialog(QWidget *parent, const SysinfoModel *sysinfo, const
|
|||||||
connect(ui->labelUrl, SIGNAL(linkActivated(QString)), this, SLOT(openUrl(QString)));
|
connect(ui->labelUrl, SIGNAL(linkActivated(QString)), this, SLOT(openUrl(QString)));
|
||||||
|
|
||||||
//Init animation
|
//Init animation
|
||||||
m_animator = new QMovie(":/images/loading.gif");
|
m_animator.reset(new QMovie(":/images/loading.gif"));
|
||||||
ui->labelLoadingCenter->setMovie(m_animator);
|
ui->labelLoadingCenter->setMovie(m_animator.data());
|
||||||
|
|
||||||
//Init buttons
|
//Init buttons
|
||||||
ui->buttonCancel->setEnabled(false);
|
ui->buttonCancel->setEnabled(false);
|
||||||
@ -109,25 +112,16 @@ UpdaterDialog::UpdaterDialog(QWidget *parent, const SysinfoModel *sysinfo, const
|
|||||||
|
|
||||||
UpdaterDialog::~UpdaterDialog(void)
|
UpdaterDialog::~UpdaterDialog(void)
|
||||||
{
|
{
|
||||||
if(m_thread)
|
if(!m_thread.isNull())
|
||||||
{
|
{
|
||||||
if(!m_thread->wait(1000))
|
if(!m_thread->wait(5000))
|
||||||
{
|
{
|
||||||
m_thread->terminate();
|
m_thread->terminate();
|
||||||
m_thread->wait();
|
m_thread->wait();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if((!m_keysFile.isEmpty()) && QFile::exists(m_keysFile))
|
cleanFiles();
|
||||||
{
|
|
||||||
QFile::setPermissions(m_keysFile, QFile::ReadOwner | QFile::WriteOwner);
|
|
||||||
QFile::remove(m_keysFile);
|
|
||||||
m_keysFile.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
X264_DELETE(m_thread);
|
|
||||||
X264_DELETE(m_animator);
|
|
||||||
|
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,6 +186,12 @@ void UpdaterDialog::keyPressEvent(QKeyEvent *event)
|
|||||||
|
|
||||||
void UpdaterDialog::initUpdate(void)
|
void UpdaterDialog::initUpdate(void)
|
||||||
{
|
{
|
||||||
|
//Clean up files from previous attempt
|
||||||
|
if(!m_binaries.isEmpty())
|
||||||
|
{
|
||||||
|
cleanFiles();
|
||||||
|
}
|
||||||
|
|
||||||
//Check binary files
|
//Check binary files
|
||||||
QString wgetBin, gpgvBin;
|
QString wgetBin, gpgvBin;
|
||||||
if(!checkBinaries(wgetBin, gpgvBin))
|
if(!checkBinaries(wgetBin, gpgvBin))
|
||||||
@ -222,11 +222,11 @@ void UpdaterDialog::initUpdate(void)
|
|||||||
//Create and setup thread
|
//Create and setup thread
|
||||||
if(!m_thread)
|
if(!m_thread)
|
||||||
{
|
{
|
||||||
m_thread = new UpdateCheckThread(wgetBin, gpgvBin, m_keysFile, false);
|
m_thread.reset(new MUtils::UpdateChecker(m_binaries.value("wget.exe"), m_binaries.value("gpgv.exe"), m_binaries.value("gpgv.gpg"), "Simple x264 Launcher", x264_version_build(), false));
|
||||||
connect(m_thread, SIGNAL(statusChanged(int)), this, SLOT(threadStatusChanged(int)));
|
connect(m_thread.data(), SIGNAL(statusChanged(int)), this, SLOT(threadStatusChanged(int)));
|
||||||
connect(m_thread, SIGNAL(finished()), this, SLOT(threadFinished()));
|
connect(m_thread.data(), SIGNAL(finished()), this, SLOT(threadFinished()));
|
||||||
connect(m_thread, SIGNAL(terminated()), this, SLOT(threadFinished()));
|
connect(m_thread.data(), SIGNAL(terminated()), this, SLOT(threadFinished()));
|
||||||
connect(m_thread, SIGNAL(messageLogged(QString)), this, SLOT(threadMessageLogged(QString)));
|
connect(m_thread.data(), SIGNAL(messageLogged(QString)), this, SLOT(threadMessageLogged(QString)));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Begin updater run
|
//Begin updater run
|
||||||
@ -254,7 +254,7 @@ void UpdaterDialog::checkForUpdates(void)
|
|||||||
ui->labelUrl->hide();
|
ui->labelUrl->hide();
|
||||||
|
|
||||||
//Update status
|
//Update status
|
||||||
threadStatusChanged(UpdateCheckThread::UpdateStatus_NotStartedYet);
|
threadStatusChanged(MUtils::UpdateChecker::UpdateStatus_NotStartedYet);
|
||||||
|
|
||||||
//Start animation
|
//Start animation
|
||||||
SHOW_ANIMATION(true);
|
SHOW_ANIMATION(true);
|
||||||
@ -267,46 +267,46 @@ void UpdaterDialog::checkForUpdates(void)
|
|||||||
m_logFile.clear();
|
m_logFile.clear();
|
||||||
|
|
||||||
//Start the updater thread
|
//Start the updater thread
|
||||||
QTimer::singleShot(250, m_thread, SLOT(start()));
|
QTimer::singleShot(250, m_thread.data(), SLOT(start()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdaterDialog::threadStatusChanged(int status)
|
void UpdaterDialog::threadStatusChanged(int status)
|
||||||
{
|
{
|
||||||
switch(m_status = status)
|
switch(m_status = status)
|
||||||
{
|
{
|
||||||
case UpdateCheckThread::UpdateStatus_NotStartedYet:
|
case MUtils::UpdateChecker::UpdateStatus_NotStartedYet:
|
||||||
UPDATE_ICON(1, "clock");
|
UPDATE_ICON(1, "clock");
|
||||||
UPDATE_ICON(2, "clock");
|
UPDATE_ICON(2, "clock");
|
||||||
UPDATE_ICON(3, "clock");
|
UPDATE_ICON(3, "clock");
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_CheckingConnection:
|
case MUtils::UpdateChecker::UpdateStatus_CheckingConnection:
|
||||||
UPDATE_ICON(1, "play");
|
UPDATE_ICON(1, "play");
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_FetchingUpdates:
|
case MUtils::UpdateChecker::UpdateStatus_FetchingUpdates:
|
||||||
UPDATE_ICON(1, "shield_green");
|
UPDATE_ICON(1, "shield_green");
|
||||||
UPDATE_TEXT(1, tr("Internet connection is working."));
|
UPDATE_TEXT(1, tr("Internet connection is working."));
|
||||||
UPDATE_ICON(2, "play");
|
UPDATE_ICON(2, "play");
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_ErrorNoConnection:
|
case MUtils::UpdateChecker::UpdateStatus_ErrorNoConnection:
|
||||||
UPDATE_ICON(1, "shield_error");
|
UPDATE_ICON(1, "shield_error");
|
||||||
UPDATE_TEXT(1, tr("Computer is currently offline!"));
|
UPDATE_TEXT(1, tr("Computer is currently offline!"));
|
||||||
UPDATE_ICON(2, "shield_grey");
|
UPDATE_ICON(2, "shield_grey");
|
||||||
UPDATE_ICON(3, "shield_grey");
|
UPDATE_ICON(3, "shield_grey");
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_ErrorConnectionTestFailed:
|
case MUtils::UpdateChecker::UpdateStatus_ErrorConnectionTestFailed:
|
||||||
UPDATE_ICON(1, "shield_error");
|
UPDATE_ICON(1, "shield_error");
|
||||||
UPDATE_TEXT(1, tr("Internet connectivity test failed!"));
|
UPDATE_TEXT(1, tr("Internet connectivity test failed!"));
|
||||||
UPDATE_ICON(2, "shield_grey");
|
UPDATE_ICON(2, "shield_grey");
|
||||||
UPDATE_ICON(3, "shield_grey");
|
UPDATE_ICON(3, "shield_grey");
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_ErrorFetchUpdateInfo:
|
case MUtils::UpdateChecker::UpdateStatus_ErrorFetchUpdateInfo:
|
||||||
UPDATE_ICON(2, "shield_error");
|
UPDATE_ICON(2, "shield_error");
|
||||||
UPDATE_TEXT(2, tr("Failed to download the update information!"));
|
UPDATE_TEXT(2, tr("Failed to download the update information!"));
|
||||||
UPDATE_ICON(3, "shield_grey");
|
UPDATE_ICON(3, "shield_grey");
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedUpdateAvailable:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedUpdateAvailable:
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedNoUpdates:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedNoUpdates:
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedNewVersionOlder:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedNewVersionOlder:
|
||||||
UPDATE_ICON(2, "shield_green");
|
UPDATE_ICON(2, "shield_green");
|
||||||
UPDATE_TEXT(2, tr("Update information received successfully."));
|
UPDATE_TEXT(2, tr("Update information received successfully."));
|
||||||
UPDATE_ICON(3, "play");
|
UPDATE_ICON(3, "play");
|
||||||
@ -332,16 +332,16 @@ void UpdaterDialog::updateFinished(void)
|
|||||||
{
|
{
|
||||||
switch(m_status)
|
switch(m_status)
|
||||||
{
|
{
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedUpdateAvailable:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedUpdateAvailable:
|
||||||
UPDATE_ICON(3, "shield_exclamation");
|
UPDATE_ICON(3, "shield_exclamation");
|
||||||
UPDATE_TEXT(3, tr("A newer version is available!"));
|
UPDATE_TEXT(3, tr("A newer version is available!"));
|
||||||
ui->buttonDownload->show();
|
ui->buttonDownload->show();
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedNoUpdates:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedNoUpdates:
|
||||||
UPDATE_ICON(3, "shield_green");
|
UPDATE_ICON(3, "shield_green");
|
||||||
UPDATE_TEXT(3, tr("Your version is up-to-date."));
|
UPDATE_TEXT(3, tr("Your version is up-to-date."));
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedNewVersionOlder:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedNewVersionOlder:
|
||||||
UPDATE_ICON(3, "shield_blue");
|
UPDATE_ICON(3, "shield_blue");
|
||||||
UPDATE_TEXT(3, tr("You are using a pre-release version!"));
|
UPDATE_TEXT(3, tr("You are using a pre-release version!"));
|
||||||
break;
|
break;
|
||||||
@ -353,16 +353,16 @@ void UpdaterDialog::updateFinished(void)
|
|||||||
//Show update info or retry button
|
//Show update info or retry button
|
||||||
switch(m_status)
|
switch(m_status)
|
||||||
{
|
{
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedUpdateAvailable:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedUpdateAvailable:
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedNoUpdates:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedNoUpdates:
|
||||||
case UpdateCheckThread::UpdateStatus_CompletedNewVersionOlder:
|
case MUtils::UpdateChecker::UpdateStatus_CompletedNewVersionOlder:
|
||||||
SHOW_ANIMATION(false);
|
SHOW_ANIMATION(false);
|
||||||
ui->labelBuildNo->setText(tr("Installed build is #%1 | Latest build is #%2").arg(QString::number(x264_version_build()), QString::number(m_thread->getUpdateInfo()->m_buildNo)));
|
ui->labelBuildNo->setText(tr("Installed build is #%1 | Latest build is #%2").arg(QString::number(x264_version_build()), QString::number(m_thread->getUpdateInfo()->getBuildNo())));
|
||||||
ui->labelUrl->setText(QString("<a href=\"%1\">%1</a>").arg(m_thread->getUpdateInfo()->m_downloadSite));
|
ui->labelUrl->setText(QString("<a href=\"%1\">%1</a>").arg(m_thread->getUpdateInfo()->getDownloadSite()));
|
||||||
break;
|
break;
|
||||||
case UpdateCheckThread::UpdateStatus_ErrorNoConnection:
|
case MUtils::UpdateChecker::UpdateStatus_ErrorNoConnection:
|
||||||
case UpdateCheckThread::UpdateStatus_ErrorConnectionTestFailed:
|
case MUtils::UpdateChecker::UpdateStatus_ErrorConnectionTestFailed:
|
||||||
case UpdateCheckThread::UpdateStatus_ErrorFetchUpdateInfo:
|
case MUtils::UpdateChecker::UpdateStatus_ErrorFetchUpdateInfo:
|
||||||
m_animator->stop();
|
m_animator->stop();
|
||||||
ui->buttonRetry->show();
|
ui->buttonRetry->show();
|
||||||
break;
|
break;
|
||||||
@ -399,7 +399,7 @@ void UpdaterDialog::installUpdate(void)
|
|||||||
ui->buttonCancel->setEnabled(false);
|
ui->buttonCancel->setEnabled(false);
|
||||||
SHOW_ANIMATION(true);
|
SHOW_ANIMATION(true);
|
||||||
|
|
||||||
const UpdateInfo *updateInfo = m_thread->getUpdateInfo();
|
const MUtils::UpdateCheckerInfo *updateInfo = m_thread->getUpdateInfo();
|
||||||
|
|
||||||
QProcess process;
|
QProcess process;
|
||||||
QStringList args;
|
QStringList args;
|
||||||
@ -410,14 +410,14 @@ void UpdaterDialog::installUpdate(void)
|
|||||||
connect(&process, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
|
connect(&process, SIGNAL(error(QProcess::ProcessError)), &loop, SLOT(quit()));
|
||||||
connect(&process, SIGNAL(finished(int,QProcess::ExitStatus)), &loop, SLOT(quit()));
|
connect(&process, SIGNAL(finished(int,QProcess::ExitStatus)), &loop, SLOT(quit()));
|
||||||
|
|
||||||
args << QString("/Location=%1").arg(updateInfo->m_downloadAddress);
|
args << QString("/Location=%1").arg(updateInfo->getDownloadAddress());
|
||||||
args << QString("/Filename=%1").arg(updateInfo->m_downloadFilename);
|
args << QString("/Filename=%1").arg(updateInfo->getDownloadFilename());
|
||||||
args << QString("/TicketID=%1").arg(updateInfo->m_downloadFilecode);
|
args << QString("/TicketID=%1").arg(updateInfo->getDownloadFilecode());
|
||||||
args << QString("/ToFolder=%1").arg(QDir::toNativeSeparators(QDir(QApplication::applicationDirPath()).canonicalPath()));
|
args << QString("/ToFolder=%1").arg(QDir::toNativeSeparators(QDir(QApplication::applicationDirPath()).canonicalPath()));
|
||||||
args << QString("/ToExFile=%1.exe").arg(QFileInfo(QFileInfo(QApplication::applicationFilePath()).canonicalFilePath()).completeBaseName());
|
args << QString("/ToExFile=%1.exe").arg(QFileInfo(QFileInfo(QApplication::applicationFilePath()).canonicalFilePath()).completeBaseName());
|
||||||
args << QString("/AppTitle=Simple x264 Launcher (Build #%1)").arg(QString::number(updateInfo->m_buildNo));
|
args << QString("/AppTitle=Simple x264 Launcher (Build #%1)").arg(QString::number(updateInfo->getBuildNo()));
|
||||||
|
|
||||||
process.start(m_wupdFile, args);
|
process.start(m_binaries.value("wupd.exe"), args);
|
||||||
if(!process.waitForStarted())
|
if(!process.waitForStarted())
|
||||||
{
|
{
|
||||||
QApplication::restoreOverrideCursor();
|
QApplication::restoreOverrideCursor();
|
||||||
@ -456,47 +456,37 @@ void UpdaterDialog::installUpdate(void)
|
|||||||
bool UpdaterDialog::checkBinaries(QString &wgetBin, QString &gpgvBin)
|
bool UpdaterDialog::checkBinaries(QString &wgetBin, QString &gpgvBin)
|
||||||
{
|
{
|
||||||
qDebug("[File Verification]");
|
qDebug("[File Verification]");
|
||||||
QMap<QString, QString> binaries;
|
m_binaries.clear();
|
||||||
|
|
||||||
m_keysFile.clear();
|
|
||||||
m_wupdFile.clear();
|
|
||||||
wgetBin.clear();
|
|
||||||
gpgvBin.clear();
|
|
||||||
|
|
||||||
bool okay = true;
|
|
||||||
|
|
||||||
|
//Validate hashes first
|
||||||
|
const QString tempPath = MUtils::temp_folder();
|
||||||
for(size_t i = 0; BINARIES[i].name; i++)
|
for(size_t i = 0; BINARIES[i].name; i++)
|
||||||
{
|
{
|
||||||
const QString binPath = QString("%1/toolset/common/%2").arg(m_sysinfo->getAppPath(), QString::fromLatin1(BINARIES[i].name));
|
const QString orgName = QString::fromLatin1(BINARIES[i].name);
|
||||||
if(okay = okay && checkFileHash(binPath, BINARIES[i].hash))
|
const QString binPath = QString("%1/toolset/common/%2").arg(m_sysinfo->getAppPath(), orgName);
|
||||||
|
const QString outPath = QString("%1/%2_%3.%4").arg(tempPath, QFileInfo(orgName).baseName(), MUtils::rand_str(), QFileInfo(orgName).suffix());
|
||||||
|
if(!checkFileHash(binPath, BINARIES[i].hash))
|
||||||
{
|
{
|
||||||
binaries.insert(BINARIES[i].name, binPath);
|
qWarning("Verification of '%s' has failed!", MUTILS_UTF8(orgName));
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
if(!QFile::copy(binPath, outPath))
|
||||||
|
{
|
||||||
|
qWarning("Copying of '%s' has failed!", MUTILS_UTF8(orgName));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QFile::setPermissions(outPath, QFile::ReadOwner);
|
||||||
|
m_binaries.insert(BINARIES[i].name, outPath);
|
||||||
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(okay)
|
return true;
|
||||||
{
|
|
||||||
wgetBin = binaries.value("wget.exe");
|
|
||||||
gpgvBin = binaries.value("gpgv.exe");
|
|
||||||
|
|
||||||
m_wupdFile = binaries.value("wupd.exe");
|
|
||||||
m_keysFile = QString("%1/%2.gpg").arg(x264_temp_directory(), x264_rand_str());
|
|
||||||
|
|
||||||
if(okay = QFile::copy(binaries.value("gpgv.gpg"), m_keysFile))
|
|
||||||
{
|
|
||||||
QFile::setPermissions(m_keysFile, QFile::ReadOwner);
|
|
||||||
}
|
|
||||||
qDebug("%s\n", okay ? "Completed." : "Failed to copy GPG file!");
|
|
||||||
}
|
|
||||||
|
|
||||||
return okay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UpdaterDialog::checkFileHash(const QString &filePath, const char *expectedHash)
|
bool UpdaterDialog::checkFileHash(const QString &filePath, const char *expectedHash)
|
||||||
{
|
{
|
||||||
qDebug("Checking file: %s", filePath.toUtf8().constData());
|
qDebug("Checking file: %s", filePath.toUtf8().constData());
|
||||||
QBlake2Checksum checksum2;
|
MUtils::Hash::Blake2 checksum2;
|
||||||
QFile file(filePath);
|
QFile file(filePath);
|
||||||
if(file.open(QIODevice::ReadOnly))
|
if(file.open(QIODevice::ReadOnly))
|
||||||
{
|
{
|
||||||
@ -516,3 +506,18 @@ bool UpdaterDialog::checkFileHash(const QString &filePath, const char *expectedH
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UpdaterDialog::cleanFiles(void)
|
||||||
|
{
|
||||||
|
const QStringList keys = m_binaries.keys();
|
||||||
|
foreach(const QString &key, keys)
|
||||||
|
{
|
||||||
|
const QString fileName = m_binaries.value(key);
|
||||||
|
QFile::setPermissions(fileName, QFile::ReadOwner | QFile::WriteOwner);
|
||||||
|
if(!QFile::remove(fileName))
|
||||||
|
{
|
||||||
|
qWarning("Failed to remove file: %s", MUTILS_UTF8(fileName));
|
||||||
|
}
|
||||||
|
m_binaries.remove(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -22,9 +22,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
class QMovie;
|
class QMovie;
|
||||||
class UpdateCheckThread;
|
|
||||||
class SysinfoModel;
|
class SysinfoModel;
|
||||||
|
|
||||||
namespace Ui
|
namespace Ui
|
||||||
@ -32,6 +32,11 @@ namespace Ui
|
|||||||
class UpdaterDialog;
|
class UpdaterDialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace MUtils
|
||||||
|
{
|
||||||
|
class UpdateChecker;
|
||||||
|
}
|
||||||
|
|
||||||
class UpdaterDialog : public QDialog
|
class UpdaterDialog : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -74,6 +79,7 @@ private:
|
|||||||
|
|
||||||
bool checkBinaries(QString &wgetBin, QString &gpgvBin);
|
bool checkBinaries(QString &wgetBin, QString &gpgvBin);
|
||||||
bool checkFileHash(const QString &filePath, const char *expectedHash);
|
bool checkFileHash(const QString &filePath, const char *expectedHash);
|
||||||
|
void cleanFiles(void);
|
||||||
|
|
||||||
const SysinfoModel *const m_sysinfo;
|
const SysinfoModel *const m_sysinfo;
|
||||||
const char *const m_updateUrl;
|
const char *const m_updateUrl;
|
||||||
@ -81,11 +87,11 @@ private:
|
|||||||
bool m_firstShow;
|
bool m_firstShow;
|
||||||
bool m_success;
|
bool m_success;
|
||||||
|
|
||||||
QMovie *m_animator;
|
QScopedPointer<QMovie> m_animator;
|
||||||
UpdateCheckThread *m_thread;
|
QScopedPointer<MUtils::UpdateChecker> m_thread;
|
||||||
|
|
||||||
unsigned long m_updaterProcess;
|
unsigned long m_updaterProcess;
|
||||||
QStringList m_logFile;
|
QStringList m_logFile;
|
||||||
QString m_keysFile;
|
QMap<QString,QString> m_binaries;
|
||||||
QString m_wupdFile;
|
|
||||||
int m_status;
|
int m_status;
|
||||||
};
|
};
|
||||||
|
@ -266,6 +266,14 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats"
|
|||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="src\thread_ipc_recv.h">
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
<ClInclude Include="tmp\x264_launcher\UIC_win_about.h" />
|
<ClInclude Include="tmp\x264_launcher\UIC_win_about.h" />
|
||||||
<ClInclude Include="tmp\x264_launcher\UIC_win_addJob.h" />
|
<ClInclude Include="tmp\x264_launcher\UIC_win_addJob.h" />
|
||||||
<ClInclude Include="tmp\x264_launcher\UIC_win_editor.h" />
|
<ClInclude Include="tmp\x264_launcher\UIC_win_editor.h" />
|
||||||
@ -331,9 +339,7 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats"
|
|||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
<ClInclude Include="resource.h" />
|
<ClInclude Include="resource.h" />
|
||||||
<ClInclude Include="src\3rd_party\avisynth_c.h" />
|
<ClInclude Include="src\3rd_party\avisynth_c.h" />
|
||||||
<ClInclude Include="src\3rd_party\blake2.h" />
|
|
||||||
<ClInclude Include="src\binaries.h" />
|
<ClInclude Include="src\binaries.h" />
|
||||||
<ClInclude Include="src\checksum.h" />
|
|
||||||
<ClInclude Include="src\cli.h" />
|
<ClInclude Include="src\cli.h" />
|
||||||
<ClInclude Include="src\encoder_abstract.h" />
|
<ClInclude Include="src\encoder_abstract.h" />
|
||||||
<ClInclude Include="src\encoder_factory.h" />
|
<ClInclude Include="src\encoder_factory.h" />
|
||||||
@ -392,14 +398,6 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats"
|
|||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
<CustomBuild Include="src\thread_updater.h">
|
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
|
|
||||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp"</Message>
|
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp;%(Outputs)</Outputs>
|
|
||||||
</CustomBuild>
|
|
||||||
<CustomBuild Include="src\tool_abstract.h">
|
<CustomBuild Include="src\tool_abstract.h">
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\$(ProjectName)\MOC_%(Filename).cpp" "%(FullPath)"</Command>
|
||||||
@ -419,9 +417,7 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats"
|
|||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="src\3rd_party\blake2.c" />
|
|
||||||
<ClCompile Include="src\binaries.cpp" />
|
<ClCompile Include="src\binaries.cpp" />
|
||||||
<ClCompile Include="src\checksum.cpp" />
|
|
||||||
<ClCompile Include="src\encoder_abstract.cpp" />
|
<ClCompile Include="src\encoder_abstract.cpp" />
|
||||||
<ClCompile Include="src\encoder_factory.cpp" />
|
<ClCompile Include="src\encoder_factory.cpp" />
|
||||||
<ClCompile Include="src\encoder_x264.cpp" />
|
<ClCompile Include="src\encoder_x264.cpp" />
|
||||||
@ -442,8 +438,8 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats"
|
|||||||
<ClCompile Include="src\thread_encode.cpp" />
|
<ClCompile Include="src\thread_encode.cpp" />
|
||||||
<ClCompile Include="src\global.cpp" />
|
<ClCompile Include="src\global.cpp" />
|
||||||
<ClCompile Include="src\main.cpp" />
|
<ClCompile Include="src\main.cpp" />
|
||||||
|
<ClCompile Include="src\thread_ipc_recv.cpp" />
|
||||||
<ClCompile Include="src\thread_ipc_send.cpp" />
|
<ClCompile Include="src\thread_ipc_send.cpp" />
|
||||||
<ClCompile Include="src\thread_updater.cpp" />
|
|
||||||
<ClCompile Include="src\thread_vapoursynth.cpp" />
|
<ClCompile Include="src\thread_vapoursynth.cpp" />
|
||||||
<ClCompile Include="src\tool_abstract.cpp" />
|
<ClCompile Include="src\tool_abstract.cpp" />
|
||||||
<ClCompile Include="src\win_about.cpp" />
|
<ClCompile Include="src\win_about.cpp" />
|
||||||
@ -459,8 +455,8 @@ copy /Y "$(QTDIR)\plugins\imageformats\qgif4.dll" "$(TargetDir)\imageformats"
|
|||||||
<ClCompile Include="tmp\x264_launcher\MOC_model_logFile.cpp" />
|
<ClCompile Include="tmp\x264_launcher\MOC_model_logFile.cpp" />
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_avisynth.cpp" />
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_avisynth.cpp" />
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_encode.cpp" />
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_encode.cpp" />
|
||||||
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_ipc_recv.cpp" />
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_ipc_send.cpp" />
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_ipc_send.cpp" />
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_updater.cpp" />
|
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_vapoursynth.cpp" />
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_vapoursynth.cpp" />
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_tool_abstract.cpp" />
|
<ClCompile Include="tmp\x264_launcher\MOC_tool_abstract.cpp" />
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_win_about.cpp" />
|
<ClCompile Include="tmp\x264_launcher\MOC_win_about.cpp" />
|
||||||
|
@ -22,9 +22,6 @@
|
|||||||
<Filter Include="Assembly">
|
<Filter Include="Assembly">
|
||||||
<UniqueIdentifier>{2c9c8836-2259-4412-894e-7cc32bef99de}</UniqueIdentifier>
|
<UniqueIdentifier>{2c9c8836-2259-4412-894e-7cc32bef99de}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Source Files\3rd Party">
|
|
||||||
<UniqueIdentifier>{d2b38527-adfe-4b94-bfa5-3b108540b99c}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="Header Files\3rd Party">
|
<Filter Include="Header Files\3rd Party">
|
||||||
<UniqueIdentifier>{96b6acbb-5482-407a-8c18-381ec99d13e5}</UniqueIdentifier>
|
<UniqueIdentifier>{96b6acbb-5482-407a-8c18-381ec99d13e5}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@ -69,12 +66,6 @@
|
|||||||
<ClInclude Include="src\3rd_party\avisynth_c.h">
|
<ClInclude Include="src\3rd_party\avisynth_c.h">
|
||||||
<Filter>Header Files\3rd Party</Filter>
|
<Filter>Header Files\3rd Party</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="src\3rd_party\blake2.h">
|
|
||||||
<Filter>Header Files\3rd Party</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\checksum.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="src\cli.h">
|
<ClInclude Include="src\cli.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@ -129,7 +120,7 @@
|
|||||||
<ClInclude Include="tmp\x264_launcher\UIC_win_updater.h">
|
<ClInclude Include="tmp\x264_launcher\UIC_win_updater.h">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>Generated Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="src\thread_ipc_send.h">
|
<ClInclude Include="src\thread_ipc_recv.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
@ -188,15 +179,6 @@
|
|||||||
<ClCompile Include="src\win_updater.cpp">
|
<ClCompile Include="src\win_updater.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="src\checksum.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="src\3rd_party\blake2.c">
|
|
||||||
<Filter>Source Files\3rd Party</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="src\thread_updater.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="src\binaries.cpp">
|
<ClCompile Include="src\binaries.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -245,12 +227,6 @@
|
|||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_encode.cpp">
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_encode.cpp">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>Generated Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_updater.cpp">
|
|
||||||
<Filter>Generated Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_thread_vapoursynth.cpp">
|
|
||||||
<Filter>Generated Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="tmp\x264_launcher\MOC_tool_abstract.cpp">
|
<ClCompile Include="tmp\x264_launcher\MOC_tool_abstract.cpp">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>Generated Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -290,6 +266,15 @@
|
|||||||
<ClCompile Include="tmp\x264_launcher\MOC_model_jobList.cpp">
|
<ClCompile Include="tmp\x264_launcher\MOC_model_jobList.cpp">
|
||||||
<Filter>Generated Files</Filter>
|
<Filter>Generated Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="src\thread_ipc_recv.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_ipc_recv.cpp">
|
||||||
|
<Filter>Generated Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="tmp\x264_launcher\MOC_thread_vapoursynth.cpp">
|
||||||
|
<Filter>Generated Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CustomBuild Include="src\win_main.h">
|
<CustomBuild Include="src\win_main.h">
|
||||||
@ -346,9 +331,6 @@
|
|||||||
<CustomBuild Include="src\win_updater.h">
|
<CustomBuild Include="src\win_updater.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
<CustomBuild Include="src\thread_updater.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</CustomBuild>
|
|
||||||
<CustomBuild Include="src\tool_abstract.h">
|
<CustomBuild Include="src\tool_abstract.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
@ -361,6 +343,9 @@
|
|||||||
<CustomBuild Include="src\input_filter.h">
|
<CustomBuild Include="src\input_filter.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="src\thread_ipc_send.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</CustomBuild>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="x264_launcher.rc">
|
<ResourceCompile Include="x264_launcher.rc">
|
||||||
|
Loading…
Reference in New Issue
Block a user