@@ -27,6 +27,7 @@ void Tag::Initialize(Handle<Object> target)
27
27
TagTemplate->InstanceTemplate ()->SetInternalFieldCount (1 );
28
28
TagTemplate->SetClassName (String::NewSymbol (" Tag" ));
29
29
30
+ NODE_SET_PROTOTYPE_METHOD (TagTemplate, " save" , AsyncSaveTag);
30
31
NODE_SET_PROTOTYPE_METHOD (TagTemplate, " saveSync" , SyncSaveTag);
31
32
NODE_SET_PROTOTYPE_METHOD (TagTemplate, " isEmpty" , IsEmpty);
32
33
@@ -294,4 +295,53 @@ void Tag::AsyncTagReadAfter(uv_work_t *req) {
294
295
// delete baton;
295
296
}
296
297
298
+ v8::Handle <v8::Value> Tag::AsyncSaveTag (const v8::Arguments &args) {
299
+ HandleScope scope;
300
+
301
+ if (args.Length () >= 1 && !args[0 ]->IsFunction ())
302
+ return ThrowException (String::New (" Expected callback function as first argument" ));
303
+
304
+ Local<Function> callback = Local<Function>::Cast (args[0 ]);
305
+
306
+ Tag *t = ObjectWrap::Unwrap<Tag>(args.This ());
307
+
308
+ AsyncSaveBaton *baton = new AsyncSaveBaton;
309
+ baton->request .data = baton;
310
+ baton->tag = t;
311
+ baton->callback = Persistent<Function>::New (callback);
312
+ baton->success = false ;
313
+
314
+ uv_queue_work (uv_default_loop (), &baton->request , Tag::AsyncSaveTagDo, Tag::AsyncSaveTagAfter);
315
+
316
+ return Undefined ();
317
+ }
318
+
319
+ void Tag::AsyncSaveTagDo (uv_work_t *req) {
320
+ AsyncSaveBaton *baton = static_cast <AsyncSaveBaton*>(req->data );
321
+
322
+ assert (baton->tag ->fileRef );
323
+ baton->success = baton->tag ->fileRef ->save ();
324
+ }
325
+
326
+ void Tag::AsyncSaveTagAfter (uv_work_t *req) {
327
+ HandleScope scope;
328
+
329
+ AsyncSaveBaton *baton = static_cast <AsyncSaveBaton*>(req->data );
330
+
331
+ if (baton->success ) {
332
+ Handle <Value> argv[] = { Null () };
333
+ baton->callback ->Call (Context::GetCurrent ()->Global (), 1 , argv);
334
+ }
335
+ else {
336
+ Local<Object> error = Object::New ();
337
+ error->Set (String::New (" message" ), String::New (" Failed to save file" ));
338
+ error->Set (String::New (" path" ), String::New (baton->tag ->fileRef ->file ()->name ()));
339
+ Handle <Value> argv[] = { error };
340
+ baton->callback ->Call (Context::GetCurrent ()->Global (), 1 , argv);
341
+ }
342
+
343
+ baton->callback .Dispose ();
344
+ delete baton;
345
+ }
346
+
297
347
}
0 commit comments