uplink-ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Uplink
4
+ class UplinkUtil
5
+ class << self
6
+ def get_system_values(object)
7
+ return if object.null? || object[:system].null?
8
+
9
+ [object[:system][:created], object[:system][:expires], object[:system][:content_length]]
10
+ end
11
+
12
+ def get_custom_metadata(object)
13
+ custom = {}
14
+
15
+ return custom if object.null? || object[:custom].null?
16
+
17
+ count = object[:custom][:count]
18
+ mem_entries = object[:custom][:entries]
19
+
20
+ return custom if mem_entries.null?
21
+
22
+ count.times do |i|
23
+ entry = UplinkLib::UplinkCustomMetadataEntry.new(mem_entries + (i * UplinkLib::UplinkCustomMetadataEntry.size))
24
+ next if entry.null?
25
+
26
+ key = entry[:key].read_string
27
+ value = entry[:value].read_string
28
+ custom[key] = value
29
+ end
30
+
31
+ custom
32
+ end
33
+
34
+ def build_uplink_config(config)
35
+ raise ArgumentError, 'config argument is nil' if config.nil?
36
+
37
+ config_options = UplinkLib::UplinkConfig.new
38
+ user_agent = FFI::MemoryPointer.from_string(config[:user_agent]) if config[:user_agent]
39
+ temp_directory = FFI::MemoryPointer.from_string(config[:temp_directory]) if config[:temp_directory]
40
+ config_options[:user_agent] = user_agent
41
+ config_options[:dial_timeout_milliseconds] = config[:dial_timeout_milliseconds]&.to_i || 0
42
+ config_options[:temp_directory] = temp_directory
43
+
44
+ config_options
45
+ end
46
+
47
+ def build_upload_options(options)
48
+ upload_options = nil
49
+ if options && !options.empty?
50
+ upload_options = UplinkLib::UplinkUploadOptions.new
51
+ upload_options[:expires] = options[:expires].to_i if options[:expires]
52
+ end
53
+
54
+ upload_options
55
+ end
56
+
57
+ def build_custom_metadata(custom)
58
+ count = custom.size
59
+ mem_entries = FFI::MemoryPointer.new(UplinkLib::UplinkCustomMetadataEntry, count)
60
+
61
+ custom.to_a.each_with_index do |(key, value), i|
62
+ mem_key = FFI::MemoryPointer.from_string(key.to_s) if key
63
+ mem_value = FFI::MemoryPointer.from_string(value.to_s) if value
64
+
65
+ entry = UplinkLib::UplinkCustomMetadataEntry.new(mem_entries + (i * UplinkLib::UplinkCustomMetadataEntry.size))
66
+ entry[:key] = mem_key
67
+ entry[:key_length] = key ? key.length : 0
68
+ entry[:value] = mem_value
69
+ entry[:value_length] = value ? value.to_s.length : 0
70
+ end
71
+
72
+ custom_metadata = UplinkLib::UplinkCustomMetadata.new
73
+ custom_metadata[:count] = count
74
+ custom_metadata[:entries] = mem_entries
75
+
76
+ custom_metadata
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,208 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Uplink
4
+ class Upload
5
+ def initialize(upload_result)
6
+ @upload = upload_result[:upload]
7
+ end
8
+
9
+ def write(bytes, length)
10
+ raise ArgumentError, 'bytes argument is nil' if bytes.nil?
11
+
12
+ if bytes.is_a?(Array) && bytes.first.is_a?(Integer)
13
+ mem_bytes = FFI::MemoryPointer.new(:uint8, length)
14
+ mem_bytes.write_array_of_uint8(bytes)
15
+ else
16
+ mem_bytes = bytes
17
+ end
18
+
19
+ result = UplinkLib.uplink_upload_write(@upload, mem_bytes, length)
20
+ abort unless result[:error].null?
21
+ ErrorUtil.handle_result_error(result)
22
+
23
+ result[:bytes_written]
24
+ ensure
25
+ UplinkLib.uplink_free_write_result(result) if result
26
+ end
27
+
28
+ def set_custom_metadata(custom)
29
+ custom_metadata = UplinkUtil.build_custom_metadata(custom)
30
+
31
+ error = UplinkLib.uplink_upload_set_custom_metadata(@upload, custom_metadata)
32
+ ErrorUtil.handle_error(error)
33
+ ensure
34
+ UplinkLib.uplink_free_error(error) if error
35
+ end
36
+
37
+ def commit
38
+ error = UplinkLib.uplink_upload_commit(@upload)
39
+ ErrorUtil.handle_error(error)
40
+ ensure
41
+ UplinkLib.uplink_free_error(error) if error
42
+ end
43
+
44
+ def abort
45
+ error = UplinkLib.uplink_upload_abort(@upload)
46
+ ErrorUtil.handle_error(error)
47
+ ensure
48
+ UplinkLib.uplink_free_error(error) if error
49
+ end
50
+
51
+ def info
52
+ result = UplinkLib.uplink_upload_info(@upload)
53
+ ErrorUtil.handle_result_error(result)
54
+
55
+ Object.new(result)
56
+ ensure
57
+ UplinkLib.uplink_free_object_result(result) if result
58
+ end
59
+ end
60
+
61
+ class UploadInfo
62
+ attr_reader :upload_id, :key, :is_prefix, :created, :expires, :content_length, :custom
63
+
64
+ def initialize(upload_info_result, upload_info = nil)
65
+ init_attributes(upload_info_result.nil? || upload_info_result.null? ? upload_info : upload_info_result[:info])
66
+ end
67
+
68
+ private
69
+
70
+ def init_attributes(upload_info)
71
+ return if upload_info.nil? || upload_info.null?
72
+
73
+ @upload_id = upload_info[:upload_id]
74
+ @key = upload_info[:key]
75
+ @is_prefix = upload_info[:is_prefix]
76
+ @created, @expires, @content_length = UplinkUtil.get_system_values(upload_info)
77
+ @custom = UplinkUtil.get_custom_metadata(upload_info)
78
+ end
79
+ end
80
+
81
+ class PartUpload
82
+ def initialize(part_upload_result)
83
+ @part_upload = part_upload_result[:part_upload]
84
+ end
85
+
86
+ def write(bytes, length)
87
+ raise ArgumentError, 'bytes argument is nil' if bytes.nil?
88
+
89
+ if bytes.is_a?(Array) && bytes.first.is_a?(Integer)
90
+ mem_bytes = FFI::MemoryPointer.new(:uint8, length)
91
+ mem_bytes.write_array_of_uint8(bytes)
92
+ else
93
+ mem_bytes = bytes
94
+ end
95
+
96
+ result = UplinkLib.uplink_part_upload_write(@part_upload, mem_bytes, length)
97
+ abort unless result[:error].null?
98
+ ErrorUtil.handle_result_error(result)
99
+
100
+ result[:bytes_written]
101
+ ensure
102
+ UplinkLib.uplink_free_write_result(result) if result
103
+ end
104
+
105
+ def set_etag(etag)
106
+ error = UplinkLib.uplink_part_upload_set_etag(@part_upload, etag)
107
+ ErrorUtil.handle_error(error)
108
+ ensure
109
+ UplinkLib.uplink_free_error(error) if error
110
+ end
111
+
112
+ def commit
113
+ error = UplinkLib.uplink_part_upload_commit(@part_upload)
114
+ ErrorUtil.handle_error(error)
115
+ ensure
116
+ UplinkLib.uplink_free_error(error) if error
117
+ end
118
+
119
+ def abort
120
+ error = UplinkLib.uplink_part_upload_abort(@part_upload)
121
+ ErrorUtil.handle_error(error)
122
+ ensure
123
+ UplinkLib.uplink_free_error(error) if error
124
+ end
125
+
126
+ def info
127
+ result = UplinkLib.uplink_part_upload_info(@part_upload)
128
+ ErrorUtil.handle_result_error(result)
129
+
130
+ UploadPart.new(result)
131
+ ensure
132
+ UplinkLib.uplink_free_part_result(result) if result
133
+ end
134
+ end
135
+
136
+ class UploadPart
137
+ attr_reader :part_number, :size, :modified, :etag
138
+
139
+ def initialize(upload_part_result, upload_part = nil)
140
+ init_attributes(upload_part_result.nil? || upload_part_result.null? ? upload_part : upload_part_result[:part])
141
+ end
142
+
143
+ private
144
+
145
+ def init_attributes(part)
146
+ return if part.nil? || part.null?
147
+
148
+ @part_number = part[:part_number]
149
+ @size = part[:size]
150
+ @modified = part[:modified]
151
+ @etag = part[:etag]
152
+ end
153
+ end
154
+
155
+ class UploadIterator
156
+ def initialize(upload_iterator)
157
+ @upload_iterator = upload_iterator
158
+ end
159
+
160
+ def next?
161
+ has_next = UplinkLib.uplink_upload_iterator_next(@upload_iterator)
162
+ unless has_next
163
+ begin
164
+ error = UplinkLib.uplink_upload_iterator_err(@upload_iterator)
165
+ ErrorUtil.handle_error(error)
166
+ ensure
167
+ UplinkLib.uplink_free_error(error) if error
168
+ end
169
+ end
170
+
171
+ has_next
172
+ end
173
+
174
+ def item
175
+ upload_info = UplinkLib.uplink_upload_iterator_item(@upload_iterator)
176
+ UploadInfo.new(nil, upload_info)
177
+ ensure
178
+ UplinkLib.uplink_free_upload_info(upload_info) if upload_info
179
+ end
180
+ end
181
+
182
+ class UploadPartIterator
183
+ def initialize(upload_part_iterator)
184
+ @upload_part_iterator = upload_part_iterator
185
+ end
186
+
187
+ def next?
188
+ has_next = UplinkLib.uplink_part_iterator_next(@upload_part_iterator)
189
+ unless has_next
190
+ begin
191
+ error = UplinkLib.uplink_part_iterator_err(@upload_part_iterator)
192
+ ErrorUtil.handle_error(error)
193
+ ensure
194
+ UplinkLib.uplink_free_error(error) if error
195
+ end
196
+ end
197
+
198
+ has_next
199
+ end
200
+
201
+ def item
202
+ upload_part = UplinkLib.uplink_part_iterator_item(@upload_part_iterator)
203
+ UploadPart.new(nil, upload_part)
204
+ ensure
205
+ UplinkLib.uplink_free_part(upload_part) if upload_part
206
+ end
207
+ end
208
+ end
data/lib/uplink.rb ADDED
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uplink_lib'
4
+ require 'uplink/access'
5
+ require 'uplink/bucket'
6
+ require 'uplink/download'
7
+ require 'uplink/edge_credential'
8
+ require 'uplink/error_util'
9
+ require 'uplink/object'
10
+ require 'uplink/project'
11
+ require 'uplink/storj_error'
12
+ require 'uplink/uplink_util'
13
+ require 'uplink/upload'
14
+
15
+ module Uplink
16
+ class << self
17
+ def parse_access(access_string)
18
+ result = UplinkLib.uplink_parse_access(access_string)
19
+ ErrorUtil.handle_result_error(result)
20
+
21
+ yield Access.new(result)
22
+ ensure
23
+ UplinkLib.uplink_free_access_result(result) if result
24
+ end
25
+
26
+ def request_access_with_passphrase(satellite_address, api_key, passphrase)
27
+ result = UplinkLib.uplink_request_access_with_passphrase(satellite_address, api_key, passphrase)
28
+ ErrorUtil.handle_result_error(result)
29
+
30
+ yield Access.new(result)
31
+ ensure
32
+ UplinkLib.uplink_free_access_result(result) if result
33
+ end
34
+
35
+ def request_access_with_passphrase_and_config(config, satellite_address, api_key, passphrase)
36
+ config_options = UplinkUtil.build_uplink_config(config)
37
+
38
+ result = UplinkLib.uplink_config_request_access_with_passphrase(config_options, satellite_address, api_key, passphrase)
39
+ ErrorUtil.handle_result_error(result)
40
+
41
+ yield Access.new(result)
42
+ ensure
43
+ UplinkLib.uplink_free_access_result(result) if result
44
+ end
45
+
46
+ def derive_encryption_key(passphrase, salt, length)
47
+ raise ArgumentError, 'salt argument is not a string' unless salt.is_a?(String)
48
+
49
+ result = UplinkLib.uplink_derive_encryption_key(passphrase, salt, length)
50
+ ErrorUtil.handle_result_error(result)
51
+
52
+ yield result[:encryption_key]
53
+ ensure
54
+ UplinkLib.uplink_free_encryption_key_result(result) if result
55
+ end
56
+
57
+ def internal_universe_is_empty?
58
+ UplinkLib.uplink_internal_UniverseIsEmpty != 0
59
+ end
60
+ end
61
+ end
data/lib/uplink_lib.rb ADDED
@@ -0,0 +1,345 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+
5
+ module UplinkLib
6
+ extend FFI::Library
7
+
8
+ ffi_lib 'libuplink.so'
9
+
10
+ class UplinkHandle < FFI::Struct
11
+ layout :_handle, :size_t
12
+ end
13
+
14
+ class UplinkAccess < FFI::Struct
15
+ layout :_handle, :size_t
16
+ end
17
+
18
+ class UplinkProject < FFI::Struct
19
+ layout :_handle, :size_t
20
+ end
21
+
22
+ class UplinkDownload < FFI::Struct
23
+ layout :_handle, :size_t
24
+ end
25
+
26
+ class UplinkUpload < FFI::Struct
27
+ layout :_handle, :size_t
28
+ end
29
+
30
+ class UplinkEncryptionKey < FFI::Struct
31
+ layout :_handle, :size_t
32
+ end
33
+
34
+ class UplinkPartUpload < FFI::Struct
35
+ layout :_handle, :size_t
36
+ end
37
+
38
+ class UplinkConfig < FFI::Struct
39
+ layout :user_agent, :pointer, # string
40
+ :dial_timeout_milliseconds, :int32_t,
41
+ :temp_directory, :pointer # string
42
+ end
43
+
44
+ class UplinkBucket < FFI::Struct
45
+ layout :name, :string,
46
+ :created, :int64_t
47
+ end
48
+
49
+ class UplinkSystemMetadata < FFI::Struct
50
+ layout :created, :int64_t,
51
+ :expires, :int64_t,
52
+ :content_length, :int64_t
53
+ end
54
+
55
+ class UplinkCustomMetadataEntry < FFI::Struct
56
+ layout :key, :pointer, # string
57
+ :key_length, :size_t,
58
+ :value, :pointer, # string
59
+ :value_length, :size_t
60
+ end
61
+
62
+ class UplinkCustomMetadata < FFI::Struct
63
+ layout :entries, :pointer, # array of UplinkCustomMetadataEntry
64
+ :count, :size_t
65
+ end
66
+
67
+ class UplinkObject < FFI::Struct
68
+ layout :key, :string,
69
+ :is_prefix, :bool,
70
+ :system, UplinkSystemMetadata.val,
71
+ :custom, UplinkCustomMetadata.val
72
+ end
73
+
74
+ class UplinkUploadOptions < FFI::Struct
75
+ layout :expires, :int64_t
76
+ end
77
+
78
+ class UplinkDownloadOptions < FFI::Struct
79
+ layout :offset, :int64_t,
80
+ :length, :int64_t
81
+ end
82
+
83
+ class UplinkListObjectsOptions < FFI::Struct
84
+ layout :prefix, :pointer, # string
85
+ :cursor, :pointer, # string
86
+ :recursive, :bool,
87
+ :system, :bool,
88
+ :custom, :bool
89
+ end
90
+
91
+ class UplinkListUploadsOptions < FFI::Struct
92
+ layout :prefix, :pointer, # string
93
+ :cursor, :pointer, # string
94
+ :recursive, :bool,
95
+ :system, :bool,
96
+ :custom, :bool
97
+ end
98
+
99
+ class UplinkListBucketsOptions < FFI::Struct
100
+ layout :cursor, :pointer # string
101
+ end
102
+
103
+ class UplinkObjectIterator < FFI::Struct
104
+ layout :_handle, :size_t
105
+ end
106
+
107
+ class UplinkBucketIterator < FFI::Struct
108
+ layout :_handle, :size_t
109
+ end
110
+
111
+ class UplinkUploadIterator < FFI::Struct
112
+ layout :_handle, :size_t
113
+ end
114
+
115
+ class UplinkPartIterator < FFI::Struct
116
+ layout :_handle, :size_t
117
+ end
118
+
119
+ class UplinkPermission < FFI::Struct
120
+ layout :allow_download, :bool,
121
+ :allow_upload, :bool,
122
+ :allow_list, :bool,
123
+ :allow_delete, :bool,
124
+ :not_before, :int64_t,
125
+ :not_after, :int64_t
126
+ end
127
+
128
+ class UplinkPart < FFI::Struct
129
+ layout :part_number, :uint32_t,
130
+ :size, :size_t,
131
+ :modified, :int64_t,
132
+ :etag, :string,
133
+ :etag_length, :size_t
134
+ end
135
+
136
+ class UplinkSharePrefix < FFI::Struct
137
+ layout :bucket, :pointer, # string
138
+ :prefix, :pointer # string
139
+ end
140
+
141
+ class UplinkError < FFI::Struct
142
+ layout :code, :int32_t,
143
+ :message, :string
144
+ end
145
+
146
+ class UplinkAccessResult < FFI::Struct
147
+ layout :access, UplinkAccess.ptr,
148
+ :error, UplinkError.ptr
149
+ end
150
+
151
+ class UplinkProjectResult < FFI::Struct
152
+ layout :project, UplinkProject.ptr,
153
+ :error, UplinkError.ptr
154
+ end
155
+
156
+ class UplinkBucketResult < FFI::Struct
157
+ layout :bucket, UplinkBucket.ptr,
158
+ :error, UplinkError.ptr
159
+ end
160
+
161
+ class UplinkObjectResult < FFI::Struct
162
+ layout :object, UplinkObject.ptr,
163
+ :error, UplinkError.ptr
164
+ end
165
+
166
+ class UplinkUploadResult < FFI::Struct
167
+ layout :upload, UplinkUpload.ptr,
168
+ :error, UplinkError.ptr
169
+ end
170
+
171
+ class UplinkPartUploadResult < FFI::Struct
172
+ layout :part_upload, UplinkPartUpload.ptr,
173
+ :error, UplinkError.ptr
174
+ end
175
+
176
+ class UplinkDownloadResult < FFI::Struct
177
+ layout :download, UplinkDownload.ptr,
178
+ :error, UplinkError.ptr
179
+ end
180
+
181
+ class UplinkWriteResult < FFI::Struct
182
+ layout :bytes_written, :size_t,
183
+ :error, UplinkError.ptr
184
+ end
185
+
186
+ class UplinkReadResult < FFI::Struct
187
+ layout :bytes_read, :size_t,
188
+ :error, UplinkError.ptr
189
+ end
190
+
191
+ class UplinkStringResult < FFI::Struct
192
+ layout :string, :string,
193
+ :error, UplinkError.ptr
194
+ end
195
+
196
+ class UplinkEncryptionKeyResult < FFI::Struct
197
+ layout :encryption_key, UplinkEncryptionKey.ptr,
198
+ :error, UplinkError.ptr
199
+ end
200
+
201
+ class UplinkUploadInfo < FFI::Struct
202
+ layout :upload_id, :string,
203
+ :key, :string,
204
+ :is_prefix, :bool,
205
+ :system, UplinkSystemMetadata.val,
206
+ :custom, UplinkCustomMetadata.val
207
+ end
208
+
209
+ class UplinkUploadInfoResult < FFI::Struct
210
+ layout :info, UplinkUploadInfo.ptr,
211
+ :error, UplinkError.ptr
212
+ end
213
+
214
+ class UplinkCommitUploadOptions < FFI::Struct
215
+ layout :custom_metadata, UplinkCustomMetadata.val
216
+ end
217
+
218
+ class UplinkCommitUploadResult < FFI::Struct
219
+ layout :object, UplinkObject.ptr,
220
+ :error, UplinkError.ptr
221
+ end
222
+
223
+ class UplinkPartResult < FFI::Struct
224
+ layout :part, UplinkPart.ptr,
225
+ :error, UplinkError.ptr
226
+ end
227
+
228
+ class UplinkListUploadPartsOptions < FFI::Struct
229
+ layout :cursor, :uint32_t
230
+ end
231
+
232
+ class EdgeConfig < FFI::Struct
233
+ layout :auth_service_address, :pointer, # string
234
+ :certificate_pem, :pointer # string
235
+ end
236
+
237
+ class EdgeRegisterAccessOptions < FFI::Struct
238
+ layout :is_public, :bool
239
+ end
240
+
241
+ class EdgeCredentials < FFI::Struct
242
+ layout :access_key_id, :string,
243
+ :secret_key, :string,
244
+ :endpoint, :string
245
+ end
246
+
247
+ class EdgeCredentialsResult < FFI::Struct
248
+ layout :credentials, EdgeCredentials.ptr,
249
+ :error, UplinkError.ptr
250
+ end
251
+
252
+ class EdgeShareURLOptions < FFI::Struct
253
+ layout :raw, :bool
254
+ end
255
+
256
+ class UplinkMoveObjectOptions < FFI::Struct; end
257
+ class UplinkUploadObjectMetadataOptions < FFI::Struct; end
258
+ class UplinkCopyObjectOptions < FFI::Struct; end
259
+
260
+ attach_function :uplink_parse_access, [:string], UplinkAccessResult.val
261
+ attach_function :uplink_request_access_with_passphrase, [:string, :string, :string], UplinkAccessResult.val
262
+ attach_function :uplink_access_satellite_address, [UplinkAccess.ptr], UplinkStringResult.val
263
+ attach_function :uplink_access_serialize, [UplinkAccess.ptr], UplinkStringResult.val
264
+ attach_function :uplink_access_share, [UplinkAccess.ptr, UplinkPermission.val, :pointer, :long_long], UplinkAccessResult.val
265
+ attach_function :uplink_access_override_encryption_key, [UplinkAccess.ptr, :string, :string, UplinkEncryptionKey.ptr], UplinkError.ptr
266
+ attach_function :uplink_free_string_result, [UplinkStringResult.val], :void
267
+ attach_function :uplink_free_access_result, [UplinkAccessResult.val], :void
268
+ attach_function :uplink_stat_bucket, [UplinkProject.ptr, :string], UplinkBucketResult.val
269
+ attach_function :uplink_create_bucket, [UplinkProject.ptr, :string], UplinkBucketResult.val
270
+ attach_function :uplink_ensure_bucket, [UplinkProject.ptr, :string], UplinkBucketResult.val
271
+ attach_function :uplink_delete_bucket, [UplinkProject.ptr, :string], UplinkBucketResult.val
272
+ attach_function :uplink_delete_bucket_with_objects, [UplinkProject.ptr, :string], UplinkBucketResult.val
273
+ attach_function :uplink_free_bucket_result, [UplinkBucketResult.val], :void
274
+ attach_function :uplink_free_bucket, [UplinkBucket.ptr], :void
275
+ attach_function :uplink_list_buckets, [UplinkProject.ptr, UplinkListBucketsOptions.ptr], UplinkBucketIterator.ptr
276
+ attach_function :uplink_bucket_iterator_next, [UplinkBucketIterator.ptr], :bool
277
+ attach_function :uplink_bucket_iterator_err, [UplinkBucketIterator.ptr], UplinkError.ptr
278
+ attach_function :uplink_bucket_iterator_item, [UplinkBucketIterator.ptr], UplinkBucket.ptr
279
+ attach_function :uplink_free_bucket_iterator, [UplinkBucketIterator.ptr], :void
280
+ attach_function :uplink_config_request_access_with_passphrase, [UplinkConfig.val, :string, :string, :string], UplinkAccessResult.val
281
+ attach_function :uplink_config_open_project, [UplinkConfig.val, UplinkAccess.ptr], UplinkProjectResult.val
282
+ attach_function :uplink_copy_object, [UplinkProject.ptr, :string, :string, :string, :string, UplinkCopyObjectOptions.ptr], UplinkObjectResult.val
283
+ attach_function :uplink_download_object, [UplinkProject.ptr, :string, :string, UplinkDownloadOptions.ptr], UplinkDownloadResult.val
284
+ attach_function :uplink_download_read, [UplinkDownload.ptr, :pointer, :size_t], UplinkReadResult.val
285
+ attach_function :uplink_download_info, [UplinkDownload.ptr], UplinkObjectResult.val
286
+ attach_function :uplink_free_read_result, [UplinkReadResult.val], :void
287
+ attach_function :uplink_close_download, [UplinkDownload.ptr], UplinkError.ptr
288
+ attach_function :uplink_free_download_result, [UplinkDownloadResult.val], :void
289
+ attach_function :edge_register_access, [EdgeConfig.val, UplinkAccess.ptr, EdgeRegisterAccessOptions.ptr], EdgeCredentialsResult.val
290
+ attach_function :edge_free_credentials_result, [EdgeCredentialsResult.val], :void
291
+ attach_function :edge_free_credentials, [EdgeCredentials.ptr], :void
292
+ attach_function :edge_join_share_url, [:string, :string, :string, :string, EdgeShareURLOptions.ptr], UplinkStringResult.val
293
+ attach_function :uplink_derive_encryption_key, [:string, :pointer, :size_t], UplinkEncryptionKeyResult.val
294
+ attach_function :uplink_free_encryption_key_result, [UplinkEncryptionKeyResult.val], :void
295
+ attach_function :uplink_free_error, [UplinkError.ptr], :void
296
+ attach_function :uplink_internal_UniverseIsEmpty, [], :uchar
297
+ attach_function :uplink_move_object, [UplinkProject.ptr, :string, :string, :string, :string, UplinkMoveObjectOptions.ptr], UplinkError.ptr
298
+ attach_function :uplink_begin_upload, [UplinkProject.ptr, :string, :string, UplinkUploadOptions.ptr], UplinkUploadInfoResult.val
299
+ attach_function :uplink_free_upload_info_result, [UplinkUploadInfoResult.val], :void
300
+ attach_function :uplink_free_upload_info, [UplinkUploadInfo.ptr], :void
301
+ attach_function :uplink_commit_upload, [UplinkProject.ptr, :string, :string, :string, UplinkCommitUploadOptions.ptr], UplinkCommitUploadResult.val
302
+ attach_function :uplink_free_commit_upload_result, [UplinkCommitUploadResult.val], :void
303
+ attach_function :uplink_abort_upload, [UplinkProject.ptr, :string, :string, :string], UplinkError.ptr
304
+ attach_function :uplink_upload_part, [UplinkProject.ptr, :string, :string, :string, :uint32_t], UplinkPartUploadResult.val
305
+ attach_function :uplink_part_upload_write, [UplinkPartUpload.ptr, :pointer, :size_t], UplinkWriteResult.val
306
+ attach_function :uplink_part_upload_commit, [UplinkPartUpload.ptr], UplinkError.ptr
307
+ attach_function :uplink_part_upload_abort, [UplinkPartUpload.ptr], UplinkError.ptr
308
+ attach_function :uplink_part_upload_set_etag, [UplinkPartUpload.ptr, :string], UplinkError.ptr
309
+ attach_function :uplink_part_upload_info, [UplinkPartUpload.ptr], UplinkPartResult.val
310
+ attach_function :uplink_free_part_result, [UplinkPartResult.val], :void
311
+ attach_function :uplink_free_part_upload_result, [UplinkPartUploadResult.val], :void
312
+ attach_function :uplink_free_part, [UplinkPart.ptr], :void
313
+ attach_function :uplink_list_uploads, [UplinkProject.ptr, :string, UplinkListUploadsOptions.ptr], UplinkUploadIterator.ptr
314
+ attach_function :uplink_upload_iterator_next, [UplinkUploadIterator.ptr], :bool
315
+ attach_function :uplink_upload_iterator_err, [UplinkUploadIterator.ptr], UplinkError.ptr
316
+ attach_function :uplink_upload_iterator_item, [UplinkUploadIterator.ptr], UplinkUploadInfo.ptr
317
+ attach_function :uplink_free_upload_iterator, [UplinkUploadIterator.ptr], :void
318
+ attach_function :uplink_list_upload_parts, [UplinkProject.ptr, :string, :string, :string, UplinkListUploadPartsOptions.ptr], UplinkPartIterator.ptr
319
+ attach_function :uplink_part_iterator_next, [UplinkPartIterator.ptr], :bool
320
+ attach_function :uplink_part_iterator_err, [UplinkPartIterator.ptr], UplinkError.ptr
321
+ attach_function :uplink_part_iterator_item, [UplinkPartIterator.ptr], UplinkPart.ptr
322
+ attach_function :uplink_free_part_iterator, [UplinkPartIterator.ptr], :void
323
+ attach_function :uplink_stat_object, [UplinkProject.ptr, :string, :string], UplinkObjectResult.val
324
+ attach_function :uplink_delete_object, [UplinkProject.ptr, :string, :string], UplinkObjectResult.val
325
+ attach_function :uplink_free_object_result, [UplinkObjectResult.val], :void
326
+ attach_function :uplink_free_object, [UplinkObject.ptr], :void
327
+ attach_function :uplink_update_object_metadata, [UplinkProject.ptr, :string, :string, UplinkCustomMetadata.val, UplinkUploadObjectMetadataOptions.ptr], UplinkError.ptr
328
+ attach_function :uplink_list_objects, [UplinkProject.ptr, :string, UplinkListObjectsOptions.ptr], UplinkObjectIterator.ptr
329
+ attach_function :uplink_object_iterator_next, [UplinkObjectIterator.ptr], :bool
330
+ attach_function :uplink_object_iterator_err, [UplinkObjectIterator.ptr], UplinkError.ptr
331
+ attach_function :uplink_object_iterator_item, [UplinkObjectIterator.ptr], UplinkObject.ptr
332
+ attach_function :uplink_free_object_iterator, [UplinkObjectIterator.ptr], :void
333
+ attach_function :uplink_open_project, [UplinkAccess.ptr], UplinkProjectResult.val
334
+ attach_function :uplink_close_project, [UplinkProject.ptr], UplinkError.ptr
335
+ attach_function :uplink_free_project_result, [UplinkProjectResult.val], :void
336
+ attach_function :uplink_revoke_access, [UplinkProject.ptr, UplinkAccess.ptr], UplinkError.ptr
337
+ attach_function :uplink_upload_object, [UplinkProject.ptr, :string, :string, UplinkUploadOptions.ptr], UplinkUploadResult.val
338
+ attach_function :uplink_upload_write, [UplinkUpload.ptr, :pointer, :size_t], UplinkWriteResult.val
339
+ attach_function :uplink_upload_commit, [UplinkUpload.ptr], UplinkError.ptr
340
+ attach_function :uplink_upload_abort, [UplinkUpload.ptr], UplinkError.ptr
341
+ attach_function :uplink_upload_info, [UplinkUpload.ptr], UplinkObjectResult.val
342
+ attach_function :uplink_upload_set_custom_metadata, [UplinkUpload.ptr, UplinkCustomMetadata.val], UplinkError.ptr
343
+ attach_function :uplink_free_write_result, [UplinkWriteResult.val], :void
344
+ attach_function :uplink_free_upload_result, [UplinkUploadResult.val], :void
345
+ end