Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
github_28344065
scrcpy
提交
66f45f9d
S
scrcpy
项目概览
github_28344065
/
scrcpy
与 Fork 源项目一致
从无法访问的项目Fork
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scrcpy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
66f45f9d
编写于
8月 12, 2018
作者:
N
npes87184
提交者:
Romain Vimont
8月 15, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support drag&drop a file to transfer it to device
Signed-off-by:
N
npes87184
<
npes87184@gmail.com
>
上级
aa97eed2
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
111 addition
and
42 deletion
+111
-42
app/src/device.h
app/src/device.h
+1
-0
app/src/file_handler.c
app/src/file_handler.c
+85
-34
app/src/file_handler.h
app/src/file_handler.h
+11
-6
app/src/scrcpy.c
app/src/scrcpy.c
+14
-2
未找到文件。
app/src/device.h
浏览文件 @
66f45f9d
...
...
@@ -7,6 +7,7 @@
#include "net.h"
#define DEVICE_NAME_FIELD_LENGTH 64
#define DEVICE_SDCARD_PATH "/sdcard/"
// name must be at least DEVICE_NAME_FIELD_LENGTH bytes
SDL_bool
device_read_info
(
socket_t
device_socket
,
char
*
name
,
struct
size
*
frame_size
);
...
...
app/src/file_handler.c
浏览文件 @
66f45f9d
...
...
@@ -2,57 +2,77 @@
#include <string.h>
#include "command.h"
#include "device.h"
#include "lockutil.h"
#include "log.h"
// NOTE(adopi) this can be more generic:
// it could be used with a command queue instead of a filename queue
// then we would have a generic invoker (useful if we want to handle more async commands)
struct
request
{
file_handler_action_t
action
;
const
char
*
file
;
};
SDL_bool
file_queue_is_empty
(
const
struct
file_queue
*
queue
)
{
static
struct
request
*
request_new
(
file_handler_action_t
action
,
const
char
*
file
)
{
struct
request
*
req
=
SDL_malloc
(
sizeof
(
*
req
));
if
(
!
req
)
{
return
NULL
;
}
req
->
action
=
action
;
req
->
file
=
file
;
return
req
;
}
static
void
request_free
(
struct
request
*
req
)
{
if
(
!
req
)
{
return
;
}
SDL_free
((
void
*
)
req
->
file
);
SDL_free
((
void
*
)
req
);
}
SDL_bool
request_queue_is_empty
(
const
struct
request_queue
*
queue
)
{
return
queue
->
head
==
queue
->
tail
;
}
SDL_bool
file_queue_is_full
(
const
struct
file
_queue
*
queue
)
{
return
(
queue
->
head
+
1
)
%
FILE
_QUEUE_SIZE
==
queue
->
tail
;
SDL_bool
request_queue_is_full
(
const
struct
request
_queue
*
queue
)
{
return
(
queue
->
head
+
1
)
%
REQUEST
_QUEUE_SIZE
==
queue
->
tail
;
}
SDL_bool
file_queue_init
(
struct
file
_queue
*
queue
)
{
SDL_bool
request_queue_init
(
struct
request
_queue
*
queue
)
{
queue
->
head
=
0
;
queue
->
tail
=
0
;
return
SDL_TRUE
;
}
void
file_queue_destroy
(
struct
file
_queue
*
queue
)
{
void
request_queue_destroy
(
struct
request
_queue
*
queue
)
{
int
i
=
queue
->
tail
;
while
(
i
!=
queue
->
head
)
{
SDL_free
(
queue
->
data
[
i
]);
i
=
(
i
+
1
)
%
FILE
_QUEUE_SIZE
;
request_free
(
queue
->
reqs
[
i
]);
i
=
(
i
+
1
)
%
REQUEST
_QUEUE_SIZE
;
}
}
SDL_bool
file_queue_push
(
struct
file_queue
*
queue
,
const
char
*
file
)
{
if
(
file
_queue_is_full
(
queue
))
{
SDL_bool
request_queue_push
(
struct
request_queue
*
queue
,
struct
request
*
req
)
{
if
(
request
_queue_is_full
(
queue
))
{
return
SDL_FALSE
;
}
queue
->
data
[
queue
->
head
]
=
SDL_strdup
(
file
)
;
queue
->
head
=
(
queue
->
head
+
1
)
%
FILE
_QUEUE_SIZE
;
queue
->
reqs
[
queue
->
head
]
=
req
;
queue
->
head
=
(
queue
->
head
+
1
)
%
REQUEST
_QUEUE_SIZE
;
return
SDL_TRUE
;
}
SDL_bool
file_queue_take
(
struct
file_queue
*
queue
,
char
**
file
)
{
if
(
file
_queue_is_empty
(
queue
))
{
SDL_bool
request_queue_take
(
struct
request_queue
*
queue
,
struct
request
**
req
)
{
if
(
request
_queue_is_empty
(
queue
))
{
return
SDL_FALSE
;
}
// transfer ownership
*
file
=
queue
->
data
[
queue
->
tail
];
queue
->
tail
=
(
queue
->
tail
+
1
)
%
FILE
_QUEUE_SIZE
;
*
req
=
queue
->
reqs
[
queue
->
tail
];
queue
->
tail
=
(
queue
->
tail
+
1
)
%
REQUEST
_QUEUE_SIZE
;
return
SDL_TRUE
;
}
SDL_bool
file_handler_init
(
struct
file_handler
*
file_handler
,
const
char
*
serial
)
{
if
(
!
file
_queue_init
(
&
file_handler
->
queue
))
{
if
(
!
request
_queue_init
(
&
file_handler
->
queue
))
{
return
SDL_FALSE
;
}
...
...
@@ -88,11 +108,21 @@ SDL_bool file_handler_init(struct file_handler *file_handler, const char *serial
void
file_handler_destroy
(
struct
file_handler
*
file_handler
)
{
SDL_DestroyCond
(
file_handler
->
event_cond
);
SDL_DestroyMutex
(
file_handler
->
mutex
);
file
_queue_destroy
(
&
file_handler
->
queue
);
request
_queue_destroy
(
&
file_handler
->
queue
);
SDL_free
((
void
*
)
file_handler
->
serial
);
}
SDL_bool
file_handler_do
(
struct
file_handler
*
file_handler
,
const
char
*
file
)
{
static
process_t
install_apk
(
const
char
*
serial
,
const
char
*
file
)
{
return
adb_install
(
serial
,
file
);
}
static
process_t
push_file
(
const
char
*
serial
,
const
char
*
file
)
{
return
adb_push
(
serial
,
file
,
DEVICE_SDCARD_PATH
);
}
SDL_bool
file_handler_request
(
struct
file_handler
*
file_handler
,
file_handler_action_t
action
,
const
char
*
file
)
{
SDL_bool
res
;
// start file_handler if it's used for the first time
...
...
@@ -103,9 +133,16 @@ SDL_bool file_handler_do(struct file_handler *file_handler, const char *file) {
file_handler
->
initialized
=
SDL_TRUE
;
}
LOGI
(
"Request to %s %s"
,
action
==
ACTION_INSTALL_APK
?
"install"
:
"push"
,
file
);
struct
request
*
req
=
request_new
(
action
,
file
);
if
(
!
req
)
{
LOGE
(
"Could not create request"
);
return
SDL_FALSE
;
}
mutex_lock
(
file_handler
->
mutex
);
SDL_bool
was_empty
=
file
_queue_is_empty
(
&
file_handler
->
queue
);
res
=
file_queue_push
(
&
file_handler
->
queue
,
file
);
SDL_bool
was_empty
=
request
_queue_is_empty
(
&
file_handler
->
queue
);
res
=
request_queue_push
(
&
file_handler
->
queue
,
req
);
if
(
was_empty
)
{
cond_signal
(
file_handler
->
event_cond
);
}
...
...
@@ -119,7 +156,7 @@ static int run_file_handler(void *data) {
for
(;;)
{
mutex_lock
(
file_handler
->
mutex
);
file_handler
->
current_process
=
PROCESS_NONE
;
while
(
!
file_handler
->
stopped
&&
file
_queue_is_empty
(
&
file_handler
->
queue
))
{
while
(
!
file_handler
->
stopped
&&
request
_queue_is_empty
(
&
file_handler
->
queue
))
{
cond_wait
(
file_handler
->
event_cond
,
file_handler
->
mutex
);
}
if
(
file_handler
->
stopped
)
{
...
...
@@ -127,25 +164,39 @@ static int run_file_handler(void *data) {
mutex_unlock
(
file_handler
->
mutex
);
break
;
}
char
*
current_apk
;
struct
request
*
req
;
#ifdef BUILD_DEBUG
bool
non_empty
=
file_queue_take
(
&
file_handler
->
queue
,
&
current_apk
);
bool
non_empty
=
request_queue_take
(
&
file_handler
->
queue
,
&
req
);
SDL_assert
(
non_empty
);
#else
file_queue_take
(
&
file_handler
->
queue
,
&
current_apk
);
request_queue_take
(
&
file_handler
->
queue
,
&
req
);
#endif
LOGI
(
"Installing %s..."
,
current_apk
);
process_t
process
=
adb_install
(
file_handler
->
serial
,
current_apk
);
process_t
process
;
if
(
req
->
action
==
ACTION_INSTALL_APK
)
{
LOGI
(
"Installing %s..."
,
req
->
file
);
process
=
install_apk
(
file_handler
->
serial
,
req
->
file
);
}
else
{
LOGI
(
"Pushing %s..."
,
req
->
file
);
process
=
push_file
(
file_handler
->
serial
,
req
->
file
);
}
file_handler
->
current_process
=
process
;
mutex_unlock
(
file_handler
->
mutex
);
if
(
process_check_success
(
process
,
"adb install"
))
{
LOGI
(
"%s installed successfully"
,
current_apk
);
if
(
req
->
action
==
ACTION_INSTALL_APK
)
{
if
(
process_check_success
(
process
,
"adb install"
))
{
LOGI
(
"%s successfully installed"
,
req
->
file
);
}
else
{
LOGE
(
"Failed to install %s"
,
req
->
file
);
}
}
else
{
LOGE
(
"Failed to install %s"
,
current_apk
);
if
(
process_check_success
(
process
,
"adb push"
))
{
LOGI
(
"%s successfully pushed to /sdcard/"
,
req
->
file
);
}
else
{
LOGE
(
"Failed to push %s to /sdcard/"
,
req
->
file
);
}
}
SDL_free
(
current_apk
);
request_free
(
req
);
}
return
0
;
}
...
...
app/src/file_handler.h
浏览文件 @
66f45f9d
...
...
@@ -6,12 +6,15 @@
#include <SDL2/SDL_thread.h>
#include "command.h"
#define
FILE
_QUEUE_SIZE 16
#define
REQUEST
_QUEUE_SIZE 16
// NOTE(AdoPi) file_queue and control_event can use a generic queue
typedef
enum
{
ACTION_INSTALL_APK
,
ACTION_PUSH_FILE
,
}
file_handler_action_t
;
struct
file
_queue
{
char
*
data
[
FILE
_QUEUE_SIZE
];
struct
request
_queue
{
struct
request
*
reqs
[
REQUEST
_QUEUE_SIZE
];
int
tail
;
int
head
;
};
...
...
@@ -24,7 +27,7 @@ struct file_handler {
SDL_bool
stopped
;
SDL_bool
initialized
;
process_t
current_process
;
struct
file
_queue
queue
;
struct
request
_queue
queue
;
};
SDL_bool
file_handler_init
(
struct
file_handler
*
file_handler
,
const
char
*
serial
);
...
...
@@ -34,6 +37,8 @@ SDL_bool file_handler_start(struct file_handler *file_handler);
void
file_handler_stop
(
struct
file_handler
*
file_handler
);
void
file_handler_join
(
struct
file_handler
*
file_handler
);
SDL_bool
file_handler_do
(
struct
file_handler
*
file_handler
,
const
char
*
filename
);
SDL_bool
file_handler_request
(
struct
file_handler
*
file_handler
,
file_handler_action_t
action
,
const
char
*
file
);
#endif
app/src/scrcpy.c
浏览文件 @
66f45f9d
...
...
@@ -56,6 +56,11 @@ static int event_watcher(void *data, SDL_Event *event) {
}
#endif
static
SDL_bool
is_apk
(
const
char
*
file
)
{
const
char
*
ext
=
strrchr
(
file
,
'.'
);
return
ext
&&
!
strcmp
(
ext
,
".apk"
);
}
static
SDL_bool
event_loop
(
void
)
{
#ifdef CONTINUOUS_RESIZING_WORKAROUND
SDL_AddEventWatch
(
event_watcher
,
NULL
);
...
...
@@ -104,9 +109,16 @@ static SDL_bool event_loop(void) {
case
SDL_MOUSEBUTTONUP
:
input_manager_process_mouse_button
(
&
input_manager
,
&
event
.
button
);
break
;
case
SDL_DROPFILE
:
file_handler_do
(
&
file_handler
,
event
.
drop
.
file
);
case
SDL_DROPFILE
:
{
file_handler_action_t
action
;
if
(
is_apk
(
event
.
drop
.
file
))
{
action
=
ACTION_INSTALL_APK
;
}
else
{
action
=
ACTION_PUSH_FILE
;
}
file_handler_request
(
&
file_handler
,
action
,
event
.
drop
.
file
);
break
;
}
}
}
return
SDL_FALSE
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录